Jump to content

Recommended Posts

Just a code snippet to display continually updating map markers for all units and uav's on the player's side. A result of me messing about with the functionality of the select command.

 

If a unit is in a vehicle, the vehicle's driver (or the first player in the vehicle) followed by the crew count will be shown. For example "HallyG + 3".

First argument toggles whether or not marker should be displayed for AI. Default behaviour, only show AI markers in singleplayer.
Marker colour changes according to the player's side; The side used is the player's starting.

 

http://imgur.com/a/LTgbk

/*
	Author: HallyG
	Displays map markers for all friendly units on the map.
	
	Argument(s):
	0: Show AI: <BOOLEAN> (default: Show AI in singleplayer only)

	Returns:
	<NOTHING>
	
	Example:
	[true] spawn FUNCTIONNAME;
	[true] execVM SCRIPTLOCATION;
__________________________________________________________________*/

if (isDedicated || missionNamespace getVariable ["HGF_unitMarkers_running", false]) exitWith {};
HGF_unitMarkers_running = true;

params [
	["_showAI", !isMultiplayer, [false]]
];

private _fnc_updtMkr = {
	params ["_marker", "_pos", "_dir", "_type", "_name"];

	_marker setMarkerPosLocal _pos;
	_marker setMarkerDirLocal _dir;
	_marker setMarkerTypeLocal _type;
	_marker setMarkerTextLocal _name;
};

private _markers = [];
private _units = [[],[]];
private _colour = [playerSide, true] call BIS_fnc_sideColor;

while {true} do {
	allUnitsUav select {
		if (isUAVConnected _x) then {
			(_units select 1) pushBackUnique _x;
			true
		};
	};
	allUnits select {
		if (isPlayer _x || _showAI) then {
			if (side _x isEqualto playerSide) then {
				private _unit = _x;

				if (({{_x isEqualTo _unit} count crew _x > 0} count allUnitsUav) isEqualTo 0) then {
					(_units select 0) pushBackUnique _x;
					true
				};
			};
		};
	};

	if (visibleGPS || visibleMap) then {
		{
			private _marker = format ["Unit%1", _x];
			private _veh = {isPlayer _x || _showAI} count crew vehicle _x;

			if !(_marker in _markers) then {
				_markers pushBack (createMarkerLocal [_marker, visiblePositionASL _x]);
				_marker setMarkerAlphaLocal 0.75;
				_marker setMarkerSizeLocal [0.8, 0.8];
				_marker setMarkerColorLocal _colour;
			};
			[
				[
					_marker,
					(visiblePositionASL _x),
					(getDirVisual _x),
					[	
						["Empty", "b_motor_inf"] select ((((crew vehicle _x) select {isPlayer _x || _showAI}) select 0) isEqualTo _x),
						"mil_triangle"
					] select (isNull objectParent _x || {(objectParent _x isKindOf "ParachuteBase")}),
					[
						format ["%1: %2 %3", getText (configFile >> "cfgVehicles" >> typeOf vehicle _x >> "displayname"), name _x, format [["+%1",""] select (_veh < 2), _veh -1]], 
						name _x
					] select (isNull objectParent _x || {(objectParent _x isKindOf "ParachuteBase")})	
				],
				[
					_marker,
					(visiblePositionASL _x),
					0,
					"Empty",
					name _x
				]
			] select !(alive _x) call _fnc_updtMkr;
				
			if !(alive _x) then {
				(_units select 0) set [_forEachIndex, objNull]
			};
		} forEach ((_units select 0) select {!isNull _x});
		
		{
			private _unit = (uavControl _x) select 0;
		
			if (isPlayer _unit || _showAI) then {
				if (side _unit isEqualto playerSide) then {
					private _marker = format ["Uav%1", _x];

					if !(_marker in _markers) then {
						_markers pushBack (createMarkerLocal [_marker, visiblePositionASL _x]);
						_marker setMarkerAlphaLocal 0.75;
						_marker setMarkerSizeLocal [0.8, 0.8];
						_marker setMarkerColorLocal _colour;
					};
					[
						[
							_marker,
							(visiblePositionASL _x),
							(getDirVisual _x),
							"b_uav",
							format ["%1: %2", getText (configFile >> "cfgVehicles" >> typeOf vehicle _x >> "displayName"), name _unit] 
						],
						[
							_marker,
							(visiblePositionASL _x),
							(getDirVisual _x),
							"Empty", //"KIA"
							format ["%1: %2", getText (configFile >> "cfgVehicles" >> typeOf vehicle _x >> "displayName"), name _unit]
						]					
					] select !(alive _x) call _fnc_updtMkr;
					
					if !(alive _x) then {
						(_units select 1) set [_forEachIndex, objNull]
					};
				};
			};
		} forEach ((_units select 1) select {!isNull _x});	
	} else {
		{deleteMarkerLocal _x; true} count _markers;
		_markers = [];
	};
	uiSleep 0.025;
};

I guess, to improve this further, I could use the map mission event handler instead of a looped if then statement. 

 

Share this post


Link to post
Share on other sites
On 01/08/2016 at 7:07 PM, davidoss said:

Nice but the game do it too isn't ?

There are Soldier Tracker by Quicksilver which  do it awesome.

 

Share this post


Link to post
Share on other sites

I am not saying that this is not useful and said "Nice". I am using it already.

Share this post


Link to post
Share on other sites

I am not saying that this is not useful and said "Nice". I am using it already.

Evidently I misunderstood you, my bad :)

Share this post


Link to post
Share on other sites

would be interesting to explore faster/better ways of iterating through an array than {........} count _array    <---- the method i use a lot

 

maybe your use of select is better     _array select {...};

 

maybe the apply command is worth exploring as well

 

https://community.bistudio.com/wiki/apply

 

and we are both waiting for this command

 

https://community.bistudio.com/wiki/unitIsUAV

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×