Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

adminMenu - Add Menu to Add or Edit Markers #658

Merged
merged 13 commits into from
Feb 28, 2025
327 changes: 308 additions & 19 deletions addons/adminMenu/Interrupt_adminMenu.hpp

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion addons/adminMenu/XEH_PREP.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ PREP(uihook_endMission);
PREP(uihook_missionHint);
PREP(uihook_openEndMission);
PREP(uihook_giveAdminGun);
PREP(uihook_safeStart);
PREP(uihook_handleMarkerDialogUI);
PREP(uihook_tabChange);
PREP(uihook_safeStart);
PREP(uihook_supplySpawn);
PREP(uihook_resetGearButton);
PREP(uihook_resetMarkersButton);
Expand Down
13 changes: 7 additions & 6 deletions addons/adminMenu/functions/fnc_uihook_attachMarkerGroup.sqf
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "script_component.hpp"
#include "\z\potato\addons\markers\defaultMarkerDefines.hpp"
/*
* Author: Lambda.Tiger
* Attach marker to a group based on currrent selections in the admin menu;
Expand Down Expand Up @@ -38,12 +39,12 @@ if (_markerArray isEqualTo []) exitWith {
TRACE_1("Bad marker selected",_hashKey);
};
if (group (_markerArray#0) != group _selectedUnit) then {
private _newHashKey = groupId group _selectedUnit;
[
_newHashKey,
getPosATL _selectedUnit, _selectedUnit, side _selectedUnit,
_markerArray#1, _markerArray#3, _markerArray#2, _markerArray#4
] remoteExecCall [QEFUNC(markers,addMarker)];
private _newHashKey = str side _selectedUnit + groupId group _selectedUnit;
private _newMarkerArray = [_newHashKey, getPosATL _selectedUnit,
_selectedUnit, side _selectedUnit, _markerArray#1, _markerArray#3,
_markerArray#2, _markerArray#4];
EGVAR(markers,markerCache) setVariable [POTATO_MARKER_JIP_PREFIX + _newHashKey, _newMarkerArray, true];
_newMarkerArray remoteExecCall [QEFUNC(markers,addMarker)];
[_hashKey] remoteExecCall [QEFUNC(markers,deleteMarker)];
} else {
[_hashKey, _selectedUnit] remoteExecCall [QEFUNC(markers,transferMarker)];
Expand Down
13 changes: 6 additions & 7 deletions addons/adminMenu/functions/fnc_uihook_attachMarkerUnit.sqf
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "script_component.hpp"
#include "\z\potato\addons\markers\defaultMarkerDefines.hpp"
/*
* Author: Lambda.Tiger
* Attach marker to a unit based on currrent selections in the admin menu;
Expand Down Expand Up @@ -38,17 +39,15 @@ if (_markerArray isEqualTo []) exitWith {
TRACE_1("Bad marker selected",_hashKey);
};

private _newHashKey = str _selectedUnit;
private _newHashKey = str side _selectedUnit + str _selectedUnit;
private _itr = 0;
while {(_newHashKey == _hashKey || (_newHashKey in EGVAR(markers,markerHash))) && _itr < 25 } do {
_newHashKey = (str _selectedUnit) + str _itr;
_newHashKey = str side _selectedUnit + str _selectedUnit + str _itr;
_itr = _itr + 1;
};
[
_newHashKey,
getPosATL _selectedUnit, _selectedUnit, side _selectedUnit,
_markerArray#1, _markerArray#3, _markerArray#2, _markerArray#4
] remoteExecCall [QEFUNC(markers,addMarker)];
private _newMarkerArray = [_newHashKey, getPosATL _selectedUnit, _selectedUnit, side _selectedUnit, _markerArray#1, _markerArray#3, _markerArray#2, _markerArray#4];
EGVAR(markers,markerCache) setVariable [POTATO_MARKER_JIP_PREFIX + _newHashKey, _newMarkerArray, true];
_newMarkerArray remoteExecCall [QEFUNC(markers,addMarker)];
[_hashKey] remoteExecCall [QEFUNC(markers,deleteMarker)];

["potato_adminMsg", [
Expand Down
144 changes: 144 additions & 0 deletions addons/adminMenu/functions/fnc_uihook_handleMarkerDialogUI.sqf
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
#include "script_component.hpp"

#ifdef GLUE
#undef GLUE
#endif
#define GLUE(var1,var2) var1##var2
#ifdef PATHTOF
#undef PATHTOF
#endif
#define PATHTOF(var) GLUE(\z\potato\addons\markers\,var)
#ifdef QPATHTOF
#undef QPATHTOF
#endif
#define QPATHTOF(var) QUOTE(PATHTOF(var))
#include "\z\potato\addons\markers\defaultMarkerDefines.hpp"
#define POTATO_MARKER_ERROR_MARKSLCT 10
#define POTATO_MARKER_ERROR_CACHE 20
#define POTATO_MARKER_ERROR_UNITSLCT 30
/*
* Author: Lambda.Tiger
* Handle opening and closing of the marker dialog
*
* Arguments:
* None
*
* Return Value:
* None
*
* Examples:
* [false] call potato_adminMenu_uihook_handleMarkersDialogUI;
*
* Public: No
*/
params [
["_display", displayNull, [displayNull]],
["_exitCode", -1, [0, configNull]]
];
TRACE_2("params",_display,_exitCode);

