From 6771127475fd8b56cafedb9cfbc95178a4db3343 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 7 Apr 2020 15:54:16 +0200 Subject: [PATCH 1/4] fix CBA_missionTime in long missions (above 7 days) --- addons/common/init_perFrameHandler.sqf | 74 ++++++++++---------------- 1 file changed, 27 insertions(+), 47 deletions(-) diff --git a/addons/common/init_perFrameHandler.sqf b/addons/common/init_perFrameHandler.sqf index 795211f423..abe6edef95 100644 --- a/addons/common/init_perFrameHandler.sqf +++ b/addons/common/init_perFrameHandler.sqf @@ -5,7 +5,6 @@ GVAR(perFrameHandlerArray) = []; GVAR(perFrameHandlersToRemove) = []; -GVAR(lastTickTime) = diag_tickTime; GVAR(waitAndExecArray) = []; GVAR(waitAndExecArrayIsSorted) = false; @@ -14,11 +13,34 @@ GVAR(nextFrameBufferA) = []; GVAR(nextFrameBufferB) = []; GVAR(waitUntilAndExecArray) = []; +GVAR(missionTimeSynchronized) = false; +GVAR(missionTimePrecise) = 0; +GVAR(missionTimeThousands) = 0; +CBA_missionTime = 0; +CBA_missionTimeStr = "0"; + // per frame handler system [QFUNC(onFrame), { SCRIPT(onFrame); private _tickTime = diag_tickTime; - call FUNC(missionTimePFH); + + // Update CBA_missionTime when synchronized, time has started, and game is not paused. + if ([GVAR(missionTimeSynchronized), time > 0, isGamePaused] isEqualTo [true, true, false]) then { + GVAR(missionTimePrecise) = GVAR(missionTimePrecise) + diag_deltaTime * accTime; + + while {GVAR(missionTimePrecise) >= 1000} do { + GVAR(missionTimePrecise) = GVAR(missionTimePrecise) - 1000; + GVAR(missionTimeThousands) = GVAR(missionTimeThousands) + 1; + }; + + CBA_missionTimeStr = format [ + "%1%2", + GVAR(missionTimeThousands) toFixed 0, + (1000 + GVAR(missionTimePrecise)) toFixed 6 select [1], + ]; + + CBA_missionTime = parseNumber CBA_missionTimeStr; + }; // frame number does not match expected; can happen between pre and postInit, save-game load and on closing map // need to manually set nextFrameNo, so new items get added to buffer B and are not executed this frame @@ -86,34 +108,12 @@ GVAR(waitUntilAndExecArray) = []; }; }] call CBA_fnc_compileFinal; -// fix for save games. subtract last tickTime from ETA of all PFHs after mission was loaded -addMissionEventHandler ["Loaded", { - private _tickTime = diag_tickTime; - - { - _x set [2, (_x select 2) - GVAR(lastTickTime) + _tickTime]; - } forEach GVAR(perFrameHandlerArray); - - GVAR(lastTickTime) = _tickTime; -}]; - -CBA_missionTime = 0; -GVAR(lastTime) = time; - // increase CBA_missionTime variable every frame if (isMultiplayer) then { // multiplayer - no accTime in MP if (isServer) then { // multiplayer server - [QFUNC(missionTimePFH), { - SCRIPT(missionTimePFH_server); - if (time != GVAR(lastTime)) then { - CBA_missionTime = CBA_missionTime + (_tickTime - GVAR(lastTickTime)); - GVAR(lastTime) = time; // used to detect paused game - }; - - GVAR(lastTickTime) = _tickTime; - }] call CBA_fnc_compileFinal; + GVAR(missionTimeSynchronized) = true; addMissionEventHandler ["PlayerConnected", { (_this select 4) publicVariableClient "CBA_missionTime"; @@ -126,19 +126,7 @@ if (isMultiplayer) then { isNil { private _fnc_init = { CBA_missionTime = _this select 1; - - GVAR(lastTickTime) = diag_tickTime; // prevent time skip on clients - - [QFUNC(missionTimePFH), { - SCRIPT(missionTimePFH_client); - if (time != GVAR(lastTime)) then { - CBA_missionTime = CBA_missionTime + (_tickTime - GVAR(lastTickTime)); - GVAR(lastTime) = time; // used to detect paused game - }; - - GVAR(lastTickTime) = _tickTime; - }] call CBA_fnc_compileFinal; - + GVAR(missionTimeSynchronized) = true; }; "CBA_missionTime" addPublicVariableEventHandler _fnc_init; @@ -152,13 +140,5 @@ if (isMultiplayer) then { }; } else { // single player - [QFUNC(missionTimePFH), { - SCRIPT(missionTimePFH_sp); - if (time != GVAR(lastTime)) then { - CBA_missionTime = CBA_missionTime + (_tickTime - GVAR(lastTickTime)) * accTime; - GVAR(lastTime) = time; // used to detect paused game - }; - - GVAR(lastTickTime) = _tickTime; - }] call CBA_fnc_compileFinal; + GVAR(missionTimeSynchronized) = true; }; From 543511870732e48afc76c94be9d24e2650ec16fe Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 19 Apr 2020 18:47:08 +0200 Subject: [PATCH 2/4] Update addons/common/init_perFrameHandler.sqf Co-Authored-By: Vdauphin --- addons/common/init_perFrameHandler.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/init_perFrameHandler.sqf b/addons/common/init_perFrameHandler.sqf index abe6edef95..bda5a955ca 100644 --- a/addons/common/init_perFrameHandler.sqf +++ b/addons/common/init_perFrameHandler.sqf @@ -36,7 +36,7 @@ CBA_missionTimeStr = "0"; CBA_missionTimeStr = format [ "%1%2", GVAR(missionTimeThousands) toFixed 0, - (1000 + GVAR(missionTimePrecise)) toFixed 6 select [1], + (1000 + GVAR(missionTimePrecise)) toFixed 6 select [1] ]; CBA_missionTime = parseNumber CBA_missionTimeStr; From e1870bf78579a3fde9b3ff8f72c7ffa732fc4b34 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 31 May 2020 09:08:22 +0200 Subject: [PATCH 3/4] fix JIP synch and add CBA_fnc_missionTimeDelta --- addons/common/CfgFunctions.hpp | 1 + addons/common/fnc_missionTimeDelta.sqf | 30 ++++++++++++++++++++++++++ addons/common/init_perFrameHandler.sqf | 14 +++++++----- 3 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 addons/common/fnc_missionTimeDelta.sqf diff --git a/addons/common/CfgFunctions.hpp b/addons/common/CfgFunctions.hpp index fde194db60..ceccb7c311 100644 --- a/addons/common/CfgFunctions.hpp +++ b/addons/common/CfgFunctions.hpp @@ -129,6 +129,7 @@ class CfgFunctions { PATHTO_FNC(waitAndExecute); PATHTO_FNC(waitUntilAndExecute); PATHTO_FNC(compileFinal); + PATHTO_FNC(missionTimeDelta); }; class Broken { diff --git a/addons/common/fnc_missionTimeDelta.sqf b/addons/common/fnc_missionTimeDelta.sqf new file mode 100644 index 0000000000..2e3afc2b99 --- /dev/null +++ b/addons/common/fnc_missionTimeDelta.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* ---------------------------------------------------------------------------- +Function: CBA_fnc_missionTimeDelta + +Description: + Return precise time in seconds between two CBA_missionTimeSTR timestamps. + +Parameters: + _t0 - Smaller time string + _t1 - Larger time string + +Returns: + Time difference + +Examples: + (begin example) + _elapsedTime = [nil, CBA_missionTimeStr] call CBA_fnc_missionTimeDelta; + (end) + +Author: + commy2 +---------------------------------------------------------------------------- */ + +params [["_t0", "0000.000000", [""]], ["_t1", "0000.000000", [""]]]; + +private _len0 = count _t0 - 10; +private _len1 = count _t1 - 10; + +(parseNumber (_t1 select [0, _len1]) - parseNumber (_t0 select [0, _len0])) * 1000 + +(parseNumber (_t1 select [_len1]) - parseNumber (_t0 select [_len0])) diff --git a/addons/common/init_perFrameHandler.sqf b/addons/common/init_perFrameHandler.sqf index bda5a955ca..b4531570c4 100644 --- a/addons/common/init_perFrameHandler.sqf +++ b/addons/common/init_perFrameHandler.sqf @@ -17,7 +17,7 @@ GVAR(missionTimeSynchronized) = false; GVAR(missionTimePrecise) = 0; GVAR(missionTimeThousands) = 0; CBA_missionTime = 0; -CBA_missionTimeStr = "0"; +CBA_missionTimeStr = "0000.000000"; // per frame handler system [QFUNC(onFrame), { @@ -116,7 +116,7 @@ if (isMultiplayer) then { GVAR(missionTimeSynchronized) = true; addMissionEventHandler ["PlayerConnected", { - (_this select 4) publicVariableClient "CBA_missionTime"; + (_this select 4) publicVariableClient "CBA_missionTimeStr"; }]; } else { CBA_missionTime = -1; @@ -125,15 +125,19 @@ if (isMultiplayer) then { 0 spawn { isNil { private _fnc_init = { - CBA_missionTime = _this select 1; + params ["", "_timestamp"]; + private _length = count _timestamp - 10; + + GVAR(missionTimePrecise) = parseNumber (_timestamp select [_length]); + GVAR(missionTimeThousands) = parseNumber (_timestamp select [0, _length]); GVAR(missionTimeSynchronized) = true; }; - "CBA_missionTime" addPublicVariableEventHandler _fnc_init; + "CBA_missionTimeStr" addPublicVariableEventHandler _fnc_init; if (CBA_missionTime != -1) then { WARNING_1("CBA_missionTime packet arrived prematurely. Installing update handler manually. Transferred value was %1.",CBA_missionTime); - [nil, CBA_missionTime] call _fnc_init; + [nil, CBA_missionTimeStr] call _fnc_init; }; }; }; From 2d5656986a6a845339508e676aea2231d30c7931 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 31 May 2020 09:15:09 +0200 Subject: [PATCH 4/4] fix JIP synch and add CBA_fnc_missionTimeDelta --- addons/common/fnc_missionTimeDelta.sqf | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/common/fnc_missionTimeDelta.sqf b/addons/common/fnc_missionTimeDelta.sqf index 2e3afc2b99..c3cc6f3f9e 100644 --- a/addons/common/fnc_missionTimeDelta.sqf +++ b/addons/common/fnc_missionTimeDelta.sqf @@ -14,14 +14,18 @@ Returns: Examples: (begin example) - _elapsedTime = [nil, CBA_missionTimeStr] call CBA_fnc_missionTimeDelta; + _elapsedTime = my_oldTimeString call CBA_fnc_missionTimeDelta; + + _deltaTime = [my_oldTimeString, my_newTimeString] call CBA_fnc_missionTimeDelta; + + _missionTime = [] call CBA_fnc_missionTimeDelta; (end) Author: commy2 ---------------------------------------------------------------------------- */ -params [["_t0", "0000.000000", [""]], ["_t1", "0000.000000", [""]]]; +params [["_t0", "0000.000000", [""]], ["_t1", CBA_missionTimeStr, [""]]]; private _len0 = count _t0 - 10; private _len1 = count _t1 - 10;