Greatly optimize safe gear handling

- Safe inventory arrays are no longer sent over network to all machines
on server startup and on each lock/unlock
- Disabled user input then closed gear dialog during safe
lock/unlock/pack to block various duping methods.
- Moved safe creation, deletion and gear handling to server. This cuts
down on add[Magazine/Weapon/Backpack]Cargo, createVehicle and
deleteVehicle BE logs.
This commit is contained in:
ebaydayz
2016-08-10 20:33:48 -04:00
parent f186e256cb
commit 72656ed001
12 changed files with 225 additions and 238 deletions

View File

@@ -0,0 +1,48 @@
/*
Adds cargo to an object
Parameters:
_this select 0: array - weapon cargo to add
_this select 1: array - magazine cargo to add
_this select 2: array - backpack cargo to add
_this select 3: object - object to add cargo to
*/
private ["_weapons","_magazines","_backpacks","_holder","_objWpnTypes","_objWpnQty","_counter"];
_weapons = _this select 0;
_magazines = _this select 1;
_backpacks = _this select 2;
_holder = _this select 3;
if (count _weapons > 0) then {
_objWpnTypes = _weapons select 0;
_objWpnQty = _weapons select 1;
_counter = 0;
{
_holder addWeaponCargoGlobal [_x,(_objWpnQty select _counter)];
_counter = _counter + 1;
} count _objWpnTypes;
};
if (count _magazines > 0) then {
_objWpnTypes = _magazines select 0;
_objWpnQty = _magazines select 1;
_counter = 0;
{
if (_x != "CSGAS") then {
_holder addMagazineCargoGlobal [_x,(_objWpnQty select _counter)];
_counter = _counter + 1;
};
} count _objWpnTypes;
};
if (count _backpacks > 0) then {
_objWpnTypes = _backpacks select 0;
_objWpnQty = _backpacks select 1;
_counter = 0;
{
_holder addBackpackCargoGlobal [_x,(_objWpnQty select _counter)];
_counter = _counter + 1;
} count _objWpnTypes;
};

View File

@@ -0,0 +1,106 @@
private ["_player","_obj","_objectID","_objectUID","_statusText","_puid","_status","_clientID","_type","_lockedClass","_unlockedClass","_packedClass",
"_name","_pos","_dir","_vector","_charID","_ownerID","_weapons","_magazines","_backpacks","_holder"];
_player = _this select 0;
_obj = _this select 1;
_status = _this select 2;
_name = if (alive _player) then {name _player} else {"Dead Player"};
_type = typeOf _obj;
_pos = _obj getVariable ["OEMPos",getPosATL _obj];
_dir = direction _obj;
_vector = [vectorDir _obj, vectorUp _obj];
_charID = _obj getVariable ["CharacterID","0"];
_objectID = _obj getVariable ["ObjectID","0"];
_objectUID = _obj getVariable ["ObjectUID","0"];
_ownerID = _obj getVariable ["ownerPUID","0"];
// Player may have disconnected or died before message send. Attempt lock/unlock/pack/save procedure anyway
if (isNull _player) then {diag_log "ERROR: server_handleSafeGear called with Null player object";};
_clientID = owner _player;
_puid = [_player] call FNC_GetPlayerUID;
_statusText = switch (_status) do {
case 0: {"UNLOCKED"};
case 1: {"LOCKED"};
case 2: {"PACKED"};
};
if (isNull _obj) exitWith {
diag_log format["ERROR: server_handleSafeGear called with Null safe object by %1(%2). %3 attempt failed.",_name,_puid,_statusText];
dze_waiting = "fail";
_clientID publicVariableClient "dze_waiting";
};
switch (_status) do {
case 0: { //Unlocking
_unlockedClass = getText (configFile >> "CfgVehicles" >> _type >> "unlockedClass");
_weapons = _obj getVariable ["WeaponCargo",[]];
_magazines = _obj getVariable ["MagazineCargo",[]];
_backpacks = _obj getVariable ["BackpackCargo",[]];
// Create new unlocked safe, then delete old locked safe
_holder = createVehicle [_unlockedClass,_pos,[],0,"CAN_COLLIDE"];
_holder setDir _dir;
_holder setVariable ["memDir",_dir,true];
_holder setVectorDirAndUp _vector;
_holder setPosATL _pos;
_holder setVariable ["CharacterID",_charID,true];
_holder setVariable ["ObjectID",_objectID,true];
_holder setVariable ["ObjectUID",_objectUID,true];
_holder setVariable ["OEMPos",_pos,true];
if (DZE_permanentPlot) then {_holder setVariable ["ownerPUID",_ownerID ,true];};
deleteVehicle _obj;
[_weapons,_magazines,_backpacks,_holder] call server_addCargo;
};
case 1: { //Locking
_lockedClass = getText (configFile >> "CfgVehicles" >> _type >> "lockedClass");
// Save old unlocked safe's gear to database
[_obj,"gear"] call server_updateObject;
_weapons = getWeaponCargo _obj;
_magazines = getMagazineCargo _obj;
_backpacks = getBackpackCargo _obj;
// Create new locked safe, then delete old unlocked safe
_holder = createVehicle [_lockedClass,_pos,[],0,"CAN_COLLIDE"];
_holder setDir _dir;
_holder setVariable ["memDir",_dir,true];
_holder setVectorDirAndUp _vector;
_holder setPosATL _pos;
_holder setVariable ["CharacterID",_charID,true];
_holder setVariable ["ObjectID",_objectID,true];
_holder setVariable ["ObjectUID",_objectUID,true];
_holder setVariable ["OEMPos",_pos,true];
if (DZE_permanentPlot) then {_holder setVariable ["ownerPUID",_ownerID,true];};
deleteVehicle _obj;
// Local setVariable gear onto new locked safe for easy access on next unlock
// Do not send big arrays over network! Only server needs these
_holder setVariable ["WeaponCargo",_weapons,false];
_holder setVariable ["MagazineCargo",_magazines,false];
_holder setVariable ["BackpackCargo",_backpacks,false];
};
case 2: { //Packing
_packedClass = getText (configFile >> "CfgVehicles" >> _type >> "packedClass");
_weapons = getWeaponCargo _obj;
_magazines = getMagazineCargo _obj;
_backpacks = getBackpackCargo _obj;
_holder = createVehicle [_packedClass,_pos,[],0,"CAN_COLLIDE"];
deleteVehicle _obj;
_holder setDir _dir;
_holder setPosATL _pos;
_holder addMagazineCargoGlobal [getText(configFile >> "CfgVehicles" >> _packedClass >> "seedItem"),1];
[_weapons,_magazines,_backpacks,_holder] call server_addCargo;
// Delete safe from database
[_objectID,_objectUID,_player] call server_deleteObj;
};
};
diag_log format["%6 %5: ID:%1 CID:%7 UID:%2 BY %3(%4)",_objectID,_objectUID,_name,_puid,_statusText,_type,_charID];
dze_waiting = "success";
_clientID publicVariableClient "dze_waiting";

