Jump to content

[Release] Restrict Building - ** Updated for 1.0.6.2 **


BigEgg

Recommended Posts

Restrict Building is part of Epoch 1.0.7.1 now.

 

While there may be some extra features built in to 1.0.6.1 that restrict building, I needed more options.

 

What this does:

  1. Allows server owners to restrict entire zones of the map (for example - no building within 1,000 meters of Balota).
  2. Allows server owners to restrict building near certain buildings, and allows them to define the distance and name of each building they are restricting.

 

Step 1:

In your init.sqf find:

// EPOCH CONFIG VARIABLES END //

Directly under it, add:

// Restrict building near specific buildings
BlacklistedBuildings = [
//  ["What text will say", "Class name of building you want to block", Distance around that building to block (radius in meters)]
	["Fire Station", "Land_a_stationhouse", 250]
];

// Restrict building near map areas
RestrictedBuildingZones = [
//  ["What text will say", [Choords of place to block], Distance around that area to block (radius in meters)]
    ["Balota Airfield", [5158.72, 2518.75, 0], 600]
];

 

Step 2:

In your custom compiles.sqf add (NOTE: CHANGE THE FILE PATH TO FIT YOUR NEEDS):

dze_buildChecks = compile preprocessFileLineNumbers "FILE\PATH\HERE\dze_buildChecks.sqf";

into the if (!isDedicated) code block. Example:

if (!isDedicated) then {
	dze_buildChecks = compile preprocessFileLineNumbers "FILE\PATH\HERE\dze_buildChecks.sqf";
};

 

Step 3:

Create an SQF file, in the path you have designated above, and name it dze_buildChecks.sqf.

 

Step 4:

Paste the following code into dze_buildChecks.sqf and save the file.

Spoiler

//Checks if item is near a plot, if the player is plot owner or friendly, if there are too many items, and if the player has required tools
private ["_isAdmin","_requireplot","_distance","_canBuild","_friendlies","_cancel","_nearestPole","_ownerID","_pos","_item","_classname","_isPole","_isLandFireDZ","_IsNearPlot","_buildables","_center","_toolCheck","_plotcheck","_buildcheck","_isfriendly","_isowner","_require","_text","_near","_hasPole"];

_pos = _this select 0;
_item =	_this select 1;
_toolCheck = _this select 2;
_classname = getText (configFile >> "CfgMagazines" >> _item >> "ItemActions" >> "Build" >> "create");
_requireplot = DZE_requireplot;
_isAdmin = dayz_playerUID in DZE_PlotManagementAdmins;
// "Unable to build trader nearby."
if (!canbuild) exitWith {dayz_actionInProgress = false; format[localize "STR_EPOCH_PLAYER_136",localize "STR_EPOCH_TRADER"] call dayz_rollingMessages; [false, false];};

if (isNumber (configFile >> "CfgVehicles" >> _classname >> "requireplot")) then {
	_requireplot = getNumber(configFile >> "CfgVehicles" >> _classname >> "requireplot");
};

_checkClass = {
	private ["_checkOK","_distance"];

	_checkOK = false;
	_distance = DZE_SafeZoneNoBuildDistance;

	{
		if (typeName _x == "ARRAY") then {
			if (_x select 0 == _classname) then {_checkOK = true; _distance = _x select 1;};
		} else {
			if (_x == _className) then {_checkOK = true};
		};
		if (_checkOK) exitWith {};
	} count DZE_SafeZoneNoBuildItems;

	[_checkOK,_distance]
};

_isPole = (_classname == "Plastic_Pole_EP1_DZ");
_isLandFireDZ = (_classname == "Land_Fire_DZ");

_canBuild = false;
_hasPole = false;
_nearestPole = objNull;
_ownerID = 0;
_friendlies = [];

_cancel = [false, ""];

if (_isPole) then {
	_plotcheck = [player, true] call FNC_find_plots;
	_distance = DZE_PlotPole select 1;
	if (DZE_limitPlots && !_isAdmin) then {
		{
			if (_x getVariable["ownerPUID","0"] == dayz_playerUID || (_x getVariable["CharacterID","0"] == dayz_characterID)) exitWith {
				_hasPole = true;
			};
		} count (entities "Plastic_Pole_EP1_DZ");
	};
} else {
	_plotcheck = [player, false] call FNC_find_plots;
	_distance = DZE_PlotPole select 0;
};

_IsNearPlot = _plotcheck select 1;
_nearestPole = _plotcheck select 2;

if (_isPole && {_IsNearPlot > 0}) exitWith {dayz_actionInProgress = false; format[localize "str_epoch_player_44",_distance] call dayz_rollingMessages; [_canBuild, _isPole];};

if (_hasPole) exitWith {dayz_actionInProgress = false; localize "STR_EPOCH_PLAYER_133" call dayz_rollingMessages; [_canBuild, _isPole];};

if (_IsNearPlot == 0) then {
	if (_requireplot == 0 || {_isLandFireDZ}) then {
		_canBuild = true;
	};
} else {
	_ownerID = _nearestPole getVariable["CharacterID","0"];
	if (dayz_characterID == _ownerID) then {
		_canBuild = true;
	} else {
		if (DZE_permanentPlot) then {
			_buildcheck = [player, _nearestPole] call FNC_check_access;
			_isowner = _buildcheck select 0;
			_isfriendly = ((_buildcheck select 1) or (_buildcheck select 3));
			if (_isowner || _isfriendly) then {
				_canBuild = true;
			};
		} else {
			_friendlies	= player getVariable ["friendlyTo",[]];
			if (_ownerID in _friendlies) then {
				_canBuild = true;
			};
		};
	};
};

if (!_canBuild) exitWith {
	dayz_actionInProgress = false;
	if (_isNearPlot == 0) then {
		format[localize "STR_EPOCH_PLAYER_135",localize "str_epoch_player_246",_distance] call dayz_rollingMessages;
	} else {
		localize "STR_EPOCH_PLAYER_134" call dayz_rollingMessages;
	};
	[_canBuild, _isPole];
};

if (DZE_BuildHeightLimit > 0 && {([player] call fnc_getPos) select 2 > DZE_BuildHeightLimit}) exitWith {dayz_actionInProgress = false; format[localize "STR_EPOCH_PLAYER_168",DZE_BuildHeightLimit] call dayz_rollingMessages; [false, _isPole];};

// Modification by BigEgg - Check to see if the player is building within a blacklisted zone
{
	private ["_dis", "_chk"];
	
	_dis = _x select 2;
	_chk = (player distance (_x select 1));
	
	if (_chk <= _dis) exitWith {_cancel = [true, format["You cannot build within %1m of %2.<br></br>Current distance: %3 meters.", _dis, (_x select 0), _chk]];};
} count RestrictedBuildingZones;

// Modification by BigEgg - Check to see if the player is building near a blacklisted building
if (!(_cancel select 0)) then {
	{
		private ["_dis", "_pos", "_chk"];
		
		_dis = _x select 2;
		_pos = [player] call fnc_getPos;
		_chk = count(nearestObjects[_pos, [(_x select 1)], _dis]);
		
		if (_chk > 0) exitWith {_cancel = [true, format["You cannot build within %1m of a %2.", _dis, (_x select 0)]];};
	} count BlacklistedBuildings;
};

if (_cancel select 0) exitWith {
	dayz_actionInProgress = false;
	(_cancel select 1) call dayz_rollingMessages;
	[false, _isPole];
};

// Also count safes, lockboxes, vanilla buildables, tents and stashes against DZE_BuildingLimit
_buildables = DZE_maintainClasses + DZE_LockableStorage + ["DZ_buildables","DZ_storage_base"];
_center = if (isNull _nearestPole) then {_pos} else {_nearestPole};
if ((count (nearestObjects [_center,_buildables,_distance])) >= DZE_BuildingLimit) exitWith {dayz_actionInProgress = false; format[localize "str_epoch_player_41",_distance] call dayz_rollingMessages; [false, _isPole];};

_text = getText (configFile >> 'CfgMagazines' >> _item >> 'displayName');

_buildCheck = call _checkClass;

if (_buildCheck select 0 && !_isAdmin) then {
	_canBuild = !([player,_buildCheck select 1] call DZE_SafeZonePosCheck);
};

if !(_canBuild) exitWith {dayz_actionInProgress = false; format [localize "STR_EPOCH_PLAYER_166",_text,_buildCheck select 1] call dayz_rollingMessages; [false, _isPole];};

if (count DZE_NoBuildNear > 0 && !_isAdmin) then {
	_near = (nearestObjects [_pos,DZE_NoBuildNear,DZE_NoBuildNearDistance]);
	if ((count _near) > 0) then { _canBuild = false; };
};

if !(_canBuild) exitWith {dayz_actionInProgress = false; format [localize "STR_EPOCH_PLAYER_167",_text,DZE_NoBuildNearDistance,typeOf (_near select 0)] call dayz_rollingMessages; [false, _isPole];};

