IPB

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

29 страниц V  « < 23 24 25 26 27 > »   
Reply to this topicStart new topic
> Мод на ХотА
DedMorozzz
сообщение 31 Dec 2016, 01:20
Сообщение #481

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




А смысл пытаться сделать так же, как и при касте блесса, когда можно просто в проверку активации блага (наличие молитвы) добавить и проверку на тип существа
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 01:21
Сообщение #482

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




А проще посмотреть в хедерах: должно быть поле, по которому сразу можно определить: undead или нет.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 01:23
Сообщение #483

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




в смысле есть отдельное поле "isUndead"? И где эти хедеры смотреть?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 01:25
Сообщение #484

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




homm3.h. Там, по идее, должна быть описана структура стека.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 01:31
Сообщение #485

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




такое есть:
NOALIGN struct _BattleStack_ : _Struct_ // размер 0x548
{
....
_int32_ creature_id; // +52 0x34 // тип монстра

Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 01:34 (Сообщение отредактировал AlexSpl - 31 Dec 2016, 01:40)
Сообщение #486

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




Попробуйте так проверять:

Код
if ( *(int*)(c->reg + 0x105) & 0x40000 )


c->reg - указатель на стек.

Цитата
такое есть:
NOALIGN struct _BattleStack_ : _Struct_ // размер 0x548
{
....
_int32_ creature_id; // +52 0x34 // тип монстра

Вот. А что там по смещению 0x105?

Поправил. Это ж битовое поле.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 01:40
Сообщение #487

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




Цитата(AlexSpl @ 31 Dec 2016, 00:34) *
Вот. А что там по смещению 0x105?

0x105 не нашло. А +261 (dec) только для героя инфа
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 01:49 (Сообщение отредактировал AlexSpl - 31 Dec 2016, 01:53)
Сообщение #488

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




Странно. В erm точно про undead шла речь? Если да, то см. мой пост выше. Проверка такая

if ( *(int*)(c->reg + 0x105) & 0x40000 ) {
_значит_undead_
}

c->reg - это c->esi в нашем случае.



Сорри, контекст )

Код
{
    if ( (*(int*)(c->ecx + 0x258) != 0) && (!(*(int*)(c->ecx + 0x105) & 0x40000)) ) c->eax = 1; // проверяем Prayer и андедов

    return EXEC_DEFAULT;
}
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 01:50 (Сообщение отредактировал DedMorozzz - 31 Dec 2016, 01:55)
Сообщение #489

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




Цитата(AlexSpl @ 31 Dec 2016, 00:49) *
Странно. В erm точно про undead шла речь? Если да, то см. мой пост выше. Проверка такая

if ( *(int*)(c->reg + 0x105) & 0x40000 ) {
_значит_undead_
}

c->reg - это c->esi в нашем случае.



Сорри, контекст )

Код
{
    if ( (*(int*)(c->ecx + 0x258) != 0) && ( !(*(int*)(c->reg + 0x105) & 0x40000) ) c->eax = 1; // проверяем Prayer и андедов

    return EXEC_DEFAULT;
}

ecx только, а не esi
Код
if ( *(int*)(c->ecx + 0x105) & 0x40000 ) {
            c->eax = 1;
        }


Вот так завелось


Вот из ERM:
Цитата
262144 Нежить (все существа Некрополиса, существо с этим флагом не имеет морали, получает урон от заклинания Уничтожить нежить и не несет урона от Волны смерти)
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 01:56
Сообщение #490

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




Ага. Лучше на два if разбить. Я запарился со скобками )

*(int*)(c->ecx + 0x105) & 0x40000, похоже возвращает, живой ли стек. Но это не важно. Если работает, значит, правильно.

Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 01:58
Сообщение #491

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




Цитата(AlexSpl @ 31 Dec 2016, 00:56) *
Ага. Лучше на два if разбить. Я запарился со скобками )

*(int*)(c->ecx + 0x105) & 0x40000, похоже возвращает, живой ли стек. Но это не важно. Если работает, значит, правильно.

не, не работает))
Не работает не на ком. Т.е. андеды не получают блага. Живые тоже)
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 02:01 (Сообщение отредактировал AlexSpl - 31 Dec 2016, 02:01)
Сообщение #492

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




А так?
Код
{
    if (  ( *(int*)(c->ecx + 0x258) != 0 ) &&  !( *(int*)(c->ecx + 0x105) & 0x40000 )  ) c->eax = 1; // проверяем Prayer и андедов

    return EXEC_DEFAULT;
}
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 02:09 (Сообщение отредактировал DedMorozzz - 31 Dec 2016, 02:14)
Сообщение #493

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




