Первые результаты самостоятельных исследований 0.62 методом осмотра/досмотра (с понятыми в виде notepad++ и Beyond Compare 4). Возможно я где-то в чем-то не прав, ошибся и тп, но не поделиться инфой не могу.
Небольшое отступление
Процесс загрузки клиента/сервера 0.62
1 Сначала загружаются все конфиги из всех *.pbo в папке Addons в корне игры (в последствии при необходимости оттуда же подгружается все необходимое). Если в файле есть init.sqf он будет выполнен, это если я все верно понял.
Можно создать свой .pbo, содать в нем обьекты и конфиг и описанием, положить в Addons и при обращении к обьектам из этой pbo в скриптах они будут загружены в игру, понятно, что в случае оффлайн режима можно не париться соответствиями, тк сервер и клиент у нас по сути это одно и то же. В случае же клиент/серверного режима, pbo должы соответствовать хотя бы по структуре и названиям (более глубоко не изучал).
2 Затем загружаются все конфиги из *.pbo в папке dta в корне игры, там же расположен scripts.pbo с enscript скриптами для управления клиентом/сервером. Если вытащить содержимое scripts.pbo в папку scripts в корне клиента/сервера, файл scripts.pbo будет проигнорирован и игра будет использовать содержимое папки scripts (опять же по первым наблюдениям)
1. Сначала читается и обрабатывается (возможно что-то еще, но я пока не понял что именно)
scripts\5_Mission\someMission.c
Отсюда выбираются режимы работы клиента/сервера и в зависимости от выбора выполняется дальнейшая инициализация
Mission CreateMission(string path)
{
SetDispatcher(new DispatcherCaller);
g_Game.SetMissionPath(path);
if (g_Game.IsMultiplayer() && g_Game.IsServer())
{
return new MissionServer;
}
#ifdef NO_GUI
return new MissionDummy;
#endif
MissionMainMenu m;
if (path.Contains("NoCutscene"))
{
m = new MissionMainMenu();
m.m_NoCutscene = true;
return m;
}
if (path.Contains("intro"))
{
m = new MissionMainMenu();
m.m_NoCutscene = false;
return m;
}
else
{
#ifndef NO_GUI_INGAME
return new MissionGameplay;
#else
return new MissionDummy;
#endif
}
}
void DestroyMission(Mission mission)
{
delete mission;
}
2. Для сервера это scripts\5_Mission\mission\missionServer.c
по сути это как init.sqf в корне миссии
в нем же включение scripts\5_Mission\mission\missionBase.c
Для оффлайн клиента (локальная эмуляция) это scripts\5_Mission\missionGameplay.c
Когда запускается стандартный клиент он обрабатывает missionGameplay.c и готовится к работе с сервером откуда в последствии и берет все необходимые параметры
Однако путем некоторых манипуляций мы создаем ему режим оффлайн и клиент работает с локальными скриптами (движок-то тот же самый, в нем нет только серверной части обрабатывающей мультиплей/внешние подключения/функционал мира и итд итп серверные вещи, впрочем зомбаков и тп можно смело наспавнить через sqf/enscript в 062 и только через enscript в 063).
убираем в someMission.c все что не касается missionGameplay.c
Mission CreateMission(string path)
{
SetDispatcher(new DispatcherCaller);
g_Game.SetMissionPath(path);
return new MissionGameplay;
}
void DestroyMission(Mission mission)
{
delete mission;
}
теперь у нас игра оффлайн (эмуляция)
Но
нам же надо создать персонажа и навесить на него лут и тп, а так же поместить его в мир, который еще надо проинициализировать - такого функционала штатно в клиенте нет
Есть 2 варианта
1 Сделать это в enscript как эт осделано в 0.63 клиенте (оффлайн), но мы пока не знаем как (пока не знаем)
2 Сделать это через SQF, но это надо создавать/править pbo как это сделано у Fidov/Kolobov
Сейчас разбираюсь как это сделано у них