Union-free-aim падает вместе с моими плагинами. Симптом: игра без ошибки вылетает в конце загрузки сейва или мира. По отдельности каждый плагин работает, вместе — краш.
Причина. union-free-aim собран из шаблона, сделанного до февраля 2026: union-api линкуется статически (
union_api_lib), версия
167debe, конец 2025 года. При запуске любая копия union-api, даже вшитая в плагин, подключается к общему реестру хуков процесса. Реестр у всех плагинов общий, а код, который его правит, у вашего плагина свой и более старый. С января в union-api поменялась раскладка трамплинов partial-хуков. Ваш partial-хук на рендер (
0x006C87EB) стоит на том же адресе, что и у большинства плагинов, и в общий трамплин встраиваются узлы от разных версий кода. Первый рендер мира идёт в конце загрузки — тогда игра и падает.
Мы проверили это на своей сборке free-aim. Всё вместе — краш. После перехода плагина на общий
UnionAPI.dll краш пропал.
Как исправить:
Обновить оба сабмодуля до
main: запустить dependencies/union/update.bat. Одной смены линковки мало — нужна та же версия union-api, что у остальных плагинов.
Перейти на общий
UnionAPI.dll:
Код:
# CMakeLists.txt
option(GENERATE_UNION_API_DLL "Generate UnionAPI.dll" ON)
# dependencies/union/CMakeLists.txt
if(GENERATE_UNION_API_DLL)
set(UNION_API union_api_dll)
else()
set(UNION_API union_api_lib)
endif()
target_link_libraries(union INTERFACE gothic_api ${UNION_API})
UnionAPI.dll положить в
System/Autorun вашего VDF. В актуальном
union-plugin-template это уже сделано, можно взять оттуда.
В
src/Plugin.cpp в каждой из четырёх строк
HOOKSPACE_WITH_SG_RC(<namespace>, GetGameVersion() == ENGINE, IDR_..., RT_RCDATA) убрать два последних аргумента и сменить макрос на
HOOKSPACE — например,
HOOKSPACE(Gothic_II_Addon, GetGameVersion() == ENGINE);, и так же для остальных трёх. Из
resource.rc убрать
g1/g1a/g2/g2a.txt. В свежем union-api этого макроса больше нет. Таблицы сигнатур плагину не нужны — все хуки ставятся по адресам через
zSwitch.
Если сборка будет ругаться на
<bit> /
std::bit_cast, поднять
CMAKE_CXX_STANDARD до 20.
Желательно, для модов вроде «Архолоса»: хуки на общие адреса —
ApplySomeSettings,
TriggerChangeLevel и прочие — сейчас ставятся статически, при загрузке DLL. Мод (
KmLib.dll) грузится позже и патчит тот же пролог поверх, и игра падает со «случайным» EIP. Такие хуки лучше регистрировать из
Game_Init(). Статическими можно оставить
oCGame::Init, рендер-хук и
LoadGame/
LoadSavegame.
Что это даст:
union-free-aim будет работать вместе с плагинами на актуальном union-api, и с нашими тоже;
DLL уменьшится примерно с 4 МБ до десятков КБ;
при запуске не будет разбора ~56 тыс. сигнатур в куче.
Если нужно, пришлю diff.