![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#481
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
А смысл пытаться сделать так же, как и при касте блесса, когда можно просто в проверку активации блага (наличие молитвы) добавить и проверку на тип существа
|
|
|
![]()
Сообщение
#482
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
А проще посмотреть в хедерах: должно быть поле, по которому сразу можно определить: undead или нет.
|
|
|
![]()
Сообщение
#483
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
в смысле есть отдельное поле "isUndead"? И где эти хедеры смотреть?
|
|
|
![]()
Сообщение
#484
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
homm3.h. Там, по идее, должна быть описана структура стека.
|
|
|
![]()
Сообщение
#485
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
такое есть:
NOALIGN struct _BattleStack_ : _Struct_ // размер 0x548 { .... _int32_ creature_id; // +52 0x34 // тип монстра |
|
|
![]()
Сообщение
#486
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Попробуйте так проверять:
Код if ( *(int*)(c->reg + 0x105) & 0x40000 ) c->reg - указатель на стек. Цитата такое есть: NOALIGN struct _BattleStack_ : _Struct_ // размер 0x548 { .... _int32_ creature_id; // +52 0x34 // тип монстра Вот. А что там по смещению 0x105? Поправил. Это ж битовое поле. |
|
|
![]()
Сообщение
#487
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#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; } |
|
|
![]()
Сообщение
#489
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Странно. В 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 Нежить (все существа Некрополиса, существо с этим флагом не имеет морали, получает урон от заклинания Уничтожить нежить и не несет урона от Волны смерти)
|
|
|
![]()
Сообщение
#490
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Ага. Лучше на два if разбить. Я запарился со скобками )
*(int*)(c->ecx + 0x105) & 0x40000, похоже возвращает, живой ли стек. Но это не важно. Если работает, значит, правильно. |
|
|
![]()
Сообщение
#491
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#492
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
А так?
Код {
if ( ( *(int*)(c->ecx + 0x258) != 0 ) && !( *(int*)(c->ecx + 0x105) & 0x40000 ) ) c->eax = 1; // проверяем Prayer и андедов return EXEC_DEFAULT; } |
|
|
![]()
Сообщение
#493
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#494
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Реально ничего нет в структуре стека по смещению 0x105 = 261? Наверное, не тот оффсет. Или не та маска.
|
|
|
![]()
Сообщение
#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; } |
|
|
![]()
Сообщение
#496
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
|
|
|
![]()
Сообщение
#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: да, эта функа отвечает за возвращаемые цифры урона при наведении. Проверил дебагом |
|
|
![]()
Сообщение
#498
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Вот кстати и +1 урона для благо: _int32_ bless_value; // +1112 0x458 Bless добавка к Max. Damage Не только для Bless. Это универсальный бонус для заклинаний. Цитата А что такое 0x258 и 0x84 нет. По логике это смещение для каста молитвы и благо, но открыв код молитвы там таких значений нету Более того в файлах *.h таких смещений тоже не нашел 258h - смещение поля (int), где хранится длительность заклинания (оставшаяся). 84h - это флаги существа в структуре отряда на поле боя (стека). |
|
|
![]()
Сообщение
#499
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#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 |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 5 October 2025 - 06:12 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|