@@ -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.
4141GVAR(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