Jump to content

[RELEASE] Build Snapping - Extended v1.6 (Updated 02/20/2014)


OtterNas3

Recommended Posts

I have this working on my server but for some reason, over time, the snapped objects will malign ever so slightly.

class SnapPoints
{



class MetalFloor_DZ {
sn>
 5:56:37   Error position: <SnapPoints
{



class MetalFloor_DZ {
sn>
 5:56:37   Error Missing ;
 5:56:37 File mpmissions\DayZ_Overpoch_1.Chernarus\custom\snap_build\points.hpp, line 12
 5:56:37 Error in expression <snap_build\points.hpp"
Link to comment
Share on other sites

Dropbox account got hacked, sorry guys, i finally put it all together again from my Serverfiles, was a bit tuff cause this is running on my HeadlessClient now.

 

Reupped the file in first Post!

 

And for the [CPC] Indestructable Bases:

 

When it tells you this in the instructions:

// Start Build
_tmpbuilt = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
// ### [CPC] Indestructible Base Fix
_tmpbuilt addEventHandler ["HandleDamage", {false}];
_tmpbuilt enableSimulation false;
// ### [CPC] Indestructible Base Fix

replace the _tmpbuilt with _object so it looks like this:

// Start Build
_object = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
// ### [CPC] Indestructible Base Fix
_object addEventHandler ["HandleDamage", {false}];
_object enableSimulation false;
// ### [CPC] Indestructible Base Fix


For the fine fixes mentioned in this Post from RimBlock:

 

Just debugging another script and I keep getting a couple of errors error coming up relating to the snapto release.  I have debugged them and worked out fixes that appear to be working now.

 

Error

 

player_buildControls.sqf -> line 85 -> _isAllowedUnderGround undefined.

 

Reason

 

_isAllowedUnderGround is not passed to the player_buildControls script and is not defined in the player_buildControls script.

 

Solution

 

  • Open custom\snap_build\player_build.sqf
  • find
_key_monitor = [] spawn player_buildControls ;
  • Change to 
_key_monitor = [_isAllowedUnderGround] spawn player_buildControls ;
  • save

 

  • Open custom\snap_build\player_buildControls.sqf
  • find 
private ["_zheightchanged", "_zheightdirection", "_rotate"];
diag_log "build controls";
  • Change to 
private ["_zheightchanged", "_zheightdirection", "_rotate", "_isAllowedUnderGround"];
diag_log "build controls";

_isAllowedUnderGround = _this select 0;
  • Save
 
What the change does
 
The _isAllowedUnderGround variable is defined and populated in the palyer_build.sqf script.  This then passes it to the player_buildControls.sqf script as a parameter.

 

Tested: Yes - Light testing.

Result: No issues with fix found.

 

---------------------------

 

Error 2

 

player_build.sqf -> line 288 -> s_building_snapping undefined.

 

Reason

 

This occurs when a non snapable item is placed.  Adding the snap mouse wheel menu item occurs only if the item being placed is snapable.  

 

Removing the menu item occurs at the end of the code even if the menu item was never added as the item being places was not snapable, hence the error message.  

 

Solution

 

  • Open custom\snap_build\player_build.sqf
  • Find 
player removeAction s_building_snapping;
  • Change to   
if (isClass (missionConfigFile >> "SnapPoints" >> _classname)) then {
player removeAction s_building_snapping; // Only remove the snap menu item if the item is snapable.
};

 

What the change does
 
The added if statement uses the same check to see if the item being placed is snapable before trying to remove the snap option form the mouse wheel menu.

 

Tested: Yes - Light testing.

Result: No issues with fix found.

 

----------------------------------------------

 

 

RB

 

for the s_building_snapping remove thing.

If you think this will bug when try to remove it when not defined, you should have a look in the epoch fn_selfActions!

There are a bunch of entrys that gets removed every second when no valid cursortarget is near the player ^^

 

Nevermind its not bad to do it, just not needed ^^

 

I think you debugging on the new Arma2 beta patch?

It shows errors all the way for undefined variables ^^

 

 

For the _isAllowedUnderGround not defined thats correct one i updated the file in the downloadfile alrdy.

Never had a look at this cause i never used that function anyway, many Buildings on my Server needs to be able been build more then 2m under the ground, disabled that on my server.

So i never noticed.

Thanks for the hint!

 

Files updated in first post!

 

 

Moo,

Otter

Link to comment
Share on other sites

My understanding is that OtterNas is busy with 'real life' this week but should be back in the land of Epoch next week sometime.

 

I would expect some feedback from him at that point.

 

I have not looked at the new code yet but will be concentrating on my own Plat for Life mod first if any problems pop up with that and then can maybe offer some suggestions.  Unlikely to be before the weekend though.

Link to comment
Share on other sites

1.0.5 player_build.sqf with working snapping:

 

/*


DayZ Base Building
Made for DayZ Epoch please ask permission to use/edit/distrubute email [email protected].
*/
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","_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 ["DZE_maintainClasses",60])) >= 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;
_reason = "";

_needNear = getArray (configFile >> "CfgMagazines" >> _item >> "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;
};

_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];
};
} count _findNearestPoles;

_IsNearPlot = count (_findNearestPole);

// If item is plot pole && another one exists within 45m
if(_isPole && _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 || _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;

// 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"); };
} count _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 ["Toggle Snapping", "scripts\snapping\player_toggleSnapping.sqf",_classname, 3, true, false, "",""];
};

_snapper = [_object, _classname] spawn snap_object;
_key_monitor = [] spawn player_buildControls ;

while {_isOk} do {
uisleep 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(!placevault) 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;
};
uisleep 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;

Link to comment
Share on other sites

1.0.5 player_build.sqf with working snapping:

 

/*

DayZ Base Building

Made for DayZ Epoch please ask permission to use/edit/distrubute email [email protected].

*/

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","_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 ["DZE_maintainClasses",60])) >= 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;

_reason = "";

_needNear = getArray (configFile >> "CfgMagazines" >> _item >> "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;

};

_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];

};

} count _findNearestPoles;

_IsNearPlot = count (_findNearestPole);

// If item is plot pole && another one exists within 45m

if(_isPole && _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 || _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;

// 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"); };

} count _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 ["Toggle Snapping", "scripts\snapping\player_toggleSnapping.sqf",_classname, 3, true, false, "",""];

};

_snapper = [_object, _classname] spawn snap_object;

_key_monitor = [] spawn player_buildControls ;

while {_isOk} do {

uisleep 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(!placevault) 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;

};

uisleep 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;

Thanks for this i'll update mine...

Link to comment
Share on other sites

Hello, just a quick mention. If you followed the original guide to the letter, your scripts will be in: custom\snap_build\

Assuming you copy and pasted Cen's fixed player_build.sqf the path in the fixed player_build.sqf will need to be corrected as Cen has his scripts in another directory.

Look for line line 226 in Cen's player_build.sqf

It will read:

s_building_snapping = player addAction ["Toggle Snapping", "scripts\snapping\player_toggleSnapping.sqf",_classname, 3, true, false, "",""];

As you can see the path is scripts\snapping\ and this is where Cen has his scripts. But the original post/author's instructions point to custom\snap_build.

All you need to do is change the above line to the following:

s_building_snapping = player addAction ["Toggle Snapping", "custom\snap_build\player_toggleSnapping.sqf",_classname, 3, true, false, "",""];

Have a nice day!

Link to comment
Share on other sites

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
×
×
  • Create New...