Skip to content

Commit 96bb445

Browse files
authored
feat: track all marker property updates with diff detection (#87)
* feat: track all mutable marker properties with diff-based updates * fix: move marker diff logic from client to server-side handler GVAR(trackedMarkerStates) is a server-only variable. The diff checking was incorrectly placed in the client-side MarkerUpdated EH where clients don't have access to it. Moved to the server-side UPDATED case handler.
1 parent 410780e commit 96bb445

1 file changed

Lines changed: 31 additions & 2 deletions

File tree

addons/recorder/fnc_handleMarkers.sqf

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Author:
3939
// Persistent global variable on server that defines unique marker names currently being tracked.
4040
// Entries are added at marker create events and removed at marker delete events to avoid duplicate processing.
4141
GVAR(trackedMarkers) = []; // Markers which we save into replay
42+
GVAR(trackedMarkerStates) = createHashMap;
4243

4344
// VARIABLE: OCAP_listener_markers
4445
// Contains handle for <OCAP_handleMarker> CBA event handler.
@@ -129,13 +130,24 @@ EGVAR(listener,markers) = [QGVARMAIN(handleMarker), {
129130
private _logParams = (str [_mrk_name, _dir, _type, _text, _captureFrameNo, -1, _mrk_owner, _mrk_color, _size, _sideOfMarker, _pos, _shape, _alpha, _brush]);
130131

131132
[":MARKER:CREATE:", [_mrk_name, _dir, _type, _text, _captureFrameNo, -1, _mrk_owner, _mrk_color, _size, _sideOfMarker, _pos, _shape, _alpha, _brush]] call EFUNC(extension,sendData);
133+
134+
// Seed state cache for diff tracking on updates
135+
GVAR(trackedMarkerStates) set [_mrk_name, [_pos, _dir, _alpha, _text, _mrk_color, str _size, _type, _brush, _shape]];
132136
};
133137

134138
case "UPDATED":{
135139

136140
if (_mrk_name in GVAR(trackedMarkers)) then {
137141
if (isNil "_dir") then {_dir = 0};
138-
[":MARKER:STATE:", [_mrk_name, GVAR(captureFrameNo), _pos, _dir, _alpha]] call EFUNC(extension,sendData);
142+
143+
private _currentState = [_pos, _dir, _alpha, _text, _color, str _size, _type, _brush, _shape];
144+
private _lastState = GVAR(trackedMarkerStates) getOrDefault [_mrk_name, []];
145+
146+
if (_currentState isEqualTo _lastState) exitWith {};
147+
148+
GVAR(trackedMarkerStates) set [_mrk_name, _currentState];
149+
150+
[":MARKER:STATE:", [_mrk_name, GVAR(captureFrameNo), _pos, _dir, _alpha, _text, _color, str _size, _type, _brush, _shape]] call EFUNC(extension,sendData);
139151
};
140152
};
141153

@@ -150,6 +162,7 @@ EGVAR(listener,markers) = [QGVARMAIN(handleMarker), {
150162

151163
[":MARKER:DELETE:", [_mrk_name, GVAR(captureFrameNo)]] call EFUNC(extension,sendData);
152164
GVAR(trackedMarkers) = GVAR(trackedMarkers) - [_mrk_name];
165+
GVAR(trackedMarkerStates) deleteAt _mrk_name;
153166
};
154167
};
155168
};
@@ -246,8 +259,24 @@ EGVAR(listener,markers) = [QGVARMAIN(handleMarker), {
246259
if (_isExcluded) exitWith {};
247260

248261
private _pos = ATLToASL (markerPos [_marker, true]);
262+
private _dir = markerDir _marker;
263+
private _alpha = markerAlpha _marker;
264+
private _text = markerText _marker;
265+
private _color = markerColor _marker;
266+
private _size = markerSize _marker;
267+
private _type = markerType _marker;
268+
private _brush = markerBrush _marker;
269+
private _shape = markerShape _marker;
270+
271+
// Convert color from config name to hex
272+
private _mrk_color = "";
273+
if (_color == "Default") then {
274+
_mrk_color = (configfile >> "CfgMarkers" >> _type >> "color") call BIS_fnc_colorConfigToRGBA call bis_fnc_colorRGBtoHTML;
275+
} else {
276+
_mrk_color = (configfile >> "CfgMarkerColors" >> _color >> "color") call BIS_fnc_colorConfigToRGBA call bis_fnc_colorRGBtoHTML;
277+
};
249278

250-
[QGVARMAIN(handleMarker), ["UPDATED", _marker, player, _pos, "", "", "", markerDir _marker, "", "", markerAlpha _marker]] call CBA_fnc_serverEvent;
279+
[QGVARMAIN(handleMarker), ["UPDATED", _marker, player, _pos, _type, _shape, _size, _dir, _brush, _mrk_color, _alpha, _text]] call CBA_fnc_serverEvent;
251280
}];
252281

253282
// handle marker deletions

0 commit comments

Comments
 (0)