if (_toolCheck) then {
	_require =  getArray (configFile >> "cfgMagazines" >> _item >> "ItemActions" >> "Build" >> "require");
	_classname = getText (configFile >> "CfgMagazines" >> _item >> "ItemActions" >> "Build" >> "create");
	_canBuild = [_item, _require, _classname] call dze_requiredItemsCheck;
};

//When calling this function in another script use a silent exitWith, unless you have something special to say. i.e. if (!(_canBuild select 0)) exitWith{};
[_canBuild, _isPole];

 

 

Done!

 

Be sure to configure the settings in your init.sqf to your liking.

Link to comment
Share on other sites

9 minutes ago, Hooty said:

Nice I was close. I had

MaxBuildHeight = 30   in my config

but not


if (LimitBuildHeight) then {
	MaxBuildHeight = 30; // Maximum build height in meters
};

 

But all i was trying to do was add the height. 

This does nothing but check to see if you want to block the height - you will still need to add the code above, or else those two variables have no effect at all.

Link to comment
Share on other sites

1 minute ago, BigEgg said:

This does nothing but check to see if you want to block the height - you will still need to add the code above, or else those two variables have no effect at all.

I had this already.

Spoiler

if (LimitBuildHeight && (((getPosATL (vehicle player)) select 2) > MaxBuildHeight)) then {
	_cancel = true;
	_reason = format["Building is restricted above %1 meters.", MaxBuildHeight];
};

 @oldmatechoc was helping me with it as well last night.  

 

Link to comment
Share on other sites

3 hours ago, Hooty said:

I had this already.

  Hide contents


if (LimitBuildHeight && (((getPosATL (vehicle player)) select 2) > MaxBuildHeight)) then {
	_cancel = true;
	_reason = format["Building is restricted above %1 meters.", MaxBuildHeight];
};

 @oldmatechoc was helping me with it as well last night.  

 

If you already have that in your dze_buildChecks.sqf, add this at the bottom:

if (_cancel) exitWith {
	dayz_actionInProgress = false;
	_reason call dayz_rollingMessages;
	[false, _isPole];
};

Above:

//When calling this function in another script use a silent exitWith, unless you have something special to say. i.e. if (!(_canBuild select 0)) exitWith{};
[_canBuild, _isPole];

 

Link to comment
Share on other sites

I'm gonna start banging my head in the desk now lol smh...  I like your restrict zones as well so i just added the whole thing you know how balota is on my server xD. Plus it would come in hand with the other risky traders I've added.

 

Plus when you code its nice and clean.

Link to comment
Share on other sites

Currently the maximum build height checks where the player is standing, so players are able to build items 10 meters above the set height.   Would it be possible to have it check the height where the item is being built instead of the player position? 

Link to comment
Share on other sites

10 minutes ago, Jim90 said:

Currently the maximum build height checks where the player is standing, so players are able to build items 10 meters above the set height.   Would it be possible to have it check the height where the item is being built instead of the player position? 

I have a fix in mind for this - I will post an update for it which should work (not home atm). Check back later.

Link to comment
Share on other sites

32 minutes ago, Jim90 said:

Currently the maximum build height checks where the player is standing, so players are able to build items 10 meters above the set height.   Would it be possible to have it check the height where the item is being built instead of the player position? 

You will need to copy modular_build.sqf over to your mission folder and change the path in your compiles.

 

In modular_build.sqf find:

if(abs(_objHDiff) > DZE_buildMaxHeightDistance) exitWith {
	_isOk = false;
	_cancel = true;
	_reason = format[localize "STR_EPOCH_BUILD_FAIL_HEIGHT",DZE_buildMaxHeightDistance];
	detach _object;
	deleteVehicle _object;
	if (_VectorWorkAround) then {
		detach _object2;
		deleteVehicle _object2;
	};
	detach _objectHelper;
	deleteVehicle _objectHelper;
};

Under it add:

if (LimitBuildHeight && (((abs(_objHDiff)) + ((getPosATL (vehicle player)) select 2)) > MaxBuildHeight)) exitWith {
	_isOk = false;
	_cancel = true;
	_reason = format["Building is restricted above %1 meters.", MaxBuildHeight];
	detach _object;
	deleteVehicle _object;
	if (_VectorWorkAround) then {
		detach _object2;
		deleteVehicle _object2;
	};
	detach _objectHelper;
	deleteVehicle _objectHelper;
};

 

That should work (haven't tested - will update the post when I have).

Link to comment
Share on other sites

2 minutes ago, Jim90 said:

Update looks to work perfectly.  As you raise the item past 30m it stops the build and gives the warning message.  Also tested building below 30m still works and starting a build above 30m will not work. Thanks for the great work @BigEgg

Good to hear - will update the post :)

Link to comment
Share on other sites

I don't seem to have a if (isDedicated) then {

Am I putting this in the right spot? Not working on my server. I have placed 2 plot poles and on right near stary.

 

 

if (isServer) then {
 call compile preprocessFileLineNumbers "\z\addons\dayz_server\init\server_functions.sqf";
 fnc_veh_setFixServer = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\veh_setFixServer.sqf"; //process the hit as a NORMAL damage (useful for persistent vehicles)
 pvs_processSetAccessCode = compile preprocessFile "\z\addons\dayz_code\eventHandlers\processSetAccessCode.sqf";
 pvs_processAccessCode = compile preprocessFile "\z\addons\dayz_code\eventHandlers\processAccessCode.sqf";
 server_spawnTraders = compile preprocessFile "\z\addons\dayz_server\compile\server_spawnTraders.sqf";
 server_updateGroup = compile preprocessFileLineNumbers "\z\addons\dayz_code\groups\server_updateGroup.sqf";
};

if (!isDedicated) then {
 //"filmic" setToneMappingParams [0.153, 0.357, 0.231, 0.1573, 0.011, 3.750, 6, 4]; setToneMapping "Filmic";
 //"filmic" setToneMappingParams [0.07, 0.31, 0.23, 0.37, 0.011, 3.750, 6, 4]; setToneMapping "filmic";  //DayZ Vanilla
 "filmic" setToneMappingParams [0.4, 0.35, 0.18, 0.1, 0.1, 5, 6, 3.8]; setToneMapping "filmic";

 call compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_padlock.sqf";
 call compile preprocessFileLineNumbers "\z\addons\dayz_code\util\compile.sqf";
 call compile preprocessFileLineNumbers "\z\addons\dayz_code\loot\compile.sqf";
 
 dze_buildChecks = compile preprocessFileLineNumbers "Mods\compile\dze_buildChecks.sqf";
 
 fn_dropItem = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_dropItem.sqf";
 fn_dynamicTool = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_dynamicTool.sqf";
 fn_nearWaterHole = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_nearWaterHole.sqf";
 player_zombieCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_zombieCheck.sqf"; //Run on a players computer, checks if the player is near a zombie
 player_zombieAttack = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_zombieAttack.sqf"; //Run on a players computer, causes a nearby zombie to attack them
 player_attackdelay = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_attackfsmdelay.sqf";
 fnc_usec_damageActions = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_damageActions.sqf";  //Checks which actions for nearby casualty
 fnc_inAngleSector = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_inAngleSector.sqf";  //Checks which actions for nearby casualty
 fnc_usec_selfActions = compile preprocessFileLineNumbers "Mods\compile\fn_selfActions.sqf";  //Checks which actions for self
 fnc_usec_unconscious = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_unconscious.sqf";
 player_temp_calculation = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_temperatur.sqf";  //Temperatur System //TeeChange
 player_weaponFiredNear = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_weaponFiredNear.sqf";
 player_spawnCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_spawnCheck.sqf";
 building_spawnLoot = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\building_spawnLoot.sqf";
 //player_taskHint = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_taskHint.sqf";
 building_spawnZombies = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\building_spawnZombies.sqf";
 player_fired = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_fired.sqf";   //Runs when player fires. Alerts nearby Zeds depending on calibre and audial rating
 player_packTent = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_packTent.sqf";
 player_updateGui = switch (toLower DZE_UI) do {
  case "dark": {compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_updateGuiDark.sqf";};
  case "epoch": {compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_updateGuiEpoch.sqf";};
  case "vanilla": {compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_updateGui.sqf";};
 };
 player_crossbowBolt = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_crossbowBolt.sqf";
 player_music = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_music.sqf";   //Used to generate ambient music
 player_death = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_death.sqf";
 player_switchModel = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_switchModel.sqf";
 player_checkStealth = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_checkStealth.sqf";
 world_sunRise = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_sunRise.sqf";
 world_surfaceNoise = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_surfaceNoise.sqf";
 player_humanityMorph = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_humanityMorph.sqf";
 player_throwObject = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_throwObject.sqf";
 player_alertZombies = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_alertZombies.sqf";
 player_fireMonitor = compile preprocessFileLineNumbers "\z\addons\dayz_code\system\fire_monitor.sqf";
 player_countMagazines = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_countMagazines.sqf";
 player_countMagazinesWBackpack = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_countMagazinesWBackpack.sqf";
 player_forceSave = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_forceSave.sqf";
 //player_destroyTent = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_destroyTent.sqf";
 vehicle_getOut = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\vehicle_getOut.sqf";
 //Objects
 object_setpitchbank = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_setpitchbank.sqf";
 object_monitorGear = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_monitorGear.sqf";
 object_dismantle = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\object_dismantle.sqf";
 
 //Collisions
 fn_collisions = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_collisions.sqf";

 //Zombies
 zombie_findTargetAgent = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\zombie_findTargetAgent.sqf";
 player_zombieSwarmAttack = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_zombieSwarmAttack.sqf";
 zombie_loiter = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\zombie_loiter.sqf";   //Server compile, used for loiter behaviour
 zombie_generate = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\zombie_generate.sqf";   //Server compile, used for loiter behaviours
 //zombie_generateSwarm = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\swarm_generate.sqf";

 //actions
 userActionConditions = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\userActionConditions.sqf";
 player_addToolbelt = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_addToolbelt.sqf";
 player_addtoBack = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_addtoBack.sqf";
 player_reloadMag = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_reloadMags.sqf";
 player_createstash = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_createstash.sqf";
 player_consume = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_consume.sqf";
 player_emptyContainer = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_emptyContainer.sqf";
 player_useMeds = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_useMeds.sqf";
 player_useAttchment = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_useAttchment.sqf";
 player_attachAttachment = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_attachAttachment.sqf";
 player_removeAttachment = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_removeAttachment.sqf";
 player_fillWater = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\water_fill.sqf";
 player_makeFire = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_makefire.sqf";
 player_chopWood = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_chopWood.sqf";
 player_mineStone = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_mineStone.sqf";
 if (DZE_modularBuild) then {
  player_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\modular_build.sqf";
  snap_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\snap_build.sqf";
 } else {
  player_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build.sqf";
 };
    DZE_build_vector_file = "\z\addons\dayz_code\compile\BuildVectors\build_vectors.sqf";
    build_vectors = compile preprocessFileLineNumbers DZE_build_vector_file;
 fnc_SetPitchBankYaw = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BuildVectors\fnc_SetPitchBankYaw.sqf";
 FNC_find_plots = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_find_plots.sqf";

 player_buildVanilla = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_buildVanilla.sqf";
 fn_buildCamera = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_buildCamera.sqf";
 object_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\object_build.sqf";
 object_upgradeFireplace = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\object_upgradeFireplace.sqf";
 player_wearClothes = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_wearClothes.sqf";
 player_dropWeapon = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_dropWeapon.sqf";
 //player_setTrap = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_setTrap.sqf";
 object_pickup = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\object_pickup.sqf";
 //player_sleep = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_sleep.sqf";
 player_combineMag = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_combineMags.sqf";
 player_combineAntibiotics = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_combineAntibiotics.sqf";
 player_createquiver = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_createQuiver.sqf";
 player_fillquiver = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_fillQuiver.sqf";
 //player_takearrow = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_takeArrow.sqf";
 call compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_switchWeapon.sqf";
 //player_goFishing = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_goFishing.sqf";
 player_gather = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_gather.sqf";
 player_fixBottle = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_fixBottle.sqf";
 player_tearClothes = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_tearClothes.sqf";
 //object_remove = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\remove.sqf";
 player_fixHatchet = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_fixTools.sqf";
 player_sharpen = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_sharpen.sqf";
 player_butcher = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\gather_meat.sqf";
 player_pushPlane = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_pushPlane.sqf";
 //player_repairVehicle = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\repair_vehicle.sqf";
 //player_salvageVehicle = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\salvage_vehicle.sqf";

 //ui
 player_toggleSoundMute = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_toggleSoundMute.sqf";
 player_toggleStreamerMode = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_toggleStreamerMode.sqf";
 player_selectSlot = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\ui_selectSlot.sqf";
 player_selectWeapon = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_selectWeapon.sqf";
 player_markMap = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_markMap.sqf";
 player_gearSet = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_gearSet.sqf";
 ui_changeDisplay = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\ui_changeDisplay.sqf";
    ui_gear_sound = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\ui_gear_sound.sqf";
 ui_updateControls = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\ui_updateControls.sqf";

 //playerstats
 horde_epeen_fnc_fill_page = compile preProcessFile "\z\addons\dayz_code\actions\playerstats\fill_page_fnc.sqf";
 horde_epeen_determine_humanity_fnc = compile preProcessFile "\z\addons\dayz_code\actions\playerstats\determine_humanity_fnc.sqf";
 horde_epeen_setText_journal_fnc = compile preProcessFile "\z\addons\dayz_code\actions\playerstats\epeen_setText_journal.sqf";
 horde_epeen_setText_humanity_fnc = compile preProcessFile "\z\addons\dayz_code\actions\playerstats\epeen_setText_humanity.sqf";
 horde_epeen_setText_stats_fnc = compile preProcessFile "\z\addons\dayz_code\actions\playerstats\epeen_setText_stats.sqf";
 horde_epeen_show_humanity_fnc = compile preProcessFile "\z\addons\dayz_code\actions\playerstats\show_humanity_fnc.sqf";

 //System
 player_spawn_2 = compile preprocessFileLineNumbers "\z\addons\dayz_code\system\player_spawn_2.sqf";

 //Crafting
 fn_updateCraftUI = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_updateCraftUI.sqf";
 player_craftItem = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_craftItem.sqf";
 player_craftItemVanilla = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_craftItemVanilla.sqf";
 player_craftItemGUI = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_craftItemGUI.sqf";
 player_checkRecipe = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_checkRecipe.sqf"; 
  
 // EPOCH ADDITIONS
 dayz_autoRunOff = {dayz_autoRun = false; terminate dayz_autoRunThread; player playActionNow "Stop";};
 dog_findTargetAgent = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dog_findTargetAgent.sqf";
 dze_deathMessage = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dze_deathMessage.sqf";
 dze_filterCheats = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_filterCheats.sqf";
 dze_isnearest_player = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dze_isNearestPlayer.sqf";
 dze_buildChecks = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dze_buildChecks.sqf";
 dze_requiredItemsCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dze_requiredItemsCheck.sqf";
 dze_surrender_off = {player setVariable ["DZE_Surrendered",false,true]; DZE_Surrender = false;};
 epoch_generateKey = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\epoch_generateKey.sqf";
 epoch_tempKeys = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\epoch_tempKeys.sqf";
 epoch_totalCurrency = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\epoch_totalCurrency.sqf";
 epoch_itemCost = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\epoch_itemCost.sqf";
 epoch_returnChange = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\epoch_returnChange.sqf";
 fn_gearMenuChecks = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_gearMenuChecks.sqf";
 fn_pauseMenuChecks = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_pauseMenuChecks.sqf";
 fn_waitForObject = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_waitForObject.sqf";
 player_onPause = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_onPause.sqf";
 player_addDuplicateTool = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_addDuplicateTool.sqf";
 player_antiWall = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_antiWall.sqf";
 player_changeCombo = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_changeCombo.sqf";
 player_checkItems = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_checkItems.sqf";
 player_copyKey = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_copyKey.sqf";
 player_deathBoard = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\list_playerDeathsAlt.sqf";
 player_harvest = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_harvest.sqf";
 player_harvestPlant = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_harvestPlant.sqf";
 player_hasTools = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_hasTools.sqf";
 player_loadCrate = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_loadCrate.sqf";
 player_lockVault = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_lockVault.sqf";
 player_packVault = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_packVault.sqf";
 player_removeItems = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_removeItems.sqf";
 player_removeNearby = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_removeNearby.sqf";
 player_removeObject = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\remove.sqf";
 player_surrender = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_surrender.sqf";
 player_traderCity = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_traderCity.sqf";
 player_unlockDoor = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_unlockDoor.sqf";
 player_unlockVault = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_unlockVault.sqf";
 player_upgradeVehicle = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_upgradeVehicle.sqf";
 PlotGetFriends = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\plotManagement\plotGetFriends.sqf";
 PlotNearbyHumans = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\plotManagement\plotNearbyHumans.sqf";
 PlotAddFriend = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\plotManagement\plotAddFriend.sqf";
 PlotRemoveFriend = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\plotManagement\plotRemoveFriend.sqf";
 PlotObjects = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\plotManagement\plotObjects.sqf";
 PlotPreview = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\plotManagement\plotToggleMarkers.sqf";
 MaintainPlot = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\maintain_area.sqf";
 DoorGetFriends = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\doorManagement\doorGetFriends.sqf";
 DoorNearbyHumans = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\doorManagement\doorNearbyHumans.sqf";
 DoorAddFriend = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\doorManagement\doorAddFriend.sqf";
 DoorRemoveFriend = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\doorManagement\doorRemoveFriend.sqf";
 player_manageDoor = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\doorManagement\initDoorManagement.sqf";
 player_enterCode = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\doorManagement\player_enterCode.sqf"; 
 FNC_check_access = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_check_access.sqf";

 // Advanced trading default inits for maintaining, Advanced Trading and custom scripts to utilize gem based currency.
 call compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\AdvancedTrading\defaultInit.sqf";
 
 dayz_losChance = {
  private["_agent","_maxDis","_dis","_val","_maxExp","_myExp"];
  _agent = _this select 0;
  _dis = _this select 1;
  _maxDis = _this select 2;
  //diag_log ("VAL:  " + str(_this));
  _maxDis = 0.1 max _maxDis;
  _val = (_maxDis - _dis) max 0;
  _maxExp = ((exp 2) * _maxDis);
  _myExp = ((exp 2) * (_val)) / _maxExp;
  _myExp = _myExp * 0.7;
  _myExp
 };

 ui_initDisplay = {
  private ["_ctrlBleed","_ctrlFracture"];
  disableSerialization;
  _display = uiNamespace getVariable 'DAYZ_GUI_display';
  _control = _display displayCtrl 1204;
  _control ctrlShow false;
  if (!r_player_injured) then {
   _ctrlBleed = _display displayCtrl 1303;
   _ctrlBleed ctrlShow false;
  };
  if (!r_fracture_legs && !r_fracture_arms) then {
   _ctrlFracture = _display displayCtrl 1203;
   _ctrlFracture ctrlShow false;
  };
  /* // These controls don't exist yet
  _ctrlDogFoodBorder = _display displayCtrl 1501;
  _ctrlDogFoodBorder ctrlShow false;
  _ctrlDogFood = _display displayCtrl 1701;
  _ctrlDogFood ctrlShow false;

  _ctrlDogWaterBorder = _display displayCtrl 1502;
  _ctrlDogWaterBorder ctrlShow false;
  _ctrlDogWater = _display displayCtrl 1702;
  _ctrlDogWater ctrlShow false
  */
 };

 dayz_angleCheck = {
  private ["_degree","_tPos","_zPos","_inAngle"];
  _target = _this select 0;
  _agent = _this select 1;
  _degree = _this select 2;
  _inAngle = false;
  _tPos = getPosASL _target;
  _zPos = getPosASL _agent;
  _eyeDir = direction _agent;
  _inAngle = [_zPos,_eyeDir,_degree,_tPos] call fnc_inAngleSector;
  _inAngle
 };
 
 dayz_losCheck = {
  private ["_cantSee","_target","_agent"];
  _target = _this select 0; // PUT THE PLAYER IN FIRST ARGUMENT!!!!
  _agent = _this select 1;
  _cantSee = true;
  
  if ((!isNull _target) && (!isNull _agent)) then {
   private ["_tPos","_zPos"];
   _tPos = eyePos _target;
   _zPos = eyePos _agent;
   if ((count _tPos > 0) && (count _zPos > 0)) then {
    _cantSee = terrainIntersectASL [(eyePos _target), (eyePos _agent)];
    //diag_log ("terrainIntersectASL: " + str(_cantSee));
    
    if (!_cantSee) then {
     _cantSee = lineIntersects [(eyePos _target), (eyePos _agent)];
     //diag_log ("lineIntersects: " + str(_cantSee));
    };
   };
  };
  _cantSee
 };

 dayz_NutritionSystem = {
  private ["_type","_baseRegen","_nutrition","_calorieCount","_hungerCount","_thirstCount","_tempCount","_Thirst","_Hunger","_bloodregen","_golbalNutrition"];
  //["type",regen,[NutritionTable,thirst(Working Class),hunger(Working Class)]]
  //info to be added
  _type = _this select 0;
  _baseRegen = _this select 1;
  _nutrition = _this select 2;
  
  //Nutrition array
  _calorieCount = ((_this select 2) select 0);
  //gain
  _hungerCount = ((_this select 2) select 1);
  _thirstCount = ((_this select 2) select 2);
  _tempCount = ((_this select 2) select 3);
  
  //3610 is based on a 80kg male 180cm tall
  if (_calorieCount > 0) then {
   _hungerCount = _hungerCount + (SleepFood * (((ln ((_calorieCount / 3610) * 100)) * (1 - (dayz_hunger / SleepFood))) / 100));
   _thirstCount = _thirstCount + (SleepWater * (((ln ((_calorieCount / 3610) * 100)) * (1 - (dayz_thirst / SleepWater))) / 100));
  };
  
  switch (_type) do {
   case "FoodDrink": {
    //hunger
    if (_hungerCount > 0) then {
     if (dayz_hunger > _hungerCount) then {
      dayz_hunger = dayz_hunger - (_hungerCount); 
     } else {
      dayz_hunger = 0;
     };
    };
    //thirst
    if (_thirstCount > 0) then {
     if (dayz_thirst > _thirstCount) then {
      dayz_thirst = dayz_thirst - _thirstCount;
     } else {
      dayz_thirst = 0;
     };
    };
    //temp
    if (_tempCount > 0) then { dayz_temperatur = dayz_temperatur + _tempCount; };
    //calorie
    if (_calorieCount > 0) then { dayz_nutrition = dayz_nutrition + _calorieCount; };
    //blood
    if (_baseRegen > 0) then { r_player_bloodregen = r_player_bloodregen + _baseRegen; };
   };
         
   case "Working": {
    if (_calorieCount > 0) then { dayz_nutrition = dayz_nutrition - (_calorieCount / ((DZE_NutritionDivisor select 0) min 0.1)); };
    if (_thirstCount > 0) then { dayz_thirst = dayz_thirst + (_thirstCount / ((DZE_NutritionDivisor select 1) min 0.1)); };
    if (_hungerCount > 0) then { dayz_hunger = dayz_hunger + (_hungerCount / ((DZE_NutritionDivisor select 2) min 0.1)); };
    if (_tempCount > 0) then { dayz_temperatur = dayz_temperatur + (_tempCount / ((DZE_NutritionDivisor select 3) min 0.1)); };
   };
  
  };

  dayz_thirst = (dayz_thirst min SleepWater) max 0;
  dayz_hunger = (dayz_hunger min SleepFood) max 0;
  dayz_temperatur = (dayz_temperatur min dayz_temperaturmax) max dayz_temperaturmin;
  //systemChat str [ "nutrition, r_player_bloodregen+=",_baseRegen,"dayz_nutrition+=", _calorieCount, "dayz_thirst+=", _thirstCount, "dayz_hunger+=", _hungerCount ];
  //systemChat format ["%6, Nutrition add: %1, Nutrition Total: %2, Thirst: %3, Hunger: %4, dayz_temperatur: %5",_this,dayz_nutrition,dayz_thirst,dayz_hunger,dayz_temperatur];
  //diag_log format ["%6, Nutrition add: %1, Nutrition Total: %7/%2, Thurst: %3, Hunger: %4, BloodRegen: %5",_this,r_player_Nutrition,_Thirst,_Hunger,_bloodregen,_type,_golbalNutrition];
 };

 gearDialog_create = {
  private ["_i","_dialog"];
  if (!isNull (findDisplay 106)) then {
   (findDisplay 106) closeDisplay 0;
  };
  openMap false;
  closeDialog 0;
  if (gear_done) then {sleep 0.001;};
  DZE_GearCheckBypass = true; //Bypass gear menu checks since dialog will always open on player's gear
  player action ["Gear", player];
  if (gear_done) then {sleep 0.001;};
  _dialog = findDisplay 106;
  _i = 0;
  while {isNull _dialog} do {
   _i = _i + 1;
   _dialog = findDisplay 106;
   if (gear_done) then {sleep 0.001;};
   if (_i in [100,200,299]) then {
    closeDialog 0;
    DZE_GearCheckBypass = true; //Bypass gear menu checks since dialog will always open on player's gear
    player action ["Gear", player];
   };
   if (_i > 300) exitWith {};
  };
  if (gear_done) then {sleep 0.001;};
  _dialog = findDisplay 106;
  if ((parseNumber(_this select 0)) != 0) then {
   ctrlActivate (_dialog displayCtrl 157);
   if (gear_done) then {
    waitUntil {ctrlShown (_dialog displayCtrl 159)};
    sleep 0.001;
   };
  };
  _dialog
 };

 gear_ui_offMenu = {
  private["_control","_parent","_menu","_grpPos"];
  disableSerialization;
  _control = _this select 0;
  _parent = findDisplay 106;
  if (!(_this select 3)) then {
   for "_i" from 0 to 9 do {
    _menu = _parent displayCtrl (1600 + _i);
    _menu ctrlShow false;
   };
   _grpPos = ctrlPosition _control;
   _grpPos set [3,0];
   _control ctrlSetPosition _grpPos;
   _control ctrlShow false;
   _control ctrlCommit 0;
  };
 };

 gear_ui_init = {
  //private["_control","_parent","_menu","_grpPos"];
  disableSerialization;
  _parent = findDisplay 106;
  _control = _parent displayCtrl 6902;
  for "_i" from 0 to 9 do {
   _menu = _parent displayCtrl (1600 + _i);
   _menu ctrlShow false;
  };
  _grpPos = ctrlPosition _control;
  _grpPos set [3,0];
  _control ctrlSetPosition _grpPos;
  _control ctrlShow false;
  _control ctrlCommit 0;
 };

 gear_ui_hide = {
  //private["_display","_BP"];
  disableSerialization;
  _display = findDisplay 106;
  _BP = unitBackpack player;
  if (ctrlShown (_display displayCtrl 159)) then {//prevent background images in backpack view
   for "_i" from 1006 to 1011 do {
    (_display displayCtrl _i) ctrlShow false;
   };
  } else {
   for "_i" from 1006 to 1011 do {
    if (!(ctrlShown (_display displayCtrl _i))) then {
     (_display displayCtrl _i) ctrlShow true;
    };
   };
  };
  //hide buttons if unnecessary
  if (isNull _BP || ((typeOf _BP) == "")) then {
   (_display displayCtrl 132) ctrlShow false;
   (_display displayCtrl 157) ctrlShow false;
   (_display displayCtrl 158) ctrlShow false;
  };
        
  if ((DZE_TwoPrimaries == 0) && {(primaryWeapon player == "" && dayz_onBack != "" && !(dayz_onBack in MeleeWeapons))}) then {
   //["gear"] call player_switchWeapon;
   0 call dz_fn_switchWeapon;
   closeDialog 0;
  };
  if ((DZE_TwoPrimaries == 1) && {(primaryWeapon player != "" && dayz_onBack != "" && (!(dayz_onBack in MeleeWeapons)) && !(primaryWeapon player in MeleeWeapons))}) then {
   //["gear"] call player_switchWeapon;
   0 call dz_fn_switchWeapon;
   closeDialog 0;
  };
  if ((DZE_TwoPrimaries == 0) && primaryWeapon player != "" && (primaryWeapon player in MeleeWeapons || dayz_onBack in MeleeWeapons)) then {
   (_display displayCtrl 1204) ctrlShow true;
  } else {
   if ((DZE_TwoPrimaries > 0) && (primaryWeapon player != "")) then {
    (_display displayCtrl 1204) ctrlShow true;
   } else {
    (_display displayCtrl 1204) ctrlShow false;
   };
  };

  if (DayZ_onBack != "") then {
   (_display displayCtrl 1208) ctrlShow true;
  } else {
   (_display displayCtrl 1208) ctrlShow false;
  };

  for "_i" from 0 to (lbSize (_display displayCtrl 105)) - 1 do {
   (_display displayCtrl 105) lbSetColor [_i, [0.06, 0.05, 0.03, 1]];
  };
 };

 dayz_lowHumanity = {
  //private["_unit","_humanity","_delay"];
  _unit = _this;
  if ((_unit distance player) < 15) then {
   private "_humanity";
   _humanity = _unit getVariable["humanity",0];
   dayz_heartBeat = true;
   if (_humanity < -3000) then {
    private "_delay";
    _delay = ((10000 + _humanity) / 5500) + 0.3;
    playSound "heartbeat_1";
    uiSleep _delay;
   };
   dayz_heartBeat = false;
  };
 };
 
 dz_fn_meleeMagazines = {
  if (_this) then {
   { player addMagazine _x } count MeleeMagazines;
  } else {
   { player removeMagazines _x } count MeleeMagazines;
  };
 };
 
 dayz_meleeMagazineCheck = {
        //private["_meleeNum","_magType","_wpnType","_ismelee"];
        _wpnType = primaryWeapon player;
        _ismelee = (getNumber (configFile >> "CfgWeapons" >> _wpnType >> "melee") == 1);
        if (_ismelee) then {
            private ["_meleeNum","_magType"];
            _magType = ([] + getArray (configFile >> "CfgWeapons" >> _wpnType >> "magazines")) select 0;
            _meleeNum = ({_x == _magType} count magazines player);
            if (_meleeNum < 1) then {
                player addMagazine _magType;
            };
        };

        // combine matchboxes
        private ["_matches","_fullBox","_remain"];
        _matches = 0;
        {
            if (configName inheritsFrom (configfile >> "cfgWeapons" >> _x) == "ItemMatchbox") then { // iskindOf does not work here?!
                 _matches = _matches + getNumber(configfile >> "cfgWeapons" >> _x >> "matches");
                 player removeWeapon _x;
            };
        } count (items player);
        // limit to 1 fullbox and 1 used matchbox
        _fullBox = floor (_matches / 5);  
        _remain = _matches % 5;
        if (_fullBox > 0) then { player addWeapon "Item5Matchbox"; };
    if (_fullBox > 1) then {
   player addWeapon "Item4Matchbox";
  } else {
         if (_remain > 0) then { player addWeapon ("Item"+str(_remain)+"Matchbox"); };
  };
    };
 
 dayz_rollingMessages = {
  private "_showText";
  disableSerialization;
  _showText = {
   private "_textLine";
   4099999 cutRsc ["RSC_DZ_Messages","plain"];
   _textLine = (uiNamespace getVariable "DZ_Messages") displayCtrl 4099998;
   _textLine ctrlSetStructuredText (parseText _this);
   _textLine ctrlCommit 0;
  };
  if (typeName _this == "ARRAY") exitWith {(_this select 0) call _showText}; //Special or multi-line message
  if ((diag_ticktime - Message_1_time) < 5) then {
   if ((time - Message_2_time) < 5) then {
    Message_3 = Message_2;
    Message_3_time = Message_2_time;
   } else {
    Message_3 = "";
   };
   
   Message_2 = Message_1;
   Message_2_time = Message_1_time;
  } else {
   Message_2 = "";
   Message_3 = "";
  };

  Message_1 = _this;
  Message_1_time = diag_ticktime;
  //Cut and title text "PLAIN DOWN" fit a max of 3 lines on screen at once. They are still covered by gear and other dialogs even with \n\n.
  //cutText [format ["%1\n%2\n%3", Message_1, Message_2, Message_3], "PLAIN DOWN"];
  (format ["%1<br></br>%2<br></br>%3", Message_1, Message_2, Message_3]) call _showText;
 };
 
 dayz_killFeed = {
  private ["_distance","_offset","_icon","_playerName","_sourceName"];
  _playerName = _this select 1;
  _sourceName = _this select 2;
  _distance = _this select 4;
  _icon = _this select 5;
  if (_icon == "") exitWith {};
  
  if (diag_ticktime - death_1_time < 10) then {
   if (time - death_2_time < 10) then {
    if (time - death_3_time < 10) then {
     death_4 = death_3;
     death_4_time = death_3_time;
    } else {
     death_4 = "";
    };
    death_3 = death_2;
    death_3_time = death_2_time;
   } else {
    death_3 = "";
    death_4 = "";
   };
   death_2 = death_1;
   death_2_time = death_1_time;
  } else {
   death_2 = "";
   death_3 = "";
   death_4 = "";
  };

  death_1 = format["<t size='.8' align='left' color='#a81e13'>%1 </t><img align='left' image='%2'/><t size='.8' align='left' color='#3FB07D'> %3 (%4m)</t>",_playerName,_icon,_sourceName,_distance];
  death_1_time = diag_ticktime;
  
  //Prevent covering vehicle health bar HUD
  _offset = if (vehicle player == player) then {0} else {0.1};
  [(format ["%1<br />%2<br />%3<br />%4",death_1,death_2,death_3,death_4]),(safeZoneX + _offset),safeZoneY,10,0,0,8000] spawn BIS_fnc_dynamicText;
 };
 
 dayz_originalPlayer = player;

 // database trader menu
 if (!DZE_ConfigTrader) then {call compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_hiveTrading.sqf";};
 // recent murders menu
 call compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_murderBoard.sqf";
};

//Both
BIS_fnc_selectRandom = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_selectRandom.sqf";
BIS_fnc_vectorAdd = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_vectorAdd.sqf";
BIS_fnc_halo = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_halo.sqf";
BIS_fnc_findNestedElement = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_findNestedElement.sqf";
BIS_fnc_param = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\BIS_fnc\fn_param.sqf";
BIS_fnc_relativeDirTo = compile("private '_dir';_dir=_this call{" + (preprocessFileLineNumbers "ca\modules\Functions\geometry\fn_relativeDirTo.sqf")+"};if(_dir>180)then{_dir=_dir-360;};if(_dir<-180)then{_dir=_dir+360;};_dir");
fnc_buildWeightedArray = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_buildWeightedArray.sqf";  //Checks which actions for nearby casualty
fnc_spawnObjects = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_spawnObjects.sqf";
object_getHit = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_getHit.sqf";   //gets the hit value for a HitPoint (i.e. HitLegs) against the selection (i.e. "legs"), returns the value
object_setHit = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_setHit.sqf";   //process the hit as a NORMAL damage (useful for persistent vehicles)
object_processHit = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_processHit.sqf";  //process the hit in the REVO damage system (records and sets hit)
//object_cargoCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_cargoCheck.sqf";  //Run by the player or server to monitor changes in cargo contents
fnc_usec_damageHandler = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_damageHandler.sqf";  //Event handler run on damage
// Vehicle damage fix
fnc_veh_handleDam = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\veh_handleDam.sqf";
fnc_veh_handleKilled = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\veh_handleKilled.sqf";
fnc_veh_handleRepair = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\veh_handleRepair.sqf"; //process the hit as a NORMAL damage (useful for persistent vehicles)
fnc_veh_ResetEH = compile preprocessFileLineNumbers "\z\addons\dayz_code\init\veh_ResetEH.sqf";   //Initialize vehicle
fnc_inString = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_inString.sqf";
fnc_isInsideBuilding = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_isInsideBuilding.sqf"; //_isInside = [_unit,_building] call fnc_isInsideBuilding;
dayz_zombieSpeak = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_speak.sqf";   //Used to generate random speech for a unit
vehicle_getHitpoints = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\vehicle_getHitpoints.sqf";
local_gutObject = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_gutObject.sqf";  //Generated on the server (or local to unit) when gutting an object
local_zombieDamage = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_damageHandlerZ.sqf";  //Generated by the client who created a zombie to track damage
local_setFuel = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_setFuel.sqf";   //Generated when someone refuels a vehicle
local_eventKill = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_eventKill.sqf";  //Generated when something is killed
//player_weaponCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_weaponCheck.sqf"; //Run by the player or server to monitor whether they have picked up a new weapon
//curTimeStr = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_curTimeStr.sqf";
player_medBandage = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medBandaged.sqf";
//player_medInject = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medInject.sqf";
player_medEpi = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medEpi.sqf";
player_medTransfuse = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medTransfuse.sqf";
player_medMorphine = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medMorphine.sqf";
player_medPainkiller = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medPainkiller.sqf";
player_medAntiBiotics = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\publicEH\medAntibiotics.sqf";
player_humanityChange = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_humanityChange.sqf";
player_projectileNear = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_projectileNear.sqf";
player_bloodCalc = compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\bloodCalc.sqf";
fn_selectRandomLocation = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_selectRandomLocation.sqf";
fn_chance = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_selectRandomChance.sqf";
fn_getModelName = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_getModelName.sqf";
fn_niceSpot = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_niceSpot.sqf";
fnc_Obj_FenceHandleDam = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fence_handleDam.sqf";
object_roadFlare = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_roadFlare.sqf";
DZ_KeyDown_EH = compile preprocessFileLineNumbers "Mods\compile\keyboard.sqf";
fn_shuffleArray = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_shuffleArray.sqf";
zombie_initialize = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\zombie_initialize.sqf";
call compile preprocessFileLineNumbers "\z\addons\dayz_code\traps\init.sqf";

if (dayz_townGenerator) then {
 call compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\psrnd.sqf"; // pseudo random for plantSpanwer
} else {
 //Spawn waterHoleProxies manually if townGenerator is disabled
 if (!isDedicated && (toLower worldName in ["chernarus","namalsk","napf"])) then {
  execVM ("\z\addons\dayz_code\system\mission\" + (toLower worldName) + "\waterHoleProxy.sqf");
 };
};

// EPOCH ADDITIONS
BIS_fnc_numberDigits = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_numberDigits.sqf";
BIS_fnc_numberText = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_numberText.sqf";
local_lockUnlock = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_lockUnlock.sqf"; //When vehicle is local to unit perform locking vehicle
FNC_GetSetPos = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fnc_getSetPos.sqf";
FNC_GetPos = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fnc_getPos.sqf";
dayz_EjectPlayer = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dze_ejectPlayer.sqf";
dayz_groupInvite = compile preprocessFileLineNumbers "\z\addons\dayz_code\groups\handleInvite.sqf";

player_sumMedical = {
 private["_character","_wounds","_legs","_arms","_medical","_status"];
 _character = _this;
 _wounds = [];
 if (_character getVariable["USEC_injured",false]) then {
  {
   _status = _character getVariable["hit_"+_x,false];
   if ((typeName _status == "BOOLEAN") && {(_status)}) then {
    _wounds set [count _wounds,_x];
   };
  } forEach USEC_typeOfWounds;
 };
 _legs = _character getVariable ["hit_legs",0];
 _arms = _character getVariable ["hit_arms",0];
 _medical = [
  _character getVariable["USEC_isDead",false],
  _character getVariable["NORRN_unconscious", false],
  _character getVariable["USEC_infected",false],
  _character getVariable["USEC_injured",false],
  _character getVariable["USEC_inPain",false],
  _character getVariable["USEC_isCardiac",false],
  _character getVariable["USEC_lowBlood",false],
  _character getVariable["USEC_BloodQty",12000],
  _wounds,
  [_legs,_arms],
  _character getVariable["unconsciousTime",0],
  _character getVariable["blood_type",""],
  _character getVariable["rh_factor",""],
  _character getVariable["messing",[0,0,0]],
  _character getVariable["blood_testdone",false]
 ];
 _medical
};

dayz_reduceItems = {
    private ["_item","_class","_amount","_qtyRemaining"];
 
 _item = _this select 0; //Item in current inventory.
 _class = _this select 1; //Class type to use.

 //Does player have the original item? (Not Really needed player_useMeds checks)
 if (_item in magazines player) exitWith {
  //Amount in current box (will be -1 for a random chance to start the reducing)
  _amount = getNumber(configfile >> "CfgMagazines" >> _item >> _class >> "amount");

  //Item to move too if there is some left
  _qtyRemaining = getText(configfile >> "CfgMagazines" >> _item >> _class >> "qtyRemaining");
    
  //Only run for the random amount.
  if (_amount == -1) then {
   //Chance to start the reduction
   if ([getNumber(configfile >> "CfgMagazines" >> _item >> _class >> "chance")] call fn_chance) then {
    player removeMagazine _item;
    player addMagazine _qtyRemaining;
   };
  } else {
   player removeMagazine _item;
   player addMagazine _qtyRemaining;
  };
 };
 true
};

dayz_inflame = {
    private "_object";
    _object = _this select 0;
 
    if (_this select 1) then { // light the fire
        if (["matches",0.12] call fn_dynamicTool) then { _object inflame true; };
    } else { // put out the fire
  _object inflame false;
    };
};

dayz_inflame_showMenu = {
    private ["_object","_ret","_flame","_islit","_hasTool","_whatIwant"];

    _object = _this select 0;
    _whatIwant = _this select 1;
    _ret = false;

    _islit = (inflamed _object);
 
    _hasTool = false;
    if (!_islit) then {
        {
            if (_x in items player) exitWith { _hasTool = true; };
        } count DayZ_Ignitors;
    };
    _ret = (_whatIwant && !_islit && _hasTool) or (!_whatIwant && _isLit);

    _ret
};

dayz_inflame_other = {
    private ["_fireplace","_ret","_flame","_islit","_isLit","_pos"];

    _fireplace = _this select 0;
    if (_this select 1) then { // true = light the fire
        _flame = nearestObjects [_fireplace, ["flamable_DZ"], 1];
        _flame = if (count _flame > 0) then { _flame select 0 } else { objNull };
        if (isNull _flame) then {
            //_flame = if (local _fireplace) then { "flamable_DZ" createVehicleLocal getMarkerpos "respawn_west" } else {  createVehicle [ "flamable_DZ", getMarkerpos "respawn_west", [], 0, "CAN_COLLIDE"] };
   _flame = createVehicle ["flamable_DZ", [0,0,0], [], 0, "CAN_COLLIDE"]; // fireplace can be local (towngenerator, poi...) but flames will be networked
   _pos = getPosASL _fireplace;
   if (surfaceIsWater _pos) then {
    // modelToWorld changes with wave height
    _flame setPosASL [_pos select 0,_pos select 1,(_pos select 2)+0.2];
   } else {
    _pos = _fireplace modelToWorld (_fireplace selectionPosition "ohniste"); // ATL
    _flame setPosATL _pos;
   };
        };
  
        if (["matches",0.12] call fn_dynamicTool) then { _flame inflame true; };
    } else { // put out the fire
        _flame = nearestObjects [_fireplace, ["flamable_DZ"], 1];
        if (count _flame > 0) then { (_flame select 0) inflame false; };
    };
};

dayz_inflame_showMenu_other = {
    private ["_fireplace","_ret","_flame","_islit","_hasTool","_whatIwant"];

    _fireplace = _this select 0;
    _whatIwant = _this select 1;
    _ret = false;
    // return a boolean. true <=> player can put out the lit fire, can light a fire with match
    _flame = nearestObjects [_fireplace, ["flamable_DZ"], 1];
    _flame = if (count _flame > 0) then { _flame select 0 } else { objNull };
    _islit = !(isNull _flame) && {(inflamed _flame)};
    _hasTool = false;
    if (!_islit) then {
        {
            if (_x in items player) exitWith { _hasTool = true; };
        } count DayZ_Ignitors;
    };
    _ret = (_whatIwant && !_islit && _hasTool) or (!_whatIwant && _isLit);
 //systemChat str [_flame, _hasTool, _islit, _ret];

    _ret
};

isInflamed = {
    private "_flame";

    _flame = nearestObjects [_this, ["flamable_DZ"], 1];
    _flame = if (count _flame > 0) then { _flame select 0 } else { objNull };
    !(isNull _flame) && {(inflamed _flame)}
};

dayz_engineSwitch = {
 //private["_unit","_humanity","_delay"];
 _vehicle = _this select 0;
 _state = _this select 1;
 
 if (local _vehicle) then {
  _vehicle engineOn _state;
 } else {
  PVDZ_send = [_vehicle,"SetEngineState",[_vehicle,_state]];
  publicVariableServer "PVDZ_send";
 };
};

 

Init.sqf

/* 
 For DayZ Epoch
 Addons Credits: Jetski Yanahui by Kol9yN, Zakat, Gerasimow9, YuraPetrov, zGuba, A.Karagod, IceBreakr, Sahbazz
*/

//Server settings
dayZ_instance = 11; //Instance ID of this server
dayZ_serverName = ""; //Shown to all players in the bottom left of the screen (country code + server number)

//DayZMod presets
dayz_presets = "Custom"; //"Custom","Classic","Vanilla","Elite"

//Epoch Config Variables
call compile preprocessFileLineNumbers "Mods\cfg\EpochConfig.sqf";
call compile preprocessFileLineNumbers "Mods\cfg\ManSysConfig.sqf";
call compile preprocessFileLineNumbers "Mods\cfg\TraderConfig.sqf";

//Restrict Building
LimitPlotPoles = true; // Limit the amount of plot poles a player can own?
if (LimitPlotPoles) then {
 PlotPoleLimit = 1; // Amount of plot poles each individual player is allowed to own
};

LimitBuildHeight = true; // Limit the maximum height a player can build at
if (LimitBuildHeight) then {
 MaxBuildHeight = 30; // Maximum build height in meters
};

// Restrict building near specific buildings
BlacklistedBuildings = [
//  ["What text will say", "Class name of building you want to block", Distance around that building to block (radius in meters)]
 ["Fire Station", "Land_a_stationhouse", 250]
];

// Restrict building near map areas
RestrictedBuildingZones = [
//  ["What text will say", [Choords of place to block], Distance around that area to block (radius in meters)]
    ["Balota Airfield", [5158.72, 2518.75, 0], 600],
 ["Stary Trader", [6325.6772,7807.7412,0], 1000],
    ["Bash Trader", [4063.4226,11664.19,0], 800],
    ["Klen Trader", [11447.472,11364.504,0], 1000],
    ["Bandit Trader", [1606.6443,7803.5156,0], 800],
    ["Hero Trader", [12944.227,12766.889,0], 800],
    ["Air Dealer", [12060,12640,0], 1000]
];

EpochUseEvents = true; //Enable event scheduler. Define custom scripts in dayz_server\modules to run on a schedule.
EpochEvents =[
 ["any","any","any","any",50,"supply_drop"],
 ["any","any","any","any",10,"crash_spawner"],
 ["any","any","any","any",10,"labyrinth"],
 ["any","any","any","any",10,"elisbookevent"],
 ["any","any","any","any",10,"supply_from_air"],
 ["any","any","any","any",10,"drop_bombs"],
 ["any","any","any","any",10,"Treasure"],
 ["any","any","any","any",10,"Military"],
 ["any","any","any","any",10,"newrubbletown"],
 ["any","any","any","any",10,"weedfarm"]
 ];

diag_log 'dayz_preloadFinished reset';
dayz_preloadFinished=nil;
onPreloadStarted "diag_log [diag_tickTime,'onPreloadStarted']; dayz_preloadFinished = false;";
onPreloadFinished "diag_log [diag_tickTime,'onPreloadFinished']; dayz_preloadFinished = true;";
with uiNameSpace do {RscDMSLoad=nil;}; // autologon at next logon

if (!isDedicated) then {
 enableSaving [false, false];
 startLoadingScreen ["","RscDisplayLoadCustom"];
 progressLoadingScreen 0;
 dayz_loadScreenMsg = localize 'str_login_missionFile';
 progress_monitor = [] execVM "\z\addons\dayz_code\system\progress_monitor.sqf";
 0 cutText ['','BLACK',0];
 0 fadeSound 0;
 0 fadeMusic 0;
};

initialized = false;
call compile preprocessFileLineNumbers "Mods\init\variables.sqf";
progressLoadingScreen 0.05;
call compile preprocessFileLineNumbers "Mods\init\publicEH.sqf";
progressLoadingScreen 0.1;
call compile preprocessFileLineNumbers "\z\addons\dayz_code\medical\setup_functions_med.sqf";
progressLoadingScreen 0.15;
call compile preprocessFileLineNumbers "Mods\init\compiles.sqf";
call compile preprocessFileLineNumbers "Mods\scripts\addons\bike\init.sqf";
progressLoadingScreen 0.25;
call compile preprocessFileLineNumbers "Mods\Trader\server_traders.sqf";
call compile preprocessFileLineNumbers "logistic\init.sqf";
call compile preprocessFileLineNumbers "\z\addons\dayz_code\system\mission\chernarus11.sqf"; //Add trader city objects locally on every machine early
if (dayz_POIs && (toLower worldName == "chernarus")) then {call compile preprocessFileLineNumbers "\z\addons\dayz_code\system\mission\chernarus\poi\init.sqf";}; //Add POI objects locally on every machine early
initialized = true;

setTerrainGrid 25;
//if (dayz_REsec == 1) then {call compile preprocessFileLineNumbers "\z\addons\dayz_code\system\REsec.sqf";};
execVM "\z\addons\dayz_code\system\DynamicWeatherEffects.sqf";

if (isServer) then {
 call compile preprocessFileLineNumbers "\z\addons\dayz_server\system\dynamic_vehicle.sqf";
 call compile preprocessFileLineNumbers "\z\addons\dayz_server\system\server_monitor.sqf";
 execVM "\z\addons\dayz_server\traders\chernarus11.sqf"; //Add trader agents
 
 //Get the server to setup what waterholes are going to be infected and then broadcast to everyone.
 if (dayz_infectiousWaterholes && (toLower worldName == "chernarus")) then {execVM "\z\addons\dayz_code\system\mission\chernarus\infectiousWaterholes\init.sqf";};
 
 // Lootable objects from CfgTownGeneratorDefault.hpp
 if (dayz_townGenerator) then { execVM "\z\addons\dayz_code\system\mission\chernarus\MainLootableObjects.sqf"; };
};

if (!isDedicated) then {
 //Enables Plant lib fixes
 //execVM "\z\addons\dayz_code\system\antihack.sqf";
 [] execVM "Mods\scripts\service_point.sqf";
 
 if (toLower(worldName) == "chernarus") then {
  diag_log "WARNING: Clearing annoying benches from Chernarus";
  ([4654,9595,0] nearestObject 145259) setDamage 1;
  ([4654,9595,0] nearestObject 145260) setDamage 1;
 };
 
 if (dayz_townGenerator) then { execVM "\z\addons\dayz_code\compile\client_plantSpawner.sqf"; };
 call compile preprocessFileLineNumbers "spawn\init.sqf"; //ESSV3
 execFSM "\z\addons\dayz_code\system\player_monitor.fsm";
 //[false,12] execVM "\z\addons\dayz_code\compile\local_lights_init.sqf";
 if (DZE_R3F_WEIGHT) then {execVM "\z\addons\dayz_code\external\R3F_Realism\R3F_Realism_Init.sqf";};
 waitUntil {scriptDone progress_monitor};
 cutText ["","BLACK IN", 3];
 3 fadeSound 1;
 3 fadeMusic 1;
 endLoadingScreen;
};

//WATERMARK
 _pic = "media\sgamelogo.paa";
 [
  '<img align=''left'' size=''1.0'' shadow=''1'' image='+(str(_pic))+' />',
  safeZoneX+0.027,
  safeZoneY+safeZoneH-0.1,
  99999,
  0,
  0,
  3090
 ] spawn bis_fnc_dynamicText;

[] execVM "Mods\scripts\16_safezone.sqf";
[] execVM "admineventsclientside\init_adminevents.sqf";

\n

Link to comment
Share on other sites

@Jestertriks in your compiles  the one you paste you have the dze_buildchecks twice.

coment the old

this line

Spoiler

 // EPOCH ADDITIONS
 dayz_autoRunOff = {dayz_autoRun = false; terminate dayz_autoRunThread; player playActionNow "Stop";};
 dog_findTargetAgent = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dog_findTargetAgent.sqf";
 dze_deathMessage = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dze_deathMessage.sqf";
 dze_filterCheats = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_filterCheats.sqf";
 dze_isnearest_player = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dze_isNearestPlayer.sqf";
 //dze_buildChecks = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dze_buildChecks.sqf";

 

 

or just remove the one you put, and change the path for the default line.

	dze_buildChecks = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\dze_buildChecks.sqf";

and change the path

dze_buildChecks = compile preprocessFileLineNumbers "Mods\compile\dze_buildChecks.sqf";

or made a new compiles.sqf into your client side folder

and paste

compiles.sqf (mpmissions\your instance\mods\compile\)

if (!isDedicated) then {
dze_buildChecks = compile preprocessFileLineNumbers "Mods\compile\dze_buildChecks.sqf";
};

and in your init.sqf

find:

progressLoadingScreen 0.15;

below add:

call compile preprocessFileLineNumbers "Mods\compile\compiles.sqf";


 

Link to comment
Share on other sites

On 3/24/2017 at 5:53 PM, BigEgg said:

You will need to copy modular_build.sqf over to your mission folder and change the path in your compiles.

 

In modular_build.sqf find:


if(abs(_objHDiff) > DZE_buildMaxHeightDistance) exitWith {
	_isOk = false;
	_cancel = true;
	_reason = format[localize "STR_EPOCH_BUILD_FAIL_HEIGHT",DZE_buildMaxHeightDistance];
	detach _object;
	deleteVehicle _object;
	if (_VectorWorkAround) then {
		detach _object2;
		deleteVehicle _object2;
	};
	detach _objectHelper;
	deleteVehicle _objectHelper;
};

Under it add:


if (LimitBuildHeight && (((abs(_objHDiff)) + ((getPosATL (vehicle player)) select 2)) > MaxBuildHeight)) exitWith {
	_isOk = false;
	_cancel = true;
	_reason = format["Building is restricted above %1 meters.", MaxBuildHeight];
	detach _object;
	deleteVehicle _object;
	if (_VectorWorkAround) then {
		detach _object2;
		deleteVehicle _object2;
	};
	detach _objectHelper;
	deleteVehicle _objectHelper;
};

 

That should work (haven't tested - will update the post when I have).

I can Also Confirm this works. Thank you for all your amazing help!

Link to comment
Share on other sites

In order to stop building around the airfields I made multiple points which overlap along the length of each runway.  Was wondering if this could cause any problems or if there is a better way to do it?  Below is my init.sqf config covering stock Chernarus 11 trader positions, airfields, 9 buildings, 2 plotpoles and 30m build height.  I have this on my server now and it all looks to all be working good.

Spoiler

// Restrict Building mod
LimitPlotPoles = true; // Limit the amount of plot poles a player can own?
if (LimitPlotPoles) then {PlotPoleLimit = 2; };    // Amount of plot poles each individual player is allowed to own

LimitBuildHeight = true; // Limit the maximum height a player can build at
if (LimitBuildHeight) then {MaxBuildHeight = 30;}; // Maximum build height in meters
    
BlacklistedBuildings = [        // Restrict building near specific buildings
["Barracks", "Land_Mil_Barracks", 15],
["Barracks", "Land_Mil_Barracks_i", 15],
["Fire Station", "Land_a_stationhouse", 30],
["Fire Station", "Land_a_stationhouse_ep1", 30],
["Hospital", "Land_a_Hospital", 30],
["Factory", "Land_a_Tovarna2", 30],
["Factory", "Land_Ind_Pec_03a", 30],
["Supermarket", "Land_A_Generalstore_01", 30],
["Supermarket", "Land_A_Generalstore_01a", 30]
];    //  ["What text will say", "Class name of building you want to block", Distance around that building to block (radius in meters)]

RestrictedBuildingZones = [     // Restrict building near map areas
["Stary Trader", [6325,7807, 0], 1000],
["Bash Trader", [4063,11664, 0], 500],
["Klen Trader", [11447,11364, 0], 500],
["Hero Trader", [12944,12766, 0], 500],
["Bandit Trader", [1606,7803, 0], 500],
["NEAF", [12475,12578, 0], 500],
["NEAF", [12302,12641, 0], 500],
["NEAF", [12130,12705, 0], 500],
["NEAF", [11957,12768, 0], 500],
["NEAF", [11785,12832, 0], 500],
["NWAF", [4159, 10895, 0], 500],
["NWAF", [4251, 10740, 0], 500],
["NWAF", [4343, 10548, 0], 500],
["NWAF", [4435, 10428, 0], 500],
["NWAF", [4527, 10272, 0], 500],
["NWAF", [4619, 10116, 0], 500],
["NWAF", [4711, 9960, 0], 500],
["NWAF", [4803, 9804, 0], 500],
["NWAF", [4897, 9648, 0], 500],
["Balota Airfield", [4612, 2473, 0], 500],
["Balota Airfield", [4767, 2432, 0], 500],
["Balota Airfield", [4923, 2392, 0], 500],
["Balota Airfield", [5079, 2301, 0], 500],
["Balota Airfield", [5235, 2211, 0], 500]
];    //  ["What text will say", [Choords of place to block], Distance around that area to block (radius in meters)]

 

Link to comment
Share on other sites

32 minutes ago, Jim90 said:

In order to stop building around the airfields I made multiple points which overlap along the length of each runway.  Was wondering if this could cause any problems or if there is a better way to do it?  Below is my init.sqf config covering stock Chernarus 11 trader positions, airfields, 9 buildings, 2 plotpoles and 30m build height.  I have this on my server now and it all looks to all be working good.

  Reveal hidden contents

// Restrict Building mod
LimitPlotPoles = true; // Limit the amount of plot poles a player can own?
if (LimitPlotPoles) then {PlotPoleLimit = 2; };    // Amount of plot poles each individual player is allowed to own

LimitBuildHeight = true; // Limit the maximum height a player can build at
if (LimitBuildHeight) then {MaxBuildHeight = 30;}; // Maximum build height in meters
    
BlacklistedBuildings = [        // Restrict building near specific buildings
["Barracks", "Land_Mil_Barracks", 15],
["Barracks", "Land_Mil_Barracks_i", 15],
["Fire Station", "Land_a_stationhouse", 30],
["Fire Station", "Land_a_stationhouse_ep1", 30],
["Hospital", "Land_a_Hospital", 30],
["Factory", "Land_a_Tovarna2", 30],
["Factory", "Land_Ind_Pec_03a", 30],
["Supermarket", "Land_A_Generalstore_01", 30],
["Supermarket", "Land_A_Generalstore_01a", 30]
];    //  ["What text will say", "Class name of building you want to block", Distance around that building to block (radius in meters)]

RestrictedBuildingZones = [     // Restrict building near map areas
["Stary Trader", [6325,7807, 0], 1000],
["Bash Trader", [4063,11664, 0], 500],
["Klen Trader", [11447,11364, 0], 500],
["Hero Trader", [12944,12766, 0], 500],
["Bandit Trader", [1606,7803, 0], 500],
["NEAF", [12475,12578, 0], 500],
["NEAF", [12302,12641, 0], 500],
["NEAF", [12130,12705, 0], 500],
["NEAF", [11957,12768, 0], 500],
["NEAF", [11785,12832, 0], 500],
["NWAF", [4159, 10895, 0], 500],
["NWAF", [4251, 10740, 0], 500],
["NWAF", [4343, 10548, 0], 500],
["NWAF", [4435, 10428, 0], 500],
["NWAF", [4527, 10272, 0], 500],
["NWAF", [4619, 10116, 0], 500],
["NWAF", [4711, 9960, 0], 500],
["NWAF", [4803, 9804, 0], 500],
["NWAF", [4897, 9648, 0], 500],
["Balota Airfield", [4612, 2473, 0], 500],
["Balota Airfield", [4767, 2432, 0], 500],
["Balota Airfield", [4923, 2392, 0], 500],
["Balota Airfield", [5079, 2301, 0], 500],
["Balota Airfield", [5235, 2211, 0], 500]
];    //  ["What text will say", [Choords of place to block], Distance around that area to block (radius in meters)]

 

Not an issue at all, I do the same thing :) 

Link to comment
Share on other sites

  • 2 weeks later...
59 minutes ago, DieTanx said:

Is there a way to block fuel pumps from being placed right on the safe zone lines?

i guess you can use the

DZE_SafeZoneNoBuildDistance = 150;

DZE_SafeZoneNoBuildItems []; located in configvariables.sqf to made it.

 

Link to comment
Share on other sites

35 minutes ago, juandayz said:

i guess you can use the

DZE_SafeZoneNoBuildDistance = 150;

DZE_SafeZoneNoBuildItems []; located in configvariables.sqf to made it.

 

DZE_SafeZoneNoBuildItems = ["fuel_pump_kit","fuelpump_dz","VaultStorageLocked","LockboxStorageLocked","Plastic_Pole_EP1_DZ"]; // Array of object class names not allowed to build
 

DZE_SafeZoneNoBuildDistance = 1250; // Distance from safe zones listed above to disallow building near.
 

 

Already have this added-- does not block the fuel pumps

The block works for safes and plots-- just not the fuel pumps

Link to comment
Share on other sites

You arent using the correct class names of the pumps .  If you have infistar, place what you want to block then look at it and press I and the clsssname will be displayed in the chat. 

From memory its something like land_pump _a or something similar. 

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
  • Advertisement
×
×
  • Create New...