![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#321
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Нет смысла в видео, всё равно ничего не видно. У вас хук работал (!). Почему он не работает сейчас?
Как бы вот это не поменялось: Код c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; Просто тестируйте, прежде чем постить. Цитата Вот так завелось: Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c) { int tmpLevelBonus = 0; if (*(short*)(c->esi + 85) < 10) { for (int i = 0; i < 19; ++i) { switch ( *(int*)(c->esi + 301 + (i << 3)) ) { case 66: tmpLevelBonus += 1; break; case 67: tmpLevelBonus += 1; break; case 68: tmpLevelBonus += 1; break; } } } int currentLevel = *(int*)(c->esi + 85); int diplomacyLevelBonus = *(int*)(c->esi + 201 + 4) * 2; c->eax = currentLevel + tmpLevelBonus + diplomacyLevelBonus; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } Ваш код, который работал. |
|
|
![]()
Сообщение
#322
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
работал только мой код. Тот который последнее время пробуем - нет
Если что у видео есть выбор качества, у меня норм отображается ![]() Т.е. текущий рабочий код выглядит так: Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c) { int allLevelBonuses = 0; if (*(short*)(c->esi + 85) < 10) { for (int i = 0; i < 19; ++i) { switch ( *(int*)(c->esi + 301 + (i << 3)) ) { case 66: allLevelBonuses += 1; break; case 67: allLevelBonuses += 1; break; case 68: allLevelBonuses += 1; break; } } if (*(char*)(c->esi + 201 + 4) > 0) { allLevelBonuses += *(char*)(c->esi + 201 + 4) * 2; } } int currentLevel = *(int*)(c->esi + 85); c->eax = currentLevel + allLevelBonuses; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } Никакой другой не работал. Только который был со смещениями |
|
|
![]()
Сообщение
#323
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Я понимаю, что этот код работает. Но *(int*)(c->esi + 85) есть c->edx, а *(char*)(c->esi + 201 + 4) есть c->ecx.
Разницу между указателями и непосредственными значениями знаете? * * * Короче, просто задачка по теме: Запарсите в уме *(float*)&c->eax = 0.1f; *Как* это работает, понимаете? Почему это работает? ) |
|
|
![]()
Сообщение
#324
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Я понимаю, что этот код работает. Но *(int*)(c->esi + 85) есть c->edx, а *(char*)(c->esi + 201 + 4) есть c->ecx. Разницу между указателями и непосредственными значениями знаете? * * * Короче, просто задачка по теме: Запарсите в уме (*float*)&c->eax = 0.1f; *Как* это работает, понимаете? Да, то что должно быть одинаково я понимаю. Это по сути переменная, под каким видом пройдёт. Я в коде такое часто пишу. Тот же baseHeroOffset то же самое, вот от сюда: Код int __stdcall setArmyValue(LoHook* h, HookContext* c) { int baseHeroOffset = c->edi; float armyModifier = getArmyValueModifier(baseHeroOffset); (int)c->eax *= (1 + armyModifier); return EXEC_DEFAULT; } int __stdcall setArmyValuePreview(LoHook* h, HookContext* c) { int baseHeroOffset = c->esi; float armyModifier = getArmyValueModifier(baseHeroOffset); (int)c->eax *= (1 + armyModifier); return EXEC_DEFAULT; } int __stdcall setArmyValueSplit(LoHook* h, HookContext* c) { int baseHeroOffset = *(int*)(c->ebp + 8); float armyModifier = getArmyValueModifier(baseHeroOffset); (int)c->eax *= (1 + armyModifier); return EXEC_DEFAULT; } Насчёт (*float*)&c->eax = 0.1f; Это не понятно, выглядит как странное приведение типа. Но в том случае когда c->eax это интеджер Но это так, догадка что переписывается тип.. |
|
|
![]()
Сообщение
#325
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Да нет тут высшей математики.
Лежит число по адресу A. Захотели его прочитать, пишете *(type*)A. Где type - это тип, который Вам нужен. Хотите читайте его как целое, а хотите - как дробное. Цитата *(float*)&c->eax = 0.1f; 1. &c->eax - получаем адрес числа, а не его значение; 2. *(float*)&c->eax - интерпретируем число по адресу &c->eax, как float. |
|
|
![]()
Сообщение
#326
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Но это так, догадка что переписывается тип.. Допустим, я компилятор и я заявляю, что тип pretty буду обрабатывать так: каждый нечётный бит, равный 1, будет добавлять 4 к значению. 0000 0000 = 0 1000 1000 = 0 0100 0000 = 4 0100 0100 = 8 и т.д. Пусть в регистре eax находится адрес числа 1101 1101 = 0xDD = 221. Тогда *(int*)eax будет возвращать 221, а *(pretty*)eax - 16. |
|
|
![]()
Сообщение
#327
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата *(float*)&c->eax = 0.1f; 1. &c->eax - получаем адрес числа, а не его значение; 2. *(float*)&c->eax - интерпретируем число по адресу &c->eax, как float. Слегка не ясно. Зачем амперсант тогда. Если Цитата 2. *(float*)&c->eax - интерпретируем число по адресу &c->eax, как float. Т.е. значение адресса берём. Это не то же самое что и *(float*)c->eax ? Как я понял. &c->eax == 0x4E480B (условно) При этом c->eax = 12 (условно) Соотв. если флоат интерпретирует значение по адрессу как флоат, это то же самое что и без амперсанта ... (float) c->eax === *(float*)&c->eax ? |
|
|
![]()
Сообщение
#328
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Т.е. значение адресса берём. Это не то же самое что и *(float*)c->eax ? Например, если c->eax = 0, то *(float*)c->eax прочитает память по нулевому адресу. Типичная причина вылета. Можно ещё так: Код *(float*)&c->eax = 1.1f; Код (float&)c->eax = 1.1f;
|
|
|
![]()
Сообщение
#329
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Какая ф-я(адрес) расчёт скорости героя на начало хода ведёт?
Имеется виду именно минимальная скорость монстра в войске героя. Хочу при определёных условиях мин скорость монстра увеличивать |
|
|
![]()
Сообщение
#330
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20603 раза ![]() |
004E4C00, DoCalcHeroMovementPoints
|
|
|
![]()
Сообщение
#331
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
004E4C00, DoCalcHeroMovementPoints Как я понимаю базовая ф-я расчёта скорости героя - CalcHeroMovementsPoints Далее, если я верно понимаю должно вызываться это - loc_004E4E22, для расчёта скорости по земле Для воды - другая ф-я. Но вот что дальше делать - пока не понимаю Вот на этом подзастрял.. |
|
|
![]()
Сообщение
#332
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20603 раза ![]() |
004E4ED9 - место где скорость минимального существа преобразуется в запас очков хода
наверное, так Код int __stdcall qwertyuiop(LoHook* h, HookContext* c)
{ c->ecx += *(char*)(c->ebx + 201); return EXEC_DEFAULT; } h->WriteLoHook(0x4E4ED9, (void*)qwertyuiop); |
|
|
![]()
Сообщение
#333
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
004E4ED9 - место где скорость минимального существа преобразуется в запас очков хода наверное, так Код int __stdcall qwertyuiop(LoHook* h, HookContext* c) { c->ecx += *(char*)(c->ebx + 201); return EXEC_DEFAULT; } h->WriteLoHook(0x4E4ED9, (void*)qwertyuiop); да, оно. Спасибо! |
|
|
![]()
Сообщение
#334
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
чёт странное происходит:
Код int __stdcall setBaseHeroSpeed(LoHook* h, HookContext* c) { char speedBonus = 0; if (*(char*) (c->edx + 201 + 0) > 0) { speedBonus = 3; } char finalBonus = *(char*)(c->ebx + 201) + speedBonus; c->ecx += finalBonus; return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4E4ED9, setBaseHeroSpeed); Муха из болота. Скорость 9. Базовая скорость 1900. Базовый поиск пути - скорость становится 1960 Улучшенный - 2000 Ожидаемо 2000 всегда ибо в коде прописано "при наличии поиска пути" делать +3 к скорости. Уровень навыка пока что не влияет... В чём тут ошибка? |
|
|
![]()
Сообщение
#335
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20603 раза ![]() |
Цитата Код if (*(char*) (c->edx + 201 + 0) > 0) { ebx же |
|
|
![]()
Сообщение
#336
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#337
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Пробую сделать +1/+2/+3 скорости на 1й ход, для тактики, во время боя во всех банках (т.е. там где войска по центру)
Иду от простого к сложному. Пробую для любого боя, без учёта тактики сделать бонус к ходу .text:00475A37 loc_00475A37: ; CODE XREF: sub_00475800+255j .text:00475A37 cmp dword ptr [ecx+34h], 0FFFFFFFFh ; Compare Two Operands .text:00475A3B jz short loc_00475A45 ; Jump if Zero (ZF=1) .text:00475A3D call combatMonster_SetUpNewRound ; Call Procedure .text:00475A42 mov ecx, [ebp-4] Сюда мы попадаем когда начинается новый ход. Здесь я должен убрать бонус к скорости, если он есть. Но лучшее решение - взять номер раунда, если 1й, тогда давать бонус, но временно... В общем, пробую хоть что-то сделать, что бы работало. Т.е. язнаю что попадаю в блок выше (475A37) после 1го раунда Делаю: Код int __stdcall setTacticsUnitSpeed(LoHook* h, HookContext* c) { //*(int*)(c->ecx +196) += 2; *(int*)(c->ecx + 1224) += 2; return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x475A37, setTacticsUnitSpeed); Не работает. Итого вопрос - как более правильно задать скорость монстров, желательно на 1н ход. Какой адресс и edi/edx... юзать И заодно, было бы здорово понять когда бой в банке, а когда обычный |
|
|
![]()
Сообщение
#338
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Попробовал на ф-ю Battle
Код _PI->WriteLoHook(0x4AD163, setTacticsUnitSpeed); Судя по коду 2 переменные там: Код .text:004AD161 mov ebp, esp Зная по примеру из магии замедления, есть 2 смещения монстров. 196 скорость и 1224 - модификатор скорости В надежде что или ebp или esp будет монстр - пробовал им задать. При любом раскладе вылетает Какой адрес верный? Должна же в ф-ии битвы присутствовать переменная с монстрами |
|
|
![]()
Сообщение
#339
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Что я могу сказать? ) Не решается эта задача так просто. Нужно ловить в коде инициализацию отрядов. Если бой в банке, всем союзным добавлять +1 к скорости. В начале второго раунда убирать этот бонус. Куча работы.
|
|
|
![]()
Сообщение
#340
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Что я могу сказать? ) Не решается эта задача так просто. Нужно ловить в коде инициализацию отрядов. Если бой в банке, всем союзным добавлять +1 к скорости. В начале второго раунда убирать этот бонус. Куча работы. я понимаю ): Нашел код боя. Нашел код нового раунда. Вроде знаю смещения модификаторов скорости А вот совместить как - хз. Даже не то что совместить, а хотя бы реализовать частично кусок - хз как Потому и пошел по частям - увеличить при любом бое союзным юнитам скорость на 1. Но не понял как Нет цели всё сразу, пробую по частям PS: т.е. на данный момент хочу решить задачу такую - при наличии тактики (смещение +19) всем союзным юнитам сделать +2 скорости PPS: чуток подкопал по банкам/склепам 0040AB40 - адресс посещения банка. (.text:0040AB40 Enter2ObjectGuardText proc near) там диалог. Последний блокперед боем (004AC24E loc_004AC24E:) В нём вызывается (loc_004ABAB0) это уже сам бой |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 4 October 2025 - 11:25 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|