Пример native-расширения FOnline
Этот принадлежащий движку проект показывает полный путь проектного C++-расширения без игровых сервисов и сторонних SDK. Он отделён от минимального starter-проекта, чтобы границы владения native-кодом и совместимости оставались явными.
Пример доказывает следующее:
SourceExt/ServerExtension.cppзарегистрирован в узкой ролиSERVER;ServerInitHookсоздаёт состояние одного экземпляраServerEngineи освобождает его через аллокатор движка;Server_Game_NativeExtensionValueстановится методомGame.NativeExtensionValue()в серверном AngelScript;NativeExtensionCoreподключается через текущий привязанный к ревизии списокFO_SERVER_LIBS, а compile-time проверка подтверждает передачу usage requirement;FONATIVE_NativeExtensionCoreTestпроверяет независимую от движка границу значений фиксированной ширины;run_native_extension_smoke.pyпроверяет lifecycle hook, сгенерированный script binding, чтение состояния и чистое завершение сервера.
Запуск проверок
Инициализируйте Engine/ на точной ревизии из метаданных репозитория и выполните:
python validate.py
Эквивалентные команды:
# Windows
cmake --preset windows
cmake --build --preset windows-check
# Linux
cmake --preset linux
cmake --build --preset linux-check
На Linux сначала установите зависимости, определённые закреплённой ревизией Engine:
Engine/BuildTools/prepare-workspace.sh linux-packages linux
Успех подтверждают native- и runtime-маркеры:
native_extension_core_test_passed
native_extension_hook_initialized
native_extension_value=42
native_extension_smoke_passed
Владение и граница ABI
Проект собирает расширение и Engine из исходников в одной сборке. Стабильный бинарный ABI между ревизиями Engine не обещается. При обновлении gitlink необходимо заново сконфигурировать, собрать и запечь проект, затем повторить pinned/current проверки совместимости в одной ревизии.
NativeExtensionCore передаёт focused-тесту только значения фиксированной ширины. Engine handles остаются в зарегистрированной единице трансляции и используют заимствования ptr<T>. Состояние отдельного сервера хранится в ServerEngine.UserData; изменяемых file-scope переменных нет. Реальный проект с несколькими native-подсистемами должен хранить в этом слоте один проектный агрегат, а не позволять независимым расширениям конкурировать за него.
FO_SERVER_LIBS является текущим привязанным к ревизии integration state, а не
helper-командой, объявленной в BuildTools/cmake/ProjectInterface.json;
проверяйте его заново при каждом изменении pin Engine.
В примере нет распространяемых материалов, runtime-библиотек, credentials и интеграций с сервисами. Добавляйте их только вместе с явным происхождением, платформенным контрактом, приёмкой пакета и владельцем безопасности.