mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2026-04-17 17:56:40 +03:00
Organize files a bit and removed non source pbo's
This commit is contained in:
1
SQF/dayz_server/$PBOPREFIX$
Normal file
1
SQF/dayz_server/$PBOPREFIX$
Normal file
@@ -0,0 +1 @@
|
||||
z\addons\dayz_server
|
||||
1
SQF/dayz_server/PboPrefix.txt
Normal file
1
SQF/dayz_server/PboPrefix.txt
Normal file
@@ -0,0 +1 @@
|
||||
z\addons\dayz_server
|
||||
26
SQF/dayz_server/compile/fnc_plyrHit.sqf
Normal file
26
SQF/dayz_server/compile/fnc_plyrHit.sqf
Normal file
@@ -0,0 +1,26 @@
|
||||
private ["_victim", "_attacker","_weapon","_distance"];
|
||||
_victim = _this select 0;
|
||||
_attacker = _this select 1;
|
||||
|
||||
if (!isPlayer _victim || !isPlayer _attacker) exitWith {};
|
||||
if ((name _victim) == (name _attacker)) exitWith {};
|
||||
|
||||
_weapon = weaponState _attacker;
|
||||
if (_weapon select 0 == "Throw") then
|
||||
{
|
||||
_weapon = _weapon select 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
_weapon = _weapon select 0;
|
||||
};
|
||||
|
||||
_distance = _victim distance _attacker;
|
||||
|
||||
diag_log format["PHIT: %1 was hit by %2 with %3 from %4m", _victim, _attacker, _weapon, _distance];
|
||||
|
||||
_victim setVariable["AttackedBy", _attacker, true];
|
||||
_victim setVariable["AttackedByName", (name _attacker), true];
|
||||
//_victim setVariable["AttackedByWeapon", (currentWeapon _attacker), true];
|
||||
_victim setVariable["AttackedByWeapon", _weapon, true];
|
||||
_victim setVariable["AttackedFromDistance", _distance, true];
|
||||
21
SQF/dayz_server/compile/server_deleteObj.sqf
Normal file
21
SQF/dayz_server/compile/server_deleteObj.sqf
Normal file
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
[_objectID,_objectUID] call server_deleteObj;
|
||||
*/
|
||||
private["_id","_uid","_key"];
|
||||
_id = _this select 0;
|
||||
_uid = _this select 1;
|
||||
|
||||
if (isServer) then {
|
||||
//remove from database
|
||||
if (parseNumber _id > 0) then {
|
||||
//Send request
|
||||
_key = format["CHILD:304:%1:",_id];
|
||||
_key call server_hiveWrite;
|
||||
diag_log format["DELETE: Deleted by ID: %1",_id];
|
||||
} else {
|
||||
//Send request
|
||||
_key = format["CHILD:310:%1:",_uid];
|
||||
_key call server_hiveWrite;
|
||||
diag_log format["DELETE: Deleted by UID: %1",_uid];
|
||||
};
|
||||
};
|
||||
3
SQF/dayz_server/compile/server_handleZedSpawn.sqf
Normal file
3
SQF/dayz_server/compile/server_handleZedSpawn.sqf
Normal file
@@ -0,0 +1,3 @@
|
||||
private["_zed"];
|
||||
_zed = _this select 0;
|
||||
_zed enableSimulation false;
|
||||
0
SQF/dayz_server/compile/server_onPlayerConnect.sqf
Normal file
0
SQF/dayz_server/compile/server_onPlayerConnect.sqf
Normal file
46
SQF/dayz_server/compile/server_onPlayerDisconnect.sqf
Normal file
46
SQF/dayz_server/compile/server_onPlayerDisconnect.sqf
Normal file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
|
||||
*/
|
||||
private ["_object","_myGroup","_id","_playerID","_playerName","_characterID","_playerIDtoarray","_timeout"];
|
||||
_playerID = _this select 0;
|
||||
_playerName = _this select 1;
|
||||
_object = call compile format["player%1",_playerID];
|
||||
_characterID = _object getVariable ["characterID","0"];
|
||||
_timeout = _object getVariable["combattimeout",0];
|
||||
|
||||
_playerIDtoarray = [];
|
||||
_playerIDtoarray = toArray _playerID;
|
||||
|
||||
if (vehicle _object != _object) then {
|
||||
_object action ["eject", vehicle _object];
|
||||
};
|
||||
|
||||
if (59 in _playerIDtoarray) exitWith { };
|
||||
|
||||
if ((_timeout - time) > 0) then {
|
||||
|
||||
diag_log format["COMBAT LOGGED: %1 (%2)", _playerName,_timeout];
|
||||
_object setVariable["NORRN_unconscious",true, true];
|
||||
_object setVariable["unconsciousTime",300,true];
|
||||
diag_log format["SET UNCONCIOUSNESS: %1", _playerName];
|
||||
|
||||
//_message = format["PLAYER COMBAT LOGGED: %1 (%2)",_playerName, _killerName, _weapon];
|
||||
//[nil, nil, rspawn, [_object, _message], { (_this select 0) globalChat (_this select 1) }] call RE;
|
||||
|
||||
};
|
||||
|
||||
diag_log format["DISCONNECT: %1 (%2) Object: %3, _characterID: %4", _playerName,_playerID,_object,_characterID];
|
||||
_id = [_playerID,_characterID,2] spawn dayz_recordLogin;
|
||||
dayz_disco = dayz_disco - [_playerID];
|
||||
if (!isNull _object) then {
|
||||
//Update Vehicle
|
||||
{ [_x,"gear"] call server_updateObject } foreach
|
||||
(nearestObjects [getPosATL _object, dayz_updateObjects, 10]);
|
||||
if (alive _object) then {
|
||||
[_object,(magazines _object),true,true] call server_playerSync;
|
||||
//[_object,[],true,false] call server_playerSync;
|
||||
_myGroup = group _object;
|
||||
deleteVehicle _object;
|
||||
deleteGroup _myGroup;
|
||||
};
|
||||
};
|
||||
16
SQF/dayz_server/compile/server_playerDeaths.sqf
Normal file
16
SQF/dayz_server/compile/server_playerDeaths.sqf
Normal file
@@ -0,0 +1,16 @@
|
||||
private["_character","_clientID"];
|
||||
|
||||
_character = _this select 0;
|
||||
_clientID = owner _character;
|
||||
|
||||
diag_log ("HIVE: Player Death list Request by ClientID: "+ str(_clientID));
|
||||
|
||||
diag_log(PlayerDeaths);
|
||||
|
||||
dayzPlayerDeathsResult = PlayerDeaths;
|
||||
|
||||
if(!isNull _character) then {
|
||||
_clientID publicVariableClient "dayzPlayerDeathsResult";
|
||||
};
|
||||
|
||||
PlayerDeaths
|
||||
95
SQF/dayz_server/compile/server_playerDied.sqf
Normal file
95
SQF/dayz_server/compile/server_playerDied.sqf
Normal file
@@ -0,0 +1,95 @@
|
||||
private["_characterID","_minutes","_newObject","_playerID","_playerName","_infected","_victim","_victimName","_killer","_killerName","_weapon","_distance","_message","_loc_message","_key","_eh","_body","_method","_name"];
|
||||
//[unit, weapon, muzzle, mode, ammo, magazine, projectile]
|
||||
_characterID = _this select 0;
|
||||
_minutes = _this select 1;
|
||||
_newObject = _this select 2;
|
||||
_playerID = _this select 3;
|
||||
_playerName = _this select 4;
|
||||
_infected = _this select 5;
|
||||
|
||||
_victim removeAllEventHandlers "MPHit";
|
||||
|
||||
_victim = _this select 2;
|
||||
_victimName = _victim getVariable["bodyName", "nil"];
|
||||
|
||||
_killer = _victim getVariable["AttackedBy", "nil"];
|
||||
_killerName = _victim getVariable["AttackedByName", "nil"];
|
||||
|
||||
// when a zombie kills a player _killer, _killerName and _weapon will be "nil"
|
||||
// we can use this to determine a zombie kill and send a customized message for that. right now no killmsg means it was a zombie.
|
||||
if (_killerName != "nil") then
|
||||
{
|
||||
_weapon = _victim getVariable["AttackedByWeapon", "nil"];
|
||||
_distance = _victim getVariable["AttackedFromDistance", "nil"];
|
||||
|
||||
if (_victimName == _killerName) then
|
||||
{
|
||||
_message = format["%1 killed himself",_victimName];
|
||||
_loc_message = format["PKILL: %1 killed himself", _victimName];
|
||||
}
|
||||
else
|
||||
{
|
||||
_message = format["%1 was killed by %2 with weapon %3 from %4m",_victimName, _killerName, _weapon, _distance];
|
||||
_loc_message = format["PKILL: %1 was killed by %2 with weapon %3 from %4m", _victimName, _killerName, _weapon, _distance];
|
||||
};
|
||||
|
||||
diag_log _loc_message;
|
||||
if(DZE_DeathMsgGlobal) then {
|
||||
[nil, nil, rspawn, [_killer, _message], { (_this select 0) globalChat (_this select 1) }] call RE;
|
||||
};
|
||||
if(DZE_DeathMsgSide) then {
|
||||
[nil, nil, rspawn, [_killer, _message], { (_this select 0) sideChat (_this select 1) }] call RE;
|
||||
};
|
||||
if(DZE_DeathMsgTitleText) then {
|
||||
[nil,nil,"per",rTITLETEXT,_message,"PLAIN DOWN"] call RE;
|
||||
};
|
||||
|
||||
// build array to store death messages to allow viewing at message board in trader citys.
|
||||
PlayerDeaths set [count PlayerDeaths,_message];
|
||||
|
||||
// Cleanup
|
||||
_victim setVariable["AttackedBy", "nil", true];
|
||||
_victim setVariable["AttackedByName", "nil", true];
|
||||
_victim setVariable["AttackedByWeapon", "nil", true];
|
||||
_victim setVariable["AttackedFromDistance", "nil", true];
|
||||
};
|
||||
|
||||
dayz_disco = dayz_disco - [_playerID];
|
||||
_newObject setVariable["processedDeath",time];
|
||||
|
||||
/*
|
||||
diag_log ("DW_DEBUG: (isnil _characterID): " + str(isnil "_characterID"));
|
||||
if (isnil "_characterID") then {
|
||||
diag_log ("DW_DEBUG: _newObject: " + str(_newObject));
|
||||
};
|
||||
*/
|
||||
|
||||
if (typeName _minutes == "STRING") then
|
||||
{
|
||||
_minutes = parseNumber _minutes;
|
||||
};
|
||||
|
||||
if (_characterID != "0") then
|
||||
{
|
||||
_key = format["CHILD:202:%1:%2:%3:",_characterID,_minutes,_infected];
|
||||
//diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_key call server_hiveWrite;
|
||||
}
|
||||
else
|
||||
{
|
||||
deleteVehicle _newObject;
|
||||
};
|
||||
|
||||
diag_log ("PDEATH: Player Died " + _playerID);
|
||||
/*
|
||||
_eh = [_newObject] spawn {
|
||||
_body = _this select 0;
|
||||
_method = _body getVariable["deathType","unknown"];
|
||||
_name = _body getVariable["bodyName","unknown"];
|
||||
waitUntil{!isPlayer _body;sleep 1};
|
||||
_body setVariable["deathType",_method,true];
|
||||
_body setVariable["bodyName",_name,true];
|
||||
diag_log ("PDEATH: Player Left Body " + _name);
|
||||
};
|
||||
*/
|
||||
//dead_bodyCleanup set [count dead_bodyCleanup,_newObject];
|
||||
144
SQF/dayz_server/compile/server_playerLogin.sqf
Normal file
144
SQF/dayz_server/compile/server_playerLogin.sqf
Normal file
@@ -0,0 +1,144 @@
|
||||
private ["_isInfected","_doLoop","_hiveVer","_isHiveOk","_playerID","_playerObj","_primary","_key","_charID","_playerName","_backpack","_isNew","_inventory","_survival","_model","_mags","_wpns","_bcpk","_config","_newPlayer"];
|
||||
//Set Variables
|
||||
|
||||
diag_log ("STARTING LOGIN: " + str(_this));
|
||||
|
||||
_playerID = _this select 0;
|
||||
_playerObj = _this select 1;
|
||||
_playerName = name _playerObj;
|
||||
//_worldspace = [];
|
||||
|
||||
if (_playerName == '__SERVER__' || _playerID == '' || local player) exitWith {};
|
||||
|
||||
// Cancel any login until server_monitor terminates.
|
||||
// This is mandatory since all vehicles must be spawned before the first players spawn on the map.
|
||||
// Otherwise, all vehicle event handlers won't be created on players' client side.
|
||||
if (isNil "sm_done") exitWith { diag_log ("Login cancelled, server is not ready. " + str(_playerObj)); };
|
||||
|
||||
|
||||
if (count _this > 2) then {
|
||||
dayz_players = dayz_players - [_this select 2];
|
||||
};
|
||||
|
||||
//Variables
|
||||
_inventory = [];
|
||||
_backpack = [];
|
||||
//_items = [];
|
||||
//_magazines = [];
|
||||
//_weapons = [];
|
||||
//_medicalStats = [];
|
||||
_survival = [0,0,0];
|
||||
//_tent = [];
|
||||
//_state = [];
|
||||
//_direction = 0;
|
||||
_isInfected = 0;
|
||||
_model = "";
|
||||
//_newUnit = objNull;
|
||||
//_botActive = false;
|
||||
|
||||
if (_playerID == "") then {
|
||||
_playerID = getPlayerUID _playerObj;
|
||||
};
|
||||
|
||||
if ((_playerID == "") or (isNil "_playerID")) exitWith {
|
||||
diag_log ("LOGIN FAILED: Player [" + _playerName + "] has no login ID");
|
||||
};
|
||||
|
||||
//??? endLoadingScreen;
|
||||
diag_log ("LOGIN ATTEMPT: " + str(_playerID) + " " + _playerName);
|
||||
|
||||
//Do Connection Attempt
|
||||
_doLoop = 0;
|
||||
while {_doLoop < 5} do {
|
||||
_key = format["CHILD:101:%1:%2:%3:",_playerID,dayZ_instance,_playerName];
|
||||
_primary = _key call server_hiveReadWrite;
|
||||
if (count _primary > 0) then {
|
||||
if ((_primary select 0) != "ERROR") then {
|
||||
_doLoop = 9;
|
||||
};
|
||||
};
|
||||
_doLoop = _doLoop + 1;
|
||||
};
|
||||
|
||||
if (isNull _playerObj or !isPlayer _playerObj) exitWith {
|
||||
diag_log ("LOGIN RESULT: Exiting, player object null: " + str(_playerObj));
|
||||
};
|
||||
|
||||
if ((_primary select 0) == "ERROR") exitWith {
|
||||
diag_log format ["LOGIN RESULT: Exiting, failed to load _primary: %1 for player: %2 ",_primary,_playerID];
|
||||
};
|
||||
|
||||
//Process request
|
||||
_newPlayer = _primary select 1;
|
||||
_isNew = count _primary < 7; //_result select 1;
|
||||
_charID = _primary select 2;
|
||||
//_randomSpot = false;
|
||||
|
||||
//diag_log ("LOGIN RESULT: " + str(_primary));
|
||||
|
||||
/* PROCESS */
|
||||
_hiveVer = 0;
|
||||
|
||||
if (!_isNew) then {
|
||||
//RETURNING CHARACTER
|
||||
_inventory = _primary select 4;
|
||||
_backpack = _primary select 5;
|
||||
_survival = _primary select 6;
|
||||
_model = _primary select 7;
|
||||
_hiveVer = _primary select 8;
|
||||
|
||||
if (!(_model in AllPlayers)) then {
|
||||
_model = "Survivor2_DZ";
|
||||
};
|
||||
|
||||
} else {
|
||||
_isInfected = _primary select 3;
|
||||
_model = _primary select 4;
|
||||
_hiveVer = _primary select 5;
|
||||
|
||||
if (isNil "_model") then {
|
||||
_model = "Survivor2_DZ";
|
||||
} else {
|
||||
if (_model == "") then {
|
||||
_model = "Survivor2_DZ";
|
||||
};
|
||||
};
|
||||
|
||||
//Record initial inventory only if not player zombie
|
||||
if(_isInfected != 1) then {
|
||||
_config = (configFile >> "CfgSurvival" >> "Inventory" >> "Default");
|
||||
_mags = getArray (_config >> "magazines");
|
||||
_wpns = getArray (_config >> "weapons");
|
||||
_bcpk = getText (_config >> "backpack");
|
||||
|
||||
if(!isNil "DefaultMagazines") then {
|
||||
_mags = DefaultMagazines;
|
||||
};
|
||||
if(!isNil "DefaultWeapons") then {
|
||||
_wpns = DefaultWeapons;
|
||||
};
|
||||
if(!isNil "DefaultBackpack") then {
|
||||
_bcpk = DefaultBackpack;
|
||||
};
|
||||
//_randomSpot = true;
|
||||
|
||||
//Wait for HIVE to be free
|
||||
_key = format["CHILD:203:%1:%2:%3:",_charID,[_wpns,_mags],[_bcpk,[],[]]];
|
||||
_key call server_hiveWrite;
|
||||
};
|
||||
};
|
||||
diag_log ("LOGIN LOADED: " + str(_playerObj) + " Type: " + (typeOf _playerObj));
|
||||
|
||||
_isHiveOk = false; //EDITED
|
||||
if (_hiveVer >= dayz_hiveVersionNo) then {
|
||||
_isHiveOk = true;
|
||||
};
|
||||
//diag_log ("SERVER RESULT: " + str("X") + " " + str(dayz_hiveVersionNo));
|
||||
|
||||
//Server publishes variable to clients and WAITS
|
||||
//_playerObj setVariable ["publish",[_charID,_inventory,_backpack,_survival,_isNew,dayz_versionNo,_model,_isHiveOk,_newPlayer],true];
|
||||
|
||||
dayzPlayerLogin = [_charID,_inventory,_backpack,_survival,_isNew,dayz_versionNo,_model,_isHiveOk,_newPlayer,_isInfected];
|
||||
if(!isNull _playerObj) then {
|
||||
(owner _playerObj) publicVariableClient "dayzPlayerLogin";
|
||||
};
|
||||
268
SQF/dayz_server/compile/server_playerSetup.sqf
Normal file
268
SQF/dayz_server/compile/server_playerSetup.sqf
Normal file
@@ -0,0 +1,268 @@
|
||||
private ["_characterID","_playerObj","_playerID","_dummy","_worldspace","_state","_doLoop","_key","_primary","_medical","_stats","_humanity","_lastinstance","_friendlies","_randomSpot","_position","_debug","_distance","_hit","_fractures","_score","_findSpot","_pos","_isIsland","_w","_clientID","_spawnMC"];
|
||||
//Wait for HIVE to be free
|
||||
//diag_log ("SETUP: attempted with " + str(_this));
|
||||
|
||||
_characterID = _this select 0;
|
||||
_playerObj = _this select 1;
|
||||
_playerID = getPlayerUID _playerObj;
|
||||
|
||||
if (isNull _playerObj) exitWith {
|
||||
diag_log ("SETUP INIT FAILED: Exiting, player object null: " + str(_playerObj));
|
||||
};
|
||||
|
||||
//Add MPHit event handler
|
||||
diag_log("Adding MPHit EH for " + str(_playerObj));
|
||||
_playerObj addMPEventHandler ["MPHit", {_this spawn fnc_plyrHit;}];
|
||||
|
||||
if (_playerID == "") then {
|
||||
_playerID = getPlayerUID _playerObj;
|
||||
};
|
||||
|
||||
if (_playerID == "") exitWith {
|
||||
diag_log ("SETUP INIT FAILED: Exiting, no player ID: " + str(_playerObj));
|
||||
};
|
||||
|
||||
private["_dummy"];
|
||||
_dummy = getPlayerUID _playerObj;
|
||||
if ( _playerID != _dummy ) then {
|
||||
diag_log format["DEBUG: _playerID miscompare with UID! _playerID:%1",_playerID];
|
||||
_playerID = _dummy;
|
||||
};
|
||||
|
||||
//Variables
|
||||
_worldspace = [];
|
||||
|
||||
_state = [];
|
||||
|
||||
//Do Connection Attempt
|
||||
_doLoop = 0;
|
||||
while {_doLoop < 5} do {
|
||||
_key = format["CHILD:102:%1:",_characterID];
|
||||
_primary = _key call server_hiveReadWrite;
|
||||
if (count _primary > 0) then {
|
||||
if ((_primary select 0) != "ERROR") then {
|
||||
_doLoop = 9;
|
||||
};
|
||||
};
|
||||
_doLoop = _doLoop + 1;
|
||||
};
|
||||
|
||||
if (isNull _playerObj or !isPlayer _playerObj) exitWith {
|
||||
diag_log ("SETUP RESULT: Exiting, player object null: " + str(_playerObj));
|
||||
};
|
||||
|
||||
//Wait for HIVE to be free
|
||||
//diag_log ("SETUP: RESULT: Successful with " + str(_primary));
|
||||
|
||||
_medical = _primary select 1;
|
||||
_stats = _primary select 2;
|
||||
_state = _primary select 3;
|
||||
_worldspace = _primary select 4;
|
||||
_humanity = _primary select 5;
|
||||
_lastinstance = _primary select 6;
|
||||
_friendlies = [];
|
||||
|
||||
//Set position
|
||||
_randomSpot = false;
|
||||
|
||||
//diag_log ("WORLDSPACE: " + str(_worldspace));
|
||||
|
||||
if (count _worldspace > 0) then {
|
||||
|
||||
_position = _worldspace select 1;
|
||||
if (count _position < 3) then {
|
||||
//prevent debug world!
|
||||
_randomSpot = true;
|
||||
};
|
||||
_debug = getMarkerpos "respawn_west";
|
||||
_distance = _debug distance _position;
|
||||
if (_distance < 2000) then {
|
||||
_randomSpot = true;
|
||||
};
|
||||
|
||||
_distance = [0,0,0] distance _position;
|
||||
if (_distance < 500) then {
|
||||
_randomSpot = true;
|
||||
};
|
||||
|
||||
// Came from another server force random spawn
|
||||
if (_lastinstance != dayZ_instance) then {
|
||||
_randomSpot = true;
|
||||
};
|
||||
|
||||
//_playerObj setPosATL _position;
|
||||
} else {
|
||||
_randomSpot = true;
|
||||
};
|
||||
|
||||
//diag_log ("LOGIN: Location: " + str(_worldspace) + " doRnd?: " + str(_randomSpot));
|
||||
|
||||
//set medical values
|
||||
if (count _medical > 0) then {
|
||||
_playerObj setVariable["USEC_isDead",(_medical select 0),true];
|
||||
_playerObj setVariable["NORRN_unconscious", (_medical select 1), true];
|
||||
_playerObj setVariable["USEC_infected",(_medical select 2),true];
|
||||
_playerObj setVariable["USEC_injured",(_medical select 3),true];
|
||||
_playerObj setVariable["USEC_inPain",(_medical select 4),true];
|
||||
_playerObj setVariable["USEC_isCardiac",(_medical select 5),true];
|
||||
_playerObj setVariable["USEC_lowBlood",(_medical select 6),true];
|
||||
_playerObj setVariable["USEC_BloodQty",(_medical select 7),true];
|
||||
|
||||
_playerObj setVariable["unconsciousTime",(_medical select 10),true];
|
||||
|
||||
// if (_playerID in dayz_disco) then {
|
||||
// _playerObj setVariable["NORRN_unconscious",true, true];
|
||||
// _playerObj setVariable["unconsciousTime",300,true];
|
||||
// } else {
|
||||
// _playerObj setVariable["unconsciousTime",(_medical select 10),true];
|
||||
// };
|
||||
|
||||
//Add Wounds
|
||||
{
|
||||
_playerObj setVariable[_x,true,true];
|
||||
//["usecBleed",[_playerObj,_x,_hit]] call broadcastRpcCallAll;
|
||||
usecBleed = [_playerObj,_x,_hit];
|
||||
publicVariable "usecBleed";
|
||||
} forEach (_medical select 8);
|
||||
|
||||
//Add fractures
|
||||
_fractures = (_medical select 9);
|
||||
_playerObj setVariable ["hit_legs",(_fractures select 0),true];
|
||||
_playerObj setVariable ["hit_hands",(_fractures select 1),true];
|
||||
|
||||
if (count _medical > 11) then {
|
||||
//Additional medical stats
|
||||
_playerObj setVariable ["messing",(_medical select 11),true];
|
||||
};
|
||||
|
||||
} else {
|
||||
//Reset Fractures
|
||||
_playerObj setVariable ["hit_legs",0,true];
|
||||
_playerObj setVariable ["hit_hands",0,true];
|
||||
_playerObj setVariable ["USEC_injured",false,true];
|
||||
_playerObj setVariable ["USEC_inPain",false,true];
|
||||
_playerObj setVariable ["messing",[0,0],true];
|
||||
};
|
||||
|
||||
if (count _stats > 0) then {
|
||||
//register stats
|
||||
_playerObj setVariable["zombieKills",(_stats select 0),true];
|
||||
_playerObj setVariable["headShots",(_stats select 1),true];
|
||||
_playerObj setVariable["humanKills",(_stats select 2),true];
|
||||
_playerObj setVariable["banditKills",(_stats select 3),true];
|
||||
_playerObj addScore (_stats select 1);
|
||||
|
||||
//Save Score
|
||||
_score = score _playerObj;
|
||||
_playerObj addScore ((_stats select 0) - _score);
|
||||
|
||||
//record for Server JIP checks
|
||||
_playerObj setVariable["zombieKills_CHK",(_stats select 0)];
|
||||
_playerObj setVariable["headShots_CHK",(_stats select 1)];
|
||||
_playerObj setVariable["humanKills_CHK",(_stats select 2)];
|
||||
_playerObj setVariable["banditKills_CHK",(_stats select 3)];
|
||||
if (count _stats > 4) then {
|
||||
if (!(_stats select 3)) then {
|
||||
_playerObj setVariable["selectSex",true,true];
|
||||
};
|
||||
} else {
|
||||
_playerObj setVariable["selectSex",true,true];
|
||||
};
|
||||
} else {
|
||||
//Save initial loadout
|
||||
//register stats
|
||||
_playerObj setVariable["zombieKills",0,true];
|
||||
_playerObj setVariable["humanKills",0,true];
|
||||
_playerObj setVariable["banditKills",0,true];
|
||||
_playerObj setVariable["headShots",0,true];
|
||||
|
||||
//record for Server JIP checks
|
||||
_playerObj setVariable["zombieKills_CHK",0];
|
||||
_playerObj setVariable["humanKills_CHK",0,true];
|
||||
_playerObj setVariable["banditKills_CHK",0,true];
|
||||
_playerObj setVariable["headShots_CHK",0];
|
||||
};
|
||||
|
||||
if (_randomSpot) then {
|
||||
private["_counter","_position","_isNear","_isZero","_mkr"];
|
||||
if (!isDedicated) then {
|
||||
endLoadingScreen;
|
||||
};
|
||||
|
||||
|
||||
//Spawn modify via mission init.sqf
|
||||
if(isnil "spawnArea") then {
|
||||
spawnArea = 1500;
|
||||
};
|
||||
if(isnil "spawnShoremode") then {
|
||||
spawnShoremode = 1;
|
||||
};
|
||||
if(isnil "spawnMarkerCount") then {
|
||||
spawnMarkerCount = 4;
|
||||
};
|
||||
|
||||
// The wiki states floor has a uniform distribution but will not reach the last number so we add +1
|
||||
_spawnMC = spawnMarkerCount + 1;
|
||||
|
||||
//spawn into random
|
||||
_findSpot = true;
|
||||
_mkr = "";
|
||||
while {_findSpot} do {
|
||||
_counter = 0;
|
||||
while {_counter < 20 and _findSpot} do {
|
||||
// switched to floor
|
||||
_mkr = "spawn" + str(floor(random _spawnMC));
|
||||
_position = ([(getMarkerPos _mkr),0,spawnArea,10,0,2000,spawnShoremode] call BIS_fnc_findSafePos);
|
||||
_isNear = count (_position nearEntities ["Man",100]) == 0;
|
||||
_isZero = ((_position select 0) == 0) and ((_position select 1) == 0);
|
||||
//Island Check //TeeChange
|
||||
_pos = _position;
|
||||
_isIsland = false; //Can be set to true during the Check
|
||||
for [{_w=0},{_w<=150},{_w=_w+2}] do {
|
||||
_pos = [(_pos select 0),((_pos select 1) + _w),(_pos select 2)];
|
||||
if(surfaceisWater _pos) exitWith {
|
||||
_isIsland = true;
|
||||
};
|
||||
};
|
||||
|
||||
if ((_isNear and !_isZero) || _isIsland) then {_findSpot = false};
|
||||
_counter = _counter + 1;
|
||||
};
|
||||
};
|
||||
_isZero = ((_position select 0) == 0) and ((_position select 1) == 0);
|
||||
_position = [_position select 0,_position select 1,0];
|
||||
if (!_isZero) then {
|
||||
//_playerObj setPosATL _position;
|
||||
_worldspace = [0,_position];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
//Record player for management
|
||||
dayz_players set [count dayz_players,_playerObj];
|
||||
|
||||
//record player pos locally for server checking
|
||||
_playerObj setVariable["characterID",_characterID,true];
|
||||
_playerObj setVariable["humanity",_humanity,true];
|
||||
_playerObj setVariable["humanity_CHK",_humanity];
|
||||
//_playerObj setVariable["worldspace",_worldspace,true];
|
||||
//_playerObj setVariable["state",_state,true];
|
||||
_playerObj setVariable["lastPos",getPosATL _playerObj];
|
||||
_playerObj setVariable["friendlies",_friendlies,true];
|
||||
|
||||
dayzPlayerLogin2 = [_worldspace,_state];
|
||||
_clientID = owner _playerObj;
|
||||
if(!isNull _playerObj) then {
|
||||
_clientID publicVariableClient "dayzPlayerLogin2";
|
||||
};
|
||||
|
||||
//record time started
|
||||
_playerObj setVariable ["lastTime",time];
|
||||
//_playerObj setVariable ["model_CHK",typeOf _playerObj];
|
||||
|
||||
diag_log ("LOGIN PUBLISHING: " + str(_playerObj) + " Type: " + (typeOf _playerObj));
|
||||
|
||||
dayzLogin = null;
|
||||
dayzLogin2 = null;
|
||||
|
||||
//Save Login
|
||||
4
SQF/dayz_server/compile/server_playerStat.sqf
Normal file
4
SQF/dayz_server/compile/server_playerStat.sqf
Normal file
@@ -0,0 +1,4 @@
|
||||
private ["_unit","_variable","_change"];
|
||||
_unit = _this select 0;
|
||||
_variable = _this select 1;
|
||||
_change = _this select 2;
|
||||
221
SQF/dayz_server/compile/server_playerSync.sqf
Normal file
221
SQF/dayz_server/compile/server_playerSync.sqf
Normal file
@@ -0,0 +1,221 @@
|
||||
private ["_character","_magazines","_force","_characterID","_charPos","_isInVehicle","_timeSince","_humanity","_debug","_distance","_isNewMed","_isNewPos","_isNewGear","_playerPos","_playerGear","_playerBackp","_medical","_distanceFoot","_lastPos","_backpack","_kills","_killsB","_killsH","_headShots","_lastTime","_timeGross","_timeLeft","_currentWpn","_currentAnim","_config","_onLadder","_isTerminal","_currentModel","_modelChk","_muzzles","_temp","_currentState","_array","_key","_pos","_forceGear"];
|
||||
//[player,array]
|
||||
//diag_log ("UPDATE: " + str(_this) );
|
||||
|
||||
//waituntil {(typeName(_this) == "ARRAY");sleep 0.01;}; //seems to cause often infinite waits (but not for first n players)
|
||||
|
||||
//this only happens when we don't follow the correct parameter format...
|
||||
//(like supplying just the player object instead of the array in player_eat.sqf)
|
||||
//i've fixed this in player_eat so i can comment this part out
|
||||
/*if ( typeName(_this) == "OBJECT" ) then {
|
||||
_this = [_this,[],true];
|
||||
//diag_log ("DW_DEBUG: #manual fix _this: " + str(_this));
|
||||
};*/
|
||||
|
||||
//correct
|
||||
//"UPDATE: [B 1-1-B:1 (THE BEAST) REMOTE,[],true]"
|
||||
//error
|
||||
//"UPDATE: B 1-1-B:1 (THE BEAST) REMOTE"
|
||||
|
||||
_character = _this select 0;
|
||||
_magazines = _this select 1;
|
||||
//_force = _this select 2;
|
||||
_forceGear = _this select 3;
|
||||
_force = true;
|
||||
|
||||
_characterID = _character getVariable ["characterID","0"];
|
||||
_charPos = getPosATL _character;
|
||||
_isInVehicle = vehicle _character != _character;
|
||||
_timeSince = 0;
|
||||
_humanity = 0;
|
||||
|
||||
//diag_log ("DW_DEBUG: (isnil _characterID): " + str(isnil "_characterID"));
|
||||
/*
|
||||
if !(isnil "_characterID") then {
|
||||
diag_log ("DW_DEBUG: _characterID: " + str(_characterID));
|
||||
};
|
||||
*/
|
||||
|
||||
if (_character isKindOf "Animal") exitWith {
|
||||
diag_log ("ERROR: Cannot Sync Character " + (name _character) + " is an Animal class");
|
||||
};
|
||||
|
||||
if (isnil "_characterID") exitWith {
|
||||
diag_log ("ERROR: Cannot Sync Character " + (name _character) + " has nil characterID");
|
||||
};
|
||||
|
||||
if (_characterID == "0") exitWith {
|
||||
diag_log ("ERROR: Cannot Sync Character " + (name _character) + " as no characterID");
|
||||
};
|
||||
|
||||
private["_debug","_distance"];
|
||||
_debug = getMarkerpos "respawn_west";
|
||||
_distance = _debug distance _charPos;
|
||||
if (_distance < 2000) exitWith {
|
||||
diag_log format["ERROR: server_playerSync: Cannot Sync Player %1 [%2]. Position in debug! %3",name _character,_characterID,_charPos];
|
||||
};
|
||||
|
||||
//Check for server initiated updates
|
||||
_isNewMed = _character getVariable["medForceUpdate",false]; //Med Update is forced when a player receives some kind of med incident
|
||||
_isNewPos = _character getVariable["posForceUpdate",false]; //Med Update is forced when a player receives some kind of med incident
|
||||
_isNewGear = (count _magazines) > 0;
|
||||
|
||||
//diag_log ("Starting Save... MED: " + str(_isNewMed) + " / POS: " + str(_isNewPos)); sleep 0.05;
|
||||
|
||||
//Check for player initiated updates
|
||||
if (_characterID != "0") then {
|
||||
_playerPos = [];
|
||||
_playerGear = [];
|
||||
_playerBackp = [];
|
||||
_medical = [];
|
||||
_distanceFoot = 0;
|
||||
|
||||
//diag_log ("Found Character...");
|
||||
|
||||
//Check if update is requested
|
||||
if (_isNewPos or _force) then {
|
||||
//diag_log ("position..." + str(_isNewPos) + " / " + str(_force)); sleep 0.05;
|
||||
if (((_charPos select 0) == 0) and ((_charPos select 1) == 0)) then {
|
||||
//Zero Position
|
||||
} else {
|
||||
//diag_log ("getting position..."); sleep 0.05;
|
||||
_playerPos = [round(direction _character),_charPos];
|
||||
_lastPos = _character getVariable["lastPos",_charPos];
|
||||
if (count _lastPos > 2 and count _charPos > 2) then {
|
||||
if (!_isInVehicle) then {
|
||||
_distanceFoot = round(_charPos distance _lastPos);
|
||||
};
|
||||
_character setVariable["lastPos",_charPos];
|
||||
};
|
||||
if (count _charPos < 3) then {
|
||||
_playerPos = [];
|
||||
};
|
||||
//diag_log ("position = " + str(_playerPos)); sleep 0.05;
|
||||
};
|
||||
_character setVariable ["posForceUpdate",false,true];
|
||||
};
|
||||
if (_isNewGear or _forceGear) then {
|
||||
//diag_log ("gear..."); sleep 0.05;
|
||||
_playerGear = [weapons _character,_magazines];
|
||||
//diag_log ("playerGear: " +str(_playerGear));
|
||||
_backpack = unitBackpack _character;
|
||||
_playerBackp = [typeOf _backpack,getWeaponCargo _backpack,getMagazineCargo _backpack];
|
||||
};
|
||||
if (_isNewMed or _force) then {
|
||||
//diag_log ("medical..."); sleep 0.05;
|
||||
if (!(_character getVariable["USEC_isDead",false])) then {
|
||||
//diag_log ("medical check..."); sleep 0.05;
|
||||
_medical = _character call player_sumMedical;
|
||||
//diag_log ("medical result..." + str(_medical)); sleep 0.05;
|
||||
};
|
||||
_character setVariable ["medForceUpdate",false,true];
|
||||
};
|
||||
|
||||
//Process update
|
||||
if (_characterID != "0") then {
|
||||
//Record stats while we're here
|
||||
/*
|
||||
Check previous stats against what client had when they logged in
|
||||
this helps prevent JIP issues, where a new player wouldn't have received
|
||||
the old players updates. Only valid for stats where clients could have
|
||||
be recording results from their local objects (such as agent zombies)
|
||||
*/
|
||||
_kills = ["zombieKills",_character] call server_getDiff;
|
||||
_killsB = ["banditKills",_character] call server_getDiff;
|
||||
_killsH = ["humanKills",_character] call server_getDiff;
|
||||
_headShots = ["headShots",_character] call server_getDiff;
|
||||
_humanity = ["humanity",_character] call server_getDiff2;
|
||||
//_humanity = _character getVariable ["humanity",0];
|
||||
_character addScore _kills;
|
||||
/*
|
||||
Assess how much time has passed, for recording total time on server
|
||||
*/
|
||||
_lastTime = _character getVariable["lastTime",time];
|
||||
_timeGross = (time - _lastTime);
|
||||
_timeSince = floor(_timeGross / 60);
|
||||
_timeLeft = (_timeGross - (_timeSince * 60));
|
||||
/*
|
||||
Get character state details
|
||||
*/
|
||||
_currentWpn = currentMuzzle _character;
|
||||
_currentAnim = animationState _character;
|
||||
_config = configFile >> "CfgMovesMaleSdr" >> "States" >> _currentAnim;
|
||||
_onLadder = (getNumber (_config >> "onLadder")) == 1;
|
||||
_isTerminal = (getNumber (_config >> "terminal")) == 1;
|
||||
//_wpnDisabled = (getNumber (_config >> "disableWeapons")) == 1;
|
||||
_currentModel = typeOf _character;
|
||||
_modelChk = _character getVariable ["model_CHK",""];
|
||||
if (_currentModel == _modelChk) then {
|
||||
_currentModel = "";
|
||||
} else {
|
||||
_currentModel = str(_currentModel);
|
||||
_character setVariable ["model_CHK",typeOf _character];
|
||||
};
|
||||
|
||||
if (_onLadder or _isInVehicle or _isTerminal) then {
|
||||
_currentAnim = "";
|
||||
//If position to be updated, make sure it is at ground level!
|
||||
if ((count _playerPos > 0) and !_isTerminal) then {
|
||||
_charPos set [2,0];
|
||||
_playerPos set[1,_charPos];
|
||||
};
|
||||
};
|
||||
if (_isInVehicle) then {
|
||||
_currentWpn = "";
|
||||
} else {
|
||||
if ( typeName(_currentWpn) == "STRING" ) then {
|
||||
_muzzles = getArray(configFile >> "cfgWeapons" >> _currentWpn >> "muzzles");
|
||||
if (count _muzzles > 1) then {
|
||||
_currentWpn = currentMuzzle _character;
|
||||
};
|
||||
} else {
|
||||
//diag_log ("DW_DEBUG: _currentWpn: " + str(_currentWpn));
|
||||
_currentWpn = "";
|
||||
};
|
||||
};
|
||||
_temp = round(_character getVariable ["temperature",100]);
|
||||
_currentState = [_currentWpn,_currentAnim,_temp];
|
||||
/*
|
||||
Everything is ready, now publish to HIVE
|
||||
*/
|
||||
if (count _playerPos > 0) then {
|
||||
_array = [];
|
||||
{
|
||||
if (_x > dayz_minpos and _x < dayz_maxpos) then {
|
||||
_array set [count _array,_x];
|
||||
};
|
||||
} forEach (_playerPos select 1);
|
||||
_playerPos set [1,_array];
|
||||
};
|
||||
if (!isNull _character) then {
|
||||
if (alive _character) then {
|
||||
//Wait for HIVE to be free
|
||||
//Send request
|
||||
_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,_kills,_headShots,_distanceFoot,_timeSince,_currentState,_killsH,_killsB,_currentModel,_humanity];
|
||||
//diag_log ("HIVE: WRITE: "+ str(_key) + " / " + _characterID);
|
||||
_key call server_hiveWrite;
|
||||
};
|
||||
};
|
||||
|
||||
// If player is in a vehicle, keep its position updated
|
||||
if (vehicle _character != _character) then {
|
||||
// [vehicle _character, "position"] call server_updateObject;
|
||||
if (!(vehicle _character in needUpdate_objects)) then {
|
||||
//diag_log format["DEBUG: Added to NeedUpdate=%1",_object];
|
||||
needUpdate_objects set [count needUpdate_objects, vehicle _character];
|
||||
};
|
||||
};
|
||||
|
||||
// Force gear updates for nearby vehicles/tents
|
||||
_pos = _this select 0;
|
||||
{
|
||||
[_x, "gear"] call server_updateObject;
|
||||
} forEach nearestObjects [_pos, dayz_updateObjects, 10];
|
||||
//[_charPos] call server_updateNearbyObjects;
|
||||
|
||||
//Reset timer
|
||||
if (_timeSince > 0) then {
|
||||
_character setVariable ["lastTime",(time - _timeLeft)];
|
||||
};
|
||||
};
|
||||
};
|
||||
31
SQF/dayz_server/compile/server_publishObject.sqf
Normal file
31
SQF/dayz_server/compile/server_publishObject.sqf
Normal file
@@ -0,0 +1,31 @@
|
||||
private ["_class","_uid","_charID","_object","_worldspace","_key","_allowed"];
|
||||
//[dayz_characterID,_tent,[_dir,_location],"TentStorage"]
|
||||
_charID = _this select 0;
|
||||
_object = _this select 1;
|
||||
_worldspace = _this select 2;
|
||||
_class = _this select 3;
|
||||
|
||||
_allowed = [_object, "Server"] call check_publishobject;
|
||||
if (!_allowed) exitWith { deleteVehicle _object; };
|
||||
|
||||
//diag_log ("PUBLISH: Attempt " + str(_object));
|
||||
|
||||
//get UID
|
||||
_uid = _worldspace call dayz_objectUID2;
|
||||
|
||||
//Send request
|
||||
_key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, 0 , _charID, _worldspace, [], [], 0,_uid];
|
||||
//diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_key call server_hiveWrite;
|
||||
|
||||
_object setVariable ["lastUpdate",time];
|
||||
_object setVariable ["ObjectUID", _uid,true];
|
||||
// _object setVariable ["characterID",_charID,true];
|
||||
|
||||
_object addMPEventHandler ["MPKilled",{_this call object_handleServerKilled;}];
|
||||
// Test disabling simulation server side on buildables only.
|
||||
_object enableSimulation false;
|
||||
|
||||
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object];
|
||||
|
||||
//diag_log ("PUBLISH: Created " + (_class) + " with ID " + _uid);
|
||||
122
SQF/dayz_server/compile/server_publishVehicle.sqf
Normal file
122
SQF/dayz_server/compile/server_publishVehicle.sqf
Normal file
@@ -0,0 +1,122 @@
|
||||
private ["_object","_worldspace","_location","_dir","_class","_uid","_dam","_hitpoints","_selection","_array","_damage","_fuel","_key","_totaldam","_spawnDMG","_characterID"];
|
||||
//[_veh,[_dir,_location],"V3S_Civ",true]
|
||||
_object = _this select 0;
|
||||
_worldspace = _this select 1;
|
||||
_class = _this select 2;
|
||||
_spawnDMG = _this select 3;
|
||||
_characterID = _this select 4;
|
||||
|
||||
_fuel = 1;
|
||||
_damage = 0;
|
||||
_array = [];
|
||||
|
||||
diag_log ("PUBLISH: Attempt " + str(_object));
|
||||
_dir = _worldspace select 0;
|
||||
_location = _worldspace select 1;
|
||||
|
||||
//Generate UID test using time
|
||||
// _uid = str( round (dateToNumber date)) + str(round time);
|
||||
_uid = _worldspace call dayz_objectUID2;
|
||||
//_uid = format["%1%2",(round time),_uid];
|
||||
|
||||
if (_spawnDMG) then {
|
||||
_fuel = 0;
|
||||
if (getNumber(configFile >> "CfgVehicles" >> _class >> "isBicycle") != 1) then {
|
||||
|
||||
// Create randomly damaged parts
|
||||
|
||||
_totaldam = 0;
|
||||
_hitpoints = _object call vehicle_getHitpoints;
|
||||
{
|
||||
// generate damage on all parts
|
||||
_dam = call generate_new_damage;
|
||||
|
||||
_selection = getText(configFile >> "cfgVehicles" >> _class >> "HitPoints" >> _x >> "name");
|
||||
|
||||
if (_dam > 0) then {
|
||||
_array set [count _array,[_selection,_dam]];
|
||||
_totaldam = _totaldam + _dam;
|
||||
};
|
||||
} forEach _hitpoints;
|
||||
|
||||
|
||||
// just set low base dmg - may change later
|
||||
_damage = 0;
|
||||
|
||||
// New fuel min max
|
||||
_fuel = (random(DynamicVehicleFuelHigh-DynamicVehicleFuelLow)+DynamicVehicleFuelLow) / 100;
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
// TODO: check if uid already exists and if so increment by 1 and check again as soon as we find nothing continue.
|
||||
|
||||
//Send request
|
||||
_key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, _damage , _characterID, _worldspace, [], _array, _fuel,_uid];
|
||||
diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_key call server_hiveWrite;
|
||||
|
||||
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object];
|
||||
|
||||
// Switched to spawn so we can wait a bit for the ID
|
||||
[_object,_uid,_fuel,_damage,_array,_characterID,_class] spawn {
|
||||
private["_object","_uid","_fuel","_damage","_array","_characterID","_done","_retry","_key","_result","_outcome","_oid","_selection","_dam","_class"];
|
||||
|
||||
_object = _this select 0;
|
||||
_uid = _this select 1;
|
||||
_fuel = _this select 2;
|
||||
_damage = _this select 3;
|
||||
_array = _this select 4;
|
||||
_characterID = _this select 5;
|
||||
_class = _this select 6;
|
||||
|
||||
_done = false;
|
||||
_retry = 0;
|
||||
// TODO: Needs major overhaul
|
||||
while {_retry < 10} do {
|
||||
|
||||
sleep 1;
|
||||
// GET DB ID
|
||||
_key = format["CHILD:388:%1:",_uid];
|
||||
diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_result = _key call server_hiveReadWrite;
|
||||
_outcome = _result select 0;
|
||||
if (_outcome == "PASS") then {
|
||||
_oid = _result select 1;
|
||||
_object setVariable ["ObjectID", _oid, true];
|
||||
diag_log("CUSTOM: Selected " + str(_oid));
|
||||
_done = true;
|
||||
_retry = 100;
|
||||
|
||||
} else {
|
||||
diag_log("CUSTOM: trying again to get id for: " + str(_uid));
|
||||
_done = false;
|
||||
_retry = _retry + 1;
|
||||
};
|
||||
};
|
||||
if(!_done) exitWith { deleteVehicle _object; diag_log("CUSTOM: failed to get id for : " + str(_uid)); };
|
||||
|
||||
_object setVariable ["lastUpdate",time];
|
||||
_object setVariable ["CharacterID", _characterID, true];
|
||||
_object setDamage _damage;
|
||||
|
||||
// Set Hits after ObjectID is set
|
||||
{
|
||||
_selection = _x select 0;
|
||||
_dam = _x select 1;
|
||||
if (_selection in dayZ_explosiveParts and _dam > 0.8) then {_dam = 0.8};
|
||||
[_object,_selection,_dam] call object_setFixServer;
|
||||
} forEach _array;
|
||||
|
||||
_object setFuel _fuel;
|
||||
|
||||
_object setvelocity [0,0,1];
|
||||
|
||||
_object call fnc_vehicleEventHandler;
|
||||
|
||||
// testing - should make sure everyone has eventhandlers for vehicles was unused...
|
||||
dayzVehicleInit = _object;
|
||||
publicVariable "dayzVehicleInit";
|
||||
|
||||
diag_log ("PUBLISH: Created " + (_class) + " with ID " + str(_uid));
|
||||
};
|
||||
112
SQF/dayz_server/compile/server_publishVehicle2.sqf
Normal file
112
SQF/dayz_server/compile/server_publishVehicle2.sqf
Normal file
@@ -0,0 +1,112 @@
|
||||
private ["_isOK","_object","_worldspace","_location","_dir","_class","_uid","_key","_keySelected","_characterID"];
|
||||
|
||||
_object = _this select 0;
|
||||
_worldspace = _this select 1;
|
||||
_class = _this select 2;
|
||||
// _spawnDMG = _this select 3;
|
||||
_keySelected = _this select 4;
|
||||
|
||||
_isOK = isClass(configFile >> "CfgWeapons" >> _keySelected);
|
||||
if(!_isOK) exitWith { diag_log ("HIVE: CARKEY DOES NOT EXIST: "+ str(_keySelected)); };
|
||||
|
||||
_characterID = str(getNumber(configFile >> "CfgWeapons" >> _keySelected >> "keyid"));
|
||||
|
||||
diag_log ("PUBLISH: Attempt " + str(_object));
|
||||
_dir = _worldspace select 0;
|
||||
_location = _worldspace select 1;
|
||||
|
||||
//Generate UID test using time
|
||||
_uid = _worldspace call dayz_objectUID3;
|
||||
|
||||
// TODO: check if uid already exists and if so increment by 1 and check again as soon as we find nothing continue.
|
||||
|
||||
//Send request
|
||||
_key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, 0 , _characterID, _worldspace, [], [], 1,_uid];
|
||||
diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_key call server_hiveWrite;
|
||||
|
||||
// Switched to spawn so we can wait a bit for the ID
|
||||
[_object,_uid,_characterID,_class,_dir,_location] spawn {
|
||||
private ["_object","_uid","_characterID","_done","_retry","_key","_result","_outcome","_oid","_class","_location","_object_para"];
|
||||
|
||||
_object = _this select 0;
|
||||
_uid = _this select 1;
|
||||
_characterID = _this select 2;
|
||||
_class = _this select 3;
|
||||
//_dir = _this select 4;
|
||||
_location = _this select 5;
|
||||
|
||||
_done = false;
|
||||
_retry = 0;
|
||||
// TODO: Needs major overhaul for 1.1
|
||||
while {_retry < 10} do {
|
||||
|
||||
sleep 1;
|
||||
// GET DB ID
|
||||
_key = format["CHILD:388:%1:",_uid];
|
||||
diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_result = _key call server_hiveReadWrite;
|
||||
_outcome = _result select 0;
|
||||
if (_outcome == "PASS") then {
|
||||
_oid = _result select 1;
|
||||
//_object setVariable ["ObjectID", _oid, true];
|
||||
diag_log("CUSTOM: Selected " + str(_oid));
|
||||
_done = true;
|
||||
_retry = 100;
|
||||
|
||||
} else {
|
||||
diag_log("CUSTOM: trying again to get id for: " + str(_uid));
|
||||
_done = false;
|
||||
_retry = _retry + 1;
|
||||
};
|
||||
};
|
||||
|
||||
// Remove marker
|
||||
deleteVehicle _object;
|
||||
|
||||
if(!_done) exitWith { diag_log("CUSTOM: failed to get id for : " + str(_uid)); };
|
||||
|
||||
if(DZE_TRADER_SPAWNMODE) then {
|
||||
_object_para = "ParachuteMediumWest" createVehicle [0,0,0];
|
||||
_object_para setpos [_location select 0, _location select 1,(_location select 2) + 65];
|
||||
_object = createVehicle [_class, [0,0,0], [], 0, "CAN_COLLIDE"];
|
||||
} else {
|
||||
_object = createVehicle [_class, _location, [], 0, "CAN_COLLIDE"];
|
||||
};
|
||||
|
||||
// Lock vehicle
|
||||
_object setvehiclelock "locked";
|
||||
|
||||
clearWeaponCargoGlobal _object;
|
||||
clearMagazineCargoGlobal _object;
|
||||
|
||||
_object allowDamage false;
|
||||
|
||||
_object setVariable ["ObjectID", _oid, true];
|
||||
|
||||
_object setVariable ["lastUpdate",time];
|
||||
|
||||
_object setVariable ["CharacterID", _characterID, true];
|
||||
|
||||
if(DZE_TRADER_SPAWNMODE) then {
|
||||
_object attachTo [_object_para, [0,0,-1.6]];
|
||||
sleep 1.0;
|
||||
WaitUntil{(getpos _object select 2) < 0.1};
|
||||
detach _object;
|
||||
deleteVehicle _object_para;
|
||||
};
|
||||
|
||||
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object];
|
||||
|
||||
_object call fnc_vehicleEventHandler;
|
||||
|
||||
// for non JIP users this should make sure everyone has eventhandlers for vehicles.
|
||||
dayzVehicleInit = _object;
|
||||
publicVariable "dayzVehicleInit";
|
||||
|
||||
diag_log ("PUBLISH: Created " + (_class) + " with ID " + str(_uid));
|
||||
|
||||
sleep 1.0;
|
||||
|
||||
_object allowDamage true;
|
||||
};
|
||||
14
SQF/dayz_server/compile/server_routinePlayerCheck.sqf
Normal file
14
SQF/dayz_server/compile/server_routinePlayerCheck.sqf
Normal file
@@ -0,0 +1,14 @@
|
||||
private["_unitArray","_handle"];
|
||||
_unitArray = [];
|
||||
if (isSinglePlayer) then {
|
||||
_unitArray = [player];
|
||||
} else {
|
||||
_unitArray = dayz_players;
|
||||
};
|
||||
{
|
||||
if (!isNull _x) then {
|
||||
//diag_log ("SERVER: Routine Player Check: " + str(_x));
|
||||
_handle = _x spawn server_updatePlayer;
|
||||
waitUntil{scriptDone _handle};
|
||||
};
|
||||
} forEach _unitArray;
|
||||
124
SQF/dayz_server/compile/server_spawnCrashSite.sqf
Normal file
124
SQF/dayz_server/compile/server_spawnCrashSite.sqf
Normal file
@@ -0,0 +1,124 @@
|
||||
private ["_position","_num","_config","_itemType","_weights","_index","_crashModel","_lootTable","_guaranteedLoot","_randomizedLoot","_frequency","_variance","_spawnChance","_spawnMarker","_spawnRadius","_spawnFire","_crashName","_nearby","_itemTypes","_cntWeights","_fadeFire"];
|
||||
|
||||
//_crashModel = _this select 0;
|
||||
//_lootTable = _this select 1;
|
||||
_guaranteedLoot = _this select 0;
|
||||
_randomizedLoot = _this select 1;
|
||||
_frequency = _this select 2;
|
||||
_variance = _this select 3;
|
||||
_spawnChance = _this select 4;
|
||||
_spawnMarker = _this select 5;
|
||||
_spawnRadius = _this select 6;
|
||||
_spawnFire = _this select 7;
|
||||
_fadeFire = _this select 8;
|
||||
|
||||
|
||||
diag_log("CRASHSPAWNER: Starting spawn logic for Crash Spawner");
|
||||
|
||||
while {true} do {
|
||||
private["_timeAdjust","_timeToSpawn","_spawnRoll","_crash","_hasAdjustment","_newHeight","_adjustedPos"];
|
||||
// Allows the variance to act as +/- from the spawn frequency timer
|
||||
_timeAdjust = round(random(_variance * 2) - _variance);
|
||||
_timeToSpawn = time + _frequency + _timeAdjust;
|
||||
|
||||
//Adding some Random systems
|
||||
_crashModel = ["UH60Wreck_DZ","UH1Wreck_DZ","Mass_grave_DZ"] call BIS_fnc_selectRandom;
|
||||
|
||||
|
||||
if(_crashModel == "Mass_grave_DZ") then {
|
||||
_lootTable = "MassGrave";
|
||||
} else {
|
||||
//Crash loot just uncomment the one you wish to use by default with 50cals is enabled.
|
||||
//Table including 50 cals
|
||||
_lootTable = ["Military","HeliCrash","MilitarySpecial"] call BIS_fnc_selectRandom;
|
||||
//Table without 50 cals
|
||||
//_lootTable = ["Military","HeliCrash_No50s","MilitarySpecial"] call BIS_fnc_selectRandom;
|
||||
};
|
||||
|
||||
_crashName = getText (configFile >> "CfgVehicles" >> _crashModel >> "displayName");
|
||||
|
||||
diag_log(format["CRASHSPAWNER: %1%2 chance to spawn '%3' with loot table '%4' at %5", round(_spawnChance * 100), '%', _crashName, _lootTable, _timeToSpawn]);
|
||||
|
||||
// Apprehensive about using one giant long sleep here given server time variances over the life of the server daemon
|
||||
while {time < _timeToSpawn} do {
|
||||
sleep 5;
|
||||
};
|
||||
|
||||
_spawnRoll = random 1;
|
||||
|
||||
// Percentage roll
|
||||
if (_spawnRoll <= _spawnChance) then {
|
||||
|
||||
_position = [getMarkerPos _spawnMarker,0,_spawnRadius,10,0,2000,0] call BIS_fnc_findSafePos;
|
||||
|
||||
diag_log(format["CRASHSPAWNER: Spawning '%1' with loot table '%2' NOW! (%3) at: %4", _crashName, _lootTable, time, str(_position)]);
|
||||
|
||||
_crash = createVehicle [_crashModel,_position, [], 0, "CAN_COLLIDE"];
|
||||
// Randomize the direction the wreck is facing
|
||||
_crash setDir round(random 360);
|
||||
|
||||
// Using "custom" wrecks (using the destruction model of a vehicle vs. a prepared wreck model) will result
|
||||
// in the model spawning halfway in the ground. To combat this, an OPTIONAL configuration can be tied to
|
||||
// the CfgVehicles class you've created for the custom wreck to define how high above the ground it should
|
||||
// spawn. This is optional.
|
||||
_config = configFile >> "CfgVehicles" >> _crashModel >> "heightAdjustment";
|
||||
_hasAdjustment = isNumber(_config);
|
||||
_newHeight = 0;
|
||||
if (_hasAdjustment) then {
|
||||
_newHeight = getNumber(_config);
|
||||
//diag_log(format["DIAG: ADJUSTMENT FOUND FOR %1, IT IS: %2", _crashName, _newHeight]);
|
||||
};
|
||||
|
||||
// Must setPos after a setDir otherwise the wreck won't level itself with the terrain
|
||||
_adjustedPos = [(_position select 0), (_position select 1), _newHeight];
|
||||
//diag_log(format["DIAG: Designated Position: %1", str(_adjustedPos)]);
|
||||
_crash setPos _adjustedPos;
|
||||
|
||||
// I don't think this is needed (you can't get "in" a crash), but it was in the original DayZ Crash logic
|
||||
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_crash];
|
||||
|
||||
_crash setVariable ["ObjectID","1",true];
|
||||
|
||||
// Disable simulation server side
|
||||
_crash enableSimulation false;
|
||||
|
||||
_num = round(random _randomizedLoot) + _guaranteedLoot;
|
||||
|
||||
if(_crashModel == "Mass_grave_DZ") then {
|
||||
_spawnFire = false;
|
||||
_num = _num * 2;
|
||||
};
|
||||
|
||||
if (_spawnFire) then {
|
||||
//["dayzFire",[_crash,2,time,false,_fadeFire]] call broadcastRpcCallAll;
|
||||
dayzFire = [_crash,2,time,false,_fadeFire];
|
||||
publicVariable "dayzFire";
|
||||
_crash setvariable ["fadeFire",_fadeFire,true];
|
||||
};
|
||||
|
||||
|
||||
|
||||
_config = configFile >> "CfgBuildingLoot" >> _lootTable;
|
||||
_itemTypes = [] + getArray (_config >> "itemType");
|
||||
_index = dayz_CBLBase find toLower(_lootTable);
|
||||
_weights = dayz_CBLChances select _index;
|
||||
_cntWeights = count _weights;
|
||||
|
||||
for "_x" from 1 to _num do {
|
||||
//create loot
|
||||
_index = floor(random _cntWeights);
|
||||
_index = _weights select _index;
|
||||
_itemType = _itemTypes select _index;
|
||||
[_itemType select 0, _itemType select 1, _position, 5] call spawn_loot;
|
||||
|
||||
diag_log(format["CRASHSPAWNER: Loot spawn at '%1' with loot table '%2'", _crashName, _lootTable]);
|
||||
|
||||
// ReammoBox is preferred parent class here, as WeaponHolder wouldn't match MedBox0 and other such items.
|
||||
_nearby = _position nearObjects ["ReammoBox", sizeOf(_crashModel)];
|
||||
{
|
||||
_x setVariable ["permaLoot",true];
|
||||
} forEach _nearBy;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
53
SQF/dayz_server/compile/server_spawnEvent.sqf
Normal file
53
SQF/dayz_server/compile/server_spawnEvent.sqf
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
DayZ Epoch Event Scheduler
|
||||
Usage: spawn server_spawnEvents;
|
||||
Made for DayZ Epoch please ask permission to use/edit/distrubute email vbawol@veteranbastards.com.
|
||||
*/
|
||||
|
||||
private ["_xaction","_date","_key","_result","_outcome","_proceed","_handle"];
|
||||
|
||||
diag_log("EPOCH EVENTS INIT");
|
||||
EventSchedulerLastTime = "";
|
||||
|
||||
epoch_eventIsAny = {
|
||||
private ["_boolReturn","_event","_real"];
|
||||
_event = _this select 0;
|
||||
_real = _this select 1;
|
||||
_boolReturn = false;
|
||||
if (typeName _event == "STRING") then {
|
||||
_boolReturn = (_event == "any");
|
||||
} else {
|
||||
_boolReturn = (_real == _event);
|
||||
};
|
||||
_boolReturn
|
||||
};
|
||||
|
||||
while {true} do {
|
||||
// Find current time from server
|
||||
_key = "CHILD:307:";
|
||||
_result = _key call server_hiveReadWrite;
|
||||
_outcome = _result select 0;
|
||||
if(_outcome == "PASS") then {
|
||||
_date = _result select 1;
|
||||
if (EventSchedulerLastTime != str(_date)) then {
|
||||
EventSchedulerLastTime = str(_date);
|
||||
// diag_log ("EVENTS: Local Time is: " + str(_date));
|
||||
{
|
||||
|
||||
_proceed = false;
|
||||
for "_i" from 0 to 4 do {
|
||||
_proceed = [(_x select _i),(date select _i)] call epoch_eventIsAny;
|
||||
};
|
||||
if(_proceed) then {
|
||||
_xaction = _x select 5;
|
||||
// EXECUTE SCRIPT
|
||||
diag_log ("RUNNING EVENT: " + _xaction + " on " + EventSchedulerLastTime);
|
||||
_handle = [] execVM "\z\addons\dayz_server\modules\" + _xaction + ".sqf";
|
||||
};
|
||||
sleep 0.03;
|
||||
|
||||
} forEach EpochEvents;
|
||||
};
|
||||
};
|
||||
sleep 5;
|
||||
};
|
||||
24
SQF/dayz_server/compile/server_townDeZombify.sqf
Normal file
24
SQF/dayz_server/compile/server_townDeZombify.sqf
Normal file
@@ -0,0 +1,24 @@
|
||||
private ["_position","_size","_loot","_zeds","_groups","_group","_type","_town"];
|
||||
_position = _this select 0;
|
||||
_size = _this select 1;
|
||||
_type = _this select 2;
|
||||
_town = nearestLocation [_position, _type];
|
||||
|
||||
//Clean Loot
|
||||
_loot = nearestObjects [_position, ["WeaponHolder"], _size];
|
||||
{
|
||||
deleteVehicle _x;
|
||||
} forEach _loot;
|
||||
|
||||
//Clean Zeds
|
||||
_zeds = _position nearEntities ["zZombie_Base",_size];
|
||||
_groups = [];
|
||||
{
|
||||
if (!(isNull _group)) then {
|
||||
_group = group _x;
|
||||
if (!(_group in _groups)) then {_groups set [count _groups,_group];};
|
||||
_x setDamage 1;
|
||||
};
|
||||
} forEach _zeds;
|
||||
diag_log "Dezombify Town";
|
||||
dayz_zombifiedTowns = dayz_zombifiedTowns - [_town];
|
||||
68
SQF/dayz_server/compile/server_townZombify.sqf
Normal file
68
SQF/dayz_server/compile/server_townZombify.sqf
Normal file
@@ -0,0 +1,68 @@
|
||||
private ["_town","_spot","_buildings","_list","_size","_numZeds","_impt","_position","_totalBuildings","_numGroups","_building","_type","_nearMen","_i","_trigger","_code","_val"];
|
||||
//has town
|
||||
_town = _this;
|
||||
_type = type _town;
|
||||
_spot = objNull;
|
||||
_buildings = [];
|
||||
_list = [];
|
||||
_numZeds = 2;
|
||||
|
||||
_impt = (importance _town);
|
||||
_size = 50;
|
||||
switch (_type) do {
|
||||
default {
|
||||
_numZeds = 3;
|
||||
_size = 40 * _impt;
|
||||
};
|
||||
case "NameCity": {
|
||||
_numZeds = 6;
|
||||
_size = 80 * _impt;
|
||||
};
|
||||
case "NameCityCapital": {
|
||||
_numZeds = 10;
|
||||
_size = 120 * _impt;
|
||||
};
|
||||
};
|
||||
|
||||
_position = position _town;
|
||||
_buildings = nearestObjects [_position, ["Building"], _size];
|
||||
_totalBuildings = count _buildings;
|
||||
_numGroups = 0;
|
||||
_i = 0;
|
||||
/*
|
||||
_markerstr = createMarker["markername_" + (text _town),_position];
|
||||
_markerstr setMarkerShape "ELLIPSE";
|
||||
_markerstr setMarkerSize [_size, _size];
|
||||
*/
|
||||
_trigger = createTrigger["EmptyDetector",_position];
|
||||
_trigger setTriggerArea[dayz_zSpawnDistance,dayz_zSpawnDistance,0,false];
|
||||
_trigger setTriggerActivation["WEST","NOT PRESENT",false];
|
||||
_code = format["_id = [%1,%2,'%3'] spawn server_townDeZombify;",_position,_size,_type];
|
||||
_trigger setTriggerStatements["this", _code, ""];
|
||||
_val = 60 * 10;
|
||||
_trigger setTriggerTimeout [_val, _val, _val, true];
|
||||
|
||||
|
||||
while {_numGroups < _numZeds and _i < _totalBuildings} do {
|
||||
_building = _buildings call BIS_fnc_selectRandom;
|
||||
if (!isNull _building) then {
|
||||
_list = _building nearRoads 20;
|
||||
if (count _list > 0) then {
|
||||
_spot = _list call BIS_fnc_selectRandom;
|
||||
_nearMen = (position _spot) nearEntities [["Man"],50];
|
||||
if (!isNull _spot and (count _nearMen == 0)) then {
|
||||
/*
|
||||
_marker = createMarker [(text _town) + "Marker2" + str(_i), position _spot];
|
||||
_marker setMarkerShape "ICON";
|
||||
_marker setMarkerType "DOT";
|
||||
_marker setMarkerColor "ColorBlue";
|
||||
_marker setMarkerText str(_i);
|
||||
*/
|
||||
_numGroups = _numGroups + 1;
|
||||
(position _spot) spawn dayz_spawnZombies;
|
||||
};
|
||||
};
|
||||
};
|
||||
_i = _i + 1;
|
||||
sleep 0.1;
|
||||
};
|
||||
21
SQF/dayz_server/compile/server_tradeObject.sqf
Normal file
21
SQF/dayz_server/compile/server_tradeObject.sqf
Normal file
@@ -0,0 +1,21 @@
|
||||
private ["_character","_traderid","_buyorsell","_data","_result","_key","_outcome","_clientID"];
|
||||
|
||||
_character = _this select 0;
|
||||
_traderid = _this select 1;
|
||||
_buyorsell = _this select 2;
|
||||
_clientID = owner _character;
|
||||
|
||||
diag_log format["TRADE: Trade Request by ClientID: %1 Character: %2 TraderID: %3 BuyOrSell: %4", _clientID, _character,_traderid,_buyorsell];
|
||||
|
||||
//Send request
|
||||
_key = format["CHILD:398:%1:%2:",_traderid,_buyorsell];
|
||||
|
||||
_data = "HiveEXT" callExtension _key;
|
||||
_result = call compile format ["%1",_data];
|
||||
// diag_log ("TRADE: RES: "+ str(_result));
|
||||
_outcome = _result select 0;
|
||||
|
||||
dayzTradeResult = _outcome;
|
||||
if(!isNull _character) then {
|
||||
_clientID publicVariableClient "dayzTradeResult";
|
||||
};
|
||||
41
SQF/dayz_server/compile/server_traders.sqf
Normal file
41
SQF/dayz_server/compile/server_traders.sqf
Normal file
@@ -0,0 +1,41 @@
|
||||
private ["_clientID","_character","_traderid","_retrader","_data","_result","_status","_val","_key"];
|
||||
//[dayz_characterID,_tent,[_dir,_location],"TentStorage"]
|
||||
_character = _this select 0;
|
||||
_traderid = _this select 1;
|
||||
|
||||
_retrader = [];
|
||||
|
||||
_clientID = owner _character;
|
||||
diag_log ("HIVE: Menu Request by ClientID: "+ str(_clientID));
|
||||
|
||||
_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...");
|
||||
for "_i" from 1 to _val do {
|
||||
_data = "HiveEXT" callExtension _key;
|
||||
_result = call compile format ["%1",_data];
|
||||
_status = _result select 0;
|
||||
_retrader set [count _retrader,_result];
|
||||
|
||||
//diag_log ("HIVE: Loop ");
|
||||
};
|
||||
//diag_log ("HIVE: Streamed " + str(_val) + " objects");
|
||||
};
|
||||
|
||||
|
||||
diag_log(_retrader);
|
||||
dayzTraderMenuResult = _retrader;
|
||||
if(!isNull _character) then {
|
||||
_clientID publicVariableClient "dayzTraderMenuResult";
|
||||
};
|
||||
_retrader;
|
||||
6
SQF/dayz_server/compile/server_updateNearbyObjects.sqf
Normal file
6
SQF/dayz_server/compile/server_updateNearbyObjects.sqf
Normal file
@@ -0,0 +1,6 @@
|
||||
private["_pos"];
|
||||
_pos = _this select 0;
|
||||
|
||||
{
|
||||
[_x, "gear"] call server_updateObject;
|
||||
} forEach nearestObjects [_pos, dayz_updateObjects, 10];
|
||||
171
SQF/dayz_server/compile/server_updateObject.sqf
Normal file
171
SQF/dayz_server/compile/server_updateObject.sqf
Normal file
@@ -0,0 +1,171 @@
|
||||
/*
|
||||
[_object,_type] spawn server_updateObject;
|
||||
*/
|
||||
private ["_object","_type","_objectID","_uid","_lastUpdate","_needUpdate","_object_position","_object_inventory","_object_damage","_isNotOk","_parachuteWest","_firstTime","_object_killed","_object_repair","_isbuildable"];
|
||||
|
||||
_object = _this select 0;
|
||||
_type = _this select 1;
|
||||
_parachuteWest = typeOf _object == "ParachuteWest";
|
||||
_isbuildable = (typeOf _object) in dayz_allowedObjects;
|
||||
_isNotOk = false;
|
||||
_firstTime = false;
|
||||
|
||||
_objectID = _object getVariable ["ObjectID","0"];
|
||||
_uid = _object getVariable ["ObjectUID","0"];
|
||||
|
||||
if ((typeName _objectID != "string") || (typeName _uid != "string")) then
|
||||
{
|
||||
diag_log(format["Non-string Object: ID %1 UID %2", _objectID, _uid]);
|
||||
//force fail
|
||||
_objectID = "0";
|
||||
_uid = "0";
|
||||
};
|
||||
if (!_parachuteWest and !(locked _object)) then {
|
||||
if (_objectID == "0" && _uid == "0") then
|
||||
{
|
||||
_object_position = getPosATL _object;
|
||||
_isNotOk = true;
|
||||
};
|
||||
};
|
||||
|
||||
// do not update if buildable and not ok
|
||||
if (_isNotOk and _isbuildable) exitWith { };
|
||||
|
||||
// delete if still not ok
|
||||
if (_isNotOk) exitWith { deleteVehicle _object; diag_log(format["Deleting object %1 with invalid ID at pos [%2,%3,%4]",typeOf _object,_object_position select 0,_object_position select 1, _object_position select 2]); };
|
||||
|
||||
|
||||
_lastUpdate = _object getVariable ["lastUpdate",time];
|
||||
_needUpdate = _object in needUpdate_objects;
|
||||
|
||||
// TODO ----------------------
|
||||
_object_position = {
|
||||
private["_position","_worldspace","_fuel","_key"];
|
||||
_position = getPosATL _object;
|
||||
_worldspace = [
|
||||
round(direction _object),
|
||||
_position
|
||||
];
|
||||
_fuel = 0;
|
||||
if (_object isKindOf "AllVehicles") then {
|
||||
_fuel = fuel _object;
|
||||
};
|
||||
_key = format["CHILD:305:%1:%2:%3:",_objectID,_worldspace,_fuel];
|
||||
diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_key call server_hiveWrite;
|
||||
};
|
||||
|
||||
_object_inventory = {
|
||||
private["_inventory","_previous","_key"];
|
||||
_inventory = [
|
||||
getWeaponCargo _object,
|
||||
getMagazineCargo _object,
|
||||
getBackpackCargo _object
|
||||
];
|
||||
_previous = str(_object getVariable["lastInventory",[]]);
|
||||
if (str(_inventory) != _previous) then {
|
||||
_object setVariable["lastInventory",_inventory];
|
||||
if (_objectID == "0") then {
|
||||
_key = format["CHILD:309:%1:%2:",_uid,_inventory];
|
||||
} else {
|
||||
_key = format["CHILD:303:%1:%2:",_objectID,_inventory];
|
||||
};
|
||||
diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_key call server_hiveWrite;
|
||||
};
|
||||
};
|
||||
|
||||
_object_damage = {
|
||||
private["_hitpoints","_array","_hit","_selection","_key","_damage"];
|
||||
_hitpoints = _object call vehicle_getHitpoints;
|
||||
_damage = damage _object;
|
||||
_array = [];
|
||||
{
|
||||
_hit = [_object,_x] call object_getHit;
|
||||
_selection = getText (configFile >> "CfgVehicles" >> (typeOf _object) >> "HitPoints" >> _x >> "name");
|
||||
if (_hit > 0) then {_array set [count _array,[_selection,_hit]]};
|
||||
_object setHit ["_selection", _hit]
|
||||
} forEach _hitpoints;
|
||||
|
||||
_key = format["CHILD:306:%1:%2:%3:",_objectID,_array,_damage];
|
||||
diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_key call server_hiveWrite;
|
||||
_object setVariable ["needUpdate",false,true];
|
||||
};
|
||||
|
||||
_object_killed = {
|
||||
private["_hitpoints","_array","_hit","_selection","_key","_damage"];
|
||||
_hitpoints = _object call vehicle_getHitpoints;
|
||||
_damage = damage _object;
|
||||
_array = [];
|
||||
{
|
||||
_hit = [_object,_x] call object_getHit;
|
||||
_selection = getText (configFile >> "CfgVehicles" >> (typeOf _object) >> "HitPoints" >> _x >> "name");
|
||||
if (_hit > 0) then {_array set [count _array,[_selection,_hit]]};
|
||||
_hit = 1;
|
||||
_object setHit ["_selection", _hit]
|
||||
} forEach _hitpoints;
|
||||
_damage = 1;
|
||||
|
||||
if (_objectID == "0") then {
|
||||
_key = format["CHILD:306:%1:%2:%3:",_uid,_array,_damage];
|
||||
} else {
|
||||
_key = format["CHILD:306:%1:%2:%3:",_objectID,_array,_damage];
|
||||
};
|
||||
diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_key call server_hiveWrite;
|
||||
_object setVariable ["needUpdate",false,true];
|
||||
};
|
||||
|
||||
_object_repair = {
|
||||
private["_hitpoints","_array","_hit","_selection","_key","_damage"];
|
||||
_hitpoints = _object call vehicle_getHitpoints;
|
||||
_damage = damage _object;
|
||||
_array = [];
|
||||
{
|
||||
_hit = [_object,_x] call object_getHit;
|
||||
_selection = getText (configFile >> "CfgVehicles" >> (typeOf _object) >> "HitPoints" >> _x >> "name");
|
||||
if (_hit > 0) then {_array set [count _array,[_selection,_hit]]};
|
||||
_object setHit ["_selection", _hit]
|
||||
} forEach _hitpoints;
|
||||
|
||||
_key = format["CHILD:306:%1:%2:%3:",_objectID,_array,_damage];
|
||||
diag_log ("HIVE: WRITE: "+ str(_key));
|
||||
_key call server_hiveWrite;
|
||||
_object setVariable ["needUpdate",false,true];
|
||||
};
|
||||
// TODO ----------------------
|
||||
|
||||
_object setVariable ["lastUpdate",time,true];
|
||||
switch (_type) do {
|
||||
case "all": {
|
||||
call _object_position;
|
||||
call _object_inventory;
|
||||
call _object_damage;
|
||||
};
|
||||
case "position": {
|
||||
if (!(_object in needUpdate_objects)) then {
|
||||
diag_log format["DEBUG Position: Added to NeedUpdate=%1",_object];
|
||||
needUpdate_objects set [count needUpdate_objects, _object];
|
||||
};
|
||||
};
|
||||
case "gear": {
|
||||
call _object_inventory;
|
||||
};
|
||||
case "damage": {
|
||||
if ( (time - _lastUpdate) > 5) then {
|
||||
call _object_damage;
|
||||
} else {
|
||||
if (!(_object in needUpdate_objects)) then {
|
||||
diag_log format["DEBUG Damage: Added to NeedUpdate=%1",_object];
|
||||
needUpdate_objects set [count needUpdate_objects, _object];
|
||||
};
|
||||
};
|
||||
};
|
||||
case "killed": {
|
||||
call _object_killed;
|
||||
};
|
||||
case "repair": {
|
||||
call _object_damage;
|
||||
};
|
||||
};
|
||||
0
SQF/dayz_server/compile/server_updatePlayer.sqf
Normal file
0
SQF/dayz_server/compile/server_updatePlayer.sqf
Normal file
5
SQF/dayz_server/compile/zombie_findOwner.sqf
Normal file
5
SQF/dayz_server/compile/zombie_findOwner.sqf
Normal file
@@ -0,0 +1,5 @@
|
||||
private["_unit"];
|
||||
_unit = _this select 0;
|
||||
|
||||
diag_log ("CLEANUP: DELETE UNCONTROLLED ZOMBIE: " + (typeOf _unit) + " OF: " + str(_unit) );
|
||||
deleteVehicle _unit;
|
||||
8
SQF/dayz_server/config.cpp
Normal file
8
SQF/dayz_server/config.cpp
Normal file
@@ -0,0 +1,8 @@
|
||||
class CfgPatches {
|
||||
class dayz_server {
|
||||
units[] = {};
|
||||
weapons[] = {};
|
||||
requiredVersion = 0.1;
|
||||
requiredAddons[] = {"dayz_code"};
|
||||
};
|
||||
};
|
||||
27
SQF/dayz_server/init/publicEH_server.sqf
Normal file
27
SQF/dayz_server/init/publicEH_server.sqf
Normal file
@@ -0,0 +1,27 @@
|
||||
//register client->server rpc
|
||||
registerServerRpc = {
|
||||
if (isServer) then {
|
||||
_this call registerBroadcastRpc;
|
||||
};
|
||||
};
|
||||
|
||||
["dayzDeath", { (_this select 1) call server_playerDied; } ] call registerServerRpc;
|
||||
["dayzDiscoAdd", { dayz_disco set [count dayz_disco,(_this select 1)]; } ] call registerServerRpc;
|
||||
["dayzDiscoRem", { dayz_disco = dayz_disco - [(_this select 1)]; } ] call registerServerRpc;
|
||||
["dayzPlayerSave", { (_this select 1) call server_playerSync; } ] call registerServerRpc;
|
||||
["dayzPublishObj", { (_this select 1) call server_publishObj; } ] call registerServerRpc;
|
||||
["dayzUpdateVehicle", { (_this select 1) call server_updateObject; } ] call registerServerRpc;
|
||||
["dayzDeleteObj", { (_this select 1) call server_deleteObj; } ] call registerServerRpc;
|
||||
["dayzLogin", { (_this select 1) call server_playerLogin; } ] call registerServerRpc;
|
||||
["dayzLogin2", { (_this select 1) call server_playerSetup; } ] call registerServerRpc;
|
||||
//missing sqf for server_playerMorph
|
||||
//["dayzPlayerMorph", { (_this select 1) call server_playerMorph; } ] call registerServerRpc;
|
||||
["dayzLoginRecord", { (_this select 1) call dayz_recordLogin; } ] call registerServerRpc;
|
||||
["dayzCharDisco", { (_this select 1) call server_characterSync; } ] call registerServerRpc;
|
||||
["dayzSpawnZed", { (_this select 1) call server_handleZedSpawn; } ] call registerServerRpc;
|
||||
// DayZ Epoch Custom
|
||||
["dayzPublishVeh", { (_this select 1) spawn server_publishVeh; } ] call registerServerRpc;
|
||||
["dayzTradeObject", { (_this select 1) spawn server_tradeObj; } ] call registerServerRpc;
|
||||
["dayzTraderMenu", { (_this select 1) spawn server_traders; } ] call registerServerRpc;
|
||||
["dayzPlayerDeaths", { (_this select 1) spawn server_deaths; } ] call registerServerRpc;
|
||||
|
||||
479
SQF/dayz_server/init/server_functions.sqf
Normal file
479
SQF/dayz_server/init/server_functions.sqf
Normal file
@@ -0,0 +1,479 @@
|
||||
waituntil {!isnil "bis_fnc_init"};
|
||||
|
||||
BIS_MPF_remoteExecutionServer = {
|
||||
if ((_this select 1) select 2 == "JIPrequest") then {
|
||||
[nil,(_this select 1) select 0,"loc",rJIPEXEC,[any,any,"per","execVM","ca\Modules\Functions\init.sqf"]] call RE;
|
||||
};
|
||||
};
|
||||
|
||||
BIS_Effects_Burn = {};
|
||||
server_playerLogin = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerLogin.sqf";
|
||||
server_playerSetup = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerSetup.sqf";
|
||||
server_onPlayerDisconnect = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_onPlayerDisconnect.sqf";
|
||||
server_updateObject = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_updateObject.sqf";
|
||||
server_playerDied = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerDied.sqf";
|
||||
server_publishObj = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishObject.sqf"; //Creates the object in DB
|
||||
server_deleteObj = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_deleteObj.sqf"; //Removes the object from the DB
|
||||
server_publishVeh = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishVehicle.sqf"; // Custom to add vehicles
|
||||
server_publishVeh2 = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishVehicle2.sqf"; // Custom to add vehicles
|
||||
server_tradeObj = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_tradeObject.sqf";
|
||||
server_traders = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_traders.sqf";
|
||||
server_playerSync = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerSync.sqf";
|
||||
zombie_findOwner = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\zombie_findOwner.sqf";
|
||||
server_updateNearbyObjects = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_updateNearbyObjects.sqf";
|
||||
server_spawnCrashSite = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_spawnCrashSite.sqf";
|
||||
server_handleZedSpawn = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_handleZedSpawn.sqf";
|
||||
server_spawnEvents = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_spawnEvent.sqf";
|
||||
|
||||
fnc_plyrHit = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\fnc_plyrHit.sqf";
|
||||
server_deaths = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerDeaths.sqf";
|
||||
|
||||
|
||||
vehicle_handleInteract = {
|
||||
private["_object"];
|
||||
_object = _this select 0;
|
||||
needUpdate_objects = needUpdate_objects - [_object];
|
||||
[_object, "all"] call server_updateObject;
|
||||
};
|
||||
|
||||
vehicle_handleServerKilled = {
|
||||
private["_unit","_killer"];
|
||||
_unit = _this select 0;
|
||||
_killer = _this select 1;
|
||||
|
||||
[_unit, "killed"] call server_updateObject;
|
||||
|
||||
_unit removeAllMPEventHandlers "MPKilled";
|
||||
_unit removeAllEventHandlers "Killed";
|
||||
_unit removeAllEventHandlers "HandleDamage";
|
||||
_unit removeAllEventHandlers "GetIn";
|
||||
_unit removeAllEventHandlers "GetOut";
|
||||
};
|
||||
|
||||
object_handleServerKilled = {
|
||||
private["_unit","_objectID","_objectUID"];
|
||||
_unit = _this select 0;
|
||||
|
||||
_objectID = _unit getVariable ["ObjectID","0"];
|
||||
_objectUID = _unit getVariable ["ObjectUID","0"];
|
||||
|
||||
[_objectID,_objectUID] call server_deleteObj;
|
||||
|
||||
_unit removeAllMPEventHandlers "MPKilled";
|
||||
_unit removeAllEventHandlers "Killed";
|
||||
_unit removeAllEventHandlers "HandleDamage";
|
||||
_unit removeAllEventHandlers "GetIn";
|
||||
_unit removeAllEventHandlers "GetOut";
|
||||
};
|
||||
|
||||
check_publishobject = {
|
||||
private["_allowed","_object","_playername"];
|
||||
|
||||
_object = _this select 0;
|
||||
_playername = _this select 1;
|
||||
|
||||
_allowed = false;
|
||||
|
||||
diag_log format ["DEBUG: Checking if Object: %1 is allowed published by %2", _object, _playername];
|
||||
|
||||
if ((typeOf _object) in dayz_allowedObjects) then {
|
||||
diag_log format ["DEBUG: Object: %1 published by %2 is Safe",_object, _playername];
|
||||
_allowed = true;
|
||||
};
|
||||
_allowed
|
||||
};
|
||||
|
||||
//event Handlers
|
||||
eh_localCleanup = {
|
||||
private ["_object"];
|
||||
_object = _this select 0;
|
||||
_object addEventHandler ["local", {
|
||||
if(_this select 1) then {
|
||||
private["_type","_unit"];
|
||||
_unit = _this select 0;
|
||||
_type = typeOf _unit;
|
||||
_myGroupUnit = group _unit;
|
||||
_unit removeAllMPEventHandlers "mpkilled";
|
||||
_unit removeAllMPEventHandlers "mphit";
|
||||
_unit removeAllMPEventHandlers "mprespawn";
|
||||
_unit removeAllEventHandlers "FiredNear";
|
||||
_unit removeAllEventHandlers "HandleDamage";
|
||||
_unit removeAllEventHandlers "Killed";
|
||||
_unit removeAllEventHandlers "Fired";
|
||||
_unit removeAllEventHandlers "GetOut";
|
||||
_unit removeAllEventHandlers "GetIn";
|
||||
_unit removeAllEventHandlers "Local";
|
||||
clearVehicleInit _unit;
|
||||
deleteVehicle _unit;
|
||||
deleteGroup _myGroupUnit;
|
||||
_unit = nil;
|
||||
diag_log ("CLEANUP: DELETED A " + str(_type) );
|
||||
};
|
||||
}];
|
||||
};
|
||||
|
||||
server_hiveWrite = {
|
||||
private["_data"];
|
||||
//diag_log ("ATTEMPT WRITE: " + _this);
|
||||
_data = "HiveExt" callExtension _this;
|
||||
//diag_log ("WRITE: " +str(_data));
|
||||
};
|
||||
|
||||
server_hiveReadWrite = {
|
||||
private["_key","_resultArray","_data"];
|
||||
_key = _this;
|
||||
//diag_log ("ATTEMPT READ/WRITE: " + _key);
|
||||
_data = "HiveExt" callExtension _key;
|
||||
//diag_log ("READ/WRITE: " +str(_data));
|
||||
_resultArray = call compile format ["%1",_data];
|
||||
_resultArray
|
||||
};
|
||||
|
||||
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];
|
||||
//diag_log ("HIVE: WRITE: "+ str(_key) + " / " + _characterID);
|
||||
_key call server_hiveWrite;
|
||||
};
|
||||
|
||||
//onPlayerConnected "[_uid,_name] spawn server_onPlayerConnect;";
|
||||
onPlayerDisconnected "[_uid,_name] call server_onPlayerDisconnect;";
|
||||
|
||||
// Setup globals allow overwrite from init.sqf
|
||||
if(isnil "dayz_MapArea") then {
|
||||
dayz_MapArea = 10000;
|
||||
};
|
||||
if(isnil "DynamicVehicleArea") then {
|
||||
DynamicVehicleArea = dayz_MapArea / 2;
|
||||
};
|
||||
|
||||
// Get all buildings and roads only once TODO: set variables to nil after done if nessicary
|
||||
MarkerPosition = getMarkerPos "center";
|
||||
RoadList = MarkerPosition nearRoads DynamicVehicleArea;
|
||||
BuildingList = MarkerPosition nearObjects ["House",DynamicVehicleArea];
|
||||
|
||||
spawn_vehicles = {
|
||||
private ["_weights","_isOverLimit","_isAbort","_counter","_index","_vehicle","_velimit","_qty","_isAir","_isShip","_position","_dir","_istoomany","_veh","_objPosition","_marker","_iClass","_itemTypes","_cntWeights","_itemType","_num","_allCfgLoots"];
|
||||
|
||||
if (isDedicated) then {
|
||||
waituntil {!isnil "fnc_buildWeightedArray"};
|
||||
|
||||
_isOverLimit = true;
|
||||
_isAbort = false;
|
||||
_counter = 0;
|
||||
while {_isOverLimit} do {
|
||||
|
||||
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
||||
_index = AllowedVehiclesList call BIS_fnc_selectRandom;
|
||||
|
||||
_vehicle = _index select 0;
|
||||
_velimit = _index select 1;
|
||||
|
||||
_qty = {_x == _vehicle} count serverVehicleCounter;
|
||||
|
||||
// If under limit allow to proceed
|
||||
if(_qty <= _velimit) then {
|
||||
_isOverLimit = false;
|
||||
};
|
||||
|
||||
// counter to stop after 5 attempts
|
||||
_counter = _counter + 1;
|
||||
|
||||
if(_counter >= 5) then {
|
||||
_isOverLimit = false;
|
||||
_isAbort = true;
|
||||
};
|
||||
};
|
||||
|
||||
if (_isAbort) then {
|
||||
diag_log("DEBUG: unable to find sutable 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_selectRandom"};
|
||||
_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_selectRandom"};
|
||||
_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 and 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 and 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;
|
||||
|
||||
// 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 = [] + ((getArray (configFile >> "cfgLoot" >> _iClass)) select 0);
|
||||
_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_roadblocks = {
|
||||
private ["_position","_veh","_num","_config","_itemType","_itemChance","_weights","_index","_iArray","_istoomany","_marker","_spawnloot","_nearby","_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)); };
|
||||
|
||||
if(DZEdebug) then {
|
||||
_marker = createMarker [str(_position) , _position];
|
||||
_marker setMarkerShape "ICON";
|
||||
_marker setMarkerType "DOT";
|
||||
};
|
||||
|
||||
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
||||
_spawnveh = _WreckList call BIS_fnc_selectRandom;
|
||||
_spawnloot = "DynamicDebris";
|
||||
|
||||
if((_spawnveh == "HMMWVWreck") or (_spawnveh == "UralWreck") or (_spawnveh == "UAZWreck")) then {
|
||||
_spawnloot = "DynamicDebrisMilitary";
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_veh];
|
||||
_veh setVariable ["ObjectID","1",true];
|
||||
|
||||
_num = round(random 3);
|
||||
_config = configFile >> "CfgBuildingLoot" >> _spawnloot;
|
||||
_itemType = [] + getArray (_config >> "itemType");
|
||||
_itemChance = [] + getArray (_config >> "itemChance");
|
||||
|
||||
waituntil {!isnil "fnc_buildWeightedArray"};
|
||||
|
||||
_weights = [];
|
||||
_weights = [_itemType,_itemChance] call fnc_buildWeightedArray;
|
||||
for "_x" from 1 to _num do {
|
||||
//create loot
|
||||
_index = _weights call BIS_fnc_selectRandom;
|
||||
sleep 1;
|
||||
if (count _itemType > _index) then {
|
||||
_iArray = _itemType select _index;
|
||||
_iArray set [2,_position];
|
||||
_iArray set [3,5];
|
||||
_iArray call spawn_loot;
|
||||
_nearby = _position nearObjects ["WeaponHolder",20];
|
||||
{
|
||||
_x setVariable ["permaLoot",true];
|
||||
} forEach _nearBy;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
if(isnil "DynamicVehicleDamageLow") then {
|
||||
DynamicVehicleDamageLow = 0;
|
||||
};
|
||||
if(isnil "DynamicVehicleDamageHigh") then {
|
||||
DynamicVehicleDamageHigh = 100;
|
||||
};
|
||||
|
||||
if(isnil "DynamicVehicleFuelLow") then {
|
||||
DynamicVehicleFuelLow = 0;
|
||||
};
|
||||
if(isnil "DynamicVehicleFuelHigh") then {
|
||||
DynamicVehicleFuelHigh = 100;
|
||||
};
|
||||
|
||||
// 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
|
||||
};
|
||||
|
||||
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));
|
||||
} forEach _position;
|
||||
_key = _key + str(round(_dir));
|
||||
_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));
|
||||
} forEach _position;
|
||||
_key = _key + str(round(_dir + time));
|
||||
_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;
|
||||
};
|
||||
4
SQF/dayz_server/modules/drop_bombs.sqf
Normal file
4
SQF/dayz_server/modules/drop_bombs.sqf
Normal file
@@ -0,0 +1,4 @@
|
||||
// Sample Drop Bomb
|
||||
|
||||
_position = [MarkerPosition,0,DynamicVehicleArea,10,0,2000,0] call BIS_fnc_findSafePos;
|
||||
bomb = "Bo_GBU12_LGB" createVehicle [(_position select 0),(_position select 1), 1000];
|
||||
3
SQF/dayz_server/modules/hello_world.sqf
Normal file
3
SQF/dayz_server/modules/hello_world.sqf
Normal file
@@ -0,0 +1,3 @@
|
||||
// Sample Hello World
|
||||
|
||||
[nil,nil,"per",rTITLETEXT,"Welcome to DayzEpoch","PLAIN DOWN"] call RE;
|
||||
10
SQF/dayz_server/system/s_fps.sqf
Normal file
10
SQF/dayz_server/system/s_fps.sqf
Normal file
@@ -0,0 +1,10 @@
|
||||
while {isServer} do {
|
||||
while {isServer} do {
|
||||
while {isServer} do {
|
||||
diag_log ("DEBUG FPS : " + str(diag_fps) );
|
||||
sleep 181;
|
||||
};
|
||||
sleep 181;
|
||||
};
|
||||
sleep 181;
|
||||
};
|
||||
443
SQF/dayz_server/system/server_cleanup.fsm
Normal file
443
SQF/dayz_server/system/server_cleanup.fsm
Normal file
@@ -0,0 +1,443 @@
|
||||
/*%FSM<COMPILE "F:\Program Files (x86)\Bohemia Interactive\Tools\FSM Editor Personal Edition\scriptedFSM.cfg, DayZ Server Cleanup">*/
|
||||
/*%FSM<HEAD>*/
|
||||
/*
|
||||
item0[] = {"init",0,250,-75.000000,-400.000000,25.000000,-350.000000,0.000000,"init"};
|
||||
item1[] = {"true",8,218,-75.000000,-175.000000,25.000000,-125.000000,0.000000,"true"};
|
||||
item2[] = {"waiting",2,250,-75.000000,-100.000000,25.000000,-50.000000,0.000000,"waiting"};
|
||||
item3[] = {"too_many_dead",4,218,-150.000000,-25.000000,-50.000000,25.000000,2.000000,"too many" \n "dead"};
|
||||
item4[] = {"cleanup_dead",2,250,-150.000000,50.000000,-50.000000,100.000000,0.000000,"cleanup" \n "dead"};
|
||||
item5[] = {"too_many_objects",4,218,-25.000000,-25.000000,75.000000,25.000000,0.000000,"too many" \n "objects"};
|
||||
item6[] = {"cleanup_objects",2,250,-25.000000,50.000000,75.000000,100.000000,0.000000,"cleanup" \n "objects"};
|
||||
item7[] = {"time_sync",4,218,-275.000000,-25.000000,-175.000000,25.000000,1.000000,"time" \n "sync"};
|
||||
item8[] = {"sync_the_time",2,250,-275.000000,50.000000,-175.000000,100.000000,0.000000,"sync" \n "the time"};
|
||||
item9[] = {"true",8,218,-75.000000,125.000000,25.000000,175.000000,0.000000,"true"};
|
||||
item10[] = {"general_cleanup",2,4346,-75.000000,200.000000,25.000000,250.000000,0.000000,"general" \n "cleanup"};
|
||||
item11[] = {"",7,210,-304.000000,220.999985,-296.000000,229.000015,0.000000,""};
|
||||
item12[] = {"",7,210,-304.000000,-154.000000,-296.000000,-146.000000,0.000000,""};
|
||||
item13[] = {"",7,210,221.000000,-79.000000,229.000000,-71.000000,0.000000,""};
|
||||
item14[] = {"",7,210,221.000000,146.000000,229.000000,154.000000,0.000000,""};
|
||||
item15[] = {"initialized",4,218,-75.000000,-325.000000,25.000000,-275.000000,0.000000,"initialized"};
|
||||
item16[] = {"prepare",2,250,-75.000000,-250.000000,25.000000,-200.000000,0.000000,"prepare"};
|
||||
item17[] = {"update_objects",2,250,100.000000,50.000000,200.000000,100.000000,0.000000,"update objects"};
|
||||
item18[] = {"need_update",4,218,100.000000,-25.000000,200.000000,25.000000,1.000000,"need update"};
|
||||
item19[] = {"",7,210,221.000000,-79.000000,229.000000,-71.000000,0.000000,""};
|
||||
link0[] = {0,15};
|
||||
link1[] = {1,2};
|
||||
link2[] = {2,3};
|
||||
link3[] = {2,5};
|
||||
link4[] = {2,7};
|
||||
link5[] = {2,13};
|
||||
link6[] = {2,18};
|
||||
link7[] = {3,4};
|
||||
link8[] = {4,9};
|
||||
link9[] = {5,6};
|
||||
link10[] = {6,9};
|
||||
link11[] = {7,8};
|
||||
link12[] = {8,9};
|
||||
link13[] = {9,10};
|
||||
link14[] = {10,11};
|
||||
link15[] = {11,12};
|
||||
link16[] = {12,1};
|
||||
link17[] = {13,14};
|
||||
link18[] = {13,19};
|
||||
link19[] = {14,9};
|
||||
link20[] = {15,16};
|
||||
link21[] = {16,1};
|
||||
link22[] = {17,9};
|
||||
link23[] = {18,17};
|
||||
globals[] = {25.000000,1,0,0,0,640,480,1,24,6316128,1,-378.181000,335.872437,502.526184,-187.229050,911,880,1};
|
||||
window[] = {2,-1,-1,-1,-1,936,156,1485,156,3,929};
|
||||
*//*%FSM</HEAD>*/
|
||||
class FSM
|
||||
{
|
||||
fsmName = "DayZ Server Cleanup";
|
||||
class States
|
||||
{
|
||||
/*%FSM<STATE "init">*/
|
||||
class init
|
||||
{
|
||||
name = "init";
|
||||
init = /*%FSM<STATEINIT""">*/""/*%FSM</STATEINIT""">*/;
|
||||
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
|
||||
class Links
|
||||
{
|
||||
/*%FSM<LINK "initialized">*/
|
||||
class initialized
|
||||
{
|
||||
priority = 0.000000;
|
||||
to="prepare";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"!isnil ""bis_fnc_init"""/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
};
|
||||
};
|
||||
/*%FSM</STATE>*/
|
||||
/*%FSM<STATE "waiting">*/
|
||||
class waiting
|
||||
{
|
||||
name = "waiting";
|
||||
init = /*%FSM<STATEINIT""">*/"//diag_log ""CLEANUP: Waiting for next task"";" \n
|
||||
"_numDead = {local _x} count allDead;" \n
|
||||
""/*%FSM</STATEINIT""">*/;
|
||||
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
|
||||
class Links
|
||||
{
|
||||
/*%FSM<LINK "too_many_dead">*/
|
||||
class too_many_dead
|
||||
{
|
||||
priority = 2.000000;
|
||||
to="cleanup_dead";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"(_numDead > 300)"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
/*%FSM<LINK "time_sync">*/
|
||||
class time_sync
|
||||
{
|
||||
priority = 1.000000;
|
||||
to="sync_the_time";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"((time - _lastUpdate) > 300)"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/"_lastUpdate = time;"/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
/*%FSM<LINK "need_update">*/
|
||||
class need_update
|
||||
{
|
||||
priority = 1.000000;
|
||||
to="update_objects";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"( (count needUpdate_objects) > 0 && (time-_lastNeedUpdate>20) )"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/"_lastNeedUpdate = time;"/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
/*%FSM<LINK "true">*/
|
||||
class true
|
||||
{
|
||||
priority = 0.000000;
|
||||
to="general_cleanup";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"true"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
/*%FSM<LINK "too_many_objects">*/
|
||||
class too_many_objects
|
||||
{
|
||||
priority = 0.000000;
|
||||
to="cleanup_objects";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"((time - _timeNem) > 60)"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/"_timeNem = time;"/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
};
|
||||
};
|
||||
/*%FSM</STATE>*/
|
||||
/*%FSM<STATE "cleanup_dead">*/
|
||||
class cleanup_dead
|
||||
{
|
||||
name = "cleanup_dead";
|
||||
init = /*%FSM<STATEINIT""">*/"diag_log (""CLEANUP: TOO MANY DEAD BODIES"");" \n
|
||||
"" \n
|
||||
"diag_log (""CLEANUP: PERFORMING BODY CLEANUP ON "" + str(_numDead) + "" BODIES"");" \n
|
||||
"" \n
|
||||
"_delQtyZ = 0;" \n
|
||||
"_numZombie = {_x isKindOf ""zZombie_Base""} count allDead;" \n
|
||||
"{" \n
|
||||
" if (local _x) then {" \n
|
||||
" if (_x isKindOf ""zZombie_Base"") then {" \n
|
||||
" deleteVehicle _x;" \n
|
||||
" _delQtyZ = _delQtyZ + 1;" \n
|
||||
" } else {" \n
|
||||
" _exists = _x in _deadBodies;" \n
|
||||
" if(!_exists) then {" \n
|
||||
" _deadBodies set [count _deadBodies,_x];" \n
|
||||
" };" \n
|
||||
" };" \n
|
||||
" };" \n
|
||||
"} forEach allDead;" \n
|
||||
"" \n
|
||||
"//Cleanup players" \n
|
||||
"_body = objNull;" \n
|
||||
"_delQtyP = 0;" \n
|
||||
"_delDo = _numDead - _numZombie;" \n
|
||||
"_delDo = ((_delDo min (count _deadBodies)) -1);" \n
|
||||
"if (_delDo<1) then {_delDo=1};" \n
|
||||
"for ""_i"" from 0 to _delDo do {" \n
|
||||
" _body = _deadBodies select _i;" \n
|
||||
" if(!isNil ""_body"") then {" \n
|
||||
" _pos = getPosATL _body;" \n
|
||||
" _sfx = nearestObject [_pos,""Sound_Flies""];" \n
|
||||
" if (!(isNull _sfx)) then {" \n
|
||||
" deleteVehicle _sfx;" \n
|
||||
" };" \n
|
||||
" deleteVehicle _body;" \n
|
||||
" _delQtyP = _delQtyP + 1;" \n
|
||||
" };" \n
|
||||
" _deadBodies set [_i,""DEL""];" \n
|
||||
"" \n
|
||||
"//Let's move this into the body removal sequence so uncontrolled flies are removed only if corpses are cleaned" \n
|
||||
"//Check Flies" \n
|
||||
"_isOK=-1;" \n
|
||||
"_dwUSOFC=0;" \n
|
||||
"{" \n
|
||||
" //_isOk = {!alive _x} count (nearestObjects [_x, [""CAManBase""], 2]);" \n
|
||||
" _isOk = {!alive _x} count (_x nearEntities [[""CAManBase""], 2]);" \n
|
||||
" if (_isOk>-1) then {" \n
|
||||
" diag_log (""DW_DEBUG _isOK: "" + str(_isOK) );" \n
|
||||
" };" \n
|
||||
" if ((_isOk>-1) AND (_isOK<1)) then {" \n
|
||||
" //diag_log (""CLEANUP: DELETING A SOUND OF FLIES"");" \n
|
||||
"_dwUSOFC=_dwUSOFC+1;" \n
|
||||
" deleteVehicle _x;" \n
|
||||
" diag_log (""CLEANUP: DELETED AN UNCONTROLLED SOUND OF FLIES:"" + str(_dwUSOFC) );" \n
|
||||
" };" \n
|
||||
"} forEach allMissionObjects ""Sound_Flies"";" \n
|
||||
"" \n
|
||||
"" \n
|
||||
"//Let's move this into the body removal sequence so uncontrolled fireplaces are removed only if corpses are cleaned" \n
|
||||
"//clean fireplaces" \n
|
||||
"_dwUFPC=0;" \n
|
||||
"{" \n
|
||||
" if (local _x) then {" \n
|
||||
" //diag_log (""CLEANUP: DELETING A UNCONTROLLED FIREPLACE"");" \n
|
||||
" deleteVehicle _x;" \n
|
||||
"_dwUFPC=_dwUFPC+1;" \n
|
||||
" diag_log (""CLEANUP: DELETED AN UNCONTROLLED FIREPLACE:"" + str(_dwUFPC) );" \n
|
||||
" };" \n
|
||||
"} forEach allMissionObjects ""Land_Fire_DZ"";" \n
|
||||
"" \n
|
||||
"};" \n
|
||||
"_deadBodies = _deadBodies - [""DEL""];" \n
|
||||
"" \n
|
||||
"diag_log (""CLEANUP: DELETED "" + str(_delQtyP) + "" PLAYER BODIES AND "" + str(_delQtyZ) + "" BODIES"");" \n
|
||||
""/*%FSM</STATEINIT""">*/;
|
||||
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
|
||||
class Links
|
||||
{
|
||||
/*%FSM<LINK "true">*/
|
||||
class true
|
||||
{
|
||||
priority = 0.000000;
|
||||
to="general_cleanup";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"true"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
};
|
||||
};
|
||||
/*%FSM</STATE>*/
|
||||
/*%FSM<STATE "cleanup_objects">*/
|
||||
class cleanup_objects
|
||||
{
|
||||
name = "cleanup_objects";
|
||||
init = /*%FSM<STATEINIT""">*/"_missionObjs = allMissionObjects ""WeaponHolder"";" \n
|
||||
"_qty = count _missionObjs;" \n
|
||||
"" \n
|
||||
"//diag_log (""CLEANUP: PERFORMING ITEM CLEANUP: TOTAL "" + str(_qty) + "" LOOT BAGS"");" \n
|
||||
"_delQty = 0;" \n
|
||||
"{" \n
|
||||
" if (local _x) then {" \n
|
||||
" _keep = _x getVariable [""permaLoot"",false];" \n
|
||||
" _nearby = {isPlayer _x} count (_x nearEntities [[""CAManBase""], 100]);" \n
|
||||
" if ( (!_keep) && (_nearby==0) ) then {" \n
|
||||
" deleteVehicle _x;" \n
|
||||
" _delQty = _delQty + 1;" \n
|
||||
" };" \n
|
||||
" };" \n
|
||||
"} forEach _missionObjs;" \n
|
||||
"if (_delQty > 0) then {" \n
|
||||
" diag_log (""CLEANUP: DELETED "" + str(_delQty) + "" LOOT BAGS"");" \n
|
||||
"};" \n
|
||||
""/*%FSM</STATEINIT""">*/;
|
||||
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
|
||||
class Links
|
||||
{
|
||||
/*%FSM<LINK "true">*/
|
||||
class true
|
||||
{
|
||||
priority = 0.000000;
|
||||
to="general_cleanup";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"true"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
};
|
||||
};
|
||||
/*%FSM</STATE>*/
|
||||
/*%FSM<STATE "sync_the_time">*/
|
||||
class sync_the_time
|
||||
{
|
||||
name = "sync_the_time";
|
||||
init = /*%FSM<STATEINIT""">*/"//Send request" \n
|
||||
"_key = ""CHILD:307:"";" \n
|
||||
"_result = _key call server_hiveReadWrite;" \n
|
||||
"_outcome = _result select 0;" \n
|
||||
"if(_outcome == ""PASS"") then {" \n
|
||||
" _date = _result select 1; " \n
|
||||
" _dateNum = dateToNumber(_date); " \n
|
||||
" _diff = ( _dateNum - dateToNumber (date) )*365*24*60;" \n
|
||||
" if ( abs(_diff)>5 ) then {" \n
|
||||
" setDate _date;" \n
|
||||
" dayzSetDate = _date;" \n
|
||||
" publicVariable ""dayzSetDate"";" \n
|
||||
" diag_log (""TIME SYNC: Local Time set to "" + str(_date));" \n
|
||||
" };" \n
|
||||
"};" \n
|
||||
""/*%FSM</STATEINIT""">*/;
|
||||
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
|
||||
class Links
|
||||
{
|
||||
/*%FSM<LINK "true">*/
|
||||
class true
|
||||
{
|
||||
priority = 0.000000;
|
||||
to="general_cleanup";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"true"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
};
|
||||
};
|
||||
/*%FSM</STATE>*/
|
||||
/*%FSM<STATE "general_cleanup">*/
|
||||
class general_cleanup
|
||||
{
|
||||
name = "general_cleanup";
|
||||
init = /*%FSM<STATEINIT""">*/"//Clean groups" \n
|
||||
"{" \n
|
||||
" //diag_log (""CLEANUP: CHECKING GROUP WITH "" + str(count units _x) + "" UNITS"");" \n
|
||||
" if (count units _x==0) then {" \n
|
||||
" deleteGroup _x;" \n
|
||||
" //diag_log (""CLEANUP: DELETING A GROUP"");" \n
|
||||
" };" \n
|
||||
"} forEach allGroups;" \n
|
||||
"" \n
|
||||
"/*" \n
|
||||
"//Check for Ammobox" \n
|
||||
" {" \n
|
||||
" if(!(_x isKindOf ""WeaponHolder"")) then {" \n
|
||||
" diag_log (""CLEANUP: DELETING AN AMMOBOX "" + (typeOf _x));" \n
|
||||
" deleteVehicle _x;" \n
|
||||
" };" \n
|
||||
" } forEach allMissionObjects ""ReammoBox"";" \n
|
||||
"*/" \n
|
||||
"" \n
|
||||
"//Check for hackers" \n
|
||||
" {" \n
|
||||
" if(vehicle _x != _x && !(vehicle _x in _safety) && (typeOf vehicle _x) != ""ParachuteWest"") then {" \n
|
||||
" diag_log (""CLEANUP: KILLING A HACKER "" + (name _x) + "" "" + str(_x) + "" IN "" + (typeOf vehicle _x));" \n
|
||||
" (vehicle _x) setDamage 1;" \n
|
||||
" _x setDamage 1;" \n
|
||||
" };" \n
|
||||
" } forEach allUnits;" \n
|
||||
"" \n
|
||||
"/*" \n
|
||||
"//Let's move this into the body removal sequence so uncontrolled flies are removed only if corpses are cleaned" \n
|
||||
"//Check Flies" \n
|
||||
"_isOK=-1;" \n
|
||||
"_dwUSOFC=0;" \n
|
||||
"{" \n
|
||||
" //_isOk = {!alive _x} count (nearestObjects [_x, [""CAManBase""], 2]);" \n
|
||||
" _isOk = {!alive _x} count (_x nearEntities [[""CAManBase""], 2]);" \n
|
||||
" if (_isOk>-1) then {" \n
|
||||
" diag_log (""DW_DEBUG _isOK: "" + str(_isOK) );" \n
|
||||
" };" \n
|
||||
" if ((_isOk>-1) AND (isOK<1)) then {" \n
|
||||
" //diag_log (""CLEANUP: DELETING A SOUND OF FLIES"");" \n
|
||||
"_dwUSOFC=_dwUSOFC+1;" \n
|
||||
" deleteVehicle _x;" \n
|
||||
" diag_log (""CLEANUP: DELETED AN UNCONTROLLED SOUND OF FLIES:"" + str(_dwUSOFC) );" \n
|
||||
" };" \n
|
||||
"} forEach allMissionObjects ""Sound_Flies"";" \n
|
||||
"*/" \n
|
||||
"" \n
|
||||
"dayz_serverObjectMonitor = _safety;"/*%FSM</STATEINIT""">*/;
|
||||
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
|
||||
class Links
|
||||
{
|
||||
/*%FSM<LINK "true">*/
|
||||
class true
|
||||
{
|
||||
priority = 0.000000;
|
||||
to="waiting";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"true"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
};
|
||||
};
|
||||
/*%FSM</STATE>*/
|
||||
/*%FSM<STATE "prepare">*/
|
||||
class prepare
|
||||
{
|
||||
name = "prepare";
|
||||
init = /*%FSM<STATEINIT""">*/"diag_log (""CLEANUP: INITIALIZING CLEANUP SCRIPT"");" \n
|
||||
"" \n
|
||||
"_safety = dayz_serverObjectMonitor;" \n
|
||||
"" \n
|
||||
"_lastUpdate = time;" \n
|
||||
"_timeNem = time;" \n
|
||||
"_deadBodies = [];" \n
|
||||
"_lastNeedUpdate = time;" \n
|
||||
"_maxBodies = 15;" \n
|
||||
""/*%FSM</STATEINIT""">*/;
|
||||
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
|
||||
class Links
|
||||
{
|
||||
/*%FSM<LINK "true">*/
|
||||
class true
|
||||
{
|
||||
priority = 0.000000;
|
||||
to="waiting";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"true"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
};
|
||||
};
|
||||
/*%FSM</STATE>*/
|
||||
/*%FSM<STATE "update_objects">*/
|
||||
class update_objects
|
||||
{
|
||||
name = "update_objects";
|
||||
init = /*%FSM<STATEINIT""">*/"diag_log format[""DEBUG: needUpdate_objects=%1"",needUpdate_objects];" \n
|
||||
"{" \n
|
||||
"// _x setVariable [""needUpdate"",false,true];" \n
|
||||
" needUpdate_objects = needUpdate_objects - [_x];" \n
|
||||
" [_x,""all""] call server_updateObject;" \n
|
||||
"" \n
|
||||
"} forEach needUpdate_objects;" \n
|
||||
""/*%FSM</STATEINIT""">*/;
|
||||
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
|
||||
class Links
|
||||
{
|
||||
/*%FSM<LINK "true">*/
|
||||
class true
|
||||
{
|
||||
priority = 0.000000;
|
||||
to="general_cleanup";
|
||||
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
|
||||
condition=/*%FSM<CONDITION""">*/"true"/*%FSM</CONDITION""">*/;
|
||||
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
|
||||
};
|
||||
/*%FSM</LINK>*/
|
||||
};
|
||||
};
|
||||
/*%FSM</STATE>*/
|
||||
};
|
||||
initState="init";
|
||||
finalStates[] =
|
||||
{
|
||||
};
|
||||
};
|
||||
/*%FSM</COMPILE>*/
|
||||
294
SQF/dayz_server/system/server_monitor.sqf
Normal file
294
SQF/dayz_server/system/server_monitor.sqf
Normal file
@@ -0,0 +1,294 @@
|
||||
private ["_result","_pos","_wsDone","_dir","_block","_isOK","_countr","_objWpnTypes","_objWpnQty","_dam","_selection","_totalvehicles","_object","_idKey","_type","_ownerID","_worldspace","_intentory","_hitPoints","_fuel","_damage","_date","_script","_key","_outcome","_vehLimit","_hiveResponse","_objectCount","_codeCount","_objectArray"];
|
||||
[]execVM "\z\addons\dayz_server\system\s_fps.sqf"; //server monitor FPS (writes each ~181s diag_fps+181s diag_fpsmin*)
|
||||
|
||||
dayz_versionNo = getText(configFile >> "CfgMods" >> "DayZ" >> "version");
|
||||
dayz_hiveVersionNo = getNumber(configFile >> "CfgMods" >> "DayZ" >> "hiveVersion");
|
||||
_script = getText(missionConfigFile >> "onPauseScript");
|
||||
|
||||
if ((count playableUnits == 0) and !isDedicated) then {
|
||||
isSinglePlayer = true;
|
||||
};
|
||||
|
||||
waitUntil{initialized}; //means all the functions are now defined
|
||||
|
||||
diag_log "HIVE: Starting";
|
||||
|
||||
if (_script != "") then
|
||||
{
|
||||
diag_log "MISSION: File Updated";
|
||||
} else {
|
||||
while {true} do
|
||||
{
|
||||
diag_log "MISSION: File Needs Updating";
|
||||
sleep 1;
|
||||
};
|
||||
};
|
||||
|
||||
waituntil{isNil "sm_done"}; // prevent server_monitor be called twice (bug during login of the first player)
|
||||
|
||||
//Set the Time
|
||||
//Send request
|
||||
_key = "CHILD:307:";
|
||||
_result = _key call server_hiveReadWrite;
|
||||
_outcome = _result select 0;
|
||||
if(_outcome == "PASS") then {
|
||||
_date = _result select 1;
|
||||
|
||||
if(dayz_fullMoonNights) then {
|
||||
//date setup
|
||||
_year = _date select 0;
|
||||
_month = _date select 1;
|
||||
_day = _date select 2;
|
||||
_hour = _date select 3;
|
||||
_minute = _date select 4;
|
||||
|
||||
//Force full moon nights
|
||||
_date = [2012,6,6,_hour,_minute];
|
||||
};
|
||||
|
||||
if(isDedicated) then {
|
||||
//["dayzSetDate",_date] call broadcastRpcCallAll;
|
||||
setDate _date;
|
||||
dayzSetDate = _date;
|
||||
publicVariable "dayzSetDate";
|
||||
};
|
||||
|
||||
diag_log ("HIVE: Local Time set to " + str(_date));
|
||||
};
|
||||
|
||||
|
||||
// Custom Configs
|
||||
if(isnil "MaxVehicleLimit") then {
|
||||
MaxVehicleLimit = 50;
|
||||
};
|
||||
if(isnil "MaxHeliCrashes") then {
|
||||
MaxHeliCrashes = 5;
|
||||
};
|
||||
if(isnil "MaxDynamicDebris") then {
|
||||
MaxDynamicDebris = 100;
|
||||
};
|
||||
// Custon Configs End
|
||||
|
||||
if (isServer and 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")}) || {(_hiveResponse select 1 > 2000)}) then {
|
||||
diag_log ("HIVE: connection problem... HiveExt response:"+str(_hiveResponse));
|
||||
_hiveResponse = ["",0];
|
||||
}
|
||||
else {
|
||||
diag_log ("HIVE: found "+str(_hiveResponse select 1)+" objects" );
|
||||
_i = 99; // break
|
||||
};
|
||||
};
|
||||
|
||||
_objectArray = [];
|
||||
if ((_hiveResponse select 0) == "ObjectStreamStart") then {
|
||||
_objectCount = _hiveResponse select 1;
|
||||
diag_log ("HIVE: Commence Object Streaming...");
|
||||
for "_i" from 1 to _objectCount do {
|
||||
_hiveResponse = _key call server_hiveReadWrite;
|
||||
_objectArray set [_i - 1, _hiveResponse];
|
||||
//diag_log (format["HIVE dbg %1 %2", typeName _hiveResponse, _hiveResponse]);
|
||||
};
|
||||
diag_log ("HIVE: got " + str(count _objectArray) + " objects");
|
||||
};
|
||||
|
||||
// # START OF STREAMING #
|
||||
_countr = 0;
|
||||
_totalvehicles = 0;
|
||||
{
|
||||
//Parse Array
|
||||
_countr = _countr + 1;
|
||||
|
||||
_idKey = _x select 1;
|
||||
_type = _x select 2;
|
||||
_ownerID = _x select 3;
|
||||
|
||||
_worldspace = _x select 4;
|
||||
_intentory= _x select 5;
|
||||
_hitPoints= _x select 6;
|
||||
_fuel = _x select 7;
|
||||
_damage = _x select 8;
|
||||
|
||||
_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];
|
||||
|
||||
// fix for leading zero issues on safe codes after restart
|
||||
if (_object isKindOf "VaultStorageLocked") 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];
|
||||
};
|
||||
};
|
||||
|
||||
_object setVariable ["CharacterID", _ownerID, true];
|
||||
|
||||
clearWeaponCargoGlobal _object;
|
||||
clearMagazineCargoGlobal _object;
|
||||
|
||||
if ((typeOf _object) in dayz_allowedObjects) then {
|
||||
_object addMPEventHandler ["MPKilled",{_this call object_handleServerKilled;}];
|
||||
// Test disabling simulation server side on buildables only.
|
||||
_object enableSimulation false;
|
||||
};
|
||||
|
||||
_object setdir _dir;
|
||||
_object setpos _pos;
|
||||
_object setDamage _damage;
|
||||
|
||||
if (count _intentory > 0) then {
|
||||
if (_object isKindOf "VaultStorageLocked") then {
|
||||
// Fill variables with loot
|
||||
_object setVariable ["WeaponCargo", (_intentory select 0), true];
|
||||
_object setVariable ["MagazineCargo", (_intentory select 1), true];
|
||||
_object setVariable ["BackpackCargo", (_intentory select 2), true];
|
||||
_object setVariable ["OEMPos", _pos, true];
|
||||
} else {
|
||||
|
||||
//Add weapons
|
||||
_objWpnTypes = (_intentory select 0) select 0;
|
||||
_objWpnQty = (_intentory select 0) select 1;
|
||||
_countr = 0;
|
||||
{
|
||||
if (_x == "Crossbow") then { _x = "Crossbow_DZ" }; // Convert Crossbow to Crossbow_DZ
|
||||
_isOK = isClass(configFile >> "CfgWeapons" >> _x);
|
||||
if (_isOK) then {
|
||||
_block = getNumber(configFile >> "CfgWeapons" >> _x >> "stopThis") == 1;
|
||||
if (!_block) then {
|
||||
_object addWeaponCargoGlobal [_x,(_objWpnQty select _countr)];
|
||||
};
|
||||
};
|
||||
_countr = _countr + 1;
|
||||
} forEach _objWpnTypes;
|
||||
|
||||
//Add Magazines
|
||||
_objWpnTypes = (_intentory select 1) select 0;
|
||||
_objWpnQty = (_intentory select 1) select 1;
|
||||
_countr = 0;
|
||||
{
|
||||
if (_x == "BoltSteel") then { _x = "WoodenArrow" }; // Convert BoltSteel to WoodenArrow
|
||||
_isOK = isClass(configFile >> "CfgMagazines" >> _x);
|
||||
if (_isOK) then {
|
||||
_block = getNumber(configFile >> "CfgMagazines" >> _x >> "stopThis") == 1;
|
||||
if (!_block) then {
|
||||
_object addMagazineCargoGlobal [_x,(_objWpnQty select _countr)];
|
||||
};
|
||||
};
|
||||
_countr = _countr + 1;
|
||||
} forEach _objWpnTypes;
|
||||
|
||||
//Add Backpacks
|
||||
_objWpnTypes = (_intentory select 2) select 0;
|
||||
_objWpnQty = (_intentory select 2) select 1;
|
||||
_countr = 0;
|
||||
{
|
||||
_isOK = isClass(configFile >> "CfgVehicles" >> _x);
|
||||
if (_isOK) then {
|
||||
_block = getNumber(configFile >> "CfgVehicles" >> _x >> "stopThis") == 1;
|
||||
if (!_block) then {
|
||||
_object addBackpackCargoGlobal [_x,(_objWpnQty select _countr)];
|
||||
};
|
||||
};
|
||||
_countr = _countr + 1;
|
||||
} forEach _objWpnTypes;
|
||||
};
|
||||
};
|
||||
|
||||
if (_object isKindOf "AllVehicles") then {
|
||||
{
|
||||
_selection = _x select 0;
|
||||
_dam = _x select 1;
|
||||
if (_selection in dayZ_explosiveParts and _dam > 0.8) then {_dam = 0.8};
|
||||
[_object,_selection,_dam] call object_setFixServer;
|
||||
} forEach _hitpoints;
|
||||
|
||||
_object setFuel _fuel;
|
||||
|
||||
if (!((typeOf _object) in dayz_allowedObjects)) then {
|
||||
|
||||
_object setvelocity [0,0,1];
|
||||
_object call fnc_vehicleEventHandler;
|
||||
|
||||
if(_ownerID != "0") then {
|
||||
_object setvehiclelock "locked";
|
||||
};
|
||||
|
||||
_totalvehicles = _totalvehicles + 1;
|
||||
|
||||
// total each vehicle
|
||||
serverVehicleCounter set [count serverVehicleCounter,_type];
|
||||
};
|
||||
};
|
||||
|
||||
//Monitor the object
|
||||
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object];
|
||||
};
|
||||
} forEach _objectArray;
|
||||
// # END OF STREAMING #
|
||||
|
||||
// spawn_vehicles
|
||||
_vehLimit = MaxVehicleLimit - _totalvehicles;
|
||||
diag_log ("HIVE: Spawning # of Vehicles: " + str(_vehLimit));
|
||||
if(_vehLimit > 0) then {
|
||||
for "_x" from 1 to _vehLimit do {
|
||||
[] spawn spawn_vehicles;
|
||||
};
|
||||
};
|
||||
// spawn_roadblocks
|
||||
diag_log ("HIVE: Spawning # of Debris: " + str(MaxDynamicDebris));
|
||||
for "_x" from 1 to MaxDynamicDebris do {
|
||||
[] spawn spawn_roadblocks;
|
||||
};
|
||||
|
||||
if(isnil "dayz_MapArea") then {
|
||||
dayz_MapArea = 10000;
|
||||
};
|
||||
if(isnil "HeliCrashArea") then {
|
||||
HeliCrashArea = dayz_MapArea / 2;
|
||||
};
|
||||
|
||||
// [_guaranteedLoot, _randomizedLoot, _frequency, _variance, _spawnChance, _spawnMarker, _spawnRadius, _spawnFire, _fadeFire]
|
||||
nul = [3, 4, (50 * 60), (15 * 60), 0.75, 'center', HeliCrashArea, true, false] spawn server_spawnCrashSite;
|
||||
|
||||
// Epoch Events
|
||||
nul = [] spawn server_spawnEvents;
|
||||
|
||||
allowConnection = true;
|
||||
sm_done = true;
|
||||
};
|
||||
Reference in New Issue
Block a user