diff --git a/CHANGE LOG 1.0.6.2.txt b/CHANGE LOG 1.0.6.2.txt index 682076475..6f123cb12 100644 --- a/CHANGE LOG 1.0.6.2.txt +++ b/CHANGE LOG 1.0.6.2.txt @@ -67,4 +67,5 @@ [NEW] Added temporary check for mission file overwrite exploit. This can be removed after Bohemia patches it. [INFO] HiveExt.dll has been updated to return character_data duration in the 101 call for the dayz_survived stat. Source is available at github.com/vbawol/DayZhiveEpoch/pull/13 @icomrade +[INFO] HiveExt.dll REQUIRES NEW PROCEDURE BE ADDED TO YOUR DATABASE, SEE 1.0.6.2_UPDATES.SQL! [REQUIRED BY IMPROVED VEHICLE/OBJECT SPAWNING LOGIC] [INFO] See Documents\CHANGE LOG 1.0.6.txt for the full list of 1.0.5.1 --> 1.0.6 changes. diff --git a/SQF/dayz_server/compile/server_publishVehicle.sqf b/SQF/dayz_server/compile/server_publishVehicle.sqf index 928a47750..7bc955167 100644 --- a/SQF/dayz_server/compile/server_publishVehicle.sqf +++ b/SQF/dayz_server/compile/server_publishVehicle.sqf @@ -1,4 +1,4 @@ -private ["_object","_worldspace","_location","_dir","_class","_uid","_dam","_hitpoints","_selection","_array","_damage","_fuel","_key","_totaldam","_spawnDMG","_characterID"]; +private ["_object","_worldspace","_location","_dir","_class","_uid","_dam","_hitpoints","_selection","_array","_damage","_fuel","_key","_totaldam","_spawnDMG","_characterID","_result","_outcome","_oid"]; //[_veh,[_dir,_location],"V3S_Civ",true] #include "\z\addons\dayz_server\compile\server_toggle_debug.hpp" @@ -18,112 +18,75 @@ diag_log ("PUBLISH: Attempt " + str(_object)); _dir = _worldspace select 0; _location = _worldspace select 1; - -//Generate UID test using time -// _uid = str( round (dateToNumber date)) + str(round time); _uid = _worldspace call dayz_objectUID2; -//_uid = format["%1%2",(round time),_uid]; if (_spawnDMG) then { _fuel = 0; if (getNumber(configFile >> "CfgVehicles" >> _class >> "isBicycle") != 1) then { - - // Create randomly damaged parts - _totaldam = 0; _hitpoints = _object call vehicle_getHitpoints; { - // generate damage on all parts _dam = call generate_new_damage; - _selection = getText(configFile >> "cfgVehicles" >> _class >> "HitPoints" >> _x >> "name"); - if (_dam > 0) then { _array set [count _array,[_selection,_dam]]; _totaldam = _totaldam + _dam; }; } count _hitpoints; - - - // just set low base dmg - may change later _damage = 0; - - // New fuel min max _fuel = (random(DynamicVehicleFuelHigh-DynamicVehicleFuelLow)+DynamicVehicleFuelLow) / 100; - }; }; -//Send request _key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, _damage , _characterID, _worldspace, [], _array, _fuel,_uid]; + #ifdef OBJECT_DEBUG diag_log ("HIVE: WRITE: "+ str(_key)); #endif + _key call server_hiveWrite; dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; -// Switched to spawn so we can wait a bit for the ID -[_object,_uid,_fuel,_damage,_array,_characterID,_class] spawn { - private["_object","_uid","_fuel","_damage","_array","_characterID","_done","_retry","_key","_result","_outcome","_oid","_selection","_dam","_class"]; +// GET DB ID +_key = format["CHILD:388:%1:",_uid]; - _object = _this select 0; - _uid = _this select 1; - _fuel = _this select 2; - _damage = _this select 3; - _array = _this select 4; - _characterID = _this select 5; - _class = _this select 6; +#ifdef OBJECT_DEBUG +diag_log ("HIVE: WRITE: "+ str(_key)); +#endif - _done = false; - _retry = 0; - // TODO: Needs major overhaul - while {_retry < 10} do { - // GET DB ID - _key = format["CHILD:388:%1:",_uid]; - #ifdef OBJECT_DEBUG - diag_log ("HIVE: WRITE: "+ str(_key)); - #endif - _result = _key call server_hiveReadWrite; - _outcome = _result select 0; - if (_outcome == "PASS") then { - _oid = _result select 1; - _object setVariable ["ObjectID", _oid, true]; - #ifdef OBJECT_DEBUG - diag_log("CUSTOM: Selected " + str(_oid)); - #endif - _done = true; - _retry = 100; - } else { - diag_log("CUSTOM: trying again to get id for: " + str(_uid)); - _done = false; - _retry = _retry + 1; - uiSleep 1; - }; - }; - if(!_done) exitWith { deleteVehicle _object; diag_log("CUSTOM: failed to get id for : " + str(_uid)); }; +_result = _key call server_hiveReadWrite; +_outcome = _result select 0; + +if (_outcome != "PASS") then { + deleteVehicle _object; + diag_log("CUSTOM: failed to get id for : " + str(_uid)); +} else { + _oid = _result select 1; + _object setVariable ["ObjectID", _oid, true]; + + #ifdef OBJECT_DEBUG + diag_log("CUSTOM: Selected " + str(_oid)); + #endif _object setVariable ["lastUpdate",diag_tickTime]; _object setVariable ["CharacterID", _characterID, true]; _object setDamage _damage; - // Set Hits after ObjectID is set { _selection = _x select 0; _dam = _x select 1; if (_selection in dayZ_explosiveParts && _dam > 0.8) then {_dam = 0.8}; [_object,_selection,_dam] call fnc_veh_setFixServer; } count _array; - - _object setFuel _fuel; - - _object setvelocity [0,0,1]; + _object setFuel _fuel; + _object setvelocity [0,0,1]; _object call fnc_veh_ResetEH; - // testing - should make sure everyone has eventhandlers for vehicles was unused... PVDZE_veh_Init = _object; publicVariable "PVDZE_veh_Init"; diag_log ("PUBLISH: Created " + (_class) + " with ID " + str(_uid)); }; + diff --git a/SQF/dayz_server/compile/server_publishVehicle2.sqf b/SQF/dayz_server/compile/server_publishVehicle2.sqf index f2a88b817..e89fdf68f 100644 --- a/SQF/dayz_server/compile/server_publishVehicle2.sqf +++ b/SQF/dayz_server/compile/server_publishVehicle2.sqf @@ -1,4 +1,4 @@ -private ["_activatingPlayer","_isOK","_worldspace","_location","_dir","_class","_uid","_key","_keySelected","_characterID","_donotusekey"]; +private ["_activatingPlayer","_isOK","_worldspace","_location","_dir","_class","_uid","_key","_keySelected","_characterID","_donotusekey","_object","_result","_outcome","_oid","_object_para"]; //PVDZE_veh_Publish2 = [[_dir,_location],_part_out,false,_keySelected,_activatingPlayer]; #include "\z\addons\dayz_server\compile\server_toggle_debug.hpp" @@ -14,7 +14,7 @@ if(_donotusekey) then { _isOK = isClass(configFile >> "CfgWeapons" >> _keySelected); }; -if(!_isOK) exitWith { diag_log ("HIVE: CARKEY DOES NOT EXIST: "+ str(_keySelected)); }; +if(!_isOK) exitWith {diag_log ("HIVE: CARKEY DOES NOT EXIST: "+ str(_keySelected));}; if(_donotusekey) then { _characterID = _keySelected; @@ -26,7 +26,6 @@ _dir = _worldspace select 0; _location = _worldspace select 1; _uid = _worldspace call dayz_objectUID2; -//Send request _key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, 0 , _characterID, _worldspace, [], [], 1,_uid]; #ifdef OBJECT_DEBUG @@ -35,57 +34,29 @@ diag_log ("HIVE: WRITE: "+ str(_key)); _key call server_hiveWrite; -// Switched to spawn so we can wait a bit for the ID -[_uid,_characterID,_class,_dir,_location,_donotusekey,_activatingPlayer] spawn { - private ["_object","_uid","_characterID","_done","_retry","_key","_result","_outcome","_oid","_class","_location","_object_para","_donotusekey","_activatingPlayer"]; +_key = format["CHILD:388:%1:",_uid]; - _uid = _this select 0; - _characterID = _this select 1; - _class = _this select 2; - //_dir = _this select 3; - _location = _this select 4; - _donotusekey = _this select 5; - _activatingPlayer = _this select 6; +#ifdef OBJECT_DEBUG +diag_log ("HIVE: WRITE: "+ str(_key)); +#endif - _done = false; - _retry = 0; - // TODO: Needs major overhaul for 1.1 - while {_retry < 10} do { - // GET DB ID - _key = format["CHILD:388:%1:",_uid]; - #ifdef OBJECT_DEBUG - diag_log ("HIVE: WRITE: "+ str(_key)); - #endif - - _result = _key call server_hiveReadWrite; - _outcome = _result select 0; - if (_outcome == "PASS") then { - _oid = _result select 1; - #ifdef OBJECT_DEBUG - diag_log("CUSTOM: Selected " + str(_oid)); - #endif - - _done = true; - _retry = 100; +_result = _key call server_hiveReadWrite; +_outcome = _result select 0; - } else { - diag_log("CUSTOM: trying again to get id for: " + str(_uid)); - _done = false; - _retry = _retry + 1; - uiSleep 1; - }; - }; +if (_outcome != "PASS") then { + diag_log("CUSTOM: failed to get id for : " + str(_uid)); +} else { + _oid = _result select 1; - if(!_done) exitWith { diag_log("CUSTOM: failed to get id for : " + str(_uid)); }; + #ifdef OBJECT_DEBUG + diag_log("CUSTOM: Selected " + str(_oid)); + #endif if(DZE_TRADER_SPAWNMODE) then { - //_object_para = createVehicle ["ParachuteMediumWest", [0,0,0], [], 0, "CAN_COLLIDE"]; _object_para = "ParachuteMediumWest" createVehicle [0,0,0]; _object_para setPos [_location select 0, _location select 1,(_location select 2) + 65]; - //_object = createVehicle [_class, [0,0,0], [], 0, "CAN_COLLIDE"]; _object = _class createVehicle [0,0,0]; } else { - //_object = createVehicle [_class, _location, [], 0, "CAN_COLLIDE"]; // Don't use setPos or CAN_COLLIDE here. It will spawn inside other vehicles _object = _class createVehicle _location; if (surfaceIsWater _location && {({_x != _object} count (_location nearEntities ["Ship",8])) == 0}) then { @@ -95,7 +66,6 @@ _key call server_hiveWrite; }; if(!_donotusekey) then { - // Lock vehicle _object setvehiclelock "locked"; }; @@ -105,7 +75,6 @@ _key call server_hiveWrite; _object setVariable ["ObjectID", _oid, true]; _object setVariable ["lastUpdate",diag_tickTime]; _object setVariable ["CharacterID", _characterID, true]; - //_object setVelocity [0,0,1]; if(DZE_TRADER_SPAWNMODE) then { _object attachTo [_object_para, [0,0,-1.6]]; @@ -114,12 +83,11 @@ _key call server_hiveWrite; detach _object; deleteVehicle _object_para; }; - + _object call fnc_veh_ResetEH; - - // for non JIP users this should make sure everyone has eventhandlers for vehicles. + PVDZE_veh_Init = _object; publicVariable "PVDZE_veh_Init"; - + diag_log format["PUBLISH: %1(%2) bought %3 with ObjectUID %4",if (alive _activatingPlayer) then {name _activatingPlayer} else {"DeadPlayer"},getPlayerUID _activatingPlayer,_class,_uid]; }; diff --git a/SQF/dayz_server/compile/server_publishVehicle3.sqf b/SQF/dayz_server/compile/server_publishVehicle3.sqf index d3312b50e..2809e0631 100644 --- a/SQF/dayz_server/compile/server_publishVehicle3.sqf +++ b/SQF/dayz_server/compile/server_publishVehicle3.sqf @@ -1,4 +1,4 @@ -private ["_activatingPlayer","_isOK","_object","_worldspace","_location","_dir","_class","_uid","_key","_keySelected","_characterID","_donotusekey"]; +private ["_activatingPlayer","_object","_worldspace","_location","_dir","_class","_uid","_key","_keySelected","_characterID","_donotusekey","_result","_outcome","_oid","_countr","_objectID","_objectUID","_newobject","_weapons","_magazines","_backpacks","_objWpnTypes","_objWpnQty"]; //PVDZE_veh_Publish2 = [_veh,[_dir,_location],_part_out,false,_keySelected,_activatingPlayer]; #include "\z\addons\dayz_server\compile\server_toggle_debug.hpp" @@ -10,8 +10,7 @@ _keySelected = _this select 4; _activatingPlayer = _this select 5; _characterID = _keySelected; -_isOK = isClass(configFile >> "CfgVehicles" >> _class); -if (!_isOK || isNull _object) exitWith { +if (!(isClass(configFile >> "CfgVehicles" >> _class)) || isNull _object) exitWith { diag_log ("HIVE-pv3: Vehicle does not exist: "+ str(_class)); dze_waiting = "fail"; (owner _activatingPlayer) publicVariableClient "dze_waiting"; @@ -25,68 +24,35 @@ _dir = _worldspace select 0; _location = _worldspace select 1; _uid = _worldspace call dayz_objectUID2; -//Send request _key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, 0 , _characterID, _worldspace, [], [], 1,_uid]; #ifdef OBJECT_DEBUG diag_log ("HIVE: WRITE: "+ str(_key)); #endif _key call server_hiveWrite; +_objectID = _object getVariable ["ObjectID","0"]; +_objectUID = _object getVariable ["ObjectUID","0"]; +_location = [_object] call fnc_getPos; -// Switched to spawn so we can wait a bit for the ID -[_object,_uid,_characterID,_class,_dir,_location,_donotusekey,_activatingPlayer] spawn { - private ["_object","_uid","_characterID","_done","_retry","_key","_result","_outcome","_oid","_class","_location","_donotusekey","_activatingPlayer","_countr","_objectID","_objectUID","_dir","_newobject","_weapons","_magazines","_backpacks","_objWpnTypes","_objWpnQty"]; +// GET DB ID +_key = format["CHILD:388:%1:",_uid]; +#ifdef OBJECT_DEBUG +diag_log ("HIVE: WRITE: "+ str(_key)); +#endif +_result = _key call server_hiveReadWrite; +_outcome = _result select 0; - _object = _this select 0; - _objectID = _object getVariable ["ObjectID","0"]; - _objectUID = _object getVariable ["ObjectUID","0"]; - _uid = _this select 1; - _characterID = _this select 2; - _class = _this select 3; - _dir = _this select 4; - // _location = _this select 5; - _location = [_object] call fnc_getPos; - _donotusekey = _this select 6; - _activatingPlayer = _this select 7; - - _done = false; - _retry = 0; - // TODO: Needs major overhaul for 1.1 - while {_retry < 10} do { - // GET DB ID - _key = format["CHILD:388:%1:",_uid]; - #ifdef OBJECT_DEBUG - diag_log ("HIVE: WRITE: "+ str(_key)); - #endif - - _result = _key call server_hiveReadWrite; - _outcome = _result select 0; - if (_outcome == "PASS") then { - _oid = _result select 1; - //_object setVariable ["ObjectID", _oid, true]; - #ifdef OBJECT_DEBUG - diag_log("CUSTOM: Selected " + str(_oid)); - #endif - - _done = true; - _retry = 100; - - } else { - diag_log("CUSTOM: trying again to get id for: " + str(_uid)); - _done = false; - _retry = _retry + 1; - uiSleep 1; - }; - }; - - if (!_done) exitWith { - diag_log("HIVE-pv3: failed to get id for : " + str(_uid)); - _key = format["CHILD:310:%1:",_uid]; - _key call server_hiveWrite; - - dze_waiting = "fail"; - (owner _activatingPlayer) publicVariableClient "dze_waiting"; - }; +if (_outcome != "PASS") then { + diag_log("HIVE-pv3: failed to get id for : " + str(_uid)); + _key = format["CHILD:310:%1:",_uid]; + _key call server_hiveWrite; + dze_waiting = "fail"; + (owner _activatingPlayer) publicVariableClient "dze_waiting"; +} else { + _oid = _result select 1; + #ifdef OBJECT_DEBUG + diag_log("CUSTOM: Selected " + str(_oid)); + #endif // add items from previous vehicle here _weapons = getWeaponCargo _object; @@ -121,7 +87,7 @@ _key call server_hiveWrite; _object addWeaponCargoGlobal [_x,(_objWpnQty select _countr)]; _countr = _countr + 1; } count _objWpnTypes; - + //Add Magazines _objWpnTypes = _magazines select 0; _objWpnQty = _magazines select 1; @@ -147,13 +113,13 @@ _key call server_hiveWrite; dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_object]; _object call fnc_veh_ResetEH; - + // for non JIP users this should make sure everyone has eventhandlers for vehicles. PVDZE_veh_Init = _object; publicVariable "PVDZE_veh_Init"; - + dze_waiting = "success"; (owner _activatingPlayer) publicVariableClient "dze_waiting"; - + diag_log ("PUBLISH: " + str(_activatingPlayer) + " Upgraded " + (_class) + " with ID " + str(_uid)); -}; +}; \ No newline at end of file diff --git a/Server Files/HiveExt.dll b/Server Files/HiveExt.dll index 0a89caae7..4e332ee8a 100644 Binary files a/Server Files/HiveExt.dll and b/Server Files/HiveExt.dll differ diff --git a/Server Files/SQL/1.0.6.2_Updates.sql b/Server Files/SQL/1.0.6.2_Updates.sql new file mode 100644 index 000000000..c50b13447 --- /dev/null +++ b/Server Files/SQL/1.0.6.2_Updates.sql @@ -0,0 +1,44 @@ +/* + DayZ Epoch 1.0.6.2 Updates + + RUN THIS FILE IF UPDATING AN EXISTING 1061 DATABASE TO 1062. + NEW DATABASES SHOULD USE EPOCH.SQL INSTEAD. + EXISTING 1051 DATABASES SHOULD RUN 1.0.6_UPDATES.SQL FIRST, 1.0.6.1_UPDATES.SQL SECOND, THEN RUN THIS FILE. +*/ + +/* +THIS PROCEDURE IS REQUIRED FOR 1062 AND RETURNS THE OBJECT ID MUCH MORE EFFICENTLY THAN THE METHOD IN 1061 SQF +*/ +DROP procedure IF EXISTS `retObjID`; + +DELIMITER $$ +CREATE PROCEDURE `retObjID`( + IN objTableName VARCHAR(256), + IN SID INT(11), + IN UID bigint(24), + OUT OID INT(11)unsigned +) +BEGIN + DECLARE x INT; + declare sqlstr VARCHAR(256); + + SET @OID = 0; + SET @x = 1; + SET @sqlstr = CONCAT('SELECT `ObjectID` from `', objTableName ,'` where `Instance` = ', SID ,' AND `ObjectUID` = ', UID ,' INTO @OID'); + PREPARE stmt FROM @sqlstr; + + WHILE (@x <= 5) DO + EXECUTE stmt; + IF (@OID > 0) then + SET @x = 6; + else + SET @x = @x + 1; + DO sleep(0.1); + END IF; + END WHILE; + DEALLOCATE PREPARE stmt; + SET OID = @OID; + SELECT @OID; +END;$$ + +DELIMITER ; diff --git a/Server Files/SQL/epoch.sql b/Server Files/SQL/epoch.sql index 6af02e11f..422cea496 100644 --- a/Server Files/SQL/epoch.sql +++ b/Server Files/SQL/epoch.sql @@ -2350,3 +2350,40 @@ INSERT INTO `trader_tids` VALUES(690, 'Cooked Meats', 176); INSERT INTO `trader_tids` VALUES(691, 'Drinks', 176); INSERT INTO `trader_tids` VALUES(692, 'Packaged Food', 176); INSERT INTO `trader_tids` VALUES(693, 'Attachments', 165); + +/* +THIS PROCEDURE IS REQUIRED FOR 1062 AND RETURNS THE OBJECT ID MUCH MORE EFFICENTLY THAN THE METHOD IN 1061 SQF +*/ +DROP procedure IF EXISTS `retObjID`; + +DELIMITER $$ +CREATE PROCEDURE `retObjID`( + IN objTableName VARCHAR(256), + IN SID INT(11), + IN UID bigint(24), + OUT OID INT(11)unsigned +) +BEGIN + DECLARE x INT; + declare sqlstr VARCHAR(256); + + SET @OID = 0; + SET @x = 1; + SET @sqlstr = CONCAT('SELECT `ObjectID` from `', objTableName ,'` where `Instance` = ', SID ,' AND `ObjectUID` = ', UID ,' INTO @OID'); + PREPARE stmt FROM @sqlstr; + + WHILE (@x <= 5) DO + EXECUTE stmt; + IF (@OID > 0) then + SET @x = 6; + else + SET @x = @x + 1; + DO sleep(0.1); + END IF; + END WHILE; + DEALLOCATE PREPARE stmt; + SET OID = @OID; + SELECT @OID; +END;$$ + +DELIMITER ; \ No newline at end of file