IPB

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

29 страниц V  « < 13 14 15 16 17 > »   
Reply to this topicStart new topic
> Мод на ХотА
AlexSpl
сообщение 27 Dec 2016, 19:21 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 19:47)
Сообщение #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;
}


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 19:36
Сообщение #282

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




Цитата(AlexSpl @ 27 Dec 2016, 17:30) *
Было бы неплохо увидеть значение. Но наверняка в combatManager'е есть и другие полезные поля, по которым можно определить, с кем велась битва.

а как это посмотреть?

Цитата(AlexSpl @ 27 Dec 2016, 18:21) *
Попробуйте заменить условие на следующее:

Да, работает. От нейтралов с артами бесполатно. От героя платно
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 19:42 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 19:48)
Сообщение #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;
}
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 19:47
Сообщение #284

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




хоть и текущего смысла в этом ограничении нету, но на "всякий" можно сделать
Ибо 60+10+10+10 (3 арта) это и есть 90%
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 19:49
Сообщение #285

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




А как же спецы Дипломаты?
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 19:56 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 20:02)
Сообщение #286

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




Цитата(AlexSpl @ 27 Dec 2016, 18:49) *
А как же спецы Дипломаты?

я или не правильно помню. Или таких нету

Ну и ещё момент с дипломатией. Хочу что бы арты дипломата снижали требования уровня для либы. Т.е. дефолтные 10. Каждый уровень дипломатии отнимает 2. А каждый арт по -1
Какой адресс отвечает за требования уровня?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 20:12 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 20:13)
Сообщение #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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 20:24 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 20:26)
Сообщение #288

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




Цитата(AlexSpl @ 27 Dec 2016, 19:12) *
Ага, точно нету. Но код учитывает и спецов )

Цитата
Какой адресс отвечает за требования уровня?


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_№?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 20:30 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 20:35)
Сообщение #289

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




Нет, я же написал адрес. esi - адрес героя, соответственно, [esi+55h] = *(short*)(c->esi + 85) - уровень героя, [esi+CDh] = *(char*)(c->esi + 201 + 4) - уровень дипломатии. Легко и арты получить, если знаешь адрес героя.

Т.е. ставите LoHook на 4A2F52h и в цикле перебираете арты.

А как Вы, кстати, хотите, чтобы библиотека работала?
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 20:36
Сообщение #290

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




Цитата(AlexSpl @ 27 Dec 2016, 19:30) *
Нет, я же написал адрес. esi - адрес героя, соответственно, [esi+55h] = *(short*)(esi + 85) - уровень героя, [esi+CDh] = *(char)(c->esi + 201 + 4) - уровень дипломатии. Легко и арты получить, если знаешь адрес героя.

вроде понял, 10 мин. попробую прикрутить. Как арты смотреть вроде уже знаю

Цитата(AlexSpl @ 27 Dec 2016, 19:30) *
А как Вы, кстати, хотите, чтобы библиотека работала?

При наличии дипломатии что бы давала +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 морали до след. битвы


А при наличии артов, уменьшался требуемый левел на один
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 20:45 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 20:47)
Сообщение #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;
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 20:48
Сообщение #292

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




Цитата(AlexSpl @ 27 Dec 2016, 19:45) *
Цитата
Но вопрос всё равно актуальный, как смотреть значения в 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;
}


С небольшим но, левел реально вырос) Навыки не дали, просто открыв героя левел пишется выше
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 21:07 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 21:11)
Сообщение #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, то можно проще написать.

Закончил редактировать. Реально есть проблема с табуляцией )
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 21:07 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 21:11)
Сообщение #294

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




Цитата(AlexSpl @ 27 Dec 2016, 20:01) *
Код
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
А условие проходит
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 21:12 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 21:17)
Сообщение #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;
}
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 21:17
Сообщение #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;

Этот код не работает тоже... Ну не то же.. у меня всегда почему-то работает, даже если левел мал)
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 21:28
Сообщение #297

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




Ваш код не будет работать хотя бы из-за этого:
Код
c->eax = ((c->esi + 85) + tmpLevelBonus) + (c->esi + 201 + 4) * 2;


Вы работаете с адресами, а не со значениями.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 21:51
Сообщение #298

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




Цитата(AlexSpl @ 27 Dec 2016, 20:28) *
Ваш код не будет работать хотя бы из-за этого:
Код
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;
    }

Тут тот же принцип и работает

не могу уловить пока что разницу

Цитата(AlexSpl @ 27 Dec 2016, 20:12) *
На всякий случай, продублирую код:

Код
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м пишется что условия не выполнены
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 21:57
Сообщение #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.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 22:00 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 22:03)
Сообщение #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; не работает как надо. Без этого всё верно. Левел+арты считаются корректно
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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