![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#401
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Если бы контекст возвращался неверный, то и вот это:
Код c->ebx == cmAddr + 0x132A0; тоже бы не работало. Так что реально вопрос. Код .text:00475A28 mov eax, [ebx]
.text:00475A2A inc eax; инкрементируем счётчик .text:00475A2B mov [ebp+var_4], ecx .text:00475A2E mov [ebx], eax; пишем значение счётчика по адресу ebx .text:00475A30 mov [ebp+var_8], 20 .text:00475A37 .text:00475A37 loc_475A37: .text:00475A37 cmp dword ptr [ecx+34h], -1 .text:00475A3B jz short loc_475A45 .text:00475A3D call sub_446E40; до выполнения этой инструкции - хук, соответсвенно, в c->eax - счётчик |
|
|
![]()
Сообщение
#402
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата Вот это не работает, если c->eax - 30000 использовать. Не отнимается скорость Это я уже не знаю, почему. В контексте хука (c->eax - 30000) - это номер раунда. Нужно у baratorch'а спрашивать, почему не работает. У меня в ассемблере - работает. на 16й странице похожая проблема была ![]() |
|
|
![]()
Сообщение
#403
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Тут нужно смотреть на контекст. Попробуйте в хуке написать не просто
Код int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000; ,а Код int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000; int roundNumberAlt = c->eax - 30000; if ( roundNumber != roundNumberAlt ) return EXEC_DEFAULT; Если эти значения действительно не равны скорость уменьшена не будет. Хотя они должны *быть* равны для левой стороны. |
|
|
![]()
Сообщение
#404
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Тут нужно смотреть на контекст. Попробуйте в хуке написать не просто Код int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000; ,а Код int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000; int roundNumberAlt = c->eax - 30000; if ( roundNumber != roundNumberAlt ) return EXEC_DEFAULT; Если эти значения действительно не равны скорость уменьшена не будет. Хотя они должны *быть* равны для левой стороны. Не уменьшается. Бонус в начале даётся. Во 2м раунде - бонус остаётся |
|
|
![]()
Сообщение
#405
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Это может означать только то, что контекст возвращается неправильный, т.к. c->eax это и есть *(int*)c->ebx.
Посмотрим ещё раз на код: Код .text:00475A2E mov [ebx], eax; [ebx] = eax !! .text:00475A30 mov [ebp+var_8], 20 .text:00475A37 .text:00475A37 loc_475A37: .text:00475A37 cmp dword ptr [ecx+34h], 0FFFFFFFFh .text:00475A3B jz short loc_475A45 .text:00475A3D call sub_446E40; хук выполняется до этой инструкции Какая у Вас версия патчера, кстати? Так! Стоп ) Я разобрался, похоже ) Мы ставим хук *внутри* цикла. И действительно c->eax в нём меняется. Так что вопрос снят. |
|
|
![]()
Сообщение
#406
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Какая у Вас версия патчера, кстати? Версия 4.2 И сейчас столкнулся с проблемой: Код if(*(int*)(c->ecx + 201 + 27) > 0) { //проверка на палатку if ( *(int*)(c->ecx + 301 + (15 << 3)) == 6 ) { //15 - слот на кукле для палатки. 6 - айди палатки *(int*)(c->esi + 88) += *(int*)(c->ecx + 201 + 27); } } При нападении с палаткой и навыком - вылетает игра... Пробую разрулить Мы ставим хук *внутри* цикла. И действительно c->eax в нём меняется. Так что вопрос снят. на 16й странице тоже самое? ![]() |
|
|
![]()
Сообщение
#407
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Всё, я разобрался. Читай предыдущий пост.
Ну, как бы весь код я набираю здесь )) Я не проверяю его работоспособность, так что извиняйте ) |
|
|
![]()
Сообщение
#408
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Не, вылетает не из-за моего кода) Ща ковыряю в общем
|
|
|
![]()
Сообщение
#409
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата При нападении с палаткой и навыком - вылетает игра... Код *(int*)(c->esi + 88) += *(int*)(c->ecx + 201 + 27); Это дефенс так повышаете? Там контекст другой. Пример со скоростью: +80 и +196. М.б. в этом проблема? Ладно, немного посмотрел. Я давал код на инициализацию. Туда нужно было хук ставить. Попробуйте несколько раз кликнуть правой кнопкой мыши на отряде на экране окна героя. Каждый раз сработает хук, что не есть правильно. Т.е. уже скорость отрядов отображается завышенной. Попробуйте раздавать "плюшки" здесь: 43D492h (LoHook). Т.е. после выполнения инструкции rep movsd отряд инициализирован. Самое время добавить бонусы к параметрам. |
|
|
![]()
Сообщение
#410
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Код .text:0043D47F lea edi, [ebx+74h] .text:0043D482 lea edx, [eax+edx*4] .text:0043D485 shl edx, 2 .text:0043D488 lea esi, [edx+ecx] .text:0043D48B mov ecx, 29 .text:0043D490 rep movsd .text:0043D492 mov ecx, dword_699538 LoHook на 43D492h. Все бонусы раздавать только здесь. |
|
|
![]()
Сообщение
#411
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз ![]() |
При нападении с палаткой и навыком - вылетает игра... Известная проблема, особенно по WOGy. У палатки скорость всегда должна быть =0. Иначе - вылет при получении хода (как, впрочем, и у всех боевых машин). Проверку делайте на флаг "боевой машины" (64), либо на тип монстров (146 ... 150). Код !(o_BattleMgr->stack[0][номер стека текущей стороны].creature.flags & 64) И смещение 0x132A0 - это что-то связанное с автокастом Чародеев (там идет проверка на каждый третий раунд). Очень сомнительно использовать в качестве номера раунда битвы. Цитата if(*(int*)(c->ecx + 201 + 27) > 0) { //проверка на палатку Это проверка не на палатку, а на навык "Первая Помощь". И там вроде байт, а не четыре байта. Вылезаете за границы, что тоже может приводить в лучшем случае к вылету, в худшем - к трудноуловимым багам. Цитата И отнимает скорость всё равно у всех Потому что нет правильной проверки на сторону стека. Как-то вообще у вас все слишком замудрёно получилось.Кстате в ИДЕ есть отличная кнопка "tab", которая показывает псевдо сишный код. -------------------- |
|
|
![]()
Сообщение
#412
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
О, об этом не знал, но всё равно хук на 43D492h.
|
|
|
![]()
Сообщение
#413
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата И смещение 0x132A0 - это что-то связанное с автокастом Чародеев (там идет проверка на каждый третий раунд). Очень сомнительно использовать в качестве номера раунда битвы. А как проверить номер раунда? Всё равно вылетает... Странно очень, я когда это писал - проверял. Работало. И с баллистой проверял и без. И цифры менял, что бы +10 давало То же самое с палаткой и тактикой... Пока что не понимаю что добавилось, почему вылетает игра. Причём на сейвах, на которых всё тестил Цитата Это дефенс так повышаете? Там контекст другой. Пример со скоростью: +80 и +196. М.б. в этом проблема? Да, оно так работало. Почему атака/защита = 84/88. Потому что мы знаем смещение скорости, это +80 в данном контексте А "базовое" смещение для скорости/атаки/защиты такое - 196/200/204 Код //_int_ speed; //+196 0xC4 //_int_ attack; //+200 0xC8 //_int_ defence; //+204 0xCC Учитывая что 80 это скорость, а атака на 4 (байта?) дальше. Защита на 4 дальше от атаки. Получается так: 80/84/88 Текущий код, с которым не всё ладно (может проблема и в другом, а не в этом коде) такой: Код int __stdcall setBankUnitBonus(LoHook* h, HookContext* c) { if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1) { // проверка что бой в банке существ if(*(char*)(c->ecx + 201 + 19) > 0) { // проверка на тактику *(int*)(c->esi+80) += *(int*)(c->ecx + 201 + 19); //*(int*)(c->esi+80) += 2; } if(*(char*)(c->ecx + 201 + 20) > 0) { //проверка на артиллерию if ( *(char*)(c->ecx + 301 + (13 << 3)) == 4 ) { //13 - слот на кукле для баллисты. 4 - айди баллисты *(int*)(c->esi + 84) += *(int*)(c->ecx + 201 + 20); //*(int*)(c->esi + 84) += 10; } } if(*(char*)(c->ecx + 201 + 27) > 0) { //проверка на первую помощь if ( *(char*)(c->ecx + 301 + (15 << 3)) == 6 ) { //15 - слот на кукле для палатки. 6 - айди палатки *(int*)(c->esi + 88) += *(int*)(c->ecx + 201 + 27) * 2; //*(int*)(c->esi + 88) += 10; } } } return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x43D492, setBankUnitBonus); закоменченые варианты тоже пробовал. Всё равно вылетает PS: если вешать хук на "0x43D492", то скорость уже не c->esi+80 PPS: походу скорость по этому адресу получается так: *(int*)(c->ebx + 196) |
|
|
![]()
Сообщение
#414
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Пока что получилось такое:
Код int __stdcall setBankUnitBonus(LoHook* h, HookContext* c) { int cmAddr = *(int*)0x699420; int heroOffset = *(int*)(cmAddr + 0x53CC); if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1) { // проверка что бой в банке существ if(*(char*)(heroOffset + 201 + 19) > 0) { // проверка на тактику *(int*)(c->ebx + 196) += *(char*)(heroOffset + 201 + 19); } if(*(char*)(heroOffset + 201 + 20) > 0) { //проверка на артиллерию if ( *(char*)(heroOffset + 301 + (13 << 3)) == 4 ) { //13 - слот на кукле для баллисты. 4 - айди баллисты *(int*)(c->ebx + 200) += *(char*)(heroOffset + 201 + 20); } } if(*(char*)(heroOffset + 201 + 27) > 0) { //проверка на первую помощь if ( *(char*)(heroOffset + 301 + (15 << 3)) == 6 ) { //15 - слот на кукле для палатки. 6 - айди палатки *(int*)(c->ebx + 204) += *(char*)(heroOffset + 201 + 27) * 2; } } } return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x43D492, setBankUnitBonus); Работает, но снова таки - на всех... пока что сторону ещё не понять как определить и не работает бонус в банке при наличии пушки (а не баллисты), что ожидаемо. Какой айди у пушки? |
|
|
![]()
Сообщение
#415
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Работает, но снова таки - на всех... пока что сторону ещё не понять как определить arg_8 есть как раз указатель на героя. Цитата на 16й странице тоже самое? |
|
|
![]()
Сообщение
#416
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата Работает, но снова таки - на всех... пока что сторону ещё не понять как определить arg_8 есть как раз указатель на героя. Я ж уже знаю указатель на героя. Вот: Код int heroOffset = *(int*)(cmAddr + 0x53CC); А как понять, юнитам каким давать/отнимать бонус, а каким нет? |
|
|
![]()
Сообщение
#417
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Я ж уже знаю указатель на героя. Вот: Код int heroOffset = *(int*)(cmAddr + 0x53CC); А как понять, юнитам каким давать/отнимать бонус, а каким нет? Просто сравнить *(int*)(c->ebp + 16) == heroOffset. Условие выполняется, только если проходим по нашим отрядам. |
|
|
![]()
Сообщение
#418
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Код int __stdcall setBankUnitBonus(LoHook* h, HookContext* c) { int cmAddr = *(int*)0x699420; int heroOffset = *(int*)(cmAddr + 0x53CC); if (*(int*)(c->ebp + 16) != heroOffset) { return EXEC_DEFAULT; } if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1) { // проверка что бой в банке существ if(*(char*)(heroOffset + 201 + 19) > 0) { // проверка на тактику *(int*)(c->ebx + 196) += *(char*)(heroOffset + 201 + 19); } if(*(char*)(heroOffset + 201 + 20) > 0) { //проверка на артиллерию if ( *(char*)(heroOffset + 301 + (13 << 3)) == 4 ) { //13 - слот на кукле для баллисты. 4 - айди баллисты *(int*)(c->ebx + 200) += *(char*)(heroOffset + 201 + 20); } } if(*(char*)(heroOffset + 201 + 27) > 0) { //проверка на первую помощь if ( *(char*)(heroOffset + 301 + (15 << 3)) == 6 ) { //15 - слот на кукле для палатки. 6 - айди палатки *(int*)(c->ebx + 204) += *(char*)(heroOffset + 201 + 27) * 2; } } } return EXEC_DEFAULT; } int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c) { int cmAddr = *(int*)0x699420; if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ char tacticLevel = *(char*)(*(int*)(cmAddr + 0x53CC) + 201 + 19); int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000; if ((tacticLevel > 0) && (roundNumber == 1)) { if ( c->ebx == cmAddr + 0x132A0 ) { *(int*)(c->ecx + 196) -= tacticLevel; } } } return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x43D492, setBankUnitBonus); _PI->WriteLoHook(0x475A3D, resetTacticsUnitSpeedBonus); Вот так получилось. Но 2 проблемы имеется: 1. менял if ( *(char*)(heroOffset + 301 + (13 << 3)) == 4 ) { на if ( *(char*)(heroOffset + 301 + (13 << 3)) > 0 ) { что бы просто проверить что слот под баллисту занят - не завелось. Пушка бонуса не даёт. Какое значение при пустом слоте? 2. При режиме "ПВП битве а нейтралами" - вылетает на ходу нейтралов (какой код разбираю, но точно не бонус при бое в банке) PS: пункт 2 определил. Логика сбегания от нейтралов. Надо поставить проверку, что ходит герой, тогда кнопку разблокировтаь |
|
|
![]()
Сообщение
#419
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Какое значение при пустом слоте? -1 Да, ещё Код *(int*)(heroOffset + 301 + (slot << 3)) или Код *(int*)(heroOffset + 301 + slot * 8) Как удобнее. |
|
|
![]()
Сообщение
#420
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата Какое значение при пустом слоте? -1 я тоже так думал... потому и поставил проверку > 0. Но не завелось. Перепроверю. По поводу пункта 2, исправил. Получилось так: Новый блок добавил такой, в начало: ---------------------------- Цитата slot * 8 Во! Ибо я погуглил в С++ что значит <<, нашел инфу, но не сильно понял. Прочитал что менят сдвиг.. а *8 что даёт? |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 5 October 2025 - 11:02 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|