Files
DayZ-Epoch/SQF/dayz_server/compile/server_updateObject.sqf
ebaydayz 835d750c0c Use single config variable for Plot for Life and Plot Management
Plot for Life and Plot Management work best together. They essentially
provide the same functionality. Both let you keep your plot after death
by using UID instead of CharacterID. Plot Management doesn't even have
an option to save characterID, so by default it is always keeping all
friends and the owner permanently until they are removed. The only major
difference between them is Plot For Life also adds permanent ownership
of built items on the plot, which is behavior most people expect. It
doesn't make sense to keep ownership of the plot after death but not the
other objects built on it. The other functionality it adds (take
ownership) can be toggled with a config variable.

It is rare that someone would want Plot For Life enabled, but Plot
Management disabled or vice versa. If they really want that they can
still do it manually, but consolidating them to a single config option
greatly simplifies things for everyone else.

I removed links to mod githubs because many changes have been made to
the 1.0.6 versions, so outdated information there will likely confuse
people. Authors are already credited in the README and change log.

In variables.sqf "DZ_storage_base" is now the parent class which
includes all tents and stashes. DZE_checkNearbyRadius variable is not
used (identical to DZE_PlotPole select 0).
2016-06-12 12:54:46 -04:00

242 lines
7.3 KiB
Plaintext

