Wake of Gods Forum | Форум Во Имя Богов

Full Version: ERA II
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
А ещё выше вызывает HD. Полагаю, возможную ошибку стоит искать там. Понятия не имею, почему с другой Эрой по-другому. Хак?
Событие !?OB54/-1 срабатывает дважды, если атаковать с места! Именно второй раз криво.
Если атаковать с клавиатуры, то вызывается другая функция с верными координатами. Только если мышкой и сблизи, то 408049 (здесь) уже неверные координаты.

Но то, что триггер !?BA54/-1 срабатывает дважды при атаке сблизи, это явно большая проблема. Может быть кто проверит на 2.46? Поставьте монстров в столбец. Нападение на первого — одно сообщение. С места на второго — два.

!?OB54/-1;
!!IF:M^^;
(08.09.2018 22:56)Berserker Wrote: [ -> ]Если атаковать с клавиатуры, то вызывается другая функция с верными координатами. Только если мышкой и сблизи, то 408049 (здесь) уже неверные координаты.

Но то, что триггер !?BA54/-1 срабатывает дважды при атаке сблизи, это явно большая проблема. Может быть кто проверит на 2.46? Поставьте монстров в столбец. Нападение на первого — одно сообщение. С места на второго — два.

!?OB54/-1;
!!IF:M^^;
Я только что проверил. На 2.46 событие !?OB54/-1; вызывается дважды (при клике вплотную). Но Z координата в норме и равна нулю на поверхности.

Обе версии у меня настроены идентично, но поведение z координаты разное. Хотя одинаковые настройки HD (4.208) на обеих версиях эры (2.46 и 2.75). На обоих полностью удалены все скрипты и отключены почти все плагины. Из модов только WoG. Русификация и все остальные моды отключены

Я пытаюсь объяснить, что версии Эры тупо идентичные, но поведение - разное.
igrik, это-то понятно. Но если код HD хоть сколько-нибудь завязан на версию Эры или наличие/отсутствие каких-то байтов по какому-либо адресу, то уже появляются нюансы. Ведь без него обе версии ТОЖЕ работают корректно. Отлаживать HD, когда прыжок из создаваемого в памяти запутанного кода с вложенной неясной логикой — то ещё занятие. Что ещё поменялось? Версия патчера со многими исправлениями. Проверял на новой?
Живые свитки ( опция 33) - если заклинание массового поражения( Метеор, инферно, цепная молния-- тестил конкретно с этим заклом -- и тп), вызванное свитком, убивает всех, то игра зависает. Краша нет, просто курсор вращается, а картинка с исходом боя не появляется . Без hd мода комп начинает тормозить )). прикладываю сейвы -- мало ли. И картинку Image: 1qBuqEDQ2JzuQNKVMPusXlwYxeIRsvqTFAiWcspo...=2048x2048
Насчет Ящиков Пандоры. Если отказаться от их взятия, то они пропадают. Также, по моим предположениям, если стоит запрет на магию, которая должна быть в коробке, то вся коробка будет пустой. Прикладываю Сейв(ЯД)
В игре не отображается таймер, если поставить ограничение по времени на ход. Сам таймер тикает)
Сложные битвы ( опция 041) не изменяет параметров оборотней. Играю с "принадлежностью нейтралов"
Игрик, вопрос разобрал, над исправлением работаю. Вог полагается на параметр MixedPos, который по факту берётся из координат героя, упакованных так, что зачастую уровень всегда подземелье (видимо, для героя не существенно). В другом месте Вог делает верно, получая координаты вручную из посещаемого объекта. Я сделаю так, чтобы они всегда брались из посещаемого объекта. Уже проверил быстрое исправление.
Удалось исправить баг с двойной генерацией триггера !?OB54. Теперь всегда одинарная.
Тестируем
Шикарно. А я вот только тестировал, найдя 3 функции в HD, которые как я думаю способствуют геренации бага.
Но твоё решение куда лучше!

UPD: да работает! Я еще погоняю сегодня на работоспособность. Но работает же))
Обновил
Исключаем баги теперь и при атаке с ходу.

igrik, спасибо Ab HD тоже не безгрешен, а потому да, безопаснее просто не использовать «грязное» значение )

Code:
function Hook_ZvsEnter2Monster (Context: Core.PHookContext): LONGBOOL; stdcall;
const
  ARG_MAP_ITEM  = 8;
  ARG_MIXED_POS = 16;

var
  x, y, z:  integer;
  MixedPos: integer;
  MapItem:  pointer;

begin
  MapItem  := ppointer(Context.EBP + ARG_MAP_ITEM)^;
  MapItemToCoords(MapItem, x, y, z);
  MixedPos := CoordsToMixedPos(x, y, z);
  pinteger(Context.EBP + ARG_MIXED_POS)^ := MixedPos;

  Context.RetAddr := Ptr($7577B2);
  result          := not Core.EXEC_DEF_CODE;
end; // .function Hook_ZvsEnter2Monster

function Hook_ZvsEnter2Monster2 (Context: Core.PHookContext): LONGBOOL; stdcall;
const
  ARG_MAP_ITEM  = 8;
  ARG_MIXED_POS = 16;

var
  x, y, z:  integer;
  MixedPos: integer;
  MapItem:  pointer;

begin
  MapItem  := ppointer(Context.EBP + ARG_MAP_ITEM)^;
  MapItemToCoords(MapItem, x, y, z);
  MixedPos := CoordsToMixedPos(x, y, z);
  pinteger(Context.EBP + ARG_MIXED_POS)^ := MixedPos;

  Context.RetAddr := Ptr($757A87);
  result          := not Core.EXEC_DEF_CODE;
end; // .function Hook_ZvsEnter2Monster2

function Hook_ZvsEnter2Object (Hook: PatchApi.THiHook; Ecx, Edx, Hero: pointer; MapItem: pointer; MixedPos: integer; IsAI: integer): integer; stdcall;
const
  MAP_ITEM_TYPE_OFFSET = $1E;
  OBJ_MON              = 54;

begin
  if pword(Utils.PtrOfs(MapItem, MAP_ITEM_TYPE_OFFSET))^ <> OBJ_MON then begin
    result := PatchApi.Call(PatchApi.FASTCALL_, Hook.GetOriginalFunc(), [Ecx, Edx, Hero, MapItem, MixedPos, IsAi]);
  end else begin
    result := PatchApi.Call(PatchApi.FASTCALL_, Ptr($4A8160), [Ecx, Edx, Hero, MapItem, MixedPos, IsAi]);
  end;
end; // .function Hook_ZvsEnter2Object

(* Fix WoG bug: do not rely on MixedPos argument for Enter2Monster(2), get coords from map object instead *)
Core.Hook(@Hook_ZvsEnter2Monster,  Core.HOOKTYPE_BRIDGE, 19, Ptr($75779F));
Core.Hook(@Hook_ZvsEnter2Monster2, Core.HOOKTYPE_BRIDGE, 19, Ptr($757A74));

(* Fix WoG bug: double !?OB54 event generation when attacking without moving due to Enter2Object + Enter2Monster2 calling *)
Core.p.WriteHiHook(Ptr($705979), PatchApi.SPLICE_, PatchApi.EXTENDED_, PatchApi.FASTCALL_, @Hook_ZvsEnter2Object);
Ещё раз спасибо Вам всем, парни! 177
И тебе спасибо большое!
Reference URL's