![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#181
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Закомментируйте вот это: Код /* for (int i = 0; i < 19; ++i) { if ( *(int*)(c->edx + 128 + (i << 3) + 4) == 66 ) { //currentModifier = currentModifier + 20; currentModifier = 30; } } */ И возвратите 30: return 30; Работает? Даже если просто иф закоментить - 30ка возвращается (в смысле закоментить линию с ифом и линию с закрывающей скобкой) А вариант феанора - хз как применить ![]() |
|
|
![]()
Сообщение
#182
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Скорее всего, хук неправильный, см.:
Код int __stdcall setArmyValue(LoHook* h, HookContext* c) Не нужно ничего возвращать, просто return EXEC_DEFAULT; Код должен быть таким, как я написал. Т.е. Код int __stdcall setArmyValueArt(LoHook* h, HookContext* c) { for (int i = 0; i < 19; ++i) { if ( *(int*)(c->edx + 128 + (i << 3) + 4) == 66 ) c->eax *= Mod; } return EXEC_DEFAULT; } // Mod =, например, 30. ... _PI->WriteLoHook(0x44A985, (void*)setArmyValueArt); Возвращать не нужно, т.к. LoHook - это тот же inline-патч, считай. Бонусы от предыдущих хуков будут работать нормально. Неправильно делать хук вспомогательной функцией. Хук - это патч. UPD Сорри, адрес по инерции скопировал. Исправил на правильный. * * * Короче, программа выполняется последовательно. Вы поставили несколько хуков. Сначала работает первый, потом второй и т.д. Они независимы, это разные функции и у них разный контекст. |
|
|
![]()
Сообщение
#183
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
не, не работает. Эффекта никакого (на герое одет амулет на шее, и флаг на плечах). А по идеи должно на меньше пачек при нападении делить, если я верно понимаю
а для этого адреса _PI->WriteLoHook(0x4A7441, setArmyValueArt); -- вылетает Для 0x44A985 то же самое. Эффекта нет. Сделал усиление в 2 раза и в 30 раз, не меняется ничего Но главная идея у меня была главную ф-ю расчёта изменить, а не новый хук делать. Так было бы правильнее наверное |
|
|
![]()
Сообщение
#184
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Попробуйте отдельный хук в посте выше. А лучше скиньте Ваш код под спойлер.
|
|
|
![]()
Сообщение
#185
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Попробуйте отдельный хук в посте выше. А лучше скиньте Ваш код под спойлер. Код int __stdcall setArmyValueArt(LoHook* h, HookContext* c) { for (int i = 0; i < 19; ++i) { if ( *(int*)(c->edx + 128 + (i << 3) + 4) == 66 ) { c->eax *= 30; } } return EXEC_DEFAULT; } ... _PI->WriteLoHook(0x44A985, setArmyValueArt); |
|
|
![]()
Сообщение
#186
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Эффекта никакого (на герое одет амулет на шее, и флаг на плечах). А по идеи должно на меньше пачек при нападении делить, если я верно понимаю Так код выше (Ваш пост) приводит к вылету или не даёт эффекта? Цитата А по идеи должно на меньше пачек при нападении делить, если я верно понимаю Для некоторых клеток 3 стека - минимум. Меньше не получишь. |
|
|
![]()
Сообщение
#187
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#188
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Попробуйте напасть на сильный отряд стандартной армией и выставить модификатор в 100000.
Не этот ли у Вас случай: Цитата 3 и более - 1 отряд. На самом деле, 1 отряд может получиться только из 2 отрядов с вероятностью 20%. Т.е. какой бы сильной ни была Ваша армия, всегда найдутся нейтралы, которые разделятся на 2 и даже 3 стека. Пример клетки, на которой нейтралы делятся на 3 отряда, даже если у Вашей армии 100-кратное превосходство, - 31:28:1. Подробнее здесь. В этой же теме можно найти и условия появления грейженого стека.
|
|
|
![]()
Сообщение
#189
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Попробуйте напасть на сильный отряд стандартной армией и выставить модификатор в 100000. Не этот ли у Вас случай: Цитата 3 и более - 1 отряд. На самом деле, 1 отряд может получиться только из 2 отрядов с вероятностью 20%. Т.е. какой бы сильной ни была Ваша армия, всегда найдутся нейтралы, которые разделятся на 2 и даже 3 стека. Пример клетки, на которой нейтралы делятся на 3 отряда, даже если у Вашей армии 100-кратное превосходство, - 31:28:1. Подробнее здесь. В этой же теме можно найти и условия появления грейженого стека. на самом деле ставлю без цикла в этой же ф-ии - работает всё. В цикле умножаю на 30 каждый раз, 20 раз в сумме, то нападают все и делит на 7 пачек. Превышаю лимит походу) т.е. именно логика проверки арта не отрабатывает. Не попадаем в нужное условие |
|
|
![]()
Сообщение
#190
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Не должно так быть, условие срабатывает, если ID арта = 66. У Вас есть способ выводить результат каждой итерации куда-нибудь? Т.е.
Код for (int i = 0; i < 19; ++i) {
if ( *(int*)(c->edx + 128 + (i << 3) + 4) == 66 ) { std::cout << "Сработало. i = " << i; c->eax *= 30; } } |
|
|
![]()
Сообщение
#191
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
а куда вывод должен произойти?
И ругается: 1>.\dllmain.cpp(277) : error C2039: 'cout' : is not a member of 'std' 1>.\dllmain.cpp(277) : error C2065: 'cout' : undeclared identifier Попробовал такой код: Код int __stdcall setArmyValueArt(LoHook* h, HookContext* c) { for (int i = 0; i < 19; ++i) { if ( *(int*)(c->edx + 128 + (i << 3) + 4) > 0 ) { c->eax *= 30; break; } } return EXEC_DEFAULT; } Всё равно. Не заходим |
|
|
![]()
Сообщение
#192
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Следующий код имеет эффект? Т.е. сначала хилой армией нападаем на отряд. Смотрим, на сколько стеков он разделился. Потом надеваем медаль дипломата и снова нападаем.
Код if ( *(int*)(c->edx + 128 + 20) == 66 ) { c->eax *= 100; } Если Вы нападаете героем с Дипломатией, учтите, что бонус накапливается. Т.е. наличие медали умножило силу армии на модификатор, а потом ещё навык Дипломатии это значение увеличил. |
|
|
![]()
Сообщение
#193
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Следующий код имеет эффект? Т.е. сначала хилой армией нападаем на отряд. Смотрим, на сколько стеков он разделился. Потом надеваем медаль дипломата и снова нападаем. Код if ( *(int*)(c->edx + 128 + 20) == 66 ) { c->eax *= 100; } Да, есть спец сейв. В котором 1 арх, и джебус с подземкой. ГО на поверхности циклопы, в поздемке - новые ящеры причала, с щитами Так вот с рейтом х20 мощи армии циклопы убегают (когда всё же нападаю 3 пака). Ящеры нападают всегда (3 пака тоже) Вот если задать х30 в функе с артом без условия, тогда и ящеры убегают. А при нападении и цикломы и ящеры делятся на 2 пака В условие не попадаем даже если делать просто > 0 , вместо == 66. Как в коде выше PS: есть подозрение что этот код или 0 возвращает или пустоту --- *(int*)(c->edx + 128 + (i << 3) + 4) |
|
|
![]()
Сообщение
#194
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Если Вы нападаете героем с Дипломатией, учтите, что бонус накапливается. Т.е. наличие медали умножило силу армии на модификатор, а потом ещё навык Дипломатии это значение увеличил. Вот это проверяли? |
|
|
![]()
Сообщение
#195
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата Если Вы нападаете героем с Дипломатией, учтите, что бонус накапливается. Т.е. наличие медали умножило силу армии на модификатор, а потом ещё навык Дипломатии это значение увеличил. Вот это проверяли? да, так и есть. ну и по коду так и должно быть В функе увеличения модификатора артами, сделал увеличение на 1.1 - ящеры убегают тоже. Т.е. всё работает корректно Только что проверил if ( *(int*)(c->edx + 128 + (i << 3) + 4) == 0 ) { --- всё равно не заходит |
|
|
![]()
Сообщение
#196
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Похоже, реально адрес арта неправильно считает ( Разбираюсь.
А так попробуйте: Код int __stdcall setArmyValueArt(LoHook* h, HookContext* c) { for (int i = 0; i < 19; ++i) { if ( *(int*)(c->edx + 128 + (i << 3)) == 66 ) c->eax *= 30; } return EXEC_DEFAULT; } * * * Не могу понять, я туплю или оффсеты в комментах структуры неправильные. UPD Всё-таки туплю (см. абзац в конце этого поста). Правильный код такой: Код for (int i = 0; i < 19; ++i) { if ( *(int*)(c->edx + 128 + (i << 3)) == 66 ) c->eax *= Mod; } 301 же - это оффсет идентификатора первого артефакта (шлема). Ещё вот тут оффсеты в комментах неправильные: Код _word_ aim_z; // +61
_int16_ last_magic_level; // +61. Последний из уровней, на переходе на который предложили магию стихии. |
|
|
![]()
Сообщение
#197
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
да, так работает! Спасибо
![]() Код float __stdcall getArmyValueModificator(int diplomacyLevel, HookContext* c) { float armyModificator[4] = {1.00, 1.10, 1.15, 20.00}; float currentModifier = ( (diplomacyLevel >= 0) && (diplomacyLevel <= 3) ? armyModificator[diplomacyLevel] : 1 ); for (int i = 0; i < 19; ++i) { if ( *(int*)(c->edx + 124 + (i << 3) + 4) == 66 ) { //(float)currentModifier += 0.3; float newVar = 12; } } return currentModifier; } Перенёс увеличение модификатора в одно место. И тут с Си++ затык. Не работает такой код. Если меняю модификатор - вылетает Просто переменую левую описываю - всё ок. Т.е в условие попадаю, вроде всё ок. Как я вижу - проблема только со сложением Как сложить тут? ![]() |
|
|
![]()
Сообщение
#198
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Не нужно передавать весь контекст. Пусть функция, которая считает модификатор (getArmyValueModificator(), я переименовал её в getArtModifier()), получает в качестве аргументов только массив артефактов.
Код float getArtModifier(int art[]) { ... for (int i = 0; i < 19; ++i) { if ( art[i] == 66 ) { artModifier = ...; } } return artModifier; } Т.е. есть функция int __stdcall setArmyValueArt(LoHook* h, HookContext* c). В ней читаем арты: art[i] = *(int*)(c->edx + 124 + (i << 3) + 4); и вызываем getArtModifier(art) для получения модификатора. Всё, что имеем от этого, - усложнение логики и два цикла вместо одного. Ну вот, при редактировании пропал текст. Короче, смысл был такой: функция подсчёта альфы вызывается не единожды в коде и не только для нашего героя, но хук срабатывает каждый раз. Поэтому аккумулировать модификатор бессмысленно. |
|
|
![]()
Сообщение
#199
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Код float __stdcall getArtArmyValueModificator(int art[]) { for (int i = 0; i < 19; ++i) { if ( art[i] == 66 ) { return 30; } } return 0; } float __stdcall getArmyValueModificator(int diplomacyLevel, HookContext* c) { float armyModificator[4] = {1.00, 1.10, 1.15, 20.00}; float currentModifier = ( (diplomacyLevel >= 0) && (diplomacyLevel <= 3) ? armyModificator[diplomacyLevel] : 1 ); int art[19]; for (int i = 0; i < 19; ++i) { art[i] = *(int*)(c->edx + 124 + (i << 3) + 4); } float currentArtModifier = getArtArmyValueModificator(art); return currentArtModifier + currentModifier; } падает так.. Но всё равно кажется херню делаю) Дважды цикл, когда можно единожды в 1м месте Чего не передать hookContent в ф-ю подсчёта модификатора для арта. ИМХО логичнее будет |
|
|
![]()
Сообщение
#200
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Не, так не нужно )
Попробую объяснить. Есть код: 0: a = a + 1; 1: b = a + 2; 2: c = b + 3; Вы ставите хук на 1 (это адрес такой) и пишете свой код, например: if ( a == 4) a = 100; Нормальное выполнение программы при a = 3: 0: a = a + 1; // a = 4 1: b = a + 2; // b = 6 2: c = b + 3; // c = 9 С хуком: 0: a = a + 1; // a = 4 *хук* if ( a == 4) a = 100; // a = 100 *хук* 1: b = a + 2; // b = 102 2: c = b + 3; // c = 105 |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 3 October 2025 - 21:30 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|