// [_object,_type] spawn server_updateObject;
#include "\z\addons\dayz_server\compile\server_toggle_debug.hpp"
if (isNil "sm_done") exitWith {};
private ["_object","_type","_objectID","_objectUID","_lastUpdate","_needUpdate","_object_position","_object_inventory","_object_damage","_isNotOk"];
_object = _this select 0;
_type = _this select 1;
_recorddmg = false;
_isNotOk = false;
_forced = if (count _this > 2) then {_this select 2} else {false};
_objectID = "0";
_objectUID = "0";
if !((isNil "_object") or {isNull _object}) then {
_objectID = _object getVariable ["ObjectID","0"];
_objectUID = _object getVariable ["ObjectUID","0"];
};
if ((typeName _objectID == "SCALAR") || (typeName _objectUID == "SCALAR")) then {
#ifdef OBJECT_DEBUG
diag_log (format["Non-string Object: ID %1 UID %2", _objectID, _objectUID]);
#endif
//force fail
_objectID = nil;
_objectUID = nil;
};
if (!((typeOf _object) in DZE_safeVehicle) && !locked _object) then {
//diag_log format["Object: %1, ObjectID: %2, ObjectUID: %3",_object,_objectID,_objectUID];
if (!(_objectID in dayz_serverIDMonitor) && isNil {_objectUID}) then {
//force fail
_objectID = nil;
_objectUID = nil;
};
if ((isNil {_objectID}) && (isNil {_objectUID})) then {
_object_position = getPosATL _object;
#ifdef OBJECT_DEBUG
diag_log format["Object %1 with invalid ID at pos %2",typeOf _object,_object_position];
#endif
_isNotOk = true;
};
};
if (_isNotOk) exitWith {
//deleteVehicle _object;
};
_lastUpdate = _object getVariable ["lastUpdate",diag_tickTime];
_needUpdate = _object in needUpdate_objects;
// TODO ----------------------
_object_position = {
private ["_position","_worldspace","_fuel","_key"];
_position = getPosATL _object;
//_worldspace = [round (direction _object),_position];
_worldspace = [getDir _object, _position] call AN_fnc_formatWorldspace; // Precise Base Building 1.0.5
_fuel = if (_object isKindOf "AllVehicles") then {fuel _object} else {0};
_key = format["CHILD:305:%1:%2:%3:",_objectID,_worldspace,_fuel];
_key call server_hiveWrite;
#ifdef OBJECT_DEBUG
diag_log ("HIVE: WRITE: "+ str(_key));
#endif
};
_object_inventory = {
private ["_inventory","_previous","_key"];
if (_object isKindOf "TrapItems") then {
_inventory = [["armed",_object getVariable ["armed",false]]];
} else {
if (DZE_permanentPlot && (typeOf _object == "Plastic_Pole_EP1_DZ")) then {
_inventory = _object getVariable ["plotfriends", []]; //We're replacing the inventory with UIDs for this item
} else {
_inventory = [getWeaponCargo _object, getMagazineCargo _object, getBackpackCargo _object];
};
};
_previous = str(_object getVariable["lastInventory",[]]);
if (str _inventory != _previous) then {
_object setVariable["lastInventory",_inventory];
if (_objectID == "0") then {
_key = format["CHILD:309:%1:",_objectUID] + str _inventory + ":";
} else {
_key = format["CHILD:303:%1:",_objectID] + str _inventory + ":";
};
#ifdef OBJECT_DEBUG
diag_log ("HIVE: WRITE: "+ str(_key));
#endif
_key call server_hiveWrite;
};
};
_object_damage = {
//Allow dmg process
private ["_hitpoints","_array","_hit","_selection","_key","_damage","_allFixed"];
_hitpoints = _object call vehicle_getHitpoints;
_damage = damage _object;
_array = [];
_allFixed = true;
{
_hit = [_object,_x] call object_getHit;
_selection = getText (configFile >> "CfgVehicles" >> (typeOf _object) >> "HitPoints" >> _x >> "name");
if (_hit > 0) then {
_allFixed = false;
_array set [count _array,[_selection,_hit]];
//diag_log format ["Section Part: %1, Dmg: %2",_selection,_hit];
} else {
_array set [count _array,[_selection,0]];
};
} forEach _hitpoints;
if (_allFixed) then {_object setDamage 0;};
if (_forced) then {
if (_object in needUpdate_objects) then {needUpdate_objects = needUpdate_objects - [_object];};
_recorddmg = true;
} else {
//Prevent damage events for the first 10 seconds of the servers live.
if (diag_ticktime - _lastUpdate > 10) then {
if !(_object in needUpdate_objects) then {
//diag_log format["DEBUG: Monitoring: %1",_object];
needUpdate_objects set [count needUpdate_objects, _object];
_recorddmg = true;
};
};
};
if (_recorddmg) then {
if (_objectID == "0") then {
_key = format["CHILD:306:%1:",_objectUID] + str _array + ":" + str _damage + ":";
} else {
_key = format["CHILD:306:%1:",_objectID] + str _array + ":" + str _damage + ":";
};
diag_log ("HIVE: WRITE: "+ str(_key));
_key call server_hiveWrite;
};
};
//Walls
_objWallDamage = {
private "_key";
_damage = _this select 2;
_object setDamage _damage;
if (_objectID == "0") then {
_key = format["CHILD:306:%1:%2:%3:",_objectUID,[],_damage];
} else {
_key = format["CHILD:306:%1:%2:%3:",_objectID,[],_damage];
};
_key call server_hiveWrite;
};
_object_killed = {
private "_key";
_object setDamage 1;
if (_objectID == "0") then {
//Need to update hive to make a new call to allow UID to be updated for a killed event
//_key = format["CHILD:306:%1:%2:%3:",_objectUID,[],1];
_key = format["CHILD:310:%1:",_objectUID];
} else {
_key = format["CHILD:306:%1:%2:%3:",_objectID,[],1];
};
_key call server_hiveWrite;
diag_log ("HIVE: WRITE: "+ str(_key));
if (((typeOf _object) in DayZ_removableObjects) or ((typeOf _object) in DZE_isRemovable)) then {[_objectID,_objectUID] call server_deleteObj;};
};
_object_maintenance = {
private ["_ownerArray","_key"];
_ownerArray = _object getVariable ["ownerArray",[]];
_accessArray = _object getVariable ["dayz_padlockCombination",[]];
_variables set [count _variables, ["ownerArray", _ownerArray]];
_variables set [count _variables, ["padlockCombination", _accessArray]];
if (_objectID == "0") then {
_key = format["CHILD:309:%1:%2:",_objectUID,_ownerArray];
_key = format["CHILD:306:%1:%2:%3:",_objectUID,[],0]; //Wont work just now.
} else {
_key = format["CHILD:303:%1:%2:",_objectID,_ownerArray];
_key = format["CHILD:306:%1:%2:%3:",_objectID,[],0];
};
// #ifdef OBJECT_DEBUG
diag_log ("HIVE: WRITE: Maintenance, "+ str(_key));
// #endif
_key call server_hiveWrite;
};
_object_variables = {
private ["_ownerArray","_key","_accessArray","_variables"];
_ownerArray = _object getVariable ["ownerArray",[]];
_accessArray = _object getVariable ["dayz_padlockCombination",[]];
_lockedArray = _object getVariable ["BuildLock",false];
//diag_log format ["[%1,%2]",_ownerArray,_accessArray];
_variables = [];
_variables set [count _variables, ["ownerArray", _ownerArray]];
_variables set [count _variables, ["padlockCombination", _accessArray]];
_variables set [count _variables, ["BuildLock", _lockedArray]];
if (_objectID == "0") then {
_key = format["CHILD:309:%1:%2:",_objectUID,_variables];
} else {
_key = format["CHILD:303:%1:%2:",_objectID,_variables];
};
_key call server_hiveWrite;
};
_object setVariable ["lastUpdate",diag_ticktime,true];
switch (_type) do {
case "all": {
call _object_position;
call _object_inventory;
call _object_damage;
};
case "position": {
call _object_position;
};
case "gear": {
call _object_inventory;
};
case "maintenance": {
call _object_maintenance;
};
case "damage"; case "repair" : {
call _object_damage;
};
case "killed": {
call _object_killed;
};
case "accessCode"; case "buildLock" : {
call _object_variables;
};
case "objWallDamage": {
call _objWallDamage;
};
};