Цитата:
HotA патчит оригинальные инструкции уже после запуска игры. Так что это:
- Код: Выделить всё
loc_4C7D8F:
lea eax, [ebx+21725h]
mov ecx, 156
превращается в вот это:
- Код: Выделить всё
loc_4C7D8F:
lea eax, [ebx+1613565h]
mov ecx, 178
В оригинальном коде смещение 21725h постоянное, в HotA - нет. Поэтому героя с порядковым номером i из _GameMgr_ нужно получать следующим образом:
- Код: Выделить всё
_Hero_* hero = o_GameMgr->GetHero(i);
Тогда следующий код:
Цитата:
- Код: Выделить всё
int __stdcall makeDisguiseCounter(LoHook* h, HookContext* c)
{
_GameMgr_* GM = (_GameMgr_*)c->ebx;
_int_ id = GM->GetMeID();
int addressTempModFlags = c->ebx + 0x21725;
for(int i=0; i<156; i++)
{
if(*(_int8_*)(addressTempModFlags - 227) == id)
*(_dword_*)(addressTempModFlags + 9) = -1;
addressTempModFlags =+ 1170;
}
return EXEC_DEFAULT;
}
можно переписать так:
- Код: Выделить всё
int __stdcall resetDisguise(LoHook* h, HookContext* c)
{
for (_Hero_* hero = o_GameMgr->GetHero(0); hero != o_GameMgr->GetHero(o_HEROES_COUNT - 1); ++hero)
if ( hero->owner_id == o_GameMgr->GetMeID() ) hero->disguise = -1;
return EXEC_DEFAULT;
}
или так:
- Код: Выделить всё
int __stdcall resetDisguise(LoHook* h, HookContext* c)
{
for (int i = 0; i < o_HEROES_COUNT; ++i)
if ( o_GameMgr->GetHero(i)->owner_id == o_GameMgr->GetMeID() ) o_GameMgr->GetHero(i)->disguise = -1;
return EXEC_DEFAULT;
}