From 11984f6dcbc1c6ce4fe74aac90866306ad6cfaf8 Mon Sep 17 00:00:00 2001 From: Timi007 Date: Wed, 31 Aug 2022 06:17:31 +0200 Subject: [PATCH] Marker Flags - Add placing system & icons (#8951) --- addons/marker_flags/CfgEventHandlers.hpp | 6 ++ addons/marker_flags/CfgVehicles.hpp | 17 ++-- addons/marker_flags/CfgWeapons.hpp | 24 ++++-- addons/marker_flags/XEH_PREP.hpp | 1 + .../marker_flags/XEH_missionDisplayLoad.sqf | 17 ++++ addons/marker_flags/XEH_postInit.sqf | 20 +++-- addons/marker_flags/XEH_preStart.sqf | 2 +- addons/marker_flags/config.cpp | 4 +- .../marker_flags/functions/fnc_addActions.sqf | 9 ++- .../functions/fnc_handleScrollWheel.sqf | 30 +++++++ .../marker_flags/functions/fnc_pickUpFlag.sqf | 15 ++-- .../marker_flags/functions/fnc_placeFlag.sqf | 73 ++++++++++++++---- addons/marker_flags/script_component.hpp | 9 +++ addons/marker_flags/stringtable.xml | 29 +++++-- .../ui/icons/black_place_icon.paa | Bin 0 -> 5625 bytes .../marker_flags/ui/icons/blue_place_icon.paa | Bin 0 -> 5625 bytes .../ui/icons/green_place_icon.paa | Bin 0 -> 5625 bytes .../ui/icons/orange_place_icon.paa | Bin 0 -> 5625 bytes .../ui/icons/purple_place_icon.paa | Bin 0 -> 5625 bytes .../marker_flags/ui/icons/red_place_icon.paa | Bin 0 -> 5625 bytes .../ui/icons/white_pickup_icon.paa | Bin 0 -> 5625 bytes .../ui/icons/white_place_icon.paa | Bin 0 -> 5625 bytes .../ui/icons/yellow_place_icon.paa | Bin 0 -> 5625 bytes 23 files changed, 203 insertions(+), 53 deletions(-) create mode 100644 addons/marker_flags/XEH_missionDisplayLoad.sqf create mode 100644 addons/marker_flags/functions/fnc_handleScrollWheel.sqf create mode 100644 addons/marker_flags/ui/icons/black_place_icon.paa create mode 100644 addons/marker_flags/ui/icons/blue_place_icon.paa create mode 100644 addons/marker_flags/ui/icons/green_place_icon.paa create mode 100644 addons/marker_flags/ui/icons/orange_place_icon.paa create mode 100644 addons/marker_flags/ui/icons/purple_place_icon.paa create mode 100644 addons/marker_flags/ui/icons/red_place_icon.paa create mode 100644 addons/marker_flags/ui/icons/white_pickup_icon.paa create mode 100644 addons/marker_flags/ui/icons/white_place_icon.paa create mode 100644 addons/marker_flags/ui/icons/yellow_place_icon.paa diff --git a/addons/marker_flags/CfgEventHandlers.hpp b/addons/marker_flags/CfgEventHandlers.hpp index f6503c2479b..b468b9e8b5e 100644 --- a/addons/marker_flags/CfgEventHandlers.hpp +++ b/addons/marker_flags/CfgEventHandlers.hpp @@ -15,3 +15,9 @@ class Extended_PostInit_EventHandlers { init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); }; }; + +class Extended_DisplayLoad_EventHandlers { + class RscDisplayMission { + ADDON = QUOTE(_this call COMPILE_SCRIPT(XEH_missionDisplayLoad)); + }; +}; diff --git a/addons/marker_flags/CfgVehicles.hpp b/addons/marker_flags/CfgVehicles.hpp index 0c8f63fe7c8..6a615ca533d 100644 --- a/addons/marker_flags/CfgVehicles.hpp +++ b/addons/marker_flags/CfgVehicles.hpp @@ -7,6 +7,7 @@ class CfgVehicles { displayName = CSTRING(ActionPlace); condition = QUOTE(_player call FUNC(canPlace)); insertChildren = QUOTE(_this call FUNC(addActions)); + icon = QPATHTOF(ui\icons\white_place_icon.paa); }; }; }; @@ -18,34 +19,34 @@ class CfgVehicles { scopeCurator = 2; author = ECSTRING(common,ACETeam); displayName = CSTRING(white); - hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(1,1,1,1,co)"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.82,0.82,0.82,1,co)"}; }; class GVAR(black): GVAR(white) { displayName = CSTRING(black); - hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0,0,0,1,co)"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.18,0.18,0.18,1,co)"}; }; class GVAR(red): GVAR(white) { displayName = CSTRING(red); - hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(1,0,0,1,co)"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.647,0.141,0.161,1,co)"}; }; class GVAR(green): GVAR(white) { displayName = CSTRING(green); - hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0,1,0,1,co)"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.063,0.588,0.063,1,co)"}; }; class GVAR(blue): GVAR(white) { displayName = CSTRING(blue); - hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0,0,1,1,co)"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.161,0.349,0.58,1,co)"}; }; class GVAR(yellow): GVAR(white) { displayName = CSTRING(yellow); - hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(1,1,0,1,co)"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.776,0.729,0.129,1,co)"}; }; class GVAR(orange): GVAR(white) { displayName = CSTRING(orange); - hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(1,0.5,0,1,co)"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.678,0.349,0.153,1,co)"}; }; class GVAR(purple): GVAR(white) { displayName = CSTRING(purple); - hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.5,0,0.5,1,co)"}; + hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.373,0.141,0.647,1,co)"}; }; }; diff --git a/addons/marker_flags/CfgWeapons.hpp b/addons/marker_flags/CfgWeapons.hpp index 0f80e7c78bb..b4c2f881251 100644 --- a/addons/marker_flags/CfgWeapons.hpp +++ b/addons/marker_flags/CfgWeapons.hpp @@ -3,7 +3,8 @@ class CfgWeapons { class CBA_MiscItem_ItemInfo; class GVAR(white): ACE_ItemCore { - GVAR(vehicle) = GVAR(white); + GVAR(vehicle) = QGVAR(white); + GVAR(icon) = QPATHTOF(ui\icons\white_place_icon.paa); author = ECSTRING(common,ACETeam); scope = 2; displayName = CSTRING(white); @@ -18,37 +19,44 @@ class CfgWeapons { }; class GVAR(black): GVAR(white) { - GVAR(vehicle) = GVAR(black); + GVAR(vehicle) = QGVAR(black); + GVAR(icon) = QPATHTOF(ui\icons\black_place_icon.paa); displayName = CSTRING(black); picture = QPATHTOF(ui\black_ca.paa); }; class GVAR(red): GVAR(white) { - GVAR(vehicle) = GVAR(red); + GVAR(vehicle) = QGVAR(red); + GVAR(icon) = QPATHTOF(ui\icons\red_place_icon.paa); displayName = CSTRING(red); picture = QPATHTOF(ui\red_ca.paa); }; class GVAR(green): GVAR(white) { - GVAR(vehicle) = GVAR(green); + GVAR(vehicle) = QGVAR(green); + GVAR(icon) = QPATHTOF(ui\icons\green_place_icon.paa); displayName = CSTRING(green); picture = QPATHTOF(ui\green_ca.paa); }; class GVAR(blue): GVAR(white) { - GVAR(vehicle) = GVAR(blue); + GVAR(vehicle) = QGVAR(blue); + GVAR(icon) = QPATHTOF(ui\icons\blue_place_icon.paa); displayName = CSTRING(blue); picture = QPATHTOF(ui\blue_ca.paa); }; class GVAR(yellow): GVAR(white) { - GVAR(vehicle) = GVAR(yellow); + GVAR(vehicle) = QGVAR(yellow); + GVAR(icon) = QPATHTOF(ui\icons\yellow_place_icon.paa); displayName = CSTRING(yellow); picture = QPATHTOF(ui\yellow_ca.paa); }; class GVAR(orange): GVAR(white) { - GVAR(vehicle) = GVAR(orange); + GVAR(vehicle) = QGVAR(orange); + GVAR(icon) = QPATHTOF(ui\icons\orange_place_icon.paa); displayName = CSTRING(orange); picture = QPATHTOF(ui\orange_ca.paa); }; class GVAR(purple): GVAR(white) { - GVAR(vehicle) = GVAR(purple); + GVAR(vehicle) = QGVAR(purple); + GVAR(icon) = QPATHTOF(ui\icons\purple_place_icon.paa); displayName = CSTRING(purple); picture = QPATHTOF(ui\purple_ca.paa); }; diff --git a/addons/marker_flags/XEH_PREP.hpp b/addons/marker_flags/XEH_PREP.hpp index fec1927b782..628433ff1c1 100644 --- a/addons/marker_flags/XEH_PREP.hpp +++ b/addons/marker_flags/XEH_PREP.hpp @@ -1,5 +1,6 @@ PREP(addActions); PREP(canPlace); PREP(getFlags); +PREP(handleScrollWheel); PREP(pickUpFlag); PREP(placeFlag); diff --git a/addons/marker_flags/XEH_missionDisplayLoad.sqf b/addons/marker_flags/XEH_missionDisplayLoad.sqf new file mode 100644 index 00000000000..fc336ad7995 --- /dev/null +++ b/addons/marker_flags/XEH_missionDisplayLoad.sqf @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +params ["_display"]; + +_display displayAddEventHandler ["MouseZChanged", { + params ["", "_scroll"]; + [_scroll] call FUNC(handleScrollWheel); +}]; + +_display displayAddEventHandler ["MouseButtonDown", { + params ["", "_button"]; + if (GVAR(isPlacing) isNotEqualTo PLACE_WAITING) exitWith {false}; + if (_button isNotEqualTo 1) exitWith {false}; // 1 = Left mouse button + GVAR(isPlacing) = PLACE_CANCEL; +}]; diff --git a/addons/marker_flags/XEH_postInit.sqf b/addons/marker_flags/XEH_postInit.sqf index 0bed83af7b3..19011893cca 100644 --- a/addons/marker_flags/XEH_postInit.sqf +++ b/addons/marker_flags/XEH_postInit.sqf @@ -2,21 +2,29 @@ if (!hasInterface) exitWith {}; -private _weapons = (call (uiNamespace getVariable [QGVAR(flagItems), {[]}])) apply {configFile >> "CfgWeapons" >> _x}; +GVAR(isPlacing) = PLACE_CANCEL; +["ace_interactMenuOpened", {GVAR(isPlacing) = PLACE_CANCEL;}] call CBA_fnc_addEventHandler; + +private _cfgWeapons = configFile >> "CfgWeapons"; +private _weapons = (call (uiNamespace getVariable [QGVAR(flagItems), {[]}])) apply {_cfgWeapons >> _x}; { private _name = configName _x; - private _vehicle = getText (_x >> QGVAR(vehicle)); - GVAR(flagCache) set [_name, _vehicle]; + private _vehicleClass = getText (_x >> QGVAR(vehicle)); + private _displayName = getText (_x >> "displayName"); + private _icon = getText (_x >> QGVAR(icon)); + GVAR(flagCache) set [_name, [_vehicleClass, _displayName, _icon]]; private _action = [ QGVAR(pickup), LLSTRING(ActionPickUp), - "", + QPATHTOF(ui\icons\white_pickup_icon.paa), {call FUNC(pickUpFlag)}, {[_player, _target, []] call EFUNC(common,canInteractWith)}, {}, - [_name] + [_name], + [0, 0.072, 0.2], + 2 ] call EFUNC(interact_menu,createAction); - [_vehicle, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToClass); + [_vehicleClass, 0, [], _action] call EFUNC(interact_menu,addActionToClass); } forEach _weapons; diff --git a/addons/marker_flags/XEH_preStart.sqf b/addons/marker_flags/XEH_preStart.sqf index ed4901a0734..2a2bc521616 100644 --- a/addons/marker_flags/XEH_preStart.sqf +++ b/addons/marker_flags/XEH_preStart.sqf @@ -2,5 +2,5 @@ #include "XEH_PREP.hpp" -private _weapons = (configProperties [configfile >> "CfgWeapons", QUOTE(isClass _x && (isText (_x >> QQGVAR(vehicle)))), true]) apply {configName _x}; +private _weapons = (configProperties [configfile >> "CfgWeapons", QUOTE(isClass _x && {isText (_x >> QQGVAR(vehicle))}), true]) apply {configName _x}; uiNamespace setVariable [QGVAR(flagItems), compileFinal str _weapons]; diff --git a/addons/marker_flags/config.cpp b/addons/marker_flags/config.cpp index 02b054fa272..078a0d8e7e2 100644 --- a/addons/marker_flags/config.cpp +++ b/addons/marker_flags/config.cpp @@ -24,9 +24,9 @@ class CfgPatches { QGVAR(purple) }; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_interact_menu"}; + requiredAddons[] = {"ace_common", "ace_interaction", "ace_interact_menu"}; author = ECSTRING(common,ACETeam); - authors[] = {"Brett Mayson"}; + authors[] = {"Brett Mayson", "Timi007"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/marker_flags/functions/fnc_addActions.sqf b/addons/marker_flags/functions/fnc_addActions.sqf index 57112f8de97..346cdbe7f8a 100644 --- a/addons/marker_flags/functions/fnc_addActions.sqf +++ b/addons/marker_flags/functions/fnc_addActions.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brett Mayson + * Author: Brett Mayson, Timi007 * Adds the child actions for placing flags. * * Arguments: @@ -20,12 +20,13 @@ params ["_unit"]; private _actions = []; { - private _config = configFile >> "CfgWeapons" >> _x; + (GVAR(flagCache) get _x) params ["_vehicle", "_displayName", "_icon"]; + _actions pushBack [ [ _x, - getText (_config >> "displayName"), - getText (_config >> "picture"), + _displayName, + _icon, {[_this select 0, _this select 2] call FUNC(placeFlag)}, {true}, {}, diff --git a/addons/marker_flags/functions/fnc_handleScrollWheel.sqf b/addons/marker_flags/functions/fnc_handleScrollWheel.sqf new file mode 100644 index 00000000000..c6430be650a --- /dev/null +++ b/addons/marker_flags/functions/fnc_handleScrollWheel.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: Timi007 + * Handles the marker flag object height. + * + * Arguments: + * 0: Scroll amount + * + * Return Value: + * Handled + * + * Example: + * [5] call ace_marker_flags_fnc_handleScrollWheel + * + * Public: No + */ + +params ["_scrollAmount"]; + +if (GVAR(isPlacing) isNotEqualTo PLACE_WAITING) exitWith { + false +}; + +// Move object height 5cm per scroll +GVAR(objectHeight) = GVAR(objectHeight) + (_scrollAmount * 0.05); + +// Clamp height between MIN_HEIGHT and MAX_HEIGHT +GVAR(objectHeight) = MIN_HEIGHT max (GVAR(objectHeight) min MAX_HEIGHT); + +true diff --git a/addons/marker_flags/functions/fnc_pickUpFlag.sqf b/addons/marker_flags/functions/fnc_pickUpFlag.sqf index 011380c020b..f3ef5e118a6 100644 --- a/addons/marker_flags/functions/fnc_pickUpFlag.sqf +++ b/addons/marker_flags/functions/fnc_pickUpFlag.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brett Mayson + * Author: Brett Mayson, Timi007 * Places a flag in front of the unit. * * Arguments: @@ -12,17 +12,22 @@ * Nothing * * Example: - * [_flag,player,"x"] call ace_marker_flags_fnc_pickupFlag + * [_flag, player, ["ace_marker_flags_white"]] call ace_marker_flags_fnc_pickupFlag * * Public: No */ params [["_flag", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_args", [""], [[]]]]; -private _itemName = _args # 0; +_args params ["_item"]; TRACE_3("pickupFlag",_unit,_flag,_itemName); if (isNull _flag) exitWith {}; [_unit, "PutDown"] call EFUNC(common,doGesture); -deleteVehicle _flag; -[_unit, _itemName] call EFUNC(common,addToInventory); + +[{ + params ["_flag", "_unit", "_item"]; + + [_unit, _item] call EFUNC(common,addToInventory); + deleteVehicle _flag; +}, [_flag, _unit, _item], 0.7] call CBA_fnc_waitAndExecute; diff --git a/addons/marker_flags/functions/fnc_placeFlag.sqf b/addons/marker_flags/functions/fnc_placeFlag.sqf index d89bb526142..d5c4bdcb13e 100644 --- a/addons/marker_flags/functions/fnc_placeFlag.sqf +++ b/addons/marker_flags/functions/fnc_placeFlag.sqf @@ -1,14 +1,15 @@ #include "script_component.hpp" /* - * Author: Brett Mayson - * Places a flag in front of the unit. + * Author: Timi007 + * Starts the placing process of the marker flag for the player. + * Flags can be placed with the special marker flag items. * * Arguments: - * 0: Unit - * 1: Flag + * 0: Player + * 1: Flag item * * Return Value: - * Flag + * Nothing * * Example: * [player, "ace_marker_flags_white"] call ace_marker_flags_fnc_placeFlag @@ -16,12 +17,58 @@ * Public: No */ -params [["_unit", objNull, [objNull]], ["_flag", QGVAR(white), [""]]]; +params [["_player", objNull, [objNull]], ["_item", QGVAR(white), [""]]]; +TRACE_2("Placing flag", _player, _item); -_unit removeItem _flag; -_flag = GVAR(flagCache) get _flag; // convert to vehicle type -private _pos = _unit modelToWorld [0, 1, 0]; -private _flag = _flag createVehicle _pos; -_flag setPos _pos; -[QGVAR(placed), [_unit, _flag]] call CBA_fnc_localEvent; -[_unit, "PutDown"] call EFUNC(common,doGesture); +(GVAR(flagCache) get _item) params ["_vehicleClass"]; + +private _flag = _vehicleClass createVehicle [0, 0, 0]; + +TRACE_1("Created flag", _flag); + +// Set flag start height +GVAR(objectHeight) = MAX_HEIGHT; + +GVAR(isPlacing) = PLACE_WAITING; + +// Add info dialog for the player which show the controls +[LLSTRING(ActionPlace), LLSTRING(ActionCancel), LLSTRING(ActionAdjustHeight)] call EFUNC(interaction,showMouseHint); + +private _mouseClickID = [_player, "DefaultAction", { + GVAR(isPlacing) isEqualTo PLACE_WAITING +}, { + GVAR(isPlacing) = PLACE_APPROVE +}] call EFUNC(common,addActionEventHandler); + +[{ + params ["_args", "_handle"]; + _args params ["_player", "_item", "_flag", "_mouseClickID"]; + + if (isNull _flag || {!([_player, _flag] call EFUNC(common,canInteractWith))}) then { + GVAR(isPlacing) = PLACE_CANCEL; + }; + + if (GVAR(isPlacing) isNotEqualTo PLACE_WAITING) exitWith { + [_handle] call CBA_fnc_removePerFrameHandler; + call EFUNC(interaction,hideMouseHint); + [_player, "DefaultAction", _mouseClickID] call EFUNC(common,removeActionEventHandler); + + if (GVAR(isPlacing) isEqualTo PLACE_APPROVE) then { + // End position of the flag + GVAR(isPlacing) = PLACE_CANCEL; + [_player, "PutDown"] call EFUNC(common,doGesture); + _player removeItem _item; + [QGVAR(placed), [_player, _flag, _item]] call CBA_fnc_localEvent; + } else { + // Action is canceled + deleteVehicle _flag; + }; + }; + + private _pos = (eyePos _player) vectorAdd ((getCameraViewDirection _player) vectorMultiply FLAG_PLACING_DISTANCE); + // Adjust height of flag with the scroll wheel + _pos set [2, ((getPosWorld _player) select 2) + GVAR(objectHeight)]; + + _flag setPosWorld _pos; + _flag setDir (getDir _player - 90); +}, 0, [_player, _item, _flag, _mouseClickID]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/marker_flags/script_component.hpp b/addons/marker_flags/script_component.hpp index c85bdba3b13..bef8c1d4237 100644 --- a/addons/marker_flags/script_component.hpp +++ b/addons/marker_flags/script_component.hpp @@ -15,3 +15,12 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define PLACE_WAITING -1 +#define PLACE_CANCEL 0 +#define PLACE_APPROVE 1 + +#define MIN_HEIGHT -0.3 +#define MAX_HEIGHT 0.4 + +#define FLAG_PLACING_DISTANCE 2 diff --git a/addons/marker_flags/stringtable.xml b/addons/marker_flags/stringtable.xml index e10510face7..a567ed226ee 100644 --- a/addons/marker_flags/stringtable.xml +++ b/addons/marker_flags/stringtable.xml @@ -25,12 +25,29 @@ 不管地形表面是什么都可以放标记旗 - Place Flag - Flagge platzieren - Postaw chorągiewkę - 旗を設置 - 깃발 배치 - 放置标记旗 + Place Marker Flag + Markierungsfahne platzieren + + + Adjust height + Höhe anpassen + + + Cancel + Abbrechen + Cancelar + Anuluj + Annuler + Zrušit + Annulla + Mégsem + Cancelar + Отмена + 中止 + 취소 + 取消 + 取消 + Iptal Pick Up diff --git a/addons/marker_flags/ui/icons/black_place_icon.paa b/addons/marker_flags/ui/icons/black_place_icon.paa new file mode 100644 index 0000000000000000000000000000000000000000..5526fc2c921540bd5e162dc441ab9fb26516973f GIT binary patch literal 5625 zcmeHLL1+^}6#Y#TX)b9{7kUv_+>6$8uGyd@q(s|dHh2sbauCG=O<|1=2}6B~Ca?q`;rw=@60`7?ipogWjqT&8$4SIR^I zpxJC*cJaN;ZNdVDa4u8G5}w0{@ZD^7RmZx8&x<5L^&-Ga1>g%l(}@l`09x>b2)R!0 zzr|bow%NALDC_4tF23qnFAB)lwR{BayKKg^cwp~R%hQkXn3*qVd>|^{v^zVR98X72 z96F1KG~ObLH*Ov#&%?wRI*YyebZ?&Q#86mK@_8SE!UE=!RG42tyhdeK{tM6}8kW%i zv$6gw-5;CX)J9vbzZ;)5O~&n%c%}Qk-+E%Y_Rd25OFwD3$Tiyng*} zop!&gpaM{aVIU_B`-)|o&mKSOa(e->cC?2O^@^nuCM0U^otLm-7}(x$ME|SXt|&4) z!TKJZye9q;TY6#_3+wYS^ZD)QwOU0()CY$VQL#`3>1WPgu#Pr0cbNf7rEN^eh*xx{ zAwI)+4FyXy9IstbuCsfS`|D}2zcA)M8GmFk?^?Irel6xM4f7p!(KE%wtYcH=&zFrP^)RsHT}>(;Pg-N~0RJJ^2r zbNu#849CLu9LSv4urTHxlj2ne$*U&v|K9$%y#-jHwCF7-Rav&nA4y5qb;ON+>#0mS gKpEn7HD14QlG!Mps5qb3-c%lbcuwp9OET5^3-p1z-T(jq literal 0 HcmV?d00001 diff --git a/addons/marker_flags/ui/icons/blue_place_icon.paa b/addons/marker_flags/ui/icons/blue_place_icon.paa new file mode 100644 index 0000000000000000000000000000000000000000..8f899cae24326b7f215b483845e2a637f081a9e8 GIT binary patch literal 5625 zcmeHLL2DCH5T2%qbT4VD21F1e?nUZ3*X&|RNQt(^Z15N=}6 z+=C#lXTe?r5tLGrlVqVF1e!i)UNWnFC4`hnZQS84yWh^f`QE%Y@3Av6k;|FIJGqh> z1%UT&-&~jYfq9p(Kp~tn3t7T*coDvz&8`{v?BMk(0Z_dRu#*J%iq~XffB}FOhC+n= zO!w2`?E}|txptKM=i3tB6r#I?W{U#ybv++J`x0A|;(@(u&0+r-kD2+-8uvuyyMAv^ z5606r;)mYiA&s|)!n2&Xx~tJQlVWHu`tuoop6ta?&e~si(E@tnU9=_gD2V^#Azz zug=e`<8b}M_5bt#XV&9g^)HP7F#iAN_}}h*c^Ji%m-8QWfBb7W1t|ckFbrhWux~i7 z{o?794(khu^`kCAOyi5C5*8$CGUp|1Sr+OWp6Gv*`eZVwPH_Kmd?)md5#Ptg{rQ;b zeHf8e14L5Th#%>v&R=kjwsg77-6ixM3o_!hjyK}7EP#R|8s1R zJU>&{hy2IlZ|d_qX8p>--CRyT`fJBZf=Yo@WE=>GQOdip@5j47h4nhhC8y~ z_Qumw)4R^xE{(T>B4#;0|4pHPCdJU3bK`k8PWF;0Vf*XnXE2kYCOl)1YEU~a{~4$; z8C&H4=~(}T{*TpuZl&X`KM$CO?8X0tc%lDc(0*)kd#54(f9D70zX15A`OuGuz2xWi z#7;6aD)LWI1cm+iA2fg1e3AeA_y4fhBWV6;{iF5&^ZXNZ{DsXI#eWq4|8xAW?R>hI zz$i}`Y@)x|X6~$yxmE+jve<|p>5rYiZ0)Vee3`q7VZ6bD40|c# zp!u<0e+y-cwVaV&lCBANP(S4{-RHkBIJLczfq(8F@$ZYjpy$8J>=h+<|HQVH43z?@ z$T$=c7Fp-arkmb!DXf=J&RHEd&$jd8_U`}RkC&Zvw_X3vt947LTy{!TtPXb8fBJ8~ z2d9Mt+F2Q!7?0onVR+F&^16xq2iy1epM_Z}i{5Z@HN~!eB)3&nMcf*+pLj(Fs6wil cO*QAonN8r1it~B(UG2ffGh*LRE_kKZUzbTV%K!iX literal 0 HcmV?d00001 diff --git a/addons/marker_flags/ui/icons/orange_place_icon.paa b/addons/marker_flags/ui/icons/orange_place_icon.paa new file mode 100644 index 0000000000000000000000000000000000000000..7477a4a07f6db241ff2fad17729e02168da2c738 GIT binary patch literal 5625 zcmeHLL1@!Z82;C_vR=BP20SQ6%thz9*Cr?}9o22v1dnAx4`STSb5y3cQVQa!2=>;y zxf-cA!E>R4GDdq*7Fd`J);<3}?aN%GZ0%;kFh4IOA209!{{OxIf4ui6SU#_mZs#>6 z4gl{y{krPn2g+T-425uBDdq^z;6wO+F1IA(w}H>AG(hztz-s~ED?XEn3^D*}7zq*b zZ+cIQ*SAf*YwB@6zR+{=b;jBbsx2`n)TKfU^}AS|6c6=X>5RrFxXqj|Y`n`V-=%vS zl4nm(PVHIqdt`43h0k)^Y5r)TOp2j5Z_j4!S<;t43EN*kKZBVxHSRxyWR2Qs`OiR( zN!TL)&&K*M_IK9$nboeh{%*k3BrpCa#Ebn8gU&PE)pr)+{~$jw|2e=n&4+qI>?Oae zkMATyr9A&QMNrtE|3UMI%@_H9c>fQ3J%Z+s)<0VRKhHlw$6wfdQT#{o|3An7`tFy9 zalG;db>2E@zKb9NP=#SA8ubgpP3{i%PkBuD`Og(jt#72@*yAJqL-7~%{Fj-zx{!JF&$g8` zl>({AI20ZhqIGW5PHowgM$0G{jINz!+gW~l_y6z5D^_ZwQ~l{y>y{0G6{}Fj>Y#gj zR}ZpcY+6{LoR_e1d;I#3!b=vCS9Rn+UfRvU9F;}ySeeR#S^i9J%d(8PG3Y$^iVjeQ fWL-?wZ;ewM#~l^t^Tzwi-HYpz3JKY-fkBKo0zMyfRRldmA zHe`1^9VM}CC%0+5B@{8sm#W|HucJ(gp_6oGv(7Bpi=hPVua}>}Op2QDpFzA%?Xdi3 zphRSBq5nr?{TI65SG$>&w!8j3VCu3P{}bYc?%P4@fx+z^h4}xKADI6F;G5<{J0NzG zpW72V$K&=(QQJ3WMWjW6js79{HY&P!O+G}Je3 zHu%i->9kv&5dHV#`$KOkiA`*xzu0E_AI4m(0U{DM;z#;J=P#N&t1@5aWL4K+U_pjG zlX1}eSg)-^(PT|~q)(?W2zO9Fx?jQ2+ia)>Szs#(a`OK||>iwqUTUpFQJ?;+fJ5kWyS5?`@a`2+lh@h+ov1g literal 0 HcmV?d00001 diff --git a/addons/marker_flags/ui/icons/red_place_icon.paa b/addons/marker_flags/ui/icons/red_place_icon.paa new file mode 100644 index 0000000000000000000000000000000000000000..c0fcea90480e77afec22db7d8f1ec28865aa1726 GIT binary patch literal 5625 zcmeHLL1+^}6#Y#TX)b9{1HFhV?nUc4*X*Jsq(s|dcJUZ09sXTggH15uPxl9P0ypcI;p|IcQ&&Dzo=jT?&lnPvCw?Ei26&i}*AkFi`%E#A)Q zY7_uAHa=hF_1e-|6%<9 z&+)&u_vv92kGw(cx6YdH5=a14VQ}T7VP7*XDEA#0`|7=-FQYny%jIM|JbwG9;YAzCD+cl(Z{M#!12a?>yE literal 0 HcmV?d00001 diff --git a/addons/marker_flags/ui/icons/white_pickup_icon.paa b/addons/marker_flags/ui/icons/white_pickup_icon.paa new file mode 100644 index 0000000000000000000000000000000000000000..bc5d4ac7e4c6f413af9ad5a7d0e9edb0ce6e5ff8 GIT binary patch literal 5625 zcmeHLPe>F|82>UwJA{K71yQbLbTL|}Bv5cA*gs}=D568qYF3w3IxPw5jzx9JRjdvX zp$EZRn1{JK9ZDk*qeEK;yOvlTa;KzpX@=MLX7_um)1P5Ab%P#nbbkBZ`@Zk@dw=G= zm&ZJwniGdTCu?#6z%Y#cCO%bjlw*d8V^2+;o8xu(aD3eDKIX!A8J`;xK)4v-&Sro& z_+*w`-~vDksl*-9JOBS5FHMhY38hnQ)uW`JZ(3=d8jEvi>dU~Fvru0<4AY=ho2`@W z(cZ?1hiwyNkNPZIFp|u1V5WE&tdn>aI5o8h;Y5b=gQva>A|FyQiT>g@VlcmBh=7$4tviP!hy|?O}DSv-A@>R~hqwyh)k4E`B zPu#XN-eJ71HbR80{<00*@t68I--b%!_`uqKX8sjx* zOQ=5DU-bQim}xF;FC_rgUu`{X`CH<14L*q*V_iJlUycW9kbMua&m&a6+I%wgXUCt< z|H@!Ey&qKh(KbCEaK7{8Aik0|tiSHqEA~%jDgL4IY{S5Hu zA>sQXa8WCkZ_xkVu$9&IRhY>ilmC3I1UaPTW2X96J{e<+|4nkDmw6jSw}FhF@MKT^ zHpwAl}Cs55;iMvv5N5wZeMzTSo~j-D;gIb>&n@Yw`JZTv2B$Jhu5+ zu*nl_+Cu!Cx0Qx>Gx2`HRdHNaLZw1)DUNFpv~#PtA-~d z;mMuU-t|m>J~Dh-#IwWFEd@}(uSH|<^j@*=?g46csPC!~xtmr~@&^MKg8l(2pN00E b-Hk(g22oo;-&tNL1)jAe7fgfxA@|YN6mlSdb;r^^S{6U>z1Fm<4N+Lem>GHyx?3`c*swGvZowkrf&X nUj2+@7g>AI+5aDQ9kMMW+xkF$l_rBbDz4}J_r})gS5^HMzDF)n literal 0 HcmV?d00001 diff --git a/addons/marker_flags/ui/icons/yellow_place_icon.paa b/addons/marker_flags/ui/icons/yellow_place_icon.paa new file mode 100644 index 0000000000000000000000000000000000000000..965a36185fa79559dcbb4161a89cf29fb4f550ca GIT binary patch literal 5625 zcmeHLL1+^}6#Y#TX)b9{mwHfKaW7iWxn_eUAtl-tvx~=2AqR2o&GV{MZy^Lc20iy~ zuC8anb0AWsl+DQ|P!I}D$Nwk!Yq}Dev~@#qKeNofotgjU&-_2^{Fun)GR6BjGZO`X z53RkM5FZ%`P5e-Xd z|Hat<<@T?Qc51!l?Z0%Gs^jINqrZ=|Nq1X#yNDD02_p!uiG7utXP{GaxI1kE4rf4Kj{|35+d-?aHc{}28DfA;^)gRf7bc;yZ1 zf9tIAu7V0c8HT=$n)WTbVZDCwyv^+e#M)5@AztH6)5L^CRo;0C8-{`Hbw~8R%XUTa zvJ*W1B)-4eZ9TDzg~#(Tv(OoFtp_gLXx^%jRG^_85|}vCn>1G4}YufK&Gm`H%Tu(Cc3kjrGOU(|>lXBqu*LYJwyNi literal 0 HcmV?d00001