/
server_handleSafeGear.sqf
180 lines (155 loc) · 7.16 KB
/
server_handleSafeGear.sqf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
private ["_backpacks","_charID","_clientID","_dir","_holder","_lockCode","_lockColor","_lockedClass","_magazines","_name","_obj","_objectID","_objectUID","_ownerID","_packedClass","_player","_playerUID","_pos","_status","_statusText","_type","_unlockedClass","_vector","_weapons","_message","_suppliedCode","_fnc_lockCode","_coins","_wealth"];
_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"];
_lockCode = _charID;
if (count _this > 3) then {
_suppliedCode = _this select 3;
if (_status != 3 && {_status != 6}) then {_lockCode = _suppliedCode;};
};
// 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;
_playerUID = getPlayerUID _player;
_statusText = switch (_status) do {
case 0: {"UNLOCKED"}; // unlock safe/lockbox
case 1: {"LOCKED"}; // lock safe/lockbox
case 2: {"PACKED"}; // pack safe/lockbox
case 3: {"FAILED unlocking"}; // failed unlock safe/lockbox
case 4: {"LOCKED"}; // lock door
case 5: {"UNLOCKED"}; // unlock door
case 6: {"FAILED unlocking"}; // failed unlocking door
};
if (isNull _obj) exitWith {
diag_log format["ERROR: server_handleSafeGear called with Null object by %1 (%2). %3 attempt failed.",_name,_playerUID,_statusText];
if (_status < 3) then {
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",[]];
if (Z_singleCurrency) then {_coins = _obj getVariable [Z_MoneyVariable,0];};
// Create new unlocked safe, then delete old locked safe
//_holder = createVehicle [_unlockedClass,_pos,[],0,"CAN_COLLIDE"];
_holder = _unlockedClass createVehicle [0,0,0];
_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];};
if (Z_singleCurrency) then {_holder setVariable [Z_MoneyVariable,_coins,true];};
deleteVehicle _obj;
[_weapons,_magazines,_backpacks,_holder] call fn_addCargo;
if (_charID in ["0000","10000"]) then {
RemoteMessage = ["systemChat",["STR_CL_ZSC_COMBO_RESET",getText (configFile >> "CfgVehicles" >> _unlockedClass >> "displayName"),if (_unlockedClass == "VaultStorage") then {"0000"} else {"RED00"}]];
(owner _player) publicVariableClient "RemoteMessage";
};
};
case 1: { //Locking
_lockedClass = getText (configFile >> "CfgVehicles" >> _type >> "lockedClass");
// Save to database (also happens if a player is within 10m in server_playerSync and server_onPlayerDisconnect)
[_obj,"gear"] call server_updateObject;
_weapons = getWeaponCargo _obj;
_magazines = getMagazineCargo _obj;
_backpacks = getBackpackCargo _obj;
if (Z_singleCurrency) then {_coins = _obj getVariable [Z_MoneyVariable,0];};
// Create new locked safe, then delete old unlocked safe
//_holder = createVehicle [_lockedClass,_pos,[],0,"CAN_COLLIDE"];
_holder = _lockedClass createVehicle [0,0,0];
_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];};
if (Z_singleCurrency) then {_holder setVariable [Z_MoneyVariable,_coins,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");
if (_packedClass == "") exitWith {diag_log format["Server_HandleSafeGear Error: invalid object type: %1",_type];};
_weapons = getWeaponCargo _obj;
_magazines = getMagazineCargo _obj;
_backpacks = getBackpackCargo _obj;
if (Z_singleCurrency) then {_coins = _obj getVariable [Z_MoneyVariable,0];};
//_holder = createVehicle [_packedClass,_pos,[],0,"CAN_COLLIDE"];
_holder = _packedClass createVehicle [0,0,0];
deleteVehicle _obj;
_holder setDir _dir;
_holder setPosATL _pos;
_holder addMagazineCargoGlobal [getText(configFile >> "CfgVehicles" >> _packedClass >> "seedItem"),1];
[_weapons,_magazines,_backpacks,_holder] call fn_addCargo;
if (Z_singleCurrency && {_coins > 0}) then {
_wealth = _player getVariable [Z_MoneyVariable,0];
_player setVariable [Z_MoneyVariable,_wealth + _coins,true];
RemoteMessage = ["systemChat",["STR_CL_ZSC_PACK_WARNING",_type,[_coins] call BIS_fnc_numberText,CurrencyName]];
(owner _player) publicVariableClient "RemoteMessage";
};
// Delete safe from database
[_objectID,_objectUID] call server_deleteObjDirect;
};
};
_fnc_lockCode = {
private ["_color","_code"];
if (_this == "") exitWith {0};
_code = if (typeName _this == "STRING") then {parseNumber _this} else {_this};
if (_code < 10000 || {_code > 10299}) exitWith {0};
_color = "";
_code = _code - 10000;
if (_code <= 99) then {_color = "Red";};
if (_code >= 100 && _code <= 199) then {_color = "Green"; _code = _code - 100;};
if (_code >= 200) then {_color = "Blue"; _code = _code - 200;};
if (_code <= 9) then {_code = format["0%1", _code];};
_code = format ["%1%2",_color,_code];
_code
};
if (_status < 4) then {
_type = switch _type do {
case "VaultStorage";
case "VaultStorageLocked": {
"Safe"
};
case "LockboxStorage";
case "LockboxStorageLocked": {
_lockCode = _charID call _fnc_lockCode;
if (_status == 3) then {_suppliedCode = _suppliedCode call _fnc_lockCode;};
"LockBox"
};
};
};
if (_statusText == "FAILED unlocking") then {
_message = format["%1 (%2) %3 %4 with code: %5 (actual: %8) @%6 %7",_name,_playerUID,_statusText,_type,_suppliedCode,mapGridPosition _pos,_pos,_lockCode];
} else {
_message = format["%1 (%2) %3 %4 with code: %5 @%6 %7",_name,_playerUID,_statusText,_type,_lockCode,mapGridPosition _pos,_pos];
};
diag_log _message;
if (_status < 3) then {
dze_waiting = "success";
_clientID publicVariableClient "dze_waiting";
};