diff --git a/SQF/dayz_code/compile/fence_handleDam.sqf b/SQF/dayz_code/compile/fence_handleDam.sqf index d5f10e7af..e77590a98 100644 --- a/SQF/dayz_code/compile/fence_handleDam.sqf +++ b/SQF/dayz_code/compile/fence_handleDam.sqf @@ -80,29 +80,26 @@ _damage = switch (1==1) do { }; //Just incase damage from melee is 0 (higher tier fences have no melee damage) we return false -if (_damage == 0) then { _damage = false; }; +//if (_damage == 0) then { _damage = false; }; -/* - //Server running or client +//Server running or client +if (_damage > 0) then { if (isServer) then { - if !(_obj in needUpdate_FenceObjects) then { - needUpdate_FenceObjects set [count needUpdate_FenceObjects, _obj]; - }; - - //TotalDamage Set by the server - _obj setDamage (damage _obj) + _damage; + [_obj,(damage _obj) + _damage,"SERVER",dayz_serverKey] call server_addtoFenceUpdateArray; //diag_log format["Server Reporting - %1",needUpdate_FenceObjects]; } else { //If its a client send to server for saving and damage setting. - PVDZ_fence_Update = [_obj,(damage _obj) + _damage]; + PVDZ_fence_Update = [_obj,(damage _obj) + _damage,dayz_playerUID,dayz_authKey]; publicVariableServer "PVDZ_fence_Update"; //diag_log ("Client Reporting"); }; -*/ +}; + diag_log format["Object: %1, Damage:%4 + %5(%2), Projectile:%3",(typeof _obj),((damage _obj) + _damage),((_this select 0) select 4),(damage _obj),_damage]; // all "HandleDamage event" functions should return the effective damage that the engine will record for that part -(damage _obj) + _damage \ No newline at end of file +//(damage _obj) + _damage +false \ No newline at end of file diff --git a/SQF/dayz_server/compile/server_updateObject.sqf b/SQF/dayz_server/compile/server_updateObject.sqf index 6ae9ca8d5..1032b35b7 100644 --- a/SQF/dayz_server/compile/server_updateObject.sqf +++ b/SQF/dayz_server/compile/server_updateObject.sqf @@ -231,6 +231,8 @@ _object_maintenance = { _accessArray = _object getVariable ["dayz_padlockCombination",[]]; _variables set [count _variables, ["ownerArray", _ownerArray]]; _variables set [count _variables, ["padlockCombination", _accessArray]]; + + _object setDamage 0; if (_objectID == "0") then { //_key = format["CHILD:309:%1:%2:",_objectUID,_ownerArray]; diff --git a/SQF/dayz_server/init/server_functions.sqf b/SQF/dayz_server/init/server_functions.sqf index 3614618dc..24532cbaf 100644 --- a/SQF/dayz_server/init/server_functions.sqf +++ b/SQF/dayz_server/init/server_functions.sqf @@ -86,23 +86,47 @@ dayz_Achievements = { //Send fences to this array to be synced to db, should prove to be better performaince wise rather then updaing each time they take damage. server_addtoFenceUpdateArray = { - //Potential problem no current way to say what is setting the damage. - if ((_this select 0) isKindOf "DZ_buildables") then { - (_this select 0) setDamage (_this select 1); + private ["_class","_clientKey","_damage","_exitReason","_index","_object","_playerUID"]; + _object = _this select 0; + _damage = _this select 1; + _playerUID = _this select 2; + _clientKey = _this select 3; + _index = dayz_serverPUIDArray find _playerUID; + _class = typeOf _object; - if !((_this select 0) in needUpdate_FenceObjects) then { - needUpdate_FenceObjects set [count needUpdate_FenceObjects, (_this select 0)]; + _exitReason = switch true do { + //Can't use owner because player may already be dead, can't use distance because player may be far from fence + case (_clientKey == dayz_serverKey): {""}; + case (_index < 0): { + format["Server_AddToFenceUpdateArray error: PUID NOT FOUND ON SERVER. PV ARRAY: %1",_this] + }; + case ((dayz_serverClientKeys select _index) select 1 != _clientKey): { + format["Server_AddToFenceUpdateArray error: CLIENT AUTH KEY INCORRECT OR UNRECOGNIZED. PV ARRAY: %1",_this] + }; + case !(_class isKindOf "DZ_buildables"): { + format["Server_AddToFenceUpdateArray error: setDamage request on non DZ_buildable. PV ARRAY: %1",_this] + }; + default {""}; + }; + + if (_exitReason != "") exitWith {diag_log _exitReason}; + + _object setDamage _damage; + + if !(_object in needUpdate_FenceObjects) then { + needUpdate_FenceObjects set [count needUpdate_FenceObjects, _object]; + if (_playerUID != "SERVER") then { + diag_log format["DAMAGE: PUID(%1) requested setDamage %2 on fence %3 ID:%4 UID:%5",_playerUID,_damage,_class,(_object getVariable["ObjectID","0"]),(_object getVariable["ObjectUID","0"])]; }; }; }; - vehicle_handleServerKilled = { private ["_unit","_killer"]; _unit = _this select 0; _killer = _this select 1; - [_unit,"killed",false,false,"SERVER",dayz_serverKey] call server_updateObject; + [_unit,"killed",false,false,"SERVER",dayz_serverKey] call server_updateObject; _unit removeAllMPEventHandlers "MPKilled"; _unit removeAllEventHandlers "Killed"; _unit removeAllEventHandlers "HandleDamage";