diff --git a/CHANGE LOG 1.0.6.txt b/CHANGE LOG 1.0.6.txt index 6941d4f5a..87903b884 100644 --- a/CHANGE LOG 1.0.6.txt +++ b/CHANGE LOG 1.0.6.txt @@ -49,6 +49,7 @@ [FIXED] Keyboard input is now disabled properly while unconscious @skynetdev @ebaydayz #1613 [FIXED] Toilet paper dupe exploit when building outhouse @Markokil321 @ebaydayz #1599 [FIXED] Safes and lockboxes wiped when opening after restart and locking not being logged to RPT @ebaydayz #1413 #1503 +[FIXED] Duplicate objectUIDs occasionally causing vehicles to swap classes or be deleted across restarts @ebaydayz #1504 [UPDATED] .hpp files updated in dayz_epoch_b CfgLootPos > CfgBuildingPos. @Uro1 [UPDATED] .bat files updated in Config-Examples @Raziel23x diff --git a/SQF/dayz_server/compile/server_publishVehicle.sqf b/SQF/dayz_server/compile/server_publishVehicle.sqf index 69fefa99d..9036d85f7 100644 --- a/SQF/dayz_server/compile/server_publishVehicle.sqf +++ b/SQF/dayz_server/compile/server_publishVehicle.sqf @@ -49,8 +49,6 @@ if (_spawnDMG) then { }; }; -// TODO: check if uid already exists && if so increment by 1 && check again as soon as we find nothing continue. - //Send request _key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, _damage , _characterID, _worldspace, [], _array, _fuel,_uid]; diag_log ("HIVE: WRITE: "+ str(_key)); diff --git a/SQF/dayz_server/compile/server_publishVehicle2.sqf b/SQF/dayz_server/compile/server_publishVehicle2.sqf index 97428ee6b..f509f02c7 100644 --- a/SQF/dayz_server/compile/server_publishVehicle2.sqf +++ b/SQF/dayz_server/compile/server_publishVehicle2.sqf @@ -28,8 +28,6 @@ _location = _worldspace select 1; //Generate UID test using time _uid = _worldspace call dayz_objectUID3; -// TODO: check if uid already exists && if so increment by 1 && check again as soon as we find nothing continue. - //Send request _key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, 0 , _characterID, _worldspace, [], [], 1,_uid]; diag_log ("HIVE: WRITE: "+ str(_key)); diff --git a/SQF/dayz_server/init/server_functions.sqf b/SQF/dayz_server/init/server_functions.sqf index e3adac5be..a2e6e0195 100644 --- a/SQF/dayz_server/init/server_functions.sqf +++ b/SQF/dayz_server/init/server_functions.sqf @@ -579,6 +579,9 @@ server_getDiff2 = { _result }; +currentObjectUIDs = []; +keyStartNumber = 100000000000; + dayz_objectUID = { private["_position","_dir","_key","_object"]; _object = _this; @@ -599,6 +602,12 @@ dayz_objectUID2 = { _key = _key + str(round(_x)); } count _position; _key = _key + str(round(_dir)); + // Make sure the generated key is not a duplicate + while {true} do { + if !(_key in currentObjectUIDs) exitWith {currentObjectUIDs set [count currentObjectUIDs,_key];}; + keyStartNumber = keyStartNumber + 1; + _key = str keyStartNumber; + }; _key }; @@ -613,6 +622,12 @@ dayz_objectUID3 = { _key = _key + str(round(_x)); } count _position; _key = _key + str(round(_dir + time)); + // Make sure the generated key is not a duplicate + while {true} do { + if !(_key in currentObjectUIDs) exitWith {currentObjectUIDs set [count currentObjectUIDs,_key];}; + keyStartNumber = keyStartNumber + 1; + _key = str keyStartNumber; + }; _key }; diff --git a/SQF/dayz_server/system/server_monitor.sqf b/SQF/dayz_server/system/server_monitor.sqf index 7e630826c..ee9f0f809 100644 --- a/SQF/dayz_server/system/server_monitor.sqf +++ b/SQF/dayz_server/system/server_monitor.sqf @@ -96,6 +96,9 @@ if (isServer && isNil "sm_done") then { _fuel = _x select 7; _damage = _x select 8; + // Set objectUIDs in currentObjectUIDs list to prevent duplicates + if (_type in dayz_allowedObjects) then {_worldspace call dayz_objectUID2;} else {_worldspace call dayz_objectUID3;}; + _dir = 0; _pos = [0,0,0]; _wsDone = false;