IPB

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

29 страниц V  « < 14 15 16 17 18 > »   
Reply to this topicStart new topic
> Мод на ХотА
AlexSpl
сообщение 27 Dec 2016, 22:05 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 22:07)
Сообщение #301

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




По сути одно и то же.

Вот это

Код
if (*(short*)(c->esi + 85) < 10)

лишнее.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 22:08
Сообщение #302

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




А вот так - завелось:
Код
char diplomacyLevelBonus = 0;
    if (*(char*)(c->esi + 201 + 4) > 0){
        diplomacyLevelBonus = *(char*)(c->esi + 201 + 4) * 2;
    }


Цитата(AlexSpl @ 27 Dec 2016, 21:05) *
Вот это

Код
if (*(short*)(c->esi + 85) < 10)

лишнее.


Что бы не заходить в проверки артов если есть 10й уровень. И так будет бонус
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 22:10
Сообщение #303

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




Интересно, что не так в моём коде?

Цитата
Что бы не заходить в проверки артов если есть 10й уровень. И так будет бонус

Лишнее. Такая проверка будет после (cmp eax, 0Ah).
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 22:21 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 22:26)
Сообщение #304

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




Цитата(AlexSpl @ 27 Dec 2016, 21:10) *
Интересно, что не так в моём коде?

Незнаю. У меня в коде со смещениями все значения. Мб в этом?

Цитата(AlexSpl @ 27 Dec 2016, 21:10) *
Цитата
Что бы не заходить в проверки артов если есть 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: итого переделывание навыка "дипломатия" закончено! smile.gif
Хотел ещё 5% бонусы сделать для откупа, от монстров для артов. Но думаю чёт с ними) И так уйму всяких мелочей учтено
Благодарю за всесильную помощь!
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 22:28
Сообщение #305

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




Просто реально не понимаю. Есть же контекст. Зачем писать *(int*)(c->esi + 85), если можно просто c->edx?
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 22:34 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 22:35)
Сообщение #306

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




Цитата(AlexSpl @ 27 Dec 2016, 21:28) *
Просто реально не понимаю. Есть же контекст. Зачем писать *(int*)(c->esi + 85), если можно просто c->edx?

ща перепроверю, но так не работало. 1 мин

да, не работает. А вот так - вообще вылетает:
Код
char currentLevel = *(char*)c->edx;


c char - вылетает тоже

PS: я абсолютно не против разобрать причину, есть есть варианты что проверить
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 22:36 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 22:40)
Сообщение #307

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




Не нужно приведение типов. См. мой код. c->edx - это уже уровень героя.

Просто вижу, что требуется дополнительное пояснение.

Итак, с->edx = 7 (уровень героя 7). Теперь вы делаете вот что *(char*)7; А именно пытаетесь прочитать память по адресу 7!
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 22:38 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 22:39)
Сообщение #308

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




Цитата(AlexSpl @ 27 Dec 2016, 21:36) *
Не нужно приведение типов. См. мой код. c->edx - это уже уровень героя.

да, я пишу, что так не работает, т.е. уровень подходит уже по коду, а библиотека говорит "ты ещё не готов".
И далее 2 варианта с приведением типов, которые вообще вылетают

Проверил:
Код
c->eax = c->edx + allLevelBonuses;

Так тоже не работает. Не вылетает ничего, но считает что условия не выполнены
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 22:46
Сообщение #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 - уровень героя.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 22:58 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 22:58)
Сообщение #310

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




Цитата(AlexSpl @ 27 Dec 2016, 21:46) *
Разберём вот этот код:

Код
.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м уровне героя - говорит что не могу. Закоменченый вариант тоже попробовал. то же самое
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 23:03 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 23:05)
Сообщение #311

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




Млин! Да не на 0x4A2F47 хук ставить нужно. На 0x4A2F52.

Если хук на 0x4A2F47, естественно, Вы не получаете нужный контекст.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 23:07 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 23:13)
Сообщение #312

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




Цитата(AlexSpl @ 27 Dec 2016, 22:03) *
Млин! Да не на 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;
}

Так тоже вылетает, т.е. не в дипломатии дело
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 23:30 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 23:31)
Сообщение #313

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




Этот код просто НЕ может вылетать. После сравнения
Код
cmp eax, 0Ah
регистр eax сразу же перезаписывается. Смотрите код внимательнее.

Просто бред же.

У вас всё работало. Проверьте так:

Код
int __stdcall setLibraryVisitLevel2(LoHook* h, HookContext* c)
{
    c->return_address = 0x4A2F55;
    return NO_EXEC_DEFAULT;
}
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 23:36 (Сообщение отредактировал DedMorozzz - 27 Dec 2016, 23:38)
Сообщение #314

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




Цитата(AlexSpl @ 27 Dec 2016, 22:30) *
Этот код просто НЕ может вылетать. После сравнения
Код
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мя строчками
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 23:40 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 23:40)
Сообщение #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.

На всякий случай уберите другие хуки на библиотеку.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 23:44
Сообщение #316

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




Цитата(AlexSpl @ 27 Dec 2016, 22:40) *
Напишите просто:

Код
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.

На всякий случай уберите другие хуки на библиотеку.


Закоментил вообще всё, даже изменение процентов некромантии. Голый код, только этот хук - вылетает
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 23:48 (Сообщение отредактировал AlexSpl - 27 Dec 2016, 23:50)
Сообщение #317

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




Странно:

Тогда по минимуму:

Код
int __stdcall setLibraryVisitLevel(LoHook* h, HookContext* c)
{
    c->return_address = 0x4A2F55;
    return NO_EXEC_DEFAULT;
}


Это вылетает?

LoHook на 0x4A2F52 (!)
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 27 Dec 2016, 23:52
Сообщение #318

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




Цитата(AlexSpl @ 27 Dec 2016, 22:48) *
Это вылетает?

LoHook на 0x4A2F52 (!)


Да. И только при заходе в библиотеку. Герои просматриваются. Меняются... захожу в либу - вылетает
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 27 Dec 2016, 23:56
Сообщение #319

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




Это я уже переварить не могу )) Мы просто передаём управление по адресу 4A2F55. Ваша ошибка. Если нет, то - патчера.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 28 Dec 2016, 00:14 (Сообщение отредактировал DedMorozzz - 28 Dec 2016, 00:14)
Сообщение #320

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




Цитата(AlexSpl @ 27 Dec 2016, 22:56) *
Это я уже переварить не могу )) Мы просто передаём управление по адресу 4A2F55. Ваша ошибка. Если нет, то - патчера.

Вот чесно, не лень было. раз уже поставил прогу для записи экрана smile.gif
https://youtu.be/3oLTBAOzovE

Может реально где ошибся... но я не вижу где

PS: пересмотрел видео.. я не показал в коде контент ф-ии. Но уверяю там 2 строчки тока)

----------------------------------

И если не слишком сильно утомил, то имеется желание "поиск пути" апнуть...
Сделать +1/2/3 к скорости юнита при подсчёте хода героя на начало дня
т.е. что бы с вампиром-лордом герой бегал на 2000 едениц, как и с ангелом

Как я понимаю базовая ф-я расчёта скорости героя - CalcHeroMovementsPoints
Далее, если я верно понимаю должно вызываться это - loc_004E4E22, для расчёта скорости по земле
Для воды - другая ф-я. Но вот что дальше делать - пока не понимаю
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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