22.04.2020, 17:29
XEPOMAHT, таблицы нельзя переносить сами в себя, ты это знаешь. Иначе никакой код работать нормально не будет. Всегда в отдельную, непересекающуюся память.
RedirectMemoryBlock запоминает конкретную физическую область памяти с абсолютным начальным адресом и абсолютной длиной.
Пример: с адреса 6000 длиной 550 байт. Запомнили диапазон [6000..6549]. Это реальные старые адреса.
А новые, например, [100000..100549]. Их преобразование — элементарная задача двоичного поиска и замены.
Херомант, тут смешались в кучу кони, люди.
1) Код игры ты патчишь так, как нужно, чтобы он работал с новыми адресами структур.
2) Ты всегда можешь определить старый абсолютный адрес [под]структуры и новый. С ними и вызывай RedirectMemoryBlock.
2) Код lua/erm скриптов будет использовать UN:C и GetRealAddr. Если есть опасение, что подструктуры перенесены в разные области памяти, то GetRealAddr вызывается для каждой подструктуры. Сперва определяем новый адрес подструктуры, потом к нему прибавляем уже смещение. То, что в коде игры нас не интересует.
RedirectMemoryBlock запоминает конкретную физическую область памяти с абсолютным начальным адресом и абсолютной длиной.
Пример: с адреса 6000 длиной 550 байт. Запомнили диапазон [6000..6549]. Это реальные старые адреса.
А новые, например, [100000..100549]. Их преобразование — элементарная задача двоичного поиска и замены.
Херомант, тут смешались в кучу кони, люди.
1) Код игры ты патчишь так, как нужно, чтобы он работал с новыми адресами структур.
2) Ты всегда можешь определить старый абсолютный адрес [под]структуры и новый. С ними и вызывай RedirectMemoryBlock.
2) Код lua/erm скриптов будет использовать UN:C и GetRealAddr. Если есть опасение, что подструктуры перенесены в разные области памяти, то GetRealAddr вызывается для каждой подструктуры. Сперва определяем новый адрес подструктуры, потом к нему прибавляем уже смещение. То, что в коде игры нас не интересует.
(базовый адрес может передаваться от функции к функции через сотни, если не тысячи, функций, он постоянно где-нибудь да хранится (в стеке, переменных, до которых простым бинарным патчем не доберёшься), данные, зависящие от базового адреса, используются повсеместно, поэтому потребуется изменить ВЕСЬ КОД ИГРЫ только ради одной таблицы).
. Мучает лишь незнание того, какой текстовик править: crtraits, crtrait0 или zcrtrait?