Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions addons/common/fnc_waitAndExecute.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Function: CBA_fnc_waitAndExecute

Description:
Executes a code once in unscheduled environment with a given game time delay.
Note that unlike PFEH, the delay is in CBA_missionTime not diag_tickTime (will be adjusted for time accl).
Note that unlike PFEH, the delay is in CBA_missionTimeTriple not diag_tickTime (will be adjusted for time accl).

Parameters:
_function - The function you wish to execute. <CODE>
Expand All @@ -28,5 +28,12 @@ Author:

params [["_function", {}, [{}]], ["_args", []], ["_delay", 0, [0]]];

GVAR(waitAndExecArray) pushBack [CBA_missionTime + _delay, _function, _args];
_delay = [
floor((_delay % 1e9)/1e6),
floor((_delay % 1e6)/1e3),
_delay % 1e3
];
private _timeOfExec = CBA_missionTimeTriple vectorAdd _delay;

GVAR(waitAndExecArray) pushBack (_timeOfExec + [_function, _args]);
GVAR(waitAndExecArrayIsSorted) = false;
5 changes: 3 additions & 2 deletions addons/common/fnc_waitUntilAndExecute.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ if (_timeout < 0) then {
GVAR(waitUntilAndExecArray) pushBack [{
params ["_condition", "_statement", "_args", "_timeout", "_timeoutCode", "_startTime"];

if (CBA_missionTime - _startTime > _timeout) exitWith {
private _timeDiff = CBA_missionTimeTriple vectorDiff _startTime;
if (_timeDiff vectorDotProduct [1e6 , 1e3, 1] > _timeout) exitWith {
_args call _timeoutCode;
true
};
Expand All @@ -58,7 +59,7 @@ if (_timeout < 0) then {
true
};
false
}, {}, [_condition, _statement, _args, _timeout, _timeoutCode, CBA_missionTime]];
}, {}, [_condition, _statement, _args, _timeout, _timeoutCode, CBA_missionTimeTriple]];
};

nil
54 changes: 40 additions & 14 deletions addons/common/init_perFrameHandler.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,11 @@ GVAR(waitUntilAndExecArray) = [];
};
private _delete = false;
{
if (_x select 0 > CBA_missionTime) exitWith {};
private _timeDiff = [_x select [0, 3], CBA_missionTimeTriple];
_timeDiff sort true;
if (_timeDiff#0 isEqualTo CBA_missionTimeTriple) exitWith {};

(_x select 2) call (_x select 1);
(_x select 4) call (_x select 3);

// Mark the element for deletion so it's not executed ever again
GVAR(waitAndExecArray) set [_forEachIndex, objNull];
Expand Down Expand Up @@ -97,42 +99,58 @@ addMissionEventHandler ["Loaded", {
GVAR(lastTickTime) = _tickTime;
}];

CBA_missionTime = 0;
CBA_missionTimeTriple = [0, 0, 0]; // [999,999,999.99] = 999999999.99
GVAR(lastTime) = time;

// increase CBA_missionTime variable every frame
// increase CBA_missionTimeTriple 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));
CBA_missionTimeTriple = CBA_missionTimeTriple vectorAdd [0, 0, _tickTime - GVAR(lastTickTime)];
if (selectMax CBA_missionTimeTriple > 1e3) then {
private _limitReach = CBA_missionTimeTriple findIf {_x > 1e3};
private _diff = [0, 0, 0];
_diff set [_limitReach, -1e3];
_diff set [_limitReach - 1, 1];
CBA_missionTimeTriple = CBA_missionTimeTriple vectorAdd _diff;
};
CBA_missionTime = CBA_missionTimeTriple vectorDotProduct [1e6 , 1e3, 1];
GVAR(lastTime) = time; // used to detect paused game
};

GVAR(lastTickTime) = _tickTime;
}] call CBA_fnc_compileFinal;

