IPB

Здравствуйте, гость ( Вход | Регистрация )

29 страниц V  « < 8 9 10 11 12 > »   
Reply to this topicStart new topic
> Мод на ХотА
DedMorozzz
сообщение 21 Dec 2016, 23:21 (Сообщение отредактировал DedMorozzz - 21 Dec 2016, 23:24)
Сообщение #181

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 21 Dec 2016, 22:19) *
Закомментируйте вот это:

Код
/* 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ка возвращается (в смысле закоментить линию с ифом и линию с закрывающей скобкой)
А вариант феанора - хз как применить smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 21 Dec 2016, 23:47 (Сообщение отредактировал AlexSpl - 22 Dec 2016, 00:05)
Сообщение #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 Сорри, адрес по инерции скопировал. Исправил на правильный.

* * *
Короче, программа выполняется последовательно. Вы поставили несколько хуков. Сначала работает первый, потом второй и т.д. Они независимы, это разные функции и у них разный контекст.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 22 Dec 2016, 00:01 (Сообщение отредактировал DedMorozzz - 22 Dec 2016, 00:07)
Сообщение #183

God
Сообщений: 267
Спасибо сказали: 25 раз




не, не работает. Эффекта никакого (на герое одет амулет на шее, и флаг на плечах). А по идеи должно на меньше пачек при нападении делить, если я верно понимаю
а для этого адреса _PI->WriteLoHook(0x4A7441, setArmyValueArt); -- вылетает

Для 0x44A985 то же самое. Эффекта нет. Сделал усиление в 2 раза и в 30 раз, не меняется ничего

Но главная идея у меня была главную ф-ю расчёта изменить, а не новый хук делать. Так было бы правильнее наверное
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 22 Dec 2016, 00:06
Сообщение #184

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Попробуйте отдельный хук в посте выше. А лучше скиньте Ваш код под спойлер.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 22 Dec 2016, 00:07
Сообщение #185

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 21 Dec 2016, 23:06) *
Попробуйте отдельный хук в посте выше. А лучше скиньте Ваш код под спойлер.

Код
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);

Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 22 Dec 2016, 00:25 (Сообщение отредактировал AlexSpl - 22 Dec 2016, 00:29)
Сообщение #186

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Эффекта никакого (на герое одет амулет на шее, и флаг на плечах). А по идеи должно на меньше пачек при нападении делить, если я верно понимаю

Так код выше (Ваш пост) приводит к вылету или не даёт эффекта?

Цитата
А по идеи должно на меньше пачек при нападении делить, если я верно понимаю

Для некоторых клеток 3 стека - минимум. Меньше не получишь.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 22 Dec 2016, 00:27
Сообщение #187

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 21 Dec 2016, 23:25) *
Цитата
Эффекта никакого (на герое одет амулет на шее, и флаг на плечах). А по идеи должно на меньше пачек при нападении делить, если я верно понимаю

Так код выше (Ваш пост) приводит к вылету или не даёт эффекта?

Не вылетает, просто не влияет не на что
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 22 Dec 2016, 00:31 (Сообщение отредактировал AlexSpl - 22 Dec 2016, 00:32)
Сообщение #188

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Попробуйте напасть на сильный отряд стандартной армией и выставить модификатор в 100000.

Не этот ли у Вас случай:
Цитата
3 и более - 1 отряд. На самом деле, 1 отряд может получиться только из 2 отрядов с вероятностью 20%. Т.е. какой бы сильной ни была Ваша армия, всегда найдутся нейтралы, которые разделятся на 2 и даже 3 стека. Пример клетки, на которой нейтралы делятся на 3 отряда, даже если у Вашей армии 100-кратное превосходство, - 31:28:1. Подробнее здесь. В этой же теме можно найти и условия появления грейженого стека.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 22 Dec 2016, 00:47
Сообщение #189

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 21 Dec 2016, 23:31) *
Попробуйте напасть на сильный отряд стандартной армией и выставить модификатор в 100000.

Не этот ли у Вас случай:
Цитата
3 и более - 1 отряд. На самом деле, 1 отряд может получиться только из 2 отрядов с вероятностью 20%. Т.е. какой бы сильной ни была Ваша армия, всегда найдутся нейтралы, которые разделятся на 2 и даже 3 стека. Пример клетки, на которой нейтралы делятся на 3 отряда, даже если у Вашей армии 100-кратное превосходство, - 31:28:1. Подробнее здесь. В этой же теме можно найти и условия появления грейженого стека.


на самом деле ставлю без цикла в этой же ф-ии - работает всё.
В цикле умножаю на 30 каждый раз, 20 раз в сумме, то нападают все и делит на 7 пачек. Превышаю лимит походу)
т.е. именно логика проверки арта не отрабатывает. Не попадаем в нужное условие
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 22 Dec 2016, 00:54 (Сообщение отредактировал AlexSpl - 22 Dec 2016, 01:03)
Сообщение #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;
    }
}
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 22 Dec 2016, 01:22
Сообщение #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;
}


Всё равно. Не заходим
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 22 Dec 2016, 01:26 (Сообщение отредактировал AlexSpl - 22 Dec 2016, 01:38)
Сообщение #192

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Следующий код имеет эффект? Т.е. сначала хилой армией нападаем на отряд. Смотрим, на сколько стеков он разделился. Потом надеваем медаль дипломата и снова нападаем.

Код
if ( *(int*)(c->edx + 128 + 20) == 66 ) {
    c->eax *= 100;
}


Если Вы нападаете героем с Дипломатией, учтите, что бонус накапливается. Т.е. наличие медали умножило силу армии на модификатор, а потом ещё навык Дипломатии это значение увеличил.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 22 Dec 2016, 01:36 (Сообщение отредактировал DedMorozzz - 22 Dec 2016, 01:38)
Сообщение #193

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 22 Dec 2016, 00:26) *
Следующий код имеет эффект? Т.е. сначала хилой армией нападаем на отряд. Смотрим, на сколько стеков он разделился. Потом надеваем медаль дипломата и снова нападаем.

Код
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)
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 22 Dec 2016, 01:39
Сообщение #194

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Если Вы нападаете героем с Дипломатией, учтите, что бонус накапливается. Т.е. наличие медали умножило силу армии на модификатор, а потом ещё навык Дипломатии это значение увеличил.

Вот это проверяли?
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 22 Dec 2016, 01:43
Сообщение #195

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 22 Dec 2016, 00:39) *
Цитата
Если Вы нападаете героем с Дипломатией, учтите, что бонус накапливается. Т.е. наличие медали умножило силу армии на модификатор, а потом ещё навык Дипломатии это значение увеличил.

Вот это проверяли?

да, так и есть. ну и по коду так и должно быть
В функе увеличения модификатора артами, сделал увеличение на 1.1 - ящеры убегают тоже. Т.е. всё работает корректно
Только что проверил if ( *(int*)(c->edx + 128 + (i << 3) + 4) == 0 ) { --- всё равно не заходит
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 22 Dec 2016, 01:56 (Сообщение отредактировал AlexSpl - 23 Dec 2016, 19:54)
Сообщение #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. Последний из уровней, на переходе на который предложили магию стихии.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 22 Dec 2016, 21:28 (Сообщение отредактировал DedMorozzz - 22 Dec 2016, 21:36)
Сообщение #197

God
Сообщений: 267
Спасибо сказали: 25 раз




да, так работает! Спасибо smile.gif

Код
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;
}


Перенёс увеличение модификатора в одно место. И тут с Си++ затык. Не работает такой код. Если меняю модификатор - вылетает
Просто переменую левую описываю - всё ок. Т.е в условие попадаю, вроде всё ок. Как я вижу - проблема только со сложением
Как сложить тут? smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 22 Dec 2016, 21:45 (Сообщение отредактировал AlexSpl - 22 Dec 2016, 22:30)
Сообщение #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) для получения модификатора. Всё, что имеем от этого, - усложнение логики и два цикла вместо одного.

Ну вот, при редактировании пропал текст. Короче, смысл был такой: функция подсчёта альфы вызывается не единожды в коде и не только для нашего героя, но хук срабатывает каждый раз. Поэтому аккумулировать модификатор бессмысленно.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 22 Dec 2016, 22:45 (Сообщение отредактировал DedMorozzz - 22 Dec 2016, 22:49)
Сообщение #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 в ф-ю подсчёта модификатора для арта. ИМХО логичнее будет
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 22 Dec 2016, 22:53
Сообщение #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
Go to the top of the pageAdd Nick
 
+Quote Post

29 страниц V  « < 8 9 10 11 12 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 3 October 2025 - 21:30
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика