Jump to content

Instant Build with Build snapping?


Recommended Posts

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

Link to comment
Share on other sites

Had an idea don't flame if i am way off please How about join a server that has both build snapping and instant build working you would have downloaded the mission file upon entering right well find this mission file on your pc and examine it and repost here pls also if you know a way to remove building maintenace let me know pls

Link to comment
Share on other sites

Had an idea don't flame if i am way off please How about join a server that has both build snapping and instant build working you would have downloaded the mission file upon entering right well find this mission file on your pc and examine it and repost here pls also if you know a way to remove building maintenace let me know pls

i have tried that a few times before, but no luck

Link to comment
Share on other sites

Just install snap building into a fresh copy of player_build.sqf from the dayz_code pbo (easy enough), then change the following:

                    _isOk = true;
                    _proceed = true;
                    _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;
                            };
           
                    };
*/ 

All that does is set _proceed to true, and comments out the code that does the animation loop while constructing. I haven't tested this, but it should work fine.

Link to comment
Share on other sites

Just install snap building into a fresh copy of player_build.sqf from the dayz_code pbo (easy enough), then change the following:

 

I am gonna try it out now :)

 

EDIT:

 

Didn't work.. maybe you can give me your fresh player_build with build snapp?

Link to comment
Share on other sites

I just installed snap building and in my player_build.sqf in line 314 i got this: _limit = 1;

Walls and stuff are done after one stage. 

Snap building works like it should.

hmmm, ill try that if what Shizweak said doesn't work

 

EDIT:

hm, didn't work either... can you post ur player_build to?

Link to comment
Share on other sites

  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Advertisement
  • Discord

×
×
  • Create New...