From 41e20aa3dae782c4d7be29e9a7ad4a34d5405535 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 23 Feb 2016 21:32:28 +0100 Subject: [PATCH] add CBA_missionTime --- addons/common/init_perFrameHandler.sqf | 64 +++++++++++++++++++++++-- addons/xeh/fnc_postInit_unscheduled.sqf | 5 ++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/addons/common/init_perFrameHandler.sqf b/addons/common/init_perFrameHandler.sqf index 7b245356c..7649a0709 100644 --- a/addons/common/init_perFrameHandler.sqf +++ b/addons/common/init_perFrameHandler.sqf @@ -8,8 +8,8 @@ GVAR(perFrameHandlerArray) = []; GVAR(fpsCount) = 0; GVAR(lastCount) = -1; -GVAR(lastFrameRender) = 0; -GVAR(lastTickTime) = 0; +GVAR(lastFrameRender) = diag_frameNo; +GVAR(lastTickTime) = diag_tickTime; PREP(perFrameEngine); @@ -129,7 +129,9 @@ FUNC(monitorFrameRender) = { FUNC(onFrame) = { TRACE_1("Executing onFrame",nil); GVAR(lastFrameRender) = diag_frameNo; - GVAR(lastTickTime) = diag_tickTime; + + private _tickTime = diag_tickTime; + call FUNC(missionTimePFH); { _x params ["_function", "_delay", "_delta", "", "_args", "_handle"]; @@ -147,4 +149,60 @@ addMissionEventHandler ["Loaded", { { _x set [2, (_x select 2) - GVAR(lastTickTime) + diag_tickTime]; } forEach GVAR(perFrameHandlerArray); + + GVAR(lastFrameRender) = diag_frameNo; // reset these for new session + GVAR(lastTickTime) = diag_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 + FUNC(missionTimePFH) = { + if (time != GVAR(lastTime)) then { + CBA_missionTime = CBA_missionTime + (_tickTime - GVAR(lastTickTime)); + GVAR(lastTime) = time; // used to detect paused game + }; + + GVAR(lastTickTime) = _tickTime; + }; + + ["CBA_SynchMissionTime", "onPlayerConnected", { + _owner publicVariableClient "CBA_missionTime"; + }] call BIS_fnc_addStackedEventHandler; + } else { + CBA_missionTime = -1; + + // multiplayer client + 0 spawn { + "CBA_missionTime" addPublicVariableEventHandler { + CBA_missionTime = _this select 1; + + GVAR(lastTickTime) = diag_tickTime; // prevent time skip on clients + + FUNC(missionTimePFH) = { + if (time != GVAR(lastTime)) then { + CBA_missionTime = CBA_missionTime + (_tickTime - GVAR(lastTickTime)); + GVAR(lastTime) = time; // used to detect paused game + }; + + GVAR(lastTickTime) = _tickTime; + }; + }; + }; + }; +} else { + // single player + FUNC(missionTimePFH) = { + if (time != GVAR(lastTime)) then { + CBA_missionTime = CBA_missionTime + (_tickTime - GVAR(lastTickTime)) * accTime; + GVAR(lastTime) = time; // used to detect paused game + }; + + GVAR(lastTickTime) = _tickTime; + }; +}; diff --git a/addons/xeh/fnc_postInit_unscheduled.sqf b/addons/xeh/fnc_postInit_unscheduled.sqf index 4e87694a3..d868773f8 100644 --- a/addons/xeh/fnc_postInit_unscheduled.sqf +++ b/addons/xeh/fnc_postInit_unscheduled.sqf @@ -18,6 +18,11 @@ Author: XEH_LOG("XEH: PostInit started."); +// fix CBA_missionTime being -1 on (non-JIP) clients at mission start. +if (CBA_missionTime == -1) then { + CBA_missionTime = 0; +}; + // call PostInit events { if (_x select 1 == "postInit") then {