-
Notifications
You must be signed in to change notification settings - Fork 8
/
player_markers.sqf
263 lines (220 loc) · 7.43 KB
/
player_markers.sqf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
/*
AUTHOR: aeroson
NAME: player_markers.sqf
VERSION: 2.7.1
DOWNLOAD & PARTICIPATE:
https://github.com/aeroson/a3-misc
http://forums.bistudio.com/showthread.php?156103-Dynamic-Player-Markers
DESCRIPTION:
A script to mark players on map
All markers are created locally
Designed to be dynamic, small and fast
Shows driver/pilot, vehicle name and number of passengers
Click vehicle marker to unfold its passengers list
Lets BTC mark unconscious players
Shows Norrin's revive unconscious units
Shows who is in control of UAV unit
USAGE:
in (client's) init do:
0 = [] execVM 'player_markers.sqf';
this will show players for your side in multiplayer
or you and all ais on your side in singleplayer
to change this you can add any of the following options
"players" will show players
"ais" will show ais
"allsides" will show all sides not only the units on player's side
["player","ai"] execVM 'player_markers.sqf';
this will show all player and all ais, you can add allside if you want to show all sides
once you add any of these default behaviour is not used
calling this script again will stop any previous scripts,
you can stop this script by ["stop"] execVM 'player_markers.sqf';
you can enable everything this script can show you with ["all"] execVM 'player_markers.sqf';
*/
if (!hasInterface) exitWith {}; // no map to show markers on
if(!isNil{player_markers_main_loop_handle}) then {
// if this is already running, end previous
terminate player_markers_main_loop_handle;
player_markers_main_loop_handle = nil;
};
player_markers_main_loop_handle = _this spawn {
private ["_marker","_markerText","_temp","_unit","_vehicle","_markerNumber","_show","_injured","_text","_num","_getNextMarker","_getMarkerColor","_showAllSides","_showPlayers","_showAIs","_l","_player"];
_showAllSides = false;
_showPlayers = false;
_showAIs = false;
if(count _this == 0) then {
_showAllSides = false;
_showPlayers = true;
_showAIs =! isMultiplayer;
};
{
_l = toLower _x;
if(_l in ["player","players","everything","all"]) then {
_showPlayers = true;
};
if(_l in ["ai","ais","everything","all"]) then {
_showAIs = true;
};
if(_l in ["allside","allsides","everything","all"]) then {
_showAllSides = true;
};
} forEach _this;
aero_player_markers_pos = [0,0];
onMapSingleClick "aero_player_markers_pos=_pos;";
_getNextMarker = {
private ["_marker"];
_markerNumber = _markerNumber + 1;
_marker = format["um%1",_markerNumber];
if(getMarkerType _marker == "") then {
createMarkerLocal [_marker, _this];
} else {
_marker setMarkerPosLocal _this;
};
_marker;
};
_getMarkerColor = {
[(((side _this) call bis_fnc_sideID) call bis_fnc_sideType),true] call bis_fnc_sidecolor;
};
_isPlayer = { // BUG? it is possible that isPlayer _x returns false but _x in allPlayers returns true
_this in allPlayers
};
_cleanUpMarkers = {
_markerNumber = _markerNumber + 1;
_marker = format["um%1",_markerNumber];
while {(getMarkerType _marker) != ""} do {
deleteMarkerLocal _marker;
_markerNumber = _markerNumber + 1;
_marker = format["um%1",_markerNumber];
};
};
_markerNumber = 0;
call _cleanUpMarkers;
if("stop" in _this) exitWith {
// we only wanted to stop previous and cleanup markers
};
while {true} do {
waitUntil {
sleep 0.025;
true;
};
_markerNumber = 0;
_player = player;
if(!isNil{ACE_player}) then {
_player = ACE_player;
};
// show players or players's vehicles
{
_show = false;
_injured = false;
_unit = _x;
if(
(
(_showAIs && {!(_unit call _isPlayer)} && {0=={ {_x==_unit} count crew _x>0} count allUnitsUav}) ||
(_showPlayers && {_unit call _isPlayer})
) && {
_showAllSides || side _unit == side _player
}
) then {
if((crew vehicle _unit) select 0 == _unit) then {
_show = true;
};
if(!alive _unit || damage _unit > 0.9) then {
_injured = true;
};
if(!isNil {_unit getVariable "hide"}) then {
_show = false;
};
if(_unit getVariable ["BTC_need_revive",-1] == 1) then {
_injured = true;
_show = false;
};
if(_unit getVariable ["NORRN_unconscious",false]) then {
_injured = true;
};
};
if(_show) then {
_vehicle = vehicle _unit;
_pos = getPosATL _vehicle;
_color = _unit call _getMarkerColor;
_markerText = _pos call _getNextMarker;
_markerText setMarkerColorLocal _color;
_markerText setMarkerTypeLocal "c_unknown";
_markerText setMarkerSizeLocal [0.8,0];
_marker = _pos call _getNextMarker;
_marker setMarkerColorLocal _color;
_marker setMarkerDirLocal getDir _vehicle;
_marker setMarkerTypeLocal "mil_triangle";
_marker setMarkerTextLocal "";
if(_vehicle == vehicle _player) then {
_marker setMarkerSizeLocal [0.8,1];
} else {
_marker setMarkerSizeLocal [0.5,0.7];
};
if(_vehicle != _unit && !(_vehicle isKindOf "ParachuteBase")) then {
_text = format["[%1]", getText(configFile>>"CfgVehicles">>typeOf _vehicle>>"DisplayName")];
if(!isNull driver _vehicle) then {
_text = format["%1 %2", name driver _vehicle, _text];
};
if((aero_player_markers_pos distance getPosATL _vehicle) < 50) then {
aero_player_markers_pos = getPosATL _vehicle;
_num = 0;
{
if(alive _x && _x call _isPlayer && _x != driver _vehicle) then {
_text = format["%1%2 %3", _text, if(_num>0)then{","}else{""}, name _x];
_num = _num + 1;
};
} forEach crew _vehicle;
} else {
_num = {alive _x && _x call _isPlayer && _x != driver _vehicle} count crew _vehicle;
if (_num>0) then {
if (isNull driver _vehicle) then {
_text = format["%1 %2", _text, name (crew _vehicle select 0)];
_num = _num - 1;
};
if (_num>0) then {
_text = format["%1 +%2", _text, _num];
};
};
};
} else {
_text = name _x;
};
_markerText setMarkerTextLocal _text;
};
} forEach ((allUnits - allPlayers) + allPlayers); // BUG? its possible that allUnits does not contain allPlayers
// show player controlled uavs
{
if(isUavConnected _x) then {
_unit=(uavControl _x) select 0;
if(
(
(_showAIs && {!(_unit call _isPlayer)}) ||
(_showPlayers && {_unit call _isPlayer})
) && {
_showAllSides || side _unit == side _player
}
) then {
_color = _x call _getMarkerColor;
_pos = getPosATL _x;
_marker = _pos call _getNextMarker;
_marker setMarkerColorLocal _color;
_marker setMarkerDirLocal getDir _x;
_marker setMarkerTypeLocal "mil_triangle";
_marker setMarkerTextLocal "";
if(_unit == _player) then {
_marker setMarkerSizeLocal [0.8,1];
} else {
_marker setMarkerSizeLocal [0.5,0.7];
};
_markerText = _pos call _getNextMarker;
_markerText setMarkerColorLocal _color;
_markerText setMarkerTypeLocal "c_unknown";
_markerText setMarkerSizeLocal [0.8,0];
_markerText setMarkerTextLocal format["%1 [%2]", name _unit, getText(configFile>>"CfgVehicles">>typeOf _x>>"DisplayName")];
};
};
} forEach allUnitsUav;
call _cleanUpMarkers;
};
_markerNumber = 0;
call _cleanUpMarkers;
};