Last active
August 29, 2015 14:04
-
-
Save raymix/7b8ce07521ce17d7ee9e to your computer and use it in GitHub Desktop.
(outdated) Modular and Function based player_build.sqf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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