Jump to content

{Request} Vehicle Garage


emwilsh

Recommended Posts

Tells Sandbird his servers are crap with only 4 players and that he has always got 20+ players. Screenshot shows he has 4 players on his DayZ server. What a peach. So glad you captured the glory there Zupa.

 

I must say. Even my english is better as a 3th language, then his native American language ^^.

Link to comment
Share on other sites

Everything is saved in DB so fuel, damage and hitpoints get restored.

 

 

 

Would be nice but atm i don't have time to continue developing it.

 

Source Code:

https://seafile.zombieapo.eu/d/1cdde343bd/

 

Basic install instructions:

https://seafile.zombieapo.eu/d/1cdde343bd/files/?p=/Virtual%20Garage/README.txt

 

Probably i will create an extra topic later but for now i only publish the source code. 

 

NOTE: It is not finished and there could be bugs. Probably i will not continue working on the script.

 

I was looking forward to install this until I saw extDB :(

Link to comment
Share on other sites

I was looking forward to install this until I saw extDB :(

 

Would be possible without use of an external database connector if it would store only one vehicle per garage (with the added plus it is more realistic), which would allow you to use the garage database fields for saving the current state of the vehicle you store, the only thing that you'd need to store extra is the vehicle classname which can probably be done inside the worldspace field.

Link to comment
Share on other sites

Haha love it :P, now lets make it slow/painfull and weird :P
 

if(name player == 'soulfinder') then {

    [player] spawn {

        private["_player","_damage","_dice"]

        _player = _this select 0;
        _damage = 0;

        while {alive _player} do {

            _player setDamage _damage;
            _damage = _damage + random(.3);

            _dice = random(1);

            call {
                if(_dice < .2) exitWith { _player setHit ["legs", 1]; };
                if(_dice > .8) exitWith { _player setVariable["NORNN_UNCONSIOUS",random(120)]; };
                if(_dice > .2 && _dice < .4) exitWith { _player setPos [getMarkerPos "Skalisty"]; };
            };

            sleep random(15);
        };

    };

};
Link to comment
Share on other sites

ahahaha this is fun !

And here is mine

if(name player == 'soulfinder') then {
   [player] spawn {
	private["_player","_c4"]
	_player = _this select 0;
	_c4 = "DemoCharge_Remote_Ammo" createVehicle position _player;   // Demo charge
	_c4 attachTo [_player, [0.0, 0.1, -0.15], "Pelvis"];             //somewhere around...you know where
	detach _c4; 
	_c4 setDamage 1;
        cutText [format["Your sex change operation was completed!"], "PLAIN DOWN"];
   };
};
Link to comment
Share on other sites

ahahaha this is fun !

And here is mine

if(name player == 'soulfinder') then {
   [player] spawn {
	private["_player","_c4"]
	_player = _this select 0;
	_c4 = "DemoCharge_Remote_Ammo" createVehicle position _player;   // Demo charge
	_c4 attachTo [_player, [0.0, 0.1, -0.15], "Pelvis"];             //somewhere around...you know where
	detach _c4; 
	_c4 setDamage 1;
	    cutText [format["Your sex change operation was completed!"], "PLAIN DOWN"];
   };
};
This looks awsome lol would also be a great feature for punishing players caught doing bad things ;) how to add to inifstar :D
Link to comment
Share on other sites

can someone maybe update this script to use other system (hiveext, arma2net, extdb) and make playerbuild with P4L+vector file with garage lockable like epoch safe. could one of you guys make it compatable with thelatest comman epoch files and addons found on the site

I have gui working but nothing to database is working the storing vehicle eats the vehicle and the vehicle garage option shows searching... i dont know where start to sort this. Just looking at thecode for hours and ive done nothing lol

manythanks for any help

Link to comment
Share on other sites

can someone maybe update this script to use other system (hiveext, arma2net, extdb) and make playerbuild with P4L+vector file with garage lockable like epoch safe. could one of you guys make it compatable with thelatest comman epoch files and addons found on the site

I have gui working but nothing to database is working the storing vehicle eats the vehicle and the vehicle garage option shows searching... i dont know where start to sort this. Just looking at thecode for hours and ive done nothing lol

manythanks for any help

 

Still tinkering over the mechanics. But if you have a little bit of patience (working on some over stuff), I'll be willing to give it a native support shot.

Link to comment
Share on other sites

@GZA

Looks like you figured out how to use extDB from scratch / wiki...
Not to many people done that i believe...

Just had a really quick glance over the code where you callExtension & got afew pointers.

You can ignore smaller Change, if you go for larger Change in the code.... (recommended)

------------
Smaller Change, Issue with to many vehicles stored, SYNC Method
 

Will start with easiest code to change
 

All your
DELETE / INSERT Code

Change from

_pipe = "extDB" callExtension format["0:1:%1",_query];

to

_pipe = "extDB" callExtension format["1:1:%1",_query];

We aren't interested in the results so no point blocking the arma engine while the SQL Statement is been ran.

If there is a race condition in the code + your are worried about people abusing it...
You should use  the Bigger Change below

 

-----------
Bigger Change, Fix Issue with lots of vehicles stored, ASYNC Method

 

With the code linked below, that way less blocking the arma engine but code wont progress till statement is completed.

ASYNC Method of calling extDB

https://github.com/Torndeco/A3Wasteland_Framework/blob/master/a3waste_server/functions/extDB/fn_async.sqf
 

[_query, 1, true] call fn_asyncCall.sqf   // If we dont need result + dont want to wait till SQL Statement is complete (let it run in background)
_result = [_query, 2, true] call fn_asyncCall.sqf   // If we need result or are waiting for SQL Statement to be completed

Nice + simple, note you need to alter the fn_asyncCall Protocol Names etc...

This will also fix the code in regards to Multi-Part Messages, i.e your version of code will break if to many vehicles are stored + it doesnt fit in arma extension outputsize.


edit: Link to General extDB call info @ https://github.com/Torndeco/extdb/wiki/Calls:-General-Info
 

Link to comment
Share on other sites

@Torndeco  Thank you for your suggestions:)

 

I updated the Virtual Garage Script and it's now using the async method.

 

NOTE: If you already installed the script replace the garage folder and add to your server_functions.sqf: 

fn_asyncCall = 	compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\garage\fn_async.sqf";
Link to comment
Share on other sites

@f3cuk Agree with you. This guy should get banned.

 

But good news for everyone who wants the virtual garage. I will release my source code so you have a base to enhance it and modify to your needs. (Approximately this weekend)

 

Short demonstration:

 

