![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#341
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Ну, для начала.
Есть гекс с координатами (x, y), на котором расположен отряд. Описания полей combatManager я не встречал, так что пишу только то, что знаю. Код int cmAddr = *(int*)0x699420; int x = *(int*)(cmAddr + 0x132B8); int y = *(int*)(cmAddr + 0x132BC); // или наоборот )) int creatureAddr = cmAddr + 1352 * (x + 21 * y) + 21708; Теперь находим, где в структуре отряда хранится его скорость, ставим hardware брейкпоинт на запись, начинаем бой и попадаем в то место кода, где скорость (пере)записывается. |
|
|
![]()
Сообщение
#342
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Ну, для начала. Есть гекс с координатами (x, y), на котором расположен отряд. Описания полей combatManager я не встречал, так что пишу только то, что знаю. Код int cmAddr = *(int*)0x699420; int x = *(int*)(cmAddr + 0x132B8); int y = *(int*)(cmAddr + 0x132BC); // или наоборот )) int creatureAddr = cmAddr + 1356 * (x + 21 * y) + 21708; Теперь находим, где в структуре отряда хранится его скорость, ставим hardware брейкпоинт на запись, начинаем бой и попадаем в то место кода, где скорость (пере)записывается. Пытаюсь сопоставить инфу, по поводу цифр. Я так понял идея взять гексы и проверить войска. Если там есть, тем мобам увеличить скорость? Открыл ЕРМ хелпер, там есть айдишники гексов - https://sc-cdn.scaleengine.net/i/893cd4bbe6...194fdf2d584.png их стоит брать? Так же, что такое 1356/21/21708? Пока что даже не догадываюсь |
|
|
![]()
Сообщение
#343
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
1352. Исправил. 1356 - для "Полного Собрания" от "Буки".
|
|
|
![]()
Сообщение
#344
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
так а что это за цифры: 1352/21/21708?
|
|
|
![]()
Сообщение
#345
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз ![]() |
21708 - смещение от комбат мэнеджера к стекам
1352 - размер структуры боевого стека 21 - количество стеков для одной стороны. Всего 41 В ерм-хелпе масса информации, которую можно применять и для хоты. Арты, объекты, герои, номера зданий и т.п. Но конечно же не всё. Гексы поля боя одни для всех версий героев. Да и вообще. В посте feanora (я давал ссылку "как создать dll") там же инклуды есть. Чё вы ими то не пользуетесь? -------------------- |
|
|
![]()
Сообщение
#346
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Короче, начал проверять. Всё, оказывается, не так, как мне казалось )
Код int cmAddr = *(int*)0x699420; int side = *(int*)(cmAddr + 0x132B8); int unitNumber = *(int*)(cmAddr + 0x132BC); int unitAddr = cmAddr + 1352 * (unitNumber + 21 * side) + 21708; side - сторона (0 - левая, 1 - правая) unitNumber - номер отряда в армии (начиная с 0). Теперь, вроде, правильно ) |
|
|
![]()
Сообщение
#347
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Да и вообще. В посте feanora (я давал ссылку "как создать dll") там же инклуды есть. Чё вы ими то не пользуетесь? Я тогда не знал что это такое и как это готовить, да и сейчас не знаю ): Вот полез, открыл... да, те же оффсет для бонуса морали нашел, который спрашивал, но явно не основной функционал Т.е.что брать из инклудов - пока не понимаю... ---------------------------------------------- Короче, начал проверять. Всё, оказывается, не так, как мне казалось ) Код int cmAddr = *(int*)0x699420; int side = *(int*)(cmAddr + 0x132B8); int unitNumber = *(int*)(cmAddr + 0x132BC); int unitAddr = cmAddr + 1352 * (unitNumber + 21 * side) + 21708; side - сторона (0 - левая, 1 - правая) unitNumber - номер отряда в армии (начиная с 0). Теперь, вроде, правильно ) Я правильно понимаю, что данный код получает всех юнитов за левую сторону. Без смещения? Т.е. по логике вещей, если смещение модификатора скорости это 1224, то скорость юнита будет: (unitAddr + 1224) ? И я хук вешаю на адрес (0x4AD163) это ф-я Battle. Верный адрес? (забегая наперёд, так вылетает, если код выше поставить на этот адрес) |
|
|
![]()
Сообщение
#348
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Вроде нашёл. Как в базе IDA называется функция sub_43D450?
|
|
|
![]()
Сообщение
#349
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
.text:0043D450 combatMonster_0043D450 proc near
оно? |
|
|
![]()
Сообщение
#350
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Значит, не обозвали. Она инициализирует отряды (43D490h). А вот здесь, похоже, бонусы к скорости добавляются: 4E666A.
|
|
|
![]()
Сообщение
#351
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Код int __stdcall setTacticsUnitSpeed(LoHook* h, HookContext* c) { *(int*)(c->esi+80) += 2; return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4E666A, setTacticsUnitSpeed); Напал архом, дало +2 скорости! |
|
|
![]()
Сообщение
#352
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Попробуйте поставить LoHook на 43D492h:
Код { ++*(int*)(c->edi + 80); // увеличиваем скрость всех отрядов на +1 return EXEC_DEFAULT; } Цитата Напал архом, дало +2 скорости! Ага, и там тоже можно добавлять. |
|
|
![]()
Сообщение
#353
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Код int __stdcall setTacticsUnitSpeed(LoHook* h, HookContext* c) { if(*(int*)(c->ecx + 201 + 19) > 0) { *(int*)(c->esi+80) += 2; } return EXEC_DEFAULT; } А вот так с учётом тактики. Ща буду искать как на 2м ходе убрать бонус |
|
|
![]()
Сообщение
#354
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата А вот так с учётом тактики. Ага. Только бонус на все отряды, наверное, действует. |
|
|
![]()
Сообщение
#355
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#356
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
А отряды противника получают бонус к скорости?
|
|
|
![]()
Сообщение
#357
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#358
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Так вообще логично.
Интересно, как узнать, что бой в банке проходит? Указатель на combatManager у нас есть. |
|
|
![]()
Сообщение
#359
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Так вообще логично. Интересно, как узнать, что бой в банке проходит? Указатель на combatManager у нас есть. Есть такая идея: если сторона левая и левый верхний гекс занят врагом - значит бой в банке (во время 1го раунда) PS: Но я так понимаю, как-то по другому можно. Ибо и балисты нету и тактики и прочих моментов. И в центр кидает... явно можно как-то "правильнО" узнать |
|
|
![]()
Сообщение
#360
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Можно ещё так.
Указатель на героя у нас тоже есть, значит, мы знаем Цитата // miu = map_item under hero _dword_ miu_object_type; // +12 Т.е. Код if ( *(int*)(c->ecx + 12) == _банк_ ) { ... } Попробуйте для сокровищницы гномов: Код int __stdcall setTacticsUnitSpeed(LoHook* h, HookContext* c)
{ if ((*(int*)(c->ecx + 201 + 19) > 0) && (*(int*)(c->ecx + 12) == 16)) { *(int*)(c->esi + 80) += 2; } return EXEC_DEFAULT; } |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 4 October 2025 - 11:26 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|