mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-14 04:02:37 +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.
849 lines
24 KiB
Plaintext
849 lines
24 KiB
Plaintext
|
|
/*
|
|
server_updateNearbyObjects = {
|
|
private["_pos"];
|
|
_pos = _this select 0;
|
|
{
|
|
[_x, "gear"] call server_updateObject;
|
|
} count nearestObjects [_pos, dayz_updateObjects, 10];
|
|
}; */
|
|
|
|
/*
|
|
zombie_findOwner = {
|
|
private["_unit"];
|
|
_unit = _this select 0;
|
|
#ifdef DZE_SERVER_DEBUG
|
|
diag_log ("CLEANUP: DELETE UNCONTROLLED ZOMBIE: " + (typeOf _unit) + " OF: " + str(_unit) );
|
|
#endif
|
|
deleteVehicle _unit;
|
|
}; */
|
|
|
|
vehicle_handleInteract = {
|
|
private["_object"];
|
|
_object = _this select 0;
|
|
needUpdate_objects = needUpdate_objects - [_object];
|
|
[_object, "all"] call server_updateObject;
|
|
};
|
|
|
|
array_reduceSizeReverse = {
|
|
private["_array","_count","_num","_newarray","_startnum","_index"];
|
|
_array = _this select 0;
|
|
_newarray = [];
|
|
_count = _this select 1;
|
|
_num = count _array;
|
|
if (_num > _count) then {
|
|
_startnum = _num - 1;
|
|
_index = _count - 1;
|
|
for "_i" from 0 to _index do {
|
|
_newarray set [(_index-_i),_array select (_startnum - _i)];
|
|
};
|
|
_array = _newarray;
|
|
};
|
|
_array
|
|
};
|
|
|
|
array_reduceSize = {
|
|
private ["_array1","_array","_count","_num"];
|
|
_array1 = _this select 0;
|
|
_array = _array1 - ["Hatchet_Swing","Machete_Swing","Fishing_Swing","sledge_swing","crowbar_swing","CSGAS"];
|
|
_count = _this select 1;
|
|
_num = count _array;
|
|
if (_num > _count) then {
|
|
_array resize _count;
|
|
};
|
|
_array
|
|
};
|
|
|
|
object_handleServerKilled = {
|
|
private["_unit","_objectID","_objectUID","_killer"];
|
|
_unit = _this select 0;
|
|
_killer = _this select 1;
|
|
|
|
_objectID = _unit getVariable ["ObjectID","0"];
|
|
_objectUID = _unit getVariable ["ObjectUID","0"];
|
|
|
|
[_objectID,_objectUID,_killer] call server_deleteObj;
|
|
|
|
_unit removeAllMPEventHandlers "MPKilled";
|
|
_unit removeAllEventHandlers "Killed";
|
|
_unit removeAllEventHandlers "HandleDamage";
|
|
_unit removeAllEventHandlers "GetIn";
|
|
_unit removeAllEventHandlers "GetOut";
|
|
};
|
|
|
|
server_hiveReadWriteLarge = {
|
|
private["_key","_resultArray","_data"];
|
|
_key = _this;
|
|
_data = "HiveExt" callExtension _key;
|
|
_resultArray = call compile _data;
|
|
_resultArray
|
|
};
|
|
|
|
server_checkIfTowed = {
|
|
private ["_vehicle","_player","_attached"];
|
|
if (DZE_HeliLift) then {
|
|
_vehicle = _this select 0;
|
|
_player = _this select 2;
|
|
_attached = _vehicle getVariable["attached",false];
|
|
if (typeName _attached == "OBJECT") then {
|
|
_player action ["eject", _vehicle];
|
|
detach _vehicle;
|
|
_vehicle setVariable["attached",false,true];
|
|
_attached setVariable["hasAttached",false,true];
|
|
};
|
|
};
|
|
};
|
|
|
|
server_characterSync = {
|
|
private ["_characterID","_playerPos","_playerGear","_playerBackp","_medical","_currentState","_currentModel","_key"];
|
|
_characterID = _this select 0;
|
|
_playerPos = _this select 1;
|
|
_playerGear = _this select 2;
|
|
_playerBackp = _this select 3;
|
|
_medical = _this select 4;
|
|
_currentState = _this select 5;
|
|
_currentModel = _this select 6;
|
|
|
|
_key = format["CHILD:201:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:",_characterID,_playerPos,_playerGear,_playerBackp,_medical,false,false,0,0,0,0,_currentState,0,0,_currentModel,0];
|
|
_key call server_hiveWrite;
|
|
};
|
|
|
|
if(isnil "dayz_MapArea") then {
|
|
dayz_MapArea = 10000;
|
|
};
|
|
if(isnil "DynamicVehicleArea") then {
|
|
DynamicVehicleArea = dayz_MapArea / 2;
|
|
};
|
|
|
|
// Get all buildings && roads only once TODO: set variables to nil after done if nessicary
|
|
MarkerPosition = getMarkerPos "center";
|
|
RoadList = MarkerPosition nearRoads DynamicVehicleArea;
|
|
|
|
// Very taxing !!! but only on first startup
|
|
BuildingList = [];
|
|
{
|
|
if (DZE_MissionLootTable) then {
|
|
if (isClass (missionConfigFile >> "CfgBuildingLoot" >> (typeOf _x))) then
|
|
{
|
|
BuildingList set [count BuildingList,_x];
|
|
};
|
|
} else {
|
|
if (isClass (configFile >> "CfgBuildingLoot" >> (typeOf _x))) then
|
|
{
|
|
BuildingList set [count BuildingList,_x];
|
|
};
|
|
};
|
|
|
|
|
|
} count (MarkerPosition nearObjects ["building",DynamicVehicleArea]);
|
|
|
|
spawn_vehicles = {
|
|
private ["_random","_lastIndex","_weights","_index","_vehicle","_velimit","_qty","_isAir","_isShip","_position","_dir","_istoomany","_veh","_objPosition","_marker","_iClass","_itemTypes","_cntWeights","_itemType","_num","_allCfgLoots"];
|
|
|
|
if (!isDedicated) exitWith { }; //Be sure the run this
|
|
|
|
while {count AllowedVehiclesList > 0} do {
|
|
// BIS_fnc_selectRandom replaced because the index may be needed to remove the element
|
|
_index = floor random count AllowedVehiclesList;
|
|
_random = AllowedVehiclesList select _index;
|
|
|
|
_vehicle = _random select 0;
|
|
_velimit = _random select 1;
|
|
|
|
_qty = {_x == _vehicle} count serverVehicleCounter;
|
|
|
|
// If under limit allow to proceed
|
|
if (_qty <= _velimit) exitWith {};
|
|
|
|
// vehicle limit reached, remove vehicle from list
|
|
// since elements cannot be removed from an array, overwrite it with the last element && cut the last element of (as long as order is not important)
|
|
_lastIndex = (count AllowedVehiclesList) - 1;
|
|
if (_lastIndex != _index) then {
|
|
AllowedVehiclesList set [_index, AllowedVehiclesList select _lastIndex];
|
|
};
|
|
AllowedVehiclesList resize _lastIndex;
|
|
};
|
|
|
|
if (count AllowedVehiclesList == 0) then {
|
|
diag_log("DEBUG: unable to find suitable vehicle to spawn");
|
|
} else {
|
|
|
|
// add vehicle to counter for next pass
|
|
serverVehicleCounter set [count serverVehicleCounter,_vehicle];
|
|
|
|
// Find Vehicle Type to better control spawns
|
|
_isAir = _vehicle isKindOf "Air";
|
|
_isShip = _vehicle isKindOf "Ship";
|
|
|
|
if(_isShip || _isAir) then {
|
|
if(_isShip) then {
|
|
// Spawn anywhere on coast on water
|
|
waitUntil{!isNil "BIS_fnc_findSafePos"};
|
|
_position = [MarkerPosition,0,DynamicVehicleArea,10,1,2000,1] call BIS_fnc_findSafePos;
|
|
//diag_log("DEBUG: spawning boat near coast " + str(_position));
|
|
} else {
|
|
// Spawn air anywhere that is flat
|
|
waitUntil{!isNil "BIS_fnc_findSafePos"};
|
|
_position = [MarkerPosition,0,DynamicVehicleArea,10,0,2000,0] call BIS_fnc_findSafePos;
|
|
//diag_log("DEBUG: spawning air anywhere flat " + str(_position));
|
|
};
|
|
|
|
|
|
} else {
|
|
// Spawn around buildings && 50% near roads
|
|
if((random 1) > 0.5) then {
|
|
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_position = RoadList call BIS_fnc_selectRandom;
|
|
|
|
_position = _position modelToWorld [0,0,0];
|
|
|
|
waitUntil{!isNil "BIS_fnc_findSafePos"};
|
|
_position = [_position,0,10,10,0,2000,0] call BIS_fnc_findSafePos;
|
|
|
|
//diag_log("DEBUG: spawning near road " + str(_position));
|
|
|
|
} else {
|
|
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_position = BuildingList call BIS_fnc_selectRandom;
|
|
|
|
_position = _position modelToWorld [0,0,0];
|
|
|
|
waitUntil{!isNil "BIS_fnc_findSafePos"};
|
|
_position = [_position,0,40,5,0,2000,0] call BIS_fnc_findSafePos;
|
|
|
|
//diag_log("DEBUG: spawning around buildings " + str(_position));
|
|
|
|
};
|
|
};
|
|
// only proceed if two params otherwise BIS_fnc_findSafePos failed && may spawn in air
|
|
if ((count _position) == 2) then {
|
|
|
|
_dir = round(random 180);
|
|
|
|
_istoomany = _position nearObjects ["AllVehicles",50];
|
|
if((count _istoomany) > 0) exitWith { diag_log("DEBUG: Too many vehicles at " + str(_position)); };
|
|
|
|
//place vehicle
|
|
_veh = createVehicle [_vehicle, _position, [], 0, "CAN_COLLIDE"];
|
|
_veh setdir _dir;
|
|
_veh setpos _position;
|
|
|
|
if(DZEdebug) then {
|
|
_marker = createMarker [str(_position) , _position];
|
|
_marker setMarkerShape "ICON";
|
|
_marker setMarkerType "DOT";
|
|
_marker setMarkerText _vehicle;
|
|
};
|
|
|
|
// Get position with ground
|
|
_objPosition = getPosATL _veh;
|
|
|
|
clearWeaponCargoGlobal _veh;
|
|
clearMagazineCargoGlobal _veh;
|
|
// _veh setVehicleAmmo DZE_vehicleAmmo;
|
|
|
|
// Add 0-3 loots to vehicle using random cfgloots
|
|
_num = floor(random 4);
|
|
_allCfgLoots = ["trash","civilian","food","generic","medical","military","policeman","hunter","worker","clothes","militaryclothes","specialclothes","trash"];
|
|
|
|
for "_x" from 1 to _num do {
|
|
_iClass = _allCfgLoots call BIS_fnc_selectRandom;
|
|
|
|
_itemTypes = [];
|
|
if (DZE_MissionLootTable) then{
|
|
{
|
|
_itemTypes set[count _itemTypes, _x select 0]
|
|
} count getArray(missionConfigFile >> "cfgLoot" >> _iClass);
|
|
}
|
|
else {
|
|
{
|
|
_itemTypes set[count _itemTypes, _x select 0]
|
|
} count getArray(configFile >> "cfgLoot" >> _iClass);
|
|
};
|
|
|
|
_index = dayz_CLBase find _iClass;
|
|
_weights = dayz_CLChances select _index;
|
|
_cntWeights = count _weights;
|
|
|
|
_index = floor(random _cntWeights);
|
|
_index = _weights select _index;
|
|
_itemType = _itemTypes select _index;
|
|
_veh addMagazineCargoGlobal [_itemType,1];
|
|
//diag_log("DEBUG: spawed loot inside vehicle " + str(_itemType));
|
|
};
|
|
|
|
[_veh,[_dir,_objPosition],_vehicle,true,"0"] call server_publishVeh;
|
|
};
|
|
};
|
|
};
|
|
|
|
spawn_ammosupply = {
|
|
private ["_position","_veh","_istoomany","_marker","_spawnveh","_WreckList"];
|
|
if (isDedicated) then {
|
|
_WreckList = ["Supply_Crate_DZE"];
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_position = RoadList call BIS_fnc_selectRandom;
|
|
_position = _position modelToWorld [0,0,0];
|
|
waitUntil{!isNil "BIS_fnc_findSafePos"};
|
|
_position = [_position,5,20,5,0,2000,0] call BIS_fnc_findSafePos;
|
|
if ((count _position) == 2) then {
|
|
|
|
_istoomany = _position nearObjects ["All",5];
|
|
|
|
if((count _istoomany) > 0) exitWith { diag_log("DEBUG VEIN: Too many at " + str(_position)); };
|
|
|
|
_spawnveh = _WreckList call BIS_fnc_selectRandom;
|
|
|
|
if(DZEdebug) then {
|
|
_marker = createMarker [str(_position) , _position];
|
|
_marker setMarkerShape "ICON";
|
|
_marker setMarkerType "DOT";
|
|
_marker setMarkerText str(_spawnveh);
|
|
};
|
|
|
|
_veh = createVehicle [_spawnveh,_position, [], 0, "CAN_COLLIDE"];
|
|
_veh enableSimulation false;
|
|
_veh setDir round(random 360);
|
|
_veh setpos _position;
|
|
_veh setVariable ["ObjectID","1",true];
|
|
};
|
|
};
|
|
};
|
|
|
|
DZE_LocalRoadBlocks = [];
|
|
|
|
spawn_roadblocks = {
|
|
private ["_position","_veh","_istoomany","_marker","_spawnveh","_WreckList"];
|
|
_WreckList = ["SKODAWreck","HMMWVWreck","UralWreck","datsun01Wreck","hiluxWreck","datsun02Wreck","UAZWreck","Land_Misc_Garb_Heap_EP1","Fort_Barricade_EP1","Rubbish2"];
|
|
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
if (isDedicated) then {
|
|
|
|
_position = RoadList call BIS_fnc_selectRandom;
|
|
|
|
_position = _position modelToWorld [0,0,0];
|
|
|
|
waitUntil{!isNil "BIS_fnc_findSafePos"};
|
|
_position = [_position,0,10,5,0,2000,0] call BIS_fnc_findSafePos;
|
|
|
|
if ((count _position) == 2) then {
|
|
// Get position with ground
|
|
|
|
_istoomany = _position nearObjects ["All",5];
|
|
|
|
if((count _istoomany) > 0) exitWith { diag_log("DEBUG: Too many at " + str(_position)); };
|
|
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_spawnveh = _WreckList call BIS_fnc_selectRandom;
|
|
|
|
if(DZEdebug) then {
|
|
_marker = createMarker [str(_position) , _position];
|
|
_marker setMarkerShape "ICON";
|
|
_marker setMarkerType "DOT";
|
|
_marker setMarkerText str(_spawnveh);
|
|
};
|
|
|
|
_veh = createVehicle [_spawnveh,_position, [], 0, "CAN_COLLIDE"];
|
|
_veh enableSimulation false;
|
|
|
|
_veh setDir round(random 360); // Randomize placement a bit
|
|
_veh setpos _position;
|
|
|
|
_veh setVariable ["ObjectID","1",true];
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
spawn_mineveins = {
|
|
private ["_position","_veh","_istoomany","_marker","_spawnveh","_positions"];
|
|
|
|
if (isDedicated) then {
|
|
|
|
_position = [getMarkerPos "center",0,(HeliCrashArea*0.75),10,0,2000,0] call BIS_fnc_findSafePos;
|
|
|
|
if ((count _position) == 2) then {
|
|
|
|
_positions = selectBestPlaces [_position, 500, "(1 + forest) * (1 + hills) * (1 - houses) * (1 - sea)", 10, 5];
|
|
|
|
_position = (_positions call BIS_fnc_selectRandom) select 0;
|
|
|
|
// Get position with ground
|
|
_istoomany = _position nearObjects ["All",10];
|
|
|
|
if((count _istoomany) > 0) exitWith { diag_log("DEBUG VEIN: Too many objects at " + str(_position)); };
|
|
|
|
if(isOnRoad _position) exitWith { diag_log("DEBUG VEIN: on road " + str(_position)); };
|
|
|
|
_spawnveh = ["Iron_Vein_DZE","Iron_Vein_DZE","Iron_Vein_DZE","Iron_Vein_DZE","Iron_Vein_DZE","Silver_Vein_DZE","Silver_Vein_DZE","Silver_Vein_DZE","Gold_Vein_DZE","Gold_Vein_DZE"] call BIS_fnc_selectRandom;
|
|
|
|
if(DZEdebug) then {
|
|
_marker = createMarker [str(_position) , _position];
|
|
_marker setMarkerShape "ICON";
|
|
_marker setMarkerType "DOT";
|
|
_marker setMarkerText str(_spawnveh);
|
|
};
|
|
|
|
//diag_log("DEBUG: Spawning a crashed " + _spawnveh + " with " + _spawnloot + " at " + str(_position));
|
|
_veh = createVehicle [_spawnveh,_position, [], 0, "CAN_COLLIDE"];
|
|
_veh enableSimulation false;
|
|
|
|
// Randomize placement a bit
|
|
_veh setDir round(random 360);
|
|
_veh setpos _position;
|
|
|
|
_veh setVariable ["ObjectID","1",true];
|
|
|
|
|
|
};
|
|
};
|
|
};
|
|
|
|
if(isnil "DynamicVehicleDamageLow") then {
|
|
DynamicVehicleDamageLow = 0;
|
|
};
|
|
if(isnil "DynamicVehicleDamageHigh") then {
|
|
DynamicVehicleDamageHigh = 100;
|
|
};
|
|
|
|
if(isnil "DynamicVehicleFuelLow") then {
|
|
DynamicVehicleFuelLow = 0;
|
|
};
|
|
if(isnil "DynamicVehicleFuelHigh") then {
|
|
DynamicVehicleFuelHigh = 100;
|
|
};
|
|
|
|
if(isnil "DZE_DiagFpsSlow") then {
|
|
DZE_DiagFpsSlow = false;
|
|
};
|
|
if(isnil "DZE_DiagFpsFast") then {
|
|
DZE_DiagFpsFast = false;
|
|
};
|
|
if(isnil "DZE_DiagVerbose") then {
|
|
DZE_DiagVerbose = false;
|
|
};
|
|
|
|
dze_diag_fps = {
|
|
if(DZE_DiagVerbose) then {
|
|
diag_log format["DEBUG FPS : %1 OBJECTS: %2 : PLAYERS: %3", diag_fps,(count (allMissionObjects "")),(playersNumber west)];
|
|
} else {
|
|
diag_log format["DEBUG FPS : %1", diag_fps];
|
|
};
|
|
};
|
|
|
|
// Damage generator function
|
|
generate_new_damage = {
|
|
private ["_damage"];
|
|
_damage = ((random(DynamicVehicleDamageHigh-DynamicVehicleDamageLow))+DynamicVehicleDamageLow) / 100;
|
|
_damage;
|
|
};
|
|
|
|
// Damage generator fuction
|
|
generate_exp_damage = {
|
|
private ["_damage"];
|
|
_damage = ((random(DynamicVehicleDamageHigh-DynamicVehicleDamageLow))+DynamicVehicleDamageLow) / 100;
|
|
|
|
// limit this to 85% since vehicle would blow up otherwise.
|
|
//if(_damage >= 0.85) then {
|
|
// _damage = 0.85;
|
|
//};
|
|
_damage;
|
|
};
|
|
|
|
server_getDiff = {
|
|
private["_variable","_object","_vNew","_vOld","_result"];
|
|
_variable = _this select 0;
|
|
_object = _this select 1;
|
|
_vNew = _object getVariable[_variable,0];
|
|
_vOld = _object getVariable[(_variable + "_CHK"),_vNew];
|
|
_result = 0;
|
|
if (_vNew < _vOld) then {
|
|
//JIP issues
|
|
_vNew = _vNew + _vOld;
|
|
_object getVariable[(_variable + "_CHK"),_vNew];
|
|
} else {
|
|
_result = _vNew - _vOld;
|
|
_object setVariable[(_variable + "_CHK"),_vNew];
|
|
};
|
|
_result
|
|
};
|
|
|
|
server_getDiff2 = {
|
|
private["_variable","_object","_vNew","_vOld","_result"];
|
|
_variable = _this select 0;
|
|
_object = _this select 1;
|
|
_vNew = _object getVariable[_variable,0];
|
|
_vOld = _object getVariable[(_variable + "_CHK"),_vNew];
|
|
_result = _vNew - _vOld;
|
|
_object setVariable[(_variable + "_CHK"),_vNew];
|
|
_result
|
|
};
|
|
|
|
currentObjectUIDs = [];
|
|
keyStartNumber = 100000000000;
|
|
|
|
dayz_objectUID = {
|
|
private["_position","_dir","_key","_object"];
|
|
_object = _this;
|
|
_position = getPosATL _object;
|
|
_dir = direction _object;
|
|
_key = [_dir,_position] call dayz_objectUID2;
|
|
_key
|
|
};
|
|
|
|
dayz_objectUID2 = {
|
|
private["_position","_dir","_key"];
|
|
_dir = _this select 0;
|
|
_key = "";
|
|
_position = _this select 1;
|
|
{
|
|
_x = _x * 10;
|
|
if ( _x < 0 ) then { _x = _x * -10 };
|
|
_key = _key + str(round(_x));
|
|
} count _position;
|
|
_key = _key + str(round(_dir));
|
|
// Make sure the generated key is not a duplicate
|
|
while {true} do {
|
|
if !(_key in currentObjectUIDs) exitWith {currentObjectUIDs set [count currentObjectUIDs,_key];};
|
|
keyStartNumber = keyStartNumber + 1;
|
|
_key = str keyStartNumber;
|
|
};
|
|
_key
|
|
};
|
|
|
|
dayz_objectUID3 = {
|
|
private["_position","_dir","_key"];
|
|
_dir = _this select 0;
|
|
_key = "";
|
|
_position = _this select 1;
|
|
{
|
|
_x = _x * 10;
|
|
if ( _x < 0 ) then { _x = _x * -10 };
|
|
_key = _key + str(round(_x));
|
|
} count _position;
|
|
_key = _key + str(round(_dir + time));
|
|
// Make sure the generated key is not a duplicate
|
|
while {true} do {
|
|
if !(_key in currentObjectUIDs) exitWith {currentObjectUIDs set [count currentObjectUIDs,_key];};
|
|
keyStartNumber = keyStartNumber + 1;
|
|
_key = str keyStartNumber;
|
|
};
|
|
_key
|
|
};
|
|
|
|
dayz_recordLogin = {
|
|
private["_key"];
|
|
_key = format["CHILD:103:%1:%2:%3:",_this select 0,_this select 1,_this select 2];
|
|
_key call server_hiveWrite;
|
|
};
|
|
|
|
dayz_perform_purge = {
|
|
if(!isNull(_this)) then {
|
|
_group = group _this;
|
|
_this removeAllMPEventHandlers "mpkilled";
|
|
_this removeAllMPEventHandlers "mphit";
|
|
_this removeAllMPEventHandlers "mprespawn";
|
|
_this removeAllEventHandlers "FiredNear";
|
|
_this removeAllEventHandlers "HandleDamage";
|
|
_this removeAllEventHandlers "Killed";
|
|
_this removeAllEventHandlers "Fired";
|
|
_this removeAllEventHandlers "GetOut";
|
|
_this removeAllEventHandlers "GetIn";
|
|
_this removeAllEventHandlers "Local";
|
|
clearVehicleInit _this;
|
|
deleteVehicle _this;
|
|
if ((count (units _group) == 0) && (_group != grpNull)) then {
|
|
deleteGroup _group;
|
|
};
|
|
};
|
|
};
|
|
|
|
dayz_perform_purge_player = {
|
|
|
|
private ["_countr","_backpack","_backpackType","_backpackWpn","_backpackMag","_objWpnTypes","_objWpnQty","_location","_dir","_holder","_weapons","_magazines"];
|
|
diag_log ("Purging player: " + str(_this));
|
|
|
|
if(!isNull(_this)) then {
|
|
|
|
_location = getPosATL _this;
|
|
_dir = getDir _this;
|
|
|
|
_holder = createVehicle ["GraveDZE", _location, [], 0, "CAN_COLLIDE"];
|
|
_holder setDir _dir;
|
|
_holder setPosATL _location;
|
|
|
|
_holder enableSimulation false;
|
|
|
|
_weapons = weapons _this;
|
|
_magazines = magazines _this;
|
|
|
|
// find backpack
|
|
if(!(isNull unitBackpack _this)) then {
|
|
_backpack = unitBackpack _this;
|
|
_backpackType = typeOf _backpack;
|
|
_backpackWpn = getWeaponCargo _backpack;
|
|
_backpackMag = getMagazineCargo _backpack;
|
|
|
|
_holder addBackpackCargoGlobal [_backpackType,1];
|
|
|
|
// add items from backpack
|
|
_objWpnTypes = _backpackWpn select 0;
|
|
_objWpnQty = _backpackWpn select 1;
|
|
_countr = 0;
|
|
{
|
|
_holder addWeaponCargoGlobal [_x,(_objWpnQty select _countr)];
|
|
_countr = _countr + 1;
|
|
} count _objWpnTypes;
|
|
|
|
// add backpack magazine items
|
|
_objWpnTypes = _backpackMag select 0;
|
|
_objWpnQty = _backpackMag select 1;
|
|
_countr = 0;
|
|
{
|
|
_holder addMagazineCargoGlobal [_x,(_objWpnQty select _countr)];
|
|
_countr = _countr + 1;
|
|
} count _objWpnTypes;
|
|
};
|
|
};
|
|
|
|
// add weapons
|
|
{
|
|
_holder addWeaponCargoGlobal [_x, 1];
|
|
} count _weapons;
|
|
|
|
// add mags
|
|
{
|
|
_holder addMagazineCargoGlobal [_x, 1];
|
|
} count _magazines;
|
|
_group = group _this;
|
|
_this removeAllMPEventHandlers "mpkilled";
|
|
_this removeAllMPEventHandlers "mphit";
|
|
_this removeAllMPEventHandlers "mprespawn";
|
|
_this removeAllEventHandlers "FiredNear";
|
|
_this removeAllEventHandlers "HandleDamage";
|
|
_this removeAllEventHandlers "Killed";
|
|
_this removeAllEventHandlers "Fired";
|
|
_this removeAllEventHandlers "GetOut";
|
|
_this removeAllEventHandlers "GetIn";
|
|
_this removeAllEventHandlers "Local";
|
|
clearVehicleInit _this;
|
|
deleteVehicle _this;
|
|
if ((count (units _group) == 0) && (_group != grpNull)) then {
|
|
deleteGroup _group;
|
|
};
|
|
// _this = nil;
|
|
};
|
|
|
|
|
|
dayz_removePlayerOnDisconnect = {
|
|
if(!isNull(_this)) then {
|
|
_group = group _this;
|
|
_this removeAllMPEventHandlers "mphit";
|
|
deleteVehicle _this;
|
|
deleteGroup (group _this);
|
|
};
|
|
};
|
|
|
|
server_timeSync = {
|
|
//Send request
|
|
private ["_hour","_minute","_date","_key","_result","_outcome"];
|
|
_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];
|
|
};
|
|
setDate _date;
|
|
dayzSetDate = _date;
|
|
publicVariable "dayzSetDate";
|
|
diag_log ("TIME SYNC: Local Time set to " + str(_date));
|
|
};
|
|
};
|
|
|
|
// must spawn these
|
|
server_spawncleanDead = {
|
|
private ["_deathTime","_delQtyZ","_delQtyP","_qty","_allDead"];
|
|
_allDead = allDead;
|
|
_delQtyZ = 0;
|
|
_delQtyP = 0;
|
|
{
|
|
if (local _x) then {
|
|
if (_x isKindOf "zZombie_Base") then
|
|
{
|
|
_x call dayz_perform_purge;
|
|
uiSleep 0.05;
|
|
_delQtyZ = _delQtyZ + 1;
|
|
} else {
|
|
if (_x isKindOf "CAManBase") then {
|
|
_deathTime = _x getVariable ["processedDeath", diag_tickTime];
|
|
if (diag_tickTime - _deathTime > 1800) then {
|
|
_x call dayz_perform_purge_player;
|
|
uiSleep 0.025;
|
|
_delQtyP = _delQtyP + 1;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
uiSleep 0.025;
|
|
} count _allDead;
|
|
if (_delQtyZ > 0 || _delQtyP > 0) then {
|
|
_qty = count _allDead;
|
|
diag_log (format["CLEANUP: Deleted %1 players && %2 zombies out of %3 dead",_delQtyP,_delQtyZ,_qty]);
|
|
};
|
|
};
|
|
server_cleanupGroups = {
|
|
if (DZE_DYN_AntiStuck3rd > 3) then { DZE_DYN_GroupCleanup = nil; DZE_DYN_AntiStuck3rd = 0; };
|
|
if(!isNil "DZE_DYN_GroupCleanup") exitWith { DZE_DYN_AntiStuck3rd = DZE_DYN_AntiStuck3rd + 1;};
|
|
DZE_DYN_GroupCleanup = true;
|
|
{
|
|
if ((count (units _x) == 0) && (_x != grpNull)) then {
|
|
deleteGroup _x;
|
|
};
|
|
uiSleep 0.001;
|
|
} count allGroups;
|
|
DZE_DYN_GroupCleanup = nil;
|
|
};
|
|
|
|
server_checkHackers = {
|
|
if (DZE_DYN_AntiStuck2nd > 3) then { DZE_DYN_HackerCheck = nil; DZE_DYN_AntiStuck2nd = 0; };
|
|
if(!isNil "DZE_DYN_HackerCheck") exitWith { DZE_DYN_AntiStuck2nd = DZE_DYN_AntiStuck2nd + 1;};
|
|
DZE_DYN_HackerCheck = true;
|
|
{
|
|
if (!((isNil "_x") || {(isNull _x)})) then {
|
|
if(vehicle _x != _x && !(vehicle _x in PVDZE_serverObjectMonitor) && (isPlayer _x) && !((typeOf vehicle _x) in DZE_safeVehicle)) then {
|
|
diag_log ("CLEANUP: KILLING A HACKER " + (name _x) + " " + str(_x) + " IN " + (typeOf vehicle _x));
|
|
(vehicle _x) setDamage 1;
|
|
_x setDamage 1;
|
|
uiSleep 0.25;
|
|
};
|
|
};
|
|
uiSleep 0.001;
|
|
} count allUnits;
|
|
DZE_DYN_HackerCheck = nil;
|
|
};
|
|
|
|
server_spawnCleanFire = {
|
|
private ["_delQtyFP","_qty","_missionFires"];
|
|
_missionFires = allMissionObjects "Land_Fire_DZ";
|
|
_delQtyFP = 0;
|
|
{
|
|
if (local _x) then {
|
|
deleteVehicle _x;
|
|
uiSleep 0.025;
|
|
_delQtyFP = _delQtyFP + 1;
|
|
};
|
|
uiSleep 0.001;
|
|
} count _missionFires;
|
|
if (_delQtyFP > 0) then {
|
|
_qty = count _missionFires;
|
|
diag_log (format["CLEANUP: Deleted %1 fireplaces out of %2",_delQtyFP,_qty]);
|
|
};
|
|
};
|
|
server_spawnCleanLoot = {
|
|
private ["_created","_delQty","_nearby","_age","_keep","_qty","_missionObjs","_dateNow"];
|
|
if (DZE_DYN_AntiStuck > 3) then { DZE_DYN_cleanLoot = nil; DZE_DYN_AntiStuck = 0; };
|
|
if(!isNil "DZE_DYN_cleanLoot") exitWith { DZE_DYN_AntiStuck = DZE_DYN_AntiStuck + 1;};
|
|
DZE_DYN_cleanLoot = true;
|
|
|
|
_missionObjs = allMissionObjects "ReammoBox";
|
|
_delQty = 0;
|
|
_dateNow = (DateToNumber date);
|
|
{
|
|
if (!isNull _x) then {
|
|
_keep = _x getVariable["permaLoot", false];
|
|
if (!_keep) then {
|
|
_created = _x getVariable["created", -0.1];
|
|
if (_created == -0.1) then{
|
|
_x setVariable["created", _dateNow, false];
|
|
_created = _dateNow;
|
|
}
|
|
else {
|
|
_age = (_dateNow - _created) * 525948;
|
|
if (_age > 20) then{
|
|
_nearby = { (isPlayer _x) && (alive _x) } count(_x nearEntities[["CAManBase", "AllVehicles"], 130]);
|
|
if (_nearby == 0) then{
|
|
deleteVehicle _x;
|
|
uiSleep 0.025;
|
|
_delQty = _delQty + 1;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
uiSleep 0.001;
|
|
} forEach _missionObjs;
|
|
if (_delQty > 0) then {
|
|
_qty = count _missionObjs;
|
|
diag_log (format["CLEANUP: Deleted %1 Loot Piles out of %2",_delQty,_qty]);
|
|
};
|
|
DZE_DYN_cleanLoot = nil;
|
|
};
|
|
|
|
server_spawnCleanAnimals = {
|
|
private ["_pos","_delQtyAnimal","_qty","_missonAnimals","_nearby"];
|
|
_missonAnimals = entities "CAAnimalBase";
|
|
_delQtyAnimal = 0;
|
|
{
|
|
if (local _x) then {
|
|
_x call dayz_perform_purge;
|
|
uiSleep 0.05;
|
|
_delQtyAnimal = _delQtyAnimal + 1;
|
|
} else {
|
|
if (!alive _x) then {
|
|
_pos = getPosATL _x;
|
|
if (count _pos > 0) then {
|
|
_nearby = {(isPlayer _x) && (alive _x)} count (_pos nearEntities [["CAManBase","AllVehicles"], 130]);
|
|
if (_nearby==0) then {
|
|
_x call dayz_perform_purge;
|
|
uiSleep 0.05;
|
|
_delQtyAnimal = _delQtyAnimal + 1;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
uiSleep 0.001;
|
|
} forEach _missonAnimals;
|
|
if (_delQtyAnimal > 0) then {
|
|
_qty = count _missonAnimals;
|
|
diag_log (format["CLEANUP: Deleted %1 Animals out of %2",_delQtyAnimal,_qty]);
|
|
};
|
|
};
|
|
|
|
server_logUnlockLockEvent = {
|
|
private["_player", "_obj", "_objectID", "_objectUID", "_statusText", "_PUID", "_status", "_clientID", "_type"];
|
|
_player = _this select 0;
|
|
_obj = _this select 1;
|
|
_status = _this select 2;
|
|
_type = typeOf _obj;
|
|
if (isNull _player) then {diag_log "ERROR: server_logUnlockLockEvent called with Null player object";};
|
|
_clientID = owner _player;
|
|
_PUID = [_player] call FNC_GetPlayerUID;
|
|
_statusText = if (_status) then {"LOCKED"} else {"UNLOCKED"};
|
|
|
|
if (!isNull _obj) then {
|
|
_objectID = _obj getVariable["ObjectID", "0"];
|
|
_objectUID = _obj getVariable["ObjectUID", "0"];
|
|
|
|
if (_status) then {[_obj, "gear"] call server_updateObject;};
|
|
diag_log format["%6 %5: ID:%1 UID:%2 BY %3(%4)",_objectID,_objectUID,name _player,_PUID,_statusText,_type];
|
|
dze_waiting = "success";
|
|
_clientID publicVariableClient "dze_waiting";
|
|
} else {
|
|
diag_log format["ERROR: %4 BY %1(%2) IS NULL AND COULD NOT BE %3 (THIS SHOULD NOT HAPPEN)",name _player,_PUID,_statusText,_type];
|
|
dze_waiting = "fail";
|
|
_clientID publicVariableClient "dze_waiting";
|
|
};
|
|
};
|