mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-14 12:12:34 +03:00
It makes no sense to rename the identical DayZ PVs to have an E in their name. I don't see any good reason it was done in the first place. All it accomplishes is breaking script compatibility between the two mods and requiring different publicvariable.txt filters. The only time it makes sense is for custom Epoch variables that aren't used in vanilla. All admins have to do to update custom scripts is swap the names according to the change log. Note I've submitted a pull request to replace PVDZ_veh_Save with PVDZ_obj_Save in official too because they are duplicates.
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";
|
|
};
|