Files
DayZ-Epoch/SQF/dayz_code/actions/object_disassembly.sqf

160 lines
6.6 KiB
Plaintext

private ["_cursorTarget","_onLadder","_isWater","_alreadyRemoving","_characterID","_objectID","_objectUID","_ownerArray","_dir",
"_realObjectStillThere","_upgrade","_entry","_parent","_requiredParts","_requiredTools","_model","_toolsOK","_displayname",
"_whpos","_i","_wh","_object","_vector","_dis","__FILE__","_puid","_variables"];
_cursorTarget = _this select 3;
// ArmaA2 bug workaround: sometimes the object is null
if ((isNil "_cursorTarget") or {(isNull _cursorTarget)}) then {
_cursorTarget = nearestObjects [ player modelToWorld [0,1.5,0] , ["DZ_buildables","BuiltItems"], 1.5];
_cursorTarget = if (count _cursorTarget == 0) then { objNull } else { _cursorTarget select 0 };
};
if(isNull _cursorTarget) exitWith { localize "str_disassembleNoOption" call dayz_rollingMessages; };
//Remove action Menu
player removeAction s_player_disassembly;
s_player_disassembly = -1;
//Normal blocked stuff
_onLadder = (getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "onLadder")) == 1;
_isWater = (surfaceIsWater (getPosATL player)) or dayz_isSwimming;
if(_isWater or _onLadder) exitWith { localize "str_water_ladder_cant_do" call dayz_rollingMessages; };
_alreadyRemoving = _cursorTarget getVariable["ObjectLocked",0];
if (_alreadyRemoving == 1) exitWith { localize "str_disassembleInProgress" call dayz_rollingMessages; };
_cursorTarget setVariable["ObjectLocked",1,true];
_characterID = _cursorTarget getVariable ["characterID","0"];
_objectID = _cursorTarget getVariable ["ObjectID","0"];
_objectUID = _cursorTarget getVariable ["ObjectUID","0"];
_ownerArray = _cursorTarget getVariable ["ownerArray",[]];
_dir = round getDir _cursorTarget;
_vector = [vectorDir _cursorTarget,vectorUp _cursorTarget];
_pos = getposATL _cursorTarget;
if (((_vector select 1) select 2) - 1 > 0.001) then { _pos set [2,0]; };
_realObjectStillThere = true;
_upgrade = typeOf _cursorTarget;
_entry = configFile >> "CfgVehicles" >> _upgrade;
r_interrupt = false;
for "_i" from 1 to 20 do {
_parent = inheritsFrom _entry;
_requiredParts = [] + (getArray (_parent >> "Upgrade" >> "requiredParts"));
_requiredTools = [] + (getArray (_parent >> "Upgrade" >> "requiredTools"));
_model = getText (_parent >> "model"); // model of parent
_displayname = getText (_entry >> "displayName"); // name of current
diag_log format["%1 - %2 - %3 - %4 - %5",_parent,_requiredParts,_requiredTools,_model,_displayname];
// check the tools needed
_toolsOK = true;
{
if (!(_x IN items player)) exitWith { _toolsOK = false; };
} count _requiredTools;
if (!_toolsOK) exitWith { format [localize "str_disassembleMissingTool",getText (configFile >> "CfgWeapons" >> _x >> "displayName"),_displayname] call dayz_rollingMessages; };
if (getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "disableWeapons") == 0) then {
player playActionNow "Medic";
_dis=20;
[player,"tentpack",0,false,20] call dayz_zombieSpeak;
[player,_dis,true,(getPosATL player)] call player_alertZombies;
//wait animation starts and block
waitUntil {getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "disableWeapons") == 1};
};
// remove object
deleteVehicle _cursorTarget;
_cursorTarget = objNull;
if (_realObjectStillThere) then { // send to server the destroy request
_realObjectStillThere = false;
_activatingPlayer = player;
PVDZ_obj_Destroy = [_objectID,_objectUID, _activatingPlayer];
publicVariableServer "PVDZ_obj_Destroy";
diag_log [diag_ticktime, __FILE__, "Networked object, request to destroy", PVDZ_obj_Destroy];
};
["Working",0,[20,40,15,0]] call dayz_NutritionSystem;
// check whether we reached the base class, for which no P3D is defined
if (count _requiredParts == 0) exitwith {
diag_log [diag_ticktime, __FILE__, "Dismantle terminated, last building deleted is:", _upgrade];
};
// create a weaponholder with dismissed parts
_whpos=player modelToWorld [2 * sin(30*_i), 2 * cos(30*_i), 0];
_whpos set [2,0];
_wh = createVehicle ["WeaponHolder", _whpos, [], 0, "CAN_COLLIDE"];
_wh setDir (30*_i);
_wh setPosATL _whpos;
{
if (isClass (configFile >> "CfgMagazines" >> _x))
then { _wh addMagazineCargoGlobal [_x, 1]; }
else { _wh addWeaponCargoGlobal [_x, 1]; };
} forEach _requiredParts;
diag_log [diag_ticktime, __FILE__, "Pile created with:", _requiredParts];
// create the parent object locally
_upgrade = configName _parent;
if (getNumber(_parent >> "scope")==2) then {
_cursorTarget = _upgrade createVehicleLocal getMarkerpos "respawn_west";
_cursorTarget setVectorDirAndUp _vector;
_cursorTarget setPosATL _pos;
};
uiSleep 1.5;
if (r_interrupt) exitwith {
diag_log [diag_ticktime, __FILE__, "Operation interrupted, last building deleted is:", _upgrade];
};
_entry = _parent;
};
// wait animation ends
waitUntil {r_interrupt or (getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "disableWeapons") == 0)};
if (r_interrupt and vehicle player == player) then {
[objNull, player, rSwitchMove,""] call RE;
player playActionNow "stop";
r_interrupt = false;
};
if (!_realObjectStillThere) then {
// current object is a local one, replace it by a networked one, with all attributes
// and request a HIVE save
if (!isNull _cursorTarget) then {
_upgrade = typeOf _cursorTarget;
deleteVehicle _cursorTarget;
if (getNumber(_parent >> "scope")==2) then {
_object = createVehicle [_upgrade, getMarkerpos "respawn_west", [], 0, "CAN_COLLIDE"];
//if (_object isKindOf "DZ_buildables") then { _object allowDamage false; };
_object setVectorDirAndUp _vector;
_object setPosATL _pos;
_puid = getPlayerUID player;
if (!(_puid in _ownerArray)) then {
_ownerArray set [ count _ownerArray, _puid ];
};
_object setVariable ["ownerArray",_ownerArray,true];
_variables = [[ "ownerArray", _ownerArray]];
_object setVariable ["characterID",_characterID,true];
PVDZ_obj_Publish = [dayz_characterID,_object,[_dir, _pos],_variables];
publicVariableServer "PVDZ_obj_Publish";
diag_log [diag_ticktime, __FILE__, "New Networked object, request to save to hive. PVDZ_obj_Publish:", PVDZ_obj_Publish];
/*
//Send maintenance info
PVDZ_veh_Save = [_object,"maintenance"];
publicVariableServer "PVDZ_veh_Save";*/
player reveal _object;
};
};
};
localize "str_disassembleDone" call dayz_rollingMessages;
_cursorTarget setVariable["ObjectLocked",0,true];