(22.04.2020 17:29)Berserker Wrote: таблицы нельзя переносить сами в себя, ты это знаешь. Иначе никакой код работать нормально не будет. Всегда в отдельную, непересекающуюся память.
Вообще-то так и делаю, т.к. чтобы изменить значение базового адреса таблицы - не хватит всей жизни
(базовый адрес может передаваться от функции к функции через сотни, если не тысячи, функций, он постоянно где-нибудь да хранится (в стеке, переменных, до которых простым бинарным патчем не доберёшься), данные, зависящие от базового адреса, используются повсеместно, поэтому потребуется изменить ВЕСЬ КОД ИГРЫ только ради одной таблицы).
А вот перенесение данных внутри одной структуры в одной единой области памяти с сохранением базового адреса неизменным - то, что реально работает (и не только в MoP/ERA PLUS, но и ещё в одном очень известном глобальном моде). Быстро и эффективно, прошло проверку временем, но увы, не дружит с RedirectMemoryBlock (а может быть и дружит, только до сих пор непонятно как можно оформить вызов RedirectMemoryBlock с правильными адресами).
Скажете, что будут утечки памяти из-за использования стандартной области памяти Третьих Героев без выделения отдельной непересекающейся памяти через dll? А вот нет, утечек не происходит, герои бегают по карте и строят Причалы с Форджами
, значит, считаю, что в плане кода, добавляющего новые игровые фракции, всё сделано правильно (только противоречит нормам профессиональных программистов, но главное не нормы, а результат). Минус естественно в совместимости с большинством модов для ERA, которые с помощью GetRealAddr не смогут получить правильные адреса, тут я тоже ничего придумать не могу
В общем, то, что кажется немыслимым для одних людей, - норма для других. ERA PLUS всегда будет модом-изгоем - это плата за быстрое добавление в ERA новых игровых фракций. С MoP вот всё гораздо проще - никто не делает моды под MoP.