Цитата(AlexSpl @ 31 Dec 2016, 01:01) *
А так?
Код
{
    if (  ( *(int*)(c->ecx + 0x258) != 0 ) &&  !( *(int*)(c->ecx + 0x105) & 0x40000 )  ) c->eax = 1; // проверяем Prayer и андедов

    return EXEC_DEFAULT;
}

так на всех работает. И на андедов тоже

PS: ладно, завтра уже поковыряю ещё smile.gif Жена ругается smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 02:16 (Сообщение отредактировал AlexSpl - 31 Dec 2016, 02:20)
Сообщение #494

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




Реально ничего нет в структуре стека по смещению 0x105 = 261? Наверное, не тот оффсет. Или не та маска.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 04:15
Сообщение #495

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




Короче, перехватил наведение курсора на отряд при касте Bless. Маска правильная - 40000h, смещение - нет.

Правильный код (ввёл дополнительные переменные, чтобы было понятнее):

Код
{
    // Работает независимо от Bless
    int spellDuration = *(int*)(c->ecx + 0x258); // Prayer
    bool isUndead = *(int*)(c->ecx + 0x84) & 0x40000;
    if ( ( spellDuration != 0 ) &&  !isUndead ) c->eax = 1; // проверяем Prayer и бит Undead

    return EXEC_DEFAULT;
}




Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 04:48
Сообщение #496

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




Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 14:04 (Сообщение отредактировал DedMorozzz - 31 Dec 2016, 14:30)
Сообщение #497

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




Спасибо, работает
Что такое 0x40000 я понял, это проверка на андеда
Код
.text:0044A333                     test    edx, 40000h        ; Undead ?

А что такое 0x258 и 0x84 нет. По логике это смещение для каста молитвы и благо, но открыв код молитвы там таких значений нету
Более того в файлах *.h таких смещений тоже не нашел

Вот кстати и +1 урона для благо:
_int32_ bless_value; // +1112 0x458 Bless добавка к Max. Damage

PS: а вот это походу нужно для правильного предварительного расчёта урона, но не уверен:
Код
.text:00443C60; int __thiscall combatMonster_CalculateDamageToMonster

PPS: да, эта функа отвечает за возвращаемые цифры урона при наведении. Проверил дебагом
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 14:47
Сообщение #498

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




Цитата
Вот кстати и +1 урона для благо:
_int32_ bless_value; // +1112 0x458 Bless добавка к Max. Damage

Не только для Bless. Это универсальный бонус для заклинаний.

Цитата
А что такое 0x258 и 0x84 нет. По логике это смещение для каста молитвы и благо, но открыв код молитвы там таких значений нету
Более того в файлах *.h таких смещений тоже не нашел

258h - смещение поля (int), где хранится длительность заклинания (оставшаяся). 84h - это флаги существа в структуре отряда на поле боя (стека).


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 14:51
Сообщение #499

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




Цитата(AlexSpl @ 31 Dec 2016, 13:47) *
84h - это флаги существа в структуре отряда на поле боя (стека).

Т.е. грубо говоря эта запись:
Код
bool isUndead = *(int*)(c->ecx + 0x84) & 0x40000;

эквивалентна этой:
Код
bool isUndead = if(*(int*)(c->ecx + 0x84) == 0x40000);

?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 15:06 (Сообщение отредактировал AlexSpl - 31 Dec 2016, 15:23)
Сообщение #500

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




Нет, не эквивалентна. У существа есть свойства: летает, двухгексовый, undead и т.п. Флаги - это битовое поле int (32 бита) по смещению 0x84, где каждое свойство отряда хранится в одном бите: 0 - отсутствие свойства, 1 - присутствие свойства (обычно).

*(int*)(c->ecx + 0x84) = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxxb (32 бита)
40000h (маска) = 1000000000000000000b = 00000000 00000100 00000000 00000000 (1 в этой позиции - свойство undead).

Для проверки используется битовое И (&):

Код
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx // флаги
&&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&&
00000000 00000100 00000000 00000000 // маска
======== ======== ======== ========
00000000 00000y00 00000000 00000000

Где y = x & 1 = 1 в том и только в том случае, если x = 1.

Вот пример флагов для чёрного рыцаря:
00000000 00000110 00000100 00000001

Код
00000000 00000110 00000100 00000001 // флаги *(int*)(c->ecx + 0x84)
&&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&&
00000000 00000100 00000000 00000000 // маска 40000h
======== ======== ======== ========
00000000 00000100 00000000 00000000 // результат: *(int*)(c->ecx + 0x84) & 0x40000


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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