#include "script_macros.hpp" /* File: init.sqf Author: Bryan "Tonic" Boardwine Edit: Nanou for HeadlessClient optimization. Please read support for more informations. Description: Initialize the server and required systems. */ private ["_dome","_rsb","_timeStamp","_extDBNotLoaded"]; DB_Async_Active = false; DB_Async_ExtraLock = false; life_server_isReady = false; _extDBNotLoaded = ""; serv_sv_use = []; publicVariable "life_server_isReady"; life_save_civilian_position = if (LIFE_SETTINGS(getNumber,"save_civilian_position") isEqualTo 0) then {false} else {true}; fn_whoDoneIt = compile preprocessFileLineNumbers "\life_server\Functions\Systems\fn_whoDoneIt.sqf"; /* Prepare the headless client. */ life_HC_isActive = false; publicVariable "life_HC_isActive"; HC_Life = false; publicVariable "HC_Life"; if (EXTDB_SETTING(getNumber,"HeadlessSupport") isEqualTo 1) then { [] execVM "\life_server\initHC.sqf"; }; /* Prepare extDB before starting the initialization process for the server. */ if (isNil {uiNamespace getVariable "life_sql_id"}) then { life_sql_id = round(random(9999)); CONSTVAR(life_sql_id); uiNamespace setVariable ["life_sql_id",life_sql_id]; try { _result = EXTDB format ["9:ADD_DATABASE:%1",EXTDB_SETTING(getText,"DatabaseName")]; if (!(_result isEqualTo "[1]")) then {throw "extDB3: Error with Database Connection"}; _result = EXTDB format ["9:ADD_DATABASE_PROTOCOL:%2:SQL:%1:TEXT2",FETCH_CONST(life_sql_id),EXTDB_SETTING(getText,"DatabaseName")]; if (!(_result isEqualTo "[1]")) then {throw "extDB3: Error with Database Connection"}; } catch { diag_log _exception; _extDBNotLoaded = [true, _exception]; }; if (_extDBNotLoaded isEqualType []) exitWith {}; EXTDB "9:LOCK"; diag_log "extDB3: Connected to Database"; } else { life_sql_id = uiNamespace getVariable "life_sql_id"; CONSTVAR(life_sql_id); diag_log "extDB3: Still Connected to Database"; }; if (_extDBNotLoaded isEqualType []) exitWith { life_server_extDB_notLoaded = true; publicVariable "life_server_extDB_notLoaded"; }; life_server_extDB_notLoaded = false; publicVariable "life_server_extDB_notLoaded"; /* Run stored procedures for SQL side cleanup */ ["CALL resetLifeVehicles",1] call DB_fnc_asyncCall; ["CALL deleteDeadVehicles",1] call DB_fnc_asyncCall; ["CALL deleteOldHouses",1] call DB_fnc_asyncCall; ["CALL deleteOldGangs",1] call DB_fnc_asyncCall; _timeStamp = diag_tickTime; diag_log "----------------------------------------------------------------------------------------------------"; diag_log "---------------------------------- Starting Altis Life Server Init ---------------------------------"; diag_log "------------------------------------------ Version 5.0.0 -------------------------------------------"; diag_log "----------------------------------------------------------------------------------------------------"; if (LIFE_SETTINGS(getNumber,"save_civilian_position_restart") isEqualTo 1) then { [] spawn { _query = "UPDATE players SET civ_alive = '0' WHERE civ_alive = '1'"; [_query,1] call DB_fnc_asyncCall; }; }; /* Map-based server side initialization. */ master_group attachTo[bank_obj,[0,0,0]]; { _hs = createVehicle ["Land_Hospital_main_F", [0,0,0], [], 0, "NONE"]; _hs setDir (markerDir _x); _hs setPosATL (getMarkerPos _x); _var = createVehicle ["Land_Hospital_side1_F", [0,0,0], [], 0, "NONE"]; _var attachTo [_hs, [4.69775,32.6045,-0.1125]]; detach _var; _var = createVehicle ["Land_Hospital_side2_F", [0,0,0], [], 0, "NONE"]; _var attachTo [_hs, [-28.0336,-10.0317,0.0889387]]; detach _var; if (worldName isEqualTo "Tanoa") then { if (_forEachIndex isEqualTo 0) then { atm_hospital_2 setPos (_var modelToWorld [4.48633,0.438477,-8.25683]); vendor_hospital_2 setPos (_var modelToWorld [4.48633,0.438477,-8.25683]); "medic_spawn_3" setMarkerPos (_var modelToWorld [8.01172,-5.47852,-8.20022]); "med_car_2" setMarkerPos (_var modelToWorld [8.01172,-5.47852,-8.20022]); hospital_assis_2 setPos (_hs modelToWorld [0.0175781,0.0234375,-0.231956]); } else { atm_hospital_3 setPos (_var modelToWorld [4.48633,0.438477,-8.25683]); vendor_hospital_3 setPos (_var modelToWorld [4.48633,0.438477,-8.25683]); "medic_spawn_1" setMarkerPos (_var modelToWorld [-1.85181,-6.07715,-8.24944]); "med_car_1" setMarkerPos (_var modelToWorld [5.9624,11.8799,-8.28493]); hospital_assis_2 setPos (_hs modelToWorld [0.0175781,0.0234375,-0.231956]); }; }; } forEach ["hospital_2","hospital_3"]; { if (!isPlayer _x) then { _npc = _x; { if (_x != "") then { _npc removeWeapon _x; }; } forEach [primaryWeapon _npc,secondaryWeapon _npc,handgunWeapon _npc]; }; } forEach allUnits; [8,true,12] execFSM "\life_server\FSM\timeModule.fsm"; life_adminLevel = 0; life_medicLevel = 0; life_copLevel = 0; CONST(JxMxE_PublishVehicle,"false"); /* Setup radio channels for west/independent/civilian */ life_radio_west = radioChannelCreate [[0, 0.95, 1, 0.8], "Side Channel", "%UNIT_NAME", []]; life_radio_civ = radioChannelCreate [[0, 0.95, 1, 0.8], "Side Channel", "%UNIT_NAME", []]; life_radio_indep = radioChannelCreate [[0, 0.95, 1, 0.8], "Side Channel", "%UNIT_NAME", []]; /* Set the amount of gold in the federal reserve at mission start */ fed_bank setVariable ["safe",count playableUnits,true]; [] spawn TON_fnc_federalUpdate; /* Event handler for disconnecting players */ addMissionEventHandler ["HandleDisconnect",{_this call TON_fnc_clientDisconnect; false;}]; [] call compile preprocessFileLineNumbers "\life_server\functions.sqf"; /* Set OwnerID players for Headless Client */ TON_fnc_requestClientID = { (_this select 1) setVariable ["life_clientID", owner (_this select 1), true]; }; "life_fnc_RequestClientId" addPublicVariableEventHandler TON_fnc_requestClientID; /* Event handler for logs */ "money_log" addPublicVariableEventHandler {diag_log (_this select 1)}; "advanced_log" addPublicVariableEventHandler {diag_log (_this select 1)}; /* Miscellaneous mission-required stuff */ life_wanted_list = []; cleanupFSM = [] execFSM "\life_server\FSM\cleanup.fsm"; [] spawn { for "_i" from 0 to 1 step 0 do { uiSleep (30 * 60); { _x setVariable ["sellers",[],true]; } forEach [Dealer_1,Dealer_2,Dealer_3]; }; }; [] spawn TON_fnc_initHouses; cleanup = [] spawn TON_fnc_cleanup; TON_fnc_playtime_values = []; TON_fnc_playtime_values_request = []; //Just incase the Headless Client connects before anyone else publicVariable "TON_fnc_playtime_values"; publicVariable "TON_fnc_playtime_values_request"; /* Setup the federal reserve building(s) */ private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call TON_fnc_terrainSort; private _altisArray = [16019.5,16952.9,0]; private _tanoaArray = [11074.2,11501.5,0.00137329]; private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; _dome = nearestObject [_pos,"Land_Dome_Big_F"]; _rsb = nearestObject [_pos,_vaultHouse]; for "_i" from 1 to 3 do {_dome setVariable [format ["bis_disabled_Door_%1",_i],1,true]; _dome animateSource [format ["Door_%1_source", _i], 0];}; _dome setVariable ["locked",true,true]; _rsb setVariable ["locked",true,true]; _rsb setVariable ["bis_disabled_Door_1",1,true]; _dome allowDamage false; _rsb allowDamage false; /* Tell clients that the server is ready and is accepting queries */ life_server_isReady = true; publicVariable "life_server_isReady"; /* Initialize hunting zone(s) */ aiSpawn = ["hunting_zone",30] spawn TON_fnc_huntingZone; // We create the attachment point to be used for objects to attachTo load virtually in vehicles. life_attachment_point = "Land_HelipadEmpty_F" createVehicle [0,0,0]; life_attachment_point setPosASL [0,0,0]; life_attachment_point setVectorDirAndUp [[0,1,0], [0,0,1]]; // Sharing the point of attachment with all players. publicVariable "life_attachment_point"; diag_log "----------------------------------------------------------------------------------------------------"; diag_log format [" End of Altis Life Server Init :: Total Execution Time %1 seconds ",(diag_tickTime) - _timeStamp]; diag_log "----------------------------------------------------------------------------------------------------";