![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#281
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Попробуйте заменить условие на следующее:
Код int cmAddr = *(int*)0x699420; // адрес combatManager int side = *(int*)(cmAddr + 0x132C0); // сторона в битве (0 - правая, 1 - левая) if ( *(int*)(cmAddr + (0x14F4 - side) * 4) == 0 ) { ... } Например, для setSurrenderPrice: Код int __stdcall setSurrenderPrice(LoHook* h, HookContext* c)
{ int cmAddr = *(int*)0x699420; // адрес combatManager int side = *(int*)(cmAddr + 0x132C0); // сторона в битве (0 - правая, 1 - левая) if ( *(int*)(cmAddr + (0x14F4 - side) * 4) == 0 ) { // если нейтралы, меняем модификаторы (0.7, 0.8, 0.9) switch ( (char)c->ecx ) { case 1: *(float*)&c->edx = 0.7f; break; case 2: *(float*)&c->edx = 0.8f; break; case 3: *(float*)&c->edx = 0.9f; break; default: c->edx = 0; } c->return_address = 0x4E480B; return NO_EXEC_DEFAULT; } // если герой, оставляем стандарные модификаторы (0.2, 0.4, 0.6) return EXEC_DEFAULT; } |
|
|
![]()
Сообщение
#282
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Было бы неплохо увидеть значение. Но наверняка в combatManager'е есть и другие полезные поля, по которым можно определить, с кем велась битва. а как это посмотреть? Попробуйте заменить условие на следующее: Да, работает. От нейтралов с артами бесполатно. От героя платно |
|
|
![]()
Сообщение
#283
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Аналогично меняем ограничение:
Код {
int cmAddr = *(int*)0x699420; // адрес combatManager int side = *(int*)(cmAddr + 0x132C0); // сторона в битве (0 - правая, 1 - левая) float diploCap; if ( *(int*)(cmAddr + (0x14F4 - side) * 4) == 0 ) diploCap = 0.99f; else diploCap = 0.9f; if ( *(float*)(c->ebp - 4) > diploCap ) { *(float*)(c->ebp - 4) = diploCap; } c->return_address = 0x4E493F; return NO_EXEC_DEFAULT; } |
|
|
![]()
Сообщение
#284
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
хоть и текущего смысла в этом ограничении нету, но на "всякий" можно сделать
Ибо 60+10+10+10 (3 арта) это и есть 90% |
|
|
![]()
Сообщение
#285
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
А как же спецы Дипломаты?
|
|
|
![]()
Сообщение
#286
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
А как же спецы Дипломаты? я или не правильно помню. Или таких нету Ну и ещё момент с дипломатией. Хочу что бы арты дипломата снижали требования уровня для либы. Т.е. дефолтные 10. Каждый уровень дипломатии отнимает 2. А каждый арт по -1 Какой адресс отвечает за требования уровня? |
|
|
![]()
Сообщение
#287
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Ага, точно нету. Но код учитывает и спецов )
Цитата Какой адресс отвечает за требования уровня? 4A2F47h Код .text:004A2F47 loc_4A2F47:
.text:004A2F47 movsx ecx, byte ptr [esi+0CDh] .text:004A2F4E movsx edx, word ptr [esi+55h] .text:004A2F52 lea eax, [edx+ecx*2] .text:004A2F55 cmp eax, 0Ah |
|
|
![]()
Сообщение
#288
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Ага, точно нету. Но код учитывает и спецов ) Цитата Какой адресс отвечает за требования уровня? 4A2F47h Код .text:004A2F47 loc_4A2F47: .text:004A2F47 movsx ecx, byte ptr [esi+0CDh] .text:004A2F4E movsx edx, word ptr [esi+55h] .text:004A2F52 lea eax, [edx+ecx*2] .text:004A2F55 cmp eax, 0Ah Если я правильно понимаю, то надо изменить сам ответ от функции, отняв оттуда по левелу за арт Вижу такой код: Код .text:004A2EFD mov ecx, [eax] .text:004A2EFF mov esi, [ebp+arg_0] .text:004A2F02 shl ebx, cl ; Shift Logical Left .text:004A2F04 test [esi+6Fh], ebx ; Logical Compare .text:004A2F07 jz short loc_004A2F47 ; Jump if Zero (ZF=1) .text:004A2F09 mov al, [ebp+arg_8] .text:004A2F0C test al, al ; Logical Compare .text:004A2F0E jz loc_004A3046 ; Jump if Zero (ZF=1) И уровень героя, скорее всего тут - ebp+arg_8 Как понять что в arg_8 или в arg_0 Поставил точку остановки и вижу такое: https://sc-cdn.scaleengine.net/i/71b863470d...3f9c79e68d1.png Никакого значения переменной не отображается PS: не, фигня. Сам ответ от фукнции "да" или "нет". Соотв кастыльное решение - увеличивать уровень героя на +1 для расчёта допуска к библиотеке Нормальное - уменьшать требования. Пока что смотрел на не правльное Но вопрос всё равно актуальный, как смотреть значения в arg_№? |
|
|
![]()
Сообщение
#289
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Нет, я же написал адрес. esi - адрес героя, соответственно, [esi+55h] = *(short*)(c->esi + 85) - уровень героя, [esi+CDh] = *(char*)(c->esi + 201 + 4) - уровень дипломатии. Легко и арты получить, если знаешь адрес героя.
Т.е. ставите LoHook на 4A2F52h и в цикле перебираете арты. А как Вы, кстати, хотите, чтобы библиотека работала? |
|
|
![]()
Сообщение
#290
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Нет, я же написал адрес. esi - адрес героя, соответственно, [esi+55h] = *(short*)(esi + 85) - уровень героя, [esi+CDh] = *(char)(c->esi + 201 + 4) - уровень дипломатии. Легко и арты получить, если знаешь адрес героя. вроде понял, 10 мин. попробую прикрутить. Как арты смотреть вроде уже знаю А как Вы, кстати, хотите, чтобы библиотека работала? При наличии дипломатии что бы давала +3 к статам (это уже есть), код вот: Код int __stdcall libraryVisit(LoHook* h, HookContext* c) { if (*(char*)(c->esi + 201 + 4) > 0) { char bonus = 1; *(char*)(c->esi + 1142) += bonus; // атака *(char*)(c->esi + 1143) += bonus; // защита *(char*)(c->esi + 1144) += bonus; // колд. сила *(char*)(c->esi + 1145) += bonus; // знания } if (*(char*)(c->esi + 201 + 4) > 0) { char moreleBonus = *(char*)(c->esi + 201 + 4); *(char*)(c->esi + 282) += moreleBonus; } return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4A2F92, libraryVisit); Ну и +1/2/3 морали до след. битвы А при наличии артов, уменьшался требуемый левел на один |
|
|
![]()
Сообщение
#291
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Но вопрос всё равно актуальный, как смотреть значения в arg_№? К решению задачи не относится, но. Установите курсор на arg_N и нажмите клавишу k. Увидите что-то типа этого: [ebp + 8]. Аналогично с var_N: [ebp - 8]. Цитата А при наличии артов, уменьшался требуемый левел на один Код lea eax, [edx+ecx*2] Игра берёт уровень героя (edx) и плюсует к нему уровень дипломатии (ecx), помноженный на 2, затем сравнивает получившееся значение с 10. Решение простое: c->eax = (c->edx + количество_артов) + c->ecx * 2; |
|
|
![]()
Сообщение
#292
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата Но вопрос всё равно актуальный, как смотреть значения в arg_№? К решению задачи не относится, но. Установите курсор на arg_N и нажмите клавишу k. Увидите что-то типа этого: [ebp + 8]. Аналогично с var_N: [ebp - 8]. Цитата А при наличии артов, уменьшался требуемый левел на один Код lea eax, [edx+ecx*2] Игра берёт уровень героя (edx) и плюсует к нему уровень дипломатии (ecx), помноженный на 2, затем сравнивает получившееся значение с 10. Решение простое: c->eax = (c->edx + количество_артов) + c->ecx * 2; А я так написал, получилось: Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c) { if (*(short*)(c->esi + 85) < 10) { //*(short*)(c->esi + 85) = 10; int tmpLevelBonus = 0; for (int i = 0; i < 19; ++i) { if ( *(int*)(c->esi + 301 + (i << 3)) == 66 ) { tmpLevelBonus += 1; } if ( *(int*)(c->esi + 301 + (i << 3)) == 67 ) { tmpLevelBonus += 1; } if ( *(int*)(c->esi + 301 + (i << 3)) == 68 ) { tmpLevelBonus += 1; } } *(short*)(c->esi + 85) += tmpLevelBonus; } return EXEC_DEFAULT; } С небольшим но, левел реально вырос) Навыки не дали, просто открыв героя левел пишется выше |
|
|
![]()
Сообщение
#293
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c) { for (int i = 0; i < 19; ++i) { switch ( *(int*)(c->esi + 301 + (i << 3)) ) { case 66: c->edx += 1; break; case 67: c->edx += 1; break; case 68: c->edx += 1; break; } } c->eax = c->edx + c->ecx * 2; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } LoHook на 4A2F52h. Этот код для случая, если бонусы для артов решите поменять. Если для всех +1, то можно проще написать. Закончил редактировать. Реально есть проблема с табуляцией ) |
|
|
![]()
Сообщение
#294
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c) { for (int i = 0; i < 19; ++i) { switch ( *(int*)(c->esi + 301 + (i << 3)) ) { case 66: { c->edx += 1; break; } case 67: { c->edx += 1; break; } case 68: { c->edx += 1; break; } } c->eax = c->edx + c->ecx * 2; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } LoHook на 4A2F52h. Этот код для случая, если бонусы для артов решите поменять, есть для всех +1, то можно проще написать. Так мне же надо дипломатию тоже учесть если нету её У меня получилось пока что так, только вот и для 7го уровня (без дипломатии) условие проходит, статы повышаются: Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c) { if (*(short*)(c->esi + 85) < 10) { int tmpLevelBonus = 0; for (int i = 0; i < 19; ++i) { if ( *(int*)(c->esi + 301 + (i << 3)) == 66 ) { tmpLevelBonus += 1; } if ( *(int*)(c->esi + 301 + (i << 3)) == 67 ) { tmpLevelBonus += 1; } if ( *(int*)(c->esi + 301 + (i << 3)) == 68 ) { tmpLevelBonus += 1; } } c->eax = ((c->esi + 85) + tmpLevelBonus) + (c->esi + 201 + 4) * 2; } c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } PS: о, вижу новый код)) С дипломатией PPS: реально не пойму почему мой вариант не работает. По идеи (при 2х артах) должно быть так: 7 + 2 + 0*2 //9 А условие проходит |
|
|
![]()
Сообщение
#295
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Я только что исправил. Реально неудобно код писать в браузере.
Цитата Так мне же надо дипломатию тоже учесть если нету её Она учтена тут: Код c->eax = c->edx + c->ecx * 2; На всякий случай, продублирую код: Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c)
{ for (int i = 0; i < 19; ++i) { switch ( *(int*)(c->esi + 301 + (i << 3)) ) { case 66: c->edx += 1; break; case 67: c->edx += 1; break; case 68: c->edx += 1; break; } } c->eax = c->edx + c->ecx * 2; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } |
|
|
![]()
Сообщение
#296
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Код for (int i = 0; i < 19; ++i) { switch ( *(int*)(c->esi + 301 + (i << 3)) ) { case 66: c->edx += 1; break; case 67: c->edx += 1; break; case 68: c->edx += 1; break; } } c->eax = c->edx + c->ecx * 2; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; Этот код не работает тоже... Ну не то же.. у меня всегда почему-то работает, даже если левел мал) |
|
|
![]()
Сообщение
#297
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Ваш код не будет работать хотя бы из-за этого:
Код c->eax = ((c->esi + 85) + tmpLevelBonus) + (c->esi + 201 + 4) * 2; Вы работаете с адресами, а не со значениями. |
|
|
![]()
Сообщение
#298
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Ваш код не будет работать хотя бы из-за этого: Код c->eax = ((c->esi + 85) + tmpLevelBonus) + (c->esi + 201 + 4) * 2; Вы работаете с адресами, а не со значениями. хм. Пока что не сходится: Код if (*(char*)(c->esi + 201 + 4) > 0) { char moreleBonus = *(char*)(c->esi + 201 + 4); *(char*)(c->esi + 282) += moreleBonus; } Тут тот же принцип и работает не могу уловить пока что разницу На всякий случай, продублирую код: Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c) { for (int i = 0; i < 19; ++i) { switch ( *(int*)(c->esi + 301 + (i << 3)) ) { case 66: c->edx += 1; break; case 67: c->edx += 1; break; case 68: c->edx += 1; break; } } c->eax = c->edx + c->ecx * 2; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } Пробую разобрать что к чему. Почему не работает.. так вот, даже на 10м пишется что условия не выполнены |
|
|
![]()
Сообщение
#299
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Вот это работает?
Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c) { int artBonus = 0; for (int i = 0; i < 19; ++i) { switch ( *(int*)(c->esi + 301 + (i << 3)) ) { case 66: case 67: case 68: ++artBonus; } } c->eax = (c->edx + artBonus) + c->ecx * 2; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } Хук на 4A2F52h. |
|
|
![]()
Сообщение
#300
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Сделал... ошибка в приведении типа была. 1 мин, причешу код
Вот так завелось: Код 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; } Осталось проверить что наличие дипломатии корректно работает PS: да, это int diplomacyLevelBonus = *(int*)(c->esi + 201 + 4) * 2; не работает как надо. Без этого всё верно. Левел+арты считаются корректно |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 4 October 2025 - 08:07 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|