From 6769189e7c9674cf3448222adf0c75babad702f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sun, 11 Jan 2015 16:32:51 -0300 Subject: [PATCH] AGM_Interaction pre CBA --- addons/interaction/Menu_Config.hpp | 632 +++++++++++++++++ addons/interaction/UI/CenterIcon_ca.paa | Bin 0 -> 11081 bytes addons/interaction/UI/IconInteraction_ca.paa | Bin 0 -> 5625 bytes addons/interaction/UI/backArrow_ca.paa | Bin 0 -> 1522 bytes addons/interaction/UI/command_rose_ca.paa | Bin 0 -> 40311 bytes addons/interaction/UI/dot_ca.paa | Bin 0 -> 1522 bytes addons/interaction/UI/gestures_ca.paa | Bin 0 -> 22016 bytes addons/interaction/UI/mouse_left_ca.paa | Bin 0 -> 5625 bytes addons/interaction/UI/mouse_right_ca.paa | Bin 0 -> 5625 bytes addons/interaction/UI/mouse_scroll_ca.paa | Bin 0 -> 5625 bytes addons/interaction/UI/team/team_blue_ca.paa | Bin 0 -> 22016 bytes addons/interaction/UI/team/team_green_ca.paa | Bin 0 -> 22016 bytes .../UI/team/team_management_ca.paa | Bin 0 -> 22016 bytes addons/interaction/UI/team/team_red_ca.paa | Bin 0 -> 22016 bytes addons/interaction/UI/team/team_white_ca.paa | Bin 0 -> 22016 bytes addons/interaction/UI/team/team_yellow_ca.paa | Bin 0 -> 22016 bytes addons/interaction/clientInit.sqf | 12 + addons/interaction/config.cpp | 664 ++++++++++++++++++ .../functions/fn_AddSelectableItem.sqf | 40 ++ .../interaction/functions/fn_GetActions.sqf | 154 ++++ addons/interaction/functions/fn_MoveDown.sqf | 66 ++ .../functions/fn_addInteraction.sqf | 55 ++ .../functions/fn_addInteractionSelf.sqf | 55 ++ .../interaction/functions/fn_addToTooltip.sqf | 3 + .../interaction/functions/fn_applyButtons.sqf | 51 ++ .../functions/fn_canInteractWith.sqf | 12 + .../interaction/functions/fn_canLockDoor.sqf | 16 + .../functions/fn_canTapShoulder.sqf | 11 + .../interaction/functions/fn_getActions2.sqf | 120 ++++ .../functions/fn_getCaptivityStatus.sqf | 3 + addons/interaction/functions/fn_getDoor.sqf | 31 + .../functions/fn_getDoorAnimations.sqf | 106 +++ addons/interaction/functions/fn_getDown.sqf | 33 + .../functions/fn_getSelectedButton.sqf | 23 + addons/interaction/functions/fn_hideMenu.sqf | 22 + .../functions/fn_hideMouseHint.sqf | 22 + .../functions/fn_initialiseInteraction.sqf | 167 +++++ addons/interaction/functions/fn_isInRange.sqf | 49 ++ addons/interaction/functions/fn_joinTeam.sqf | 20 + addons/interaction/functions/fn_lockDoor.sqf | 27 + .../interaction/functions/fn_menuKeyInput.sqf | 16 + .../functions/fn_moduleInteraction.sqf | 20 + .../interaction/functions/fn_onButtonDown.sqf | 14 + .../functions/fn_onButtonDownSelf.sqf | 14 + .../interaction/functions/fn_onButtonUp.sqf | 44 ++ addons/interaction/functions/fn_onClick.sqf | 44 ++ .../functions/fn_onSelectMenuDblClick.sqf | 3 + addons/interaction/functions/fn_openDoor.sqf | 56 ++ addons/interaction/functions/fn_openMenu.sqf | 6 + .../functions/fn_openMenuSelectUI.sqf | 43 ++ .../interaction/functions/fn_openMenuSelf.sqf | 3 + .../functions/fn_openSelectMenu.sqf | 43 ++ .../interaction/functions/fn_openSubMenu.sqf | 3 + .../functions/fn_openSubMenuSelf.sqf | 3 + .../functions/fn_prepareSelectMenu.sqf | 35 + addons/interaction/functions/fn_push.sqf | 21 + .../functions/fn_removeInteraction.sqf | 35 + .../functions/fn_removeInteractionSelf.sqf | 35 + addons/interaction/functions/fn_removeTag.sqf | 19 + addons/interaction/functions/fn_sendAway.sqf | 35 + .../functions/fn_setCaptivityStatus.sqf | 3 + addons/interaction/functions/fn_showMenu.sqf | 118 ++++ .../functions/fn_showMouseHint.sqf | 54 ++ .../functions/fn_sortOptionsByPriority.sqf | 20 + .../interaction/functions/fn_tapShoulder.sqf | 20 + .../functions/fn_updateTooltipPosition.sqf | 12 + addons/interaction/rsc/button1.paa | Bin 0 -> 24483 bytes addons/interaction/stringtable.xml | 652 +++++++++++++++++ 68 files changed, 3765 insertions(+) create mode 100644 addons/interaction/Menu_Config.hpp create mode 100644 addons/interaction/UI/CenterIcon_ca.paa create mode 100644 addons/interaction/UI/IconInteraction_ca.paa create mode 100644 addons/interaction/UI/backArrow_ca.paa create mode 100644 addons/interaction/UI/command_rose_ca.paa create mode 100644 addons/interaction/UI/dot_ca.paa create mode 100644 addons/interaction/UI/gestures_ca.paa create mode 100644 addons/interaction/UI/mouse_left_ca.paa create mode 100644 addons/interaction/UI/mouse_right_ca.paa create mode 100644 addons/interaction/UI/mouse_scroll_ca.paa create mode 100644 addons/interaction/UI/team/team_blue_ca.paa create mode 100644 addons/interaction/UI/team/team_green_ca.paa create mode 100644 addons/interaction/UI/team/team_management_ca.paa create mode 100644 addons/interaction/UI/team/team_red_ca.paa create mode 100644 addons/interaction/UI/team/team_white_ca.paa create mode 100644 addons/interaction/UI/team/team_yellow_ca.paa create mode 100644 addons/interaction/clientInit.sqf create mode 100644 addons/interaction/config.cpp create mode 100644 addons/interaction/functions/fn_AddSelectableItem.sqf create mode 100644 addons/interaction/functions/fn_GetActions.sqf create mode 100644 addons/interaction/functions/fn_MoveDown.sqf create mode 100644 addons/interaction/functions/fn_addInteraction.sqf create mode 100644 addons/interaction/functions/fn_addInteractionSelf.sqf create mode 100644 addons/interaction/functions/fn_addToTooltip.sqf create mode 100644 addons/interaction/functions/fn_applyButtons.sqf create mode 100644 addons/interaction/functions/fn_canInteractWith.sqf create mode 100644 addons/interaction/functions/fn_canLockDoor.sqf create mode 100644 addons/interaction/functions/fn_canTapShoulder.sqf create mode 100644 addons/interaction/functions/fn_getActions2.sqf create mode 100644 addons/interaction/functions/fn_getCaptivityStatus.sqf create mode 100644 addons/interaction/functions/fn_getDoor.sqf create mode 100644 addons/interaction/functions/fn_getDoorAnimations.sqf create mode 100644 addons/interaction/functions/fn_getDown.sqf create mode 100644 addons/interaction/functions/fn_getSelectedButton.sqf create mode 100644 addons/interaction/functions/fn_hideMenu.sqf create mode 100644 addons/interaction/functions/fn_hideMouseHint.sqf create mode 100644 addons/interaction/functions/fn_initialiseInteraction.sqf create mode 100644 addons/interaction/functions/fn_isInRange.sqf create mode 100644 addons/interaction/functions/fn_joinTeam.sqf create mode 100644 addons/interaction/functions/fn_lockDoor.sqf create mode 100644 addons/interaction/functions/fn_menuKeyInput.sqf create mode 100644 addons/interaction/functions/fn_moduleInteraction.sqf create mode 100644 addons/interaction/functions/fn_onButtonDown.sqf create mode 100644 addons/interaction/functions/fn_onButtonDownSelf.sqf create mode 100644 addons/interaction/functions/fn_onButtonUp.sqf create mode 100644 addons/interaction/functions/fn_onClick.sqf create mode 100644 addons/interaction/functions/fn_onSelectMenuDblClick.sqf create mode 100644 addons/interaction/functions/fn_openDoor.sqf create mode 100644 addons/interaction/functions/fn_openMenu.sqf create mode 100644 addons/interaction/functions/fn_openMenuSelectUI.sqf create mode 100644 addons/interaction/functions/fn_openMenuSelf.sqf create mode 100644 addons/interaction/functions/fn_openSelectMenu.sqf create mode 100644 addons/interaction/functions/fn_openSubMenu.sqf create mode 100644 addons/interaction/functions/fn_openSubMenuSelf.sqf create mode 100644 addons/interaction/functions/fn_prepareSelectMenu.sqf create mode 100644 addons/interaction/functions/fn_push.sqf create mode 100644 addons/interaction/functions/fn_removeInteraction.sqf create mode 100644 addons/interaction/functions/fn_removeInteractionSelf.sqf create mode 100644 addons/interaction/functions/fn_removeTag.sqf create mode 100644 addons/interaction/functions/fn_sendAway.sqf create mode 100644 addons/interaction/functions/fn_setCaptivityStatus.sqf create mode 100644 addons/interaction/functions/fn_showMenu.sqf create mode 100644 addons/interaction/functions/fn_showMouseHint.sqf create mode 100644 addons/interaction/functions/fn_sortOptionsByPriority.sqf create mode 100644 addons/interaction/functions/fn_tapShoulder.sqf create mode 100644 addons/interaction/functions/fn_updateTooltipPosition.sqf create mode 100644 addons/interaction/rsc/button1.paa create mode 100644 addons/interaction/stringtable.xml diff --git a/addons/interaction/Menu_Config.hpp b/addons/interaction/Menu_Config.hpp new file mode 100644 index 0000000000..cc66efa2e9 --- /dev/null +++ b/addons/interaction/Menu_Config.hpp @@ -0,0 +1,632 @@ + +#define HSPACE 0.5-2.0/16/2 +#define VSPACE 0.5-0.3/9/2 + +class RscStructuredText; +class AGM_Interaction_Button_Base { + tooltip = ""; + //action = "AGM_Interaction_isMousePressed = true;(findDisplay 1713999) closeDisplay 1;_action = AGM_Interaction_Buttons select AGM_Interaction_SelectedButton;AGM_Interaction_SelectedButton = -1; if (call (_action select 2)) then {call (_action select 1)};"; + action = ""; + + idc = -1; + access = 0; + type = 1; + text = ""; + font = "PuristaMedium"; + sizeEx = "0.8 / 40 / (getResolution select 5)"; + shadow = 2; + + style = 2; + x = 0; + y = 0; + w = 2.0 / 16 * safezoneW; + h = 0.3 / 9 * safezoneH; + + offsetX = 0.003; + offsetY = 0.003; + offsetPressedX = 0.002; + offsetPressedY = 0.002; + borderSize = 0; + + colorText[] = {1,1,1,1}; + colorDisabled[] = {0.5,0.5,0.5,1}; + colorBackground[] = {0,0,0,0.8}; + colorBackgroundDisabled[] = {0,0,0,0.8}; + colorBackgroundActive[] = {1,1,1,0}; + colorFocused[] = {1,1,1,1}; + colorShadow[] = {0,0,0,0}; + colorBorder[] = {1,1,1,0.8}; + + soundEnter[] = {"\A3\ui_f\data\sound\RscButton\soundEnter",0.09,1}; + soundPush[] = {"\A3\ui_f\data\sound\RscButton\soundPush",0.09,1}; + soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; + soundEscape[] = {"\A3\ui_f\data\sound\RscButton\soundEscape",0.09,1}; +}; + +#define ICON_BORDER 0.05 + +// Old command rose +class AGM_Interaction_Dialog { + idd = 1713999; + enableSimulation = 1; + movingEnable = 0; + onLoad = "_dlgInteractionDialog = _this select 0; for '_a' from 10 to 19 do {(_dlgInteractionDialog displayCtrl _a) ctrlShow false}; uiNamespace setVariable ['AGM_Interaction_Dialog', _dlgInteractionDialog];"; + objects[] = {}; + class controls { + class Interaction_BackgroundMain: AGM_Interaction_Button_Base { + type = 0; + style = 2; + idc = 2; + colorBackground[] = {0,0,0,0.5}; + colorBackgroundDisabled[] = {0,0,0,0.5}; + x = "(0.5-1.8/16/2 + 0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.55/9/2 + 0 * 0.04) * safezoneH + safezoneY"; + w = "1.8 / 16 * safezoneW"; + h = "0.55 / 9 * safezoneH"; + }; + + class Interaction_ButtonMain: AGM_Interaction_Button_Base { + action = "-1 call AGM_Interaction_fnc_onClick;"; + style = 2; + tooltip = ""; + text = "Interaction Menu"; + idc = 3; + sizeEx = "0.6 / 40 / (getResolution select 5)"; + colorBackground[] = {0,0,0,0}; + colorBackgroundDisabled[] = {0,0,0,0}; + colorBackgroundActive[] = {1,1,1,0.2}; + colorFocused[] = {0,0,0,0}; + x = "(0.5-1.8/16/2 + 0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.55/9/2 + 0 * 0.04) * safezoneH + safezoneY"; + w = "1.8 / 16 * safezoneW"; + h = "0.55 / 9 * safezoneH"; + }; + + class Interaction_Background0: AGM_Interaction_Button_Base { + type = 0; + style = 2; + idc = 40; + colorBackground[] = {0,0,0,0.5}; + colorBackgroundDisabled[] = {0,0,0,0.5}; + x = "(0.5-2.0/16/2 + 0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 2.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Background1: Interaction_Background0 { + idc = 41; + x = "(0.5-2.0/16/2 + 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 1.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Background2: Interaction_Background0 { + idc = 42; + x = "(0.5-2.0/16/2 + 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 0.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Background3: Interaction_Background0 { + idc = 43; + x = "(0.5-2.0/16/2 + 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 0.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Background4: Interaction_Background0 { + idc = 44; + x = "(0.5-2.0/16/2 + 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 1.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Background5: Interaction_Background0 { + idc = 45; + x = "(0.5-2.0/16/2 + 0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 2.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Background6: Interaction_Background0 { + idc = 46; + x = "(0.5-2.0/16/2 - 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 1.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Background7: Interaction_Background0 { + idc = 47; + x = "(0.5-2.0/16/2 - 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 0.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Background8: Interaction_Background0 { + idc = 48; + x = "(0.5-2.0/16/2 - 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 0.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Background9: Interaction_Background0 { + idc = 49; + x = "(0.5-2.0/16/2 - 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 1.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + + class Interaction_Icon0: AGM_Interaction_Button_Base { + tooltip = ""; + text = ""; + idc = 20; + type = 0; + style = 48; + colorBackground[] = {0,0,0,0}; + x = (0.5-(2.0-ICON_BORDER)/16/2 + 0 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 - 2.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + class Interaction_Icon1: Interaction_Icon0 { + idc = 21; + x = (0.5-(2.0-ICON_BORDER)/16/2 + 1.0 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 - 1.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + class Interaction_Icon2: Interaction_Icon0 { + idc = 22; + x = (0.5-(2.0-ICON_BORDER)/16/2 + 1.25 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 - 0.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + class Interaction_Icon3: Interaction_Icon0 { + idc = 23; + x = (0.5-(2.0-ICON_BORDER)/16/2 + 1.25 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 + 0.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + class Interaction_Icon4: Interaction_Icon0 { + idc = 24; + x = (0.5-(2.0-ICON_BORDER)/16/2 + 1.0 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 + 1.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + class Interaction_Icon5 : Interaction_Icon0 { + idc = 25; + x = (0.5-(2.0-ICON_BORDER)/16/2 + 0 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 + 2.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + class Interaction_Icon6: Interaction_Icon0 { + idc = 26; + x = (0.5-(2.0-ICON_BORDER)/16/2 - 1.0 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 + 1.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + class Interaction_Icon7: Interaction_Icon0 { + idc = 27; + x = (0.5-(2.0-ICON_BORDER)/16/2 - 1.25 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 + 0.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + class Interaction_Icon8: Interaction_Icon0 { + idc = 28; + x = (0.5-(2.0-ICON_BORDER)/16/2 - 1.25 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 - 0.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + class Interaction_Icon9: Interaction_Icon0 { + idc = 29; + x = (0.5-(2.0-ICON_BORDER)/16/2 - 1.0 * 0.1) * safezoneW + safezoneX; + y = (0.5-(0.3-ICON_BORDER)/9/2 - 1.5 * 0.04) * safezoneH + safezoneY; + w = (0.3-ICON_BORDER) / 16 * safezoneW; + h = (0.3-ICON_BORDER) / 9 * safezoneH; + }; + + class Interaction_Shortcut0: AGM_Interaction_Button_Base { + tooltip = ""; + text = ""; + idc = 30; + style = 2; + colorBackground[] = {0,0,0,0}; + x = "(0.5+2.0/16/2-0.3/16 + 0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 2.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Shortcut1: Interaction_Shortcut0 { + idc = 31; + type = 0; + x = "(0.5+2.0/16/2-0.3/16 + 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 1.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Shortcut2: Interaction_Shortcut0 { + idc = 32; + type = 0; + x = "(0.5+2.0/16/2-0.3/16 + 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 0.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Shortcut3: Interaction_Shortcut0 { + idc = 33; + type = 0; + x = "(0.5+2.0/16/2-0.3/16 + 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 0.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Shortcut4: Interaction_Shortcut0 { + idc = 34; + type = 0; + x = "(0.5+2.0/16/2-0.3/16 + 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 1.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Shortcut5 : Interaction_Shortcut0 { + idc = 35; + type = 0; + x = "(0.5+2.0/16/2-0.3/16 + 0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 2.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Shortcut6: Interaction_Shortcut0 { + idc = 36; + type = 0; + x = "(0.5+2.0/16/2-0.3/16 - 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 1.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Shortcut7: Interaction_Shortcut0 { + idc = 37; + type = 0; + x = "(0.5+2.0/16/2-0.3/16 - 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 0.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Shortcut8: Interaction_Shortcut0 { + idc = 38; + type = 0; + x = "(0.5+2.0/16/2-0.3/16 - 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 0.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Shortcut9: Interaction_Shortcut0 { + idc = 39; + type = 0; + x = "(0.5+2.0/16/2-0.3/16 - 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 1.5 * 0.04) * safezoneH + safezoneY"; + w = "0.3 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + + class Interaction_Button0: AGM_Interaction_Button_Base { + action = "0 call AGM_Interaction_fnc_onClick;"; + style = 2; + tooltip = ""; + text = ""; + idc = 10; + colorBackground[] = {0,0,0,0}; + colorBackgroundDisabled[] = {0,0,0,0}; + colorBackgroundActive[] = {1,1,1,0.2}; + colorFocused[] = {0,0,0,0}; + x = "(0.5-2.0/16/2 + 0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 2.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Button1: Interaction_Button0 { + action = "1 call AGM_Interaction_fnc_onClick;"; + idc = 11; + x = "(0.5-2.0/16/2 + 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 1.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Button2: Interaction_Button0 { + action = "2 call AGM_Interaction_fnc_onClick;"; + idc = 12; + x = "(0.5-2.0/16/2 + 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 0.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Button3: Interaction_Button0 { + action = "3 call AGM_Interaction_fnc_onClick;"; + idc = 13; + x = "(0.5-2.0/16/2 + 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 0.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Button4: Interaction_Button0 { + action = "4 call AGM_Interaction_fnc_onClick;"; + idc = 14; + x = "(0.5-2.0/16/2 + 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 1.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Button5: Interaction_Button0 { + action = "5 call AGM_Interaction_fnc_onClick;"; + idc = 15; + x = "(0.5-2.0/16/2 + 0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 2.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Button6: Interaction_Button0 { + action = "6 call AGM_Interaction_fnc_onClick;"; + idc = 16; + x = "(0.5-2.0/16/2 - 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 1.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Button7: Interaction_Button0 { + action = "7 call AGM_Interaction_fnc_onClick;"; + idc = 17; + x = "(0.5-2.0/16/2 - 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 + 0.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Button8: Interaction_Button0 { + action = "8 call AGM_Interaction_fnc_onClick;"; + idc = 18; + x = "(0.5-2.0/16/2 - 1.25 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 0.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + class Interaction_Button9: Interaction_Button0 { + action = "9 call AGM_Interaction_fnc_onClick;"; + idc = 19; + x = "(0.5-2.0/16/2 - 1.0 * 0.1) * safezoneW + safezoneX"; + y = "(0.5-0.3/9/2 - 1.5 * 0.04) * safezoneH + safezoneY"; + w = "2.0 / 16 * safezoneW"; + h = "0.3 / 9 * safezoneH"; + }; + }; +}; + +class RscListbox; +class IGUIBack; +class RscText; +#define X_OFFSET 0.2 + +class RscAGM_SelectAnItem { + idd = 8854; + movingEnable = 0; + class controls { + class back:IGUIBack { + x = X_OFFSET; + y = 0; + w = 0.6; + h = 0.71; + colorBackground[] = {0, 0, 0, 0.2}; + }; + class header: RscText{ + idc = 8870; + x = X_OFFSET + 0.005; + y = 0.005; + w = 0.59; + h = 0.05; + style = 0x02; + text = ""; + }; + class itemList:RscListBox { + onMouseButtonDblClick = "_this call AGM_Interaction_fnc_onSelectMenuDblClick"; + idc = 8866; + x = X_OFFSET + 0.005; + w = 0.59; + h = 0.54; + y = 0.06; + }; + + class cancelBtnBackground: AGM_Interaction_Button_Base { + type = 0; + style = 2; + idc = -1; + colorBackground[] = {0,0,0,0.5}; + colorBackgroundDisabled[] = {0,0,0,0.5}; + x = X_OFFSET + 0.005; + w = 0.15; + h = 0.1; + y = 0.605; + }; + class approveBtnBackground: AGM_Interaction_Button_Base { + type = 0; + style = 2; + idc = -1; + colorBackground[] = {0,0,0,0.5}; + colorBackgroundDisabled[] = {0,0,0,0.5}; + x = X_OFFSET + 0.445; + y = 0.605; + h = 0.1; + w = 0.15; + }; + + class cancelBtn: AGM_Interaction_Button_Base { + idc = 8855; + x = X_OFFSET + 0.005; + w = 0.15; + h = 0.1; + y = 0.605; + style = 2; + text = $STR_AGM_Interaction_Back; //$STR_AGM_Interaction_CancelSelection; + action = "call AGM_Interaction_fnc_hideMenu;"; //'Default' call AGM_Interaction_fnc_openMenu; 'Default' call AGM_Interaction_fnc_openMenuSelf; + colorBackground[] = {0,0,0,0}; + colorBackgroundDisabled[] = {0,0,0,0}; + colorBackgroundActive[] = {1,1,1,0.2}; + colorFocused[] = {0,0,0,0}; + }; + class approveBtn: AGM_Interaction_Button_Base { + idc = 8860; + x = X_OFFSET + 0.445; + y = 0.605; + h = 0.1; + w = 0.15; + style = 2; + text = $STR_AGM_Interaction_MakeSelection; + action = "call AGM_Interaction_fnc_hideMenu;"; + colorBackground[] = {0,0,0,0}; + colorBackgroundDisabled[] = {0,0,0,0}; + colorBackgroundActive[] = {1,1,1,0.2}; + colorFocused[] = {0,0,0,0}; + }; + }; +}; + +#define GUI_GRID_W (0.025) +#define GUI_GRID_H (0.04) + +class RscPicture; +class RscInteractionIcon: RscPicture { + x = 19.25 * GUI_GRID_W; + y = 15.75 * GUI_GRID_H; + w = 2*GUI_GRID_H; + h = 2*GUI_GRID_H; +}; +class RscInteractionHelperIcon: RscInteractionIcon { + x = 20 * GUI_GRID_W; + y = 16 * GUI_GRID_H; + w = GUI_GRID_H; + h = GUI_GRID_H; +}; +class RscInteractionText: RscText{ + x = 21 * GUI_GRID_W; + y = 16 * GUI_GRID_H; + w = 8 * GUI_GRID_W; + h = 1.5 * GUI_GRID_H; +}; +class RscTitles { + class AGM_FlowMenu { + idd = 9920; + enableSimulation = 1; + movingEnable = 0; + fadeIn=0.5; + fadeOut=0.5; + duration = 10e10; + onLoad = "uiNamespace setVariable ['AGM_Flow_Display', _this select 0];"; + + class controls { + class RearIcon: RscInteractionIcon{ + idc = 999; + text = "AGM_interaction\UI\CenterIcon_ca.paa"; + x = 17.9 * GUI_GRID_W; + y = 10 * GUI_GRID_H; + w = 3.7 * GUI_GRID_H; + h = 5.75 * GUI_GRID_H; + }; + class TopIcon: RscInteractionIcon{ + idc = 1200; + h = 1 * GUI_GRID_H; + y = 9 * GUI_GRID_H; + }; + class FirstIcon: RscInteractionIcon{ + idc = 1201; + y = 10.25 * GUI_GRID_H; + h = 1.5 * GUI_GRID_H; + }; + class SelectedItemIcon: RscInteractionIcon{ + idc = 1202; + y = 12 * GUI_GRID_H; + }; + class ThirdIcon: RscInteractionIcon{ + idc = 1203; + y = 14.25 * GUI_GRID_H; + h = 1.5 * GUI_GRID_H; + }; + class BottomIcon: TopIcon{ + idc = 1204; + y = 16 * GUI_GRID_H; + }; + class ItemName: RscText{ + idc = 1000; + style = 0x01; + x = 5.25 * GUI_GRID_W; + y = 12.15 * GUI_GRID_H; + w = 13 * GUI_GRID_W; + h = 1.5 * GUI_GRID_H; + colorBackground[] = {0.3, 0.3, 0.3, 0.8}; + }; + class BackIcon: RscInteractionIcon{ + idc = 1210; + text = "AGM_interaction\UI\backArrow_ca.paa"; + x = 18.25 * GUI_GRID_W; + y = 12.69 * GUI_GRID_H; + w = 0.5 * GUI_GRID_W; + h = 0.5 * GUI_GRID_H; + }; + class ItemDetails: RscStructuredText{ + idc = 1100; + style = 0x0c; + x = 23.5 * GUI_GRID_W; + y = 11 * GUI_GRID_H; + w = 13 * GUI_GRID_W; + h = 3.9 * GUI_GRID_H; + colorBackground[] = {0, 0, 0, 0.4}; + }; + }; + }; + class AGM_InteractionHelper { + idd = 9930; + enableSimulation = 1; + movingEnable = 0; + fadeIn=0.5; + fadeOut=0.5; + duration = 10e10; + onLoad = "uiNamespace setVariable ['AGM_Helper_Display', _this select 0];"; + + class controls { + class SelectIcon: RscInteractionHelperIcon{ + idc = 1200; + text = "AGM_interaction\UI\mouse_left_ca.paa"; + y = 17.5 * GUI_GRID_H; + }; + class SelectText: RscInteractionText{ + idc = 1000; + y = 17 * GUI_GRID_H; + text = $STR_AGM_Interaction_MakeSelection; + }; + class GoBackIcon: RscInteractionHelperIcon{ + idc = 1201; + text = "AGM_interaction\UI\mouse_right_ca.paa"; + y = 19.5 * GUI_GRID_H; + }; + class GoBackText: RscInteractionText{ + idc = 1001; + y = 19 * GUI_GRID_H; + text = $STR_AGM_Interaction_Back; + }; + class ScrollIcon: RscInteractionHelperIcon{ + idc = 1202; + text = "AGM_interaction\UI\mouse_scroll_ca.paa"; + y = 18.5 * GUI_GRID_H; + }; + class ScrollText: RscInteractionText{ + idc = 1002; + y = 18 * GUI_GRID_H; + text = $STR_AGM_Interaction_ScrollHint; + }; + }; + }; +}; diff --git a/addons/interaction/UI/CenterIcon_ca.paa b/addons/interaction/UI/CenterIcon_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..86deb5df7c1aa509e5946aa246f8ef0206bd698a GIT binary patch literal 11081 zcmeHN3vd(18Qzm6Tc%hz1QE#DAZ(de3?UFi3u!n(uyrnW6i4SKZ9Ld=fq*5u%rt6& z5S<0hv&6E15Ml@n!z7)|Bry;!6CS~1QwFB=mB|o5Oi75tG@W*EI+VZ!TY<=^Y<`JJw+$^WRIjQ!&x)HUvN*e;j^lO{Q2r+B&l6Byr~d`M{o%s)iG`ZJyl7$a zVu0fB-YooXP+rv^)W03{pJ>p(HYw**Q|{5BQ5X+|2m&GZ4ukPXqHoc7 z1M3e(9E+;+gNn)O4-E83)QHKaE(4u>x`pA~jmrF`#55YQ1w4Imq?|XJ*gn_%e;Jv3 z_0fC*+I%cs!jZu*mnSI8Q9!rLUhSo;+;CpX}7(=DdSV zIo;pzjNkM#;m!w9X@t-kSEZ6G~*kF%T`b?mIcHFAjYvzOE zCkmgT;neoc58ht-KYsSEYz`i#zpohN*ZHehBAbE*>mdFyVhBOH-k*T|AL{B$#p20h zIt=vk&vdxC81&zJ8~MMA&i~Vye)E53^mkA3lk-VSu&`OP*Ze2Na=m?;D{lk+!HihNc0n&HnC+UG^*)%#< zcrX!7f_`-jE# z`^3b0g6qvBFUaHh5A6-*8T$pUH=Wa&e2Y;2M-%y(B>AqIpQSzKdOF`V59U|Y$6_CG zylZ23tzVnpFU|(%$5w0cIqDDhpO4*@xk{5a>@hj4vLlJPfy6Cq_2sZN>g434{$aQ5 zfG1g>$POU}_E+r_7EMkuTWcRa1^y?bmC-#7_^VN)KYR-D_DuW+Ny*Ty8@t+?vS@q= zf^b#+v5mf1$kr(2`_O+P{{t7VW*7q`EW7*}p{jhOo55gmSj;xNvvvA;VrG)9(9^2?^3v9r@AbQ}`QJTf z(`zQcgZyy)|LY^3S3dBpJi_FEwjSoM&<0JPWq?nB!NTdCJJ#z0i!!ZR`{oh>( z>j69rV@%x0!qfd<{TZge<7-HMe_ILjA9D42d54(i*5xBP4$(yPctq(Bj95&;!L$^5 zKRxEdpsZ3&*JnHdxxmBbPrv`ak;+5gciR4c@J=O|R;SnNs-uky3oCCT#b?6GAeK=V7`EPYJm z3)40EBq^PE@Vpl0XV`mUe$-d`EYN3xJ`40&fLg#o1VXHuF&ywqpGw`SINf**WZ@{j z^qTKl?W0~3j!Z1Wl6DMnrS^CK{m45V>3({w04}jS6llqfZ_TC49Nc1Q*H~9-pJ7v~ zrztgBn&3XZCHlg;+@r`JiZ`8%ZJdy5m1Hk?X z{&P!={8RA?Q9LuJ2mDROc(b1-2b-LtKZe{a;GRVaS4Cbkiivp>|0e?~E{(m<5zv|@? z>w-;#C=IJFnPc1*UJjQkYgaJ+pZ~6B{!iuq^3>mF#m^;=Ii#sZ{!=T!AG&LbsSBLj z$Hn?>x?cY3_|xKl*rqju2q)0-59<4dJs`Fk`}4 zYl(l#KYeotjXyZ^3@mENio+Cy_*&*4+W_3AR8PbDxJ?NhNBeJ>j~M?+AThsQc|N^+ z$B-Jft-t}mJ+w88Vc%uuD~t&&4)~zWGa#PX{08AHts$*%FiarcOjpB zRbZR=*%J)MiM+~Lve}9J1h3B*T#8{oR}1?Aa~ANiqZL{RJvM-}WChpmW9>g|-vRO` zZYSul+Ci*^GM<*fu(4Pq7lCE3Ox?Xg++$dq#r2dQj4J8A13NYxjU;Zre1dSvGzuo7 z#R1=pC%(86w!(3NOvsR@!7a+aTTu*2s&;eB(5(U0ZL_$H+EZ1bdH*axI@|$}#pHbX z*i|NaDS&qpGFcZb`TF(4NXH5?k;jkg@ZV1{RN$Yo1=#HGc1x1^S4Dw80*gd{fFUCV d5giMZEIxb1BlsFsvxZ9E3P$GAY5-Mj{|B6tz{CIm literal 0 HcmV?d00001 diff --git a/addons/interaction/UI/IconInteraction_ca.paa b/addons/interaction/UI/IconInteraction_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..000c4bc9c69a7eba2bc576fd9ca7e5a2774e9132 GIT binary patch literal 5625 zcmds54Nz0r6~0kG5tJW)7L5qTj8v-@O`GYCtbtwRN0zLt;woF(4cM)UB#w5F)@B2% zTk7ZHspl3`e6R!L z4fq!f4*-5IlJ!>*{gm@WEZRFr^wsaO@f7(}#N{Q*6_=bk-o9o%?Vr|zhg1YWBmP1> zv#r(oR*EMZkBt5it*u_i=3DB*4wJ#o#?yCx6&;-q7Z+Y{ru?$&M&a^Hf4NGrqNYI0 z_vUV(7+se{BNWKSOLp*FzBQ0%`iV78qpk2~p7q=z*_ROGWcy?0Kob_OMiDwOK6zqw zn6)~Rtv{*D)r=cF{%7=?gjN;L{GTj-W%;-f^Cn<-^KUe(c&kxpqd4p%F8`3%`bZr3 zkqgJ{W8)h(APk$@J?lYsa6rcwsM-7^b|_=5gQpq4tj5A$v+!&`OROn8eibfiPllT= z$W!*bO)tx)`+l%To&}r`#`X&lXL|JKRla<~{pKaM~q(D=eX@j^ES$i#@UxT4-Nk(G0k1M@vs7K${f=`OZbQ zmVF$01UENb^XNOyMnd!8DaN0o)INk1rv5_w4hwcgQ9K#ni{+3%PI38&`L)pu!CQpO zQ`Pt74+$ml^~3s3&m-}VMiei30N1(E=0l%C!@*h8vRfnz$$H2Njfe<(RFz$qnf+Ic zzgand!SVoKzR7Tk8G;|tvHj)6a@fD{(A}x}pV8k7`Rd6Z>3IVmg~y1xd%qF)b5Fia z=8x>Ix+^Y8d%t#cRc<`;n-@OR@M~Voulzg-RJDV6#l(48I~oCGY5g1dD+V6&Kl5W2 zJUplNeeJ>dNc16}-2O>jy+)ol5h(imM!!n9Y}B*;%U9nQ2bU%Hm^bq^4^Jo$iZ z{&tDQo=o|D^?mW2Hf7G6BHu@^pMv?9IU&CUBh1gkEGT`Uj&f^IzLo(4|92G+>n+X( z^*Jlhsoa+z^`TjhTK>T1JA?R(9Z|G@a7js|)vNycH~onRw7;)hezR9M%H>L_9O{iB z3?Wdw(p;r)Qwb`Hmp*lUtk?wMqZjTp==h`@E5^Gw1^W9V^Z+zdr@{Qzjv|zaF1SK| z(q2aD!xIOhBO;LR{H`{0nuon6Von^n&ORr(Rgpi$clk|~&|dAS$9&`Ys(9(m1{jas z;Gf%``U`SL=F^SmSAK(65de+Y+Sm{EN60Y4iZs{{iiIb!@*fPR*rEQ)5z7xze|}|> zNfg2#!soV!XOL$EFTH87x0^lnG`75i6JG}8XQe3RiA2dDY^ZDSnO-_a%D zWRq7~7tL5kIH(*IEu9nZg|oWx@AwhVYf_A(DzeRTmZc5RC5`HapkE?W`1L0b0=-Z6~<3IKQUb~e#HlN{*=4@~O zfKzN#|DE>>G;@`C3jN@T19Jib{5N%hG09?e?dYwu7ccILp6JfTcWxuMyTujW~K$2MjyFW8L{vIBN{&BWg z7+&B0o4Yx!tu=BrT#l6X-_cbiv>84pP@JDI5FVrx|R-7TRCdZ?Iqcx!3xgFi7RT_I>fXwryJPZML`v zhxB^QZ}FEHlS-5Ft!py|Kg%{5N&Uvux(;1 zuYBS(THyTS8TIyDu*Y3I2?kSI%1XX$-YeQCo8DHw_=(eGCYnjs&ex2}Jpm2d(lPFY zq68J4M*H`#TKt_KQ@2i{{d@ct{&G7BE54`*t!Q1hVD9}ma7#ZZLDOJA^&{iCXxFa4 PagoOY+|jQBCer=|Kr0Q{ literal 0 HcmV?d00001 diff --git a/addons/interaction/UI/backArrow_ca.paa b/addons/interaction/UI/backArrow_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..627cb64f17ac8ffe20a3f9987e29289cc19299b0 GIT binary patch literal 1522 zcmb_cUr1A76hGUXI%v6|MK*^k1YdfKiJ`DN|7;5VnRxG5(8HFBWG#iBd=NJYda8lo zLl0UH`PM@|cwd4ttR+79l(rbm2Mv2uak)W`uiv?MH>92>9{Bj~`R?KTe&=`2_gO_S z=$AW#VSg176^q4I&5!tRvM*rl2mLn!?3=LI?+*lSOZZM;J;jgbR-$#R%FRO_B2IlW zd$B>JD9-MVTWV})EhQ#)iOyA-=yJ=#M8;QY%n72wh?Fq0kFRmOtQdZ!yMfnsM;+J# z-fRJQRuhEMGYOF^nDKcgFAi$z8Zz2>LW)#V&vaAobW=O{g)6`}@Ot`zmwqW`%k_y8 zw}KnADH!kkPa$f24Vg{mk&qmh%6P6FqOJQ$6JnWIm`7Qv?*d?>$K_akAJG(J>qJH`hJk@?Dgvb21RPji_M&m-jT zIt?zIW5(cf{U~)rbsk+GYrV+xU)D!Eu{7ktN9_Apt&oIyEb|%X`ywl+rjNm=`EX@) zyT$02xxP0f4!))AS?*6F8X07EY^|6N;Qu!t4sh3A7d^~_jo+TZAvK=G&CWq&WyWih z-(7gqC=R~l3h@V>h%s|nxLF%KHeoqDG_1!nEaL6MAJZv;cpUPt Fus_BSWnTaQ literal 0 HcmV?d00001 diff --git a/addons/interaction/UI/command_rose_ca.paa b/addons/interaction/UI/command_rose_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..3dd8b58768cda84b9312da35f5fd8abf92ab6775 GIT binary patch literal 40311 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 literal 0 HcmV?d00001 diff --git a/addons/interaction/UI/mouse_left_ca.paa b/addons/interaction/UI/mouse_left_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..1cbc49397e724a114030dd64df63f55867745e44 GIT binary patch literal 5625 zcmd5=Z){Ul6hE)qWKZnY03|bn@JI@Tj6^Z8XhO0#35+EW3-q=N*<2aHkQiwF0GgQ5 zM+XuN+Bsb$0kbL+%?xn^sUJkF5XTgP0WC~x*rH(lVC)8NY_8q)-1qu=UuVi#vK4RM zd-wf%PtUo(bI$$u3TRbTrDJuKvoaq5y1)JLu!?IcH!w`GFkDr+el5cS-VASEyY@L5 z-xa(MS^(ah1JG&(_yzCD6&Yjz)G*1i5vp5k)h(<~YAK_kouBMzvFX^{?7qu7uN(m& zge;}+R-0Ix5>zqhIH+N7(*dEM$vaM{?V`V_TE#0g4D({M6BXEQ*{`<0Qg|p-*He+K zU^*X0kv<>VmADe1x^0?z>l+43Yk^?mI6NF|Z*MnZga!=Y#iF;fTExP!_QvtkT{0Tw z7{FEQmFwfD8+!uD3wnR1yQY3Y28<~3g-EN_s`saFI6VAu2EXudCg1URvi!&UBXoxO z<3^$)agio_Ut6x`hhy6L^LT?5i;@3Cd_j@Z@ji!oT!a+p|8I-~n61R2V@j88LoNcx z+S`9HfJwqD_6&dnOK$l`h~6KT515_VaX*0FUY~BKbZem~2nK!<)Y$EIT_2_AErLJ{ z@|pTm-XQ2k1AiCE6@O-*7~)T9Wg#=p`=5!=-9z~detzVa$se23{8jmk_Dp?gdnx{E z{^v0MjHfaG*&MD$NPTJxm=W(q{ziV3-k(3ymg%1?`cwSZEXDkHI-R+U|77^H-rMb7 zx5h%t6G1SaF=D&D*2QrH%a8PWlGVQ{{vY5{?r`Qd|0l=)^-VGchx5bn;Ofi3k(DL` z)+D)n7M$Wg-Er6T^ZraO|Fgy~%XoQEc^IPu3+TWMy?@hP|9|-RGS4Z)RDAF9p=06c z=B?|$7RShp1n}{&<3BG3iXz_{@+B_%a<~7RMc1FQt^0NH-yb6Xh;e;>=`i}pu%2s~ z!t-USaf3w(%kHv2eaRmx5EVxK_73Knl}j~fc&&B1h@oKItP#SrJ)y}&@p^f^EUe( zxA}!6BAVzW?O2bvg!p9n>+{+%o&}ZAyu1Y+3lnW9uWn;qZl$ylIdnGmr1ha4RwTSp zj7{Zgk?_gzwbAlju^|r)cChao*^gN;0uT0UHk<7%w=XfgnB&x2%Kil$RK{)MRM___%x4+{ zR*U$`vG(Ru(D{J}k3aN>ixc7ETQ?@;ujwCek7JgBio9oUAo=r04{m?%$R1C;yy4YL zTeM-z^)a5N`+TNJ^=C-+htx}P;N!7hI^Nb8?KDRv{8>#ewVB5|1+$KaHC;*1Sb0N~ zX-T;rwr@)=Y!su@g*d+bk6;E@J(Q4tDR~8C?|vz*#eWEY4=%!afBGP;fW2 z^=N3@sJj`538wx2+dJ;4-5n7i=~t8&`l<&QrgZz#I=?AzdpKl{cFvDtlB2xKL7}=i zAFp^54jaR;T@?#((owZKXKVu+y*=X|KMDT}^maXl@cCki^;5=X_LiliRiY z2*w2Eb+;5kA^R)}*X>1PeZ^yx%3cyV`Nrdyixb~dyzryN7W>u=tSC%ZglY)KYH t^NFYEp<~@*?N3ZC9&(@0#~BsvUOtIKZfjF zFbjUr1!)8sZu~(I%*;rn2}Yofge)pxgoa6VD~LkyV^dsKS;3M1`aI9?dESqEFN>9yIxCiyRys2QpttwzTO3zAR}f|>giD>vO9-3rB>a3y$+HsP zD|oir0JhEo@Yw;r!!tFJKmtGuDaryU-{vUaMlo?Qclql->SavBIp0s)PQkC(03gfq z<7{EMKy7gh3ya|oYHxUjw^y@bwcWj*SiM1k@%2fTizxl19eX;49 zzjXgv_xKy4r@RTi8gs^4Y{4v(pyN%085o?7)jJ&nRHJA(91$0rP;?xK96-^r+btRF zg@-U76)yLE*Shoi_Qj5;D-W+dpG?G8)ztM<<)54nu~1R~8m}&m zo@tH_q>H~XemjbelldiMiZI~T^gkFu{<2)4;Vq*8T|T)&!{G>x02sGFz+ZvLF%&F= zAkvX0(c)t)-)y%BWgSxhY(m`VsvXmAG4yxFoaSnm%ca>1N07WJme40`w4cCJ#vjMu znEE3=VC?_5z^iqB#M3z52_yXkf5P&9eLmng+5RKwZ_4Dui=uIZ;A(e&7%jK%BGGgR!SWn`7c@{`Nj{h_Kv+JZW^~3&M6*jDo zxSlMUVZh_?onrofjgCx_t^ZGwPcpyT;dIykrz|&2x4}_dzy6o}4`)h{WrN*= zoWD=4s$o3du3mSn{ejCkoTP7tSZtssvR9(|`piu+G^E*CZI(wyn_NAlK!yVxH_j-XG8Vct#mXI`=*dDk7l9^drA1v(Ei{rI1;MsLM^z}_Th%uRzf4gyJ+w=fO`<%zl89d zo{w=qydE)}Vr=Oi-9X{VoX0}`yH{TkM1aI@o&YYvjAb)_eXf7Q0u2}LpSFvhQ@P}z zMcBDp-Ntj=EJ>Yv)NMPxmdi{KO0K>en~vHXS2YGoe?$)5c_Gany5S?7THG7O*aUwy~A#KtHaLk+Q(D2a_aq-!TPZAiPON{mfO3o1AA@cud+PXio zMIz#Plm7|$Gq%?3a5&mEi*Y*h7pJ;eD>=pVP>ikb%uo#(?6|5fon z^M7fisbQqZ^TVrM|MoS5UQ|GOS;69aH%+?!vko^kT*GPp&F9cR4of|s#7eN}SiQRm zUm`u4rt{5;A~o8)9h*W2t&{Kn{O@{yka}XC8%66v7$=3cDYO9I(Xr~=Z={0_p`vkJY!nde&Mgn#hK=X z`D)pmU!u{d=Sek9mLNoMc5SYlF+g!B?y85qSQFG2xlP8*V5ZNa4p#DW!J3Qwxxr2DnoOKgF`qMk WE$ghk{>JQ2`vEo<7cWC6D1QU<_h23X literal 0 HcmV?d00001 diff --git a/addons/interaction/UI/mouse_scroll_ca.paa b/addons/interaction/UI/mouse_scroll_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..662d11b0d81313f3224e760d1e7c935631e78990 GIT binary patch literal 5625 zcmd^DZ){Ul6hG}&?TeN*NWqA>P8eYyh^TBIgk-Jg=2T+UzI7ogFIzMc+?be5f*Cv@ zhJ*+sgo%ktXV@kzVw`4`sEjHqi6pCGmK17Mbkl|Kp$udluH|~}yL<1xS2k!RT}-@b zd*843+;h(Fo^$^_3#qJhdskFeyYm5{udjcnf@|C>DJEDbu5>?LL9q$H6hB{4@r(IEMZ>HkU z)&(lgb#3{ptTu5vo>c9S3Ffp87YlhDH^*tvIA%{A1Gup0u>}jq>GHh^mq8zZuf`=W zAMH+^El-|M{mFHGPy5(0lJc|ohFcxn-x#5R<~ZGdBkoOP%iq|akQfP4dp0n)fmQ1N z0Q0Nb>&-QP(qXa#erP^Auw=@Y$py7|AGrol;}fs&{$MW-i$0E>NX2a8m_1#Gd%^6) zPvR(m7fY`BcXW=mkTJh9A03Xc$o-*~$qjL%XSLRTZVbRCm^6MAdn8HX`fBZhP1NKk z*k6Zxe+(NMFYv^Vw#zsqKVJ zq7Utz_=#NhlPiVq_MrSU#J|1ss-IkKnTUTj`M<@A^t0lR^mY8%NbvDsPe(}A-p8u; z=F|OUI`V&i84J(yH>ISZefCtC-gM`9b$Un%lgcJ-y#f)&+nC;NH+XSe>{JM1#}PxCdX@rfZj(P7r`RD9Fx`PXk`{Oi|F5C2#Exc()z`LE62O!M_tNJe6tlP8O;cpk^cKVX}eC0|Y&IzI%;~-(Ij}x@l%?@BX&Fbq50VT0AU2V4~MFXn6iAn)xlI zbiKX<^R*C9{Dk;tgb<%YoOcvqNYdo*Yv24rM5ixfM=}(2f)hZy%~POE&HTfG`niF+ zxQZYC>b8FBC=G`g7R=-%yQV9c$nv+}vuivdwRSOOGCkB)k}Ox{eUfbH3D~0DsWYlR zG@}$J{xYpb{NbsxhD1}tFkRNehGRBM2z^?}vJ~OiZ8w>OVvb`(M%5q1wx`avq$025 zF~O%hCOffhGW)0c%NhnJ>^nsLH5V5?u?zcPN2Ra4+l%*3j-?HylgP)0wx`atq|PeG z6qIMZK^yOM9O`dsNT3Up|Ba7Xl8kg}^!6Q&QXPNR(l?04_ccd8eZ#m-Iu#CTZ=F9O z*Nh?j+}u7uqoRW`pqc~&X1aqX(Z0VqGOgTu9Q-DY|1EE`o!_ASkDDWFo-}Tg zPQ};j`L7_OwetgO=WfL}WDcB`s)SOT^8}9B)6^IZ$U&*%7bK6%^i=jxN-0kKoh%>W zlVrg)*$e~t+5}${h_eq-se&@*&lT~mgB1H`Dp>Z3C0*odXiI&R%HwMWZCjj5zn#7c zG{L6xblR_7w&OXR=9tD!f4q8$D&CK3Qf3Ig`CHWp#njB^t>!#Aj?=nlUUVg-{akA z9Oa#gPC~3;rLRSumnsHR1M$=V((JGu-s!wpk_-|2AYQe8<9Y%myUh>o##vuvwb?8^ q1YCJbjbaXjrKPqeN6`|a7$0f6JjkGs(bmVW@r43Iql literal 0 HcmV?d00001 diff --git a/addons/interaction/UI/team/team_blue_ca.paa b/addons/interaction/UI/team/team_blue_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..ef64818d12cd9eac0f75ad52b5fc7be84190ef97 GIT binary patch literal 22016 zcmeHPPiP!f7=N>7Bn9p6!NrzRI^cqW3Oxmig?&LtQcxUlM?6&MpR4Ki)RS$ey|gDA zDjvjY4m}9s!Cuxw4^t76p6o$sVgo8fEM7WEgSDlTjKA-D^OAM9asNy_l5_A5H|-04>SD!@Y@8(NCb}#zcoUzg^S>KM@HU}c=mB! zz{AI`5T90rxZ(*hkE{LUQysGX{3fU2fZ>4QfZ>4QfZ>4QKt?zai$j-7hc1gAB+ssaUk>d z-YEYDI34w-w2}YQtpm!ORR0f7^g;j6^5XsX>zV@??-ytYNaHEXvhB?K1N8q6 zhJb{xl&+Z%b}e~T5c9u@0fcynpT(l*WzHWcG*|6C7GviTk79f)6|bWuxsd!r|XaO!zA+~RX@>=?Lj>qOWzvoJd?@p8ssd$U! zc@_2#J0{rvgs?mJ7ftfT3#sfGGkU6z;>`o>-$4M;Lm^0lJ=}UYvbd!4fAboPbB)`k$%wnfR4{n1poh&%KzW>gp!u82l;Mvy!lD^ zZ=-lJ{Pn7R!#rBshw9+hU!U3T-w{7_prYgt;NJQ!!G6#`D|;^%Vei{rUcIJ|#*>LZ zs8q7QzSMW|`d-T~ZT)?=p1||IV&&WPlPBQ*pb=m9gFG;Dd zSsxG>`5XBY2YRLdPrH5@`|quNWnI5AFMmc*#rN=-{q?$({c+FrMG2hagLsq*%-cPc)F5+**R*p{qU z2$$4FuODK$q3`7VWGygn4F?Pd3AwdUz|FvhAKmCf zz}qg=HW?htEc!w1X!IzKX<55S+W-RGkPcv>o9d4PtZ~%Ae(>$`5AhP`r%f@cK7Fjp zTRm3gpiDRTp%^Cz_g<9ugHtD>l}n62PA#Dg)!r(-9m0Na3H(^zr?v%1RT=IMu3q4; z8|b$FCi!+qZxg>7^dl{Py)F-ZMk=i7cY6A%LPzTl0hAnES(LvYJPhNh>Rr-T+PB># z&kp(F2l3)>&mXd>OE9jR&ZG5ga{u1Fs$IcnPsr(yF+Trhx&y}MxeJ^4g znhfH}`1kzhjK2^sH0cNH%bI+VKQ5Pt_vrk7aBX~UYEt<_Y(wMr&Mq)a?J0crGJk+i z&-o*RQ}?2Wir)HdU0OdI8zLK%W0dKft$#*x76&3(vH!$o8Y6r{hIczvQfZb8x46^qX#B$n)qMwdy>}vu<0{didxTx9U6k&%JZsoo0Qg-!{}e z{X-}2KBy{r*lWiywu-)1{Plwi%d^4q9P69Ab_}Ci`gvPZatsCJr}k&9@K61nwhbl6 zP(Xfqe-PZrM>q0+5I_5Yei4)xo+&S=ZIl~9zmz*kcbI-0I}kpc$|J=OVo7RwweWAP z>Sui7CB_f0f?0BuVBP7wX1@R3x6lY={zQ&625-MV=xeyFC= z*iE{+n?Tp6OSB7%TW1&c#f$qG-@5IT>$QI*TnVG8>Q%~*=2N@*BVoKeT|UgiGBlsQ zTTU3Z9{$Paw%v4rLV+YWl^pz#Sf2X^vz?K95wXGZEQ{fMG_BxfF%}xs_T=Lq!|2!i zYY7|0$;W4->G+C8FiAn>UsKD2*K5b;ADmz_hn3qGXE4=4(qg_igQ->>eDM0U)3cMx z%wgs3uK2;Rt3a9RxAmg4UW5h(tY>xbuK2SLW|RCb7F`F$AgS}fU$ya9hpLRWhd-YI zy!V%{zWAQW#-F>KnVFhjxn1REpdH?snFG;G@FBw>%Nu}41wa3`u6^?Qvmf23V#Byp F`WLqUohtwU literal 0 HcmV?d00001 diff --git a/addons/interaction/UI/team/team_green_ca.paa b/addons/interaction/UI/team/team_green_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..7f8c2218c14389acf48050a0c94c797b35e6da6b GIT binary patch literal 22016 zcmeHPPiP!f7=N>7LJHd5g9DXPI^cqW3OxnH!oDEn4=4_}BOWTG?bUR9>Zxs}y|gDA zDjvjY4m}9s!Cuxw4^t76oa{kqVgo8fEM7WEgEgU(jKA-DGs(K!u$!H1GTXcdGdthR z`}4iu_r34E_r3SljE05=%5M*SFwi4}=$q*~!Ssg%?-Cs$5Ir>T&LGhSE~4Kb9DGmW z*~4`O51%+fd{!3XhAYGZuGWJ`dC1n|>zEn=jetf#BcKt`2xtT{fa= zz1PdXj!sv5om$I(f9rs1POAS05?#>$v%I+f$CG4A-`Yk1l-+*xYFEkr=)Ve-!guF1y=Wl1mBIzDQ2< z!9*X-z0ijSdCLuXJ6hgNbx`?pRDbTemI1mziMV~kmDkk1vp+V+@m)ufe|MrdqWmp} z>z3I*9GKwtCxp3ud(j|YypXCrV@6N;k-xcz?K>(!^&uA|(XMH}kwe$Yky7@Mj2N%A=lk|hu2NM6R+q6Gc@&CV`P)y|OLcSzy1j?VD zn(C|Su!L-Vz2TYiC&ONEv~M(z^msMHv)jMJe`v@01@qQ*0qqC99?!@wSWeRRUUk`9 zj`vdPbJhn0TK-!8gg~eCf4}ROZvUNaUs>0$%*&q{RQ^3YW`DgdWq;gpeNh5u{~#Wv zBC~rZe=J-8?0+@jpzk<7S(jg0{xJS84lDn&!~#QhCI58JP<`k_>_0b?^*iMsLJI94 zQn1DA6~ZBPN!Aas+|YIMe!3Ruw;BPBfJQ(gpb^jrWC;ODQwm<8Wv*=8>Awe$w;a7XAs8jp{77jMFZA!+DUsMf`W~!9r;jN3O24zr1$)lAeyQ?Abq8M z+ewd-@V{N!^P{ETOW_>nhkez^m4l6YC-_&nZ;g-it7G%kv6qP-I(E+VjIwVuX@|W# zJzok-^xbmN$@+=3j^x8}x(qWmCS0AC*c2hm-i8e`{=hYEs!lY(wMn#uu5U z@)SQu7$5M{aeSnI?qRs1>f6e;F5%}FOAr**hne%xIAWTuxd*Hh+5-B%{0bz;$0>e9 zRT7a~Y@?H~kJHhT%3rFubhmL)KJ-k%#?=lDd7gZ$T3I0eyJ1@s`p+Zt-(O&TsNFWy ze*OE;Ja}AD@-VZ148!xUtj+mr^Q>>q<}r+R>(ASo;$tYNerkJ`XyjJemgR)p#!N$9G>>uSt!N#T2C$00@!NVrW(jN_~VB;r?Vm=mB#}42ENY+iGMIiF8ieDzF zKBj328KAPO`M;9-G94`!5?TbW6pY**pW-`C8NMDm4bl2E`dH9^>fd{nbyZ&Dzi-&V zOCjkAeV5P~JD7Tu&<5)eZU_lK$AU|1_xEHk48&Jnctf2lv|ZQ8mtH5ROKecNAao6{AduZO_xsaunfhg@0Mf0w&K45&nEE; zF9<* zG)Y0l-&D)vx2vZY9-rZ6j#h47oyAlKLB^y1tFxGD)zHUp-?}h2shT-jxpOFbeCj4x zru@xh(K%U!Mh#fcYUo4J=O4|*@f|F>_K7}H=bpc-W3TmBm~9t-J_Gv5uU~)p17+*t w&s{FgPA#n8t8g*U4)@~ho8hegG1I7)+XIUVJpVCnefmc4`A3v&Kmm*Ue_g{#_W%F@ literal 0 HcmV?d00001 diff --git a/addons/interaction/UI/team/team_management_ca.paa b/addons/interaction/UI/team/team_management_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..aa5f1c79b5b61ddf4db79ac9ac80ed1eb2fba642 GIT binary patch literal 22016 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 YHwcdkeg11*`}Fl^KfX(^jfy1w2T0E)0ssI2 literal 0 HcmV?d00001 diff --git a/addons/interaction/UI/team/team_white_ca.paa b/addons/interaction/UI/team/team_white_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..cbb02bf7b4e62bbcc931e83844d46b184ec1370a GIT binary patch literal 22016 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 literal 0 HcmV?d00001 diff --git a/addons/interaction/clientInit.sqf b/addons/interaction/clientInit.sqf new file mode 100644 index 0000000000..02762d42b6 --- /dev/null +++ b/addons/interaction/clientInit.sqf @@ -0,0 +1,12 @@ +// by commy2 and CAA-Picard + +if (!hasInterface) exitWith {}; + +AGM_Interaction_isOpeningDoor = false; +AGM_Dancing = false; + +// restore global fire teams for JIP +{ + _team = _x getVariable ["AGM_assignedFireTeam", ""]; + if (_team != "") then {_x assignTeam _team}; +} forEach allUnits; diff --git a/addons/interaction/config.cpp b/addons/interaction/config.cpp new file mode 100644 index 0000000000..961d644a0b --- /dev/null +++ b/addons/interaction/config.cpp @@ -0,0 +1,664 @@ +class CfgPatches { + class AGM_Interaction { + units[] = {}; + weapons[] = {}; + requiredVersion = 0.60; + requiredAddons[] = {AGM_Core}; + version = "0.95"; + versionStr = "0.95"; + versionAr[] = {0,95,0}; + author[] = {"commy2", "KoffeinFlummi", "CAA-Picard", "bux578"}; + authorUrl = "https://github.com/commy2/"; + }; +}; + +class CfgFunctions { + class AGM_Interaction { + class AGM_Interaction { + file = "\AGM_interaction\functions"; + class addInteraction; + class addInteractionSelf; + class AddSelectableItem; + class addToTooltip; + class applyButtons; + class canInteractWith; + class canLockDoor; + class canTapShoulder; + class getActions2; + class GetActions; + class getDoor; + class getDoorAnimations; + class getDown; + class getSelectedButton; + class hideMenu; + class hideMouseHint; + class initialiseInteraction; + class isInRange; + class joinTeam; + class lockDoor; + class menuKeyInput; + class moduleInteraction; + class moveDown; + class onButtonDown; + class onButtonDownSelf; + class onButtonUp; + class onClick; + class onSelectMenuDblClick; + class openDoor; + class openMenu; + class openMenuSelectUI; + class openMenuSelf; + class openSelectMenu; + class openSubMenu; + class openSubMenuSelf; + class prepareSelectMenu; + class push; + class removeInteraction; + class removeInteractionSelf; + class removeTag; + class sendAway; + class showMenu; + class showMouseHint; + class sortOptionsByPriority; + class tapShoulder; + class updateTooltipPosition; + + // backwards compatibility, remove in some patches + class getCaptivityStatus; + class setCaptivityStatus; + }; + }; +}; + +class Extended_PostInit_EventHandlers { + class AGM_Interaction { + clientInit = "call compile preprocessFileLineNumbers '\AGM_Interaction\clientInit.sqf'"; + }; +}; + +class Extended_GetIn_EventHandlers { + class All { + class AGM_AutoCloseMenu { + clientGetIn = "if (_this select 2 == AGM_player && {!isNull (findDisplay 1713999)}) then {(findDisplay 1713999) closeDisplay 1}"; + }; + }; +}; + +class Extended_GetOut_EventHandlers { + class All { + class AGM_AutoCloseMenu { + clientGetOut = "if (_this select 2 == AGM_player && {!isNull (findDisplay 1713999)}) then {(findDisplay 1713999) closeDisplay 1}"; + }; + }; +}; + +class AGM_Core_Default_Keys { + class openInteractionMenuNew { + displayName = "$STR_AGM_Interaction_InteractionMenu"; + condition = "true"; + statement = "call AGM_Interaction_fnc_onButtonDown"; + conditionUp = "!isNull (findDisplay 1713999) && {profileNamespace getVariable ['AGM_Interaction_AutoCloseMenu', false]}"; + statementUp = "if (AGM_Interaction_MenuType mod 2 == 0) then {call AGM_Interaction_fnc_onButtonUp};"; + exceptions[] = {"AGM_Drag_isNotDragging", "AGM_Medical_canTreat", "AGM_Interaction_isNotEscorting", "AGM_Interaction_isNotSwimming"}; + key = 219; + shift = 0; + control = 0; + alt = 0; + }; + class openInteractionMenuSelfNew { + displayName = "$STR_AGM_Interaction_InteractionMenuSelf"; + condition = "true"; + statement = "call AGM_Interaction_fnc_onButtonDownSelf"; + conditionUp = "!isNull (findDisplay 1713999) && {profileNamespace getVariable ['AGM_Interaction_AutoCloseMenu', false]}"; + statementUp = "if (AGM_Interaction_MenuType mod 2 == 1) then {call AGM_Interaction_fnc_onButtonUp};"; + exceptions[] = {"AGM_Drag_isNotDragging", "AGM_Medical_canTreat", "AGM_Interaction_isNotEscorting", "AGM_Interaction_isNotSwimming", "AGM_Core_notOnMap"}; + key = 219; + shift = 0; + control = 1; + alt = 0; + }; + class openDoor { + displayName = "$STR_AGM_Interaction_OpenDoor"; + condition = "!AGM_Interaction_isOpeningDoor && {[2] call AGM_Interaction_fnc_getDoor select 1 != ''}"; + statement = "call AGM_Interaction_fnc_openDoor"; + conditionUp = "AGM_Interaction_isOpeningDoor"; + statementUp = "AGM_Interaction_isOpeningDoor = false"; + key = 57; + shift = 0; + control = 1; + alt = 0; + }; + // disabled for now + /*class lockDoor { + displayName = "$STR_AGM_Interaction_LockDoor"; + condition = "[true] call AGM_Interaction_fnc_canLockDoor && {!AGM_Interaction_isOpeningDoor}"; + statement = "[true] call AGM_Interaction_fnc_lockDoor"; + key = 57; + shift = 0; + control = 0; + alt = 1; + }; + class unlockDoor { + displayName = "$STR_AGM_Interaction_UnlockDoor"; + condition = "[false] call AGM_Interaction_fnc_canLockDoor"; + statement = "[false] call AGM_Interaction_fnc_lockDoor"; + key = 57; + shift = 0; + control = 1; + alt = 1; + };*/ + class tapShoulder { + displayName = "$STR_AGM_Interaction_TapShoulder"; + condition = "[_player, cursorTarget] call AGM_Interaction_fnc_canTapShoulder"; + statement = "[_player, cursorTarget] call AGM_Interaction_fnc_tapShoulder"; + key = 20; + shift = 1; + control = 0; + alt = 0; + }; + class modifierKey { + displayName = "$STR_AGM_Interaction_ModifierKey"; + condition = ""; + statement = "AGM_Modifier = 1;"; + conditionUp = ""; + statementUp = "AGM_Modifier = 0;"; + exceptions[] = {"AGM_Drag_isNotDragging"}; + key = 29; + shift = 0; + control = 0; + alt = 0; + }; +}; + +class AGM_Core_Options { + class Interaction_FlowMenu { + displayName = "$STR_AGM_Interaction_FlowMenu"; + default = 0; + }; + class Interaction_AutoCloseMenu { + displayName = "$STR_AGM_Interaction_AutoCloseMenu"; + default = 0; + }; + class Interaction_AutoCenterCursor { + displayName = "$STR_AGM_Interaction_AutoCenterCursor"; + default = 1; + }; +}; + +class AGM_Parameters { + AGM_Modifier = 0; +}; +class AGM_Parameters_Boolean { + AGM_Interaction_EnableTeamManagement = 1; +}; + +class AGM_Core_canInteractConditions { + class AGM_Interaction_isNotEscorting { + condition = "!(_player getVariable ['AGM_isEscorting', false])"; + }; + class AGM_Interaction_isNotCaptive { + condition = "!(_player getVariable ['AGM_isCaptive', false])"; + }; + class AGM_Interaction_isNotSurrendering { + condition = "!(_player getVariable ['AGM_isSurrender', false])"; + }; + class AGM_Interaction_isNotSwimming { + condition = "!underwater _player"; + }; +}; + +#define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ + name = #ITEM; \ + count = COUNT; \ +}; + +class CfgVehicles { + + class Module_F; + class AGM_ModuleInteraction: Module_F { + author = "$STR_AGM_Core_AGMTeam"; + category = "AGM"; + displayName = "Interaction System"; + function = "AGM_Interaction_fnc_moduleInteraction"; + scope = 2; + isGlobal = 1; + icon = "\AGM_Interaction\UI\IconInteraction_ca.paa"; + class Arguments { + class EnableTeamManagement { + displayName = "Enable Team Management"; + description = "Should players be allowed to use the Team Management Menu? Default: Yes"; + typeName = "BOOL"; + class values { + class Yes { default = 1; name = "Yes"; value = 1;}; + class No { name = "No"; value = 0; }; + }; + }; + }; + }; + + class Man; + class CAManBase: Man { + class AGM_Actions { + class AGM_TeamManagement { + displayName = "$STR_AGM_Interaction_TeamManagement"; + distance = 4; + condition = "alive _target && {!isPlayer _target} && {_target in units group _player} && {AGM_Interaction_EnableTeamManagement}"; + statement = ""; + showDisabled = 0; + priority = 3.2; + icon = "\AGM_Interaction\UI\team\team_management_ca.paa"; + subMenu[] = {"AGM_TeamManagement", 0}; + hotkey = "M"; + enableInside = 1; + + class AGM_JoinTeamRed { + displayName = "$STR_AGM_Interaction_JoinTeamRed"; + distance = 4; + condition = "alive _target && {!isPlayer _target} && {_target in units group _player}"; + statement = "[_target, 'RED'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + icon = "\AGM_Interaction\UI\team\team_red_ca.paa"; + priority = 2.4; + hotkey = "R"; + enableInside = 1; + }; + class AGM_JoinTeamGreen { + displayName = "$STR_AGM_Interaction_JoinTeamGreen"; + distance = 4; + condition = "alive _target && {!isPlayer _target} && {_target in units group _player}"; + statement = "[_target, 'GREEN'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + icon = "\AGM_Interaction\UI\team\team_green_ca.paa"; + priority = 2.3; + hotkey = "G"; + enableInside = 1; + }; + class AGM_JoinTeamBlue { + displayName = "$STR_AGM_Interaction_JoinTeamBlue"; + distance = 4; + condition = "alive _target && {!isPlayer _target} && {_target in units group _player}"; + statement = "[_target, 'BLUE'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + icon = "\AGM_Interaction\UI\team\team_blue_ca.paa"; + priority = 2.2; + hotkey = "B"; + enableInside = 1; + }; + class AGM_JoinTeamYellow { + displayName = "$STR_AGM_Interaction_JoinTeamYellow"; + distance = 4; + condition = "alive _target && {!isPlayer _target} && {_target in units group _player}"; + statement = "[_target, 'YELLOW'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + icon = "\AGM_Interaction\UI\team\team_yellow_ca.paa"; + priority = 2.1; + hotkey = "Y"; + enableInside = 1; + }; + + class AGM_LeaveTeam { + displayName = "$STR_AGM_Interaction_LeaveTeam"; + distance = 4; + condition = "alive _target && {!isPlayer _target} && {_target in units group _player} && {assignedTeam _player != 'MAIN'}"; + statement = "[_target, 'MAIN'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + icon = "\AGM_Interaction\UI\team\team_white_ca.paa"; + priority = 2.5; + hotkey = "N"; + enableInside = 1; + }; + }; + + class AGM_TapShoulder { + displayName = "$STR_AGM_Interaction_TapShoulder"; + distance = 4; + condition = "[_player, _target] call AGM_Interaction_fnc_canTapShoulder"; + statement = "[_player, _target] call AGM_Interaction_fnc_tapShoulder"; + showDisabled = 1; + priority = 2.8; + hotkey = "Q"; + enableInside = 1; + }; + class AGM_JoinGroup { + displayName = "$STR_AGM_Interaction_JoinGroup"; + distance = 4; + condition = "side group _player == side group _target && {group _player != group _target}"; + statement = "[_player] joinSilent group _target;"; + showDisabled = 0; + priority = 2.6; + icon = "\AGM_Interaction\UI\team\team_management_ca.paa"; + hotkey = "J"; + enableInside = 1; + }; + + class AGM_GetDown { + displayName = "$STR_AGM_Interaction_GetDown"; + distance = 4; + condition = "[_target] call AGM_Interaction_fnc_canInteractWith"; + statement = "[_target] call AGM_Interaction_fnc_getDown"; + showDisabled = 0; + priority = 2.2; + }; + class AGM_SendAway { + displayName = "$STR_AGM_Interaction_SendAway"; + distance = 4; + condition = "[_target] call AGM_Interaction_fnc_canInteractWith"; + statement = "[_target] call AGM_Interaction_fnc_sendAway"; + showDisabled = 0; + priority = 2.0; + }; + class AGM_Pardon { + displayName = "$STR_AGM_Interaction_Pardon"; + distance = 4; + condition = "rating _target < -2000 && {alive _target} && {side group _player == side group _target}"; + statement = "[_target, '{_this addRating -rating _this}', _target] call AGM_Core_fnc_execRemoteFnc"; + showDisabled = 0; + priority = 2.5; + enableInside = 1; + }; + }; + + class AGM_SelfActions { + class AGM_TeamManagement { + displayName = "$STR_AGM_Interaction_TeamManagement"; + condition = "AGM_Interaction_EnableTeamManagement"; + statement = ""; + showDisabled = 1; + priority = 3.2; + icon = "\AGM_Interaction\UI\team\team_management_ca.paa"; + subMenu[] = {"AGM_TeamManagement", 1}; + enableInside = 1; + hotkey = "M"; + + class AGM_JoinTeamRed { + displayName = "$STR_AGM_Interaction_JoinTeamRed"; + condition = "true"; + statement = "[_player, 'RED'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + priority = 2.4; + icon = "\AGM_Interaction\UI\team\team_red_ca.paa"; + enableInside = 1; + hotkey = "R"; + }; + class AGM_JoinTeamGreen { + displayName = "$STR_AGM_Interaction_JoinTeamGreen"; + condition = "true"; + statement = "[_player, 'GREEN'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + priority = 2.3; + icon = "\AGM_Interaction\UI\team\team_green_ca.paa"; + enableInside = 1; + hotkey = "G"; + }; + class AGM_JoinTeamBlue { + displayName = "$STR_AGM_Interaction_JoinTeamBlue"; + condition = "true"; + statement = "[_player, 'BLUE'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + priority = 2.2; + icon = "\AGM_Interaction\UI\team\team_blue_ca.paa"; + enableInside = 1; + hotkey = "B"; + }; + class AGM_JoinTeamYellow { + displayName = "$STR_AGM_Interaction_JoinTeamYellow"; + condition = "true"; + statement = "[_player, 'YELLOW'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + priority = 2.1; + icon = "\AGM_Interaction\UI\team\team_yellow_ca.paa"; + enableInside = 1; + hotkey = "Y"; + }; + + class AGM_LeaveTeam { + displayName = "$STR_AGM_Interaction_LeaveTeam"; + condition = "assignedTeam _player != 'MAIN'"; + statement = "[_player, 'MAIN'] call AGM_Interaction_fnc_joinTeam"; + showDisabled = 1; + priority = 2.5; + icon = "\AGM_Interaction\UI\team\team_white_ca.paa"; + enableInside = 1; + hotkey = "N"; + }; + + class AGM_BecomeLeader { + displayName = "$STR_AGM_Interaction_BecomeLeader"; + condition = "count (units group _player) > 1 && {leader group _player != _player}"; + statement = "_newGroup = createGroup side group _player; (units group _player) joinSilent _newGroup; _newGroup selectLeader _player;"; + showDisabled = 1; + priority = 1.0; + icon = "\AGM_Interaction\UI\team\team_white_ca.paa"; + enableInside = 1; + hotkey = "L"; + }; + class AGM_LeaveGroup { + displayName = "$STR_AGM_Interaction_LeaveGroup"; + condition = "count (units group _player) > 1"; + statement = "_oldGroup = units group _player; _newGroup = createGroup side _player; [_player] joinSilent _newGroup; {_player reveal _x} forEach _oldGroup;"; + showDisabled = 1; + priority = 1.2; + icon = "\AGM_Interaction\UI\team\team_management_ca.paa"; + enableInside = 1; + hotkey = "M"; + }; + }; + + /* DANCE ANIMATION DOESN'T WORK :( + class AGM_Dance { + displayName = "$STR_AGM_Interaction_Dance"; + condition = "isClass (configFile >> 'CfgPatches' >> 'AGM_Movement') and !AGM_Dancing"; + statement = "AGM_Dancing = true; [-2, {_this switchMove 'TestDance';}, player] call CBA_fnc_globalExecute;"; + showDisabled = 0; + priority = -1.2; + }; + class AGM_StopDancing { + displayName = "$STR_AGM_Interaction_StopDancing"; + condition = "AGM_Dancing"; + statement = "AGM_Dancing = false; [-2, {_this switchMove '';}, player] call CBA_fnc_globalExecute;"; + showDisabled = 0; + priority = -1.2; + }; + */ + + class AGM_Gestures { + displayName = "$STR_AGM_Interaction_Gestures"; + condition = "canStand _target"; + statement = ""; + showDisabled = 1; + priority = 3.5; + subMenu[] = {"AGM_Gestures", 1}; + icon = "AGM_Interaction\UI\gestures_ca.paa"; + hotkey = "G"; + + /*class AGM_Gesture_Advance { + displayName = "$STR_AGM_Interaction_Gestures_Attack"; + condition = "canStand _target"; + statement = "_target playActionNow 'gestureAttack';"; + showDisabled = 1; + priority = 2.0; + };*/ + class AGM_Gesture_Advance { + displayName = "$STR_AGM_Interaction_Gestures_Advance"; + condition = "canStand _target"; + statement = "_target playActionNow 'gestureAdvance';"; + showDisabled = 1; + priority = 1.9; + hotkey = "1"; + }; + class AGM_Gesture_Go { + displayName = "$STR_AGM_Interaction_Gestures_Go"; + condition = "canStand _target"; + statement = "_target playActionNow (['gestureGo', 'gestureGoB'] select (floor random 2));"; + showDisabled = 1; + priority = 1.8; + hotkey = "2"; + }; + class AGM_Gesture_Follow { + displayName = "$STR_AGM_Interaction_Gestures_Follow"; + condition = "canStand _target"; + statement = "_target playActionNow 'gestureFollow';"; + showDisabled = 1; + priority = 1.7; + hotkey = "3"; + }; + /*class AGM_Gesture_Point { + displayName = "$STR_AGM_Interaction_Gestures_Point"; + condition = "canStand _target"; + statement = "_target playActionNow 'gesturePoint';"; + showDisabled = 1; + priority = 1.6; + };*/ + class AGM_Gesture_Up { + displayName = "$STR_AGM_Interaction_Gestures_Up"; + condition = "canStand _target"; + statement = "_target playActionNow 'gestureUp';"; + showDisabled = 1; + priority = 1.5; + hotkey = "4"; + }; + class AGM_Gesture_Cover { + displayName = "$STR_AGM_Interaction_Gestures_Cover"; + condition = "canStand _target"; + statement = "_target playActionNow 'gestureCover';"; + showDisabled = 1; + priority = 1.4; + hotkey = "5"; + }; + class AGM_Gesture_CeaseFire { + displayName = "$STR_AGM_Interaction_Gestures_Cease_Fire"; + condition = "canStand _target"; + statement = "_target playActionNow 'gestureCeaseFire';"; + showDisabled = 1; + priority = 1.3; + hotkey = "6"; + }; + class AGM_Gesture_Freeze { + displayName = "$STR_AGM_Interaction_Gestures_Freeze"; + condition = "canStand _target"; + statement = "_target playActionNow 'gestureFreeze';"; + showDisabled = 1; + priority = 1.2; + hotkey = "7"; + }; + class AGM_Gesture_Yes { + displayName = "$STR_AGM_Interaction_Gestures_Yes"; + condition = "canStand _target"; + statement = "_target playActionNow (['gestureYes', 'gestureNod'] select (floor random 2));"; + showDisabled = 1; + priority = 1.1; + hotkey = "8"; + }; + class AGM_Gesture_No { + displayName = "$STR_AGM_Interaction_Gestures_No"; + condition = "canStand _target"; + statement = "_target playActionNow 'gestureNo';"; + showDisabled = 1; + priority = 1.0; + hotkey = "9"; + }; + class AGM_Gesture_Hi { + displayName = "$STR_AGM_Interaction_Gestures_Hi"; + condition = "canStand _target"; + statement = "_target playActionNow (['gestureHi', 'gestureHiB', 'gestureHiC'] select (floor random 3));"; + showDisabled = 1; + priority = 0.9; + hotkey = "0"; + }; + }; + + class AGM_Equipment { + displayName = "$STR_AGM_Interaction_Equipment"; + condition = "true"; + statement = ""; + showDisabled = 1; + priority = 4.5; + icon = ""; // @todo + subMenu[] = {"AGM_Equipment", 1}; + enableInside = 1; + hotkey = "E"; + + class AGM_Dummy { + displayName = ""; + condition = "false"; + statement = ""; + showDisabled = 1; + priority = -99; + icon = "AGM_Core\UI\blank_CO.paa"; + enableInside = 1; + }; + }; + }; + }; + + class LandVehicle; + class Car: LandVehicle { + class AGM_Actions {}; + class AGM_SelfActions {}; + }; + class Tank: LandVehicle { + class AGM_Actions {}; + class AGM_SelfActions {}; + }; + + class Air; + class Helicopter: Air { + class AGM_Actions {}; + class AGM_SelfActions {}; + }; + class Plane: Air { + class AGM_Actions {}; + class AGM_SelfActions {}; + }; + + class Ship; + class Ship_F: Ship { + class AGM_Actions { + class AGM_Push { + displayName = "$STR_AGM_Interaction_Push"; + distance = 4; + condition = "getMass _target < 1000 and alive _target"; + statement = "[_target, [2 * (vectorDir _player select 0), 2 * (vectorDir _player select 1), 0.5]] call AGM_Interaction_fnc_push;"; + showDisabled = 0; + priority = -1; + }; + }; + class AGM_SelfActions {}; + }; + + class StaticWeapon: LandVehicle { + class AGM_Actions {}; + class AGM_SelfActions {}; + }; + + class StaticMortar; + class Mortar_01_base_F: StaticMortar { + class AGM_Actions {}; + class AGM_SelfActions {}; + }; + + class Box_NATO_Support_F; + class AGM_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(AGM_CableTie,24) + }; + }; +}; + +class CfgWeapons { + class AGM_ItemCore; + class InventoryItem_Base_F; + + class AGM_CableTie: AGM_ItemCore { + displayName = "$STR_AGM_Interaction_CableTie_Name"; + descriptionShort = "$STR_AGM_Interaction_CableTie_Description"; + model = "\AGM_Interaction\agm_cabletie.p3d"; + picture = "\AGM_Interaction\UI\agm_cabletie_x_ca.paa"; + scope = 2; + class ItemInfo: InventoryItem_Base_F { + mass = 1; + }; + }; +}; + +#include diff --git a/addons/interaction/functions/fn_AddSelectableItem.sqf b/addons/interaction/functions/fn_AddSelectableItem.sqf new file mode 100644 index 0000000000..f6fccae709 --- /dev/null +++ b/addons/interaction/functions/fn_AddSelectableItem.sqf @@ -0,0 +1,40 @@ +/* + Name: AGM_Interaction_fnc_AddSelectableItem + + Author: Garth de Wet (LH) + + Description: + Adds an item to the select menu + + Parameters: + 0: ARRAY/NUMBER - List container + 1: String - Display Name + 2: String - Picture + 3: String/code - data + + Returns: + ARRAY/Number + + Example: +*/ +private ["_container", "_displayName", "_picture", "_data", "_index"]; + +_container = _this select 0; +_displayName = _this select 1; +_picture = _this select 2; +_data = _this select 3; + +if (_picture == "" || _picture == "PictureThing") then { + _picture = "AGM_Interaction\UI\dot_ca.paa"; +}; + +if ((profileNamespace getVariable ["AGM_Interaction_FlowMenu", false])) then { + //[_displayName, _statement, _condition, _priority, _subMenu, _icon, _tooltip, _conditionShow, _exceptions, _distance, _hotkey] + _container pushBack [_displayName, nil, {true},0,[], _picture, "", {true}, [], 4, "", _data]; +}else{ + _index = lbAdd [_container, _displayName]; + lbSetData [_container, _index, str _data]; + lbSetPicture [_container, _index, _picture]; +}; + +_container diff --git a/addons/interaction/functions/fn_GetActions.sqf b/addons/interaction/functions/fn_GetActions.sqf new file mode 100644 index 0000000000..6e7b067150 --- /dev/null +++ b/addons/interaction/functions/fn_GetActions.sqf @@ -0,0 +1,154 @@ +/* + Name: AGM_Interaction_fnc_GetActions + + Author: + commy2 + Garth de Wet (LH) + + Description: + + Parameters: + 0: OBJECT - target + 1: ARRAY - Parents of the target object + 2: ARRAY - Actions + 3: ARRAY - Patches + 4: CONFIG - Parent config (ConfigFile >> "CfgVehicles"/MissionConfigFile >> "CfgVehicles") + 5: BOOL - Is mission config file? + 6: STRING - Classname ("AGM_Actions"/"AGM_SelfActions") + 7: STRING - Sub-class + + Returns: + Nothing + + Example: + [player, [configfile >> "CfgVehicles" >> typeOf player, true] call BIS_fnc_returnParents, [], [],configfile >> "CfgVehicles", false, "AGM_Actions"] call AGM_Interaction_fnc_GetActions; + + [player, [configfile >> "CfgVehicles" >> typeOf player, true] call BIS_fnc_returnParents, [], [],configfile >> "CfgVehicles", false, "AGM_SelfActions"] call AGM_Interaction_fnc_GetActions; +*/ +#define DEFAULT_ICON "\AGM_Interaction\UI\dot_ca.paa" +private ["_target", "_parents", "_actions", "_patches", "_baseConfig", "_actionType", "_i","_index", "_missionConfig", "_stdConfig"]; +_target = _this select 0; +_parents = _this select 1; +_actions = _this select 2; +_patches = _this select 3; +_baseConfig = _this select 4; +_missionConfig = _this select 5; +_actionType = _this select 6; +_subClass = _this select 7; + +_stdConfig = (configFile >> "CfgVehicles" >> typeOf _target >> _actionType); +if (_subClass != "") then { + _stdConfig = _stdConfig >> _subClass; +}; + +_count = count _parents; +for "_i" from 0 to (_count - 1) do { + _config = _baseConfig >> _parents select _i >> _actionType; + if (_subClass != "") then { + _config = _config >> _subClass; + }; + + _count = count _config; + if (_count > 0) then { + for "_index" from 0 to (_count - 1) do { + private ["_action", "_displayName", "_distance","_condition","_statement","_showDisabled", "_priority", "_tooltip", "_hotkey", + "_subMenu", "_conditionShow", "_exceptions", "_icon", "_actionToCache", "_cacheActions", "_cache", "_indexCache", "_configName"]; + _action = if (_missionConfig) then {_config select _index} else {_stdConfig >> configName (_config select _index)}; + _cache = missionNamespace getVariable ["AGM_Interaction_MenuCache", [[], [], []]]; + + if (count _action > 0) then { + _configName = configName _action; + + _cacheConfigs = _cache select 0; + _cacheActions = _cache select 1; + _cacheIndices = _cache select 2; + + _indexCache = _cacheConfigs find _action; + if (_indexCache == -1) then { + _displayName = getText (_action >> "displayName"); + _distance = getNumber (_action >> "distance"); + _priority = getNumber (_action >> "priority"); + _subMenu = getArray (_action >> "subMenu"); + _tooltip = getText (_action >> "tooltip"); + _hotkey = getText (_action >> "hotkey"); + _enableInside = getNumber (_action >> "enableInside"); + + // Condition + _condition = getText (_action >> "condition"); + if (_condition == "") then {_condition = "true"}; + + _condition = _condition + format [" && {%1 call AGM_Core_canInteract} && {[AGM_player, AGM_Interaction_Target] call AGM_Core_fnc_canInteractWith}", getArray (_action >> "exceptions")]; + if (_enableInside != 1) then {_condition = _condition + " && {_player == _vehicle}"}; + + _condition = compile _condition; + + // Condition to show the action + _conditionShow = getText (_action >> "conditionShow"); + _conditionShow = if (_conditionShow == "") then {{true}} else {compile _conditionShow}; + + _showDisabled = getNumber (_action >> "showDisabled") == 1; + if (isText (_action >> "conditionShow")) then { + _showDisabled = [_object, _player] call _conditionShow; + }; + + // Exceptions to the general conditions that have to be true + _exceptions = getArray (_action >> "exceptions"); + + // statement + _statement = getText (_action >> "statement"); + _statement = compile _statement; + + if (profileNamespace getVariable ["AGM_Interaction_FlowMenu", false]) then { + _statement = if (getText (_action >> "statement") == "" && {count _subMenu > 1}) then { + compile format ["call AGM_Interaction_fnc_hideMenu;if(%2 == 1)then{['%1'] call AGM_Interaction_fnc_openSubMenuSelf;}else{['%1'] call AGM_Interaction_fnc_openSubMenu;};", _subMenu select 0, _subMenu select 1]; + } else { + compile ("call AGM_Interaction_fnc_hideMenu;" + getText (_action >> "statement")); + }; + }; + + // icon + _icon = getText (_action >> "Icon"); + if (_icon == "") then { + _icon = DEFAULT_ICON; + }; + + _actionToCache = [_displayName, _statement, _condition, _priority, _subMenu, _icon, _tooltip, _conditionShow, _exceptions, _distance, _hotkey]; + + if (!(_configName in _patches) && {_showDisabled || {[_object, _player] call _condition}} && {_distance == 0 || {[_object, _distance] call AGM_Interaction_fnc_isInRange}}) then { + _actions pushBack _actionToCache; + _patches pushBack _configName; + }; + + _indexCache = _cacheActions find _actionToCache; + if (_indexCache == -1) then { + _indexCache = count _cacheActions; + _cacheActions pushBack _actionToCache; + }; + + _cacheConfigs pushBack _action; + _cacheIndices pushBack _indexCache; + + _cache = [_cacheConfigs, _cacheActions, _cacheIndices]; + ["InteractionMenu", _action, {format ["%1 loaded into cache", _this]}] call AGM_Debug_fnc_log; + } else { + ["InteractionMenu", _action, {format ["%1 loaded from cache", _this]}] call AGM_Debug_fnc_log; + + _cachedAction = _cacheActions select (_cacheIndices select _indexCache); + + _showDisabled = getNumber (_action >> "showDisabled") == 1; + if (isText (_action >> "conditionShow")) then { + _showDisabled = [_object, _player] call (_cachedAction select 7); + }; + + if (!(_configName in _patches) && {_showDisabled || {[_object, _player] call (_cachedAction select 2)}} && {[_object, (_cachedAction select 9)] call AGM_Interaction_fnc_isInRange || {(_cachedAction select 9) == 0}}) then { + _actions pushBack _cachedAction; + _patches pushBack _configName; + }; + }; + }; + + AGM_Interaction_MenuCache = _cache; + }; + }; +}; +[_actions, _patches] diff --git a/addons/interaction/functions/fn_MoveDown.sqf b/addons/interaction/functions/fn_MoveDown.sqf new file mode 100644 index 0000000000..7a5662ed9b --- /dev/null +++ b/addons/interaction/functions/fn_MoveDown.sqf @@ -0,0 +1,66 @@ +/* + Name: AGM_Interaction_fnc_MoveDown + + Author: Garth de Wet (LH) + + Description: + Depending on the passed value, either scrolls down through the list or up. + + Parameters: + NUMBER - Amount to increase current interaction target + + Returns: + Nothing + + Example: + 1 call AGM_Interaction_fnc_MoveDown; + -1 call AGM_Interaction_fnc_MoveDown; +*/ +#define CLAMP(x,low,high) (if(x > high)then{high}else{if(x < low)then{low}else{x}}) +if (isNil "AGM_Interaction_MainButton") exitWith{}; +if (isNil "AGM_Interaction_Buttons") exitWith{}; +_count = (count AGM_Interaction_Buttons)- 1; +AGM_Interaction_SelectedButton = CLAMP(AGM_Interaction_SelectedButton + _this, 0, _count); + +_target = AGM_Interaction_Target; +_player = AGM_player; +_vehicle = vehicle _player; + +disableSerialization; +_dlgInteractionDialog = uiNamespace getVariable "AGM_Flow_Display"; +_top = AGM_Interaction_SelectedButton - 2; +_i = 0; +while {_i <= 4} do { + _index =_i + _top; + _ctrl = _dlgInteractionDialog displayCtrl (1200 + _i); + if (_index >= 0 && {_index <= _count}) then { + _action = AGM_Interaction_Buttons select _index; + _ctrl ctrlShow true; + _ctrl ctrlSetText (_action select 5); + _color = [1,1,1,1]; + if !([_target, _player] call (_action select 2)) then { + _color = [0.3,0.3,0.3,0.8]; + }; + if (_i == 0 || _i == 4) then { + _color set [3, 0.5]; + }; + if (_i == 1 || _i == 3) then { + _color set [3, 0.75]; + }; + _ctrl ctrlSetTextColor _color; + }else{ + _ctrl ctrlShow false; + }; + _i = _i + 1; +}; + +_ctrl = _dlgInteractionDialog displayCtrl 1000; +_ctrl ctrlSetText ((AGM_Interaction_Buttons select AGM_Interaction_SelectedButton) select 0); +_ctrl = _dlgInteractionDialog displayCtrl 1100; +_current = (AGM_Interaction_Buttons select AGM_Interaction_SelectedButton); +_infoText = ""; +if !([_target, _player] call (_current select 2)) then { + _infoText = "Unavailable"; +}; +_ctrl ctrlSetText _infoText; +_ctrl ctrlShow (_infoText != ""); diff --git a/addons/interaction/functions/fn_addInteraction.sqf b/addons/interaction/functions/fn_addInteraction.sqf new file mode 100644 index 0000000000..72c3ccb182 --- /dev/null +++ b/addons/interaction/functions/fn_addInteraction.sqf @@ -0,0 +1,55 @@ +/* + * Author: commy2 + * + * Add an AGM action to an object. Note: This function is global. + * + * Argument: + * 0: Object the action should be assigned to (Object) + * 1: Name of the action shown in the menu (String) + * 2: Distance the player can be away from the object (Number) + * 3: Condition (Code or String) + * 4: Statement (Code or String) + * 5: Show the action even if the conditon is not met (Bool or Number) + * 6: Priority (Number, optional default: 0) + * + * Return value: + * ID of the action (used to remove it later). + */ + +private ["_object", "_displayName", "_distance", "_condition", "_statement", "_showDisabled", "_priority", "_actionsVar", "_id", "_actionIDs", "_actions"]; + +_object = _this select 0; +_displayName = _this select 1; +_distance = _this select 2; +_condition = _this select 3; +_statement = _this select 4; +_showDisabled = _this select 5; +_priority = _this select 6; + +if (typeName _condition == "STRING") then { + _condition = compile _condition; +}; + +if (typeName _statement == "STRING") then { + _statement = compile _statement; +}; + +if (typeName _showDisabled == "SCALAR") then { + _showDisabled = _showDisabled > 0; +}; + +if (isNil "_priority") then { + _priority = 0; +}; + +_actionsVar = _object getVariable ["AGM_Interactions", [-1, [], []]]; + +_id = (_actionsVar select 0) + 1; +_actionIDs = _actionsVar select 1; +_actions = _actionsVar select 2; + +_actionIDs pushBack _id; +_actions pushBack [_displayName, _distance, _condition, _statement, _showDisabled, _priority]; + +_object setVariable ["AGM_Interactions", [_id, _actionIDs, _actions], true]; +_id diff --git a/addons/interaction/functions/fn_addInteractionSelf.sqf b/addons/interaction/functions/fn_addInteractionSelf.sqf new file mode 100644 index 0000000000..bccaf40528 --- /dev/null +++ b/addons/interaction/functions/fn_addInteractionSelf.sqf @@ -0,0 +1,55 @@ +/* + * Author: commy2 + * + * Add an AGM self action to the player. Execute this on the local machine of the player. + * + * Argument: + * 0: Name of the action shown in the menu (String) + * 1: Condition (Code or String) + * 2: Statement (Code or String) + * 3: Show the action even if the conditon is not met (Bool or Number) + * 4: Priority (Number, optional default: 0) + * + * Return value: + * ID of the action (used to remove it later). + */ + + + +private ["_displayName", "_condition", "_statement", "_showDisabled", "_priority", "_actionsVar", "_id", "_actionIDs", "_actions"]; + + +_displayName = _this select 0; + +_condition = _this select 1; +_statement = _this select 2; +_showDisabled = _this select 3; +_priority = _this select 4; + +if (typeName _condition == "STRING") then { + _condition = compile _condition; +}; + +if (typeName _statement == "STRING") then { + _statement = compile _statement; +}; + +if (typeName _showDisabled == "SCALAR") then { + _showDisabled = _showDisabled > 0; +}; + +if (isNil "_priority") then { + _priority = 0; +}; + +_actionsVar = AGM_player getVariable ["AGM_InteractionsSelf", [-1, [], []]]; + +_id = (_actionsVar select 0) + 1; +_actionIDs = _actionsVar select 1; +_actions = _actionsVar select 2; + +_actionIDs pushBack _id; +_actions pushBack [_displayName, _condition, _statement, _showDisabled, _priority]; + +AGM_player setVariable ["AGM_InteractionsSelf", [_id, _actionIDs, _actions], false]; +_id diff --git a/addons/interaction/functions/fn_addToTooltip.sqf b/addons/interaction/functions/fn_addToTooltip.sqf new file mode 100644 index 0000000000..b54b7c5716 --- /dev/null +++ b/addons/interaction/functions/fn_addToTooltip.sqf @@ -0,0 +1,3 @@ +// by commy2 + +AGM_Interaction_CurrentTooltip pushBack (_this select 0); diff --git a/addons/interaction/functions/fn_applyButtons.sqf b/addons/interaction/functions/fn_applyButtons.sqf new file mode 100644 index 0000000000..8bc732f946 --- /dev/null +++ b/addons/interaction/functions/fn_applyButtons.sqf @@ -0,0 +1,51 @@ +// by commy2 + +private ["_object", "_actions", "_dlgInteractionDialog", "_ctrlInteractionDialog", "_index", "_ctrlInteractionDialogIcon"]; + +_object = AGM_Interaction_Target; +_actions = AGM_Interaction_Buttons; + + +disableSerialization; +_dlgInteractionDialog = uiNamespace getVariable "AGM_Interaction_Dialog"; + +/* +for "_a" from 0 to (_count - 1) do { + _action = AGM_Interaction_Buttons select _a; + + _ctrlInteractionDialog = _dlgInteractionDialog displayCtrl (10 + _a); + _ctrlInteractionDialog ctrlShow true; + _ctrlInteractionDialog ctrlSetText (_action select 0); + _ctrlInteractionDialog ctrlEnable (call (_action select 2)); +}; +*/ + +_ctrlInteractionDialog = _dlgInteractionDialog displayCtrl 3; + +AGM_Interaction_MainButton = "(findDisplay 1713999) closeDisplay 1;"; + +if (_object isKindOf "Man") then { + _ctrlInteractionDialog ctrlSetText (if (alive _object) then {name _object} else {_object getVariable ["AGM_Name", "Unknown"]}); +} else { + _ctrlInteractionDialog ctrlSetText (getText (configFile >> "CfgVehicles" >> typeOf _object >> "displayName")); +}; + +for "_index" from 0 to 9 do { + _ctrlInteractionDialog = _dlgInteractionDialog displayCtrl (10 + _index); + _ctrlInteractionDialog ctrlShow true; + + _ctrlInteractionDialogIcon = _dlgInteractionDialog displayCtrl (20 + _index); + + if (_index < _count) then { + _action = AGM_Interaction_Buttons select _index; + _ctrlInteractionDialog ctrlSetText (_action select 0); + _ctrlInteractionDialog ctrlEnable (call (_action select 2)); + + _ctrlInteractionDialogIcon ctrlSetText (_action select 5); + } else { + _ctrlInteractionDialog ctrlSetText ""; + _ctrlInteractionDialog ctrlEnable false; + + _ctrlInteractionDialogIcon ctrlSetText ""; + }; +}; diff --git a/addons/interaction/functions/fn_canInteractWith.sqf b/addons/interaction/functions/fn_canInteractWith.sqf new file mode 100644 index 0000000000..8766ff096e --- /dev/null +++ b/addons/interaction/functions/fn_canInteractWith.sqf @@ -0,0 +1,12 @@ +// by commy2 + +private ["_unit", "_isCivilian"]; + +_unit = _this select 0; +_isCivilian = _this select 1; + +if (isNil "_isCivilian") then {_isCivilian = true}; + +alive _unit +&& [side _unit != side AGM_player, side group _unit == civilian] select _isCivilian +//&& {count (weapons _unit) == 0} diff --git a/addons/interaction/functions/fn_canLockDoor.sqf b/addons/interaction/functions/fn_canLockDoor.sqf new file mode 100644 index 0000000000..8591bc3c78 --- /dev/null +++ b/addons/interaction/functions/fn_canLockDoor.sqf @@ -0,0 +1,16 @@ +// by commy2 + +private ["_mode", "_info", "_house", "_door", "_id"]; + +_mode = _this select 0; //lock: true, unlock: false + +_info = [2] call AGM_Interaction_fnc_getDoor; + +_house = _info select 0; +_door = _info select 1; +_id = _info select 2; + +!isNull _house +&& {_door == "door"} +&& {!_mode || {_house animationPhase format ["door_%1_rot", _id] <= 0}} +&& {(_house getVariable [format ["BIS_Disabled_Door_%1", _id], 0] != 1) isEqualTo _mode} diff --git a/addons/interaction/functions/fn_canTapShoulder.sqf b/addons/interaction/functions/fn_canTapShoulder.sqf new file mode 100644 index 0000000000..0966b53c37 --- /dev/null +++ b/addons/interaction/functions/fn_canTapShoulder.sqf @@ -0,0 +1,11 @@ +// by commy2 + +private ["_unit", "_target"]; + +_unit = _this select 0; +_target = _this select 1; + +_target isKindOf "CAManBase" && +{alive _target} && +{_unit distance _target < 4} && +{!(_target getVariable ["AGM_isUnconscious", false])} diff --git a/addons/interaction/functions/fn_getActions2.sqf b/addons/interaction/functions/fn_getActions2.sqf new file mode 100644 index 0000000000..2ede8ea968 --- /dev/null +++ b/addons/interaction/functions/fn_getActions2.sqf @@ -0,0 +1,120 @@ +// commy2 + +private ["_object", "_config", "_type", "_actions", "_configs"]; + +_object = _this select 0; +_config = _this select 1; // configFile, missionConfigFile +_type = _this select 2; // "AGM_CfgInteractions", "AGM_CfgInteractionsSelf" +_actions = _this select 3; // []; + +_configs = "_object isKindOf configName _x" configClasses (_config >> _type); + +// cache +private ["_cache", "_cacheConfigs", "_cacheActions", "_cacheIndices"]; + +_cache = uiNamespace getVariable ["AGM_Interaction_MenuCache", [[], [], []]]; +_cacheConfigs = _cache select 0; +_cacheActions = _cache select 1; +_cacheIndices = _cache select 2; + +// get interactions +{ + private "_configActions"; + + _configActions = "true" configClasses (_config >> _type >> configName _x); + { + private ["_action", "_configName", "_indexCache"]; + + _action = _x; + _configName = configName _action; + + _indexCache = _cacheConfigs find _action; + if (_indexCache == -1) then { + private ["_displayName", "_distance", "_priority", "_subMenu", "_tooltip", "_hotkey", "_enableInside", "_condition", "_conditionShow", "_showDisabled", "_exceptions", "_statement", "_icon"]; + + _displayName = getText (_action >> "displayName"); + _distance = getNumber (_action >> "distance"); + _priority = getNumber (_action >> "priority"); + _subMenu = getArray (_action >> "subMenu"); + _tooltip = getText (_action >> "tooltip"); + _hotkey = getText (_action >> "hotkey"); + _enableInside = getNumber (_action >> "enableInside"); + + // Condition + _condition = getText (_action >> "condition"); + if (_condition == "") then {_condition = "true"}; + + _condition = _condition + format [" && {%1 call AGM_Core_canInteract} && {[AGM_player, AGM_Interaction_Target] call AGM_Core_fnc_canInteractWith}", getArray (_action >> "exceptions")]; + if (_enableInside != 1) then {_condition = _condition + " && {_player == _vehicle}"}; + + _condition = compile _condition; + + // Condition to show the action + _conditionShow = getText (_action >> "conditionShow"); + _conditionShow = if (_conditionShow == "") then {{true}} else {compile _conditionShow}; + + _showDisabled = getNumber (_action >> "showDisabled") == 1; + if (isText (_action >> "conditionShow")) then { + _showDisabled = [_object, _player] call _conditionShow; + }; + + // Exceptions to the general conditions that have to be true + _exceptions = getArray (_action >> "exceptions"); + + // statement + _statement = getText (_action >> "statement"); + _statement = compile _statement; + + if (profileNamespace getVariable ["AGM_Interaction_FlowMenu", false]) then { + _statement = if (getText (_action >> "statement") == "" && {count _subMenu > 1}) then { + compile format ["call AGM_Interaction_fnc_hideMenu;if(%2 == 1)then{['%1'] call AGM_Interaction_fnc_openSubMenuSelf;}else{['%1'] call AGM_Interaction_fnc_openSubMenu;};", _subMenu select 0, _subMenu select 1]; + } else { + compile ("call AGM_Interaction_fnc_hideMenu;" + getText (_action >> "statement")); + }; + }; + + // icon + _icon = getText (_action >> "Icon"); + if (_icon == "") then { + _icon = DEFAULT_ICON; + }; + + private "_actionToCache"; + _actionToCache = [_displayName, _statement, _condition, _priority, _subMenu, _icon, _tooltip, _conditionShow, _exceptions, _distance, _hotkey]; + + if ((_showDisabled || {[_object, _player] call _condition}) && {_distance == 0 || {[_object, _distance] call AGM_Interaction_fnc_isInRange}}) then { + _actions pushBack _actionToCache; + }; + + _indexCache = _cacheActions find _actionToCache; + if (_indexCache == -1) then { + _indexCache = count _cacheActions; + _cacheActions pushBack _actionToCache; + }; + + _cacheConfigs pushBack _action; + _cacheIndices pushBack _indexCache; + + _cache = [_cacheConfigs, _cacheActions, _cacheIndices]; + ["InteractionMenu", _action, {format ["%1 loaded into cache", _this]}] call AGM_Debug_fnc_log; + } else { + ["InteractionMenu", _action, {format ["%1 loaded from cache", _this]}] call AGM_Debug_fnc_log; + + private ["_cachedAction", "_showDisabled"]; + _cachedAction = _cacheActions select (_cacheIndices select _indexCache); + + _showDisabled = getNumber (_action >> "showDisabled") == 1; + if (isText (_action >> "conditionShow")) then { + _showDisabled = [_object, _player] call (_cachedAction select 7); + }; + + if ((_showDisabled || {[_object, _player] call (_cachedAction select 2)}) && {[_object, (_cachedAction select 9)] call AGM_Interaction_fnc_isInRange || {(_cachedAction select 9) == 0}}) then { + _actions pushBack _cachedAction; + }; + }; + } forEach _configActions; //Actions of this CfgVehicles class +} forEach _configs; //CfgVehicles class + +uiNamespace setVariable ["AGM_Interaction_MenuCache", _cache]; + +_actions diff --git a/addons/interaction/functions/fn_getCaptivityStatus.sqf b/addons/interaction/functions/fn_getCaptivityStatus.sqf new file mode 100644 index 0000000000..43538e882b --- /dev/null +++ b/addons/interaction/functions/fn_getCaptivityStatus.sqf @@ -0,0 +1,3 @@ +// by commy2 + +_this call AGM_Core_fnc_getCaptivityStatus; diff --git a/addons/interaction/functions/fn_getDoor.sqf b/addons/interaction/functions/fn_getDoor.sqf new file mode 100644 index 0000000000..19e5277873 --- /dev/null +++ b/addons/interaction/functions/fn_getDoor.sqf @@ -0,0 +1,31 @@ +// by commy2 + +private ["_distance", "_position0", "_position1", "_intersections", "_count", "_house", "_door", "_index", "_id"]; + +_distance = _this select 0; + +_position0 = positionCameraToWorld [0, 0, 0]; +_position1 = positionCameraToWorld [0, 0, _distance]; + +_intersections = lineIntersectsWith [ATLToASL _position0, ATLToASL _position1, objNull, objNull, true]; + +_count = count _intersections; +if (_count == 0) exitWith {[objNull, ""]}; + +_house = _intersections select (_count - 1); + +// shithouse is bugged +if (typeOf _house == "") exitWith {[objNull, ""]}; + +_intersections = [_house, "GEOM"] intersect [_position0, _position1]; + +_door = _intersections select 0 select 0; +if (isNil "_door") exitWith {[_house, ""]}; +[_house, _door] + +/* +_house = cursorTarget; +_actions = "true" configClasses (configFile >> "CfgVehicles" >> typeOf _house >> "UserActions"); +_actions = [_actions, {getText (_x >> "statement")}] call AGM_Core_fnc_map; +_actions +*/ diff --git a/addons/interaction/functions/fn_getDoorAnimations.sqf b/addons/interaction/functions/fn_getDoorAnimations.sqf new file mode 100644 index 0000000000..67e6788754 --- /dev/null +++ b/addons/interaction/functions/fn_getDoorAnimations.sqf @@ -0,0 +1,106 @@ +// by commy2 + +private ["_house", "_door", "_animations", "_lockedVariable"]; + +_house = _this select 0; +_door = _this select 1; + +_index = [ + "door_1", + "door_2", + "door_3", + "door_4", + "door_5", + "door_6", + "door_7", + "door_8", + "door_9", + "door_10", + "door_11", + "door_12", + "door_13", + "Door_14", + "door_15", + "door_16", + "door_17", + "door_18", + "door_19", + "door_20", + "door_21", + "door_22", + + "hatch_1", + "hatch_2", + "hatch_3", + "hatch_4", + "hatch_5", + "hatch_6" +] find toLower _door; + +if (_index == -1) exitWith {[[],""]}; + +_animations = [ + ["Door_1_rot", "Door_Handle_1_rot_1", "Door_Handle_1_rot_2"], + ["Door_2_rot", "Door_Handle_2_rot_1", "Door_Handle_2_rot_2"], + ["Door_3_rot", "Door_Handle_3_rot_1", "Door_Handle_3_rot_2"], + ["Door_4_rot", "Door_Handle_4_rot_1", "Door_Handle_4_rot_2"], + ["Door_5_rot", "Door_Handle_5_rot_1", "Door_Handle_5_rot_2"], + ["Door_6_rot", "Door_Handle_6_rot_1", "Door_Handle_6_rot_2"], + ["Door_7_rot", "Door_Handle_7_rot_1", "Door_Handle_7_rot_2"], + ["Door_8_rot", "Door_Handle_8_rot_1", "Door_Handle_8_rot_2"], + ["Door_9_rot", "Door_Handle_9_rot_1", "Door_Handle_9_rot_2"], + ["Door_10_rot", "Door_Handle_10_rot_1", "Door_Handle_10_rot_2"], + ["Door_11_rot", "Door_Handle_11_rot_1", "Door_Handle_11_rot_2"], + ["Door_12_rot", "Door_Handle_12_rot_1", "Door_Handle_12_rot_2"], + ["Door_13_rot", "Door_Handle_13_rot_1", "Door_Handle_13_rot_2"], + ["Door_14_rot", "Door_Handle_14_rot_1", "Door_Handle_14_rot_2"], + ["Door_15_rot", "Door_Handle_15_rot_1", "Door_Handle_15_rot_2"], + ["Door_16_rot", "Door_Handle_16_rot_1", "Door_Handle_16_rot_2"], + ["Door_17_rot", "Door_Handle_17_rot_1", "Door_Handle_17_rot_2"], + ["Door_18_rot", "Door_Handle_18_rot_1", "Door_Handle_18_rot_2"], + ["Door_19_rot", "Door_Handle_19_rot_1", "Door_Handle_19_rot_2"], + ["Door_20_rot", "Door_Handle_20_rot_1", "Door_Handle_20_rot_2"], + ["Door_21_rot", "Door_Handle_21_rot_1", "Door_Handle_21_rot_2"], + ["Door_22_rot", "Door_Handle_22_rot_1", "Door_Handle_22_rot_2"], + + ["Hatch_1_rot"], + ["Hatch_2_rot"], + ["Hatch_3_rot"], + ["Hatch_4_rot"], + ["Hatch_5_rot"], + ["Hatch_6_rot"] +] select _index; + +_lockedVariable = [ + ["BIS_Disabled_Door_1", "Door_Handle_1_rot_1", "Door_Locked_1_rot"], + ["BIS_Disabled_Door_2", "Door_Handle_2_rot_1", "Door_Locked_2_rot"], + ["BIS_Disabled_Door_3", "Door_Handle_3_rot_1", "Door_Locked_3_rot"], + ["BIS_Disabled_Door_4", "Door_Handle_4_rot_1", "Door_Locked_4_rot"], + ["BIS_Disabled_Door_5", "Door_Handle_5_rot_1", "Door_Locked_5_rot"], + ["BIS_Disabled_Door_6", "Door_Handle_6_rot_1", "Door_Locked_6_rot"], + ["BIS_Disabled_Door_7", "Door_Handle_7_rot_1", "Door_Locked_7_rot"], + ["BIS_Disabled_Door_8", "Door_Handle_8_rot_1", "Door_Locked_8_rot"], + ["BIS_Disabled_Door_9", "Door_Handle_9_rot_1", "Door_Locked_9_rot"], + ["BIS_Disabled_Door_10", "Door_Handle_10_rot_1", "Door_Locked_10_rot"], + ["BIS_Disabled_Door_11", "Door_Handle_11_rot_1", "Door_Locked_11_rot"], + ["BIS_Disabled_Door_12", "Door_Handle_12_rot_1", "Door_Locked_12_rot"], + ["BIS_Disabled_Door_13", "Door_Handle_13_rot_1", "Door_Locked_13_rot"], + ["BIS_Disabled_Door_14", "Door_Handle_14_rot_1", "Door_Locked_14_rot"], + ["BIS_Disabled_Door_15", "Door_Handle_15_rot_1", "Door_Locked_15_rot"], + ["BIS_Disabled_Door_16", "Door_Handle_16_rot_1", "Door_Locked_16_rot"], + ["BIS_Disabled_Door_17", "Door_Handle_17_rot_1", "Door_Locked_17_rot"], + ["BIS_Disabled_Door_18", "Door_Handle_18_rot_1", "Door_Locked_18_rot"], + ["BIS_Disabled_Door_19", "Door_Handle_19_rot_1", "Door_Locked_19_rot"], + ["BIS_Disabled_Door_20", "Door_Handle_20_rot_1", "Door_Locked_20_rot"], + ["BIS_Disabled_Door_21", "Door_Handle_21_rot_1", "Door_Locked_21_rot"], + ["BIS_Disabled_Door_22", "Door_Handle_22_rot_1", "Door_Locked_22_rot"], + + ["", ""], + ["", ""], + ["", ""], + ["", ""], + ["", ""], + ["", ""] +] select _index; + +[_animations, _lockedVariable] diff --git a/addons/interaction/functions/fn_getDown.sqf b/addons/interaction/functions/fn_getDown.sqf new file mode 100644 index 0000000000..73bae1c883 --- /dev/null +++ b/addons/interaction/functions/fn_getDown.sqf @@ -0,0 +1,33 @@ +/* + * Author: KoffeinFlummi + * + * Forces a civilian to the ground. (chance of failure). + * + * Arguments: + * 0: Unit to be sent away (Object) + * + * Return value: + * none + */ + +#define RADIUS 10 + +private ["_unit", "_chance", "_x"]; + +_unit = _this select 0; + +AGM_player playActionNow "GestureGo"; // put something else here. + +if (count (weapons AGM_player) > 0) then { + _chance = 0.8; +} else { + _chance = 0.5; +}; + +{ + if (count (weapons _unit) == 0 and random 1 < _chance) then { + [-2, { + _this setUnitPos "DOWN"; + }, _x] call CBA_fnc_globalExecute; + }; +} foreach (_unit nearEntities ["Civilian", RADIUS]); diff --git a/addons/interaction/functions/fn_getSelectedButton.sqf b/addons/interaction/functions/fn_getSelectedButton.sqf new file mode 100644 index 0000000000..3813811703 --- /dev/null +++ b/addons/interaction/functions/fn_getSelectedButton.sqf @@ -0,0 +1,23 @@ +// by commy2 + +#define MIN_DISTANCE 0.0065 + +private ["_position", "_distance", "_angle"]; + +_position = uiNamespace getVariable ['AGM_Interaction_CursorPosition', [0.5, 0.5, 0]]; + +_position = [((_position select 1) - 0.5) / safezoneH, ((_position select 2) - 0.5) / safezoneW, 0]; + +_distance = [0, 0, 0] vectorDistanceSqr _position; + +// is in center +if (_distance < MIN_DISTANCE) exitWith {-1}; + +_angle = (_position select 0) atan2 (_position select 1); + +// rotate circle +_angle = 180 - _angle + 360 / 10 / 2; +if (_angle < 0) then {_angle = _angle + 360}; + +_angle = floor (_angle / 360 * 10); +if (_angle == 10) then {0} else {_angle} diff --git a/addons/interaction/functions/fn_hideMenu.sqf b/addons/interaction/functions/fn_hideMenu.sqf new file mode 100644 index 0000000000..24e867b5b5 --- /dev/null +++ b/addons/interaction/functions/fn_hideMenu.sqf @@ -0,0 +1,22 @@ +/* + Name: AGM_Interaction_fnc_hideMenu + + Author: Garth de Wet (LH) + + Description: + Closes the Interaction menu + + Parameters: + Nothing + + Returns: + Nothing + + Example: + call AGM_Interaction_fnc_hideMenu; +*/ +closeDialog 0; +(findDisplay 1713999) closeDisplay 1; +(uiNameSpace getVariable "AGM_Flow_Display") closeDisplay 0; +AGM_Interaction_MainButton = nil; +call AGM_Interaction_fnc_hideMouseHint; \ No newline at end of file diff --git a/addons/interaction/functions/fn_hideMouseHint.sqf b/addons/interaction/functions/fn_hideMouseHint.sqf new file mode 100644 index 0000000000..f8f9b75b35 --- /dev/null +++ b/addons/interaction/functions/fn_hideMouseHint.sqf @@ -0,0 +1,22 @@ +/* + Name: AGM_Interaction_fnc_hideMouseHint + + Author(s): + Garth de Wet (LH) + + Description: + Hides the interaction helper text with the mouse buttons at the bottom middle of the screen + + Parameters: + Nothing + + Returns: + Nothing + + Example: + call AGM_Interaction_fnc_hideMouseHint; +*/ +if (isNull (uiNamespace getVariable ["AGM_Helper_Display", objNull])) exitWith{}; + +("AGM_InteractionHelper" call BIS_fnc_rscLayer) cutText ["", "PLAIN"]; +showHUD true; \ No newline at end of file diff --git a/addons/interaction/functions/fn_initialiseInteraction.sqf b/addons/interaction/functions/fn_initialiseInteraction.sqf new file mode 100644 index 0000000000..556e3d0bd6 --- /dev/null +++ b/addons/interaction/functions/fn_initialiseInteraction.sqf @@ -0,0 +1,167 @@ +/* + Name: AGM_Interaction_fnc_initialiseInteraction + + Author: + commy2 + Garth de Wet (LH) + + Description: + Initialises the interaction click handlers. + + Parameters: + 0 : CODE - code to call when right clicking/center button + 1 : BOOLEAN - Submenu + 2 : BOOLEAN - Flow Menu + 3 : BOOLEAN - Self interaction + 4 : OBJECT - Target + + Returns: + Nothing + + Example: + [{"Default" call AGM_Interaction_fnc_openMenu;}, true, (profileNamespace getVariable ["AGM_Interaction_FlowMenu", false]), AGM_Interaction_Target] call AGM_Interaction_fnc_initialiseInteraction; +*/ +private ["_subMenu", "_selfMenu", "_target"]; +AGM_Interaction_MainButton = _this select 0; +_subMenu = _this select 1; +_selfMenu = _this select 3; +_target = _this select 4; + +_player = AGM_player; +_vehicle = vehicle _player; +//_object = [AGM_Interaction_Target, _player] select (AGM_Interaction_MenuType % 2 == 1); + +if !([_target, 5] call AGM_Interaction_fnc_isInRange) exitWith {}; + +AGM_Interaction_Shortcuts = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; + +// Flow menu +if (_this select 2) then { + ("AGM_FlowMenu" call BIS_fnc_rscLayer) cutRsc ["AGM_FlowMenu", "PLAIN",0.5, false]; + AGM_Interaction_SelectedButton = 0; + (findDisplay 1713999) closeDisplay 1; + if (_player getVariable ["AGM_AcceptAction", -1] == -1) then { + [{if(isNil {AGM_Interaction_MainButton} || {!(profileNamespace getVariable ['AGM_Interaction_FlowMenu', false])})exitWith{false};(-(_this select 0) / 1.2) call AGM_Interaction_fnc_MoveDown;true}] call AGM_Core_fnc_addScrollWheelEventHandler; + + _player setVariable ["AGM_AcceptAction", [_player, "DefaultAction", {(!isNil {AGM_Interaction_MainButton}) && {(profileNamespace getVariable ['AGM_Interaction_FlowMenu', false])}}, {_action = AGM_Interaction_Buttons select AGM_Interaction_SelectedButton;_target = AGM_Interaction_Target;_player = AGM_player;_vehicle = vehicle _player;if ([_target, _player] call (_action select 2)) then {call AGM_Interaction_fnc_hideMenu;if(count _action == 12) then{(_action select 11) call (_action select 1);}else{[_target, _player] call (_action select 1);};};}] call AGM_core_fnc_addActionEventHandler]; + _player setVariable ["AGM_AcceptAction", [_player, "menuBack", {(!isNil {AGM_Interaction_MainButton}) && {(profileNamespace getVariable ['AGM_Interaction_FlowMenu', false])}}, {call AGM_Interaction_MainButton;}] call AGM_core_fnc_addActionEventHandler]; + }; + 0 call AGM_Interaction_fnc_moveDown; + [localize "STR_AGM_Interaction_MakeSelection", if (_subMenu)then{localize "STR_AGM_Interaction_Back"}else{""}, localize "STR_AGM_Interaction_ScrollHint"] call AGM_Interaction_fnc_showMouseHint; + ((uiNamespace getVariable "AGM_Flow_Display") displayCtrl (1210)) ctrlShow _subMenu; +}else{ // Rose + if (!isNull(uiNamespace getVariable "AGM_Flow_Display")) then { + (uiNameSpace getVariable "AGM_Flow_Display") closeDisplay 0; + call AGM_Interaction_fnc_hideMouseHint; + }; + if (!_subMenu || {isNull (findDisplay 1713999)}) then { + (findDisplay 1713999) closeDisplay 1; + + (findDisplay 46) createDisplay "AGM_Interaction_Dialog"; + // Add eventhandlers + (findDisplay 1713999) displayAddEventHandler ["KeyDown", "_this call AGM_Core_onKeyDown"]; + (findDisplay 1713999) displayAddEventHandler ["KeyUp", "_this call AGM_Core_onKeyUp"]; + + (findDisplay 1713999) displayAddEventHandler ["KeyDown", "_this call AGM_Interaction_fnc_menuKeyInput"]; + }; + disableSerialization; + _dlgInteractionDialog = uiNamespace getVariable "AGM_Interaction_Dialog"; + _ctrlInteractionDialog = _dlgInteractionDialog displayCtrl 3; + if (profileNamespace getVariable ["AGM_Interaction_AutoCenterCursor", true]) then {setMousePosition [0.5, 0.5]}; + if !(_subMenu) then { + _ctrlInteractionDialog ctrlSetText ([_target] call AGM_Core_fnc_getName); + } else { + _ctrlInteractionDialog ctrlSetText localize "STR_AGM_Interaction_Back"; + }; + + _buttons = AGM_Interaction_Buttons; + _count = count _buttons; + + for "_i" from 0 to 9 do { + _ctrlInteractionDialog = _dlgInteractionDialog displayCtrl (10 + _i); + _ctrlInteractionDialog ctrlShow true; + + _ctrlInteractionDialogIcon = _dlgInteractionDialog displayCtrl (20 + _i); + _ctrlInteractionDialogShortcut = _dlgInteractionDialog displayCtrl (30 + _i); + //_ctrlInteractionDialogBackground = _dlgInteractionDialog displayCtrl (40 + _i); + if (_i < _count) then { + _action = _buttons select _i; + _ctrlInteractionDialog ctrlSetText (_action select 0); + _ctrlInteractionDialog ctrlEnable ([_target, _player] call (_action select 2)); + _ctrlInteractionDialog ctrlSetTooltip (_action select 6); + + _ctrlInteractionDialogIcon ctrlSetText (_action select 5); + _ctrlInteractionDialogShortcut ctrlSetText (_action select 10); + //_ctrlInteractionDialogBackground ctrlShow true; + + AGM_Interaction_Shortcuts set [_i, [_action select 10] call AGM_Core_fnc_letterToCode]; + } else { + _ctrlInteractionDialog ctrlSetText ""; + _ctrlInteractionDialog ctrlEnable false; + _ctrlInteractionDialog ctrlSetTooltip ""; + + _ctrlInteractionDialogIcon ctrlSetText ""; + _ctrlInteractionDialogShortcut ctrlSetText ""; + //_ctrlInteractionDialogBackground ctrlShow false; + }; + }; + + // Update Buttons + terminate (missionNamespace getVariable ["AGM_Interaction_updateMenuHandle", scriptNull]); + + AGM_Interaction_updateMenuHandle = 0 spawn { + disableSerialization; + _dlgMenu = uiNamespace getVariable ["AGM_Interaction_Dialog", displayNull]; + _ctrlTooltip = _dlgMenu displayCtrl 40; + + _player = AGM_player; + _vehicle = vehicle _player; + _target = [AGM_Interaction_Target, _player] select (AGM_Interaction_MenuType % 2 == 1); + + waitUntil { + if !([_target, 5] call AGM_Interaction_fnc_isInRange) exitWith { + (findDisplay 1713999) closeDisplay 1 + }; + + AGM_Interaction_Tooltips = [[], [], [], [], [], [], [], [], [], []]; + { + _ctrlText = _dlgMenu displayCtrl (10 + _forEachIndex); + _ctrlIcon = _dlgMenu displayCtrl (20 + _forEachIndex); + + _condition = _x select 2; + _conditionShow = _x select 7; + _distance = _x select 9; + + AGM_Interaction_CurrentTooltip = []; + + _enable = (_distance == 0 || {[_target, _distance] call AGM_Interaction_fnc_isInRange}) && {[_target, _player] call _condition} && {[_target, _player] call _conditionShow}; + if (isNil "_enable") then {_enable = false}; + + AGM_Interaction_Tooltips set [_forEachIndex, AGM_Interaction_CurrentTooltip]; + + // apply conditional tooltips + /*if (_forEachIndex == call AGM_Interaction_fnc_getSelectedButton) then { + _tooltip = _x select 6; + + _showTooltip = _tooltip != ""; + + _tooltip = text _tooltip; + + { + _showTooltip = true; + _tooltip = composeText [_tooltip, lineBreak, _x]; + } forEach (AGM_Interaction_Tooltips select _forEachIndex); + + _ctrlTooltip ctrlSetStructuredText _tooltip; + _ctrlTooltip ctrlShow _showTooltip; + };*/ + + _ctrlText ctrlEnable _enable; + _ctrlIcon ctrlEnable _enable; + } forEach AGM_Interaction_Buttons; + + sleep 0.5; + isNull (findDisplay 1713999) + }; + }; +}; diff --git a/addons/interaction/functions/fn_isInRange.sqf b/addons/interaction/functions/fn_isInRange.sqf new file mode 100644 index 0000000000..bb82f7af95 --- /dev/null +++ b/addons/interaction/functions/fn_isInRange.sqf @@ -0,0 +1,49 @@ +/* + * Author: commy2 + * + * Check if the vehicle is in range of the player. + * + * Argument: + * 0: Vehicke (Object) + * 1: Distance in meters (Number) + * + * Return value: + * (Bool) + */ + +private ["_vehicle", "_distance", "_player"]; + +_vehicle = _this select 0; +_distance = _this select 1; + +_player = AGM_player; + +if (_vehicle isKindOf "Man") exitWith {_player distance _vehicle < _distance}; + +private ["_position0", "_position1"];//, "_direction"]; + +_position0 = getPosASL _player; +_position1 = getPosASL _vehicle; + +/* +_direction = _position1 vectorDiff _position0; +_direction = _direction vectorMultiply (_distance / (vectorMagnitude _direction)); + +_position0 = eyePos _player; +_position1 = _position0 vectorAdd _direction; + +_vehicle in lineIntersectsWith [_position0, _position1] || {_player distance _vehicle < _distance} +*/ + +_position0 = ATLToASL positionCameraToWorld [0, 0, 0]; +_position0 set [2, (_position0 select 2) - (getTerrainHeightASL _position0 min 0)]; + +_position1 = ATLToASL positionCameraToWorld [0, 0, _distance]; +_position1 set [2, (_position1 select 2) - (getTerrainHeightASL _position1 min 0)]; + +if (_vehicle in lineIntersectsWith [_position0, _position1] || {_player distance _vehicle < _distance}) then { + true +} else { + ["Not in Range"] call AGM_Interaction_fnc_addToTooltip; + false +} diff --git a/addons/interaction/functions/fn_joinTeam.sqf b/addons/interaction/functions/fn_joinTeam.sqf new file mode 100644 index 0000000000..c6db297c49 --- /dev/null +++ b/addons/interaction/functions/fn_joinTeam.sqf @@ -0,0 +1,20 @@ +// by commy2 + +private ["_unit", "_team", "_message"]; + +_unit = _this select 0; +_team = _this select 1; + +_unit setVariable ["AGM_assignedFireTeam", _team, true]; +[_unit, format ["{_this assignTeam '%1'}", _team]] call AGM_Core_fnc_execRemoteFnc; + +if (_unit == AGM_player) then { + _message = if (_team == "MAIN") then { + localize "STR_AGM_Interaction_LeftTeam"; + } else { + _team = localize format ["STR_AGM_Interaction_Team%1", _team]; + format [localize "STR_AGM_Interaction_JoinedTeam", _team]; + }; + + [_message] call AGM_Core_fnc_displayTextStructured; +}; diff --git a/addons/interaction/functions/fn_lockDoor.sqf b/addons/interaction/functions/fn_lockDoor.sqf new file mode 100644 index 0000000000..edc317bfac --- /dev/null +++ b/addons/interaction/functions/fn_lockDoor.sqf @@ -0,0 +1,27 @@ +// by commy2 + +private ["_mode", "_info", "_house", "_door", "_id", "_phase"]; + +_mode = _this select 0; //lock: true, unlock: false + +_info = [2] call AGM_Interaction_fnc_getDoor; + +_house = _info select 0; +_door = _info select 1; +_id = _info select 2; + +if (isNull _house) exitWith {}; + +/* +_phase = [1, 0] select _mode; + +_house animate [format ["%1_%2_rot", _door, _id], _phase]; +_house animate [format ["%1_Handle_%2_rot_1", _door, _id], _phase]; +_house animate [format ["%1_Handle_%2_rot_2", _door, _id], _phase]; +*/ + +_house setVariable [format ["BIS_Disabled_%1_%2", _door, _id], [0, 1] select _mode]; + +playSound "AGM_Sound_Click"; + +[localize (["STR_AGM_Interaction_UnlockedDoor", "STR_AGM_Interaction_LockedDoor"] select _mode)] call AGM_Core_fnc_displayTextStructured; diff --git a/addons/interaction/functions/fn_menuKeyInput.sqf b/addons/interaction/functions/fn_menuKeyInput.sqf new file mode 100644 index 0000000000..786add7670 --- /dev/null +++ b/addons/interaction/functions/fn_menuKeyInput.sqf @@ -0,0 +1,16 @@ +// by commy2 + +private "_key"; + +_key = _this select 1; + +if (_key in [28, 57, 156, 200, 208, 203, 205, 201, 209]) exitWith {true}; + +_index = AGM_Interaction_Shortcuts find _key; + +if (_index != -1 && {ctrlEnabled (findDisplay 1713999 displayCtrl (_index + 10))}) exitWith { + _index call AGM_Interaction_fnc_onClick; + true +}; + +false diff --git a/addons/interaction/functions/fn_moduleInteraction.sqf b/addons/interaction/functions/fn_moduleInteraction.sqf new file mode 100644 index 0000000000..60f15e1215 --- /dev/null +++ b/addons/interaction/functions/fn_moduleInteraction.sqf @@ -0,0 +1,20 @@ +/* + * Author: bux578 + * + * Initializes the Interaction module. + * + * Arguments: + * Whatever the module provides. (I dunno.) + * + * Return Value: + * None + */ + +_logic = _this select 0; +_activated = _this select 2; + +if !(_activated) exitWith {}; + +[_logic, "AGM_Interaction_EnableTeamManagement", "EnableTeamManagement"] call AGM_Core_fnc_readBooleanParameterFromModule; + +diag_log text "[AGM]: Interaction Module Initialized."; diff --git a/addons/interaction/functions/fn_onButtonDown.sqf b/addons/interaction/functions/fn_onButtonDown.sqf new file mode 100644 index 0000000000..91a20d9fc7 --- /dev/null +++ b/addons/interaction/functions/fn_onButtonDown.sqf @@ -0,0 +1,14 @@ +// by commy2 + +if (dialog) exitWith { + closeDialog 0; +}; + +if (isNull (findDisplay 1713999)) then { + if (AGM_player == vehicle AGM_player) then {"" call AGM_Interaction_fnc_openMenu} else {[AGM_player, vehicle AGM_player] call AGM_Interaction_fnc_openMenuSelectUI}; + setMousePosition [0.5, 0.5]; +} else { + (findDisplay 1713999) closeDisplay 1; +}; + +[_player, "interactionMenuOpened", [_player, AGM_Interaction_Target, 0]] call AGM_Core_fnc_callCustomEventHandlers; diff --git a/addons/interaction/functions/fn_onButtonDownSelf.sqf b/addons/interaction/functions/fn_onButtonDownSelf.sqf new file mode 100644 index 0000000000..90aa4b4aca --- /dev/null +++ b/addons/interaction/functions/fn_onButtonDownSelf.sqf @@ -0,0 +1,14 @@ +// by commy2 + +if (dialog) exitWith { + closeDialog 0; +}; + +if (isNull (findDisplay 1713999)) then { + "" call AGM_Interaction_fnc_openMenuSelf; + setMousePosition [0.5, 0.5]; +} else { + (findDisplay 1713999) closeDisplay 1; +}; + +[_player, "interactionMenuOpened", [_player, AGM_Interaction_Target, 1]] call AGM_Core_fnc_callCustomEventHandlers; diff --git a/addons/interaction/functions/fn_onButtonUp.sqf b/addons/interaction/functions/fn_onButtonUp.sqf new file mode 100644 index 0000000000..0466eee0dc --- /dev/null +++ b/addons/interaction/functions/fn_onButtonUp.sqf @@ -0,0 +1,44 @@ +// by commy2 + +private ["_player", "_vehicle", "_target", "_count", "_index", "_action", "_statement", "_condition", "_conditionShow", "_exceptions", "_distance"]; + +_player = AGM_player; +_vehicle = vehicle _player; +_target = [AGM_Interaction_Target, _player] select (AGM_Interaction_MenuType % 2 == 1); + +_count = count AGM_Interaction_Buttons; +_index = call AGM_Interaction_fnc_getSelectedButton; + +_action = if (_index != -1 && {_index < _count}) then { + AGM_Interaction_Buttons select _index +} else { + ["", {}, {false}, 0, [], "", "", {false}, [], 0] +}; + +(findDisplay 1713999) closeDisplay 1; +closeDialog 0; + + + + + + + + + + + + + + + + +_statement = _action select 1; +_condition = _action select 2; +_conditionShow = _action select 7; +_exceptions = _action select 8;// +_distance = _action select 9; + +if ((_distance == 0 || {[AGM_Interaction_Target, _distance] call AGM_Interaction_fnc_isInRange}) && {[_target, _player] call _condition} && {[_target, _player] call _conditionShow}) then { + [_target, _player] call _statement; +}; diff --git a/addons/interaction/functions/fn_onClick.sqf b/addons/interaction/functions/fn_onClick.sqf new file mode 100644 index 0000000000..6fb9a353fc --- /dev/null +++ b/addons/interaction/functions/fn_onClick.sqf @@ -0,0 +1,44 @@ +// by commy2 + +private ["_player", "_vehicle", "_target", "_count", "_index", "_action", "_subMenu", "_statement", "_condition", "_conditionShow", "_exceptions", "_distance"]; + +_player = AGM_player; +_vehicle = vehicle _player; +_target = [AGM_Interaction_Target, _player] select (AGM_Interaction_MenuType % 2 == 1); + +_count = count AGM_Interaction_Buttons; +_index = _this; //call AGM_Interaction_fnc_getSelectedButton; + +_action = if (_index != -1 && {_index < _count}) then { + AGM_Interaction_Buttons select _index +} else { + ["", {}, {false}, 0, [], "", "", {false}, [], 0] +}; + +_subMenu = _action select 4; + +// back +if (_index == -1) exitWith { + call AGM_Interaction_MainButton; +}; + +if (count _subMenu < 2) then { + (findDisplay 1713999) closeDisplay 1; + closeDialog 0; + + _statement = _action select 1; + _condition = _action select 2; + _conditionShow = _action select 7; + _exceptions = _action select 8;// + _distance = _action select 9; + + if ((_distance == 0 || {[AGM_Interaction_Target, _distance] call AGM_Interaction_fnc_isInRange}) && {[_target, _player] call _condition} && {[_target, _player] call _conditionShow}) then { + [_target, _player] call _statement; + }; +} else { + if (_subMenu select 1 < 1) then { + [_subMenu select 0] call AGM_Interaction_fnc_openSubMenu; + } else { + [_subMenu select 0] call AGM_Interaction_fnc_openSubMenuSelf; + }; +}; diff --git a/addons/interaction/functions/fn_onSelectMenuDblClick.sqf b/addons/interaction/functions/fn_onSelectMenuDblClick.sqf new file mode 100644 index 0000000000..db7f326bd2 --- /dev/null +++ b/addons/interaction/functions/fn_onSelectMenuDblClick.sqf @@ -0,0 +1,3 @@ +// by CorruptedHeart, commy2 + +call compile (lbData [8866, lbCurSel 8866]) call AGM_Interaction_SelectAccept; diff --git a/addons/interaction/functions/fn_openDoor.sqf b/addons/interaction/functions/fn_openDoor.sqf new file mode 100644 index 0000000000..98f21fe690 --- /dev/null +++ b/addons/interaction/functions/fn_openDoor.sqf @@ -0,0 +1,56 @@ +// by commy2 + +private ["_info", "_house", "_door", "_animations", "_lockedVariable"]; + +_info = [2] call AGM_Interaction_fnc_getDoor; + +_house = _info select 0; +_door = _info select 1; + +if (isNull _house) exitWith {}; + +_animations = [_house, _door] call AGM_Interaction_fnc_getDoorAnimations; + +_lockedVariable = _animations select 1; +_animations = _animations select 0; + +if (count _animations == 0) exitWith {}; + +if (_house animationPhase (_animations select 0) <= 0 && {_house getVariable [_lockedVariable select 0, 0] == 1}) exitWith { + _lockedVariable set [0, _house]; + _lockedVariable spawn compile preprocessFileLineNumbers "\A3\Structures_F\scripts\LockedDoor_open.sqf"; +}; + +AGM_Interaction_isOpeningDoor = true; +playSound "AGM_Sound_Click"; + +[_house, _animations] spawn { + _house = _this select 0; + _animations = _this select 1; + + _phase = _house animationPhase (_animations select 0); + _position = getPosASL AGM_player; + + _time = time + 0.2; + _usedMouseWheel = false; + waitUntil { + if (inputAction "PrevAction" > 0 || {inputAction "NextAction" > 0}) then { + _usedMouseWheel = true; + }; + + _phase = _phase + (inputAction "PrevAction" / 12) min 1; + _phase = _phase - (inputAction "NextAction" / 12) max 0; + + {_house animate [_x, _phase]} forEach _animations; + + !AGM_Interaction_isOpeningDoor || {getPosASL AGM_player distance _position > 1} + }; + + if (!_usedMouseWheel && {time < _time}) then { + _phase = [0, 1] select (_house animationPhase (_animations select 0) < 0.5); + + {_house animate [_x, _phase]} forEach _animations; + }; + + AGM_Interaction_isOpeningDoor = false; +}; diff --git a/addons/interaction/functions/fn_openMenu.sqf b/addons/interaction/functions/fn_openMenu.sqf new file mode 100644 index 0000000000..02fe1ba1ab --- /dev/null +++ b/addons/interaction/functions/fn_openMenu.sqf @@ -0,0 +1,6 @@ +// by commy2 + +private "_target"; +_target = [cursorTarget, AGM_Interaction_Target] select (_this == "Default"); + +[0, _target, ""] call AGM_Interaction_fnc_showMenu; diff --git a/addons/interaction/functions/fn_openMenuSelectUI.sqf b/addons/interaction/functions/fn_openMenuSelectUI.sqf new file mode 100644 index 0000000000..dbac9e2f75 --- /dev/null +++ b/addons/interaction/functions/fn_openMenuSelectUI.sqf @@ -0,0 +1,43 @@ +// by commy2 + +private ["_unit", "_vehicle", "_cargo"]; + +_unit = _this select 0; +_vehicle = _this select 1; + +// allow interaction with all cargo slots and all ffv slots +_cargo = [_vehicle, ["cargo", "ffv"], true] call AGM_Core_fnc_getVehicleCrew; + +// you can only interact if you are in cargo or ffv yourself. exit otherwise +if !(_unit in _cargo) exitWith {}; + +AGM_InteractionMenu_Crew = _cargo; + +// prepare: add header and "OK" button to select menu +private "_actions"; +_actions = [localize "STR_AGM_Interaction_InteractionMenu", localize "STR_AGM_Interaction_Interact"] call AGM_Interaction_fnc_prepareSelectMenu; + +// prepare: add all cargo units as options to select menu +{ + if (_x != _unit) then { + _actions = [ + _actions, + [_x] call AGM_Core_fnc_getName, + "\AGM_Interaction\UI\dot_ca.paa", + _forEachIndex + ] call AGM_Interaction_fnc_AddSelectableItem; + }; +} forEach _cargo; + +// open select menu +[ + _actions, + { + call AGM_Interaction_fnc_hideMenu; + [0, AGM_InteractionMenu_Crew select _this, ""] spawn AGM_Interaction_fnc_showMenu; + AGM_InteractionMenu_Crew = nil; + }, + { + call AGM_Interaction_fnc_hideMenu; + } +] call AGM_Interaction_fnc_openSelectMenu; diff --git a/addons/interaction/functions/fn_openMenuSelf.sqf b/addons/interaction/functions/fn_openMenuSelf.sqf new file mode 100644 index 0000000000..e6056eb1ef --- /dev/null +++ b/addons/interaction/functions/fn_openMenuSelf.sqf @@ -0,0 +1,3 @@ +// by commy2 + +[1, AGM_player, ""] call AGM_Interaction_fnc_showMenu; diff --git a/addons/interaction/functions/fn_openSelectMenu.sqf b/addons/interaction/functions/fn_openSelectMenu.sqf new file mode 100644 index 0000000000..069d1dbc8a --- /dev/null +++ b/addons/interaction/functions/fn_openSelectMenu.sqf @@ -0,0 +1,43 @@ +/* + Name: AGM_Interaction_fnc_openSelectMenu + + Author: Garth de Wet (LH) + + Description: + Opens the select menu UI and sets up the UI + + Parameters: + 0: ARRAY - items + ARRAY + 0 = Text + 1 = statement to execute + 2 = condition before execute + 3 = showDisabled + 4 = priority + 5 = icon + 6 = extra variables. Passed to the code. + 1: Code - select action + 2: Code - Cancel Action + Returns: + Nothing + + Example: +*/ +if (!(profileNamespace getVariable ["AGM_Interaction_FlowMenu", false])) then { + AGM_Interaction_SelectAccept = _this select 1; + AGM_Interaction_SelectCancel = _this select 2; + buttonSetAction [8855, "call AGM_Interaction_SelectCancel;"]; // cancel + buttonSetAction [8860, "(call compile (lbData [8866, lbCurSel 8866])) call AGM_Interaction_SelectAccept;"]; // accept + lbSetCurSel [8866, 0]; +}else{ + _customActions = _this select 0; + _count = count _customActions; + if (_count == 0) exitWith {}; + _customActions call AGM_Interaction_fnc_sortOptionsByPriority; + for "_i" from 0 to _count -1 do { + _action = _customActions select _i; + _action set [1, (_this select 1)]; + }; + AGM_Interaction_Buttons = _customActions; + [(_this select 2), true, true, false, AGM_player] call AGM_Interaction_fnc_initialiseInteraction; +}; diff --git a/addons/interaction/functions/fn_openSubMenu.sqf b/addons/interaction/functions/fn_openSubMenu.sqf new file mode 100644 index 0000000000..7898d9e181 --- /dev/null +++ b/addons/interaction/functions/fn_openSubMenu.sqf @@ -0,0 +1,3 @@ +// by commy2 + +[2, AGM_Interaction_Target, _this select 0] call AGM_Interaction_fnc_showMenu; diff --git a/addons/interaction/functions/fn_openSubMenuSelf.sqf b/addons/interaction/functions/fn_openSubMenuSelf.sqf new file mode 100644 index 0000000000..966684c84f --- /dev/null +++ b/addons/interaction/functions/fn_openSubMenuSelf.sqf @@ -0,0 +1,3 @@ +// by commy2 + +[3, AGM_player, _this select 0] call AGM_Interaction_fnc_showMenu; diff --git a/addons/interaction/functions/fn_prepareSelectMenu.sqf b/addons/interaction/functions/fn_prepareSelectMenu.sqf new file mode 100644 index 0000000000..bb84eaca12 --- /dev/null +++ b/addons/interaction/functions/fn_prepareSelectMenu.sqf @@ -0,0 +1,35 @@ +/* + Name: AGM_Interaction_fnc_prepareSelectMenu + + Author: Garth de Wet (LH) + + Description: + Prepares the select menu for use. + + Parameters: + 0: TEXT - Header text + 1: TEXT - Approve button text + + Returns: + ARRAY/NUMBER - container object for use with AddSelectableItem. + + Example: + ["Select Explosive", "Place"] call AGM_Interaction_fnc_prepareSelectMenu; +*/ +private ["_buttonAction", "_header", "_buttonText", "_cancelButton"]; +closeDialog 0; +if (!(profileNamespace getVariable ["AGM_Interaction_FlowMenu", false])) exitWith { + _header = _this select 0; + _buttonText = _this select 1; + if (isNil "_buttonText" or {_buttonText == ""}) then { + _buttonText = localize "STR_AGM_Interaction_MakeSelection"; + }; + createDialog "RscAGM_SelectAnItem"; + ctrlSetText [8860, _buttonText]; + ctrlSetText [8870, _header]; + + lbClear 8866; + + 8866 +}; +[] diff --git a/addons/interaction/functions/fn_push.sqf b/addons/interaction/functions/fn_push.sqf new file mode 100644 index 0000000000..d4ce290d1e --- /dev/null +++ b/addons/interaction/functions/fn_push.sqf @@ -0,0 +1,21 @@ +/* + * Author: KoffeinFlummi + * + * Pushes a boat away from the player. + * + * Arguments: + * 0: Boat (object) + * 1: Velocity (vectorlike array) + * + * Return Value: + * None + */ + +_boat = _this select 0; +_velocity = _this select 1; + +if !(local _boat) exitWith { + [_this, "AGM_Interaction_fnc_push", _boat] call AGM_Core_fnc_execRemoteFnc; +}; + +_boat setVelocity _velocity; diff --git a/addons/interaction/functions/fn_removeInteraction.sqf b/addons/interaction/functions/fn_removeInteraction.sqf new file mode 100644 index 0000000000..b633ce0bc8 --- /dev/null +++ b/addons/interaction/functions/fn_removeInteraction.sqf @@ -0,0 +1,35 @@ +/* + * Author: commy2 + * + * Remove an AGM action from an object. Note: This function is global. + * + * Argument: + * 0: Object (Object) + * 1: ID of the action (Number) + * + * Return value: + * None. + */ + +private ["_object", "_id", "_actionsVar", "_currentID", "_actionIDs", "_actions"]; + +_object = _this select 0; +_id = _this select 1; + +_actionsVar = _object getVariable ["AGM_Interactions", [-1, [], []]]; + +_currentID = _actionsVar select 0; +_actionIDs = _actionsVar select 1; +_actions = _actionsVar select 2; + +_id = _actionIDs find _id; + +if (_id == -1) exitWith {}; + +_actionIDs set [_id, -1]; +_actionIDs = _actionIDs - [-1]; + +_actions set [_id, []]; +_actions = _actions - [[]]; + +_object setVariable ["AGM_Interactions", [_currentID, _actionIDs, _actions], true]; diff --git a/addons/interaction/functions/fn_removeInteractionSelf.sqf b/addons/interaction/functions/fn_removeInteractionSelf.sqf new file mode 100644 index 0000000000..140c6f0502 --- /dev/null +++ b/addons/interaction/functions/fn_removeInteractionSelf.sqf @@ -0,0 +1,35 @@ +/* + * Author: commy2 + * + * Remove an AGM self action from the player. + * + * Argument: + * 0: ID of the action (Number) + * + * Return value: + * None. + */ + + +private ["_id", "_actionsVar", "_currentID", "_actionIDs", "_actions"]; + + +_id = _this select 0; + +_actionsVar = AGM_player getVariable ["AGM_InteractionsSelf", [-1, [], []]]; + +_currentID = _actionsVar select 0; +_actionIDs = _actionsVar select 1; +_actions = _actionsVar select 2; + +_id = _actionIDs find _id; + +if (_id == -1) exitWith {}; + +_actionIDs set [_id, -1]; +_actionIDs = _actionIDs - [-1]; + +_actions set [_id, []]; +_actions = _actions - [[]]; + +AGM_player setVariable ["AGM_InteractionsSelf", [_currentID, _actionIDs, _actions], false]; diff --git a/addons/interaction/functions/fn_removeTag.sqf b/addons/interaction/functions/fn_removeTag.sqf new file mode 100644 index 0000000000..9d37367f1c --- /dev/null +++ b/addons/interaction/functions/fn_removeTag.sqf @@ -0,0 +1,19 @@ +// by commy2 + +0 spawn { + waitUntil {player getVariable ["AGM_Name", ""] != ""}; + + _name = player getVariable ["AGM_Name", ""]; + _name = toArray _name; + + _index = _name find (toArray "]" select 0); + + if (_index != -1) then { + for "_index" from 0 to _index do { + _name set [_index, -1]; + }; + _name = _name - [-1]; + _name = toString _name; + player setVariable ["AGM_Name", _name, true]; + }; +}; diff --git a/addons/interaction/functions/fn_sendAway.sqf b/addons/interaction/functions/fn_sendAway.sqf new file mode 100644 index 0000000000..a4434bbd12 --- /dev/null +++ b/addons/interaction/functions/fn_sendAway.sqf @@ -0,0 +1,35 @@ +/* + * Author: KoffeinFlummi + * + * Sends a civilian crowd away (chance of failure). + * + * Arguments: + * 0: Unit to be sent away (Object) + * + * Return value: + * none +*/ + +#define DISTANCE 50 +#define RADIUS 10 + +private ["_unit", "_chance", "_x"]; + +_unit = _this select 0; + +AGM_player playActionNow "GestureGo"; + +if (count weapons AGM_player > 0) then { + _chance = 0.8; +} else { + _chance = 0.5; +}; + +{ + if (count (weapons _unit) == 0 and random 1 < _chance) then { + [-2, { + (_this select 0) setUnitPos "AUTO"; + (_this select 0) doMove [(getPos (_this select 0) select 0) + DISTANCE * (eyeDirection (_this select 1) select 0), (getPos (_this select 0) select 1) + DISTANCE * (eyeDirection (_this select 1) select 1), 0]; + }, [_x, AGM_player]] call CBA_fnc_globalExecute; + }; +} foreach (_unit nearEntities ["Civilian", RADIUS]); diff --git a/addons/interaction/functions/fn_setCaptivityStatus.sqf b/addons/interaction/functions/fn_setCaptivityStatus.sqf new file mode 100644 index 0000000000..1055780cac --- /dev/null +++ b/addons/interaction/functions/fn_setCaptivityStatus.sqf @@ -0,0 +1,3 @@ +// by commy2 + +_this call AGM_Core_fnc_setCaptivityStatus; diff --git a/addons/interaction/functions/fn_showMenu.sqf b/addons/interaction/functions/fn_showMenu.sqf new file mode 100644 index 0000000000..291ab27331 --- /dev/null +++ b/addons/interaction/functions/fn_showMenu.sqf @@ -0,0 +1,118 @@ +/* + Name: AGM_Interaction_fnc_showMenu + + Author: + commy2 + Garth de Wet (LH) + aeroson + + Description: + + Parameters: + 0: NUMBER - Menu type (0 - interaction, 1 - self-interaction, 2 - sub-interaction, 3 - sub-self-interaction) + 1: OBJECT - Target object + 2: STRING - Sub-Menu ClassName + + Returns: + Nothing + + Example: + [0, AGM_Interaction_Target] call AGM_Interaction_fnc_showMenu; + [1, player] call AGM_Interaction_fnc_showMenu; + [2, AGM_Interaction_Target, "AGM_Explosives"] call AGM_Interaction_fnc_showMenu; + [3, player, "AGM_Explosives"] call AGM_Interaction_fnc_showMenu; +*/ +private ["_player", "_vehicle", "_mainButtonAction", "_object", "_index", "_actions", "_result", "_menuType"]; +#define DEFAULT_ICON "\AGM_Interaction\UI\dot_ca.paa" +#define DEFAULT_DISTANCE 4 // seems to be 4 +_player = AGM_player; +_vehicle = vehicle _player; + +AGM_Interaction_MenuType = _this select 0; // 0 Interaction, 1 Self Interaction + +_mainButtonAction = [ + {call AGM_Interaction_fnc_hideMenu}, + {call AGM_Interaction_fnc_hideMenu}, + {"Default" call AGM_Interaction_fnc_openMenu}, + {"Default" call AGM_Interaction_fnc_openMenuSelf} +] select AGM_Interaction_MenuType; + +_menuType = AGM_Interaction_MenuType % 2; +uiNamespace setVariable ["AGM_Interaction_CursorPosition", [controlNull, 0.5, 0.5, -1]]; + +AGM_Interaction_Target = _this select 1; +_object = AGM_Interaction_Target; + +if (_menuType == 0 && {(isNull (_object) || {!([_object, 4] call AGM_Interaction_fnc_isInRange)})}) exitWith {};//call ([AGM_Interaction_fnc_onButtonDown, AGM_Interaction_fnc_onButtonDownSelf] select _menuType)}; +if !([_player, _object] call AGM_Core_fnc_canInteractWith) exitWith {}; + +// add actions or self actions of AGM_Interaction_Target +_parents = [configFile >> "CfgVehicles" >> typeOf _object, true] call BIS_fnc_returnParents; +_result = [_object, _parents, [], [], missionConfigFile >> "CfgVehicles", true, ["AGM_Actions", "AGM_SelfActions"] select _menuType, _this select 2] call AGM_Interaction_fnc_GetActions; +_actions = ([_object, _parents, _result select 0, _result select 1,configFile >> "CfgVehicles", false, ["AGM_Actions", "AGM_SelfActions"] select _menuType, _this select 2] call AGM_Interaction_fnc_GetActions) select 0; + +// add self actions of vehicle _player +if (_menuType == 1 && {_player != _vehicle}) then { + _parents = [configFile >> "CfgVehicles" >> typeOf _vehicle, true] call BIS_fnc_returnParents; + _result = [_vehicle, _parents, [], [], missionConfigFile >> "CfgVehicles", true, ["AGM_Actions", "AGM_SelfActions"] select _menuType, _this select 2] call AGM_Interaction_fnc_GetActions; + _actions = _actions + (([_vehicle, _parents, _result select 0, _result select 1,configFile >> "CfgVehicles", false, ["AGM_Actions", "AGM_SelfActions"] select _menuType, _this select 2] call AGM_Interaction_fnc_GetActions) select 0); +}; + +// custom defined actions, stored in variable instead of cfg like above +if (AGM_Interaction_MenuType < 2) then { + + private ["_customActions", "_customAction", "_displayName", "_distance","_condition","_statement","_showDisabled", "_priority"]; + + // add interactions or self interactions of AGM_Interaction_Target + _customActions = (_object getVariable [["AGM_Interactions", "AGM_InteractionsSelf"] select _menuType, [-1, [], []]]) select 2; + + // add self interactions of vehicle _player + if (_menuType == 1 && {_player != _vehicle}) then { + _customActions = _customActions + ((_vehicle getVariable [["AGM_Interactions", "AGM_InteractionsSelf"] select _menuType, [-1, [], []]]) select 2); + }; + + if(_menuType==0) then { + + private ["_distance"]; + + for "_index" from 0 to (count _customActions - 1) do { + + _customAction = _customActions select _index; + _displayName = _customAction select 0; + _distance = _customAction select 1; + _condition = _customAction select 2; + _statement = _customAction select 3; + _showDisabled = _customAction select 4; + _priority = _customAction select 5; + + if ((_showDisabled || {[_object, _player] call _condition}) && {[_object, _distance] call AGM_Interaction_fnc_isInRange || {_distance == 0}}) then { + _actions pushBack [_displayName, _statement, _condition, _priority, [], DEFAULT_ICON, "", {true}, [], _distance, ""]; + }; + }; + + } else { // self interactions do not have distance + + for "_index" from 0 to (count _customActions - 1) do { + + _customAction = _customActions select _index; + _displayName = _customAction select 0; + _condition = _customAction select 1; + _statement = _customAction select 2; + _showDisabled = _customAction select 3; + _priority = _customAction select 4; + + if (_showDisabled || {[_object, _player] call _condition}) then { + _actions pushBack [_displayName, _statement, _condition, _priority, [], DEFAULT_ICON, "", {true}, [], DEFAULT_DISTANCE, ""]; + }; + }; + + }; + + +}; + +if (count _actions == 0) exitWith {};//call ([AGM_Interaction_fnc_onButtonDown, AGM_Interaction_fnc_onButtonDownSelf] select _menuType)}; + +_actions call AGM_Interaction_fnc_sortOptionsByPriority; +AGM_Interaction_Buttons = _actions; +[_mainButtonAction, (_this select 2) != "", (profileNamespace getVariable ["AGM_Interaction_FlowMenu", false]), _menuType == 1, _object] call AGM_Interaction_fnc_initialiseInteraction; diff --git a/addons/interaction/functions/fn_showMouseHint.sqf b/addons/interaction/functions/fn_showMouseHint.sqf new file mode 100644 index 0000000000..a856e9d9c6 --- /dev/null +++ b/addons/interaction/functions/fn_showMouseHint.sqf @@ -0,0 +1,54 @@ +/* + Name: AGM_Interaction_fnc_showMouseHint + + Author(s): + Garth de Wet (LH) + + Description: + Shows the interaction helper text with the mouse buttons at the bottom middle of the screen + + Parameters: + 0: STRING - Left click text + 1: STRING - Right click text + 3: STRING - (Optional) Scroll text + + Returns: + Nothing + + Example: + ["Place Explosive", "Cancel"] call AGM_Interaction_fnc_showMouseHint; +*/ +#define GUI_GRID_W (0.025) +#define GUI_GRID_H (0.04) +private ["_leftClick", "_rightClick", "_scroll"]; +_leftClick = _this select 0; +_rightClick = _this select 1; +_scroll = ""; +if (count _this > 2) then { + _scroll = _this select 2; +}; + +("AGM_InteractionHelper" call BIS_fnc_rscLayer) cutRsc ["AGM_InteractionHelper", "PLAIN",0.5, false]; +disableSerialization; +_display = uiNamespace getVariable ["AGM_Helper_Display", objNull]; +if (isNull _display) exitWith{}; + +(_display displayCtrl 1000) ctrlSetText _leftClick; +(_display displayCtrl 1001) ctrlSetText _rightClick; + +(_display displayCtrl 1000) ctrlShow (_leftClick != ""); +(_display displayCtrl 1200) ctrlShow (_leftClick != ""); +(_display displayCtrl 1001) ctrlShow (_rightClick != ""); +(_display displayCtrl 1201) ctrlShow (_rightClick != ""); + +if (_scroll == "") exitWith { + (_display displayCtrl 1002) ctrlShow false; + (_display displayCtrl 1202) ctrlShow false; + + (_display displayCtrl 1001) ctrlSetPosition [21 * GUI_GRID_W, 18 * GUI_GRID_H, 8 * GUI_GRID_W, 1.5 * GUI_GRID_H]; + (_display displayCtrl 1201) ctrlSetPosition [20 * GUI_GRID_W, 18.5 * GUI_GRID_H, 1 * GUI_GRID_W, 1 * GUI_GRID_H]; + (_display displayCtrl 1001) ctrlCommit 0; + (_display displayCtrl 1201) ctrlCommit 0; +}; +(_display displayCtrl 1002) ctrlSetText _scroll; +showHUD false; \ No newline at end of file diff --git a/addons/interaction/functions/fn_sortOptionsByPriority.sqf b/addons/interaction/functions/fn_sortOptionsByPriority.sqf new file mode 100644 index 0000000000..dd94cadfe4 --- /dev/null +++ b/addons/interaction/functions/fn_sortOptionsByPriority.sqf @@ -0,0 +1,20 @@ +// by commy2 + +private ["_actions", "_count", "_index", "_actionN", "_actionM"]; + +_actions = _this; +_count = count _actions; +_index = 0; + +while {_index < _count - 1} do { + _actionN = + _actions select _index; + _actionM = + _actions select (_index + 1); + + if (_actionN select 3 < _actionM select 3) then { + _actions set [_index, _actionM]; + _actions set [_index + 1, _actionN]; + _index = 0; + } else { + _index = _index + 1; + }; +}; diff --git a/addons/interaction/functions/fn_tapShoulder.sqf b/addons/interaction/functions/fn_tapShoulder.sqf new file mode 100644 index 0000000000..8d6340143f --- /dev/null +++ b/addons/interaction/functions/fn_tapShoulder.sqf @@ -0,0 +1,20 @@ +// by commy2 + +private ["_unit", "_message"]; + +_tapper = _this select 0; +_target = _this select 1; + +if (_target != AGM_player) exitWith { + addCamShake [4, 0.5, 5]; + if !(local _target) then { + [[_tapper, _target], "AGM_Interaction_fnc_tapShoulder", _target] call AGM_Core_fnc_execRemoteFnc; + }; +}; + +addCamShake [4, 0.5, 5]; + +//_message = format ["%1 tapped you on your shoulder.", [_unit] call AGM_Core_fnc_getName]; +_message = localize "STR_AGM_Interaction_YouWereTapped"; + +[_message] call AGM_Core_fnc_displayTextStructured; diff --git a/addons/interaction/functions/fn_updateTooltipPosition.sqf b/addons/interaction/functions/fn_updateTooltipPosition.sqf new file mode 100644 index 0000000000..3df14635e0 --- /dev/null +++ b/addons/interaction/functions/fn_updateTooltipPosition.sqf @@ -0,0 +1,12 @@ +// by commy2 + +disableSerialization; +_ctrl = ctrlParent (_this select 0) displayCtrl 40; + +_ctrl ctrlSetPosition [ + (_this select 1) + 0.01 * safezoneW, + (_this select 2) + 0.01 * safezoneH, + 2.0 / 16 * safezoneW, + 0.3 / 9 * safezoneH +]; +_ctrl ctrlCommit 0; diff --git a/addons/interaction/rsc/button1.paa b/addons/interaction/rsc/button1.paa new file mode 100644 index 0000000000000000000000000000000000000000..51d3a373a18780b4eabfffe2000dc71982936aa0 GIT binary patch literal 24483 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 + + + + + Interaction Menu + Interaktionsmenü + Menú de interacción + Menu interakcji + Menu interakce + Menu d'interaction + Меню взаимодействия + Interakció + Menu de Interação + Menù Interattivo + + + Interaction Menu (Self) + Interaktionsmenü (Selbst) + Menú de interacción (Propia) + Menu interakcji (na siebie) + Menu interakce (vlastní) + Menu d'interaction (Perso) + Меню взаимодействия (с собой) + Interakció (saját) + Menu de Interação (Individual) + Menù Interattivo (Individuale) + + + Open / Close Door + Tür öffnen / schließen + Abrir / Cerrar puerta + Otwórz / Zamknij drzwi + Otevřít / Zavřít dveře + Ouvrir / Fermer Portes + Открыть / Закрыть двери + Ajtó nyitás / zárás + Abrir / Fechar Porta + Apri / Chiudi la porta + + + Lock Door + Tür sperren + Bloquear puerta + Verrouiller Porte + Blocca la porta + Заблокировать дверь + Trancar Porta + Ajtó bezárása + Zablokuj drzwi + Zamknout dveře + + + Unlock Door + Tür entsperren + Desbloquear puerta + Déverrouiller Porte + Sblocca la porta + Разблокировать дверь + Destrancar Porta + Zár kinyitása + Odblokuj drzwi + Odemknout dveře + + + Locked Door + Tür gesperrt + Puerta bloqueada + Porte Verrouillée + Porta bloccata + Дверь заблокирована + Porta Trancada + Zárt ajtó + Zablokowano drzwi + Zamčené dveře + + + Unlocked Door + Tür entsperrt + Puerta desbloqueada + Porte Déverrouillée + Porta sbloccata + Дверь разблокирована + Porta Destrancada + Nyitott ajtó + Odblokowano drzwi + Odemčené dveře + + + Join group + Gruppe beitreten + Unirse al grupo + Dołącz do grupy + Přidat se do skupiny + Rejoindre Groupe + Вступить в группу + Csatlakozás + Unir-se ao grupo + Unisciti alla squadra + + + Leave Group + Gruppe verlassen + Dejar grupo + Opuść grupę + Odejít ze skupiny + Quitter Groupe + Выйти из группы + Csoport elhagyása + Deixar grupo + Lascia la squadra + + + Become Leader + Grp.-führung übern. + Asumir el liderazgo + Przejmij dowodzenie + Stát se velitelem + Devenir Leader + Стать лидером + Vezetés átvétele + Tornar-se Líder + Prendi il comando + + + DANCE! + TANZEN! + BAILAR! + TAŃCZ! + TANČIT! + Danse! + ТАНЦЕВАТЬ! + TÁNC! + DANCE! + Balla! + + + Stop Dancing + Tanzen abbrechen + Dejar de bailar + Przestań tańczyć + Přestat tancovat + Arrêter de danser + Прекратить танцевать + Tánc abbahagyása + Parar de dançar + Smetti di ballare + + + << Back + << Zurück + << Atrás + << Wstecz + << Zpět + << Retour + << Назад + << Vissza + << Voltar + << Indietro + + + Gestures >> + Gesten >> + Gestos >> + Gesty >> + Gesta >> + Signaux >> + Жесты >> + Kézjelek >> + Gestos >> + Segnali gestuali >> + + + Attack + Angreifen + Atacar + Do ataku + Zaútočit + Attaquer + Атаковать + Támadás + Atacar + Attaccare + + + Advance + Vordringen + Avanzar + Naprzód + Postoupit + Avancer + Продвигаться + Előre + Avançar + Avanzare + + + Go + Los + Adelante + Szybko + Jít + Aller + Идти + Mozgás + Mover-se + Muoversi + + + Follow + Folgen + Seguirme + Za mną + Následovat + Suivre + Следовать + Utánam + Seguir + Seguire + + + Point + Zeigen + Señalar + Wskazać + Ukázat + Pointer + Точка + Mutat + Apontar + Puntare a + + + Up + Aufstehen + Arriba + Do góry + Vztyk + Debout + Вверх + Fel + Acima + Alzarsi + + + Cover + Deckung + Cubrirse + Do osłony + Krýt se + A couvert + Укрыться + Fedezékbe + Proteger-se + Copertura + + + Cease Fire + Feuer einstellen + Alto el fuego + Wstrzymać ogień + Zastavit palbu + Halte au feu + Прекратить огонь + Tüzet szüntess + Cessar Fogo + Cessare il Fuoco + + + Freeze + Keine Bewegung + Alto + Stać + Stát + Halte + Замереть + Állj + Alto + Fermi + + + Hi + Hallo + Hola + Witaj + Ahoj + Salut + Привет + Szeva + Olá + Ciao + + + Yes + Ja + Si + Tak + Ano + Oui + Да + Igen + Sim + Si + + + No + Nein + No + Nie + Ne + Non + Нет + Nem + Não + No + + + Put weapon on back + Waffe wegstecken + Arma a la espalda + Umieść broń na plecach + Dát zbraň na záda + Arme à la bretelle + Повесить оружие на спину + Fegyvert hátra + Colocar arma nas costas + Metti l'arma in spalla + + + Tap Shoulder + Auf Schulter klopfen + Tocar el hombro + Klepnij w ramię + Poklepat na rameno + Taper sur l'épaule + Похлопать по плечу + Vállveregetés + Tocar ombro + Dai un colpetto + + + You were tapped on the shoulder. + Dir wurde auf die Schulter geklopft + Te tocaron el hombro. + On te tape sur l'épaule. + Zostałeś klepnięty po ramieniu + Vállonveregettek + Někdo tě poklepal na rameno. + Вас похлопали по плечу + Você foi tocado no ombro. + Ti è stato dato un colpetto sulla spalla + + + Cancel + Abbrechen + Cancelar + Anuluj + Annuler + Zrušit + Annulla + Отменить + Cancelar + Mégse + + + Select + Wählen + Seleccionar + Wybierz + Sélectionner + Zvolit + Seleziona + Выбрать + Selecionar + Kiválaszt + + + Go Away! + Geh Weg! + Aléjate! + Odejdź! + Jděte pryč! + Allez-vous-en! + Уходите отсюда! + Tűnés! + Vá Embora! + Via di qui! + + + Get Down! + Auf Den Boden! + Al suelo! + Padnij! + K zemi! + A terre! + A földre! + Ложись! + Abaixe-se! + A Terra! + + + Team Management >> + Team Management >> + Gestión de equipo >> + Gestion d'équipe >> + Zarządzanie oddziałem >> + Správa týmu >> + Управление группой >> + Gerenciamento de Equipe >> + Organizzazione Squadra >> + Csapat kezelés >> + + + Red + Rot + Rojo + Rouge + Czerwony + Červený + Красный + Vermelha + Rosso + Piros + + + Green + Grün + Verde + Vert + Zielony + Zelený + Зеленый + Verde + Verde + Zöld + + + Blue + Blau + Azul + Bleu + Niebieski + Modrý + Синий + Azul + Blu + Kék + + + Yellow + Gelb + Amarillo + Jaune + Żółty + Žlutý + Желтый + Amarela + Giallo + Sárga + + + Join Team Red + Team Rot beitreten + Unirse al equipo rojo + Rejoindre Rouge + Dołącz do drużyny czerwonej + Připojit do Červeného Týmu + Присоединиться к красной группе + Unir-se à Equipe Vermelha + Entra nella Squadra Rossa + Csatlakozás a piros csapathoz + + + Join Team Green + Team Grün beitreten + Unirse al equipo verde + Rejoindre Verte + Dołącz do drużyny zielonej + Připojit do Zeleného Týmu + Присоединиться к зеленой группе + Unir-se à Equipe Verde + Entra nella Squadra Verde + Csatlakozás a zöld csapathoz + + + Join Team Blue + Team Blau beitreten + Unirse al equipo azul + Rejoindre Bleue + Dołącz do drużyny niebieskiej + Připojit do Modrého Týmu + Присоединиться к синей группе + Unir-se à Equipe Azul + Entra nella Squadra Blu + Csatlakozás a kék csapathoz + + + Join Team Yellow + Team Gelb beitreten + Unirse al equipo amarillo + Rejoindre Jaune + Dołącz do drużyny żółtej + Připojit do Žlutého Týmu + Присоединиться к желтой группе + Unir-se à Equipe Amarela + Entra nella Squadra Gialla + Csatlakozás a sárga csapathoz + + + You joined Team %1 + Du bist Team %1 beigetreten + Te has unido al equipo %1 + Tu as rejoint l'équipe %1 + Dołączyłeś do drużyny %1 + Připojil ses do Týmu %1 + Вы присоединились к группе %1 + Você uniu-se à Equipe %1 + Sei entrato nella Squadra %1 + Csatlakoztál a %1 csapathoz + + + Leave Team + Team verlassen + Dejar equipo + Quitter l'équipe + Opuść drużynę + Opustit tým + Покинуть группу + Deixar Equipe + Lascia la Squadra + Csapat elhagyása + + + You left the Team + Du hast das Team verlassen + Has dejado el equipo + Tu as quitté l'équipe + Opuściłeś drużynę + Opustil si tým + Вы покинули группу + Você deixou a Equipe + Hai lasciato la squadra + Elhagytad a csapatot + + + Pardon + Begnadigen + Perdonar + Przebacz + Pardon + Pardon + Извините + Perdão + Perdona + Megbocsátás + + + Flow Menu + Mausradmenü + Flow Menu + Menú desplegable + Menu Déroulant + Flow Menu + Выпадающее меню + Flow Menu + Menù a Scorrimento + Legördülő menü + + + Scroll + Scrollen + Przewiń + Défilement + Desplazar + Пролистать + Rolar + Scorri + Görgetés + Otáčení + + + Modifier Key + Modifikator + Modyfikator + Modifier la touche + Tecla modificadora + клавиша-модификатор + Tecla Modificadora + Modifica Tasto + Módosító billentyű + Modifikátor + + + Not in Range + Außer Reichweite + Hors de portée. + Fuera de rango + Слишком далеко + Fora do Alcançe + Hatótávolságon kívül + Poza zasięgiem + Mimo dosah + + + Close Menu on Key Release + Menü nach Loslassen schließen + Zamknij menu automatycznie + Fermer le menu en relâchant la touche + Cerrar menú al soltar la tecla + Menü bezárása a billentyű elengedésekor + Закрывать меню при отжатии клавиши + Menu interakce (Na držení) + + + Auto Center Cursor + Mauszeiger automatisch zentrieren + Auto-centrar cursor + Automatycznie centruj kursor + Vycentrování kurzoru + Egér auto-centrírozása + Автоцентрирование курсора + + + Equipment >> + Ausrüstung >> + Equipamiento >> + Équipment >> + Ekwipunek >> + Vybavení >> + Felszerelés >> + Снаряжение >> + + + Push + Schieben + Empujar + Pousser + Pchnij + Odstrčit + Tolás + Толкать + + + Interact + Interagiere + Interakce + Взаимодействовать + Interakcja + Interactuar + + +