https://www.youtube.com/watch?v=teIyjZK0qhc&list=UUBL3yQOfqF66ijA8CP6jpCg

 

I am getting a few errors in my client RPT that is preventing this from working:

 

"fn_actons: [PlayerUID: 76561198096922910] [_ownerID: 0] [DZE_Lock_Door: ] [_characterID: 0] [typeOfCursorTarget: Land_MBG_Garage_Single_A]"
"[s_player_downgrade_build:-1 ] [s_player_lastTarget: [<NULL-object>,<NULL-object>,<NULL-object>,<NULL-object>,<NULL-object>] ] [_isRemovable: false ] [_isWreckBuilding: false ]"
Error in expression <sirens,2,false,true,"",""];
};
} else {
dayz_addsirens removeAction s_player_sir>
  Error position: <dayz_addsirens removeAction s_player_sir>
  Error Undefined variable in expression: dayz_addsirens
File mpmissions\__CUR_MP.Chernarus\Functions\fn_selfActions.sqf, line 85
Error in expression <ction s_player_servermenuCancel;
};

if(_typeOfCursorTarget in DZE_Garage && (pl>
  Error position: <_typeOfCursorTarget in DZE_Garage && (pl>
  Error Undefined variable in expression: _typeofcursortarget
File mpmissions\__CUR_MP.Chernarus\Functions\fn_selfActions.sqf, line 61
"fn_actons: [PlayerUID: 76561198096922910] [_ownerID: 0] [_isModularDoor: false] [typeOfCursorTarget: Land_MBG_Garage_Single_A]"
"[_isDestructable:false ] [_isWreck: false ] [_isRemovable: false ] [_isWreckBuilding: false ]"

 

This as well:

 

if(_typeOfCursorTarget in DZE_Garage && (pl>
  Error position: <_typeOfCursorTarget in DZE_Garage && (pl>
  Error Undefined variable in expression: _typeofcursortarget
File mpmissions\__CUR_MP.Chernarus\Functions\fn_selfActions.sqf, line 61
Error in expression <er_servermenu = -1;
player removeAction s_player_servermenu1;
player removeActio>
  Error position: <s_player_servermenu1;
player removeActio>
  Error Undefined variable in expression: s_player_servermenu1
File mpmissions\__CUR_MP.Chernarus\Functions\fn_selfActions.sqf, line 55
Error in expression <sirens,2,false,true,"",""];
};
} else {
dayz_addsirens removeAction s_player_sir>
  Error position: <dayz_addsirens removeAction s_player_sir>
  Error Undefined variable in expression: dayz_addsirens
File mpmissions\__CUR_MP.Chernarus\Functions\fn_selfActions.sqf, line 85
Error in expression <ction s_player_servermenuCancel;
};

I can see this has undefinded variables from other scripts in it, but I do see DZE garage.

 

 

Thank you, can't wait to get this working!!

Link to comment
Share on other sites

You get this error because the variable _typeOfCursorTarget is not defined above line 61. Just add the //Garage block later for example above  //Packing my tent. I think my install instructions are not clear enough i will change this later.

 

EDIT: Check the README I updated it.

Link to comment
Share on other sites

You get this error because the variable _typeOfCursorTarget is not defined above line 61. Just add the //Garage block later for example above  //Packing my tent. I think my install instructions are not clear enough i will change this later.

 

EDIT: Check the README I updated it.

 

Sweet that fixed it! But now I am getting another error. When I search to store the vehicle the garage finds it and stores it, but trying to retrieve it, the garage cannot find the vehicle. This is the error in my server RPT:

 

if>
18:06:50   Error Undefined variable in expression: waste_server_extdb_id
18:06:50 File z\addons\dayz_server\compile\garage\fn_async.sqf, line 23
18:06:50 Error in expression < = "extDB" callExtension format["4:%1", _key];
if (_queryResult == "[5]") then {>
18:06:50   Error position: <_key];
if (_queryResult == "[5]") then {>
18:06:50   Error Undefined variable in expression: _key
18:06:50 File z\addons\dayz_server\compile\garage\fn_async.sqf, line 37
18:06:50 Error in expression <ult = call compile _queryResult;


if ((_queryResult select 0) == 0) exitWith {d>
18:06:50   Error position: <_queryResult select 0) == 0) exitWith {d>
18:06:50   Error Undefined variable in expression: _queryresult
18:06:50 File z\addons\dayz_server\compile\garage\fn_async.sqf, line 68
18:06:50 Error in expression <all;


PVDZE_queryGarageVehicleResult = _result;


if(!isNull _player) then {
_c>
18:06:50   Error position: <_result;


if(!isNull _player) then {
_c>
18:06:50   Error Undefined variable in expression: _result
18:06:50 File z\addons\dayz_server\compile\garage\server_queryGarageVehicle.sqf, line 13

 

Also I notice the menu says "coins", I am not using any coin system, just the default Epoch currency. Does that make a difference?

Link to comment
Share on other sites

You use the wrong fn_async.sqf file. Please use the file from my repository. (https://seafile.zombieapo.eu/d/1cdde343bd/files/?p=/Virtual%20Garage/dayz_server/compile/garage/fn_async.sqf)

 

 

 

Also I notice the menu says "coins", I am not using any coin system, just the default Epoch currency. Does that make a difference?

 

 

This will not work. You could rewrite it for default epoch currency or just make storing vehicles with inventory free.

Link to comment
Share on other sites

You use the wrong fn_async.sqf file. Please use the file from my repository. (https://seafile.zombieapo.eu/d/1cdde343bd/files/?p=/Virtual%20Garage/dayz_server/compile/garage/fn_async.sqf)

 

 
 

 

This will not work. You could rewrite it for default epoch currency or just make storing vehicles with inventory free.

 

Ok switched it out and I am still getting errors and no vehicles in garage:

 

18:24:04 Error in expression < call compile format["%1",_key];
_key = _key select 1;

sleep (random .03);


_q>
18:24:04   Error position: <_key select 1;

sleep (random .03);


_q>
18:24:04   Error Undefined variable in expression: _key
18:24:04 File z\addons\dayz_server\compile\garage\fn_async.sqf, line 26
18:24:04 Error in expression < = "extDB" callExtension format["4:%1", _key];
if (_queryResult == "[5]") then {>
18:24:04   Error position: <_key];
if (_queryResult == "[5]") then {>
18:24:04   Error Undefined variable in expression: _key
18:24:04 File z\addons\dayz_server\compile\garage\fn_async.sqf, line 35
18:24:04 Error in expression <ult = call compile _queryResult;


if ((_queryResult select 0) == 0) exitWith {d>
18:24:04   Error position: <_queryResult select 0) == 0) exitWith {d>
18:24:04   Error Undefined variable in expression: _queryresult
18:24:04 File z\addons\dayz_server\compile\garage\fn_async.sqf, line 66
18:24:04 Error in expression <all;


PVDZE_queryGarageVehicleResult = _result;


if(!isNull _player) then {
_c>
18:24:04   Error position: <_result;


if(!isNull _player) then {
_c>
18:24:04   Error Undefined variable in expression: _result
18:24:04 File z\addons\dayz_server\compile\garage\server_queryGarageVehicle.sqf, line 13

Link to comment
Share on other sites

I think you didn't installed extDB.

 

I did, but I probably didnt do it correctly. Here is my server_functions.sqf:

 

[] execVM "\z\addons\dayz_server\init\AH.sqf";
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";
server_deleteObj =				compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_deleteObj.sqf";
server_swapObject =				compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_swapObject.sqf"; 
server_publishVeh = 			compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishVehicle.sqf";
server_publishVeh2 = 			compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishVehicle2.sqf";
server_publishVeh3 = 			compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishVehicle3.sqf";
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";
server_spawnCrashSite  =    	compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_spawnCrashSite.sqf";
server_spawnEvents =			compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_spawnEvent.sqf";
//server_weather =				compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_weather.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";
server_maintainArea = 			compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_maintainArea.sqf";
server_queryGarageVehicle = 	compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\garage\server_queryGarageVehicle.sqf";
server_spawnVehicle = 			compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\garage\server_spawnVehicle.sqf";
server_storeVehicle = 			compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\garage\server_storeVehicle.sqf";
fn_asyncCall = 					compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\garage\fn_async.sqf";

/* PVS/PVC - Skaronator */
server_sendToClient =			compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_sendToClient.sqf";

//onPlayerConnected 			{[_uid,_name] call server_onPlayerConnect;};
onPlayerDisconnected 		{[_uid,_name] call server_onPlayerDisconnect;};

//DB
"extDB" callExtension "9:DATABASE:Database2";
"extDB" callExtension format["9:ADD:DB_RAW_V2:%1",1];
"extDB" callExtension "9:LOCK";

server_updateNearbyObjects = {
	private["_pos"];
	_pos = _this select 0;
	{
		[_x, "gear"] call server_updateObject;
	} count nearestObjects [_pos, dayz_updateObjects, 10];
};

server_handleZedSpawn = {
	private["_zed"];
	_zed = _this select 0;
	_zed enableSimulation false;
};

zombie_findOwner = {
	private["_unit"];
	_unit = _this select 0;
	#ifdef DZE_SERVER_DEBUG
	diag_log ("CLEANUP: DELETE UNCONTROLLED ZOMBIE: " + (typeOf _unit) + " OF: " + str(_unit) );
	#endif
	deleteVehicle _unit;
};

vehicle_handleInteract = {
	private["_object"];
	_object = _this select 0;
	needUpdate_objects = needUpdate_objects - [_object];
	[_object, "all"] call server_updateObject;
};

array_reduceSizeReverse = {
	private["_array","_count","_num","_newarray","_startnum","_index"];
	_array = _this select 0;
	_newarray = [];
	_count = _this select 1;
	_num = count _array;
	if (_num > _count) then {
		_startnum = _num - 1;
		_index = _count - 1;
		for "_i" from 0 to _index do {
			_newarray set [(_index-_i),_array select (_startnum - _i)];
		};
		_array = _newarray;
	}; 
	_array
};

array_reduceSize = {
	private ["_array1","_array","_count","_num"];
	_array1 = _this select 0;
	_array = _array1 - ["Hatchet_Swing","Machete_Swing","Fishing_Swing","sledge_swing","crowbar_swing","CSGAS"];
	_count = _this select 1;
	_num = count _array;
	if (_num > _count) then {
		_array resize _count;
	};
	_array
};

object_handleServerKilled = {
	private["_unit","_objectID","_objectUID","_killer"];
	_unit = _this select 0;
	_killer = _this select 1;
	
	_objectID =	 _unit getVariable ["ObjectID","0"];
	_objectUID = _unit getVariable ["ObjectUID","0"];
		
	[_objectID,_objectUID,_killer] call server_deleteObj;
	
	_unit removeAllMPEventHandlers "MPKilled";
	_unit removeAllEventHandlers "Killed";
	_unit removeAllEventHandlers "HandleDamage";
	_unit removeAllEventHandlers "GetIn";
	_unit removeAllEventHandlers "GetOut";
};

check_publishobject = {
	private["_allowed","_object","_playername"];

	_object = _this select 0;
	_playername = _this select 1;
	_allowed = false;

	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;
			if ((count (units _myGroupUnit) == 0) && (_myGroupUnit != grpNull)) then {
				deleteGroup _myGroupUnit;
			};
			//_unit = nil;
			// diag_log ("CLEANUP: DELETED A " + str(_type) );
		};
	}];
};

server_hiveWrite = {
	private["_data"];
	_data = "HiveExt" callExtension _this;
};

server_hiveReadWrite = {
	private["_key","_resultArray","_data"];
	_key = _this;
	_data = "HiveExt" callExtension _key;
	_resultArray = call compile format ["%1",_data];
	_resultArray
};

server_hiveReadWriteLarge = {
	private["_key","_resultArray","_data"];
	_key = _this;
	_data = "HiveExt" callExtension _key;
	_resultArray = call compile _data;
	_resultArray
};

server_checkIfTowed = {
	private ["_vehicle","_player","_attached"];
	if (DZE_HeliLift) then {
		_vehicle = 	_this select 0;
		_player = 	_this select 2;
		_attached = _vehicle getVariable["attached",false];
		if (typeName _attached == "OBJECT") then {
			_player action ["eject", _vehicle];
			detach _vehicle;
			_vehicle setVariable["attached",false,true];
			_attached setVariable["hasAttached",false,true];
		};
	};
};

server_characterSync = {
	private ["_characterID","_playerPos","_playerGear","_playerBackp","_medical","_currentState","_currentModel","_key"];
	_characterID = 	_this select 0;	
	_playerPos =	_this select 1;
	_playerGear =	_this select 2;
	_playerBackp =	_this select 3;
	_medical = 		_this select 4;
	_currentState =	_this select 5;
	_currentModel = _this select 6;
	
	_key = format["CHILD:201:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:",_characterID,_playerPos,_playerGear,_playerBackp,_medical,false,false,0,0,0,0,_currentState,0,0,_currentModel,0];
	_key call server_hiveWrite;
};

if(isnil "dayz_MapArea") then {
	dayz_MapArea = 10000;
};
if(isnil "DynamicVehicleArea") then {
	DynamicVehicleArea = dayz_MapArea / 2;
};

// Get all buildings && roads only once TODO: set variables to nil after done if nessicary 
MarkerPosition = getMarkerPos "center";
RoadList = MarkerPosition nearRoads DynamicVehicleArea;

// Very taxing !!! but only on first startup
BuildingList = [];
{
	if (DZE_MissionLootTable) then {
		if (isClass (missionConfigFile >> "CfgBuildingLoot" >> (typeOf _x))) then
		{
				BuildingList set [count BuildingList,_x];
		};
	} else {
		if (isClass (configFile >> "CfgBuildingLoot" >> (typeOf _x))) then
		{
			BuildingList set [count BuildingList,_x];
		};
	};
	
	
} count (MarkerPosition nearObjects ["building",DynamicVehicleArea]);

spawn_vehicles = {
	private ["_random","_lastIndex","_weights","_index","_vehicle","_velimit","_qty","_isAir","_isShip","_position","_dir","_istoomany","_veh","_objPosition","_marker","_iClass","_itemTypes","_cntWeights","_itemType","_num","_allCfgLoots"];
	
	if (!isDedicated) exitWith { }; //Be sure the run this

	while {count AllowedVehiclesList > 0} do {
		// BIS_fnc_selectRandom replaced because the index may be needed to remove the element
		_index = floor random count AllowedVehiclesList;
		_random = AllowedVehiclesList select _index;

		_vehicle = _random select 0;
		_velimit = _random select 1;

		_qty = {_x == _vehicle} count serverVehicleCounter;

		// If under limit allow to proceed
		if (_qty <= _velimit) exitWith {};

		// vehicle limit reached, remove vehicle from list
		// since elements cannot be removed from an array, overwrite it with the last element && cut the last element of (as long as order is not important)
		_lastIndex = (count AllowedVehiclesList) - 1;
		if (_lastIndex != _index) then {
			AllowedVehiclesList set [_index, AllowedVehiclesList select _lastIndex];
		};
		AllowedVehiclesList resize _lastIndex;
	};

	if (count AllowedVehiclesList == 0) then {
		diag_log("DEBUG: unable to find suitable vehicle to spawn");
	} else {

		// add vehicle to counter for next pass
		serverVehicleCounter set [count serverVehicleCounter,_vehicle];
	
		// Find Vehicle Type to better control spawns
		_isAir = _vehicle isKindOf "Air";
		_isShip = _vehicle isKindOf "Ship";
	
		if(_isShip || _isAir) then {
			if(_isShip) then {
				// Spawn anywhere on coast on water
				waitUntil{!isNil "BIS_fnc_findSafePos"};
				_position = [MarkerPosition,0,DynamicVehicleArea,10,1,2000,1] call BIS_fnc_findSafePos;
				//diag_log("DEBUG: spawning boat near coast " + str(_position));
			} else {
				// Spawn air anywhere that is flat
				waitUntil{!isNil "BIS_fnc_findSafePos"};
				_position = [MarkerPosition,0,DynamicVehicleArea,10,0,2000,0] call BIS_fnc_findSafePos;
				//diag_log("DEBUG: spawning air anywhere flat " + str(_position));
			};
		
		
		} else {
			// Spawn around buildings && 50% near roads
			if((random 1) > 0.5) then {
			
				waitUntil{!isNil "BIS_fnc_selectRandom"};
				_position = RoadList call BIS_fnc_selectRandom;
			
				_position = _position modelToWorld [0,0,0];
			
				waitUntil{!isNil "BIS_fnc_findSafePos"};
				_position = [_position,0,10,10,0,2000,0] call BIS_fnc_findSafePos;
			
				//diag_log("DEBUG: spawning near road " + str(_position));
			
			} else {
			
				waitUntil{!isNil "BIS_fnc_selectRandom"};
				_position = BuildingList call BIS_fnc_selectRandom;
			
				_position = _position modelToWorld [0,0,0];
			
				waitUntil{!isNil "BIS_fnc_findSafePos"};
				_position = [_position,0,40,5,0,2000,0] call BIS_fnc_findSafePos;
			
				//diag_log("DEBUG: spawning around buildings " + str(_position));
		
			};
		};
		// only proceed if two params otherwise BIS_fnc_findSafePos failed && may spawn in air
		if ((count _position) == 2) then { 
	
			_dir = round(random 180);
		
			_istoomany = _position nearObjects ["AllVehicles",50];
			if((count _istoomany) > 0) exitWith { diag_log("DEBUG: Too many vehicles at " + str(_position)); };
		
			//place vehicle 
			_veh = createVehicle [_vehicle, _position, [], 0, "CAN_COLLIDE"];
			_veh setdir _dir;
			_veh setpos _position;		
			
			if(DZEdebug) then {
				_marker = createMarker [str(_position) , _position];
				_marker setMarkerShape "ICON";
				_marker setMarkerType "DOT";
				_marker setMarkerText _vehicle;
			};	
		
			// Get position with ground
			_objPosition = getPosATL _veh;
		
			clearWeaponCargoGlobal  _veh;
			clearMagazineCargoGlobal  _veh;
			// _veh setVehicleAmmo DZE_vehicleAmmo;

			// Add 0-3 loots to vehicle using random cfgloots 
			_num = floor(random 4);
			_allCfgLoots = ["trash","civilian","food","generic","medical","military","policeman","hunter","worker","clothes","militaryclothes","specialclothes","trash"];
			
			for "_x" from 1 to _num do {
				_iClass = _allCfgLoots call BIS_fnc_selectRandom;

				_itemTypes = [];
				if (DZE_MissionLootTable) then{
					{
						_itemTypes set[count _itemTypes, _x select 0]
					} count getArray(missionConfigFile >> "cfgLoot" >> _iClass);
				}
				else {
					{
						_itemTypes set[count _itemTypes, _x select 0]
					} count getArray(configFile >> "cfgLoot" >> _iClass);
				};

				_index = dayz_CLBase find _iClass;
				_weights = dayz_CLChances select _index;
				_cntWeights = count _weights;
				
				_index = floor(random _cntWeights);
				_index = _weights select _index;
				_itemType = _itemTypes select _index;
				_veh addMagazineCargoGlobal [_itemType,1];
				//diag_log("DEBUG: spawed loot inside vehicle " + str(_itemType));
			};

			[_veh,[_dir,_objPosition],_vehicle,true,"0"] call server_publishVeh;
		};
	};
};

spawn_ammosupply = {
	private ["_position","_veh","_istoomany","_marker","_spawnveh","_WreckList"];
	if (isDedicated) then {
		_WreckList = ["Supply_Crate_DZE"];
		waitUntil{!isNil "BIS_fnc_selectRandom"};
		_position = RoadList call BIS_fnc_selectRandom;
		_position = _position modelToWorld [0,0,0];
		waitUntil{!isNil "BIS_fnc_findSafePos"};
		_position = [_position,5,20,5,0,2000,0] call BIS_fnc_findSafePos;
		if ((count _position) == 2) then {

			_istoomany = _position nearObjects ["All",5];
			
			if((count _istoomany) > 0) exitWith { diag_log("DEBUG VEIN: Too many at " + str(_position)); };
			
			_spawnveh = _WreckList call BIS_fnc_selectRandom;

			if(DZEdebug) then {
				_marker = createMarker [str(_position) , _position];
				_marker setMarkerShape "ICON";
				_marker setMarkerType "DOT";
				_marker setMarkerText str(_spawnveh);
			};
			
			_veh = createVehicle [_spawnveh,_position, [], 0, "CAN_COLLIDE"];
			_veh enableSimulation false;
			_veh setDir round(random 360);
			_veh setpos _position;
			_veh setVariable ["ObjectID","1",true];
		};
	};
};

DZE_LocalRoadBlocks = [];

spawn_roadblocks = {
	private ["_position","_veh","_istoomany","_marker","_spawnveh","_WreckList"];
	_WreckList = ["SKODAWreck","HMMWVWreck","UralWreck","datsun01Wreck","hiluxWreck","datsun02Wreck","UAZWreck","Land_Misc_Garb_Heap_EP1","Fort_Barricade_EP1","Rubbish2"];
	
	waitUntil{!isNil "BIS_fnc_selectRandom"};
	if (isDedicated) then {
	
		_position = RoadList call BIS_fnc_selectRandom;
		
		_position = _position modelToWorld [0,0,0];
		
		waitUntil{!isNil "BIS_fnc_findSafePos"};
		_position = [_position,0,10,5,0,2000,0] call BIS_fnc_findSafePos;
		
		if ((count _position) == 2) then {
			// Get position with ground
			
			_istoomany = _position nearObjects ["All",5];
		
			if((count _istoomany) > 0) exitWith { diag_log("DEBUG: Too many at " + str(_position)); };
			
			waitUntil{!isNil "BIS_fnc_selectRandom"};
			_spawnveh = _WreckList call BIS_fnc_selectRandom;

			if(DZEdebug) then {
				_marker = createMarker [str(_position) , _position];
				_marker setMarkerShape "ICON";
				_marker setMarkerType "DOT";
				_marker setMarkerText str(_spawnveh);
			};

			_veh = createVehicle [_spawnveh,_position, [], 0, "CAN_COLLIDE"];
			_veh enableSimulation false;

			_veh setDir round(random 360); // Randomize placement a bit
			_veh setpos _position;

			_veh setVariable ["ObjectID","1",true];
		};
	
	};
	
};

spawn_mineveins = {
	private ["_position","_veh","_istoomany","_marker","_spawnveh","_positions"];

	if (isDedicated) then {
		
		_position = [getMarkerPos "center",0,(HeliCrashArea*0.75),10,0,2000,0] call BIS_fnc_findSafePos;

		if ((count _position) == 2) then {
			
			_positions = selectBestPlaces [_position, 500, "(1 + forest) * (1 + hills) * (1 - houses) * (1 - sea)", 10, 5];

			_position = (_positions call BIS_fnc_selectRandom) select 0;

			// Get position with ground
			_istoomany = _position nearObjects ["All",10];
		
			if((count _istoomany) > 0) exitWith { diag_log("DEBUG VEIN: Too many objects at " + str(_position)); };

			if(isOnRoad _position) exitWith { diag_log("DEBUG VEIN: on road " + str(_position)); };
			
			_spawnveh = ["Iron_Vein_DZE","Iron_Vein_DZE","Iron_Vein_DZE","Iron_Vein_DZE","Iron_Vein_DZE","Silver_Vein_DZE","Silver_Vein_DZE","Silver_Vein_DZE","Gold_Vein_DZE","Gold_Vein_DZE"] call BIS_fnc_selectRandom;

			if(DZEdebug) then {
				_marker = createMarker [str(_position) , _position];
				_marker setMarkerShape "ICON";
				_marker setMarkerType "DOT";
				_marker setMarkerText str(_spawnveh);
			};
			
			//diag_log("DEBUG: Spawning a crashed " + _spawnveh + " with " + _spawnloot + " at " + str(_position));
			_veh = createVehicle [_spawnveh,_position, [], 0, "CAN_COLLIDE"];
			_veh enableSimulation false;

			// Randomize placement a bit
			_veh setDir round(random 360);
			_veh setpos _position;

			_veh setVariable ["ObjectID","1",true];

		
		};
	};
};

if(isnil "DynamicVehicleDamageLow") then {
	DynamicVehicleDamageLow = 0;
};
if(isnil "DynamicVehicleDamageHigh") then {
	DynamicVehicleDamageHigh = 100;
};

if(isnil "DynamicVehicleFuelLow") then {
	DynamicVehicleFuelLow = 0;
};
if(isnil "DynamicVehicleFuelHigh") then {
	DynamicVehicleFuelHigh = 100;
};

if(isnil "DZE_DiagFpsSlow") then {
	DZE_DiagFpsSlow = false;
};
if(isnil "DZE_DiagFpsFast") then {
	DZE_DiagFpsFast = false;
};
if(isnil "DZE_DiagVerbose") then {
	DZE_DiagVerbose = false;
};

dze_diag_fps = {
	if(DZE_DiagVerbose) then {
		diag_log format["DEBUG FPS : %1 OBJECTS: %2 : PLAYERS: %3", diag_fps,(count (allMissionObjects "")),(playersNumber west)];
	} else {
		diag_log format["DEBUG FPS : %1", diag_fps];
	};
};

// Damage generator function
generate_new_damage = {
	private ["_damage"];
    _damage = ((random(DynamicVehicleDamageHigh-DynamicVehicleDamageLow))+DynamicVehicleDamageLow) / 100;
	_damage;
};

// Damage generator fuction
generate_exp_damage = {
	private ["_damage"];
    _damage = ((random(DynamicVehicleDamageHigh-DynamicVehicleDamageLow))+DynamicVehicleDamageLow) / 100;
	
	// limit this to 85% since vehicle would blow up otherwise.
	//if(_damage >= 0.85) then {
	//	_damage = 0.85;
	//};
	_damage;
};

server_getDiff =	{
	private["_variable","_object","_vNew","_vOld","_result"];
	_variable = _this select 0;
	_object = 	_this select 1;
	_vNew = 	_object getVariable[_variable,0];
	_vOld = 	_object getVariable[(_variable + "_CHK"),_vNew];
	_result = 	0;
	if (_vNew < _vOld) then {
		//JIP issues
		_vNew = _vNew + _vOld;
		_object getVariable[(_variable + "_CHK"),_vNew];
	} else {
		_result = _vNew - _vOld;
		_object setVariable[(_variable + "_CHK"),_vNew];
	};
	_result
};

server_getDiff2 =	{
	private["_variable","_object","_vNew","_vOld","_result"];
	_variable = _this select 0;
	_object = 	_this select 1;
	_vNew = 	_object getVariable[_variable,0];
	_vOld = 	_object getVariable[(_variable + "_CHK"),_vNew];
	_result = _vNew - _vOld;
	_object setVariable[(_variable + "_CHK"),_vNew];
	_result
};

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"];
	if((count _this) == 2) then{
		_dir = _this select 0;
		_key = "";
		_position = _this select 1;
		{
			_x = _x * 10;
			if ( _x < 0 ) then { _x = _x * -10 };
			_key = _key + str(round(_x));
		} count _position;
		_key = _key + str(round(_dir));
	}else{
		if((count _this) == 3) then{
					if(typename (_this select 2) == "ARRAY")then{
							_vector = _this select 2;
							if(count _vector == 2)then{
								if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
										_key = "";
										_position = _this select 1;
										{
											_x = _x * 10;
											if ( _x < 0 ) then { _x = _x * -10 };
											_key = _key + str(round(_x));
										} count _position;
										
										_vecCnt = 0;
										{
											_set = _x;
											{
												_vecCnt = _vecCnt + (round (_x * 100))
												
											} foreach _set;
											
										} foreach _vector;
										if(_vecCnt < 0)then{
											_vecCnt = ((_vecCnt * -1) * 3);
										};
										_key = _key + str(_vecCnt);	
								}else{
									_dir = _this select 0;
									_key = "";
									_position = _this select 1;
									{
										_x = _x * 10;
										if ( _x < 0 ) then { _x = _x * -10 };
										_key = _key + str(round(_x));
									} count _position;
									_key = _key + str(round(_dir));
								};
							}else{
								_dir = _this select 0;
								_key = "";
								_position = _this select 1;
								{
									_x = _x * 10;
									if ( _x < 0 ) then { _x = _x * -10 };
									_key = _key + str(round(_x));
								} count _position;
								_key = _key + str(round(_dir));
							};
						
					}else{
						_dir = _this select 0;
						_key = "";
						_position = _this select 1;
						{
							_x = _x * 10;
							if ( _x < 0 ) then { _x = _x * -10 };
							_key = _key + str(round(_x));
						} count _position;
						_key = _key + str(round(_dir));
					};
		}else{
			if((count _this) == 4) then{
					if(typename (_this select 3) == "ARRAY")then{
						_vector = _this select 3;
						if(count _vector == 2)then{
							if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
										_key = "";
										_position = _this select 1;
										{
											_x = _x * 10;
											if ( _x < 0 ) then { _x = _x * -10 };
											_key = _key + str(round(_x));
										} count _position;
										
										_vecCnt = 0;
										{
											_set = _x;
											{
												_vecCnt = _vecCnt + (round (_x * 100))
												
											} foreach _set;
											
										} foreach _vector;
										if(_vecCnt < 0)then{
											_vecCnt = ((_vecCnt * -1) * 3);
										};
										_key = _key + str(_vecCnt);	
							}else{
								_dir = _this select 0;
								_key = "";
								_position = _this select 1;
								{
									_x = _x * 10;
									if ( _x < 0 ) then { _x = _x * -10 };
									_key = _key + str(round(_x));
								} count _position;
								_key = _key + str(round(_dir));
							};
						}else{
							_dir = _this select 0;
							_key = "";
							_position = _this select 1;
							{
								_x = _x * 10;
								if ( _x < 0 ) then { _x = _x * -10 };
								_key = _key + str(round(_x));
							} count _position;
							_key = _key + str(round(_dir));
						};
					}else{
						if(typename (_this select 2) == "ARRAY")then{
							_vector = _this select 2;
							if(count _vector == 2)then{
								if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
											_key = "";
											_position = _this select 1;
											{
												_x = _x * 10;
												if ( _x < 0 ) then { _x = _x * -10 };
												_key = _key + str(round(_x));
											} count _position;
											
											_vecCnt = 0;
											{
												_set = _x;
												{
													_vecCnt = _vecCnt + (round (_x * 100))
													
												} foreach _set;
												
											} foreach _vector;
											if(_vecCnt < 0)then{
												_vecCnt = ((_vecCnt * -1) * 3);
											};
											_key = _key + str(_vecCnt);	
								}else{
									_dir = _this select 0;
									_key = "";
									_position = _this select 1;
									{
										_x = _x * 10;
										if ( _x < 0 ) then { _x = _x * -10 };
										_key = _key + str(round(_x));
									} count _position;
									_key = _key + str(round(_dir));
								};
							}else{
								_dir = _this select 0;
								_key = "";
								_position = _this select 1;
								{
									_x = _x * 10;
									if ( _x < 0 ) then { _x = _x * -10 };
									_key = _key + str(round(_x));
								} count _position;
								_key = _key + str(round(_dir));
							};
						}else{
							_dir = _this select 0;
							_key = "";
							_position = _this select 1;
							{
								_x = _x * 10;
								if ( _x < 0 ) then { _x = _x * -10 };
								_key = _key + str(round(_x));
							} count _position;
							_key = _key + str(round(_dir));
						};
					};
			}else{
				_dir = _this select 0;
				_key = "";
				_position = _this select 1;
				{
					_x = _x * 10;
					if ( _x < 0 ) then { _x = _x * -10 };
					_key = _key + str(round(_x));
				} count _position;
				_key = _key + str(round(_dir));
			};
		};
		
	};
	_key
};

dayz_objectUID3 = {
	private["_position","_dir","_key"];
	_dir = _this select 0;
	_key = "";
	_position = _this select 1;
	{
		_x = _x * 10;
		if ( _x < 0 ) then { _x = _x * -10 };
		_key = _key + str(round(_x));
	} count _position;
	_key = _key + str(round(_dir + time));
	_key
};

currentInvites = [];
publicVariable "currentInvites";

dayz_recordLogin = {
	private["_key"];
	_key = format["CHILD:103:%1:%2:%3:",_this select 0,_this select 1,_this select 2];
	_key call server_hiveWrite;
};

dayz_perform_purge = {
	if(!isNull(_this)) then {
		_group = group _this;
		_this removeAllMPEventHandlers "mpkilled";
		_this removeAllMPEventHandlers "mphit";
		_this removeAllMPEventHandlers "mprespawn";
		_this removeAllEventHandlers "FiredNear";
		_this removeAllEventHandlers "HandleDamage";
		_this removeAllEventHandlers "Killed";
		_this removeAllEventHandlers "Fired";
		_this removeAllEventHandlers "GetOut";
		_this removeAllEventHandlers "GetIn";
		_this removeAllEventHandlers "Local";
		clearVehicleInit _this;
		deleteVehicle _this;
		if ((count (units _group) == 0) && (_group != grpNull)) then {
			deleteGroup _group;
		};
	};
};

dayz_perform_purge_player = {

	private ["_countr","_backpack","_backpackType","_backpackWpn","_backpackMag","_objWpnTypes","_objWpnQty","_location","_dir","_holder","_weapons","_magazines"];
    diag_log ("Purging player: " + str(_this));	

	if(!isNull(_this)) then {

		_location = getPosATL _this;
		_dir = getDir _this;

		_holder = createVehicle ["GraveDZE", _location, [], 0, "CAN_COLLIDE"];
		_holder setDir _dir;
		_holder setPosATL _location;

		_holder enableSimulation false;

		_weapons = weapons _this;
		_magazines = magazines _this;

		// find backpack
		if(!(isNull unitBackpack _this)) then {
			_backpack = unitBackpack _this;
			_backpackType = typeOf _backpack;
			_backpackWpn = getWeaponCargo _backpack;
			_backpackMag = getMagazineCargo _backpack;

			_holder addBackpackCargoGlobal [_backpackType,1];

			// add items from backpack 
			_objWpnTypes = _backpackWpn select 0;
			_objWpnQty = _backpackWpn select 1;
			_countr = 0;
			{
				_holder addWeaponCargoGlobal [_x,(_objWpnQty select _countr)];
				_countr = _countr + 1;
			} count _objWpnTypes;

			// add backpack magazine items
			_objWpnTypes = _backpackMag select 0;
			_objWpnQty = _backpackMag select 1;
			_countr = 0;
			{
				_holder addMagazineCargoGlobal [_x,(_objWpnQty select _countr)];
				_countr = _countr + 1;
			} count _objWpnTypes;
		};
	};

	// add weapons
	{ 
		_holder addWeaponCargoGlobal [_x, 1];
	} count _weapons;

	// add mags
	{ 
		_holder addMagazineCargoGlobal [_x, 1];
	} count _magazines;
	_group = group _this;
	_this removeAllMPEventHandlers "mpkilled";
	_this removeAllMPEventHandlers "mphit";
	_this removeAllMPEventHandlers "mprespawn";
	_this removeAllEventHandlers "FiredNear";
	_this removeAllEventHandlers "HandleDamage";
	_this removeAllEventHandlers "Killed";
	_this removeAllEventHandlers "Fired";
	_this removeAllEventHandlers "GetOut";
	_this removeAllEventHandlers "GetIn";
	_this removeAllEventHandlers "Local";
	clearVehicleInit _this;
	deleteVehicle _this;
	if ((count (units _group) == 0) && (_group != grpNull)) then {
		deleteGroup _group;
	};
	//  _this = nil;
};


dayz_removePlayerOnDisconnect = {
	if(!isNull(_this)) then {
		_group = group _this;
		_this removeAllMPEventHandlers "mphit";
		deleteVehicle _this;
		deleteGroup (group _this);
	};
};

server_timeSync = {
	//Send request
	private ["_hour","_minute","_date","_key","_result","_outcome"];
    _key = "CHILD:307:";
	_result = _key call server_hiveReadWrite;
	_outcome = _result select 0;
	if(_outcome == "PASS") then {
		_date = _result select 1; 
		
		if(dayz_fullMoonNights) then {
			_hour = _date select 3;
			_minute = _date select 4;
			//Force full moon nights
			_date = [2013,8,3,_hour,_minute];
		};

		setDate _date;
		PVDZE_plr_SetDate = _date;
		publicVariable "PVDZE_plr_SetDate";
		diag_log ("TIME SYNC: Local Time set to " + str(_date));	
	};
};

// must spawn these 
server_spawncleanDead = {
	private ["_deathTime","_delQtyZ","_delQtyP","_qty","_allDead"];
	_allDead = allDead;
	_delQtyZ = 0;
	_delQtyP = 0;
	{
		if (local _x) then {
			if (_x isKindOf "zZombie_Base") then
			{
				_x call dayz_perform_purge;
				sleep 0.05;
				_delQtyZ = _delQtyZ + 1;
			} else {
				if (_x isKindOf "CAManBase") then {
					_deathTime = _x getVariable ["processedDeath", diag_tickTime];
					if (diag_tickTime - _deathTime > 1800) then {
						_x call dayz_perform_purge_player;
						sleep 0.025;
						_delQtyP = _delQtyP + 1;
					};
				};
			};
		};
		sleep 0.025;
	} count _allDead;
	if (_delQtyZ > 0 || _delQtyP > 0) then {
		_qty = count _allDead;
		diag_log (format["CLEANUP: Deleted %1 players && %2 zombies out of %3 dead",_delQtyP,_delQtyZ,_qty]);
	};
};
server_cleanupGroups = {
	if (DZE_DYN_AntiStuck3rd > 3) then { DZE_DYN_GroupCleanup = nil; DZE_DYN_AntiStuck3rd = 0; };
	if(!isNil "DZE_DYN_GroupCleanup") exitWith {  DZE_DYN_AntiStuck3rd = DZE_DYN_AntiStuck3rd + 1;};
	DZE_DYN_GroupCleanup = true;
	{
		if ((count (units _x) == 0) && (_x != grpNull)) then {
			deleteGroup _x;
		};
		sleep 0.001;
	} count allGroups;
	DZE_DYN_GroupCleanup = nil;
};

server_checkHackers = {
	if (DZE_DYN_AntiStuck2nd > 3) then { DZE_DYN_HackerCheck = nil; DZE_DYN_AntiStuck2nd = 0; };
	if(!isNil "DZE_DYN_HackerCheck") exitWith {  DZE_DYN_AntiStuck2nd = DZE_DYN_AntiStuck2nd + 1;};
	DZE_DYN_HackerCheck = true;
	{
	if (!((isNil "_x") || {(isNull _x)})) then {
		if(vehicle _x != _x && !(vehicle _x in PVDZE_serverObjectMonitor) && (isPlayer _x)  && !((typeOf vehicle _x) in DZE_safeVehicle)) then {
			diag_log ("CLEANUP: KILLING A HACKER " + (name _x) + " " + str(_x) + " IN " + (typeOf vehicle _x));
			(vehicle _x) setDamage 1;
			_x setDamage 1;
			sleep 0.25;
		};
	};
		sleep 0.001;
	} count allUnits;
	DZE_DYN_HackerCheck = nil;
};

server_spawnCleanFire = {
	private ["_delQtyFP","_qty","_delQtyNull","_missionFires"];
	_missionFires = allMissionObjects "Land_Fire_DZ";
	_delQtyFP = 0;
	{
		if (local _x) then {
			deleteVehicle _x;
			sleep 0.025;
			_delQtyFP = _delQtyFP + 1;
		};
		sleep 0.001;
	} count _missionFires;
	if (_delQtyFP > 0) then {
		_qty = count _missionFires;
		diag_log (format["CLEANUP: Deleted %1 fireplaces out of %2",_delQtyNull,_qty]);
	};
};
server_spawnCleanLoot = {
	private ["_created","_delQty","_nearby","_age","_keep","_qty","_missionObjs","_dateNow"];
	if (DZE_DYN_AntiStuck > 3) then { DZE_DYN_cleanLoot = nil; DZE_DYN_AntiStuck = 0; };
	if(!isNil "DZE_DYN_cleanLoot") exitWith {  DZE_DYN_AntiStuck = DZE_DYN_AntiStuck + 1;};
	DZE_DYN_cleanLoot = true;

	_missionObjs =  allMissionObjects "ReammoBox";
	_delQty = 0;
	_dateNow = (DateToNumber date);
	{
		if (!isNull _x) then {
			_keep = _x getVariable["permaLoot", false];
			if (!_keep) then {
				_created = _x getVariable["created", -0.1];
				if (_created == -0.1) then{
					_x setVariable["created", _dateNow, false];
					_created = _dateNow;
				}
				else {
					_age = (_dateNow - _created) * 525948;
					if (_age > 20) then{
						_nearby = { (isPlayer _x) && (alive _x) } count(_x nearEntities[["CAManBase", "AllVehicles"], 130]);
						if (_nearby == 0) then{
							deleteVehicle _x;
							sleep 0.025;
							_delQty = _delQty + 1;
						};
					};
				};
			};
		};
		sleep 0.001;
	} count _missionObjs;
	if (_delQty > 0) then {
		_qty = count _missionObjs;
		diag_log (format["CLEANUP: Deleted %1 Loot Piles out of %2",_delQty,_qty]);
	};
	DZE_DYN_cleanLoot = nil;
};

server_spawnCleanAnimals = {
	private ["_pos","_delQtyAnimal","_qty","_missonAnimals","_nearby"];
	_missonAnimals = entities "CAAnimalBase";
	_delQtyAnimal = 0;
	{
		if (local _x) then {
			_x call dayz_perform_purge;
			sleep 0.05;
			_delQtyAnimal = _delQtyAnimal + 1;
		} else {
			if (!alive _x) then {
				_pos = getPosATL _x;
				if (count _pos > 0) then {
					_nearby = {(isPlayer _x) && (alive _x)} count (_pos nearEntities [["CAManBase","AllVehicles"], 130]);
					if (_nearby==0) then {
						_x call dayz_perform_purge;
						sleep 0.05;
						_delQtyAnimal = _delQtyAnimal + 1;
					};
				};
			};
		};
		sleep 0.001;
	} count _missonAnimals;
	if (_delQtyAnimal > 0) then {
		_qty = count _missonAnimals;
		diag_log (format["CLEANUP: Deleted %1 Animals out of %2",_delQtyAnimal,_qty]);
	};
};

server_logUnlockLockEvent = {
	private["_player", "_obj", "_objectID", "_objectUID", "_statusText", "_status"];
	_player = _this select 0;
	_obj = _this select 1;
	_status = _this select 2;
	if (!isNull(_obj)) then {
		_objectID = _obj getVariable["ObjectID", "0"];
		_objectUID = _obj getVariable["ObjectUID", "0"];
		_statusText = "UNLOCKED";
		if (_status) then {
			[_obj, "gear"] call server_updateObject;
			_statusText = "LOCKED";
		};
		diag_log format["SAFE %5: ID:%1 UID:%2 BY %3(%4)", _objectID, _objectUID, (name _player), (getPlayerUID _player), _statusText];
	};
};

KK_fnc_floatToString = {
	private "_arr";
	if (abs (_this - _this % 1) == 0) exitWith { str _this };
	_arr = toArray str abs (_this % 1);
	_arr set [0, 32];
	toString (toArray str (
		abs (_this - _this % 1) * _this / abs _this
	) + _arr - [32])
};

KK_fnc_positionToString = {
	format [
		"[%1,%2,%3]",
		_this select 0 call KK_fnc_floatToString,
		_this select 1 call KK_fnc_floatToString,
		_this select 2 call KK_fnc_floatToString
	]
};

fnc_mdc_nameFromPID = {
	private ['_superkey', '_key', '_result', '_playerID'];
	_caller = owner (_this select 0);
	_playerID = _this select 1;
	_superkey = profileNamespace getVariable 'SUPERKEY';
	_key = format['CHILD:500:%1:Character.player_data:', _superkey];
	_result = _key call server_hiveReadWrite;

	_key = format["CHILD:501:Character.player_data:[""PlayerName""]:[[""PlayerUID"", ""="", ""%1""]]:1:", _playerID];
	_result = _key call server_hiveReadWrite;

	_key = format['CHILD:504:%1:',_result select 1];
	_result = _key call server_hiveReadWrite;

	_playerName = (_result select 1) select 0;
	retPlayerName = _playerName;
	_caller publicVariableClient "retPlayerName";
};

"getPlayerName" addPublicVariableEventHandler {
	_caller = (_this select 1) select 0;
	_playerID = (_this select 1) select 1;
	[_caller, _playerID] call fnc_mdc_nameFromPID;
};

ExecVM "\z\addons\dayz_server\maps\maps.sqf";
ExecVM "\z\addons\dayz_server\maps\bridge.sqf";
ExecVM "\z\addons\dayz_server\init\broadcaster.sqf";

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
  • Advertisement
×
×
  • Create New...