if (_exitCode isEqualType configNull) then {_exitCode = -1};
switch (_exitCode) do {
case -1: { // opening
private _markerControl = UI_TAB_MARKERS_MARKERS;
private _selectedMarkerIndex = lbCurSel _markerControl;
TRACE_2("Editing marker:",GVAR(editMarker),_selectedMarkerIndex);
if (GVAR(editMarker)) then { // we need an active marker
if (_selectedMarkerIndex < 0) exitWith {_display closeDisplay POTATO_MARKER_ERROR_MARKSLCT};
// Find hashkey and make sure it exists
private _hashKey = _markerControl lbData _selectedMarkerIndex;
private _markerArray = EGVAR(markers,markerHash) getOrDefault [_hashKey, []];
if (_markerArray isEqualTo []) exitWith {_display closeDisplay POTATO_MARKER_ERROR_CACHE};
_markerArray params ["", "_text", "_icon", "_color", "_size"];

// Setup the display for the current marker
(_display displayCtrl POTATO_MARKER_TEXT_IDC) ctrlSetText _text;
private _colorIdx = COLOR_INDEX_ARRAY find _color;
if (_colorIdx >= 0 && _colorIdx < 8) then {
(_display displayCtrl POTATO_MARKER_COLOR_IDC) lbSetCurSel _colorIdx;
};
switch (_size) do {
case 16: {(_display displayCtrl POTATO_MARKER_SIZE_IDC) lbSetCurSel 0};
case 32: {(_display displayCtrl POTATO_MARKER_SIZE_IDC) lbSetCurSel 2};
default {(_display displayCtrl POTATO_MARKER_SIZE_IDC) lbSetCurSel 1};
};
private _iconIdx = [UNIT_MARKERS_STRINGS] find _icon;
if (_iconIdx >= 0 && _iconIdx < 20) then {
(_display displayCtrl POTATO_MARKER_ICON_IDC) lbSetCurSel _iconIdx;
};
(_display displayCtrl POTATO_MARKER_UNIT_IDC) ctrlShow false;
(_display displayCtrl POTATO_MARKER_OK_IDC) ctrlSetText "Update";
} else {
// find the unit and make sure it's valid
private _selectedUnit = missionNamespace getVariable [
UI_TAB_MARKERS_PLAYERS lbData (lbCurSel UI_TAB_MARKERS_PLAYERS),
objNull
];
if (isNull _selectedUnit) then {_display closeDisplay POTATO_MARKER_ERROR_UNITSLCT};
(_display displayCtrl POTATO_MARKER_UNIT_IDC) ctrlShow true;
(_display displayCtrl POTATO_MARKER_OK_IDC) ctrlSetText "Create";
};
};
case 1: { // ok
// Gather dialog parameters
private _text = ctrlText (_display displayCtrl POTATO_MARKER_TEXT_IDC);
private _size = switch(lbCurSel (_display displayCtrl POTATO_MARKER_SIZE_IDC)) do {
case 0: {16};
case 2: {32};
default {24};
};
private _iconIdx = lbCurSel (_display displayCtrl POTATO_MARKER_ICON_IDC);
private _colorIdx = lbCurSel (_display displayCtrl POTATO_MARKER_COLOR_IDC);

TRACE_5("Closing Dialog:",GVAR(editMarker),_text,_size,_colorIdx,_iconIdx);
if (GVAR(editMarker)) then { // Editing existing marker
private _markerControl = UI_TAB_MARKERS_MARKERS;
private _selectedMarkerIndex = lbCurSel _markerControl;
private _hashKey = _markerControl lbData _selectedMarkerIndex;
[_hashKey, _text, _size, _colorIdx, _iconIdx] remoteExecCall [QEFUNC(markers,updateMarker)];
["potato_adminMsg",
[format ["Edited marker %1 (%2)", _text, _hashKey], profileName]
] call CBA_fnc_GlobalEvent;
} else { // Creating new marker
private _selectedUnit = missionNamespace getVariable [
UI_TAB_MARKERS_PLAYERS lbData (lbCurSel UI_TAB_MARKERS_PLAYERS),
objNull
];
private _hashKey = if (cbChecked (_display displayCtrl POTATO_MARKER_UNIT_IDC)) then {
str side _selectedUnit + groupId group _selectedUnit
} else {
str side _selectedUnit + str _selectedUnit
};
private _markerArray = [
_hashKey,
getPosATL _selectedUnit, _selectedUnit, side _selectedUnit,
_text, _colorIdx, _iconIdx, _size
];
EGVAR(markers,markerCache) setVariable [POTATO_MARKER_JIP_PREFIX + _hashKey, _markerArray, true];
_markerArray remoteExecCall [QEFUNC(markers,addMarker)];
["potato_adminMsg",
[format ["Created new marker %1 (%2)", _text, _hashKey], profileName]
] call CBA_fnc_GlobalEvent;
};
call FUNC(reloadMarkersTab);
};
case POTATO_MARKER_ERROR_MARKSLCT: { // Invalid marker - not marker selected
["potato_adminMsg",
["Could not find a selected marker", "Marker Dialog", profileName]
] call CBA_fnc_localEvent;

};
case POTATO_MARKER_ERROR_CACHE: { // Invalid marker - no hash
["potato_adminMsg",
["Could not find selected marker in cache", "Marker Dialog", profileName]
] call CBA_fnc_localEvent;

};
case POTATO_MARKER_ERROR_UNITSLCT: { // Invalid Unit
["potato_adminMsg",
["No valid unit selected to add marker to", "Marker Dialog", profileName]
] call CBA_fnc_localEvent;

};
default {};
};
4 changes: 2 additions & 2 deletions addons/adminMenu/functions/fnc_uihook_tabChange.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -282,9 +282,9 @@ case UI_TABS_INDEX_MARKERS: {
[
_display displayCtrl IDC_LISTBOX_MARKERS_PLAYERS,
{
private _markerArr = EGVAR(markers,markerHash) getOrDefault [str _this, []];
private _markerArr = EGVAR(markers,markerHash) getOrDefault [str side _this + str _this, []];
if (_markerArr isEqualTo []) then {
_markerArr = EGVAR(markers,markerHash) getOrDefault [groupId group _this, [objNull, ""]];
_markerArr = EGVAR(markers,markerHash) getOrDefault [str side _this + groupId group _this, [objNull, ""]];
};
private _markerText = ["", _markerArr#1] select (_markerArr#0 == _this);
private _side = if (count _markerArr >= 7) then {
Expand Down
11 changes: 9 additions & 2 deletions addons/adminMenu/script_component.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,16 @@
#define UI_TAB_MARKERS_PLAYERS ((uiNamespace getVariable QGVAR(adminMenuDialog)) displayCtrl IDC_LISTBOX_MARKERS_PLAYERS)
#define UI_TAB_MARKERS_MARKERS ((uiNamespace getVariable QGVAR(adminMenuDialog)) displayCtrl IDC_LISTBOX_MARKERS_MARKERS)

#define POTATO_MARKER_JIP_PREFIX "potato_marks:"

#define UI_TABS_NAMES ["Zeus", "Supplies", "End Mission", "Teleport", "Safe Start", "Tests", "Send Hint", "Player Fixes", "Give Items", "Markers"]
#define UI_TABS_CONTROLS [UI_TAB_ZEUS, UI_TAB_SUPPLIES, UI_TAB_END, UI_TAB_TELEPORT, UI_TAB_SAFESTART, UI_TAB_CHECKMODS, UI_TAB_MISSIONHINT, UI_TAB_FIX_UNIT, UI_TAB_GIVE_ITEMS, UI_TAB_MARKERS]

#define UI_TABS_INDEX_MARKERS 9

// Markers sub menu
#define POTATO_MARKER_MENU_IDD 250224
#define POTATO_MARKER_TEXT_IDC 2300
#define POTATO_MARKER_SIZE_IDC 2301
#define POTATO_MARKER_COLOR_IDC 2302
#define POTATO_MARKER_ICON_IDC 2303
#define POTATO_MARKER_UNIT_IDC 2304
#define POTATO_MARKER_OK_IDC 1
125 changes: 125 additions & 0 deletions addons/markers/defaultMarkerDefines.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#define RED_ARRAY [0.9,0,0,1]
#define YELLOW_ARRAY [0.9,0.9,0,1]
#define GREEN_ARRAY [0,0.8,0,1]
#define BLUE_ARRAY [0,0,1,1]
#define WHITE_ARRAY [1,1,1,1]
#define ORANGE_ARRAY [1,0.647,0,1]
#define BLACK_ARRAY [0,0,0,1]
#define PINK_ARRAY [1,0.753,0.796,1]

#define COLOR_TO_MARKER_HASH [\
[\
QUOTE(RED_ARRAY),\
QUOTE(YELLOW_ARRAY),\
QUOTE(GREEN_ARRAY),\
QUOTE(BLUE_ARRAY),\
QUOTE(WHITE_ARRAY),\
QUOTE(ORANGE_ARRAY),\
QUOTE(BLACK_ARRAY),\
QUOTE(PINK_ARRAY)\
], [\
"Red",\
"Yellow",\
"Green",\
"Blue",\
"White",\
"Yellow",\
"Black",\
"White"\
]\
]

#define COLOR_INDEX_ARRAY [\
RED_ARRAY,\
YELLOW_ARRAY,\
GREEN_ARRAY,\
BLUE_ARRAY,\
WHITE_ARRAY,\
ORANGE_ARRAY,\
BLACK_ARRAY,\
PINK_ARRAY\
]

#define DEFAULT_MARKER_TEXT ""
#define DEFAULT_MARKER_ICON QPATHTOF(data\infantry.paa)
#define DEFAULT_MARKER_ICON_INDEX 1
#define DEFAULT_MARKER_COLOR_TEXT "white"
#define DEFAULT_MARKER_COLOR WHITE_ARRAY
#define DEFAULT_MARKER_COLOR_INDEX 4
#define DEFAULT_MARKER_SIZE 24

#define UNIT_MARKER_ICON "\A3\ui_f\data\map\markers\military\start_CA.paa"
#define UNIT_MARKER_SIZE 12

#define UNIT_MARKERS 'PATHTOF(data\unknown.paa)',\
'PATHTOF(data\infantry.paa)',\
'PATHTOF(data\motorized_infantry.paa)',\
'PATHTOF(data\mechanized_infantry.paa)',\
'PATHTOF(data\hq.paa)',\
'PATHTOF(data\mmg.paa)',\
'PATHTOF(data\mat.paa)',\
'PATHTOF(data\msam.paa)',\
'PATHTOF(data\mortar.paa)',\
'PATHTOF(data\engineer.paa)',\
'PATHTOF(data\maintenance.paa)',\
'PATHTOF(data\recon.paa)',\
'PATHTOF(data\support.paa)',\
'PATHTOF(data\medical.paa)',\
'PATHTOF(data\artillery.paa)',\
'PATHTOF(data\armor.paa)',\
'PATHTOF(data\helicopter.paa)',\
'PATHTOF(data\attack_helicopter.paa)',\
'PATHTOF(data\fixed_wing.paa)',\
'PATHTOF(data\attack_fixed_wing.paa)'

#define UNIT_MARKERS_STRINGS QPATHTOF(data\unknown.paa),\
QPATHTOF(data\infantry.paa),\
QPATHTOF(data\motorized_infantry.paa),\
QPATHTOF(data\mechanized_infantry.paa),\
QPATHTOF(data\hq.paa),\
QPATHTOF(data\mmg.paa),\
QPATHTOF(data\mat.paa),\
QPATHTOF(data\msam.paa),\
QPATHTOF(data\mortar.paa),\
QPATHTOF(data\engineer.paa),\
QPATHTOF(data\maintenance.paa),\
QPATHTOF(data\recon.paa),\
QPATHTOF(data\support.paa),\
QPATHTOF(data\medical.paa),\
QPATHTOF(data\artillery.paa),\
QPATHTOF(data\armor.paa),\
QPATHTOF(data\helicopter.paa),\
QPATHTOF(data\attack_helicopter.paa),\
QPATHTOF(data\fixed_wing.paa),\
QPATHTOF(data\attack_fixed_wing.paa)

// e.g. "'\z\potato\addons\markers\data\unknown.paa'"
#define UNIT_MARKERS_STRINGS_STRINGS QUOTE('PATHTOF(data\unknown.paa)'),\
QUOTE('PATHTOF(data\infantry.paa)'),\
QUOTE('PATHTOF(data\motorized_infantry.paa)'),\
QUOTE('PATHTOF(data\mechanized_infantry.paa)'),\
QUOTE('PATHTOF(data\hq.paa)'),\
QUOTE('PATHTOF(data\mmg.paa)'),\
QUOTE('PATHTOF(data\mat.paa)'),\
QUOTE('PATHTOF(data\msam.paa)'),\
QUOTE('PATHTOF(data\mortar.paa)'),\
QUOTE('PATHTOF(data\engineer.paa)'),\
QUOTE('PATHTOF(data\maintenance.paa)'),\
QUOTE('PATHTOF(data\recon.paa)'),\
QUOTE('PATHTOF(data\support.paa)'),\
QUOTE('PATHTOF(data\medical.paa)'),\
QUOTE('PATHTOF(data\artillery.paa)'),\
QUOTE('PATHTOF(data\armor.paa)'),\
QUOTE('PATHTOF(data\helicopter.paa)'),\
QUOTE('PATHTOF(data\attack_helicopter.paa)'),\
QUOTE('PATHTOF(data\fixed_wing.paa)'),\
QUOTE('PATHTOF(data\attack_fixed_wing.paa)')

#define UNIT_MARKER_SIZES 16,24,32
#define UNIT_MARKER_SIZES_STRINGS "Small","Medium","Large"

#define UNIT_MARKER_COLORS "white","red","blue","green","orange","yellow","pink","black"
#define UNIT_MARKER_COLORS_STRINGS "White","Red","Blue","Green","Orange","Yellow","Pink","Black"

#define POTATO_MARKER_JIP_PREFIX "marker:"
#define POTATO_MARKER_JIP_PREFIX_LENGTH 7
Loading