(19.11.2020 23:20)Berserker Wrote: То, как работает HD (через двойной указатель) — гораздо безопаснее. И HD-мод не расширяет структуру. Ему не нужен RedirectMemoryBlock.
Ну HD-мод видит перемещённые структуры от hota.dll, где много чего наменяли, и перемещённые данные воговского кода независимо от версии вога, в общем это вполне универсальное решение. Ну а мне откуда знать, что автор плагина сделал RedirectMemoryBlock? Авторов ведь палкой не заставишь делать в коде RedirectMemoryBlock (программисты в основном одни лентяи).
(19.11.2020 23:20)Berserker Wrote: Если я берусь использовать в коде таблицу, то считаю, что навыки/монстров/тексты/героев кто-то наверняка можешь расширить. Или правильнее было бы использовать фиксированные адреса и писать, что у людей просто нерабочие плагины?
Вот работало бы без перекомпиляции плагинов - другое дело. Вот если например завтра появится плагин на новые типы местности с RedirectMemoryBlock, что ж делать с плагинами, авторы которых и в самых страшных снах не могли представить, что кто-то увеличит в игре количество почв и что там надо было ставить GetAddress, когда ещё никто об этом не знал? Исходники давно утеряны или автору давно пофигу на моддинг. Устаревший плагин так и останется устаревшим и не будет работать.
(19.11.2020 23:29)Berserker Wrote: А теперь представьте, что вы написали 10 плагинов и ушли на пенсию. Чтобы сделать с ними совместимость, мне достаточно в пару мест добавить GetRealAddr в ранее неучтённых указателях. Как и в любом актуальном коде. Но если ваши плагины сами никогда не уведомляют о расширенных структурах и не пользуются GetRealAddr, то беда.
Если так сильно нужен GetRealAddr в UN:C например, то определение адресов структур можно добавить в саму ЭРУ, не перекладывая это на плечи плагинописцев. Можно даже сделать отдельным плагином, который укажет ЭРЕ о всех перемещённых структурах.
(19.11.2020 23:29)Berserker Wrote: Такой подход я применяю пока для определения лимита существ, но стоит какому-нибудь majaczek пропатчить код по данному адресу…Вы поняли. То, о чём извещено явно, можно явно же и узнать.
Бинарные патчи хороши для одного глобального мода типа MoP и являются абсолютным злом на платформе ERA (Тифон 3.хх тоже грешен небольшим количеством бинарных патчей, скопированных с MoP, которые было просто лень преобразовывать в отдельные функции). Никто не застрахован и от перекрывающих друг друга хуков, а если их накапливается 100500 штук на era.exe, то любой программист в них утонет и никакая база уже не поможет.
(19.11.2020 23:29)Berserker Wrote: Вариант HD-мода тоже неплох, но требует искать всегда такие неизменные участки кода (которые часто не выравнены) и надеяться, что там никто команду не пропатчил с полной заменой логики. У каждого разработчика будет свой участок кода, из которого он будет считывать указатель, что повышает хрупкость всей системы.
Да, только так. Это в MoP сильно изменён код игры, что ни HD-мод, ни ERA никогда там не смогут запуститься (и с каждой новой версией MoP тамошний код мутирует ещё сильнее). В ERA ж - только отслеживать чужой код и делать соответствующие правки у себя в плагине. И больше использовать события эры, где это возможно.
Да и самих плагинов, расширяющих структуры, очень мало. У меня специально скомпилировано всё в одной dll, чтобы не мучится с адресацией перенесённых структур на разных dll. Для поддержки новых героев, например, придётся поглотить плагин Dwellings.dll, как раз из-за проблемы с адресацией. И т.д.