mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-13 19:52:38 +03:00
504 lines
15 KiB
Plaintext
504 lines
15 KiB
Plaintext
private ["_date","_year","_month","_day","_hour","_minute","_date1","_hiveResponse","_key","_objectCount","_dir","_point","_i","_action","_dam","_selection","_wantExplosiveParts","_entity","_worldspace","_damage","_booleans","_rawData","_ObjectID","_class","_CharacterID","_inventory","_hitpoints","_fuel","_id","_objectArray","_script","_result","_outcome"];
|
|
[]execVM "\z\addons\dayz_server\system\s_fps.sqf"; //server monitor FPS (writes each ~181s diag_fps+181s diag_fpsmin*)
|
|
#include "\z\addons\dayz_server\compile\server_toggle_debug.hpp"
|
|
|
|
waitUntil{!isNil "BIS_MPF_InitDone"};
|
|
waitUntil{initialized}; //means all the functions are now defined
|
|
if (!isNil "sm_done") exitWith {}; // prevent server_monitor be called twice (bug during login of the first player)
|
|
sm_done = false;
|
|
|
|
dayz_serverIDMonitor = [];
|
|
|
|
dayz_versionNo = getText(configFile >> "CfgMods" >> "DayZ" >> "version");
|
|
dayz_hiveVersionNo = getNumber(configFile >> "CfgMods" >> "DayZ" >> "hiveVersion");
|
|
|
|
_hiveLoaded = false;
|
|
|
|
diag_log "HIVE: Starting";
|
|
|
|
//Set the Time
|
|
_key = "CHILD:307:";
|
|
_result = _key call server_hiveReadWrite;
|
|
_outcome = _result select 0;
|
|
if(_outcome == "PASS") then {
|
|
_date = _result select 1;
|
|
|
|
//date setup
|
|
_year = _date select 0;
|
|
_month = _date select 1;
|
|
_day = _date select 2;
|
|
_hour = _date select 3;
|
|
_minute = _date select 4;
|
|
|
|
if(dayz_ForcefullmoonNights) then {
|
|
_date = [2012,8,2,_hour,_minute];
|
|
};
|
|
diag_log [ "TIME SYNC: Local Time set to:", _date, "Fullmoon:",dayz_ForcefullmoonNights, "Date given by HiveExt.dll:", _result select 1];
|
|
setDate _date;
|
|
dayzSetDate = _date;
|
|
publicVariable "dayzSetDate";
|
|
};
|
|
|
|
// Custom Configs
|
|
if(isnil "MaxVehicleLimit") then {
|
|
MaxVehicleLimit = 50;
|
|
};
|
|
|
|
if(isnil "MaxDynamicDebris") then {
|
|
MaxDynamicDebris = 100;
|
|
};
|
|
if(isnil "MaxAmmoBoxes") then {
|
|
MaxAmmoBoxes = 3;
|
|
};
|
|
if(isnil "MaxMineVeins") then {
|
|
MaxMineVeins = 50;
|
|
};
|
|
// Custon Configs End
|
|
|
|
if (isServer && isNil "sm_done") then {
|
|
|
|
serverVehicleCounter = [];
|
|
_hiveResponse = [];
|
|
|
|
for "_i" from 1 to 5 do {
|
|
diag_log "HIVE: trying to get objects";
|
|
_key = format["CHILD:302:%1:", dayZ_instance];
|
|
_hiveResponse = _key call server_hiveReadWrite;
|
|
if ((((isnil "_hiveResponse") || {(typeName _hiveResponse != "ARRAY")}) || {((typeName (_hiveResponse select 1)) != "SCALAR")})) then {
|
|
if ((_hiveResponse select 1) == "Instance already initialized") then {
|
|
_superkey = profileNamespace getVariable "SUPERKEY";
|
|
_shutdown = format["CHILD:400:%1:", _superkey];
|
|
_res = _shutdown call server_hiveReadWrite;
|
|
diag_log ("HIVE: attempt to kill.. HiveExt response:"+str(_res));
|
|
} else {
|
|
diag_log ("HIVE: connection problem... HiveExt response:"+str(_hiveResponse));
|
|
|
|
};
|
|
_hiveResponse = ["",0];
|
|
}
|
|
else {
|
|
diag_log ("HIVE: found "+str(_hiveResponse select 1)+" objects" );
|
|
_i = 99; // break
|
|
};
|
|
};
|
|
|
|
_BuildingQueue = [];
|
|
_objectQueue = [];
|
|
|
|
if ((_hiveResponse select 0) == "ObjectStreamStart") then {
|
|
|
|
// save superkey
|
|
profileNamespace setVariable ["SUPERKEY",(_hiveResponse select 2)];
|
|
|
|
_hiveLoaded = true;
|
|
|
|
diag_log ("HIVE: Commence Object Streaming...");
|
|
_key = format["CHILD:302:%1:", dayZ_instance];
|
|
_objectCount = _hiveResponse select 1;
|
|
_bQty = 0;
|
|
_vQty = 0;
|
|
for "_i" from 1 to _objectCount do {
|
|
_hiveResponse = _key call server_hiveReadWriteLarge;
|
|
//diag_log (format["HIVE dbg %1 %2", typeName _hiveResponse, _hiveResponse]);
|
|
if ((_hiveResponse select 2) isKindOf "ModularItems") then {
|
|
_BuildingQueue set [_bQty,_hiveResponse];
|
|
_bQty = _bQty + 1;
|
|
} else {
|
|
_objectQueue set [_vQty,_hiveResponse];
|
|
_vQty = _vQty + 1;
|
|
};
|
|
};
|
|
diag_log ("HIVE: got " + str(_bQty) + " Epoch Objects and " + str(_vQty) + " Vehicles");
|
|
};
|
|
|
|
// # NOW SPAWN OBJECTS #
|
|
_totalvehicles = 0;
|
|
{
|
|
_idKey = _x select 1;
|
|
_type = _x select 2;
|
|
_ownerID = _x select 3;
|
|
|
|
_worldspace = _x select 4;
|
|
_inventory = _x select 5;
|
|
_hitPoints = _x select 6;
|
|
_fuel = _x select 7;
|
|
_damage = _x select 8;
|
|
|
|
// Set objectUIDs in currentObjectUIDs list to prevent duplicates
|
|
if (_type in dayz_allowedObjects) then {_worldspace call dayz_objectUID2;} else {_worldspace call dayz_objectUID3;};
|
|
|
|
_dir = 0;
|
|
_pos = [0,0,0];
|
|
_wsDone = false;
|
|
if (count _worldspace >= 2) then
|
|
{
|
|
_dir = _worldspace select 0;
|
|
if (count (_worldspace select 1) == 3) then {
|
|
_pos = _worldspace select 1;
|
|
_wsDone = true;
|
|
}
|
|
};
|
|
|
|
if (!_wsDone) then {
|
|
if (count _worldspace >= 1) then { _dir = _worldspace select 0; };
|
|
_pos = [getMarkerPos "center",0,4000,10,0,2000,0] call BIS_fnc_findSafePos;
|
|
if (count _pos < 3) then { _pos = [_pos select 0,_pos select 1,0]; };
|
|
diag_log ("MOVED OBJ: " + str(_idKey) + " of class " + _type + " to pos: " + str(_pos));
|
|
};
|
|
|
|
|
|
if (_damage < 1) then {
|
|
//diag_log format["OBJ: %1 - %2", _idKey,_type];
|
|
|
|
//Create it
|
|
_object = createVehicle [_type, _pos, [], 0, "CAN_COLLIDE"];
|
|
_object setVariable ["lastUpdate",time];
|
|
_object setVariable ["ObjectID", _idKey, true];
|
|
|
|
_lockable = 0;
|
|
if(isNumber (configFile >> "CfgVehicles" >> _type >> "lockable")) then {
|
|
_lockable = getNumber(configFile >> "CfgVehicles" >> _type >> "lockable");
|
|
};
|
|
|
|
// fix for leading zero issues on safe codes after restart
|
|
if (_lockable == 4) then {
|
|
_codeCount = (count (toArray _ownerID));
|
|
if(_codeCount == 3) then {
|
|
_ownerID = format["0%1", _ownerID];
|
|
};
|
|
if(_codeCount == 2) then {
|
|
_ownerID = format["00%1", _ownerID];
|
|
};
|
|
if(_codeCount == 1) then {
|
|
_ownerID = format["000%1", _ownerID];
|
|
};
|
|
};
|
|
|
|
if (_lockable == 3) then {
|
|
_codeCount = (count (toArray _ownerID));
|
|
if(_codeCount == 2) then {
|
|
_ownerID = format["0%1", _ownerID];
|
|
};
|
|
if(_codeCount == 1) then {
|
|
_ownerID = format["00%1", _ownerID];
|
|
};
|
|
};
|
|
|
|
_object setVariable ["CharacterID", _ownerID, true];
|
|
|
|
clearWeaponCargoGlobal _object;
|
|
clearMagazineCargoGlobal _object;
|
|
// _object setVehicleAmmo DZE_vehicleAmmo;
|
|
|
|
_object setdir _dir;
|
|
_object setposATL _pos;
|
|
_object setDamage _damage;
|
|
|
|
if ((typeOf _object) in dayz_allowedObjects) then {
|
|
if (DZE_GodModeBase) then {
|
|
_object addEventHandler ["HandleDamage", {false}];
|
|
} else {
|
|
_object addMPEventHandler ["MPKilled",{_this call object_handleServerKilled;}];
|
|
};
|
|
// Test disabling simulation server side on buildables only.
|
|
_object enableSimulation false;
|
|
// used for inplace upgrades && lock/unlock of safe
|
|
_object setVariable ["OEMPos", _pos, true];
|
|
|
|
};
|
|
|
|
if (count _inventory > 0) then {
|
|
if (_type in DZE_LockedStorage) then {
|
|
// Fill variables with loot
|
|
_object setVariable ["WeaponCargo", (_inventory select 0),true];
|
|
_object setVariable ["MagazineCargo", (_inventory select 1),true];
|
|
_object setVariable ["BackpackCargo", (_inventory select 2),true];
|
|
} else {
|
|
|
|
//Add weapons
|
|
_objWpnTypes = (_inventory select 0) select 0;
|
|
_objWpnQty = (_inventory select 0) select 1;
|
|
_countr = 0;
|
|
{
|
|
if(_x in (DZE_REPLACE_WEAPONS select 0)) then {
|
|
_x = (DZE_REPLACE_WEAPONS select 1) select ((DZE_REPLACE_WEAPONS select 0) find _x);
|
|
};
|
|
_isOK = isClass(configFile >> "CfgWeapons" >> _x);
|
|
if (_isOK) then {
|
|
_object addWeaponCargoGlobal [_x,(_objWpnQty select _countr)];
|
|
};
|
|
_countr = _countr + 1;
|
|
} count _objWpnTypes;
|
|
|
|
//Add Magazines
|
|
_objWpnTypes = (_inventory select 1) select 0;
|
|
_objWpnQty = (_inventory select 1) select 1;
|
|
_countr = 0;
|
|
{
|
|
if (_x == "BoltSteel") then { _x = "WoodenArrow" }; // Convert BoltSteel to WoodenArrow
|
|
if (_x == "ItemTent") then { _x = "ItemTentOld" };
|
|
_isOK = isClass(configFile >> "CfgMagazines" >> _x);
|
|
if (_isOK) then {
|
|
_object addMagazineCargoGlobal [_x,(_objWpnQty select _countr)];
|
|
};
|
|
_countr = _countr + 1;
|
|
} count _objWpnTypes;
|
|
|
|
//Add Backpacks
|
|
_objWpnTypes = (_inventory select 2) select 0;
|
|
_objWpnQty = (_inventory select 2) select 1;
|
|
_countr = 0;
|
|
{
|
|
_isOK = isClass(configFile >> "CfgVehicles" >> _x);
|
|
if (_isOK) then {
|
|
_object addBackpackCargoGlobal [_x,(_objWpnQty select _countr)];
|
|
};
|
|
_countr = _countr + 1;
|
|
} count _objWpnTypes;
|
|
};
|
|
};
|
|
|
|
if (_object isKindOf "AllVehicles") then {
|
|
{
|
|
_selection = _x select 0;
|
|
_dam = _x select 1;
|
|
if (_selection in dayZ_explosiveParts && _dam > 0.8) then {_dam = 0.8};
|
|
[_object,_selection,_dam] call fnc_veh_handleRepair;
|
|
} count _hitpoints;
|
|
|
|
_object setFuel _fuel;
|
|
|
|
if (!((typeOf _object) in dayz_allowedObjects)) then {
|
|
|
|
//_object setvelocity [0,0,1];
|
|
_object call fnc_veh_ResetEH;
|
|
|
|
if(_ownerID != "0" && !(_object isKindOf "Bicycle")) then {
|
|
_object setVehicleLock "locked";
|
|
};
|
|
|
|
_totalvehicles = _totalvehicles + 1;
|
|
|
|
// total each vehicle
|
|
serverVehicleCounter set [count serverVehicleCounter,_type];
|
|
};
|
|
};
|
|
|
|
//Monitor the object
|
|
PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_object];
|
|
};
|
|
} forEach (_BuildingQueue + _objectQueue);
|
|
// # END SPAWN OBJECTS #
|
|
|
|
// Draw the pseudo random seeds
|
|
call server_plantSpawner;
|
|
|
|
// launch the legacy task scheduler
|
|
[] execFSM "\z\addons\dayz_server\system\server_cleanup.fsm";
|
|
|
|
// launch the new task scheduler
|
|
[] execVM "\z\addons\dayz_server\system\scheduler\sched_init.sqf";
|
|
|
|
createCenter civilian;
|
|
if (isDedicated) then {
|
|
endLoadingScreen;
|
|
};
|
|
allowConnection = true;
|
|
sm_done = true;
|
|
publicVariable "sm_done";
|
|
|
|
// Trap loop
|
|
[] spawn {
|
|
private ["_array","_array2","_array3","_script","_armed"];
|
|
_array = str dayz_traps;
|
|
_array2 = str dayz_traps_active;
|
|
_array3 = str dayz_traps_trigger;
|
|
|
|
while {1 == 1} do {
|
|
if ((str dayz_traps != _array) || (str dayz_traps_active != _array2) || (str dayz_traps_trigger != _array3)) then {
|
|
_array = str dayz_traps;
|
|
_array2 = str dayz_traps_active;
|
|
_array3 = str dayz_traps_trigger;
|
|
|
|
//diag_log "DEBUG: traps";
|
|
//diag_log format["dayz_traps (%2) -> %1", dayz_traps, count dayz_traps];
|
|
//diag_log format["dayz_traps_active (%2) -> %1", dayz_traps_active, count dayz_traps_active];
|
|
//diag_log format["dayz_traps_trigger (%2) -> %1", dayz_traps_trigger, count dayz_traps_trigger];
|
|
//diag_log "DEBUG: end traps";
|
|
};
|
|
|
|
{
|
|
if (isNull _x) then {
|
|
dayz_traps = dayz_traps - [_x];
|
|
};
|
|
|
|
_script = call compile getText (configFile >> "CfgVehicles" >> typeOf _x >> "script");
|
|
_armed = _x getVariable ["armed", false];
|
|
|
|
if (_armed) then {
|
|
if !(_x in dayz_traps_active) then {
|
|
["arm", _x] call _script;
|
|
};
|
|
} else {
|
|
if (_x in dayz_traps_active) then {
|
|
["disarm", _x] call _script;
|
|
};
|
|
};
|
|
|
|
sleep 0.01;
|
|
} forEach dayz_traps;
|
|
sleep 1;
|
|
};
|
|
};
|
|
|
|
//Points of interest
|
|
[] execVM "\z\addons\dayz_server\compile\server_spawnInfectedCamps.sqf";
|
|
[] execVM "\z\addons\dayz_server\compile\server_spawnCarePackages.sqf";
|
|
[] execVM "\z\addons\dayz_server\compile\server_spawnCrashSites.sqf";
|
|
|
|
|
|
[] execVM "\z\addons\dayz_server\system\lit_fireplaces.sqf";
|
|
|
|
|
|
"PVDZ_sec_atp" addPublicVariableEventHandler {
|
|
_x = _this select 1;
|
|
switch (1==1) do {
|
|
case (typeName _x == "STRING") : { // just some logs from the client
|
|
diag_log _x;
|
|
};
|
|
case (count _x == 2) : { // wrong side
|
|
diag_log Format [ "P1ayer %1 reports possible 'side' hack... Server may be comprised!", (_x select 1) call fa_plr2Str ];
|
|
};
|
|
default { // player hit
|
|
_unit = _x select 0;
|
|
_source = _x select 1;
|
|
if (((!(isNil {_source})) AND {(!(isNull _source))}) AND {((_source isKindOf "CAManBase") AND {(owner _unit != owner _source)})}) then {
|
|
diag_log format ["P1ayer %1 hit by %2 %3 from %4 meters",
|
|
_unit call fa_plr2Str, _source call fa_plr2Str, _x select 2, _x select 3];
|
|
if (_unit getVariable["processedDeath", 0] == 0) then {
|
|
_unit setVariable [ "attacker", name _source ];
|
|
_unit setVariable [ "noatlf4", diag_ticktime ]; // server-side "not in combat" test, if player is not already dead
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
// preload server traders menu data into cache
|
|
if !(DZE_ConfigTrader) then {
|
|
{
|
|
// get tids
|
|
_traderData = call compile format["menu_%1;",_x];
|
|
if(!isNil "_traderData") then {
|
|
{
|
|
_traderid = _x select 1;
|
|
|
|
_retrader = [];
|
|
|
|
_key = format["CHILD:399:%1:",_traderid];
|
|
_data = "HiveEXT" callExtension _key;
|
|
|
|
//diag_log "HIVE: Request sent";
|
|
|
|
//Process result
|
|
_result = call compile format ["%1",_data];
|
|
_status = _result select 0;
|
|
|
|
if (_status == "ObjectStreamStart") then {
|
|
_val = _result select 1;
|
|
//Stream Objects
|
|
//diag_log ("HIVE: Commence Menu Streaming...");
|
|
call compile format["ServerTcache_%1 = [];",_traderid];
|
|
for "_i" from 1 to _val do {
|
|
_data = "HiveEXT" callExtension _key;
|
|
_result = call compile format ["%1",_data];
|
|
call compile format["ServerTcache_%1 set [count ServerTcache_%1,%2]",_traderid,_result];
|
|
_retrader set [count _retrader,_result];
|
|
};
|
|
//diag_log ("HIVE: Streamed " + str(_val) + " objects");
|
|
};
|
|
|
|
} forEach (_traderData select 0);
|
|
};
|
|
} forEach serverTraders;
|
|
};
|
|
|
|
if (_hiveLoaded) then {
|
|
// spawn_vehicles
|
|
_vehLimit = MaxVehicleLimit - _totalvehicles;
|
|
if(_vehLimit > 0) then {
|
|
diag_log ("HIVE: Spawning # of Vehicles: " + str(_vehLimit));
|
|
for "_x" from 1 to _vehLimit do {
|
|
[] spawn spawn_vehicles;
|
|
};
|
|
} else {
|
|
diag_log "HIVE: Vehicle Spawn limit reached!";
|
|
};
|
|
};
|
|
|
|
// spawn_roadblocks
|
|
diag_log ("HIVE: Spawning # of Debris: " + str(MaxDynamicDebris));
|
|
for "_x" from 1 to MaxDynamicDebris do {
|
|
[] spawn spawn_roadblocks;
|
|
};
|
|
// spawn_ammosupply at server start 1% of roadblocks
|
|
diag_log ("HIVE: Spawning # of Ammo Boxes: " + str(MaxAmmoBoxes));
|
|
for "_x" from 1 to MaxAmmoBoxes do {
|
|
[] spawn spawn_ammosupply;
|
|
};
|
|
// call spawning mining veins
|
|
diag_log ("HIVE: Spawning # of Veins: " + str(MaxMineVeins));
|
|
for "_x" from 1 to MaxMineVeins do {
|
|
[] spawn spawn_mineveins;
|
|
};
|
|
|
|
if(isnil "dayz_MapArea") then {
|
|
dayz_MapArea = 10000;
|
|
};
|
|
if(isnil "HeliCrashArea") then {
|
|
HeliCrashArea = dayz_MapArea / 2;
|
|
};
|
|
if(isnil "OldHeliCrash") then {
|
|
OldHeliCrash = false;
|
|
};
|
|
|
|
// [_guaranteedLoot, _randomizedLoot, _frequency, _variance, _spawnChance, _spawnMarker, _spawnRadius, _spawnFire, _fadeFire]
|
|
if(OldHeliCrash) then {
|
|
_nul = [3, 4, (50 * 60), (15 * 60), 0.75, 'center', HeliCrashArea, true, false] spawn server_spawnCrashSite;
|
|
};
|
|
if (isDedicated) then {
|
|
// Epoch Events
|
|
_id = [] spawn server_spawnEvents;
|
|
|
|
// spawn debug box
|
|
_debugMarkerPosition = getMarkerPos "respawn_west";
|
|
_debugMarkerPosition = [(_debugMarkerPosition select 0),(_debugMarkerPosition select 1),1];
|
|
_vehicle_0 = createVehicle ["DebugBox_DZ", _debugMarkerPosition, [], 0, "CAN_COLLIDE"];
|
|
_vehicle_0 setPos _debugMarkerPosition;
|
|
_vehicle_0 setVariable ["ObjectID","1",true];
|
|
|
|
// max number of spawn markers
|
|
if(isnil "spawnMarkerCount") then {
|
|
spawnMarkerCount = 10;
|
|
};
|
|
actualSpawnMarkerCount = 0;
|
|
// count valid spawn marker positions
|
|
for "_i" from 0 to spawnMarkerCount do {
|
|
if (!([(getMarkerPos format["spawn%1", _i]), [0,0,0]] call BIS_fnc_areEqual)) then {
|
|
actualSpawnMarkerCount = actualSpawnMarkerCount + 1;
|
|
} else {
|
|
// exit since we did not find any further markers
|
|
_i = spawnMarkerCount + 99;
|
|
};
|
|
|
|
};
|
|
diag_log format["Total Number of spawn locations %1", actualSpawnMarkerCount];
|
|
|
|
endLoadingScreen;
|
|
};
|
|
|
|
allowConnection = true;
|
|
sm_done = true;
|
|
publicVariable "sm_done";
|
|
};
|