ты хукнул паинтреверс?А как сделать полосу манабара и показывать кд способности ?
ваще советую тебе открыть дебаггер, зайти в доту, проитерировать сущностей и посмотреть на них в дебаггере. ну и дотку пореверсить.А как сделать полосу манабара и показывать кд способности ?
#define ui unsigned long long //указатель на x64
...
ui ent = GetBaseEntityFunc(CGameEntSystem, 0); //первая ентити
while (ent) {
...
*(ui*)(
*(ui*)(ent + 0x10) + 0x58
) == 0 ? ent = 0 : ent = *(ui*)(
*(ui*)(
*(ui*)(ent + 0x10) + 0x58
)
); //некст ентитя. если значение (значение(ent+0x10) + 0x58) равно нулю то прекращаешь итерацию. если не равно 0 значит присваиваешь ent это значение и итерируешь дальше.
}
Артем , ты ли это?ваще советую тебе открыть дебаггер, зайти в доту, проитерировать сущностей и посмотреть на них в дебаггере. ну и дотку пореверсить.
А так, тебе надо:
1)найти героев
2)найти их абилки
3)отрисовать иконки абилок их кд и прочую хрень(манабары там что угодно) на экране.
Итерация сущностей:
у сущностей есть такая структура как CEntityIdentity.C++:#define ui unsigned long long //указатель на x64 ... ui ent = GetBaseEntityFunc(CGameEntSystem, 0); //первая ентити while (ent) { ... *(ui*)( *(ui*)(ent + 0x10) + 0x58 ) == 0 ? ent = 0 : ent = *(ui*)( *(ui*)( *(ui*)(ent + 0x10) + 0x58 ) ); //некст ентитя. если значение (значение(ent+0x10) + 0x58) равно нулю то прекращаешь итерацию. если не равно 0 значит присваиваешь ent это значение и итерируешь дальше. }
у CEntityIdentity глубоко закопан базовый класс(const char*) ("C_DOTA_BaseNPC_Hero", "C_DOTABaseAbility", "C_DOTA_Item" и т.д.), по нему ты находишь тип сущности.
у CEntityIdentity есть имена(внутреннее и свое. у кого-то есть оба, у кого-то только одно.) сущностей.
у CEntityIdentity есть CHandle сущности.
CHandle это 4 байт число которое состоит из Serial и Index сущности. Index это CHandle & x7FFF
у героев есть массив CHandle Abilities[32], из него ты можешь получить индексы сущностей абилок.
из индексов сущностей абилок ты можешь получить саму сущность абилки(сравнивая индекс из CHandle героя и индекс из CEntityIdentity текущей сущности).
у абилок есть кд, левел и прочая хрень.
теперь, когда ты знаешь это, тебе осталось открыть дебаггер или рекласс или что-то там еще и посмотреть что представляет из себя сущность. найти оффсеты(оффсет дампер в этом треде есть) и ты сможешь получить всю эту информацию).
имея координаты героя(тут все не так просто. у сущности есть 4 пачки координат(float x1, float y1, float z1, float zero1, float x2,float y2,float z2,float zero2,... float zero4)(0x11d8 оффсет). когда герой стоит на месте все 4 пачки одинаковы. когда движется то его координаты лежат в "актуальной" пачке. "актуальная" пачка это такая пачка, которая имеет наиболее актуальное значение наиболее значимой оси. то есть ты находишь сначала передний вектор(пореверси джаваскриптовый Entities.GetForward ) ( передний вектор это изменение координат сущности по осям за еденицу передвижения, напимер передний вектор [0.866,0.5,0] обозначает, что сущность за еденицу передвижения изменит свой x на 0.866, y на 0.5 и z на 0. наиболее значимая ось в этом случае x, то есть ось с максимальным модулем.), потом из этого переднего вектора находишь наиболее значимую ось, потом сравниваешь у всех 4 пачек координаты на этой оси и находишь максимальное значение(если в переднем векторе изменение по оси больше 0) или минимальное значение(если в переднем векторе изменение по оси меньше 0). пачка, где значение наиболее значимой оси максимально или минимально в зависимости от знака(+ или -) оси в переднем векторе будет "актуальной". то есть тебя интересуют координаты именно этой пачки, а остальные 3 пачки тебе нафиг не нужны.) ты можешь перевести их в координаты экрана(WorldToScreen тебе в помощь,Пожалуйста, авторизуйтесь для просмотра ссылки.) и отрисовать там свой манабар или что ты там хотел + имея имя абилки ты можешь найти ее иконку и ее где-нибудь тоже рядом с манабаром отрисовать; имея оставшийся кд абилки ты можешь поверх этой иконки написать этот оставшийся кд. имея левел абилки ты можешь написать где-нибудь левел этой абилки и т. д.;
я не артем, я обычный бомжАртем , ты ли это?
ваще советую тебе открыть дебаггер, зайти в доту, проитерировать сущностей и посмотреть на них в дебаггере. ну и дотку пореверсить.
А так, тебе надо:
1)найти героев
2)найти их абилки
3)отрисовать иконки абилок их кд и прочую хрень(манабары там что угодно) на экране.
Итерация сущностей:
у сущностей есть такая структура как CEntityIdentity.C++:#define ui unsigned long long //указатель на x64 ... ui ent = GetBaseEntityFunc(CGameEntSystem, 0); //первая ентити while (ent) { ... *(ui*)( *(ui*)(ent + 0x10) + 0x58 ) == 0 ? ent = 0 : ent = *(ui*)( *(ui*)( *(ui*)(ent + 0x10) + 0x58 ) ); //некст ентитя. если значение (значение(ent+0x10) + 0x58) равно нулю то прекращаешь итерацию. если не равно 0 значит присваиваешь ent это значение и итерируешь дальше. }
у CEntityIdentity глубоко закопан базовый класс(const char*) ("C_DOTA_BaseNPC_Hero", "C_DOTABaseAbility", "C_DOTA_Item" и т.д.), по нему ты находишь тип сущности.
у CEntityIdentity есть имена(внутреннее и свое. у кого-то есть оба, у кого-то только одно.) сущностей.
у CEntityIdentity есть CHandle сущности.
CHandle это 4 байт число которое состоит из Serial и Index сущности. Index это CHandle & x7FFF
у героев есть массив CHandle Abilities[32], из него ты можешь получить индексы сущностей абилок.
из индексов сущностей абилок ты можешь получить саму сущность абилки(сравнивая индекс из CHandle героя и индекс из CEntityIdentity текущей сущности).
у абилок есть кд, левел и прочая хрень.
теперь, когда ты знаешь это, тебе осталось открыть дебаггер или рекласс или что-то там еще и посмотреть что представляет из себя сущность. найти оффсеты(оффсет дампер в этом треде есть) и ты сможешь получить всю эту информацию).
имея координаты героя( пореверси джаваскриптовый GetAbsOrigin) ты можешь перевести их в координаты экрана(WorldToScreen тебе в помощь,Пожалуйста, авторизуйтесь для просмотра ссылки.) и отрисовать там свой манабар или что ты там хотел + имея имя абилки ты можешь найти ее иконку и ее где-нибудь тоже рядом с манабаром отрисовать; имея оставшийся кд абилки ты можешь поверх этой иконки написать этот оставшийся кд. имея левел абилки ты можешь написать где-нибудь левел этой абилки и т. д.;
а ты че там мутишь?) есть тг?) дай в лсФига ты там написал мне ) Я просто имел в виду придется делать хук на директ х и рисовать или как то по другому можно . Ну уже понял через твой ответ . спасиб .
можешь директикс, можешь паинттраверс, можешь как угодно.Фига ты там написал мне ) Я просто имел в виду придется делать хук на директ х и рисовать или как то по другому можно . Ну уже понял через твой ответ . спасиб .
Бро есть готовый vbe можно с устаревшими оффсетами? Потренится просто не все понятно сразу) А ты не бомж. Бомжи плюсы не знают и темболее как доту отреверсить.ваще советую тебе открыть дебаггер, зайти в доту, проитерировать сущностей и посмотреть на них в дебаггере. ну и дотку пореверсить.
А так, тебе надо:
1)найти героев
2)найти их абилки
3)отрисовать иконки абилок их кд и прочую хрень(манабары там что угодно) на экране.
Итерация сущностей:
у сущностей есть такая структура как CEntityIdentity.C++:#define ui unsigned long long //указатель на x64 ... ui ent = GetBaseEntityFunc(CGameEntSystem, 0); //первая ентити while (ent) { ... *(ui*)( *(ui*)(ent + 0x10) + 0x58 ) == 0 ? ent = 0 : ent = *(ui*)( *(ui*)( *(ui*)(ent + 0x10) + 0x58 ) ); //некст ентитя. если значение (значение(ent+0x10) + 0x58) равно нулю то прекращаешь итерацию. если не равно 0 значит присваиваешь ent это значение и итерируешь дальше. }
у CEntityIdentity глубоко закопан базовый класс(const char*) ("C_DOTA_BaseNPC_Hero", "C_DOTABaseAbility", "C_DOTA_Item" и т.д.), по нему ты находишь тип сущности.
у CEntityIdentity есть имена(внутреннее и свое. у кого-то есть оба, у кого-то только одно.) сущностей.
у CEntityIdentity есть CHandle сущности.
CHandle это 4 байт число которое состоит из Serial и Index сущности. Index это CHandle & x7FFF
у героев есть массив CHandle Abilities[32], из него ты можешь получить индексы сущностей абилок.
из индексов сущностей абилок ты можешь получить саму сущность абилки(сравнивая индекс из CHandle героя и индекс из CEntityIdentity текущей сущности).
у абилок есть кд, левел и прочая хрень.
теперь, когда ты знаешь это, тебе осталось открыть дебаггер или рекласс или что-то там еще и посмотреть что представляет из себя сущность. найти оффсеты(оффсет дампер в этом треде есть) и ты сможешь получить всю эту информацию).
имея координаты героя( пореверси джаваскриптовый GetAbsOrigin) ты можешь перевести их в координаты экрана(WorldToScreen тебе в помощь,Пожалуйста, авторизуйтесь для просмотра ссылки.) и отрисовать там свой манабар или что ты там хотел + имея имя абилки ты можешь найти ее иконку и ее где-нибудь тоже рядом с манабаром отрисовать; имея оставшийся кд абилки ты можешь поверх этой иконки написать этот оставшийся кд. имея левел абилки ты можешь написать где-нибудь левел этой абилки и т. д.;
Есть.Старенький колик на луаБро есть готовый vbe можно с устаревшими оффсетами? Потренится просто не все понятно сразу) А ты не бомж. Бомжи плюсы не знают и темболее как доту отреверсить.
Бро есть готовый vbe можно с устаревшими оффсетами? Потренится просто не все понятно сразу) А ты не бомж. Бомжи плюсы не знают и темболее как доту отреверсить.
Ну это на луа, от него толку нет если нету подгрузки скриптов. Выше примеры на плюсахПожалуйста, авторизуйтесь для просмотра ссылки.Пожалуйста, авторизуйтесь для просмотра ссылки.
Ну луа то есть его еще нужно подгрузить. Все равно придется на плюсах либо попробовать через doinclude scripts от or75Есть.Старенький колик на луа
та я согласен. но все же)) мб и это будет полезноНу это на луа, от него толку нет если нету подгрузки скриптов. Выше примеры на плюсах
Ну уому то может и поможет) У меня на данный момент есть на JSта я согласен. но все же)) мб и это будет полезно
import { Entity, LocalPlayer, ParticlesSDK, Unit, Hero, WardObserver, Creep, EventsSDK, EntityManager } from "wrapper/Imports"
import { showOnAll, showOnAllies, showOnCreeps, showOnSelf, showOnWards, State, switcher } from "./Menu"
let allUnits = new Map<Unit, number>(), // <Unit, Particle>
particlePath: string[] = [
"particles/items_fx/aura_shivas.vpcf",
"particles/ui/ui_sweeping_ring.vpcf",
"particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_beam.vpcf",
"particles/units/heroes/hero_spirit_breaker/spirit_breaker_haste_owner_status.vpcf",
"particles/units/heroes/hero_spirit_breaker/spirit_breaker_haste_owner_dark.vpcf",
"particles/units/heroes/hero_oracle/oracle_fortune_purge.vpcf",
"particles/units/heroes/hero_spirit_breaker/spirit_breaker_haste_owner_timer.vpcf",
]
State.OnValue(OnOptionToggle)
showOnAll.OnValue(OnOptionToggle)
showOnSelf.OnValue(OnOptionToggle)
showOnAllies.OnValue(OnOptionToggle)
showOnWards.OnValue(OnOptionToggle)
showOnCreeps.OnValue(OnOptionToggle)
switcher.OnValue(OnOptionToggle)
function Destroy(unit: Unit, particleID = allUnits.get(unit)!) {
ParticlesSDK.Destroy(particleID)
allUnits.delete(unit)
}
export function Init() {
allUnits.clear()
}
function OnOptionToggle() {
// loop-optimizer: KEEP
allUnits.forEach((particle, unit) => CheckUnit(unit))
}
function IsUnitShouldBeHighlighted(unit: Unit) {
if (unit instanceof Hero) {
if (showOnSelf.value && unit.Owner === LocalPlayer)
return true
if (showOnAllies.value && unit.Owner !== LocalPlayer)
return true
}
if (unit instanceof Creep && showOnCreeps.value)
return true
if (unit instanceof WardObserver && showOnWards.value)
return true
return showOnAll.value
}
export function TeamVisibilityChanged(npc: Unit) {
CheckUnit(npc)
}
function CheckUnit(unit: Unit, isVisibleForEnemies: boolean = unit.IsVisibleForEnemies) {
if (!State.value || unit.IsEnemy() || !unit.IsAlive || !IsUnitShouldBeHighlighted(unit)) {
if (allUnits.has(unit))
Destroy(unit)
return
}
let particleID = allUnits.get(unit)
if (isVisibleForEnemies && particleID === undefined)
allUnits.set(unit, ParticlesSDK.Create(particlePath[switcher.selected_id], ParticleAttachment_t.PATTACH_ABSORIGIN_FOLLOW, unit))
else if (!isVisibleForEnemies && particleID !== undefined)
Destroy(unit, particleID)
}
EventsSDK.on("EntityTeamChanged", ent => {
if (ent instanceof Unit)
CheckUnit(ent)
if (LocalPlayer === ent)
EntityManager.GetEntitiesByClass(Unit).forEach(unit => CheckUnit(unit))
})
export function EntityDestroyed(ent: Entity) {
if (!(ent instanceof Unit) || !allUnits.has(ent))
return
Destroy(ent)
}
export function LifeStateChanged(ent: Entity) {
if (ent instanceof Unit)
CheckUnit(ent)
}
круто. че за апи? не припомню чтобы в панораме такое было.Ну уому то может и поможет) У меня на данный момент есть на JS
JavaScript:import { Entity, LocalPlayer, ParticlesSDK, Unit, Hero, WardObserver, Creep, EventsSDK, EntityManager } from "wrapper/Imports" import { showOnAll, showOnAllies, showOnCreeps, showOnSelf, showOnWards, State, switcher } from "./Menu" let allUnits = new Map<Unit, number>(), // <Unit, Particle> particlePath: string[] = [ "particles/items_fx/aura_shivas.vpcf", "particles/ui/ui_sweeping_ring.vpcf", "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_beam.vpcf", "particles/units/heroes/hero_spirit_breaker/spirit_breaker_haste_owner_status.vpcf", "particles/units/heroes/hero_spirit_breaker/spirit_breaker_haste_owner_dark.vpcf", "particles/units/heroes/hero_oracle/oracle_fortune_purge.vpcf", "particles/units/heroes/hero_spirit_breaker/spirit_breaker_haste_owner_timer.vpcf", ] State.OnValue(OnOptionToggle) showOnAll.OnValue(OnOptionToggle) showOnSelf.OnValue(OnOptionToggle) showOnAllies.OnValue(OnOptionToggle) showOnWards.OnValue(OnOptionToggle) showOnCreeps.OnValue(OnOptionToggle) switcher.OnValue(OnOptionToggle) function Destroy(unit: Unit, particleID = allUnits.get(unit)!) { ParticlesSDK.Destroy(particleID) allUnits.delete(unit) } export function Init() { allUnits.clear() } function OnOptionToggle() { // loop-optimizer: KEEP allUnits.forEach((particle, unit) => CheckUnit(unit)) } function IsUnitShouldBeHighlighted(unit: Unit) { if (unit instanceof Hero) { if (showOnSelf.value && unit.Owner === LocalPlayer) return true if (showOnAllies.value && unit.Owner !== LocalPlayer) return true } if (unit instanceof Creep && showOnCreeps.value) return true if (unit instanceof WardObserver && showOnWards.value) return true return showOnAll.value } export function TeamVisibilityChanged(npc: Unit) { CheckUnit(npc) } function CheckUnit(unit: Unit, isVisibleForEnemies: boolean = unit.IsVisibleForEnemies) { if (!State.value || unit.IsEnemy() || !unit.IsAlive || !IsUnitShouldBeHighlighted(unit)) { if (allUnits.has(unit)) Destroy(unit) return } let particleID = allUnits.get(unit) if (isVisibleForEnemies && particleID === undefined) allUnits.set(unit, ParticlesSDK.Create(particlePath[switcher.selected_id], ParticleAttachment_t.PATTACH_ABSORIGIN_FOLLOW, unit)) else if (!isVisibleForEnemies && particleID !== undefined) Destroy(unit, particleID) } EventsSDK.on("EntityTeamChanged", ent => { if (ent instanceof Unit) CheckUnit(ent) if (LocalPlayer === ent) EntityManager.GetEntitiesByClass(Unit).forEach(unit => CheckUnit(unit)) }) export function EntityDestroyed(ent: Entity) { if (!(ent instanceof Unit) || !allUnits.has(ent)) return Destroy(ent) } export function LifeStateChanged(ent: Entity) { if (ent instanceof Unit) CheckUnit(ent) }
Api c Fusion чита.круто. че за апи? не припомню чтобы в панораме такое было.
щас тоже с впк можно ебашить. с панорамой по крайней мере. -tempcontent в параметры запуска и создаешь dota 2 beta\game\dota_tempcontent\pak01_dir.vpk куда засовываешь все что надо.Раньше можно было бы собрать все в vpk и ебошить. Сейчас нужно инжектить все это дело.
Пробовал уже сам?щас тоже с впк можно ебашить. с панорамой по крайней мере. -tempcontent в параметры запуска и создаешь dota 2 beta\game\dota_tempcontent\pak01_dir.vpk куда засовываешь все что надо.
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz