Skip to content

Instantly share code, notes, and snippets.

@raymix
Last active August 29, 2015 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raymix/7b8ce07521ce17d7ee9e to your computer and use it in GitHub Desktop.
Save raymix/7b8ce07521ce17d7ee9e to your computer and use it in GitHub Desktop.
(outdated) Modular and Function based player_build.sqf
//Check if building already in progress, exit if so.
if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_40") , "PLAIN DOWN"]; };
DZE_ActionInProgress = true;
/*Basic Defines*/
DZE_Q = false;
DZE_Z = false;
DZE_Q_alt = false;
DZE_Z_alt = false;
DZE_Q_ctrl = false;
DZE_Z_ctrl = false;
DZE_5 = false;
DZE_4 = false;
DZE_6 = false;
DZE_cancelBuilding = false;
call gear_ui_init;
closeDialog 1;
DZE_buildItem = _this; //This is a magazine! It's global to allow access to it from outside functions
if (isNil "DZE_customBuildSystem") then {
DZE_customBuildSystem = false;
};
/*-----------------------------------Functions-----------------------------------*/
/*Function defines*/
// disallow building if too many objects are found within 30m
DZE_buildFNC_countNearby = {
private ["_cnt"];
_cnt = count ((getPosATL player) nearObjects ["All",30]);
if (_cnt >= DZE_BuildingLimit) exitWith { //end script if too many objects nearby
DZE_ActionInProgress = false;
cutText [(localize "str_epoch_player_41"), "PLAIN DOWN"];
};
_cnt //returns amount of total objects found nearby
};
//disallow building if these conditions are not met
DZE_buildFNC_playerStates = {
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";
};
if (_inVehicle) exitWith { //end script if player is in vehicle
DZE_ActionInProgress = false;
cutText [(localize "str_epoch_player_42"), "PLAIN DOWN"];
_isFine = "In vehicle";
};
if (_onLadder) exitWith { //end script if player is climbing on ladder
DZE_ActionInProgress = false;
cutText [localize "str_player_21", "PLAIN DOWN"];
_isFine = "On ladder";
};
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 //returns string to caller, default is "ok" if conditions were not met
};
//disallow building if required items (defined in config) are not found nearby
DZE_buildFNC_needNearby = {
private ["_abort","_reason","_distance","_needNear","_isNear"];
_abort = false; //do not abort by default
_reason = ""; // define to avoid RPT errors
_needNear = getArray (configFile >> "CfgMagazines" >> DZE_buildItem >> "ItemActions" >> "Build" >> "neednearby");
{
switch(_x) do{
case "fire":
{
_distance = 3;
_isNear = {inflamed _x} count (getPosATL player nearObjects _distance);
if(_isNear == 0) then {
_abort = true;
_reason = "fire";
};
};
case "workshop":
{
_distance = 3;
_isNear = count (nearestObjects [player, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]);
if(_isNear == 0) then {
_abort = true;
_reason = "workshop";
};
};
case "fueltank":
{
_distance = 30;
_isNear = count (nearestObjects [player, 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;
};
_reason //return string to a caller
};
//Build an array of various variables gathered about build object from config files, only applies to legit buildable objects
DZE_buildFNC_getItemConfig = {
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]
};
//Check if nearby plotpoles exists
DZE_buildFNC_plotpoleChecks = {
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 = [];
_passArray = [];
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
// End script early if item is plot pole and another one exists within defined radius
if(_isPole && _IsNearPlot > 0) exitWith {
DZE_ActionInProgress = false;
cutText [(localize "str_epoch_player_44") , "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 && 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;
};
};
};
};
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 = [_IsNearPlot,_nearestPole,_ownerID,_friendlies]; //create new array and pass it to caller
_passArray //[int,Obj,int,array]
};
//Check for build requirements like tools and if item is in magazines (check args to disable checks)
DZE_buildFNC_buildRequirements = {
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;
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";
};
};
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 = [_hasrequireditem,_reason];
_passArray //[bool,string]
};
//create an object for default build system style
DZE_buildFNC_createObject = {
private ["_passArray","_classname","_enableGhost","_ghost","_location","_location1","_dir","_object","_position"];
_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 = [];
_location = [0,0,0]; //create object in debug zone first
// get inital players position
_location1 = getPosATL player;
// if enabled, use ghost preview where available
if (_enableGhost) then {
if (_ghost != "") then {
_classname = _ghost;
};
};
_object = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"]; //object preview, not an actual object that will be built
_object attachTo [player,_offset]; // attach preview to player
_position = getPosATL _object; // pass the new location of object ahead
_passArray = [_location1,_object,_position];
_passArray //[array,obj,array]
};
DZE_buildFNC_controls = {
private ["_passArray","_objHDiff","_isOk","_zheightchanged","_zheightdirection","_rotate","_dir","_object","_position","_isAllowedUnderGround","_location2","_cancel","_reason","_lastDir"];
_object = _this select 0;
_isAllowedUnderGround = _this select 1;
_location1 = _this select 2;
_position = _this select 3;
_passArray = [];
_objHDiff = 0;
_isOk = true;
_cancel = false;
_reason = "";
_dir = getDir player; //required to pass direction when building
cutText [(localize "str_epoch_player_45"), "PLAIN DOWN"];
while {_isOk} do { //if everything checks out, start while loop that is broken from within
_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 = 180;
};
if (DZE_6) then {
_rotate = true;
DZE_6 = false;
_dir = 0;
};
if(_rotate) then {
_object setDir _dir;
_object setPosATL _position;
//diag_log format["DEBUG Rotate BUILDING POS: %1", _position];
};
//attached objects can not change position (altitude in this case), so we need to detach it, reposition and attach to player again
if(_zheightchanged) then {
detach _object;
_position = getPosATL _object;
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;
};
_object setDir (getDir _object);
if((_isAllowedUnderGround == 0) && ((_position select 2) < 0)) then {
_position set [2,0];
};
_object setPosATL _position;
//diag_log format["DEBUG Change BUILDING POS: %1", _position];
_object attachTo [player];
};
sleep 0.5; // slow down while loop, this is used for performance optimizations
_location2 = getPosATL player; //find out how far player has traveled since beginning of object creation
if(DZE_5) exitWith { //if spacebar is pressed, break while loop, detach and delete temporary preview, continue with building actual object
_isOk = false;
detach _object;
_dir = getDir _object;
_position = getPosATL _object;
deleteVehicle _object;
};
if(_location1 distance _location2 > 5) exitWith {
_isOk = false;
_cancel = true;
_reason = "You've moved to far away from where you started building (within 5 meters)";
detach _object;
deleteVehicle _object;
};
if(abs(_objHDiff) > 5) exitWith {
_isOk = false;
_cancel = true;
_reason = "Cannot move up or down more than 5 meters";
detach _object;
deleteVehicle _object;
};
if (player getVariable["combattimeout", 0] >= time) exitWith { //combat check
_isOk = false;
_cancel = true;
_reason = (localize "str_epoch_player_43");
detach _object;
deleteVehicle _object;
};
if (DZE_cancelBuilding) exitWith { //used to cancel building phase externally
_isOk = false;
_cancel = true;
_reason = "Cancelled building.";
detach _object;
deleteVehicle _object;
};
};
_passArray = [_cancel,_reason,_position,_dir];
_passArray //[bool,string,array,int]
};
DZE_buildFNC_publish = {
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)
};
_tmpbuilt setPosATL _location; //update position passed from args or previous if statement
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;
};
sleep 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.
};
// Check if server is not running customized build system. If not, then init default player build as normal
DZE_buildFNC_init = {
private ["_itemConfig","_classname","_classnametmp","_require","_text","_ghost","_lockable","_requireplot","_isAllowedUnderGround","_offset",
"_isPole","_isLandFireDZ","_hasRequired","_hasrequireditem","_reason","_buildObject","_location1","_object","_position","_controls","_cancel","_dir"];
if (!DZE_customBuildSystem) then {
//count nearby objects. Returns [_cnt] number
[] call DZE_buildFNC_countNearby;
//Check illegal player states. Returns [_isFine] string
[] call DZE_buildFNC_playerStates;
//check for nearby requirements (campfire, workshop, fueltank). Returns [_reason] string
[] call DZE_buildFNC_needNearby;
//check config files and gather info about item (if using custom buildables, make your own similar function instead).
_itemConfig = [] call DZE_buildFNC_getItemConfig;
//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 DZE_buildFNC_plotpoleChecks;
//Check for build requirements (missing tools and items). Returns [_hasrequireditem,_reason] [bool,string]
_hasRequired = [_require, _text, true, true] call DZE_buildFNC_buildRequirements;
//define item collected from function
_hasrequireditem = _hasRequired select 0; //bool
if (_hasrequireditem and DZE_ActionInProgress) then {
//Create object that is attached to a player (i.e Ghost preview if available)
_buildObject = [_classname, _ghost, _offset, true] call DZE_buildFNC_createObject;
//define items collected from function
_location1 = _buildObject select 0; //array
_object = _buildObject select 1; //Obj
_position = _buildObject select 2; // array
//give player controls (rotate, adjust height, distance checks, key presses)
_controls = [_object, _isAllowedUnderGround, _location1, _position] call DZE_buildFNC_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
if (!DZE_cancelBuilding) then { //double check that building was not cancelled externally
[_cancel, _position, _classnametmp,_isAllowedUnderGround, _text, _isPole, _lockable,_dir, _reason] call DZE_buildFNC_publish;
};
};
} else {
[] spawn DZE_customBuildInit; //ignore above and use custom build system instead. Runs on extra thread so make sure DZE_ActionInProgress = false; is used.
};
};
/* Init default or custom player_build system*/
[] call DZE_buildFNC_init;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment