Hello, as the title says, i want the instant build script to work with build snapping. since they both uses a custom "Player_Build.sqf i cant get them to work. i have tried merging them, but no luck :( i am using a playerbuild i found somewhere, and i think it made by Dami. anyway i will post both of my original player_builds from the build snapping and the instabuild thing.
Instabuild:
private ["_location","_dir","_classname","_item","_hasrequireditem","_missing","_hastoolweapon","_cancel","_reason","_started","_finished","_animState","_isMedic","_dis","_sfx","_hasbuilditem","_tmpbuilt","_onLadder","_isWater","_require","_text","_offset","_IsNearPlot","_isOk","_location1","_location2","_counter","_limit","_proceed","_num_removed","_position","_object","_canBuildOnPlot","_friendlies","_nearestPole","_ownerID","_findNearestPoles","_findNearestPole","_distance","_classnametmp","_ghost","_isPole","_needText","_lockable","_combination_1","_combination_2","_combination_3","_combination_4","_combination","_combination_1_Display","_combinationDisplay","_abort","_isNear","_need","_objHupDiff","_objHdwnDiff","_needNear"];
if (DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_40") , "PLAIN DOWN"]; };
if((count ((position player) nearObjects ["All",30])) >= DZE_BuildingLimit) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_41"), "PLAIN DOWN"];};
DZE_ActionInProgress = true;
_onLadder = (getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "onLadder")) == 1;
_isWater = dayz_isSwimming;
_cancel = false;
_reason = "";
_vehicle = vehicle player;
_inVehicle = (_vehicle != player);
_canBuildOnPlot = false;
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_togglesnap = false;
DZE_cancelBuilding = false;
call gear_ui_init;
closeDialog 1;
if ((_isWater)&&(isNil "AM_Epoch_ADMIN_norestrict")) exitWith {DZE_ActionInProgress = false; cutText [localize "str_player_26", "PLAIN DOWN"];};
if ((_inVehicle)&&(isNil "AM_Epoch_ADMIN_norestrict")) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_42"), "PLAIN DOWN"];};
if ((_onLadder)&&(isNil "AM_Epoch_ADMIN_norestrict")) exitWith {DZE_ActionInProgress = false; cutText [localize "str_player_21", "PLAIN DOWN"];};
if ((player getVariable["combattimeout", 0] >= time)&&(isNil "AM_Epoch_ADMIN_norestrict")) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_43"), "PLAIN DOWN"];};
_item = _this;
_abort = false;
_distance = 3;
_reason = "";
_needNear = getArray (configFile >> "CfgMagazines" >> _item >> "ItemActions" >> "Build" >> "neednearby");
{
_need = _x select 0;
_distance = _x select 1;
switch(_need) do{
case "fire":
{
_isNear = {inflamed _x} count (position player nearObjects _distance);
if(_isNear == 0) then {
_abort = true;
_reason = "fire";
};
};
case "workshop":
{
_isNear = count (nearestObjects [player, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]);
if(_isNear == 0) then {
_abort = true;
_reason = "workshop";
};
};
case "fueltank":
{
_isNear = count (nearestObjects [player, dayz_fuelsources, _distance]);
if(_isNear == 0) then {
_abort = true;
_reason = "fuel tank";
};
};
};
} forEach _needNear;
if ((_abort)&&(isNil "AM_Epoch_ADMIN_norestrict")) exitWith {cutText [format[(localize "str_epoch_player_135"),_reason,_distance], "PLAIN DOWN"];DZE_ActionInProgress = false;};
_classname = getText (configFile >> "CfgMagazines" >> _item >> "ItemActions" >> "Build" >> "create");
_classnametmp = _classname;
_require = getArray (configFile >> "cfgMagazines" >> _this >> "ItemActions" >> "Build" >> "require");
_text = getText (configFile >> "CfgVehicles" >> _classname >> "displayName");
_ghost = getText (configFile >> "CfgVehicles" >> _classname >> "ghostpreview");
_lockable = 0;
_requireplot = DZE_requireplot;
_isAllowedUnderGround = 1;
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "lockable")) then {_lockable = getNumber(configFile >> "CfgVehicles" >> _classname >> "lockable");};
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "requireplot")) then {_requireplot = getNumber(configFile >> "CfgVehicles" >> _classname >> "requireplot");};
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "nounderground")) then {_isAllowedUnderGround = getNumber(configFile >> "CfgVehicles" >> _classname >> "nounderground");};
_offset = getArray (configFile >> "CfgVehicles" >> _classname >> "offset");
if((count _offset) <= 0) then {_offset = [0,1.5,0];};
_isPole = (_classname == "Plastic_Pole_EP1_DZ");
_isLandFireDZ = (_classname == "Land_Fire_DZ");
_distance = 60;
_needText = localize "str_epoch_player_246";
if(_isPole) then {_distance = 60;};
_findNearestPoles = nearestObjects [(vehicle player), ["Plastic_Pole_EP1_DZ"], _distance];
_findNearestPole = [];
{
if (alive _x) then {
_findNearestPole set [(count _findNearestPole),_x];
};
} foreach _findNearestPoles;
_IsNearPlot = count (_findNearestPole);
if ((_isPole and _IsNearPlot > 0)&&(isNil "AM_Epoch_ADMIN_norestrict")) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_44") , "PLAIN DOWN"];};
if ((_IsNearPlot == 0)||(!isNil "AM_Epoch_ADMIN_norestrict")) then {
if(_requireplot == 0 or _isLandFireDZ) then {
_canBuildOnPlot = true;
};
} else {
_nearestPole = _findNearestPole select 0;
_ownerID = _nearestPole getVariable["CharacterID","0"];
if(dayz_characterID == _ownerID) then {
if(!_isPole) then {
_canBuildOnPlot = true;
};
} else {
if(!_isPole) then {
_friendlies = player getVariable ["friendlyTo",[]];
if(_ownerID in _friendlies) then {
_canBuildOnPlot = true;
};
};
};
};
if ((!_canBuildOnPlot)&&(isNil "AM_Epoch_ADMIN_norestrict")) exitWith {DZE_ActionInProgress = false; cutText [format[(localize "STR_EPOCH_PLAYER_135"),_needText,_distance] , "PLAIN DOWN"];};
_missing = "";
_hasrequireditem = true;
{
_hastoolweapon = _x in weapons player;
if(!_hastoolweapon) exitWith { _hasrequireditem = false; _missing = getText (configFile >> "cfgWeapons" >> _x >> "displayName"); }
} forEach _require;
_hasbuilditem = _this in magazines player;
if ((!_hasbuilditem)&&(isNil "AM_Epoch_ADMIN_norestrict")) exitWith {
DZE_ActionInProgress = false;
cutText [format[(localize "str_player_31"),_text,"build"] , "PLAIN DOWN"];
systemChat format["%1 must be in your main inventory to %2 it.",_text,"build"];
};
if ((!_hasrequireditem)&&(isNil "AM_Epoch_ADMIN_norestrict")) exitWith {
DZE_ActionInProgress = false;
cutText [format[(localize "str_epoch_player_137"),_missing] , "PLAIN DOWN"];
systemChat format["Missing tool %1",_missing];
};
if ((_hasrequireditem)||(!isNil "AM_Epoch_ADMIN_norestrict")) then {
_location = [0,0,0];
_timestartbuilding = time;
_isOk = true;
_location1 = getPosATL player;
_dir = 0;
_original_classname = _classname;
if (_ghost != "") then {
_classname = _ghost;
};
_object = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
_object attachTo [player,_offset];
_position = getPosATL _object;
cutText ["Planning construction: PgUp = raise, PgDn = lower, Q or E = flip 180, and Space-Bar to build.", "PLAIN DOWN"];
_previewCounter = 150;
SnappingOffset = _offset;
SnappingDir = _dir;
SnappingSpotMarkers = [];
SnappingEnabled = true;
SnappedOffsetZ = 0;
SnappingResetPos = false;
_snapper = [_object, _original_classname] spawn snap_object;
_keyThrd = [] spawn snap_object2;
first_build = nil;
private ["_zheightchanged", "_zheightdirection", "_rotate"];
while {_isOk} do {
if (isNil 'first_build') then {first_build=true;systemChat ("P"+"l"+"a"+"n"+"n"+"i"+"n"+"g"+" "+"c"+"o"+"n"+"s"+"t"+"r"+"u"+"c"+"t"+"i"+"o"+"n"+":"+" "+"P"+"g"+"U"+"p"+" "+"="+" "+"r"+"a"+"i"+"s"+"e"+","+" "+"P"+"g"+"D"+"n"+" "+"="+" "+"l"+"o"+"w"+"e"+"r"+","+" "+"Q"+" "+"o"+"r"+" "+"E"+" "+"="+" "+"f"+"l"+"i"+"p"+" "+"1"+"80"+","+" "+"S"+"p"+"a"+"c"+"e"+"-"+"B"+"a"+"r"+" "+"t"+"o"+" "+"s"+"t"+"a"+"r"+"t"+" "+"b"+"u"+"i"+"l"+"d"+"i"+"n"+"g"+","+" "+"E"+"N"+"D"+" "+"t"+"o"+" "+"s"+"t"+"o"+"p"+" "+"b"+"u"+"i"+"l"+"d"+"i"+"n"+"g"+"."+" "+"-"+" "+"W"+"r"+"i"+"t"+"t"+"e"+"n"+" "+"b"+"y"+" "+"D"+"a"+"m"+"i");};
if (isNil "CAKE") then {
[] spawn {
CAKE = true;
cutText ["Planning construction: PgUp = raise, PgDn = lower, Q or E = flip 180, Space-Bar to start building, HOME to toggle snapping, END to stop building.", "PLAIN DOWN"];
sleep 2;
CAKE = nil;
};
};
_timeBuilding = time - _timestartbuilding;
if (_timeBuilding > 150) exitWith
{
_isOk = false;
_cancel = true;
_reason = "Ran out of time to find position.";
systemChat ("Building terminated..." + str _reason);
detach _object;
};
_lastLoop = time;
waitUntil {((DZE_Q)||(DZE_Z)||(DZE_Q_alt)||(DZE_Z_alt)||(DZE_Q_ctrl)||(DZE_Z_ctrl)||(DZE_4)||(DZE_5)||(DZE_6)||(DZE_cancelBuilding)||((time - _lastLoop) > 5))};
_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 {
DZE_4 = false;
SnappingDir = 0;
_rotate = true;
};
if (DZE_6) then {
DZE_6 = false;
SnappingDir = 180;
_rotate = true;
};
if (_zheightchanged) then {
if (_zheightdirection == "up") then {
SnappingOffset set [2, ((SnappingOffset select 2) + 0.1)];
};
if (_zheightdirection == "down") then {
SnappingOffset set [2, ((SnappingOffset select 2) - 0.1)];
};
if (_zheightdirection == "up_alt") then {
SnappingOffset set [2, ((SnappingOffset select 2) + 1)];
};
if (_zheightdirection == "down_alt") then {
SnappingOffset set [2, ((SnappingOffset select 2) - 1)];
};
if (_zheightdirection == "up_ctrl") then {
SnappingOffset set [2, ((SnappingOffset select 2) + 0.01)];
};
if (_zheightdirection == "down_ctrl") then {
SnappingOffset set [2, ((SnappingOffset select 2) - 0.01)];
};
};
if (_zheightchanged or _rotate) then {
SnappingAttachedToPlayer = false;
};
_location2 = getPosATL player;
if (DZE_5) exitWith {
_isOk = false;
detach _object;
_dir = getDir _object;
_position = getPosATL _object;
diag_log format["DEBUG BUILDING POS: %1", _position];
systemChat ("Preparing to build...");
};
if (DZE_togglesnap) then {
DZE_togglesnap = false;
if (SnappingEnabled) then {
SnappingEnabled = false;
SnappingAttachedToPlayer = false;
_TXT = "Building snapping disabled.";
systemChat ("Anti-Hack: "+STR _TXT+"");
} else {
SnappingEnabled = true;
_TXT = "Building snapping enabled.";
systemChat ("Anti-Hack: "+STR _TXT+"");
};
};
if (DZE_cancelBuilding) exitWith {
_isOk = false;
_cancel = true;
_reason = "Cancelled building.";
systemChat ("Building terminated... REASON:" + str _reason);
detach _object;
};
if(_location1 distance _location2 > 5) exitWith {
_isOk = false;
_cancel = true;
_reason = "Moving too fast.";
systemChat ("Building terminated... REASON:" + str _reason);
detach _object;
};
if(_previewCounter <= 0) exitWith {
_isOk = false;
_cancel = true;
_reason = "Ran out of time to find position.";
systemChat ("Building terminated... REASON:" + str _reason);
detach _object;
};
_previewCounter = _previewCounter - 1;
if (((SnappingOffset select 2) > 10) or ((SnappingOffset select 2) < -5)) exitWith {
_isOk = false;
_cancel = true;
_reason = "Cannot move up more than 10 meters, or down less than -5 meters";
systemChat ("Building terminated... REASON:" + str _reason);
detach _object;
};
if (player getVariable["combattimeout", 0] >= time) exitWith {
_isOk = false;
_cancel = true;
_reason = "Cannot build while in combat.";
systemChat ("Building terminated... REASON:" + str _reason);
detach _object;
};
};
terminate _snapper;
terminate _keyThrd;
{deleteVehicle _x;} forEach SnappingSpotMarkers;
SnappingSpotMarkers = [];
if ((isOnRoad _position)&&(isNil "AM_Epoch_ADMIN_norestrict")&&(!DZE_BuildOnRoads)) then { _cancel = true; _reason = "Cannot build on a road."; };
if ((!canbuild)&&(isNil "AM_Epoch_ADMIN_norestrict")) then { _cancel = true; _reason = "Cannot build in a city."; };
if ((!placevault)&&(isNil "AM_Epoch_ADMIN_norestrict")) then { _cancel = true; _reason = "Cannot build in a city."; };
_position = getPosATL _object;
_dir = getDir _object;
deleteVehicle _object;
if (!_cancel) then {
_classname = _classnametmp;
_tmpbuilt = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
_tmpbuilt addEventHandler ["HandleDamage", {false}];
_tmpbuilt enableSimulation false;
_tmpbuilt setdir _dir;
if ((_classname in dami_indestructables)&&(getPlayerUID player in dami_indarra)) then {
_tmpbuilt addEventHandler ["HandleDamage", {false}];
_tmpbuilt enableSimulation false;
};
_location = _position;
if((_isAllowedUnderGround == 0) and ((_location select 2) < 0)) then {
_location set [2,0];
};
_tmpbuilt setPosATL _location;
cutText [format[(localize "str_epoch_player_138"),_text], "PLAIN DOWN"];
systemChat format["Placing %1, move to cancel.",_text];
_limit = 3;
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "constructioncount")) then {
_limit = getNumber(configFile >> "CfgVehicles" >> _classname >> "constructioncount");
};
_isOk = true;
_proceed = false;
_counter = 0;
while {_isOk} do {
if ((!isNil "AM_Epoch_ADMIN")||(getPlayerUID player in dami_instntbarra)) exitWith {
_isOk = false;
_proceed = true;
systemChat ("Instant build!");
};
[10,10] call dayz_HungerThirst;
player playActionNow "Medic";
_dis=20;
_sfx = "repair";
[player,_sfx,0,false,_dis] call dayz_zombieSpeak;
[player,_dis,true,(getPosATL player)] spawn player_alertZombies;
r_interrupt = false;
_animState = animationState player;
r_doLoop = true;
_started = false;
_finished = false;
while {r_doLoop} do {
_animState = animationState player;
_isMedic = ["medic",_animState] call fnc_inString;
if (_isMedic) then {
_started = true;
};
if (_started and !_isMedic) then {
r_doLoop = false;
_finished = true;
};
if (r_interrupt or (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 {
_isOk = false;
_proceed = false;
};
if(_finished) then {
_counter = _counter + 1;
};
cutText [format[(localize "str_epoch_player_139"),_text, _counter,_limit], "PLAIN DOWN"];
systemChat format["Constructing %1 stage %2 of %3, move to cancel.",_text, _counter,_limit];
if(_counter == _limit) exitWith {
_isOk = false;
_proceed = true;
};
};
if (_proceed) then {
_num_removed = ([player,_item] call BIS_fnc_invRemove);
if(_num_removed == 1) then {
cutText [format[localize "str_build_01",_text], "PLAIN DOWN"];
systemChat format["You have constructed a %1",_text];
if (_isPole) then {
[] spawn player_plotPreview;
};
_tmpbuilt setVariable ["OEMPos",_location,true];
if(_lockable > 1) then {
_combinationDisplay = "";
switch (_lockable) do {
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];
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: {
_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];
_combinationDisplay = _combination;
};
case 4: {
_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];
_combinationDisplay = _combination;
};
};
_tmpbuilt setVariable ["CharacterID",_combination,true];
PVDZE_obj_Publish = [_combination,_tmpbuilt,[_dir,_location],_classname];
publicVariableServer "PVDZE_obj_Publish";
cutText [format[(localize "str_epoch_player_140"),_combinationDisplay,_text], "PLAIN DOWN", 5];
systemChat format["You have setup your %2. Combination is %1",_combinationDisplay,_text];
} else {
_tmpbuilt setVariable ["CharacterID",dayz_characterID,true];
if(_tmpbuilt isKindOf "Land_Fire") then {
_tmpbuilt spawn player_fireMonitor;
} else {
PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location],_classname];
publicVariableServer "PVDZE_obj_Publish";
};
};
} else {
deleteVehicle _tmpbuilt;
cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
systemChat ("Canceled building.");
};
} else {
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"];
systemChat ("Canceled building.");
};
} else {
deleteVehicle _tmpbuilt;
cutText [format[(localize "str_epoch_player_47"),_text,_reason], "PLAIN DOWN"];
systemChat format["Canceled construction of %1 %2.",_text,_reason];
};
};
DZE_ActionInProgress = false;
Snappbuild :
/*
DayZ Base Building
Made for DayZ Epoch please ask permission to use/edit/distrubute email
[email protected].
*/
/*
Build Snapping - Extended v1.6
Idea and first code:
Maca
Reworked by: OtterNas3
01/11/2014
Last update 02/20/2014
*/
private ["_location","_dir","_classname","_item","_hasrequireditem","_missing","_hastoolweapon","_cancel","_reason","_started","_finished","_animState","_isMedic","_dis","_sfx","_hasbuilditem","_tmpbuilt","_onLadder","_isWater","_require","_text","_offset","_IsNearPlot","_isOk","_location1","_location2","_counter","_limit","_proceed","_num_removed","_position","_object","_canBuildOnPlot","_friendlies","_nearestPole","_ownerID","_findNearestPoles","_findNearestPole","_distance","_classnametmp","_ghost","_isPole","_needText","_lockable","_zheightchanged","_rotate","_combination_1","_combination_2","_combination_3","_combination_4","_combination","_combination_1_Display","_combinationDisplay","_zheightdirection","_abort","_isNear","_need","_objHupDiff","_needNear","_vehicle","_inVehicle","_requireplot","_objHDiff","_isLandFireDZ","_isTankTrap"];
if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_40") , "PLAIN DOWN"]; };
DZE_ActionInProgress = true;
// disallow building if too many objects are found within 30m
if((count ((getPosATL player) nearObjects ["All",30])) >= DZE_BuildingLimit) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_41"), "PLAIN DOWN"];};
_onLadder = (getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "onLadder")) == 1;
_isWater = dayz_isSwimming;
_cancel = false;
_reason = "";
_canBuildOnPlot = false;
_vehicle = vehicle player;
_inVehicle = (_vehicle != player);
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;
if (_isWater) 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"];};
_item = _this;
// Need Near Requirements
_abort = false;
_distance = 3;
_reason = "";
_needNear = getArray (configFile >> "CfgMagazines" >> _item >> "ItemActions" >> "Build" >> "neednearby");
{
switch(_x) do{
case "fire":
{
_isNear = {inflamed _x} count (getPosATL player nearObjects _distance);
if(_isNear == 0) then {
_abort = true;
_reason = "fire";
};
};
case "workshop":
{
_isNear = count (nearestObjects [player, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]);
if(_isNear == 0) then {
_abort = true;
_reason = "workshop";
};
};
case "fueltank":
{
_isNear = count (nearestObjects [player, dayz_fuelsources, _distance]);
if(_isNear == 0) then {
_abort = true;
_reason = "fuel tank";
_distance = 30;
};
};
};
} forEach _needNear;
if(_abort) exitWith {
cutText [format[(localize "str_epoch_player_135"),_reason,_distance], "PLAIN DOWN"];
DZE_ActionInProgress = false;
};
_classname = getText (configFile >> "CfgMagazines" >> _item >> "ItemActions" >> "Build" >> "create");
_classnametmp = _classname;
_require = getArray (configFile >> "cfgMagazines" >> _this >> "ItemActions" >> "Build" >> "require");
_text = getText (configFile >> "CfgVehicles" >> _classname >> "displayName");
_ghost = getText (configFile >> "CfgVehicles" >> _classname >> "ghostpreview");
_lockable = 0;
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "lockable")) then {
_lockable = getNumber(configFile >> "CfgVehicles" >> _classname >> "lockable");
};
_requireplot = DZE_requireplot;
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "requireplot")) then {
_requireplot = getNumber(configFile >> "CfgVehicles" >> _classname >> "requireplot");
};
_isAllowedUnderGround = 1;
if(isNumber (configFile >> "CfgVehicles" >> _classname >> "nounderground")) then {
_isAllowedUnderGround = getNumber(configFile >> "CfgVehicles" >> _classname >> "nounderground");
};
_offset = getArray (configFile >> "CfgVehicles" >> _classname >> "offset");
if((count _offset) <= 0) then {
_offset = [0,1.5,0];
};
_isPole = (_classname == "Plastic_Pole_EP1_DZ");
_isLandFireDZ = (_classname == "Land_Fire_DZ");
_distance = DZE_PlotPole select 0;
_needText = localize "str_epoch_player_246";
if(_isPole) then {
_distance = DZE_PlotPole select 1;
};
// check for near plot
_findNearestPoles = nearestObjects [(vehicle player), ["Plastic_Pole_EP1_DZ"], _distance];
_findNearestPole = [];
{
if (alive _x) then {
_findNearestPole set [(count _findNearestPole),_x];
};
} foreach _findNearestPoles;
_IsNearPlot = count (_findNearestPole);
// If item is plot pole and another one exists within 45m
if(_isPole and _IsNearPlot > 0) exitWith { DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_44") , "PLAIN DOWN"]; };
if(_IsNearPlot == 0) then {
// Allow building of plot
if(_requireplot == 0 or _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;
// Find owner
_ownerID = _nearestPole getVariable["CharacterID","0"];
// diag_log format["DEBUG BUILDING: %1 = %2", dayz_characterID, _ownerID];
// 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;
};
};
};
};
// _message
if(!_canBuildOnPlot) exitWith { DZE_ActionInProgress = false; cutText [format[(localize "STR_EPOCH_PLAYER_135"),_needText,_distance] , "PLAIN DOWN"]; };
_missing = "";
_hasrequireditem = true;
{
_hastoolweapon = _x in weapons player;
if(!_hastoolweapon) exitWith { _hasrequireditem = false; _missing = getText (configFile >> "cfgWeapons" >> _x >> "displayName"); }
} forEach _require;
_hasbuilditem = _this 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 {
_location = [0,0,0];
_isOk = true;
// get inital players position
_location1 = getPosATL player;
_dir = getDir player;
/* Commented out cause GHOST preview does not work with snapping!
// if ghost preview available use that instead
if (_ghost != "") then {
_classname = _ghost;
};
*/
_object = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
_object setDir _dir;
_object attachTo [player,_offset];
_position = getPosATL _object;
cutText [(localize "str_epoch_player_45"), "PLAIN DOWN"];
player allowDamage false;
SnappingOffset = _offset;
SnappingDir = 0;
SnappingSpotMarkers = [];
SnappingEnabled = false;
SnappedOffsetZ = 0;
SnappingResetPos = false;
if (isClass (missionConfigFile >> "SnapPoints" >> _classname)) then {
s_building_snapping = player addAction ["<t color="#0000ff"">Toggle Snapping</t>", "custom\snap_build\player_toggleSnapping.sqf",_classname, 3, true, false, "","];
};
_snapper = [_object, _classname] spawn snap_object;
_key_monitor = [] spawn player_buildControls ;
while {_isOk} do {
sleep 1;
_location2 = getPosATL player;
if(DZE_5) exitWith {
_isOk = false;
detach _object;
_dir = getDir _object;
_position = getPosATL _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;
};
if(((SnappingOffset select 2) > 5) or ((SnappingOffset select 2) < -5)) exitWith {
_isOk = false;
_cancel = true;
_reason = "Cannot move up or down more than 5 meters";
detach _object;
};
if (player getVariable["combattimeout", 0] >= time) exitWith {
_isOk = false;
_cancel = true;
_reason = (localize "str_epoch_player_43");
detach _object;
};
if (DZE_cancelBuilding) exitWith {
_isOk = false;
_cancel = true;
_reason = "Cancelled building.";
detach _object;
};
};
terminate _snapper;
terminate _key_monitor;
player removeAction s_building_snapping;
player allowDamage true;
//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;
_location = _position;
if((_isAllowedUnderGround == 0) and ((_location select 2) < 0)) then {
_location set [2,0];
};
_object setPosATL _location;
cutText [format[(localize "str_epoch_player_138"),_text], "PLAIN DOWN"];
_limit = 3;
if (DZE_StaticConstructionCount > 0) then {
_limit = DZE_StaticConstructionCount;
}
else {
if (isNumber (configFile >> "CfgVehicles" >> _classname >> "constructioncount")) then {
_limit = getNumber(configFile >> "CfgVehicles" >> _classname >> "constructioncount");
};
};
_isOk = true;
_proceed = false;
_counter = 0;
while {_isOk} do {
[10,10] call dayz_HungerThirst;
player playActionNow "Medic";
_dis=20;
_sfx = "repair";
[player,_sfx,0,false,_dis] call dayz_zombieSpeak;
[player,_dis,true,(getPosATL player)] spawn player_alertZombies;
r_interrupt = false;
_animState = animationState player;
r_doLoop = true;
_started = false;
_finished = false;
while {r_doLoop} do {
_animState = animationState player;
_isMedic = ["medic",_animState] call fnc_inString;
if (_isMedic) then {
_started = true;
};
if (_started and !_isMedic) then {
r_doLoop = false;
_finished = true;
};
if (r_interrupt or (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 {
_isOk = false;
_proceed = false;
};
if(_finished) then {
_counter = _counter + 1;
};
cutText [format[(localize "str_epoch_player_139"),_text, _counter,_limit], "PLAIN DOWN"];
if(_counter == _limit) exitWith {
_isOk = false;
_proceed = true;
};
};
if (_proceed) then {
_num_removed = ([player,_item] call BIS_fnc_invRemove);
if(_num_removed == 1) then {
cutText [format[localize "str_build_01",_text], "PLAIN DOWN"];
if (_isPole) then {
[] spawn player_plotPreview;
};
_object setVariable ["OEMPos",_location,true];
if(_lockable > 1) then {
_combinationDisplay = "";
switch (_lockable) do {
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;
};
};
_object setVariable ["CharacterID",_combination,true];
PVDZE_obj_Publish = [_combination,_object,[_dir,_location],_classname];
publicVariableServer "PVDZE_obj_Publish";
cutText [format[(localize "str_epoch_player_140"),_combinationDisplay,_text], "PLAIN DOWN", 5];
} else {
_object setVariable ["CharacterID",dayz_characterID,true];
// fire?
if(_object isKindOf "Land_Fire_DZ") then {
_object spawn player_fireMonitor;
} else {
PVDZE_obj_Publish = [dayz_characterID,_object,[_dir,_location],_classname];
publicVariableServer "PVDZE_obj_Publish";
};
};
} else {
deleteVehicle _object;
cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
};
} else {
r_interrupt = false;
if (vehicle player == player) then {
[objNull, player, rSwitchMove,""] call RE;
player playActionNow "stop";
};
deleteVehicle _object;
cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
};
} else {
deleteVehicle _object;
cutText [format[(localize "str_epoch_player_47"),_text,_reason], "PLAIN DOWN"];
};
};
DZE_ActionInProgress = false;
if someone could help me, i would greatly appreciate it ;)
Thx,
NorthyPark