![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#301
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
По сути одно и то же.
Вот это Код if (*(short*)(c->esi + 85) < 10) лишнее. |
|
|
![]()
Сообщение
#302
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
А вот так - завелось:
Код char diplomacyLevelBonus = 0; if (*(char*)(c->esi + 201 + 4) > 0){ diplomacyLevelBonus = *(char*)(c->esi + 201 + 4) * 2; } Вот это Код if (*(short*)(c->esi + 85) < 10) лишнее. Что бы не заходить в проверки артов если есть 10й уровень. И так будет бонус |
|
|
![]()
Сообщение
#303
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Интересно, что не так в моём коде?
Цитата Что бы не заходить в проверки артов если есть 10й уровень. И так будет бонус Лишнее. Такая проверка будет после (cmp eax, 0Ah). |
|
|
![]()
Сообщение
#304
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Интересно, что не так в моём коде? Незнаю. У меня в коде со смещениями все значения. Мб в этом? Цитата Что бы не заходить в проверки артов если есть 10й уровень. И так будет бонус Лишнее. Такая проверка будет после (cmp eax, 0Ah). Так будет, но позже. Цель какую я преследовал была в том, что бы в целом не считать то, что не нужно. Т.е. какой смысл учитывать бонусы от артов / дипломатии. Когда без этих бонусов левела хватает ------------------------------------ Итого на данный момент получился такой код, для учёта левела при посещении библиотеки, с учётом артов: Код 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; } Код _PI->WriteLoHook(0x4A2F47, setLibraryVisitLevel); PS: итого переделывание навыка "дипломатия" закончено! ![]() Хотел ещё 5% бонусы сделать для откупа, от монстров для артов. Но думаю чёт с ними) И так уйму всяких мелочей учтено Благодарю за всесильную помощь! |
|
|
![]()
Сообщение
#305
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Просто реально не понимаю. Есть же контекст. Зачем писать *(int*)(c->esi + 85), если можно просто c->edx?
|
|
|
![]()
Сообщение
#306
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Просто реально не понимаю. Есть же контекст. Зачем писать *(int*)(c->esi + 85), если можно просто c->edx? ща перепроверю, но так не работало. 1 мин да, не работает. А вот так - вообще вылетает: Код char currentLevel = *(char*)c->edx; c char - вылетает тоже PS: я абсолютно не против разобрать причину, есть есть варианты что проверить |
|
|
![]()
Сообщение
#307
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Не нужно приведение типов. См. мой код. c->edx - это уже уровень героя.
Просто вижу, что требуется дополнительное пояснение. Итак, с->edx = 7 (уровень героя 7). Теперь вы делаете вот что *(char*)7; А именно пытаетесь прочитать память по адресу 7! |
|
|
![]()
Сообщение
#308
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Не нужно приведение типов. См. мой код. c->edx - это уже уровень героя. да, я пишу, что так не работает, т.е. уровень подходит уже по коду, а библиотека говорит "ты ещё не готов". И далее 2 варианта с приведением типов, которые вообще вылетают Проверил: Код c->eax = c->edx + allLevelBonuses; Так тоже не работает. Не вылетает ничего, но считает что условия не выполнены |
|
|
![]()
Сообщение
#309
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Разберём вот этот код:
Код .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 Вы ставите хук на 4A2F52h. Т.е. до выполнения этой инструкции. Соответственно, получаете контекст: в ecx - уровень дипломатии, потому что его туда интрукция movsx ecx, byte ptr [esi+0CDh] загрузила, в edx - уровень героя, потому что его туда инструкция movsx edx, word ptr [esi+55h] загрузила. Поэтому c->ecx - это уровень дипломатии в контексте, а c->edx - уровень героя. |
|
|
![]()
Сообщение
#310
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Разберём вот этот код: Код .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 Вы ставите хук на 4A2F52h. Т.е. до выполнения этой инструкции. Соответственно, получаете контекст: в ecx - уровень дипломатии, потому что его туда интрукция movsx ecx, byte ptr [esi+0CDh] загрузила, в edx - уровень героя, потому что его туда инструкция movsx edx, word ptr [esi+55h] загрузила. Поэтому c->ecx - это уровень дипломатии в контексте, а c->edx - уровень героя. На самом деле я и ранее это глянул вроде всё верно было. Но не работало... проверив "оригиналы" со смещением - завелось Сейчас проверю чистый тест, без доп условий артов и прочего. Будет ли работать... 5мин --------------------------------------- Итого: Код int __stdcall setLibraryVisitLevel2(LoHook* h, HookContext* c) { c->eax = c->edx + c->ecx * 2; //c->eax = c->edx; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4A2F47, setLibraryVisitLevel2); Вот так не работает. Даже на 11м уровне героя - говорит что не могу. Закоменченый вариант тоже попробовал. то же самое |
|
|
![]()
Сообщение
#311
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Млин! Да не на 0x4A2F47 хук ставить нужно. На 0x4A2F52.
Если хук на 0x4A2F47, естественно, Вы не получаете нужный контекст. |
|
|
![]()
Сообщение
#312
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Млин! Да не на 0x4A2F47 хук ставить нужно. На 0x4A2F52. Если хук на 0x4A2F47, естественно, Вы не получаете нужный контекст. Код int __stdcall setLibraryVisitLevel2(LoHook* h, HookContext* c) { c->eax = c->edx + c->ecx * 2; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4A2F52, setLibraryVisitLevel2); Вылетает при попытке захода в либу ----------------------- Код int __stdcall setLibraryVisitLevel2(LoHook* h, HookContext* c) { //c->eax = c->edx + c->ecx * 2; c->eax = c->edx; c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } Так тоже вылетает, т.е. не в дипломатии дело |
|
|
![]()
Сообщение
#313
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Этот код просто НЕ может вылетать. После сравнения
Код cmp eax, 0Ah регистр eax сразу же перезаписывается. Смотрите код внимательнее.Просто бред же. У вас всё работало. Проверьте так: Код int __stdcall setLibraryVisitLevel2(LoHook* h, HookContext* c)
{ c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } |
|
|
![]()
Сообщение
#314
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Этот код просто НЕ может вылетать. После сравнения Код cmp eax, 0Ah регистр eax сразу же перезаписывается. Смотрите код внимательнее.Просто бред же. У вас всё работало. Проверьте так: Код int __stdcall setLibraryVisitLevel2(LoHook* h, HookContext* c) { c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } https://www.youtube.com/watch?v=RARS97b0VQA...eature=youtu.be Пока проверяю код. Вот записал видео с экрана. Чуток лишнего обрезал ): И в конце не дало статов потому что было c->eax = c->edx + allLevelBonuses; Вместо c->eax = currentLevel + allLevelBonuses; ----------------------- Проверил - вылетает и с этими 2мя строчками |
|
|
![]()
Сообщение
#315
|
|
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; } LoHook на 0x4A2F52. На всякий случай уберите другие хуки на библиотеку. |
|
|
![]()
Сообщение
#316
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Напишите просто: Код 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; } LoHook на 0x4A2F52. На всякий случай уберите другие хуки на библиотеку. Закоментил вообще всё, даже изменение процентов некромантии. Голый код, только этот хук - вылетает |
|
|
![]()
Сообщение
#317
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Странно:
Тогда по минимуму: Код int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c) { c->return_address = 0x4A2F55; return NO_EXEC_DEFAULT; } Это вылетает? LoHook на 0x4A2F52 (!) |
|
|
![]()
Сообщение
#318
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#319
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Это я уже переварить не могу )) Мы просто передаём управление по адресу 4A2F55. Ваша ошибка. Если нет, то - патчера.
|
|
|
![]()
Сообщение
#320
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Это я уже переварить не могу )) Мы просто передаём управление по адресу 4A2F55. Ваша ошибка. Если нет, то - патчера. Вот чесно, не лень было. раз уже поставил прогу для записи экрана ![]() https://youtu.be/3oLTBAOzovE Может реально где ошибся... но я не вижу где PS: пересмотрел видео.. я не показал в коде контент ф-ии. Но уверяю там 2 строчки тока) ---------------------------------- И если не слишком сильно утомил, то имеется желание "поиск пути" апнуть... Сделать +1/2/3 к скорости юнита при подсчёте хода героя на начало дня т.е. что бы с вампиром-лордом герой бегал на 2000 едениц, как и с ангелом Как я понимаю базовая ф-я расчёта скорости героя - CalcHeroMovementsPoints Далее, если я верно понимаю должно вызываться это - loc_004E4E22, для расчёта скорости по земле Для воды - другая ф-я. Но вот что дальше делать - пока не понимаю |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 4 October 2025 - 08:06 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|