Мод на ХотА |
Здравствуйте, гость ( Вход | Регистрация )
Мод на ХотА |
29 Jan 2017, 23:25
Сообщение
#561
|
|
God Сообщений: 267 Спасибо сказали: 25 раз |
Да, всё верно.. при этом хуке
Код _PI->WriteHexPatch(0x4738B1, "EB"); палаткой могу управлять. Даже тогда когда фух хп у всех. Но хилять не могу А без навыка игра виснет. Ну как виснет... музыка идёт, ожидается ход палатки, которая ничего не делает |
|
|
29 Jan 2017, 23:46
Сообщение
#562
|
|
Immortal Сообщений: 691 Спасибо сказали: 502 раза |
Цитата палаткой могу управлять. Даже тогда когда фух хп у всех. Но хилять не могу А этот патч прописали: Код _PI->WriteHexPatch(0x47609A, "9090"); ?Цитата А без навыка игра виснет. Я ж так и написал, что виснет. Нужен критерий, определяющий, на кого вешать щит в случае автохила. |
|
|
29 Jan 2017, 23:52
(Сообщение отредактировал DedMorozzz - 29 Jan 2017, 23:59)
Сообщение
#563
|
|
God Сообщений: 267 Спасибо сказали: 25 раз |
не, патч не прописал. С ним хиляет целые отряды корректно
А насчёт автохила достаточно сделать проверку на наличие навыка. Ибо щит без навыка не должен вешаться. Вот и будет тот самый критерий ------------------------------ Сделал такую штуку - вылетакт при попытке запуска игры: Код int cmAddr = *(int*)0x699420; int currentSide = *(int*)(cmAddr + 0x132C0); int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны char firstAidLevel = *(char*)(heroAddr + 201 + 27); if (firstAidLevel > 0) { _PI->WriteHexPatch(0x47609A, "9090"); _PI->WriteHexPatch(0x4738B1, "EB"); } Этот код естесно там, где все хуки прописаны. Обёртку над хуком сделал, мол не нужен если навык отсутствует |
|
|
29 Jan 2017, 23:57
(Сообщение отредактировал AlexSpl - 30 Jan 2017, 00:03)
Сообщение
#564
|
|
Immortal Сообщений: 691 Спасибо сказали: 502 раза |
Цитата А насчёт автохила достаточно сделать проверку на наличие навыка. Ибо щит без навыка не должен вешаться. Так это вообще просто ) Удаляем патч 0x4738B1. Вместо него ставим LoHook на тот же адрес. Цитата Сделал такую штуку - вылетакт при попытке запуска игры: Патчи прописывайте ВНЕ функций. |
|
|
30 Jan 2017, 00:17
(Сообщение отредактировал AlexSpl - 30 Jan 2017, 00:23)
Сообщение
#565
|
|
Immortal Сообщений: 691 Спасибо сказали: 502 раза |
Например, так:
Код { int cmAddr = *(int*)699420; int currentSide = *(int*)(cmAddr + 0x132C0); int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны if ( *(char*)(heroAddr + 201 + 27) == 0 ) return EXEC_DEFAULT; c->return_address = 0x4738C3; return NO_EXEC_DEFAULT; } Т.е. пишем первый патч ("9090"). Потом LoHook на 0x4738B1, и код выше. |
|
|
30 Jan 2017, 00:35
Сообщение
#566
|
|
God Сообщений: 267 Спасибо сказали: 25 раз |
Код int __stdcall checkAllowHeal(LoHook* h, HookContext* c) { int cmAddr = *(int*)699420; int currentSide = *(int*)(cmAddr + 0x132C0); int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны if (*(char*)(heroAddr + 201 + 27) == 0) { return EXEC_DEFAULT; } c->return_address = 0x4738C3; return NO_EXEC_DEFAULT; } Код _PI->WriteHexPatch(0x47609A, "9090"); _PI->WriteLoHook(0x4738B1, checkAllowHeal); вылетает когда ход переходит палатке |
|
|
30 Jan 2017, 00:43
(Сообщение отредактировал AlexSpl - 30 Jan 2017, 00:44)
Сообщение
#567
|
|
Immortal Сообщений: 691 Спасибо сказали: 502 раза |
Давайте выясним где. Закомментите вот это:
Код c->return_address = 0x4738C3; return NO_EXEC_DEFAULT; Т.е. код хука: Код int __stdcall checkAllowHeal(LoHook* h, HookContext* c)
{ int cmAddr = *(int*)699420; int currentSide = *(int*)(cmAddr + 0x132C0); int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны // if (*(char*)(heroAddr + 201 + 27) == 0) { return EXEC_DEFAULT; // } // c->return_address = 0x4738C3; // return NO_EXEC_DEFAULT; } |
|
|
30 Jan 2017, 01:18
(Сообщение отредактировал DedMorozzz - 30 Jan 2017, 01:23)
Сообщение
#568
|
|
God Сообщений: 267 Спасибо сказали: 25 раз |
Код int __stdcall checkAllowHeal(LoHook* h, HookContext* c) { int cmAddr = *(int*)699420; int currentSide = *(int*)(cmAddr + 0x132C0); int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны if (*(char*)(heroAddr + 201 + 27) == 0) { return EXEC_DEFAULT; } //c->return_address = 0x4738C3; //return NO_EXEC_DEFAULT; return EXEC_DEFAULT; } Вот так всё ок, но палатка не ходит. с NO_EXEC_DEFAULT вылетате явно проблема тут - c->return_address = 0x4738C3; |
|
|
30 Jan 2017, 01:26
Сообщение
#569
|
|
Immortal Сообщений: 691 Спасибо сказали: 502 раза |
Интересно. А если хук поднять выше (на 4738ACh)?
Код int __stdcall checkAllowHeal(LoHook* h, HookContext* c) { int cmAddr = *(int*)699420; int currentSide = *(int*)(cmAddr + 0x132C0); int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны if (*(char*)(heroAddr + 201 + 27) == 0) { return EXEC_DEFAULT; } c->return_address = 0x4738C3; return NO_EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4738AC, checkAllowHeal); Патч "EB", естественно, должен быть удалён. |
|
|
30 Jan 2017, 01:28
Сообщение
#570
|
|
God Сообщений: 267 Спасибо сказали: 25 раз |
Не, вылетает. Патч удалил
|
|
|
30 Jan 2017, 02:09
(Сообщение отредактировал AlexSpl - 30 Jan 2017, 02:29)
Сообщение
#571
|
|
Immortal Сообщений: 691 Спасибо сказали: 502 раза |
А если поправить
Код int cmAddr = *(int*)699420; на Код int cmAddr = *(int*)0x699420; ?Хотя Вы вряд ли просто скопировали мой код с ошибкой... * * * Если не поможет, предлагаю проверить следующие два варианта на герое, у которого есть First Aid: 1-й вариант (патч): Код _PI->WriteHexPatch(0x4738B1, "EB"); Хук 0x4738B1 удаляем. 2-й вариант (хук): Код int __stdcall checkAllowHeal(LoHook* h, HookContext* c) { c->return_address = 0x4738C3; return NO_EXEC_DEFAULT; } (в коде хука оставляем только джамп по адресу 0x4738C3). Код _PI->WriteLoHook(0x4738B1, checkAllowHeal); Патч 0x4738B1 удаляем. |
|
|
31 Jan 2017, 23:17
(Сообщение отредактировал DedMorozzz - 31 Jan 2017, 23:18)
Сообщение
#572
|
|
God Сообщений: 267 Спасибо сказали: 25 раз |
Скомпоновал оба варианта с постов выше. Получилось так:
Код int __stdcall checkAllowHeal(LoHook* h, HookContext* c) { int cmAddr = *(int*)0x699420; int currentSide = *(int*)(cmAddr + 0x132C0); int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны if (*(char*)(heroAddr + 201 + 27) == 0) { return EXEC_DEFAULT; } c->return_address = 0x4738C3; return NO_EXEC_DEFAULT; } Код _PI->WriteHexPatch(0x47609A, "9090"); _PI->WriteLoHook(0x4738AC, checkAllowHeal); Что было не так, checkAllowHeal был ок. Но не работал потому что патча 0x47609A не было. В общем всё ок ща Итого добавил щит в половину силы на целых юнитов. А у героя со специализацией фул щит всегда Итого код расчёта щита получился таким: Код int __stdcall setFirstAidShield(LoHook* h, HookContext* c) { int cmAddr = *(int*)0x699420; float stackBonusModificator = 5.0f; int currentSide = *(int*)(cmAddr + 0x132C0); int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны char firstAidLevel = *(char*)(heroAddr + 201 + 27); int heroID = *(int*)(heroAddr + 26); int specInfoAddr = *(int*)0x679C80; bool firstAidSpec = *(int*)(specInfoAddr + heroID * 40) == 0 && *(int*)(specInfoAddr + heroID * 40 + 4) == 27; int specBonus = 0; if (firstAidSpec) { specBonus += 1; } int unitLevel = *(int*)(c->esi + 0x78) + 1 + specBonus; int firstAidBonus = (5 + firstAidLevel * 5) * unitLevel; int countMonsters = *(int*)(c->esi + 0x4C); float countUnitsForShield = ceil(countMonsters / stackBonusModificator); int countUnitBonus = countUnitsForShield * unitLevel; int totalSheildCount = firstAidBonus + countUnitBonus; if (*(int*)(c->esi + 0x58) == 0 && !firstAidSpec) { totalSheildCount = totalSheildCount / 2; } *(int*)(c->esi + 0x94) = totalSheildCount; return EXEC_DEFAULT; } А вообще весь фул код переделанной первой помощи вот: |
|
|
05 Feb 2017, 00:06
Сообщение
#573
|
|
God Сообщений: 267 Спасибо сказали: 25 раз |
Выложил код в этой темке - http://forum.df2.ru/index.php?showtopic=36605
|
|
|
Текстовая версия | Сейчас: 18 April 2024 - 05:53 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |