mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-13 19:52:38 +03:00
Fix snap build errors
@raymix in most of your helper functions you are using exitWith {}; in
the same way the main player_build uses it. The problem is exitWith
inside of a called function only exits that function, not the parent
script it was called from.
When a helper function exits the main script continues on with undefined
variables and other problems. The easiest solution was to just remove
these helper functions for now. I just directly substituted their code
back into the main modular_build file and removed the passes to and from
them.
We should consolidate player_build and modular_build into one file first
since they are about 80% identical. After that we need to integrate
plot4life. Dividing player_build up into smaller sub functions like this
can be left for last.
I tested this thoroughly and can confirm the undefined errors are fixed
now.
This commit is contained in:
@@ -4,7 +4,6 @@
|
|||||||
[NEW] UI Update - Graphical and code changes, enable using Dayz_Dark_UI = true; in init.sqf. @hogscraper http://epochmod.com/forum/index.php?/topic/13654-proposed-ui-change/
|
[NEW] UI Update - Graphical and code changes, enable using Dayz_Dark_UI = true; in init.sqf. @hogscraper http://epochmod.com/forum/index.php?/topic/13654-proposed-ui-change/
|
||||||
[NOTE] It's recommend to convert to the new SteamID system if possible, new servers should not use DayZ_UseSteamID = false;
|
[NOTE] It's recommend to convert to the new SteamID system if possible, new servers should not use DayZ_UseSteamID = false;
|
||||||
[NEW] Snap building (disabled by default), use DZE_modularBuild = true; in your init.sqf to enable. @raymix
|
[NEW] Snap building (disabled by default), use DZE_modularBuild = true; in your init.sqf to enable. @raymix
|
||||||
[NEW] Modular/Function based player_build for addon makers and modders. @raymix (more info and concepts - http://epochmod.com/forum/index.php?/topic/14628-modular-function-based-player-buildsqf/ )
|
|
||||||
[NEW] Added "RedRyder" and "350Rnd_BB_Magazine" to loot pile. #1456 #1457 @Namindu
|
[NEW] Added "RedRyder" and "350Rnd_BB_Magazine" to loot pile. #1456 #1457 @Namindu
|
||||||
[NEW] Auto login when a player joins the server, default 10 seconds, requires description.ext update in the mission (disable in description.ext by setting defValueParam1 = 31;) @icomrade
|
[NEW] Auto login when a player joins the server, default 10 seconds, requires description.ext update in the mission (disable in description.ext by setting defValueParam1 = 31;) @icomrade
|
||||||
[NEW] Upgraded (_DZE1,2,3,4) ArmoredSUV and Kamaz classes are now available. #1518 #1538 @McKeighan
|
[NEW] Upgraded (_DZE1,2,3,4) ArmoredSUV and Kamaz classes are now available. #1518 #1538 @McKeighan
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
|
private ["_classname","_classnametmp","_require","_text","_ghost","_lockable","_requireplot","_isAllowedUnderGround","_offset","_isPole","_isLandFireDZ","_hasRequired","_hasrequireditem","_reason","_buildObject","_location1","_object","_objectHelper","_position","_controls","_cancel","_dir","_cnt","_pos","_distance","_buildables","_onLadder","_vehicle","_inVehicle","_abort","_needNear","_isNear","_needText","_findNearestPoles","_findNearestPole","_IsNearPlot","_canBuildOnPlot","_nearestPole","_ownerID","_friendlies","_missing","_checkMag","_enableGhost","_helperColor","_canDo","_objHDiff","_isOk","_zheightchanged","_zheightdirection","_rotate","_location2","_lastDir","_objectHelperDir","_objectHelperPos","_tmpbuilt","_limit","_proceed","_counter","_dis","_sfx","_started","_finished","_animState","_isMedic","_num_removed","_combinationDisplay","_combination_1","_combination_2","_combination_3","_combination_4","_combination","_combination_1_Display"];
|
||||||
|
|
||||||
//Check if building already in progress, exit if so.
|
//Check if building already in progress, exit if so.
|
||||||
if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_40") , "PLAIN DOWN"]; };
|
if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_40") , "PLAIN DOWN"]; };
|
||||||
DZE_ActionInProgress = true;
|
DZE_ActionInProgress = true;
|
||||||
|
_pos = [player] call FNC_GetPos;
|
||||||
|
|
||||||
private ["_itemConfig","_classname","_classnametmp","_require","_text","_ghost","_lockable","_requireplot","_isAllowedUnderGround","_offset","_isPole","_isLandFireDZ","_hasRequired","_hasrequireditem","_reason","_buildObject","_location1","_object","_objectHelper","_position","_controls","_cancel","_dir"];
|
_onLadder = (getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "onLadder")) == 1;
|
||||||
|
|
||||||
|
_vehicle = vehicle player;
|
||||||
|
_inVehicle = (_vehicle != player);
|
||||||
|
|
||||||
/*Basic Defines*/
|
|
||||||
DZE_Q = false;
|
DZE_Q = false;
|
||||||
DZE_Z = false;
|
DZE_Z = false;
|
||||||
|
|
||||||
@@ -25,63 +30,589 @@ DZE_cancelBuilding = false;
|
|||||||
call gear_ui_init;
|
call gear_ui_init;
|
||||||
closeDialog 1;
|
closeDialog 1;
|
||||||
|
|
||||||
|
if (dayz_isSwimming) exitWith {DZE_ActionInProgress = false;cutText [localize "str_player_26","PLAIN DOWN"];};
|
||||||
|
if (_inVehicle) exitWith {DZE_ActionInProgress = false;cutText [(localize "str_epoch_player_42"),"PLAIN DOWN"];};
|
||||||
|
if (_onLadder) exitWith {DZE_ActionInProgress = false;cutText [localize "str_player_21","PLAIN DOWN"];};
|
||||||
|
if (player getVariable["combattimeout", 0] >= time) exitWith {DZE_ActionInProgress = false;cutText [(localize "str_epoch_player_43"),"PLAIN DOWN"];};
|
||||||
|
|
||||||
DZE_buildItem = _this; //This is a magazine! It's global to allow access to it from outside functions
|
DZE_buildItem = _this; //This is a magazine! It's global to allow access to it from outside functions
|
||||||
|
|
||||||
//count nearby objects. Returns [_cnt] number
|
// Need Near Requirements
|
||||||
[] call player_build_countNearby;
|
_abort = false;
|
||||||
|
_reason = "";
|
||||||
|
|
||||||
//Check illegal player states. Returns [_isFine] string
|
_needNear = getArray (configFile >> "CfgMagazines" >> DZE_buildItem >> "ItemActions" >> "Build" >> "neednearby");
|
||||||
[] call player_build_states;
|
|
||||||
|
|
||||||
//check for nearby requirements (campfire, workshop, fueltank).
|
{
|
||||||
[] call player_build_needNearby;
|
switch(_x) do{
|
||||||
|
case "fire":
|
||||||
//check config files and gather info about item (if using custom buildables, make your own similar function instead).
|
{
|
||||||
_itemConfig = [] call player_build_getConfig;
|
_distance = 3;
|
||||||
|
_isNear = {inflamed _x} count (_pos nearObjects _distance);
|
||||||
//define items collected from function
|
if(_isNear == 0) then {
|
||||||
_classname = _itemConfig select 0; //string
|
_abort = true;
|
||||||
_classnametmp = _itemConfig select 1; //string
|
_reason = "fire";
|
||||||
_require = _itemConfig select 2; // array
|
};
|
||||||
_text = _itemConfig select 3; // string
|
};
|
||||||
_ghost = _itemConfig select 4; //string
|
case "workshop":
|
||||||
_lockable = _itemConfig select 5; //int -- 0/1=No 2=lockbox, 3=combolock, 4=safe
|
{
|
||||||
_requireplot = _itemConfig select 6; //int
|
_distance = 3;
|
||||||
_isAllowedUnderGround = _itemConfig select 7; //int
|
_isNear = count (nearestObjects [_pos, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]);
|
||||||
_offset = _itemConfig select 8; //array
|
if(_isNear == 0) then {
|
||||||
_isPole = _itemConfig select 9; //bool
|
_abort = true;
|
||||||
_isLandFireDZ = _itemConfig select 10; //bool
|
_reason = "workshop";
|
||||||
|
};
|
||||||
//Check for nearby plotpoles. Returns [_IsNearPlot,_nearestPole,_ownerID,_friendlies] [int,Obj,int,array]
|
};
|
||||||
[_isPole, _requireplot, _isLandFireDZ] call player_build_plotCheck;
|
case "fueltank":
|
||||||
|
{
|
||||||
if (DZE_ActionInProgress) then { //needed otherwise _hasRequired gets RPT error
|
_distance = 30;
|
||||||
|
_isNear = count (nearestObjects [_pos, dayz_fuelsources, _distance]);
|
||||||
//Check for build requirements (missing tools and items). Returns [_hasrequireditem,_reason] [bool,string]
|
if(_isNear == 0) then {
|
||||||
_hasRequired = [_require, _text, true, true] call player_build_buildReq;
|
_abort = true;
|
||||||
|
_reason = "fuel tank";
|
||||||
//define item collected from function
|
};
|
||||||
_hasrequireditem = _hasRequired select 0; //bool
|
};
|
||||||
|
|
||||||
if (_hasrequireditem) then {
|
|
||||||
|
|
||||||
//Create object that is attached to a player (i.e Ghost preview if available)
|
|
||||||
_buildObject = [_classname, _ghost, _offset, true] call player_build_create;
|
|
||||||
|
|
||||||
//define items collected from function
|
|
||||||
_location1 = _buildObject select 0; //array
|
|
||||||
_object = _buildObject select 1; //Obj
|
|
||||||
_objectHelper = _buildObject select 2; //Obj
|
|
||||||
|
|
||||||
_controls = [_object, _isAllowedUnderGround, _location1, _objectHelper] call player_build_controls;
|
|
||||||
|
|
||||||
//define items collected from function
|
|
||||||
_cancel = _controls select 0; //bool
|
|
||||||
_reason = _controls select 1; //string
|
|
||||||
_position = _controls select 2; //array
|
|
||||||
_dir = _controls select 3; //int
|
|
||||||
|
|
||||||
//Publish item to a database
|
|
||||||
[_cancel, _position, _classnametmp,_isAllowedUnderGround, _text, _isPole, _lockable,_dir, _reason] call player_build_publish;
|
|
||||||
};
|
};
|
||||||
};
|
} forEach _needNear;
|
||||||
|
|
||||||
|
if (_abort) exitWith {
|
||||||
|
cutText [format[(localize "str_epoch_player_135"),_reason,_distance], "PLAIN DOWN"];
|
||||||
|
DZE_ActionInProgress = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
_classname = getText (configFile >> "CfgMagazines" >> DZE_buildItem >> "ItemActions" >> "Build" >> "create");
|
||||||
|
_classnametmp = _classname;
|
||||||
|
_require = getArray (configFile >> "cfgMagazines" >> DZE_buildItem >> "ItemActions" >> "Build" >> "require");
|
||||||
|
_text = getText (configFile >> "CfgVehicles" >> _classname >> "displayName");
|
||||||
|
_ghost = getText (configFile >> "CfgVehicles" >> _classname >> "ghostpreview");
|
||||||
|
|
||||||
|
_lockable = 0; //default define if lockable not found in config file below
|
||||||
|
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "lockable")) then { //find out if item is lockable object
|
||||||
|
_lockable = getNumber(configFile >> "CfgVehicles" >> _classname >> "lockable"); // 2=lockbox, 3=combolock, 4=safe
|
||||||
|
};
|
||||||
|
|
||||||
|
_requireplot = DZE_requireplot; //check for plotpole requirements defined in init.sqf
|
||||||
|
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "requireplot")) then {
|
||||||
|
_requireplot = getNumber(configFile >> "CfgVehicles" >> _classname >> "requireplot");
|
||||||
|
};
|
||||||
|
|
||||||
|
_isAllowedUnderGround = 1; //check if allowed to build under terrain
|
||||||
|
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "nounderground")) then {
|
||||||
|
_isAllowedUnderGround = getNumber(configFile >> "CfgVehicles" >> _classname >> "nounderground");
|
||||||
|
};
|
||||||
|
|
||||||
|
_offset = getArray (configFile >> "CfgVehicles" >> _classname >> "offset"); //check default distance offset, define if does not exist
|
||||||
|
if((count _offset) <= 0) then {
|
||||||
|
_offset = [0,1.5,0];
|
||||||
|
};
|
||||||
|
|
||||||
|
_isPole = (_classname == "Plastic_Pole_EP1_DZ"); //check if item is plotpole
|
||||||
|
_isLandFireDZ = (_classname == "Land_Fire_DZ"); //check if item is campfire
|
||||||
|
|
||||||
|
_distance = DZE_PlotPole select 0;
|
||||||
|
_needText = localize "str_epoch_player_246"; //text for when requirements not met
|
||||||
|
_canBuildOnPlot = false;
|
||||||
|
_nearestPole = objNull;
|
||||||
|
_ownerID = 0;
|
||||||
|
_friendlies = [];
|
||||||
|
|
||||||
|
if(_isPole) then { //check if object is plotpole and adjust distance accordingly
|
||||||
|
_distance = DZE_PlotPole select 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
// check for near plotpoles
|
||||||
|
_findNearestPoles = nearestObjects [(vehicle player), ["Plastic_Pole_EP1_DZ"], _distance]; //create an array of nearby objects that are plotpoles, nearest will always be first in array
|
||||||
|
_findNearestPole = []; //must define an empty array to avoid problems
|
||||||
|
|
||||||
|
{
|
||||||
|
if (alive _x) then { //only look for non-destroyed plotpoles
|
||||||
|
_findNearestPole set [(count _findNearestPole),_x]; //build an array of live plotpoles found nearby
|
||||||
|
};
|
||||||
|
} count _findNearestPoles; //count each item in previously created array of nearby plotpoles
|
||||||
|
|
||||||
|
_IsNearPlot = count (_findNearestPole); //count our new array of non-destroyed plotpoles. Empty array will return 0
|
||||||
|
|
||||||
|
// End script if item is plot pole and another one exists within defined radius
|
||||||
|
if(_isPole && _IsNearPlot > 0) exitWith {DZE_ActionInProgress = false;cutText [(format [localize "str_epoch_player_44",_distance]),"PLAIN DOWN"];};
|
||||||
|
|
||||||
|
if(_IsNearPlot == 0) then { //No live plotpoles were found nearby
|
||||||
|
// Allow building of plot
|
||||||
|
if(_requireplot == 0 || _isLandFireDZ) then {
|
||||||
|
_canBuildOnPlot = true;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// Since there are plots nearby we check for ownership and then for friend status
|
||||||
|
// check nearby plots ownership and then for friend status
|
||||||
|
_nearestPole = _findNearestPole select 0; //nearest is always first in array when using nearestObjects check
|
||||||
|
|
||||||
|
// Find owner
|
||||||
|
_ownerID = _nearestPole getVariable ["CharacterID","0"];
|
||||||
|
|
||||||
|
// check if friendly to owner
|
||||||
|
if(dayz_characterID == _ownerID) then { //Keep ownership
|
||||||
|
// owner can build anything within his plot except other plots
|
||||||
|
if(!_isPole) then {
|
||||||
|
_canBuildOnPlot = true;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// disallow building plot
|
||||||
|
if(!_isPole) then {
|
||||||
|
_friendlies = player getVariable ["friendlyTo",[]];
|
||||||
|
// check if friendly to owner
|
||||||
|
if(_ownerID in _friendlies) then {
|
||||||
|
_canBuildOnPlot = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!_canBuildOnPlot) exitWith { DZE_ActionInProgress = false;cutText [format[(localize "STR_EPOCH_PLAYER_135"),_needText,_distance],"PLAIN DOWN"];};
|
||||||
|
|
||||||
|
_buildables = DZE_maintainClasses + DZE_LockableStorage;
|
||||||
|
_buildables set [count _buildables,"TentStorage"];
|
||||||
|
_center = if (isNull _nearestPole) then {_pos} else {_nearestPole};
|
||||||
|
if ((count (nearestObjects [_center,_buildables,_distance])) >= DZE_BuildingLimit) exitWith {DZE_ActionInProgress = false;cutText [(format [localize "str_epoch_player_41",_distance]),"PLAIN DOWN"];};
|
||||||
|
|
||||||
|
_missing = "";
|
||||||
|
_hasrequireditem = true;
|
||||||
|
{
|
||||||
|
_hastoolweapon = _x in weapons player; //check each required item against weapons array on player
|
||||||
|
if(!_hastoolweapon) exitWith {_hasrequireditem = false; _missing = getText (configFile >> "cfgWeapons" >> _x >> "displayName");};
|
||||||
|
} count _require; //count each item in requirements array
|
||||||
|
|
||||||
|
_hasbuilditem = DZE_buildItem in magazines player;
|
||||||
|
if (!_hasbuilditem) exitWith {DZE_ActionInProgress = false;cutText [format[(localize "str_player_31"),_text,"build"],"PLAIN DOWN"];};
|
||||||
|
|
||||||
|
if (!_hasrequireditem) exitWith {DZE_ActionInProgress = false;cutText [format[(localize "str_epoch_player_137"),_missing],"PLAIN DOWN"];};
|
||||||
|
if (_hasrequireditem) then {
|
||||||
|
|
||||||
|
_objectHelper = objNull;
|
||||||
|
_isOk = true;
|
||||||
|
_location1 = [player] call FNC_GetPos; // get inital players position
|
||||||
|
_dir = getDir player; //required to pass direction when building
|
||||||
|
|
||||||
|
// if ghost preview available use that instead
|
||||||
|
if (_ghost != "") then {
|
||||||
|
_classname = _ghost;
|
||||||
|
};
|
||||||
|
|
||||||
|
_object = createVehicle [_classname, [0,0,0], [], 0, "CAN_COLLIDE"]; //object preview, not an actual object that will be built
|
||||||
|
|
||||||
|
_objectHelper = "Sign_sphere10cm_EP1" createVehicle [0,0,0];
|
||||||
|
_helperColor = "#(argb,8,8,3)color(0,0,0,0,ca)";
|
||||||
|
_objectHelper setobjecttexture [0,_helperColor];
|
||||||
|
_objectHelper attachTo [player,_offset];
|
||||||
|
_object attachTo [_objectHelper,[0,0,0]];
|
||||||
|
|
||||||
|
if (isClass (configFile >> "SnapBuilding" >> _classname)) then {
|
||||||
|
["","","",["Init",_object,_classname,_objectHelper]] spawn snap_build;
|
||||||
|
};
|
||||||
|
|
||||||
|
_objHDiff = 0;
|
||||||
|
_cancel = false;
|
||||||
|
_reason = "";
|
||||||
|
|
||||||
|
helperDetach = false;
|
||||||
|
_canDo = (!r_drag_sqf and !r_player_unconscious);
|
||||||
|
_position = [_objectHelper] call FNC_GetPos;
|
||||||
|
|
||||||
|
while {_isOk} do {
|
||||||
|
|
||||||
|
_zheightchanged = false;
|
||||||
|
_zheightdirection = "";
|
||||||
|
_rotate = false;
|
||||||
|
|
||||||
|
if (DZE_Q) then {
|
||||||
|
DZE_Q = false;
|
||||||
|
_zheightdirection = "up";
|
||||||
|
_zheightchanged = true;
|
||||||
|
};
|
||||||
|
if (DZE_Z) then {
|
||||||
|
DZE_Z = false;
|
||||||
|
_zheightdirection = "down";
|
||||||
|
_zheightchanged = true;
|
||||||
|
};
|
||||||
|
if (DZE_Q_alt) then {
|
||||||
|
DZE_Q_alt = false;
|
||||||
|
_zheightdirection = "up_alt";
|
||||||
|
_zheightchanged = true;
|
||||||
|
};
|
||||||
|
if (DZE_Z_alt) then {
|
||||||
|
DZE_Z_alt = false;
|
||||||
|
_zheightdirection = "down_alt";
|
||||||
|
_zheightchanged = true;
|
||||||
|
};
|
||||||
|
if (DZE_Q_ctrl) then {
|
||||||
|
DZE_Q_ctrl = false;
|
||||||
|
_zheightdirection = "up_ctrl";
|
||||||
|
_zheightchanged = true;
|
||||||
|
};
|
||||||
|
if (DZE_Z_ctrl) then {
|
||||||
|
DZE_Z_ctrl = false;
|
||||||
|
_zheightdirection = "down_ctrl";
|
||||||
|
_zheightchanged = true;
|
||||||
|
};
|
||||||
|
if (DZE_4) then {
|
||||||
|
_rotate = true;
|
||||||
|
DZE_4 = false;
|
||||||
|
_dir = -45;
|
||||||
|
};
|
||||||
|
if (DZE_6) then {
|
||||||
|
_rotate = true;
|
||||||
|
DZE_6 = false;
|
||||||
|
_dir = 45;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (DZE_F and _canDo) then {
|
||||||
|
if (helperDetach) then {
|
||||||
|
_objectHelperDir = getDir _objectHelper;
|
||||||
|
_objectHelper attachTo [player];
|
||||||
|
_objectHelper setDir _objectHelperDir-(getDir player);
|
||||||
|
helperDetach = false;
|
||||||
|
} else {
|
||||||
|
_objectHelperDir = getDir _objectHelper;
|
||||||
|
detach _objectHelper;
|
||||||
|
[_objectHelper] call FNC_GetSetPos;
|
||||||
|
_objectHelper setVelocity [0,0,0]; //fix sliding glitch
|
||||||
|
helperDetach = true;
|
||||||
|
};
|
||||||
|
DZE_F = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(_rotate) then {
|
||||||
|
if (helperDetach) then {
|
||||||
|
_objectHelperDir = getDir _objectHelper;
|
||||||
|
_objectHelper setDir _objectHelperDir+_dir;
|
||||||
|
[_objectHelper] call FNC_GetSetPos;
|
||||||
|
} else {
|
||||||
|
detach _objectHelper;
|
||||||
|
_objectHelperDir = getDir _objectHelper;
|
||||||
|
_objectHelper setDir _objectHelperDir+_dir;
|
||||||
|
[_objectHelper] call FNC_GetSetPos;
|
||||||
|
_objectHelperDir = getDir _objectHelper;
|
||||||
|
_objectHelper attachTo [player];
|
||||||
|
_objectHelper setDir _objectHelperDir-(getDir player);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
if(_zheightchanged) then {
|
||||||
|
if (!helperDetach) then {
|
||||||
|
detach _objectHelper;
|
||||||
|
_objectHelperDir = getDir _objectHelper;
|
||||||
|
};
|
||||||
|
|
||||||
|
_position = [_objectHelper] call FNC_GetPos;
|
||||||
|
|
||||||
|
if(_zheightdirection == "up") then {
|
||||||
|
_position set [2,((_position select 2)+0.1)];
|
||||||
|
_objHDiff = _objHDiff + 0.1;
|
||||||
|
};
|
||||||
|
if(_zheightdirection == "down") then {
|
||||||
|
_position set [2,((_position select 2)-0.1)];
|
||||||
|
_objHDiff = _objHDiff - 0.1;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(_zheightdirection == "up_alt") then {
|
||||||
|
_position set [2,((_position select 2)+1)];
|
||||||
|
_objHDiff = _objHDiff + 1;
|
||||||
|
};
|
||||||
|
if(_zheightdirection == "down_alt") then {
|
||||||
|
_position set [2,((_position select 2)-1)];
|
||||||
|
_objHDiff = _objHDiff - 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(_zheightdirection == "up_ctrl") then {
|
||||||
|
_position set [2,((_position select 2)+0.01)];
|
||||||
|
_objHDiff = _objHDiff + 0.01;
|
||||||
|
};
|
||||||
|
if(_zheightdirection == "down_ctrl") then {
|
||||||
|
_position set [2,((_position select 2)-0.01)];
|
||||||
|
_objHDiff = _objHDiff - 0.01;
|
||||||
|
};
|
||||||
|
|
||||||
|
if((_isAllowedUnderGround == 0) && ((_position select 2) < 0)) then {
|
||||||
|
_position set [2,0];
|
||||||
|
};
|
||||||
|
|
||||||
|
if (surfaceIsWater _position) then {
|
||||||
|
_objectHelper setPosASL _position;
|
||||||
|
} else {
|
||||||
|
_objectHelper setPosATL _position;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!helperDetach) then {
|
||||||
|
_objectHelper attachTo [player];
|
||||||
|
_objectHelper setDir _objectHelperDir-(getDir player);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
uiSleep 0.5;
|
||||||
|
|
||||||
|
_location2 = [player] call FNC_GetPos;
|
||||||
|
_objectHelperPos = [_objectHelper] call FNC_GetPos;
|
||||||
|
|
||||||
|
if(DZE_5) exitWith {
|
||||||
|
_isOk = false;
|
||||||
|
_position = [_object] call FNC_GetPos;
|
||||||
|
detach _object;
|
||||||
|
_dir = getDir _object;
|
||||||
|
deleteVehicle _object;
|
||||||
|
detach _objectHelper;
|
||||||
|
deleteVehicle _objectHelper;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(_location1 distance _location2 > 10) exitWith {
|
||||||
|
_isOk = false;
|
||||||
|
_cancel = true;
|
||||||
|
_reason = "You've moved to far away from where you started building (within 10 meters)";
|
||||||
|
detach _object;
|
||||||
|
deleteVehicle _object;
|
||||||
|
detach _objectHelper;
|
||||||
|
deleteVehicle _objectHelper;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(_location1 distance _objectHelperPos > 10) exitWith {
|
||||||
|
_isOk = false;
|
||||||
|
_cancel = true;
|
||||||
|
_reason = "Object is placed to far away from where you started building (within 10 meters)";
|
||||||
|
detach _object;
|
||||||
|
deleteVehicle _object;
|
||||||
|
detach _objectHelper;
|
||||||
|
deleteVehicle _objectHelper;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(abs(_objHDiff) > 10) exitWith {
|
||||||
|
_isOk = false;
|
||||||
|
_cancel = true;
|
||||||
|
_reason = "Cannot move up or down more than 10 meters";
|
||||||
|
detach _object;
|
||||||
|
deleteVehicle _object;
|
||||||
|
detach _objectHelper;
|
||||||
|
deleteVehicle _objectHelper;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (player getVariable["combattimeout", 0] >= time) exitWith {
|
||||||
|
_isOk = false;
|
||||||
|
_cancel = true;
|
||||||
|
_reason = (localize "str_epoch_player_43");
|
||||||
|
detach _object;
|
||||||
|
deleteVehicle _object;
|
||||||
|
detach _objectHelper;
|
||||||
|
deleteVehicle _objectHelper;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (DZE_cancelBuilding) exitWith {
|
||||||
|
_isOk = false;
|
||||||
|
_cancel = true;
|
||||||
|
_reason = "Cancelled building.";
|
||||||
|
detach _object;
|
||||||
|
deleteVehicle _object;
|
||||||
|
detach _objectHelper;
|
||||||
|
deleteVehicle _objectHelper;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
_isOk = true;
|
||||||
|
_proceed = false;
|
||||||
|
_counter = 0;
|
||||||
|
_location = [0,0,0];
|
||||||
|
|
||||||
|
//No building on roads unless toggled
|
||||||
|
if (!DZE_BuildOnRoads) then {
|
||||||
|
if (isOnRoad _position) then { _cancel = true; _reason = "Cannot build on a road."; };
|
||||||
|
};
|
||||||
|
|
||||||
|
// No building in trader zones
|
||||||
|
if(!canbuild) then { _cancel = true; _reason = "Cannot build in a city."; };
|
||||||
|
|
||||||
|
if(!_cancel) then {
|
||||||
|
|
||||||
|
_classname = _classnametmp;
|
||||||
|
|
||||||
|
// Start Build
|
||||||
|
_tmpbuilt = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"]; //create actual object that will be published to database
|
||||||
|
|
||||||
|
_tmpbuilt setdir _dir; //set direction inherited from passed args from control
|
||||||
|
|
||||||
|
// Get position based on object
|
||||||
|
_location = _position;
|
||||||
|
|
||||||
|
if((_isAllowedUnderGround == 0) && ((_location select 2) < 0)) then { //check Z axis if not allowed to build underground
|
||||||
|
_location set [2,0]; //reset Z axis to zero (above terrain)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (surfaceIsWater _location) then {
|
||||||
|
_tmpbuilt setPosASL _location;
|
||||||
|
_location = ASLtoATL _location; //Database uses ATL
|
||||||
|
} else {
|
||||||
|
_tmpbuilt setPosATL _location;
|
||||||
|
};
|
||||||
|
|
||||||
|
cutText [format[(localize "str_epoch_player_138"),_text], "PLAIN DOWN"];
|
||||||
|
|
||||||
|
_limit = 3; //times it takes to build by default
|
||||||
|
|
||||||
|
if (DZE_StaticConstructionCount > 0) then { //if count is manually overridden inside init.sqf, use that instead, else use limits configured in config files
|
||||||
|
_limit = DZE_StaticConstructionCount;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isNumber (configFile >> "CfgVehicles" >> _classname >> "constructioncount")) then {
|
||||||
|
_limit = getNumber(configFile >> "CfgVehicles" >> _classname >> "constructioncount");
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
while {_isOk} do { //publish phase
|
||||||
|
|
||||||
|
[10,10] call dayz_HungerThirst;
|
||||||
|
player playActionNow "Medic"; //animation
|
||||||
|
|
||||||
|
//alert zombies
|
||||||
|
_dis=20;
|
||||||
|
_sfx = "repair";
|
||||||
|
[player,_sfx,0,false,_dis] call dayz_zombieSpeak;
|
||||||
|
[player,_dis,true,(getPosATL player)] spawn player_alertZombies;
|
||||||
|
|
||||||
|
r_interrupt = false;
|
||||||
|
r_doLoop = true;
|
||||||
|
_started = false;
|
||||||
|
_finished = false;
|
||||||
|
|
||||||
|
while {r_doLoop} do { //while player is not interrupted, go trough animations
|
||||||
|
_animState = animationState player;
|
||||||
|
_isMedic = ["medic",_animState] call fnc_inString;
|
||||||
|
if (_isMedic) then {
|
||||||
|
_started = true;
|
||||||
|
};
|
||||||
|
if (_started && !_isMedic) then {
|
||||||
|
r_doLoop = false;
|
||||||
|
_finished = true;
|
||||||
|
};
|
||||||
|
if (r_interrupt || (player getVariable["combattimeout", 0] >= time)) then {
|
||||||
|
r_doLoop = false;
|
||||||
|
};
|
||||||
|
if (DZE_cancelBuilding) exitWith {
|
||||||
|
r_doLoop = false;
|
||||||
|
};
|
||||||
|
uiSleep 0.1;
|
||||||
|
};
|
||||||
|
r_doLoop = false;
|
||||||
|
|
||||||
|
|
||||||
|
if(!_finished) exitWith { //exit if interrupted
|
||||||
|
_isOk = false;
|
||||||
|
_proceed = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
if(_finished) then { //if animation finished, add to build count
|
||||||
|
_counter = _counter + 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
cutText [format[(localize "str_epoch_player_139"),_text, _counter,_limit], "PLAIN DOWN"]; //report how many steps are done out of total limit
|
||||||
|
|
||||||
|
if(_counter == _limit) exitWith { //if all steps done proceed with next step, otherwise cancel publish
|
||||||
|
_isOk = false;
|
||||||
|
_proceed = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_proceed) then {
|
||||||
|
|
||||||
|
_num_removed = ([player,DZE_buildItem] call BIS_fnc_invRemove); //remove item's magazine from inventory
|
||||||
|
if(_num_removed == 1) then {
|
||||||
|
|
||||||
|
cutText [format[localize "str_build_01",_text], "PLAIN DOWN"];
|
||||||
|
|
||||||
|
if (_isPole) then { //if item was a plotpole, build a visual radius around it
|
||||||
|
[] spawn player_plotPreview;
|
||||||
|
};
|
||||||
|
|
||||||
|
_tmpbuilt setVariable ["OEMPos",_location,true]; //store original location as a variable
|
||||||
|
|
||||||
|
if(_lockable > 1) then { //if item has code lock on it
|
||||||
|
|
||||||
|
_combinationDisplay = ""; //define new display
|
||||||
|
|
||||||
|
switch (_lockable) do { //generate random combinations depending on item type
|
||||||
|
|
||||||
|
case 2: { // 2 lockbox
|
||||||
|
_combination_1 = (floor(random 3)) + 100; // 100=red,101=green,102=blue
|
||||||
|
_combination_2 = floor(random 10);
|
||||||
|
_combination_3 = floor(random 10);
|
||||||
|
_combination = format["%1%2%3",_combination_1,_combination_2,_combination_3];
|
||||||
|
dayz_combination = _combination;
|
||||||
|
if (_combination_1 == 100) then {
|
||||||
|
_combination_1_Display = "Red";
|
||||||
|
};
|
||||||
|
if (_combination_1 == 101) then {
|
||||||
|
_combination_1_Display = "Green";
|
||||||
|
};
|
||||||
|
if (_combination_1 == 102) then {
|
||||||
|
_combination_1_Display = "Blue";
|
||||||
|
};
|
||||||
|
_combinationDisplay = format["%1%2%3",_combination_1_Display,_combination_2,_combination_3];
|
||||||
|
};
|
||||||
|
|
||||||
|
case 3: { // 3 combolock
|
||||||
|
_combination_1 = floor(random 10);
|
||||||
|
_combination_2 = floor(random 10);
|
||||||
|
_combination_3 = floor(random 10);
|
||||||
|
_combination = format["%1%2%3",_combination_1,_combination_2,_combination_3];
|
||||||
|
dayz_combination = _combination;
|
||||||
|
_combinationDisplay = _combination;
|
||||||
|
};
|
||||||
|
|
||||||
|
case 4: { // 4 safe
|
||||||
|
_combination_1 = floor(random 10);
|
||||||
|
_combination_2 = floor(random 10);
|
||||||
|
_combination_3 = floor(random 10);
|
||||||
|
_combination_4 = floor(random 10);
|
||||||
|
_combination = format["%1%2%3%4",_combination_1,_combination_2,_combination_3,_combination_4];
|
||||||
|
dayz_combination = _combination;
|
||||||
|
_combinationDisplay = _combination;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
_tmpbuilt setVariable ["CharacterID",_combination,true]; //set combination as a character ID
|
||||||
|
|
||||||
|
//call publish precompiled function with given args and send public variable to server to save item to database
|
||||||
|
PVDZE_obj_Publish = [_combination,_tmpbuilt,[_dir,_location],_classname];
|
||||||
|
publicVariableServer "PVDZE_obj_Publish";
|
||||||
|
|
||||||
|
cutText [format[(localize "str_epoch_player_140"),_combinationDisplay,_text], "PLAIN DOWN", 5]; //display new combination
|
||||||
|
systemChat format [(localize "str_epoch_player_140"),_combinationDisplay,_text];
|
||||||
|
|
||||||
|
} else { //if not lockable item
|
||||||
|
_tmpbuilt setVariable ["CharacterID",dayz_characterID,true];
|
||||||
|
|
||||||
|
// fire?
|
||||||
|
if(_tmpbuilt isKindOf "Land_Fire_DZ") then { //if campfire, then spawn, but do not publish to database
|
||||||
|
_tmpbuilt spawn player_fireMonitor;
|
||||||
|
} else {
|
||||||
|
PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location],_classname];
|
||||||
|
publicVariableServer "PVDZE_obj_Publish";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} else { //if magazine was not removed, cancel publish
|
||||||
|
deleteVehicle _tmpbuilt;
|
||||||
|
cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
|
||||||
|
};
|
||||||
|
|
||||||
|
} else { //if player was interrupted, cancel publish and stop build animations
|
||||||
|
r_interrupt = false;
|
||||||
|
if (vehicle player == player) then {
|
||||||
|
[objNull, player, rSwitchMove,""] call RE;
|
||||||
|
player playActionNow "stop";
|
||||||
|
};
|
||||||
|
|
||||||
|
deleteVehicle _tmpbuilt;
|
||||||
|
|
||||||
|
cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
|
||||||
|
};
|
||||||
|
|
||||||
|
} else { //cancel build if passed _cancel arg was true or building on roads/trader city
|
||||||
|
cutText [format[(localize "str_epoch_player_47"),_text,_reason], "PLAIN DOWN"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
DZE_ActionInProgress = false;
|
||||||
@@ -117,6 +117,10 @@ _isLandFireDZ = (_classname == "Land_Fire_DZ");
|
|||||||
|
|
||||||
_distance = DZE_PlotPole select 0;
|
_distance = DZE_PlotPole select 0;
|
||||||
_needText = localize "str_epoch_player_246";
|
_needText = localize "str_epoch_player_246";
|
||||||
|
_canBuildOnPlot = false;
|
||||||
|
_nearestPole = objNull;
|
||||||
|
_ownerID = 0;
|
||||||
|
_friendlies = [];
|
||||||
|
|
||||||
if(_isPole) then {
|
if(_isPole) then {
|
||||||
_distance = DZE_PlotPole select 1;
|
_distance = DZE_PlotPole select 1;
|
||||||
@@ -134,7 +138,7 @@ _findNearestPole = [];
|
|||||||
|
|
||||||
_IsNearPlot = count (_findNearestPole);
|
_IsNearPlot = count (_findNearestPole);
|
||||||
|
|
||||||
// If item is plot pole && another one exists within 45m
|
// If item is plot pole and another one exists within 45m
|
||||||
if(_isPole && _IsNearPlot > 0) exitWith { DZE_ActionInProgress = false; cutText [(format [localize "str_epoch_player_44",_distance]), "PLAIN DOWN"]; };
|
if(_isPole && _IsNearPlot > 0) exitWith { DZE_ActionInProgress = false; cutText [(format [localize "str_epoch_player_44",_distance]), "PLAIN DOWN"]; };
|
||||||
|
|
||||||
if(_IsNearPlot == 0) then {
|
if(_IsNearPlot == 0) then {
|
||||||
@@ -179,7 +183,7 @@ if(!_canBuildOnPlot) exitWith { DZE_ActionInProgress = false; cutText [format[(
|
|||||||
|
|
||||||
_buildables = DZE_maintainClasses + DZE_LockableStorage;
|
_buildables = DZE_maintainClasses + DZE_LockableStorage;
|
||||||
_buildables set [count _buildables,"TentStorage"];
|
_buildables set [count _buildables,"TentStorage"];
|
||||||
_center = if (isNil "_nearestPole") then {_pos} else {_nearestPole};
|
_center = if (isNull _nearestPole) then {_pos} else {_nearestPole};
|
||||||
if ((count (nearestObjects [_center,_buildables,_distance])) >= DZE_BuildingLimit) exitWith {DZE_ActionInProgress = false;cutText [(format [localize "str_epoch_player_41",_distance]),"PLAIN DOWN"];};
|
if ((count (nearestObjects [_center,_buildables,_distance])) >= DZE_BuildingLimit) exitWith {DZE_ActionInProgress = false;cutText [(format [localize "str_epoch_player_41",_distance]),"PLAIN DOWN"];};
|
||||||
|
|
||||||
_missing = "";
|
_missing = "";
|
||||||
@@ -197,9 +201,7 @@ if (_hasrequireditem) then {
|
|||||||
|
|
||||||
_location = [0,0,0];
|
_location = [0,0,0];
|
||||||
_isOk = true;
|
_isOk = true;
|
||||||
|
_location1 = [player] call FNC_GetPos; // get inital players position
|
||||||
// get inital players position
|
|
||||||
_location1 = getPosATL player;
|
|
||||||
_dir = getDir player;
|
_dir = getDir player;
|
||||||
|
|
||||||
// if ghost preview available use that instead
|
// if ghost preview available use that instead
|
||||||
@@ -524,7 +526,7 @@ if (_hasrequireditem) then {
|
|||||||
publicVariableServer "PVDZE_obj_Publish";
|
publicVariableServer "PVDZE_obj_Publish";
|
||||||
|
|
||||||
cutText [format[(localize "str_epoch_player_140"),_combinationDisplay,_text], "PLAIN DOWN", 5];
|
cutText [format[(localize "str_epoch_player_140"),_combinationDisplay,_text], "PLAIN DOWN", 5];
|
||||||
systemChat format [(localize "str_epoch_player_140"),_combinationDisplay,_text];
|
systemChat format [(localize "str_epoch_player_140"),_combinationDisplay,_text];
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
_tmpbuilt setVariable ["CharacterID",dayz_characterID,true];
|
_tmpbuilt setVariable ["CharacterID",dayz_characterID,true];
|
||||||
@@ -559,4 +561,4 @@ if (_hasrequireditem) then {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
DZE_ActionInProgress = false;
|
DZE_ActionInProgress = false;
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
if(!DZE_ActionInProgress) exitWith {};
|
|
||||||
//Check for build requirements like tools and if item is in magazines (check args to disable checks)
|
|
||||||
private ["_passArray","_missing","_hasrequireditem","_require","_hastoolweapon","_hasbuilditem","_checkMag","_checkTools","_reason"];
|
|
||||||
|
|
||||||
_require = _this select 0; //grab passed array of required items from item config function
|
|
||||||
_text = _this select 1; //grab text string passed from config
|
|
||||||
_checkMag = _this select 2; //check if item was built from magazine used in config file. Default is true. Set to false if building item from custom script
|
|
||||||
_checkTools = _this select 3; //same as above, default is true, set to false if you do not need item requirements.
|
|
||||||
|
|
||||||
_missing = "";
|
|
||||||
_hasrequireditem = true;
|
|
||||||
_reason = "ok";
|
|
||||||
_passArray = [];
|
|
||||||
|
|
||||||
{
|
|
||||||
_hastoolweapon = _x in weapons player; //check each required item against weapons array on player
|
|
||||||
if(!_hastoolweapon) exitWith { //if tool was not found, get missing tool's name from config
|
|
||||||
_hasrequireditem = false; _missing = getText (configFile >> "cfgWeapons" >> _x >> "displayName");
|
|
||||||
};
|
|
||||||
} count _require; //count each item in requirements array
|
|
||||||
|
|
||||||
_hasbuilditem = DZE_buildItem in magazines player;
|
|
||||||
|
|
||||||
_passArray = [_hasrequireditem,_reason];
|
|
||||||
|
|
||||||
if (_checkMag) then { //passed argument
|
|
||||||
if (!_hasbuilditem) exitWith { //End script if magazine was not found
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
cutText [format[(localize "str_player_31"),_text,"build"] , "PLAIN DOWN"];
|
|
||||||
_reason = "missing item";
|
|
||||||
_passArray
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_checkTools) then { //passed argument
|
|
||||||
if (!_hasrequireditem) exitWith { //End script if required item/tool was not found
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
cutText [format[(localize "str_epoch_player_137"),_missing] , "PLAIN DOWN"];
|
|
||||||
_reason = "missing tools";
|
|
||||||
_passArray
|
|
||||||
};
|
|
||||||
};
|
|
||||||
_passArray //[bool,string]
|
|
||||||
|
|
||||||
@@ -1,216 +0,0 @@
|
|||||||
private ["_canDo","_passArray","_objHDiff","_isOk","_zheightchanged","_zheightdirection","_rotate","_dir","_object","_position","_isAllowedUnderGround","_location1","_location2","_cancel","_reason","_lastDir","_objectHelper","_objectHelperDir","_objectHelperPos"];
|
|
||||||
|
|
||||||
_object = _this select 0;
|
|
||||||
_isAllowedUnderGround = _this select 1;
|
|
||||||
_location1 = _this select 2;
|
|
||||||
_objectHelper = _this select 3;
|
|
||||||
|
|
||||||
_passArray = [];
|
|
||||||
|
|
||||||
_objHDiff = 0;
|
|
||||||
_isOk = true;
|
|
||||||
_cancel = false;
|
|
||||||
_reason = "";
|
|
||||||
_dir = getDir player; //required to pass direction when building
|
|
||||||
helperDetach = false;
|
|
||||||
_canDo = (!r_drag_sqf and !r_player_unconscious);
|
|
||||||
_position = [_objectHelper] call FNC_GetPos;
|
|
||||||
|
|
||||||
while {_isOk} do {
|
|
||||||
|
|
||||||
_zheightchanged = false;
|
|
||||||
_zheightdirection = "";
|
|
||||||
_rotate = false;
|
|
||||||
|
|
||||||
if (DZE_Q) then {
|
|
||||||
DZE_Q = false;
|
|
||||||
_zheightdirection = "up";
|
|
||||||
_zheightchanged = true;
|
|
||||||
};
|
|
||||||
if (DZE_Z) then {
|
|
||||||
DZE_Z = false;
|
|
||||||
_zheightdirection = "down";
|
|
||||||
_zheightchanged = true;
|
|
||||||
};
|
|
||||||
if (DZE_Q_alt) then {
|
|
||||||
DZE_Q_alt = false;
|
|
||||||
_zheightdirection = "up_alt";
|
|
||||||
_zheightchanged = true;
|
|
||||||
};
|
|
||||||
if (DZE_Z_alt) then {
|
|
||||||
DZE_Z_alt = false;
|
|
||||||
_zheightdirection = "down_alt";
|
|
||||||
_zheightchanged = true;
|
|
||||||
};
|
|
||||||
if (DZE_Q_ctrl) then {
|
|
||||||
DZE_Q_ctrl = false;
|
|
||||||
_zheightdirection = "up_ctrl";
|
|
||||||
_zheightchanged = true;
|
|
||||||
};
|
|
||||||
if (DZE_Z_ctrl) then {
|
|
||||||
DZE_Z_ctrl = false;
|
|
||||||
_zheightdirection = "down_ctrl";
|
|
||||||
_zheightchanged = true;
|
|
||||||
};
|
|
||||||
if (DZE_4) then {
|
|
||||||
_rotate = true;
|
|
||||||
DZE_4 = false;
|
|
||||||
_dir = -45;
|
|
||||||
};
|
|
||||||
if (DZE_6) then {
|
|
||||||
_rotate = true;
|
|
||||||
DZE_6 = false;
|
|
||||||
_dir = 45;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (DZE_F and _canDo) then {
|
|
||||||
if (helperDetach) then {
|
|
||||||
_objectHelperDir = getDir _objectHelper;
|
|
||||||
_objectHelper attachTo [player];
|
|
||||||
_objectHelper setDir _objectHelperDir-(getDir player);
|
|
||||||
helperDetach = false;
|
|
||||||
} else {
|
|
||||||
_objectHelperDir = getDir _objectHelper;
|
|
||||||
detach _objectHelper;
|
|
||||||
[_objectHelper] call FNC_GetSetPos;
|
|
||||||
_objectHelper setVelocity [0,0,0]; //fix sliding glitch
|
|
||||||
helperDetach = true;
|
|
||||||
};
|
|
||||||
DZE_F = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(_rotate) then {
|
|
||||||
if (helperDetach) then {
|
|
||||||
_objectHelperDir = getDir _objectHelper;
|
|
||||||
_objectHelper setDir _objectHelperDir+_dir;
|
|
||||||
[_objectHelper] call FNC_GetSetPos;
|
|
||||||
} else {
|
|
||||||
detach _objectHelper;
|
|
||||||
_objectHelperDir = getDir _objectHelper;
|
|
||||||
_objectHelper setDir _objectHelperDir+_dir;
|
|
||||||
[_objectHelper] call FNC_GetSetPos;
|
|
||||||
_objectHelperDir = getDir _objectHelper;
|
|
||||||
_objectHelper attachTo [player];
|
|
||||||
_objectHelper setDir _objectHelperDir-(getDir player);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
if(_zheightchanged) then {
|
|
||||||
if (!helperDetach) then {
|
|
||||||
detach _objectHelper;
|
|
||||||
_objectHelperDir = getDir _objectHelper;
|
|
||||||
};
|
|
||||||
|
|
||||||
_position = [_objectHelper] call FNC_GetPos;
|
|
||||||
|
|
||||||
if(_zheightdirection == "up") then {
|
|
||||||
_position set [2,((_position select 2)+0.1)];
|
|
||||||
_objHDiff = _objHDiff + 0.1;
|
|
||||||
};
|
|
||||||
if(_zheightdirection == "down") then {
|
|
||||||
_position set [2,((_position select 2)-0.1)];
|
|
||||||
_objHDiff = _objHDiff - 0.1;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(_zheightdirection == "up_alt") then {
|
|
||||||
_position set [2,((_position select 2)+1)];
|
|
||||||
_objHDiff = _objHDiff + 1;
|
|
||||||
};
|
|
||||||
if(_zheightdirection == "down_alt") then {
|
|
||||||
_position set [2,((_position select 2)-1)];
|
|
||||||
_objHDiff = _objHDiff - 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(_zheightdirection == "up_ctrl") then {
|
|
||||||
_position set [2,((_position select 2)+0.01)];
|
|
||||||
_objHDiff = _objHDiff + 0.01;
|
|
||||||
};
|
|
||||||
if(_zheightdirection == "down_ctrl") then {
|
|
||||||
_position set [2,((_position select 2)-0.01)];
|
|
||||||
_objHDiff = _objHDiff - 0.01;
|
|
||||||
};
|
|
||||||
|
|
||||||
if((_isAllowedUnderGround == 0) && ((_position select 2) < 0)) then {
|
|
||||||
_position set [2,0];
|
|
||||||
};
|
|
||||||
|
|
||||||
if (surfaceIsWater _position) then {
|
|
||||||
_objectHelper setPosASL _position;
|
|
||||||
} else {
|
|
||||||
_objectHelper setPosATL _position;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!helperDetach) then {
|
|
||||||
_objectHelper attachTo [player];
|
|
||||||
_objectHelper setDir _objectHelperDir-(getDir player);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
uiSleep 0.5;
|
|
||||||
|
|
||||||
_location2 = [player] call FNC_GetPos;
|
|
||||||
_objectHelperPos = [_objectHelper] call FNC_GetPos;
|
|
||||||
|
|
||||||
if(DZE_5) exitWith {
|
|
||||||
_isOk = false;
|
|
||||||
_position = [_object] call FNC_GetPos;
|
|
||||||
detach _object;
|
|
||||||
_dir = getDir _object;
|
|
||||||
deleteVehicle _object;
|
|
||||||
detach _objectHelper;
|
|
||||||
deleteVehicle _objectHelper;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(_location1 distance _location2 > 10) exitWith {
|
|
||||||
_isOk = false;
|
|
||||||
_cancel = true;
|
|
||||||
_reason = "You've moved to far away from where you started building (within 10 meters)";
|
|
||||||
detach _object;
|
|
||||||
deleteVehicle _object;
|
|
||||||
detach _objectHelper;
|
|
||||||
deleteVehicle _objectHelper;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(_location1 distance _objectHelperPos > 10) exitWith {
|
|
||||||
_isOk = false;
|
|
||||||
_cancel = true;
|
|
||||||
_reason = "Object is placed to far away from where you started building (within 10 meters)";
|
|
||||||
detach _object;
|
|
||||||
deleteVehicle _object;
|
|
||||||
detach _objectHelper;
|
|
||||||
deleteVehicle _objectHelper;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(abs(_objHDiff) > 10) exitWith {
|
|
||||||
_isOk = false;
|
|
||||||
_cancel = true;
|
|
||||||
_reason = "Cannot move up or down more than 10 meters";
|
|
||||||
detach _object;
|
|
||||||
deleteVehicle _object;
|
|
||||||
detach _objectHelper;
|
|
||||||
deleteVehicle _objectHelper;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (player getVariable["combattimeout", 0] >= time) exitWith {
|
|
||||||
_isOk = false;
|
|
||||||
_cancel = true;
|
|
||||||
_reason = (localize "str_epoch_player_43");
|
|
||||||
detach _object;
|
|
||||||
deleteVehicle _object;
|
|
||||||
detach _objectHelper;
|
|
||||||
deleteVehicle _objectHelper;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (DZE_cancelBuilding) exitWith {
|
|
||||||
_isOk = false;
|
|
||||||
_cancel = true;
|
|
||||||
_reason = "Cancelled building.";
|
|
||||||
detach _object;
|
|
||||||
deleteVehicle _object;
|
|
||||||
detach _objectHelper;
|
|
||||||
deleteVehicle _objectHelper;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
_passArray = [_cancel,_reason,_position,_dir];
|
|
||||||
_passArray //[bool,string,array,int]
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
// disallow building if too many objects are found within 30m (by default)
|
|
||||||
private ["_cnt","_pos"];
|
|
||||||
|
|
||||||
_pos = [player] call FNC_GetPos;
|
|
||||||
_cnt = count (_pos nearObjects ["All",DZE_checkNearbyRadius]);
|
|
||||||
if (_cnt >= DZE_BuildingLimit) exitWith { //end script if too many objects nearby
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
cutText [(format [localize "str_epoch_player_41", DZE_PlotPole select 0]), "PLAIN DOWN"];
|
|
||||||
};
|
|
||||||
_cnt //returns amount of total objects found nearby
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
//create an object for default build system style
|
|
||||||
private ["_passArray","_classname","_enableGhost","_ghost","_location1","_dir","_object","_objectHelper","_helperColor"];
|
|
||||||
|
|
||||||
_classname = _this select 0;
|
|
||||||
_ghost = _this select 1;
|
|
||||||
_offset = _this select 2;
|
|
||||||
_enableGhost = _this select 3; //pass false trough args if not using ghost preview
|
|
||||||
|
|
||||||
_passArray = [];
|
|
||||||
_objectHelper = objNull;
|
|
||||||
|
|
||||||
// get inital players position
|
|
||||||
_location1 = [player] call FNC_GetPos;
|
|
||||||
|
|
||||||
// if enabled, use ghost preview where available
|
|
||||||
if (_enableGhost) then {
|
|
||||||
if (_ghost != "") then {
|
|
||||||
_classname = _ghost;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
_object = createVehicle [_classname, [0,0,0], [], 0, "CAN_COLLIDE"]; //object preview, not an actual object that will be built
|
|
||||||
|
|
||||||
_objectHelper = "Sign_sphere10cm_EP1" createVehicle [0,0,0];
|
|
||||||
_helperColor = "#(argb,8,8,3)color(0,0,0,0,ca)";
|
|
||||||
_objectHelper setobjecttexture [0,_helperColor];
|
|
||||||
_objectHelper attachTo [player,_offset];
|
|
||||||
_object attachTo [_objectHelper,[0,0,0]];
|
|
||||||
|
|
||||||
|
|
||||||
if (isClass (configFile >> "SnapBuilding" >> _classname)) then {
|
|
||||||
["","","",["Init",_object,_classname,_objectHelper]] spawn snap_build;
|
|
||||||
};
|
|
||||||
|
|
||||||
_passArray = [_location1,_object,_objectHelper];
|
|
||||||
_passArray //[array,obj,array]
|
|
||||||
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
if(!DZE_ActionInProgress) exitWith {};
|
|
||||||
//Build an array of various variables gathered about build object from config files, only applies to legit buildable objects
|
|
||||||
private ["_passArray","_classname","_classnametmp","_require","_text","_ghost","_lockable","_requireplot","_isAllowedUnderGround","_offset","_isPole","_isLandFireDZ"];
|
|
||||||
|
|
||||||
_passArray = [];
|
|
||||||
|
|
||||||
_classname = getText (configFile >> "CfgMagazines" >> DZE_buildItem >> "ItemActions" >> "Build" >> "create");
|
|
||||||
_classnametmp = _classname;
|
|
||||||
_require = getArray (configFile >> "cfgMagazines" >> DZE_buildItem >> "ItemActions" >> "Build" >> "require");
|
|
||||||
_text = getText (configFile >> "CfgVehicles" >> _classname >> "displayName");
|
|
||||||
_ghost = getText (configFile >> "CfgVehicles" >> _classname >> "ghostpreview");
|
|
||||||
|
|
||||||
_lockable = 0; //default define if lockable not found in config file below
|
|
||||||
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "lockable")) then { //find out if item is lockable object
|
|
||||||
_lockable = getNumber(configFile >> "CfgVehicles" >> _classname >> "lockable"); // 2=lockbox, 3=combolock, 4=safe
|
|
||||||
};
|
|
||||||
|
|
||||||
_requireplot = DZE_requireplot; //check for plotpole requirements defined in init.sqf
|
|
||||||
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "requireplot")) then {
|
|
||||||
_requireplot = getNumber(configFile >> "CfgVehicles" >> _classname >> "requireplot");
|
|
||||||
};
|
|
||||||
|
|
||||||
_isAllowedUnderGround = 1; //check if allowed to build under terrain
|
|
||||||
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "nounderground")) then {
|
|
||||||
_isAllowedUnderGround = getNumber(configFile >> "CfgVehicles" >> _classname >> "nounderground");
|
|
||||||
};
|
|
||||||
|
|
||||||
_offset = getArray (configFile >> "CfgVehicles" >> _classname >> "offset"); //check default distance offset, define if does not exist
|
|
||||||
if((count _offset) <= 0) then {
|
|
||||||
_offset = [0,1.5,0];
|
|
||||||
};
|
|
||||||
|
|
||||||
_isPole = (_classname == "Plastic_Pole_EP1_DZ"); //check if item is plotpole
|
|
||||||
_isLandFireDZ = (_classname == "Land_Fire_DZ"); //check if item is campfire
|
|
||||||
|
|
||||||
_passArray = [_classname,_classnametmp,_require,_text,_ghost,_lockable,_requireplot,_isAllowedUnderGround,_offset,_isPole,_isLandFireDZ]; //create new array to pass to caller
|
|
||||||
|
|
||||||
_passArray //[string,string,array,string,string,int,int,int,array,bool,bool]
|
|
||||||
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
if(!DZE_ActionInProgress) exitWith {};
|
|
||||||
//disallow building if required items (defined in config) are not found nearby
|
|
||||||
private ["_abort","_reason","_distance","_needNear","_isNear","_pos"];
|
|
||||||
|
|
||||||
_abort = false; //do not abort by default
|
|
||||||
_reason = ""; // define to avoid RPT errors
|
|
||||||
_needNear = getArray (configFile >> "CfgMagazines" >> DZE_buildItem >> "ItemActions" >> "Build" >> "neednearby");
|
|
||||||
_pos = [player] call FNC_GetPos;
|
|
||||||
{
|
|
||||||
switch(_x) do{
|
|
||||||
case "fire":
|
|
||||||
{
|
|
||||||
_distance = 3;
|
|
||||||
_isNear = {inflamed _x} count (_pos nearObjects _distance);
|
|
||||||
if(_isNear == 0) then {
|
|
||||||
_abort = true;
|
|
||||||
_reason = "fire";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
case "workshop":
|
|
||||||
{
|
|
||||||
_distance = 3;
|
|
||||||
_isNear = count (nearestObjects [_pos, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]);
|
|
||||||
if(_isNear == 0) then {
|
|
||||||
_abort = true;
|
|
||||||
_reason = "workshop";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
case "fueltank":
|
|
||||||
{
|
|
||||||
_distance = 30;
|
|
||||||
_isNear = count (nearestObjects [_pos, dayz_fuelsources, _distance]);
|
|
||||||
if(_isNear == 0) then {
|
|
||||||
_abort = true;
|
|
||||||
_reason = "fuel tank";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
} forEach _needNear;
|
|
||||||
|
|
||||||
if (_abort) exitWith {
|
|
||||||
cutText [format[(localize "str_epoch_player_135"),_reason,_distance], "PLAIN DOWN"];
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
};
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
if(!DZE_ActionInProgress) exitWith {};
|
|
||||||
//Check if nearby plotpoles exists
|
|
||||||
private ["_passArray","_isPole","_needText","_distance","_findNearestPoles","_findNearestPole","_IsNearPlot","_requireplot","_isLandFireDZ","_canBuildOnPlot","_nearestPole","_ownerID","_friendlies"];
|
|
||||||
|
|
||||||
//defines
|
|
||||||
_isPole = _this select 0;
|
|
||||||
_requireplot = _this select 1;
|
|
||||||
_isLandFireDZ = _this select 2;
|
|
||||||
|
|
||||||
_needText = localize "str_epoch_player_246"; //text for when requirements not met
|
|
||||||
_canBuildOnPlot = false;
|
|
||||||
_nearestPole = objNull;
|
|
||||||
_ownerID = 0;
|
|
||||||
_friendlies = [];
|
|
||||||
|
|
||||||
if(_isPole) then { //check if object is plotpole and adjust distance accordingly
|
|
||||||
_distance = DZE_PlotPole select 1;
|
|
||||||
} else {
|
|
||||||
_distance = DZE_PlotPole select 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// check for near plotpoles
|
|
||||||
_findNearestPoles = nearestObjects [(vehicle player), ["Plastic_Pole_EP1_DZ"], _distance]; //create an array of nearby objects that are plotpoles, nearest will always be first in array
|
|
||||||
_findNearestPole = []; //must define an empty array to avoid problems
|
|
||||||
|
|
||||||
{
|
|
||||||
if (alive _x) then { //only look for non-destroyed plotpoles
|
|
||||||
_findNearestPole set [(count _findNearestPole),_x]; //build an array of live plotpoles found nearby
|
|
||||||
};
|
|
||||||
} count _findNearestPoles; //count each item in previously created array of nearby plotpoles
|
|
||||||
|
|
||||||
_IsNearPlot = count (_findNearestPole); //count our new array of non-destroyed plotpoles. Empty array will return 0
|
|
||||||
|
|
||||||
if(_IsNearPlot == 0) then { //No live plotpoles were found nearby
|
|
||||||
// Allow building of plot
|
|
||||||
if(_requireplot == 0 || _isLandFireDZ) then {
|
|
||||||
_canBuildOnPlot = true;
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
// Since there are plots nearby we check for ownership && then for friend status
|
|
||||||
// check nearby plots ownership && then for friend status
|
|
||||||
_nearestPole = _findNearestPole select 0; //nearest is always first in array when using nearestObjects check
|
|
||||||
|
|
||||||
// Find owner
|
|
||||||
_ownerID = _nearestPole getVariable ["CharacterID","0"];
|
|
||||||
|
|
||||||
// check if friendly to owner
|
|
||||||
if(dayz_characterID == _ownerID) then { //Keep ownership
|
|
||||||
// owner can build anything within his plot except other plots
|
|
||||||
if(!_isPole) then {
|
|
||||||
_canBuildOnPlot = true;
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
// disallow building plot
|
|
||||||
if(!_isPole) then {
|
|
||||||
_friendlies = player getVariable ["friendlyTo",[]];
|
|
||||||
// check if friendly to owner
|
|
||||||
if(_ownerID in _friendlies) then {
|
|
||||||
_canBuildOnPlot = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
_passArray = [_IsNearPlot,_nearestPole,_ownerID,_friendlies]; //create new array and pass it to caller
|
|
||||||
|
|
||||||
// End script if item is plot pole and another one exists within defined radius
|
|
||||||
if(_isPole && _IsNearPlot > 0) exitWith {
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
cutText [(format [localize "str_epoch_player_44", DZE_PlotPole select 1]) , "PLAIN DOWN"];
|
|
||||||
_passArray
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!_canBuildOnPlot) exitWith { //end script if requirements were not met
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
cutText [format[(localize "STR_EPOCH_PLAYER_135"),_needText,_distance] , "PLAIN DOWN"];
|
|
||||||
_passArray
|
|
||||||
};
|
|
||||||
_passArray //[int,Obj,int,array]
|
|
||||||
@@ -1,224 +0,0 @@
|
|||||||
private ["_passArray","_cancel","_position","_reason","_classnametmp","_classname","_tmpbuilt","_dir","_location","_text","_limit","_isOk","_proceed","_counter","_dis","_sfx","_started","_finished","_animState","_isMedic","_num_removed","_lockable","_combinationDisplay","_combination_1","_combination_2","_combination_3","_combination_4","_combination","_combination_1_Display"];
|
|
||||||
|
|
||||||
//defines
|
|
||||||
_cancel = _this select 0;
|
|
||||||
_position = _this select 1;
|
|
||||||
_classnametmp = _this select 2;
|
|
||||||
_isAllowedUnderGround = _this select 3;
|
|
||||||
_text = _this select 4;
|
|
||||||
_isPole = _this select 5;
|
|
||||||
_lockable = _this select 6;
|
|
||||||
_dir = _this select 7;
|
|
||||||
_reason = _this select 8;
|
|
||||||
|
|
||||||
_passArray = [];
|
|
||||||
|
|
||||||
_isOk = true;
|
|
||||||
_proceed = false;
|
|
||||||
_counter = 0;
|
|
||||||
_location = [0,0,0];
|
|
||||||
|
|
||||||
//No building on roads unless toggled
|
|
||||||
if (!DZE_BuildOnRoads) then {
|
|
||||||
if (isOnRoad _position) then {
|
|
||||||
_cancel = true;
|
|
||||||
_reason = "Cannot build on a road.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// No building in trader zones
|
|
||||||
if(!canbuild) then {
|
|
||||||
_cancel = true;
|
|
||||||
_reason = "Cannot build in a city.";
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!_cancel) then {
|
|
||||||
|
|
||||||
_classname = _classnametmp;
|
|
||||||
|
|
||||||
// Start Build
|
|
||||||
_tmpbuilt = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"]; //create actual object that will be published to database
|
|
||||||
|
|
||||||
_tmpbuilt setdir _dir; //set direction inherited from passed args from control
|
|
||||||
|
|
||||||
// Get position based on object
|
|
||||||
_location = _position;
|
|
||||||
|
|
||||||
if((_isAllowedUnderGround == 0) && ((_location select 2) < 0)) then { //check Z axis if not allowed to build underground
|
|
||||||
_location set [2,0]; //reset Z axis to zero (above terrain)
|
|
||||||
};
|
|
||||||
|
|
||||||
if (surfaceIsWater _location) then {
|
|
||||||
_tmpbuilt setPosASL _location;
|
|
||||||
_location = ASLtoATL _location; //Database uses ATL
|
|
||||||
} else {
|
|
||||||
_tmpbuilt setPosATL _location;
|
|
||||||
};
|
|
||||||
|
|
||||||
cutText [format[(localize "str_epoch_player_138"),_text], "PLAIN DOWN"];
|
|
||||||
|
|
||||||
_limit = 3; //times it takes to build by default
|
|
||||||
|
|
||||||
if (DZE_StaticConstructionCount > 0) then { //if count is manually overridden inside init.sqf, use that instead, else use limits configured in config files
|
|
||||||
_limit = DZE_StaticConstructionCount;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (isNumber (configFile >> "CfgVehicles" >> _classname >> "constructioncount")) then {
|
|
||||||
_limit = getNumber(configFile >> "CfgVehicles" >> _classname >> "constructioncount");
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
while {_isOk} do { //publish phase
|
|
||||||
|
|
||||||
[10,10] call dayz_HungerThirst;
|
|
||||||
player playActionNow "Medic"; //animation
|
|
||||||
|
|
||||||
//alert zombies
|
|
||||||
_dis=20;
|
|
||||||
_sfx = "repair";
|
|
||||||
[player,_sfx,0,false,_dis] call dayz_zombieSpeak;
|
|
||||||
[player,_dis,true,(getPosATL player)] spawn player_alertZombies;
|
|
||||||
|
|
||||||
r_interrupt = false;
|
|
||||||
r_doLoop = true;
|
|
||||||
_started = false;
|
|
||||||
_finished = false;
|
|
||||||
|
|
||||||
while {r_doLoop} do { //while player is not interrupted, go trough animations
|
|
||||||
_animState = animationState player;
|
|
||||||
_isMedic = ["medic",_animState] call fnc_inString;
|
|
||||||
if (_isMedic) then {
|
|
||||||
_started = true;
|
|
||||||
};
|
|
||||||
if (_started && !_isMedic) then {
|
|
||||||
r_doLoop = false;
|
|
||||||
_finished = true;
|
|
||||||
};
|
|
||||||
if (r_interrupt || (player getVariable["combattimeout", 0] >= time)) then {
|
|
||||||
r_doLoop = false;
|
|
||||||
};
|
|
||||||
if (DZE_cancelBuilding) exitWith {
|
|
||||||
r_doLoop = false;
|
|
||||||
};
|
|
||||||
uiSleep 0.1;
|
|
||||||
};
|
|
||||||
r_doLoop = false;
|
|
||||||
|
|
||||||
|
|
||||||
if(!_finished) exitWith { //exit if interrupted
|
|
||||||
_isOk = false;
|
|
||||||
_proceed = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(_finished) then { //if animation finished, add to build count
|
|
||||||
_counter = _counter + 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
cutText [format[(localize "str_epoch_player_139"),_text, _counter,_limit], "PLAIN DOWN"]; //report how many steps are done out of total limit
|
|
||||||
|
|
||||||
if(_counter == _limit) exitWith { //if all steps done proceed with next step, otherwise cancel publish
|
|
||||||
_isOk = false;
|
|
||||||
_proceed = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_proceed) then {
|
|
||||||
|
|
||||||
_num_removed = ([player,DZE_buildItem] call BIS_fnc_invRemove); //remove item's magazine from inventory
|
|
||||||
if(_num_removed == 1) then {
|
|
||||||
|
|
||||||
cutText [format[localize "str_build_01",_text], "PLAIN DOWN"];
|
|
||||||
|
|
||||||
if (_isPole) then { //if item was a plotpole, build a visual radius around it
|
|
||||||
[] spawn player_plotPreview;
|
|
||||||
};
|
|
||||||
|
|
||||||
_tmpbuilt setVariable ["OEMPos",_location,true]; //store original location as a variable
|
|
||||||
|
|
||||||
if(_lockable > 1) then { //if item has code lock on it
|
|
||||||
|
|
||||||
_combinationDisplay = ""; //define new display
|
|
||||||
|
|
||||||
switch (_lockable) do { //generate random combinations depending on item type
|
|
||||||
|
|
||||||
case 2: { // 2 lockbox
|
|
||||||
_combination_1 = (floor(random 3)) + 100; // 100=red,101=green,102=blue
|
|
||||||
_combination_2 = floor(random 10);
|
|
||||||
_combination_3 = floor(random 10);
|
|
||||||
_combination = format["%1%2%3",_combination_1,_combination_2,_combination_3];
|
|
||||||
dayz_combination = _combination;
|
|
||||||
if (_combination_1 == 100) then {
|
|
||||||
_combination_1_Display = "Red";
|
|
||||||
};
|
|
||||||
if (_combination_1 == 101) then {
|
|
||||||
_combination_1_Display = "Green";
|
|
||||||
};
|
|
||||||
if (_combination_1 == 102) then {
|
|
||||||
_combination_1_Display = "Blue";
|
|
||||||
};
|
|
||||||
_combinationDisplay = format["%1%2%3",_combination_1_Display,_combination_2,_combination_3];
|
|
||||||
};
|
|
||||||
|
|
||||||
case 3: { // 3 combolock
|
|
||||||
_combination_1 = floor(random 10);
|
|
||||||
_combination_2 = floor(random 10);
|
|
||||||
_combination_3 = floor(random 10);
|
|
||||||
_combination = format["%1%2%3",_combination_1,_combination_2,_combination_3];
|
|
||||||
dayz_combination = _combination;
|
|
||||||
_combinationDisplay = _combination;
|
|
||||||
};
|
|
||||||
|
|
||||||
case 4: { // 4 safe
|
|
||||||
_combination_1 = floor(random 10);
|
|
||||||
_combination_2 = floor(random 10);
|
|
||||||
_combination_3 = floor(random 10);
|
|
||||||
_combination_4 = floor(random 10);
|
|
||||||
_combination = format["%1%2%3%4",_combination_1,_combination_2,_combination_3,_combination_4];
|
|
||||||
dayz_combination = _combination;
|
|
||||||
_combinationDisplay = _combination;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
_tmpbuilt setVariable ["CharacterID",_combination,true]; //set combination as a character ID
|
|
||||||
|
|
||||||
//call publish precompiled function with given args and send public variable to server to save item to database
|
|
||||||
PVDZE_obj_Publish = [_combination,_tmpbuilt,[_dir,_location],_classname];
|
|
||||||
publicVariableServer "PVDZE_obj_Publish";
|
|
||||||
|
|
||||||
cutText [format[(localize "str_epoch_player_140"),_combinationDisplay,_text], "PLAIN DOWN", 5]; //display new combination
|
|
||||||
|
|
||||||
|
|
||||||
} else { //if not lockable item
|
|
||||||
_tmpbuilt setVariable ["CharacterID",dayz_characterID,true];
|
|
||||||
|
|
||||||
// fire?
|
|
||||||
if(_tmpbuilt isKindOf "Land_Fire_DZ") then { //if campfire, then spawn, but do not publish to database
|
|
||||||
_tmpbuilt spawn player_fireMonitor;
|
|
||||||
} else {
|
|
||||||
PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location],_classname];
|
|
||||||
publicVariableServer "PVDZE_obj_Publish";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
} else { //if magazine was not removed, cancel publish
|
|
||||||
deleteVehicle _tmpbuilt;
|
|
||||||
cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
|
|
||||||
};
|
|
||||||
|
|
||||||
} else { //if player was interrupted, cancel publish and stop build animations
|
|
||||||
r_interrupt = false;
|
|
||||||
if (vehicle player == player) then {
|
|
||||||
[objNull, player, rSwitchMove,""] call RE;
|
|
||||||
player playActionNow "stop";
|
|
||||||
};
|
|
||||||
|
|
||||||
deleteVehicle _tmpbuilt;
|
|
||||||
|
|
||||||
cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
|
|
||||||
};
|
|
||||||
|
|
||||||
} else { //cancel build if passed _cancel arg was true or building on roads/trader city
|
|
||||||
cutText [format[(localize "str_epoch_player_47"),_text,_reason], "PLAIN DOWN"];
|
|
||||||
};
|
|
||||||
|
|
||||||
DZE_ActionInProgress = false; //in any case always finish last function with this to "reset" everything.
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
if(!DZE_ActionInProgress) exitWith {};
|
|
||||||
//disallow building if these conditions are not met
|
|
||||||
private ["_isFine","_onLadder","_vehicle","_inVehicle"];
|
|
||||||
|
|
||||||
_isFine = "ok"; //define variable to avoid RPT errors
|
|
||||||
_onLadder = (getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "onLadder")) == 1;
|
|
||||||
_vehicle = vehicle player;
|
|
||||||
_inVehicle = (_vehicle != player);
|
|
||||||
|
|
||||||
if (dayz_isSwimming) exitWith { //end script if player is swimming
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
cutText [localize "str_player_26", "PLAIN DOWN"];
|
|
||||||
_isFine = "Swimming";
|
|
||||||
_isFine
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_inVehicle) exitWith { //end script if player is in vehicle
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
cutText [(localize "str_epoch_player_42"), "PLAIN DOWN"];
|
|
||||||
_isFine = "In vehicle";
|
|
||||||
_isFine
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_onLadder) exitWith { //end script if player is climbing on ladder
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
cutText [localize "str_player_21", "PLAIN DOWN"];
|
|
||||||
_isFine = "On ladder";
|
|
||||||
_isFine
|
|
||||||
};
|
|
||||||
|
|
||||||
if (player getVariable["combattimeout", 0] >= time) exitWith { //end script if player is in combat
|
|
||||||
DZE_ActionInProgress = false;
|
|
||||||
cutText [(localize "str_epoch_player_43"), "PLAIN DOWN"];
|
|
||||||
_isFine = "In combat";
|
|
||||||
_isFine
|
|
||||||
};
|
|
||||||
|
|
||||||
_isFine //returns string to caller, default is "ok" if conditions were not met
|
|
||||||
|
|
||||||
@@ -101,15 +101,6 @@ if (!isDedicated) then {
|
|||||||
|
|
||||||
if (DZE_modularBuild) then {
|
if (DZE_modularBuild) then {
|
||||||
player_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\modular_build.sqf";
|
player_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\modular_build.sqf";
|
||||||
player_build_countNearby = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build_countNearby.sqf";
|
|
||||||
player_build_states = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build_states.sqf";
|
|
||||||
player_build_needNearby = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build_needNearby.sqf";
|
|
||||||
player_build_getConfig = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build_getConfig.sqf";
|
|
||||||
player_build_plotCheck = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build_plotCheck.sqf";
|
|
||||||
player_build_buildReq = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build_buildReq.sqf";
|
|
||||||
player_build_create = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build_create.sqf";
|
|
||||||
player_build_controls = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build_controls.sqf";
|
|
||||||
player_build_publish = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build_publish.sqf";
|
|
||||||
snap_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\snap_build.sqf";
|
snap_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\snap_build.sqf";
|
||||||
} else {
|
} else {
|
||||||
player_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build.sqf";
|
player_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build.sqf";
|
||||||
|
|||||||
@@ -560,9 +560,6 @@ if (isNil "DZE_modularBuild") then {
|
|||||||
if (isNil "DZE_snapExtraRange") then {
|
if (isNil "DZE_snapExtraRange") then {
|
||||||
DZE_snapExtraRange = 0;
|
DZE_snapExtraRange = 0;
|
||||||
};
|
};
|
||||||
if (isNil "DZE_checkNearbyRadius") then {
|
|
||||||
DZE_checkNearbyRadius = 30;
|
|
||||||
};
|
|
||||||
if (isNil "DZE_RestrictSkins") then {
|
if (isNil "DZE_RestrictSkins") then {
|
||||||
DZE_RestrictSkins = [];
|
DZE_RestrictSkins = [];
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user