addMissionEventHandler ["PlayerConnected", {
(_this select 4) publicVariableClient "CBA_missionTime";
(_this select 4) publicVariableClient "CBA_missionTimeTriple";
}];
} else {
CBA_missionTime = -1;
CBA_missionTimeTriple = [];

// multiplayer client
0 spawn {
isNil {
private _fnc_init = {
CBA_missionTime = _this select 1;
CBA_missionTimeTriple = _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));
CBA_missionTimeTriple = CBA_missionTimeTriple vectorAdd [0, 0, _tickTime - GVAR(lastTickTime)];
if (selectMax CBA_missionTimeTriple > 1e3) then {
private _limitReach = CBA_missionTimeTriple findIf {_x > 1e3};
private _diff = [0, 0, 0];
_diff set [_limitReach, -1e3];
_diff set [_limitReach - 1, 1];
CBA_missionTimeTriple = CBA_missionTimeTriple vectorAdd _diff;
};
CBA_missionTime = CBA_missionTimeTriple vectorDotProduct [1e6 , 1e3, 1];
GVAR(lastTime) = time; // used to detect paused game
};

Expand All @@ -141,11 +159,11 @@ if (isMultiplayer) then {

};

"CBA_missionTime" addPublicVariableEventHandler _fnc_init;
"CBA_missionTimeTriple" 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;
if !(CBA_missionTimeTriple isEqualTo []) then {
WARNING_1("CBA_missionTimeTriple packet arrived prematurely. Installing update handler manually. Transferred value was %1.",CBA_missionTimeTriple);
[nil, CBA_missionTimeTriple] call _fnc_init;
};
};
};
Expand All @@ -155,7 +173,15 @@ if (isMultiplayer) then {
[QFUNC(missionTimePFH), {
SCRIPT(missionTimePFH_sp);
if (time != GVAR(lastTime)) then {
CBA_missionTime = CBA_missionTime + (_tickTime - GVAR(lastTickTime)) * accTime;
CBA_missionTimeTriple = CBA_missionTimeTriple vectorAdd [0, 0, (_tickTime - GVAR(lastTickTime)) * accTime];
if (selectMax CBA_missionTimeTriple > 1e3) then {
private _limitReach = CBA_missionTimeTriple findIf {_x > 1e3};
private _diff = [0, 0, 0];
_diff set [_limitReach, -1e3];
_diff set [_limitReach - 1, 1];
CBA_missionTimeTriple = CBA_missionTimeTriple vectorAdd _diff;
};
CBA_missionTime = CBA_missionTimeTriple vectorDotProduct [1e6 , 1e3, 1];
GVAR(lastTime) = time; // used to detect paused game
};

Expand Down
2 changes: 1 addition & 1 deletion addons/diagnostic/fnc_debug.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ _message set [0, format [
"(%3) %1 - %2",
_title,
_message select 0,
[CBA_missionTime, "H:MM:SS"] call CBA_fnc_formatElapsedTime
[CBA_missionTimeTriple vectorDotProduct [1e6 , 1e3, 1], "H:MM:SS"] call CBA_fnc_formatElapsedTime
]];

_message = _message call _fnc_splitLines;
Expand Down
7 changes: 4 additions & 3 deletions addons/events/fnc_weaponEvents.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,14 @@ if (!_isEmpty || _onEmpty) then {
_this set [10, true];
};

_this set [8, CBA_missionTime];
_this set [8, CBA_missionTimeTriple];
_unit setWeaponReloadingTime [_unit, _muzzle, 1];
false
};

// keep waiting until time over
if (CBA_missionTime < _time + _delay) exitWith {false};
private _timeDiff = CBA_missionTimeTriple vectorDiff _time;
if (_timeDiff vectorDotProduct [1e6 , 1e3, 1] < _delay) exitWith {false};

if (local _unit) then {
_unit playAction _handAction;
Expand Down Expand Up @@ -185,7 +186,7 @@ if (!_isEmpty || _onEmpty) then {
}, {}, [
_unit, _weapon, _muzzle, _optic,
_handAction, _sound, call _fnc_soundSource,
_expectedMagazineCount, CBA_missionTime, _delay,
_expectedMagazineCount, CBA_missionTimeTriple, _delay,
_triggerReleased, _config
]] call CBA_fnc_waitUntilAndExecute;
};
3 changes: 2 additions & 1 deletion addons/music/fnc_getMusicPlaying.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ if (isNil QGVAR(track)) exitWith {["", 0, 0]};

GVAR(track) params ["_class", "_startTime", "_playPos", "_duration"];

private _trackTime = (CBA_missionTime - _startTime) + _playPos;
private _timeDiff = CBA_missionTimeTriple vectorDiff _startTime;
private _trackTime = (_timeDiff vectorDotProduct [1e6 , 1e3, 1]) + _playPos;
private _remainingTime = _duration - _trackTime;

if (_remainingTime <= 0) then {
Expand Down
2 changes: 1 addition & 1 deletion addons/music/fnc_playMusic.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ private _duration = [_className, "duration"] call CBA_fnc_getMusicData;
if (!isNil "_duration") then {
if (_time < _duration) then {
playMusic [_className, _time];
GVAR(track) = [_className, CBA_missionTime, _time, _duration];
GVAR(track) = [_className, CBA_missionTimeTriple, _time, _duration];
_return = true;
} else {
WARNING("Time is greater than song length");
Expand Down
2 changes: 1 addition & 1 deletion addons/statemachine/fnc_dumpPerformanceCounters.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ if (true) exitWith {WARNING("Requires `STATEMACHINE_PERFORMANCE_COUNTERS` in scr
#endif

diag_log text format ["CBA State Machine Results:"];
diag_log text format ["------------------ [Time: %1] -------------------------", CBA_missionTime toFixed 1];
diag_log text format ["------------------ [Time: %1] -------------------------", (CBA_missionTimeTriple vectorDotProduct [1e6 , 1e3, 1]) toFixed 1];

{
// _x is an array of small individual run times from FUNC(clockwork)
Expand Down
11 changes: 7 additions & 4 deletions addons/ui/fnc_progressBar.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,13 @@ _ctrlTitle ctrlSetText _title;
// run failure code on previous progress bar
if (!isNil QGVAR(ProgressBarParams)) then {
GVAR(ProgressBarParams) params ["_arguments", "", "", "_onFailure", "_startTime", "_totalTime"];
private _elapsedTime = (CBA_missionTime - _startTime) min _totalTime;
private _timeDiff = CBA_missionTimeTriple vectorDiff _startTime;
private _elapsedTime = (_timeDiff vectorDotProduct [1e6 , 1e3, 1]) min _totalTime;

[_onFailure, [_arguments, false, _elapsedTime, _totalTime, 3]] call CBA_fnc_execNextFrame;
};

GVAR(ProgressBarParams) = [_arguments, _condition, _onSuccess, _onFailure, CBA_missionTime, _totalTime, _blockMouse, _blockKeys, _allowClose];
GVAR(ProgressBarParams) = [_arguments, _condition, _onSuccess, _onFailure, CBA_missionTimeTriple, _totalTime, _blockMouse, _blockKeys, _allowClose];

// update bar, check condition, execute success or failure scripts
private _ctrlScript = _display displayCtrl IDC_PROGRESSBAR_SCRIPT;
Expand All @@ -92,7 +93,8 @@ _ctrlScript ctrlAddEventHandler ["Draw", {
private _display = ctrlParent _ctrlScript;

GVAR(ProgressBarParams) params ["_arguments", "_condition", "_onSuccess", "_onFailure", "_startTime", "_totalTime"];
private _elapsedTime = (CBA_missionTime - _startTime) min _totalTime;
private _timeDiff = CBA_missionTimeTriple vectorDiff _startTime;
private _elapsedTime = (_timeDiff vectorDotProduct [1e6 , 1e3, 1]) min _totalTime;

private _continue = [[_arguments, true, _elapsedTime, _totalTime], _condition] call {
// prevent these variables from being overwritten
Expand Down Expand Up @@ -133,7 +135,8 @@ if (_blockMouse) then {
params ["_blockInputDisplay", "_key", "_shift", "_control", "_alt"];

GVAR(ProgressBarParams) params ["_arguments", "", "", "_onFailure", "_startTime", "_totalTime", "_blockMouse", "_blockKeys", "_allowClose"];
private _elapsedTime = (CBA_missionTime - _startTime) min _totalTime;
private _timeDiff = CBA_missionTimeTriple vectorDiff _startTime;
private _elapsedTime = (_timeDiff vectorDotProduct [1e6 , 1e3, 1]) min _totalTime;

if (_key isEqualTo DIK_ESCAPE) then {
if (_allowClose) then {
Expand Down
6 changes: 3 additions & 3 deletions addons/xeh/fnc_postInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ Author:
isNil {
XEH_LOG("PostInit started. " + PFORMAT_9("MISSIONINIT",missionName,missionVersion,worldName,isMultiplayer,isServer,isDedicated,CBA_isHeadlessClient,hasInterface,didJIP));

// fix CBA_missionTime being -1 on (non-JIP) clients at mission start.
if (CBA_missionTime == -1) then {
CBA_missionTime = 0;
// fix CBA_missionTimeTriple being -1 on (non-JIP) clients at mission start.
if (CBA_missionTimeTriple isEqualTo []) then {
CBA_missionTimeTriple = [0, 0, 0];
};

// call PostInit events
Expand Down