464 lines
13 KiB
Plaintext
464 lines
13 KiB
Plaintext
|
/*
|
||
|
DayZ Base Building
|
||
|
Made for DayZ Epoch please ask permission to use/edit/distrubute email vbawol@veteranbastards.com.
|
||
|
*/
|
||
|
private ["_vector","_IsNearPlot","_abort","_animState","_buildables","_buildcheck","_canBuild","_cancel","_classname","_classnametmp","_counter","_dir","_distance","_exitWith","_finished","_friendlies","_hasbuilditem","_hasrequireditem","_hastoolweapon","_index","_inVehicle","_isAllowedUnderGround","_isMedic","_isNear","_isOk","_isfriendly","_isowner","_limit","_location","_location1","_location2","_message","_missing","_nearestPole","_needNear","_needText","_objHDiff","_object","_offset","_onLadder","_ownerID","_plotcheck","_position","_proceed","_reason","_requireplot","_rotate","_started","_text","_tmpbuilt","_vehicle","_zheightchanged","_zheightdirection","_havePad","_heliPad","_charID"];
|
||
|
|
||
|
if (dayz_actionInProgress) exitWith {localize "str_epoch_player_40" call dayz_rollingMessages;};
|
||
|
dayz_actionInProgress = true;
|
||
|
|
||
|
_onLadder = (getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "onLadder")) == 1;
|
||
|
_cancel = false;
|
||
|
_reason = "";
|
||
|
|
||
|
_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 (dayz_isSwimming) exitWith {dayz_actionInProgress = false; localize "str_player_26" call dayz_rollingMessages;};
|
||
|
if (_inVehicle) exitWith {dayz_actionInProgress = false; localize "str_epoch_player_42" call dayz_rollingMessages;};
|
||
|
if (_onLadder) exitWith {dayz_actionInProgress = false; localize "str_player_21" call dayz_rollingMessages;};
|
||
|
if (player getVariable["combattimeout",0] >= diag_tickTime) exitWith {dayz_actionInProgress = false; localize "str_epoch_player_43" call dayz_rollingMessages;};
|
||
|
|
||
|
_abort = false;
|
||
|
_reason = "";
|
||
|
|
||
|
_index = _this call getDeployableIndex;
|
||
|
_needNear = _index call getDeployableNeedNearBy;
|
||
|
|
||
|
{
|
||
|
switch (_x) do {
|
||
|
case "fire": {
|
||
|
_distance = 3;
|
||
|
_isNear = {inflamed _x} count (getPosATL player nearObjects _distance);
|
||
|
if (_isNear == 0) then {
|
||
|
_abort = true;
|
||
|
_reason = localize "STR_EPOCH_FIRE";
|
||
|
};
|
||
|
};
|
||
|
case "workshop": {
|
||
|
_distance = 3;
|
||
|
_isNear = count (nearestObjects [player, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]);
|
||
|
if (_isNear == 0) then {
|
||
|
_abort = true;
|
||
|
_reason = localize "STR_BLD_name_ItemWorkshop";
|
||
|
};
|
||
|
};
|
||
|
case "fueltank": {
|
||
|
_distance = 30;
|
||
|
_isNear = count (nearestObjects [player, dayz_fuelsources, _distance]);
|
||
|
if (_isNear == 0) then {
|
||
|
_abort = true;
|
||
|
_reason = localize "STR_EPOCH_VEHUP_TNK";
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
} forEach _needNear;
|
||
|
|
||
|
if (_abort) exitWith {
|
||
|
dayz_actionInProgress = false;
|
||
|
format[localize "str_epoch_player_135",_reason,_distance] call dayz_rollingMessages;
|
||
|
};
|
||
|
|
||
|
_classname = _index call getDeployableClass;
|
||
|
_classnametmp = _classname;
|
||
|
_text = _index call getDeployableDisplay;
|
||
|
|
||
|
if (_index call getDeployableRequirePlot) then {_requireplot = 1;} else {_requireplot = 0;};
|
||
|
|
||
|
_isAllowedUnderGround = 1;
|
||
|
if (isNumber (configFile >> "CfgVehicles" >> _classname >> "nounderground")) then {
|
||
|
_isAllowedUnderGround = getNumber(configFile >> "CfgVehicles" >> _classname >> "nounderground");
|
||
|
};
|
||
|
|
||
|
_offset = _index call getDeployableDistanceOffset;
|
||
|
|
||
|
_distance = DZE_PlotPole select 0;
|
||
|
_needText = localize "str_epoch_player_246";
|
||
|
|
||
|
_canBuild = false;
|
||
|
_nearestPole = objNull;
|
||
|
_ownerID = 0;
|
||
|
_friendlies = [];
|
||
|
|
||
|
_plotcheck = [player, false] call FNC_find_plots;
|
||
|
_distance = DZE_PlotPole select 0;
|
||
|
|
||
|
_IsNearPlot = _plotcheck select 1;
|
||
|
_nearestPole = _plotcheck select 2;
|
||
|
|
||
|
if (_IsNearPlot == 0) then {
|
||
|
if (_requireplot == 0) then {
|
||
|
_canBuild = true;
|
||
|
} else {
|
||
|
_exitWith = localize "STR_EPOCH_PLAYER_135";
|
||
|
};
|
||
|
} else {
|
||
|
if (_requireplot == 0) then {
|
||
|
_canBuild = true;
|
||
|
} else {
|
||
|
_ownerID = _nearestPole getVariable["CharacterID","0"];
|
||
|
if (dayz_characterID == _ownerID) then {
|
||
|
_canBuild = true;
|
||
|
} else {
|
||
|
if (DZE_permanentPlot) then {
|
||
|
_buildcheck = [player, _nearestPole] call FNC_check_access;
|
||
|
_isowner = _buildcheck select 0;
|
||
|
_isfriendly = ((_buildcheck select 1) or (_buildcheck select 3));
|
||
|
if (_isowner || _isfriendly) then {
|
||
|
_canBuild = true;
|
||
|
} else {
|
||
|
_exitWith = localize "STR_EPOCH_PLAYER_134";
|
||
|
};
|
||
|
} else {
|
||
|
_friendlies = player getVariable ["friendlyTo",[]];
|
||
|
if (_ownerID in _friendlies) then {
|
||
|
_canBuild = true;
|
||
|
} else {
|
||
|
_exitWith = localize "STR_EPOCH_PLAYER_134";
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
if (!_canBuild) exitWith {dayz_actionInProgress = false; format[_exitWith,_needText,_distance] call dayz_rollingMessages;};
|
||
|
|
||
|
_havePad = false;
|
||
|
if !(isNil "vg_list") then {
|
||
|
if (_className in vg_heliPads) then {
|
||
|
_heliPad = nearestObjects [player,vg_heliPads,vg_distance];
|
||
|
if (count _heliPad > 0) then {
|
||
|
_havePad = true;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
if (_havePad) exitWith {
|
||
|
dayz_actionInProgress = false;
|
||
|
systemChat "You already have a heli pad!";
|
||
|
};
|
||
|
|
||
|
_missing = "";
|
||
|
_hasrequireditem = true;
|
||
|
|
||
|
_hastoolweapon = (_index call getDeployableKitClass) in ((weapons player) + (magazines player));
|
||
|
if (!_hastoolweapon) then { _hasrequireditem = false; _missing = (_index call getDeployableKitDisplay); };
|
||
|
|
||
|
_hasbuilditem = [player,_index] call getHasDeployableParts;
|
||
|
if (!_hasbuilditem) exitWith {dayz_actionInProgress = false; format[localize "str_player_31",str (_index call getDeployableParts),"build"] call dayz_rollingMessages; };
|
||
|
|
||
|
if (!_hasrequireditem) exitWith {dayz_actionInProgress = false; format[localize "str_epoch_player_137",_missing] call dayz_rollingMessages; };
|
||
|
if (_hasrequireditem) then {
|
||
|
|
||
|
_dir = getdir player;
|
||
|
_location = getPos player;
|
||
|
_location = [(_location select 0)+8*sin(_dir),(_location select 1)+8*cos(_dir),0];
|
||
|
|
||
|
_isOk = true;
|
||
|
_location1 = getPosATL player;
|
||
|
|
||
|
_object = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
|
||
|
_object setVehicleLock "LOCKED";
|
||
|
_object setVariable["ObjectUID","1",true];
|
||
|
|
||
|
_object attachTo [player,_offset];
|
||
|
_object setDir _dir;
|
||
|
_position = getPosATL _object;
|
||
|
|
||
|
[localize "str_epoch_player_45",1] call dayz_rollingMessages;
|
||
|
|
||
|
_objHDiff = 0;
|
||
|
|
||
|
while {_isOk} do {
|
||
|
|
||
|
_zheightchanged = false;
|
||
|
_zheightdirection = "";
|
||
|
_rotate = false;
|
||
|
|
||
|
if (DZE_Q) then {
|
||
|
DZE_Q = false;
|
||
|
_zheightdirection = "up";
|
||
|
_zheightchanged = true;
|
||
|
};
|
||
|
if (DZE_Z) then {
|
||
|
DZE_Z = false;
|
||
|
_zheightdirection = "down";
|
||
|
_zheightchanged = true;
|
||
|
};
|
||
|
if (DZE_Q_alt) then {
|
||
|
DZE_Q_alt = false;
|
||
|
_zheightdirection = "up_alt";
|
||
|
_zheightchanged = true;
|
||
|
};
|
||
|
if (DZE_Z_alt) then {
|
||
|
DZE_Z_alt = false;
|
||
|
_zheightdirection = "down_alt";
|
||
|
_zheightchanged = true;
|
||
|
};
|
||
|
if (DZE_Q_ctrl) then {
|
||
|
DZE_Q_ctrl = false;
|
||
|
_zheightdirection = "up_ctrl";
|
||
|
_zheightchanged = true;
|
||
|
};
|
||
|
if (DZE_Z_ctrl) then {
|
||
|
DZE_Z_ctrl = false;
|
||
|
_zheightdirection = "down_ctrl";
|
||
|
_zheightchanged = true;
|
||
|
};
|
||
|
if (DZE_4) then {
|
||
|
_rotate = true;
|
||
|
DZE_4 = false;
|
||
|
|
||
|
_dir = _dir + 30;
|
||
|
};
|
||
|
if (DZE_6) then {
|
||
|
_rotate = true;
|
||
|
DZE_6 = false;
|
||
|
_dir = _dir - 30;
|
||
|
};
|
||
|
|
||
|
if (_rotate) then {
|
||
|
_object setDir _dir;
|
||
|
_object setPosATL _position;
|
||
|
};
|
||
|
|
||
|
if (_zheightchanged) then {
|
||
|
detach _object;
|
||
|
|
||
|
_position = getPosATL _object;
|
||
|
|
||
|
if (_zheightdirection == "up") then {
|
||
|
_position set [2,((_position select 2)+0.1)];
|
||
|
_objHDiff = _objHDiff + 0.1;
|
||
|
};
|
||
|
if (_zheightdirection == "down") then {
|
||
|
_position set [2,((_position select 2)-0.1)];
|
||
|
_objHDiff = _objHDiff - 0.1;
|
||
|
};
|
||
|
if (_zheightdirection == "up_alt") then {
|
||
|
_position set [2,((_position select 2)+1)];
|
||
|
_objHDiff = _objHDiff + 1;
|
||
|
};
|
||
|
if (_zheightdirection == "down_alt") then {
|
||
|
_position set [2,((_position select 2)-1)];
|
||
|
_objHDiff = _objHDiff - 1;
|
||
|
};
|
||
|
if (_zheightdirection == "up_ctrl") then {
|
||
|
_position set [2,((_position select 2)+0.01)];
|
||
|
_objHDiff = _objHDiff + 0.01;
|
||
|
};
|
||
|
if (_zheightdirection == "down_ctrl") then {
|
||
|
_position set [2,((_position select 2)-0.01)];
|
||
|
_objHDiff = _objHDiff - 0.01;
|
||
|
};
|
||
|
|
||
|
if ((_isAllowedUnderGround == 0) && ((_position select 2) < 0)) then {
|
||
|
_position set [2,0];
|
||
|
};
|
||
|
_object setPosATL _position;
|
||
|
_object attachTo [player];
|
||
|
_object setDir _dir;
|
||
|
};
|
||
|
|
||
|
uiSleep 0.5;
|
||
|
|
||
|
_location2 = getPosATL player;
|
||
|
|
||
|
if (DZE_5) exitWith {
|
||
|
_isOk = false;
|
||
|
_position = [_object] call FNC_GetPos;
|
||
|
detach _object;
|
||
|
_dir = getDir _object;
|
||
|
_vector = [(vectorDir _object),(vectorUp _object)];
|
||
|
deleteVehicle _object;
|
||
|
};
|
||
|
if (_location1 distance _location2 > DZE_buildMaxMoveDistance) exitWith {
|
||
|
_isOk = false;
|
||
|
_cancel = true;
|
||
|
_reason = format [localize "STR_EPOCH_BUILD_FAIL_MOVED",DZE_buildMaxMoveDistance];
|
||
|
detach _object;
|
||
|
deleteVehicle _object;
|
||
|
};
|
||
|
if (abs(_objHDiff) > DZE_buildMaxHeightDistance) exitWith {
|
||
|
_isOk = false;
|
||
|
_cancel = true;
|
||
|
_reason = format [localize "STR_EPOCH_BUILD_FAIL_HEIGHT",DZE_buildMaxHeightDistance];
|
||
|
detach _object;
|
||
|
deleteVehicle _object;
|
||
|
};
|
||
|
if (DZE_cancelBuilding) exitWith {
|
||
|
_isOk = false;
|
||
|
_cancel = true;
|
||
|
_reason = localize "STR_EPOCH_PLAYER_46";
|
||
|
detach _object;
|
||
|
deleteVehicle _object;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
if (!(_index call getDeployableBuildOnRoad)) then {if (isOnRoad [_position select 0, _position select 1, 0]) then { _cancel = true; _reason = localize "STR_EPOCH_BUILD_FAIL_ROAD";};};
|
||
|
|
||
|
if (_classname isKindOf "MotorCycle") then {
|
||
|
if (count (nearestObjects [_position, ["Building","DZE_Housebase"], 5]) > 0) then {
|
||
|
_cancel = true;
|
||
|
_reason = format ["%1 can not be built near a wall/door",_text];
|
||
|
};
|
||
|
};
|
||
|
|
||
|
if (!_cancel) then {
|
||
|
_classname = _classnametmp;
|
||
|
|
||
|
_tmpbuilt = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
|
||
|
_tmpbuilt setVehicleLock "LOCKED";
|
||
|
|
||
|
if (!(_index call getDeployableSimulation)) then {
|
||
|
_tmpbuilt enableSimulation false;
|
||
|
};
|
||
|
_tmpbuilt setVariable ["ObjectUID", "1", true];
|
||
|
|
||
|
if (_index call getPermanent) then {
|
||
|
_tmpbuilt setVectorDirAndUp _vector;
|
||
|
} else {
|
||
|
_tmpbuilt setdir _dir; // setdir is incompatible with setVectorDirAndUp and should not be used together on the same object https://community.bistudio.com/wiki/setVectorDirAndUp
|
||
|
};
|
||
|
|
||
|
_location = _position;
|
||
|
|
||
|
if ((_isAllowedUnderGround == 0) && ((_location select 2) < 0)) then {
|
||
|
_location set [2,0];
|
||
|
};
|
||
|
|
||
|
_tmpbuilt setPosATL _location;
|
||
|
format[localize "str_epoch_player_138",_text] call dayz_rollingMessages;
|
||
|
_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 {
|
||
|
["Working",0,[100,15,10,0]] call dayz_NutritionSystem;
|
||
|
if !((getPlayerUID player) in DZE_DEPLOYABLE_ADMINS) then {
|
||
|
player playActionNow "Medic";
|
||
|
[player,"repair",0,false,20] call dayz_zombieSpeak;
|
||
|
[player,20,true,(getPosATL player)] spawn player_alertZombies;
|
||
|
|
||
|
r_interrupt = false;
|
||
|
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 && !_isMedic) then {
|
||
|
r_doLoop = false;
|
||
|
_finished = true;
|
||
|
};
|
||
|
if (r_interrupt) then {
|
||
|
r_doLoop = false;
|
||
|
};
|
||
|
if (DZE_cancelBuilding) exitWith {
|
||
|
r_doLoop = false;
|
||
|
};
|
||
|
uiSleep 0.1;
|
||
|
};
|
||
|
r_doLoop = false;
|
||
|
|
||
|
} else {
|
||
|
_finished = true;
|
||
|
};
|
||
|
|
||
|
if (!_finished) exitWith {
|
||
|
_isOk = false;
|
||
|
_proceed = false;
|
||
|
};
|
||
|
|
||
|
if (_finished) then {
|
||
|
_counter = _counter + 1;
|
||
|
};
|
||
|
format[localize "str_epoch_player_139",_text, _counter,_limit] call dayz_rollingMessages;
|
||
|
if (_counter == _limit) exitWith {
|
||
|
_isOk = false;
|
||
|
_proceed = true;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
if (_proceed) then {
|
||
|
if ([player,_index] call getHasDeployableParts) then {
|
||
|
[player,_index] call removeDeployableParts;
|
||
|
[format[localize "str_build_01",_text],1] call dayz_rollingMessages;
|
||
|
_tmpbuilt setVariable ["OEMPos",_location,true];
|
||
|
if (_index call getPermanent) then {
|
||
|
_charID = dayz_characterID;
|
||
|
_tmpbuilt setVariable ["CharacterID",_charID,true];
|
||
|
PVDZ_obj_Publish = [_charID,_tmpbuilt,[_dir,_position,dayz_playerUID,_vector],[],player,dayz_authKey];
|
||
|
publicVariableServer "PVDZ_obj_Publish";
|
||
|
};
|
||
|
if (_index call getClearCargo) then {
|
||
|
clearWeaponCargoGlobal _tmpbuilt;
|
||
|
clearMagazineCargoGlobal _tmpbuilt;
|
||
|
};
|
||
|
if (_index call getDeployableClearAmmo) then {
|
||
|
_tmpbuilt setVehicleAmmo 0;
|
||
|
};
|
||
|
|
||
|
_tmpbuilt call fnc_set_temp_deployable_id;
|
||
|
player reveal _tmpbuilt;
|
||
|
_tmpbuilt call fnc_veh_ResetEH;
|
||
|
|
||
|
// for non JIP users this should make sure everyone has eventhandlers for vehicles.
|
||
|
PVDZE_veh_Init = _tmpbuilt;
|
||
|
publicVariable "PVDZE_veh_Init";
|
||
|
|
||
|
_tmpbuilt setVehicleLock "UNLOCKED";
|
||
|
DZE_DEPLOYING_SUCCESSFUL = true;
|
||
|
} else {
|
||
|
deleteVehicle _tmpbuilt;
|
||
|
localize "str_epoch_player_46" call dayz_rollingMessages;
|
||
|
};
|
||
|
} else {
|
||
|
r_interrupt = false;
|
||
|
if (vehicle player == player) then {
|
||
|
[objNull, player, rSwitchMove,""] call RE;
|
||
|
player playActionNow "stop";
|
||
|
};
|
||
|
deleteVehicle _tmpbuilt;
|
||
|
|
||
|
localize "str_epoch_player_46" call dayz_rollingMessages;
|
||
|
};
|
||
|
} else {
|
||
|
format[localize "str_epoch_player_47",_text,_reason] call dayz_rollingMessages;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
dayz_actionInProgress = false;
|