From 585841a3ad290033163bce27a89800cafadb6075 Mon Sep 17 00:00:00 2001 From: ebaydayz Date: Wed, 2 Mar 2016 22:16:07 -0500 Subject: [PATCH] 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. --- CHANGE LOG 1.0.6.txt | 1 - SQF/dayz_code/actions/modular_build.sqf | 645 ++++++++++++++++-- SQF/dayz_code/actions/player_build.sqf | 16 +- .../actions/player_build_buildReq.sqf | 44 -- .../actions/player_build_controls.sqf | 216 ------ .../actions/player_build_countNearby.sqf | 10 - SQF/dayz_code/actions/player_build_create.sqf | 37 - .../actions/player_build_getConfig.sqf | 39 -- .../actions/player_build_needNearby.sqf | 44 -- .../actions/player_build_plotCheck.sqf | 79 --- .../actions/player_build_publish.sqf | 224 ------ SQF/dayz_code/actions/player_build_states.sqf | 39 -- SQF/dayz_code/init/compiles.sqf | 9 - SQF/dayz_code/init/variables.sqf | 3 - 14 files changed, 597 insertions(+), 809 deletions(-) delete mode 100644 SQF/dayz_code/actions/player_build_buildReq.sqf delete mode 100644 SQF/dayz_code/actions/player_build_controls.sqf delete mode 100644 SQF/dayz_code/actions/player_build_countNearby.sqf delete mode 100644 SQF/dayz_code/actions/player_build_create.sqf delete mode 100644 SQF/dayz_code/actions/player_build_getConfig.sqf delete mode 100644 SQF/dayz_code/actions/player_build_needNearby.sqf delete mode 100644 SQF/dayz_code/actions/player_build_plotCheck.sqf delete mode 100644 SQF/dayz_code/actions/player_build_publish.sqf delete mode 100644 SQF/dayz_code/actions/player_build_states.sqf diff --git a/CHANGE LOG 1.0.6.txt b/CHANGE LOG 1.0.6.txt index d8d9dd9e6..30f5ebe1f 100644 --- a/CHANGE LOG 1.0.6.txt +++ b/CHANGE LOG 1.0.6.txt @@ -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/ [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] 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] 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 diff --git a/SQF/dayz_code/actions/modular_build.sqf b/SQF/dayz_code/actions/modular_build.sqf index d2dd9b29c..8bdb10946 100644 --- a/SQF/dayz_code/actions/modular_build.sqf +++ b/SQF/dayz_code/actions/modular_build.sqf @@ -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. if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_40") , "PLAIN DOWN"]; }; 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_Z = false; @@ -25,63 +30,589 @@ DZE_cancelBuilding = false; call gear_ui_init; 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 -//count nearby objects. Returns [_cnt] number -[] call player_build_countNearby; +// Need Near Requirements +_abort = false; +_reason = ""; -//Check illegal player states. Returns [_isFine] string -[] call player_build_states; +_needNear = getArray (configFile >> "CfgMagazines" >> DZE_buildItem >> "ItemActions" >> "Build" >> "neednearby"); -//check for nearby requirements (campfire, workshop, fueltank). -[] call player_build_needNearby; - -//check config files and gather info about item (if using custom buildables, make your own similar function instead). -_itemConfig = [] call player_build_getConfig; - -//define items collected from function -_classname = _itemConfig select 0; //string -_classnametmp = _itemConfig select 1; //string -_require = _itemConfig select 2; // array -_text = _itemConfig select 3; // string -_ghost = _itemConfig select 4; //string -_lockable = _itemConfig select 5; //int -- 0/1=No 2=lockbox, 3=combolock, 4=safe -_requireplot = _itemConfig select 6; //int -_isAllowedUnderGround = _itemConfig select 7; //int -_offset = _itemConfig select 8; //array -_isPole = _itemConfig select 9; //bool -_isLandFireDZ = _itemConfig select 10; //bool - -//Check for nearby plotpoles. Returns [_IsNearPlot,_nearestPole,_ownerID,_friendlies] [int,Obj,int,array] -[_isPole, _requireplot, _isLandFireDZ] call player_build_plotCheck; - -if (DZE_ActionInProgress) then { //needed otherwise _hasRequired gets RPT error - -//Check for build requirements (missing tools and items). Returns [_hasrequireditem,_reason] [bool,string] -_hasRequired = [_require, _text, true, true] call player_build_buildReq; - -//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; +{ + 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"; + }; + }; }; -}; \ No newline at end of file +} 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; \ No newline at end of file diff --git a/SQF/dayz_code/actions/player_build.sqf b/SQF/dayz_code/actions/player_build.sqf index d207e6c68..3bca1d219 100644 --- a/SQF/dayz_code/actions/player_build.sqf +++ b/SQF/dayz_code/actions/player_build.sqf @@ -117,6 +117,10 @@ _isLandFireDZ = (_classname == "Land_Fire_DZ"); _distance = DZE_PlotPole select 0; _needText = localize "str_epoch_player_246"; +_canBuildOnPlot = false; +_nearestPole = objNull; +_ownerID = 0; +_friendlies = []; if(_isPole) then { _distance = DZE_PlotPole select 1; @@ -134,7 +138,7 @@ _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(_IsNearPlot == 0) then { @@ -179,7 +183,7 @@ if(!_canBuildOnPlot) exitWith { DZE_ActionInProgress = false; cutText [format[( _buildables = DZE_maintainClasses + DZE_LockableStorage; _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"];}; _missing = ""; @@ -197,9 +201,7 @@ if (_hasrequireditem) then { _location = [0,0,0]; _isOk = true; - - // get inital players position - _location1 = getPosATL player; + _location1 = [player] call FNC_GetPos; // get inital players position _dir = getDir player; // if ghost preview available use that instead @@ -524,7 +526,7 @@ if (_hasrequireditem) then { publicVariableServer "PVDZE_obj_Publish"; 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 { _tmpbuilt setVariable ["CharacterID",dayz_characterID,true]; @@ -559,4 +561,4 @@ if (_hasrequireditem) then { }; }; -DZE_ActionInProgress = false; +DZE_ActionInProgress = false; \ No newline at end of file diff --git a/SQF/dayz_code/actions/player_build_buildReq.sqf b/SQF/dayz_code/actions/player_build_buildReq.sqf deleted file mode 100644 index 976a6dc79..000000000 --- a/SQF/dayz_code/actions/player_build_buildReq.sqf +++ /dev/null @@ -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] - diff --git a/SQF/dayz_code/actions/player_build_controls.sqf b/SQF/dayz_code/actions/player_build_controls.sqf deleted file mode 100644 index 5b22021d2..000000000 --- a/SQF/dayz_code/actions/player_build_controls.sqf +++ /dev/null @@ -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] \ No newline at end of file diff --git a/SQF/dayz_code/actions/player_build_countNearby.sqf b/SQF/dayz_code/actions/player_build_countNearby.sqf deleted file mode 100644 index 7b46890f7..000000000 --- a/SQF/dayz_code/actions/player_build_countNearby.sqf +++ /dev/null @@ -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 diff --git a/SQF/dayz_code/actions/player_build_create.sqf b/SQF/dayz_code/actions/player_build_create.sqf deleted file mode 100644 index 6139db2e4..000000000 --- a/SQF/dayz_code/actions/player_build_create.sqf +++ /dev/null @@ -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] - diff --git a/SQF/dayz_code/actions/player_build_getConfig.sqf b/SQF/dayz_code/actions/player_build_getConfig.sqf deleted file mode 100644 index a626ddcf3..000000000 --- a/SQF/dayz_code/actions/player_build_getConfig.sqf +++ /dev/null @@ -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] - diff --git a/SQF/dayz_code/actions/player_build_needNearby.sqf b/SQF/dayz_code/actions/player_build_needNearby.sqf deleted file mode 100644 index d75796fc4..000000000 --- a/SQF/dayz_code/actions/player_build_needNearby.sqf +++ /dev/null @@ -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; -}; \ No newline at end of file diff --git a/SQF/dayz_code/actions/player_build_plotCheck.sqf b/SQF/dayz_code/actions/player_build_plotCheck.sqf deleted file mode 100644 index 48bec6d70..000000000 --- a/SQF/dayz_code/actions/player_build_plotCheck.sqf +++ /dev/null @@ -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] diff --git a/SQF/dayz_code/actions/player_build_publish.sqf b/SQF/dayz_code/actions/player_build_publish.sqf deleted file mode 100644 index dc780b257..000000000 --- a/SQF/dayz_code/actions/player_build_publish.sqf +++ /dev/null @@ -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. \ No newline at end of file diff --git a/SQF/dayz_code/actions/player_build_states.sqf b/SQF/dayz_code/actions/player_build_states.sqf deleted file mode 100644 index d5f16221f..000000000 --- a/SQF/dayz_code/actions/player_build_states.sqf +++ /dev/null @@ -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 - diff --git a/SQF/dayz_code/init/compiles.sqf b/SQF/dayz_code/init/compiles.sqf index 09696f677..5a7e9117b 100644 --- a/SQF/dayz_code/init/compiles.sqf +++ b/SQF/dayz_code/init/compiles.sqf @@ -101,15 +101,6 @@ if (!isDedicated) then { if (DZE_modularBuild) then { 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"; } else { player_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build.sqf"; diff --git a/SQF/dayz_code/init/variables.sqf b/SQF/dayz_code/init/variables.sqf index e2a0fcfb6..49f34782f 100644 --- a/SQF/dayz_code/init/variables.sqf +++ b/SQF/dayz_code/init/variables.sqf @@ -560,9 +560,6 @@ if (isNil "DZE_modularBuild") then { if (isNil "DZE_snapExtraRange") then { DZE_snapExtraRange = 0; }; -if (isNil "DZE_checkNearbyRadius") then { - DZE_checkNearbyRadius = 30; -}; if (isNil "DZE_RestrictSkins") then { DZE_RestrictSkins = []; };