View File

@@ -1,26 +0,0 @@
private ["_player","_obj","_objectID","_objectUID","_statusText","_puid","_status","_clientID","_type"];
_player = _this select 0;
_obj = _this select 1;
_status = _this select 2;
_type = typeOf _obj;
if (isNull _player) then {diag_log "ERROR: server_logUnlockLockEvent called with Null player object";};
_clientID = owner _player;
_puid = [_player] call FNC_GetPlayerUID;
_statusText = if (_status) then {"LOCKED"} else {"UNLOCKED"};
if (!isNull _obj) then {
_objectID = _obj getVariable ["ObjectID","0"];
_objectUID = _obj getVariable ["ObjectUID","0"];
if (_status) then {[_obj,"gear"] call server_updateObject;};
diag_log format["%6 %5: ID:%1 UID:%2 BY %3(%4)",_objectID,_objectUID,name _player,_puid,_statusText,_type];
dze_waiting = "success";
_clientID publicVariableClient "dze_waiting";
} else {
diag_log format["ERROR: %4 BY %1(%2) IS NULL AND COULD NOT BE %3 (THIS SHOULD NOT HAPPEN)",name _player,_puid,_statusText,_type];
dze_waiting = "fail";
_clientID publicVariableClient "dze_waiting";
};

View File

@@ -31,6 +31,7 @@ spawnComposition = compile preprocessFileLineNumbers "ca\modules\dyno\data\scrip
server_sendToClient = compile preprocessFileLineNumbers "\z\addons\dayz_server\eventHandlers\server_sendToClient.sqf";
// EPOCH ADDITIONS
server_addCargo = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_addCargo.sqf";
server_swapObject = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_swapObject.sqf"; //Used to downgrade and upgrade Epoch buildables
server_publishVeh = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishVehicle.sqf"; //Used to spawn random vehicles by server
server_publishVeh2 = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishVehicle2.sqf"; //Used to purchase vehicles at traders
@@ -41,7 +42,7 @@ server_spawnEvents = compile preprocessFileLineNumbers "\z\addons\dayz_server\co
server_deaths = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerDeaths.sqf";
server_maintainArea = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_maintainArea.sqf";
server_checkIfTowed = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_checkIfTowed.sqf";
server_logUnlockLockEvent = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_logUnlockLockEvent.sqf";
server_handleSafeGear = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_handleSafeGear.sqf";
spawn_ammosupply = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\spawn_ammosupply.sqf";
spawn_mineveins = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\spawn_mineveins.sqf";
spawn_roadblocks = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\spawn_roadblocks.sqf";

View File

@@ -238,9 +238,10 @@ _respawnPos = getMarkerpos "respawn_west";
clearBackpackCargoGlobal _object;
if( (count _inventory > 0) && !_isPlot && !_doorLocked ) then {
if (_type in DZE_LockedStorage) then {
_object setVariable ["WeaponCargo",(_inventory select 0),true];
_object setVariable ["MagazineCargo",(_inventory select 1),true];
_object setVariable ["BackpackCargo",(_inventory select 2),true];
// Do not send big arrays over network! Only server needs these
_object setVariable ["WeaponCargo",(_inventory select 0),false];
_object setVariable ["MagazineCargo",(_inventory select 1),false];
_object setVariable ["BackpackCargo",(_inventory select 2),false];
} else {
_cargo = _inventory;
_config = ["CfgWeapons","CfgMagazines","CfgVehicles"];