From 23e452f0c3a5c3d2528110d251e2379384a66fb9 Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Fri, 3 Jan 2025 23:02:05 +0100 Subject: [PATCH 1/9] Add ACE UI addon --- addons/ui/addon.gproj | 8 ++++++++ addons/ui/license.txt | 18 ++++++++++++++++++ addons/ui/thumbnail.png | Bin 0 -> 262 bytes 3 files changed, 26 insertions(+) create mode 100644 addons/ui/addon.gproj create mode 100644 addons/ui/license.txt create mode 100644 addons/ui/thumbnail.png diff --git a/addons/ui/addon.gproj b/addons/ui/addon.gproj new file mode 100644 index 00000000..4ffb827a --- /dev/null +++ b/addons/ui/addon.gproj @@ -0,0 +1,8 @@ +GameProject { + ID "ACE_UI" + GUID "64475DC102F2BDA4" + TITLE "ACE UI" + Dependencies { + "60C4CE4888FF4621" "58D0FB3206B6F859" + } +} diff --git a/addons/ui/license.txt b/addons/ui/license.txt new file mode 100644 index 00000000..6ebf24cf --- /dev/null +++ b/addons/ui/license.txt @@ -0,0 +1,18 @@ +ACE Anvil - An experimental realism mod for Arma Reforger +Copyright (C) 2024 acemod + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +When publishing a derivative of this product you may not use a name that +might create the impression that your version is an official release. + +A full copy of this license can be found at the following address: +https://github.com/acemod/ACE-Anvil/blob/master/LICENSE. diff --git a/addons/ui/thumbnail.png b/addons/ui/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..3d428314255be3fa5da375c0410a5c93cdcf6ade GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=XFXjULn>~)y?&baumVp*qI4>! zSi%&!-P!AVF0op*RXcU9nj+RLBKYt96laBlH*8#hdcfd-)|dIyi@L5|dinNekf5OP z=0y8dR$I0J{_zet9ytu1GJlfK_(zU-QK zYiC{OE#=?(n*wgLReK-U%zJI$&aZCu--0+-U;CHH_C!Sf-qn9+4)oq(eYdvxl;*87 zk&AVk|DNf{&($jx-|@?`ad*S_AJtQL!yLpAaa>w5J&dc=bDj}M%+uA+Wt~$(698K7 BZCd~U literal 0 HcmV?d00001 From f7187276b72f31fe4c2c3fb065962abf22ec4767 Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Fri, 3 Jan 2025 23:11:51 +0100 Subject: [PATCH 2/9] Add ACE tab to settings menu --- .../SettingsMenu/SettingsSuperMenu.layout | 38 +++++++++++++++++++ .../SettingsSuperMenu.layout.meta | 17 +++++++++ .../SettingsMenu/SettingsSuperMenu.layout | 36 ++++++++++++++++++ .../SettingsSuperMenu.layout.meta | 17 +++++++++ 4 files changed, 108 insertions(+) create mode 100644 addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout create mode 100644 addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout.meta create mode 100644 addons/ui/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout create mode 100644 addons/ui/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout.meta diff --git a/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout b/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout new file mode 100644 index 00000000..dc00e31f --- /dev/null +++ b/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout @@ -0,0 +1,38 @@ +FrameWidgetClass { + { + OverlayWidgetClass "{5DF6773A8D2D810B}" { + Prefab "{5DF6773A8D2D810B}" + { + SizeLayoutWidgetClass "{5DF4AD634C312B7D}" { + Prefab "{5DF4AD634C312B7D}" + { + VerticalLayoutWidgetClass "{5DF4AD634C312B71}" { + Prefab "{5DF4AD634C312B71}" + { + OverlayWidgetClass "{5DF4AD634C312B8B}" { + Prefab "{5DF4AD634C312B8B}" + { + VerticalLayoutWidgetClass "{5DF4AD6212638B9A}" { + Prefab "{5DF4AD6212638B9A}" + components { + SCR_TabViewComponent "{546B27D01CA8A38D}" { + m_aElements { + SCR_TabViewContent "{64475E8B3FBE157D}" { + m_sTabButtonContent "ACE" + m_sTabIdentifier "ace-anvil" + m_bEnabled 0 + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout.meta b/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout.meta new file mode 100644 index 00000000..927d69fb --- /dev/null +++ b/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{72AB54EEF4635373}UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout" + Configurations { + LayoutResourceClass PC { + } + LayoutResourceClass XBOX_ONE : PC { + } + LayoutResourceClass XBOX_SERIES : PC { + } + LayoutResourceClass PS4 : PC { + } + LayoutResourceClass PS5 : PC { + } + LayoutResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout b/addons/ui/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout new file mode 100644 index 00000000..4cafc194 --- /dev/null +++ b/addons/ui/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout @@ -0,0 +1,36 @@ +FrameWidgetClass { + { + OverlayWidgetClass "{5DF6773A8D2D810B}" { + Prefab "{5DF6773A8D2D810B}" + { + SizeLayoutWidgetClass "{5DF4AD634C312B7D}" { + Prefab "{5DF4AD634C312B7D}" + { + VerticalLayoutWidgetClass "{5DF4AD634C312B71}" { + Prefab "{5DF4AD634C312B71}" + { + OverlayWidgetClass "{5DF4AD634C312B8B}" { + Prefab "{5DF4AD634C312B8B}" + { + VerticalLayoutWidgetClass "{5DF4AD6212638B9A}" { + Prefab "{5DF4AD6212638B9A}" + components { + SCR_TabViewComponent "{546B27D01CA8A38D}" { + m_aElements { + SCR_TabViewContent "{64475E8B3FBE157D}" { + m_bEnabled 1 + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/ui/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout.meta b/addons/ui/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout.meta new file mode 100644 index 00000000..927d69fb --- /dev/null +++ b/addons/ui/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{72AB54EEF4635373}UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout" + Configurations { + LayoutResourceClass PC { + } + LayoutResourceClass XBOX_ONE : PC { + } + LayoutResourceClass XBOX_SERIES : PC { + } + LayoutResourceClass PS4 : PC { + } + LayoutResourceClass PS5 : PC { + } + LayoutResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file From a394f5e0a6b665af4b32f638cef7b03024c2781d Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Fri, 3 Jan 2025 23:23:29 +0100 Subject: [PATCH 3/9] Add ACE_SettingsSubMenu.layout --- .../SettingsMenu/ACE_SettingsSubMenu.layout | 80 +++++++++++++++++++ .../ACE_SettingsSubMenu.layout.meta | 17 ++++ .../SettingsMenu/SettingsSuperMenu.layout | 1 + .../Menu/SettingsMenu/ACE_SettingsSubMenu.c | 3 + 4 files changed, 101 insertions(+) create mode 100644 addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout create mode 100644 addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout.meta create mode 100644 addons/core/scripts/Game/ACE_Core/UI/Menu/SettingsMenu/ACE_SettingsSubMenu.c diff --git a/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout b/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout new file mode 100644 index 00000000..41d573f2 --- /dev/null +++ b/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout @@ -0,0 +1,80 @@ +HorizontalLayoutWidgetClass { + Name "ACE_Settings" + components { + ACE_SettingsSubMenu "{644764DB50F2EEFA}" { + } + } + { + ScrollLayoutWidgetClass "{64475E8865185276}" { + Name "ScrollLayout0" + Slot LayoutSlot "{54890CCF086F1BB3}" { + Padding -2 72 2 0 + SizeMode Fill + FillWeight 1.433 + } + Color 0.761 0.392 0.078 1 + style Small + { + VerticalLayoutWidgetClass "{64475E8865185274}" { + Name "Content" + Slot AlignableSlot "{54890CCE26EF3FDE}" { + HorizontalAlign 3 + VerticalAlign 3 + Padding -4 0 10 0 + } + { + VerticalLayoutWidgetClass "{64475E883295DD06}" { + Name "ExampleGroup" + Slot LayoutSlot "{64475E883295DD3F}" { + Padding 4 4 4 4 + } + "Is Visible" 0 + { + VerticalLayoutWidgetClass "{64475E8865185260}" : "{FEEEB639F2735BA1}UI/layouts/Menus/SettingsMenu/CustomWidgets/SettingsTitle.layout" { + Name "Title0" + Slot LayoutSlot "{58B3227F5665E050}" { + } + components { + SCR_LabelComponent "{58B30C1A8E56F0FF}" { + m_sLabel "Title second category" + } + } + { + TextWidgetClass "{58B30C1F77EC7B4E}" { + Prefab "{58B30C1F77EC7B4E}" + Slot LayoutSlot "{58B30C1F77EC7B76}" { + } + } + } + } + ButtonWidgetClass "{64475E8865185267}" : "{C9DF0E6590F6C388}UI/layouts/WidgetLibrary/SpinBox/WLib_SpinBox.layout" { + Name "HorizontalCameraSpeed" + Slot LayoutSlot "{54890CCD613ED416}" { + Padding 4 4 4 4 + } + components { + SCR_SpinBoxComponent "{5472C6CBC0640458}" { + m_sLabel "#AR-Editor_Attribute_CameraATL_Name" + m_sLabelLayout "{F003823FF141983C}UI/layouts/Menus/SettingsMenu/CustomWidgets/SettingsLabel.layout" + m_aElementNames { + "#AR-UI_No" "#AR-UI_Yes" + } + m_bUseLightArrows 1 + m_bCycleMode 1 + } + } + } + } + } + } + } + } + } + VerticalLayoutWidgetClass "{64475E8865185264}" { + Name "Description" + Slot LayoutSlot "{54890CCD7A457969}" { + SizeMode Fill + } + } + } +} \ No newline at end of file diff --git a/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout.meta b/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout.meta new file mode 100644 index 00000000..bac1ef5a --- /dev/null +++ b/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{399F81816ADDA45B}UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout" + Configurations { + LayoutResourceClass PC { + } + LayoutResourceClass XBOX_ONE : PC { + } + LayoutResourceClass XBOX_SERIES : PC { + } + LayoutResourceClass PS4 : PC { + } + LayoutResourceClass PS5 : PC { + } + LayoutResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout b/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout index dc00e31f..9c0cb071 100644 --- a/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout +++ b/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout @@ -18,6 +18,7 @@ FrameWidgetClass { SCR_TabViewComponent "{546B27D01CA8A38D}" { m_aElements { SCR_TabViewContent "{64475E8B3FBE157D}" { + m_ElementLayout "{399F81816ADDA45B}UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout" m_sTabButtonContent "ACE" m_sTabIdentifier "ace-anvil" m_bEnabled 0 diff --git a/addons/core/scripts/Game/ACE_Core/UI/Menu/SettingsMenu/ACE_SettingsSubMenu.c b/addons/core/scripts/Game/ACE_Core/UI/Menu/SettingsMenu/ACE_SettingsSubMenu.c new file mode 100644 index 00000000..070f06df --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/UI/Menu/SettingsMenu/ACE_SettingsSubMenu.c @@ -0,0 +1,3 @@ +class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase +{ +} From 125e04de8f7b2569b8ad302d1860e644415b4dda Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Sat, 4 Jan 2025 02:28:01 +0100 Subject: [PATCH 4/9] Implement settings module --- .../SettingsMenu/ACE_SettingsSubMenu.layout | 19 +---- .../SettingsMenu/ACE_SettingsSubMenu.layout | 64 +++++++++++++++ .../ACE_SettingsSubMenu.layout.meta | 17 ++++ .../ACE_UI/Settings/ACE_RadioSettingsModule.c | 15 ++++ .../Game/ACE_UI/UI/ACE_SettingsSubMenu.c | 79 +++++++++++++++++++ 5 files changed, 179 insertions(+), 15 deletions(-) create mode 100644 addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout create mode 100644 addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout.meta create mode 100644 addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c create mode 100644 addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c diff --git a/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout b/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout index 41d573f2..b496c43c 100644 --- a/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout +++ b/addons/core/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout @@ -28,23 +28,12 @@ HorizontalLayoutWidgetClass { Slot LayoutSlot "{64475E883295DD3F}" { Padding 4 4 4 4 } + "Is Enabled" 0 "Is Visible" 0 { - VerticalLayoutWidgetClass "{64475E8865185260}" : "{FEEEB639F2735BA1}UI/layouts/Menus/SettingsMenu/CustomWidgets/SettingsTitle.layout" { - Name "Title0" - Slot LayoutSlot "{58B3227F5665E050}" { - } - components { - SCR_LabelComponent "{58B30C1A8E56F0FF}" { - m_sLabel "Title second category" - } - } - { - TextWidgetClass "{58B30C1F77EC7B4E}" { - Prefab "{58B30C1F77EC7B4E}" - Slot LayoutSlot "{58B30C1F77EC7B76}" { - } - } + VerticalLayoutWidgetClass "{64476640F1F8FB45}" : "{FEEEB639F2735BA1}UI/layouts/Menus/SettingsMenu/CustomWidgets/SettingsTitle.layout" { + Name "SettingsTitle0" + Slot LayoutSlot "{64476640F1F8FB60}" { } } ButtonWidgetClass "{64475E8865185267}" : "{C9DF0E6590F6C388}UI/layouts/WidgetLibrary/SpinBox/WLib_SpinBox.layout" { diff --git a/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout b/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout new file mode 100644 index 00000000..97520518 --- /dev/null +++ b/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout @@ -0,0 +1,64 @@ +HorizontalLayoutWidgetClass { + { + ScrollLayoutWidgetClass "{64475E8865185276}" { + Prefab "{64475E8865185276}" + { + VerticalLayoutWidgetClass "{64475E8865185274}" { + Prefab "{64475E8865185274}" + { + VerticalLayoutWidgetClass "{64476516122ABAC4}" { + Name "ACE_UI_Radio" + Slot LayoutSlot "{64476516122ABAFD}" { + } + { + VerticalLayoutWidgetClass "{64476640D7B4C338}" : "{FEEEB639F2735BA1}UI/layouts/Menus/SettingsMenu/CustomWidgets/SettingsTitle.layout" { + Name "SettingsTitle0" + Slot LayoutSlot "{64476640D7B4C35A}" { + } + components { + SCR_LabelComponent "{58B30C1A8E56F0FF}" { + m_sLabel "#ACE_UI-Settings-Radio" + } + } + } + ButtonWidgetClass "{64476516D54DC19A}" : "{C9DF0E6590F6C388}UI/layouts/WidgetLibrary/SpinBox/WLib_SpinBox.layout" { + Name "Beep_Ch1" + Slot LayoutSlot "{54890CCD613ED416}" { + Padding 4 4 4 4 + } + components { + SCR_SpinBoxComponent "{5472C6CBC0640458}" { + m_sLabel "#ACE_UI-Settings-Radio_Beep_Ch1" + m_sLabelLayout "{F003823FF141983C}UI/layouts/Menus/SettingsMenu/CustomWidgets/SettingsLabel.layout" + m_aElementNames { + "#ACE_UI-Settings-Radio_Beep_Off" "#ACE_UI-Settings-Radio_Beep_High" "#ACE_UI-Settings-Radio_Beep_Low" + } + m_bUseLightArrows 1 + m_bCycleMode 1 + } + } + } + ButtonWidgetClass "{64476516DF04C11E}" : "{C9DF0E6590F6C388}UI/layouts/WidgetLibrary/SpinBox/WLib_SpinBox.layout" { + Name "Beep_Ch2" + Slot LayoutSlot "{54890CCD613ED416}" { + Padding 4 4 4 4 + } + components { + SCR_SpinBoxComponent "{5472C6CBC0640458}" { + m_sLabel "#ACE_UI-Settings-Radio_Beep_Ch2" + m_sLabelLayout "{F003823FF141983C}UI/layouts/Menus/SettingsMenu/CustomWidgets/SettingsLabel.layout" + m_aElementNames { + "#ACE_UI-Settings-Radio_Beep_Off" "#ACE_UI-Settings-Radio_Beep_High" "#ACE_UI-Settings-Radio_Beep_Low" + } + m_bCycleMode 1 + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout.meta b/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout.meta new file mode 100644 index 00000000..bac1ef5a --- /dev/null +++ b/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{399F81816ADDA45B}UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout" + Configurations { + LayoutResourceClass PC { + } + LayoutResourceClass XBOX_ONE : PC { + } + LayoutResourceClass XBOX_SERIES : PC { + } + LayoutResourceClass PS4 : PC { + } + LayoutResourceClass PS5 : PC { + } + LayoutResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c b/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c new file mode 100644 index 00000000..82286ee9 --- /dev/null +++ b/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c @@ -0,0 +1,15 @@ +enum ACE_ERadioBeep +{ + OFF = 1 << 0, + NORMAL = 1 << 1, + LOW = 1 << 2, +} + +class ACE_RadioSettingsModule: ModuleGameSettings +{ + [Attribute(ACE_ERadioBeep.NORMAL.ToString(), uiwidget: UIWidgets.ComboBox, desc: "Sound to play when activating VoN Ch1", enums: ParamEnumArray.FromEnum(ACE_ERadioBeep))] + ACE_ERadioBeep m_eBeepCh1; + + [Attribute(ACE_ERadioBeep.LOW.ToString(), uiwidget: UIWidgets.ComboBox, desc: "Sound to play when activating VoN Ch2", enums: ParamEnumArray.FromEnum(ACE_ERadioBeep))] + ACE_ERadioBeep m_eBeepCh2; +} diff --git a/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c b/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c new file mode 100644 index 00000000..b079d9df --- /dev/null +++ b/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c @@ -0,0 +1,79 @@ +modded class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase +{ + const string ACE_BEEPCH1_PROP = "m_eBeepCh1"; + const string ACE_BEEPCH2_PROP = "m_eBeepCh2"; + + //------------------------------------------------------------------------------------------------ + override void OnTabCreate(Widget menuRoot, ResourceName buttonsLayout, int index) + { + BaseContainer radioSettings = GetRadioSettings(); + VerticalLayoutWidget wRadioRoot = VerticalLayoutWidget.Cast(m_wRoot.FindAnyWidget("ACE_UI_Radio")); + + super.OnTabCreate(menuRoot, buttonsLayout, index); + + if (!radioSettings || !wRadioRoot) + { + PrintFormat("Unable to load ACE_UI Radio settings: %1, %2", radioSettings, wRadioRoot, level: LogLevel.ERROR); + return; + } + + // Radio beep Ch1 + SCR_SelectionWidgetComponent checkBoxBeep1 = SCR_SelectionWidgetComponent.GetSelectionComponent("Beep_Ch1", wRadioRoot); + if (checkBoxBeep1) + { + int value; + radioSettings.Get(ACE_BEEPCH1_PROP, value); + + checkBoxBeep1.SetCurrentItem(value >> 1, false, false); //--- Shift the value, because it's a flag + checkBoxBeep1.m_OnChanged.Insert(SetBeepCh1); + } + else + { + Print("Radio setting 'Beep_Ch1' not found", LogLevel.WARNING); + } + + // Radio beep Ch1 + SCR_SelectionWidgetComponent checkBoxBeep2 = SCR_SelectionWidgetComponent.GetSelectionComponent("Beep_Ch2", wRadioRoot); + if (checkBoxBeep2) + { + int value; + radioSettings.Get(ACE_BEEPCH2_PROP, value); + + checkBoxBeep2.SetCurrentItem(value >> 1, false, false); //--- Shift the value, because it's a flag + checkBoxBeep2.m_OnChanged.Insert(SetBeepCh2); + } + else + { + Print("Radio setting 'Beep_Ch2' not found", LogLevel.WARNING); + } + } + + //------------------------------------------------------------------------------------------------ + protected void SetBeepCh1(SCR_SelectionWidgetComponent checkBox, int state) + { + SetBeepProp(checkBox, state, ACE_BEEPCH1_PROP); + } + + //------------------------------------------------------------------------------------------------ + protected void SetBeepCh2(SCR_SelectionWidgetComponent checkBox, int state) + { + SetBeepProp(checkBox, state, ACE_BEEPCH2_PROP); + } + + //------------------------------------------------------------------------------------------------ + protected void SetBeepProp(SCR_SelectionWidgetComponent checkBox, int state, string prop) + { + PrintFormat("SetBeepProp: %1, %2", prop, state, level: LogLevel.NORMAL); + + state = 1 << state; //--- Shift the value, because it's a flag + + GetRadioSettings().Set(prop, state); + GetGame().UserSettingsChanged(); + } + + //------------------------------------------------------------------------------------------------ + protected BaseContainer GetRadioSettings() + { + return GetGame().GetGameUserSettings().GetModule("ACE_RadioSettingsModule"); + } +} From 6b378ddb90f1f58172d7bd9688c7e6fbddc066f7 Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Sat, 4 Jan 2025 02:51:22 +0100 Subject: [PATCH 5/9] Implement beep sounds --- addons/ui/Sounds/ACE_UI/beep_high.wav | Bin 0 -> 11058 bytes addons/ui/Sounds/ACE_UI/beep_low.wav | Bin 0 -> 36044 bytes addons/ui/Sounds/ACE_UI/click_off.wav | Bin 0 -> 13052 bytes .../ACE_UI/Settings/ACE_RadioSettingsModule.c | 9 ++ .../Game/ACE_UI/UI/ACE_SettingsSubMenu.c | 23 ++---- .../Game/ACE_UI/VON/SCR_VONController.c | 78 ++++++++++++++++++ 6 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 addons/ui/Sounds/ACE_UI/beep_high.wav create mode 100644 addons/ui/Sounds/ACE_UI/beep_low.wav create mode 100644 addons/ui/Sounds/ACE_UI/click_off.wav create mode 100644 addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c diff --git a/addons/ui/Sounds/ACE_UI/beep_high.wav b/addons/ui/Sounds/ACE_UI/beep_high.wav new file mode 100644 index 0000000000000000000000000000000000000000..f3c41195732c8ba1b1737da7448834290da1f4d6 GIT binary patch literal 11058 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 D(Y1&O literal 0 HcmV?d00001 diff --git a/addons/ui/Sounds/ACE_UI/beep_low.wav b/addons/ui/Sounds/ACE_UI/beep_low.wav new file mode 100644 index 0000000000000000000000000000000000000000..b0e2ac391772f0d98aa1fc87c3dcf5125010d9a7 GIT binary patch literal 36044 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≫wbUMIO?I;ocYhdN6S1q;L5Ed*V7g`8S{I!?@@ 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 LEzLl5X#9Tw=WI+p literal 0 HcmV?d00001 diff --git a/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c b/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c index 82286ee9..905fa923 100644 --- a/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c +++ b/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c @@ -7,9 +7,18 @@ enum ACE_ERadioBeep class ACE_RadioSettingsModule: ModuleGameSettings { + const string BEEPCH1 = "m_eBeepCh1"; + const string BEEPCH2 = "m_eBeepCh2"; + [Attribute(ACE_ERadioBeep.NORMAL.ToString(), uiwidget: UIWidgets.ComboBox, desc: "Sound to play when activating VoN Ch1", enums: ParamEnumArray.FromEnum(ACE_ERadioBeep))] ACE_ERadioBeep m_eBeepCh1; [Attribute(ACE_ERadioBeep.LOW.ToString(), uiwidget: UIWidgets.ComboBox, desc: "Sound to play when activating VoN Ch2", enums: ParamEnumArray.FromEnum(ACE_ERadioBeep))] ACE_ERadioBeep m_eBeepCh2; + + //------------------------------------------------------------------------------------------------ + static BaseContainer GetInstance() + { + return GetGame().GetGameUserSettings().GetModule("ACE_RadioSettingsModule"); + } } diff --git a/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c b/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c index b079d9df..fc9de6a8 100644 --- a/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c +++ b/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c @@ -1,12 +1,9 @@ modded class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase -{ - const string ACE_BEEPCH1_PROP = "m_eBeepCh1"; - const string ACE_BEEPCH2_PROP = "m_eBeepCh2"; - +{ //------------------------------------------------------------------------------------------------ override void OnTabCreate(Widget menuRoot, ResourceName buttonsLayout, int index) { - BaseContainer radioSettings = GetRadioSettings(); + BaseContainer radioSettings = ACE_RadioSettingsModule.GetInstance(); VerticalLayoutWidget wRadioRoot = VerticalLayoutWidget.Cast(m_wRoot.FindAnyWidget("ACE_UI_Radio")); super.OnTabCreate(menuRoot, buttonsLayout, index); @@ -22,7 +19,7 @@ modded class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase if (checkBoxBeep1) { int value; - radioSettings.Get(ACE_BEEPCH1_PROP, value); + radioSettings.Get(ACE_RadioSettingsModule.BEEPCH1, value); checkBoxBeep1.SetCurrentItem(value >> 1, false, false); //--- Shift the value, because it's a flag checkBoxBeep1.m_OnChanged.Insert(SetBeepCh1); @@ -37,7 +34,7 @@ modded class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase if (checkBoxBeep2) { int value; - radioSettings.Get(ACE_BEEPCH2_PROP, value); + radioSettings.Get(ACE_RadioSettingsModule.BEEPCH2, value); checkBoxBeep2.SetCurrentItem(value >> 1, false, false); //--- Shift the value, because it's a flag checkBoxBeep2.m_OnChanged.Insert(SetBeepCh2); @@ -51,13 +48,13 @@ modded class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase //------------------------------------------------------------------------------------------------ protected void SetBeepCh1(SCR_SelectionWidgetComponent checkBox, int state) { - SetBeepProp(checkBox, state, ACE_BEEPCH1_PROP); + SetBeepProp(checkBox, state, ACE_RadioSettingsModule.BEEPCH1); } //------------------------------------------------------------------------------------------------ protected void SetBeepCh2(SCR_SelectionWidgetComponent checkBox, int state) { - SetBeepProp(checkBox, state, ACE_BEEPCH2_PROP); + SetBeepProp(checkBox, state, ACE_RadioSettingsModule.BEEPCH2); } //------------------------------------------------------------------------------------------------ @@ -67,13 +64,7 @@ modded class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase state = 1 << state; //--- Shift the value, because it's a flag - GetRadioSettings().Set(prop, state); + ACE_RadioSettingsModule.GetInstance().Set(prop, state); GetGame().UserSettingsChanged(); } - - //------------------------------------------------------------------------------------------------ - protected BaseContainer GetRadioSettings() - { - return GetGame().GetGameUserSettings().GetModule("ACE_RadioSettingsModule"); - } } diff --git a/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c b/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c new file mode 100644 index 00000000..94173508 --- /dev/null +++ b/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c @@ -0,0 +1,78 @@ +modded class SCR_VONController: ScriptComponent +{ + const string ACE_SOUND_START_HIGH = "Sounds/ACE_UI/beep_high.wav"; + const string ACE_SOUND_START_LOW = "Sounds/ACE_UI/beep_low.wav"; + const string ACE_SOUND_END = "Sounds/ACE_UI/click_off.wav"; + + protected ACE_ERadioBeep m_eBeepTypeCh1; + protected ACE_ERadioBeep m_eBeepTypeCh2; + + //------------------------------------------------------------------------------------------------ + override void OnPostInit(IEntity owner) + { + super.OnPostInit(owner); + + ACE_LoadSettings(); + GetGame().OnUserSettingsChangedInvoker().Insert(ACE_LoadSettings); + } + + //------------------------------------------------------------------------------------------------ + protected void ACE_LoadSettings() + { + BaseContainer settings = ACE_RadioSettingsModule.GetInstance(); + + settings.Get(ACE_RadioSettingsModule.BEEPCH1, m_eBeepTypeCh1); + settings.Get(ACE_RadioSettingsModule.BEEPCH2, m_eBeepTypeCh2); + + PrintFormat("SCR_VONController.AFM_LoadSettings: %1, %2", m_eBeepTypeCh1, m_eBeepTypeCh2, level: LogLevel.DEBUG); + } + + //------------------------------------------------------------------------------------------------ + protected string AFM_GetBeepSound(int transreceiverNumber) + { + ACE_ERadioBeep beepType; + if (transreceiverNumber == 1) + beepType = m_eBeepTypeCh1; + else + beepType = m_eBeepTypeCh2; + + switch (beepType) { + case ACE_ERadioBeep.LOW: + return ACE_SOUND_START_LOW; + case ACE_ERadioBeep.NORMAL: + return ACE_SOUND_START_HIGH; + } + + return ""; + } + + //------------------------------------------------------------------------------------------------ + override void SetActiveTransmit(notnull SCR_VONEntry entry) + { + super.SetActiveTransmit(entry); + + SCR_VONEntryRadio radioEntry = SCR_VONEntryRadio.Cast(entry); + if (!radioEntry) + return; + + string beep = AFM_GetBeepSound(radioEntry.GetTransceiverNumber()); + if (beep != "") + // TODO use sound event SCR_UISoundEntity.SoundEvent(SCR_SoundEvent.SOUND_RADIO_TURN_OFF); + AudioSystem.PlaySound(beep); + } + + //------------------------------------------------------------------------------------------------ + override void DeactivateVON(EVONTransmitType transmitType = EVONTransmitType.NONE) + { + if (m_bIsActive) + { + if (transmitType != EVONTransmitType.DIRECT) + { + // TODO use sound event SCR_UISoundEntity.SoundEvent(SCR_SoundEvent.SOUND_RADIO_TURN_OFF); + AudioSystem.PlaySound(ACE_SOUND_END); + } + }; + + super.DeactivateVON(transmitType); + } +} From c2cac92e9d62fd72066b3639e81d9ee9e46dd771 Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Sat, 4 Jan 2025 03:31:16 +0100 Subject: [PATCH 6/9] Add setting for beep on channel cycle --- .../SettingsMenu/ACE_SettingsSubMenu.layout | 17 +++++++++++++ .../ACE_UI/Settings/ACE_RadioSettingsModule.c | 4 ++++ .../Game/ACE_UI/UI/ACE_SettingsSubMenu.c | 24 +++++++++++++++++++ .../Game/ACE_UI/VON/SCR_VONController.c | 12 ++++++++-- 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout b/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout index 97520518..b7154768 100644 --- a/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout +++ b/addons/ui/UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout @@ -54,6 +54,23 @@ HorizontalLayoutWidgetClass { } } } + ButtonWidgetClass "{64481AA16C28CDC6}" : "{C9DF0E6590F6C388}UI/layouts/WidgetLibrary/SpinBox/WLib_SpinBox.layout" { + Name "Beep_Cycle" + Slot LayoutSlot "{64481AA16C28CD32}" { + HorizontalAlign 3 + Padding 4 4 4 4 + } + components { + SCR_SpinBoxComponent "{5472C6CBC0640458}" { + m_sLabel "#ACE_UI-Settings_Beep_Cycle" + m_sLabelLayout "{F003823FF141983C}UI/layouts/Menus/SettingsMenu/CustomWidgets/SettingsLabel.layout" + m_aElementNames { + "#AR-UI_No" "#AR-UI_Yes" + } + m_bCycleMode 1 + } + } + } } } } diff --git a/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c b/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c index 905fa923..256ce984 100644 --- a/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c +++ b/addons/ui/scripts/Game/ACE_UI/Settings/ACE_RadioSettingsModule.c @@ -9,6 +9,7 @@ class ACE_RadioSettingsModule: ModuleGameSettings { const string BEEPCH1 = "m_eBeepCh1"; const string BEEPCH2 = "m_eBeepCh2"; + const string BEEPCYCLE = "m_bBeepCycle"; [Attribute(ACE_ERadioBeep.NORMAL.ToString(), uiwidget: UIWidgets.ComboBox, desc: "Sound to play when activating VoN Ch1", enums: ParamEnumArray.FromEnum(ACE_ERadioBeep))] ACE_ERadioBeep m_eBeepCh1; @@ -16,6 +17,9 @@ class ACE_RadioSettingsModule: ModuleGameSettings [Attribute(ACE_ERadioBeep.LOW.ToString(), uiwidget: UIWidgets.ComboBox, desc: "Sound to play when activating VoN Ch2", enums: ParamEnumArray.FromEnum(ACE_ERadioBeep))] ACE_ERadioBeep m_eBeepCh2; + [Attribute("1", desc: "Should radio channel beep sound play when cycling transreceivers")] + bool m_bBeepCycle; + //------------------------------------------------------------------------------------------------ static BaseContainer GetInstance() { diff --git a/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c b/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c index fc9de6a8..9d4f83d5 100644 --- a/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c +++ b/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c @@ -43,6 +43,21 @@ modded class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase { Print("Radio setting 'Beep_Ch2' not found", LogLevel.WARNING); } + + // Cycle transreceiver beep + SCR_SelectionWidgetComponent checkBoxCycle = SCR_SelectionWidgetComponent.GetSelectionComponent("Beep_Cycle", wRadioRoot); + if (checkBoxCycle) + { + bool value; + radioSettings.Get(ACE_RadioSettingsModule.BEEPCYCLE, value); + + checkBoxCycle.SetCurrentItem(value, false, false); + checkBoxCycle.m_OnChanged.Insert(SetBeepCycle); + } + else + { + Print("Radio setting 'Beep_Cycle' not found", LogLevel.WARNING); + } } //------------------------------------------------------------------------------------------------ @@ -67,4 +82,13 @@ modded class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase ACE_RadioSettingsModule.GetInstance().Set(prop, state); GetGame().UserSettingsChanged(); } + + //------------------------------------------------------------------------------------------------ + protected void SetBeepCycle(SCR_SelectionWidgetComponent checkBox, bool state) + { + PrintFormat("SetBeepCycle: %1", state, level: LogLevel.NORMAL); + + ACE_RadioSettingsModule.GetInstance().Set(ACE_RadioSettingsModule.BEEPCYCLE, state); + GetGame().UserSettingsChanged(); + } } diff --git a/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c b/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c index 94173508..b3834d06 100644 --- a/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c +++ b/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c @@ -6,6 +6,7 @@ modded class SCR_VONController: ScriptComponent protected ACE_ERadioBeep m_eBeepTypeCh1; protected ACE_ERadioBeep m_eBeepTypeCh2; + protected bool m_bBeepCycle; //------------------------------------------------------------------------------------------------ override void OnPostInit(IEntity owner) @@ -23,12 +24,13 @@ modded class SCR_VONController: ScriptComponent settings.Get(ACE_RadioSettingsModule.BEEPCH1, m_eBeepTypeCh1); settings.Get(ACE_RadioSettingsModule.BEEPCH2, m_eBeepTypeCh2); + settings.Get(ACE_RadioSettingsModule.BEEPCYCLE, m_bBeepCycle); PrintFormat("SCR_VONController.AFM_LoadSettings: %1, %2", m_eBeepTypeCh1, m_eBeepTypeCh2, level: LogLevel.DEBUG); } //------------------------------------------------------------------------------------------------ - protected string AFM_GetBeepSound(int transreceiverNumber) + protected string ACE_GetBeepSound(int transreceiverNumber) { ACE_ERadioBeep beepType; if (transreceiverNumber == 1) @@ -49,13 +51,19 @@ modded class SCR_VONController: ScriptComponent //------------------------------------------------------------------------------------------------ override void SetActiveTransmit(notnull SCR_VONEntry entry) { + if (m_ActiveEntry != entry && !m_bBeepCycle) + { + super.SetActiveTransmit(entry); + return; + } + super.SetActiveTransmit(entry); SCR_VONEntryRadio radioEntry = SCR_VONEntryRadio.Cast(entry); if (!radioEntry) return; - string beep = AFM_GetBeepSound(radioEntry.GetTransceiverNumber()); + string beep = ACE_GetBeepSound(radioEntry.GetTransceiverNumber()); if (beep != "") // TODO use sound event SCR_UISoundEntity.SoundEvent(SCR_SoundEvent.SOUND_RADIO_TURN_OFF); AudioSystem.PlaySound(beep); From 05b08ddee07572fceaf01d945d6e9c9a583d2ff7 Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Sat, 4 Jan 2025 03:41:10 +0100 Subject: [PATCH 7/9] Add translations --- .../SettingsMenu/SettingsSuperMenu.layout | 2 +- addons/ui/Language/ACE_UI_language.cs_cz.conf | 20 +++++ .../Language/ACE_UI_language.cs_cz.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.de_de.conf | 20 +++++ .../Language/ACE_UI_language.de_de.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.en_us.conf | 20 +++++ .../Language/ACE_UI_language.en_us.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.es_es.conf | 20 +++++ .../Language/ACE_UI_language.es_es.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.fr_fr.conf | 20 +++++ .../Language/ACE_UI_language.fr_fr.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.it_it.conf | 20 +++++ .../Language/ACE_UI_language.it_it.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.ja_jp.conf | 20 +++++ .../Language/ACE_UI_language.ja_jp.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.ko_kr.conf | 20 +++++ .../Language/ACE_UI_language.ko_kr.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.pl_pl.conf | 20 +++++ .../Language/ACE_UI_language.pl_pl.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.pt_br.conf | 20 +++++ .../Language/ACE_UI_language.pt_br.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.ru_ru.conf | 20 +++++ .../Language/ACE_UI_language.ru_ru.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.st | 61 +++++++++++++++ addons/ui/Language/ACE_UI_language.st.meta | 17 ++++ addons/ui/Language/ACE_UI_language.uk_ua.conf | 20 +++++ .../Language/ACE_UI_language.uk_ua.conf.meta | 17 ++++ addons/ui/Language/ACE_UI_language.zh_cn.conf | 20 +++++ .../Language/ACE_UI_language.zh_cn.conf.meta | 17 ++++ addons/ui/addon.gproj | 77 ++++++++++++++++++- 30 files changed, 636 insertions(+), 2 deletions(-) create mode 100644 addons/ui/Language/ACE_UI_language.cs_cz.conf create mode 100644 addons/ui/Language/ACE_UI_language.cs_cz.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.de_de.conf create mode 100644 addons/ui/Language/ACE_UI_language.de_de.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.en_us.conf create mode 100644 addons/ui/Language/ACE_UI_language.en_us.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.es_es.conf create mode 100644 addons/ui/Language/ACE_UI_language.es_es.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.fr_fr.conf create mode 100644 addons/ui/Language/ACE_UI_language.fr_fr.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.it_it.conf create mode 100644 addons/ui/Language/ACE_UI_language.it_it.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.ja_jp.conf create mode 100644 addons/ui/Language/ACE_UI_language.ja_jp.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.ko_kr.conf create mode 100644 addons/ui/Language/ACE_UI_language.ko_kr.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.pl_pl.conf create mode 100644 addons/ui/Language/ACE_UI_language.pl_pl.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.pt_br.conf create mode 100644 addons/ui/Language/ACE_UI_language.pt_br.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.ru_ru.conf create mode 100644 addons/ui/Language/ACE_UI_language.ru_ru.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.st create mode 100644 addons/ui/Language/ACE_UI_language.st.meta create mode 100644 addons/ui/Language/ACE_UI_language.uk_ua.conf create mode 100644 addons/ui/Language/ACE_UI_language.uk_ua.conf.meta create mode 100644 addons/ui/Language/ACE_UI_language.zh_cn.conf create mode 100644 addons/ui/Language/ACE_UI_language.zh_cn.conf.meta diff --git a/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout b/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout index 9c0cb071..b68fa640 100644 --- a/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout +++ b/addons/core/UI/layouts/Menus/SettingsMenu/SettingsSuperMenu.layout @@ -19,7 +19,7 @@ FrameWidgetClass { m_aElements { SCR_TabViewContent "{64475E8B3FBE157D}" { m_ElementLayout "{399F81816ADDA45B}UI/layouts/Menus/SettingsMenu/ACE_SettingsSubMenu.layout" - m_sTabButtonContent "ACE" + m_sTabButtonContent "#ACE-Acronym" m_sTabIdentifier "ace-anvil" m_bEnabled 0 } diff --git a/addons/ui/Language/ACE_UI_language.cs_cz.conf b/addons/ui/Language/ACE_UI_language.cs_cz.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.cs_cz.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.cs_cz.conf.meta b/addons/ui/Language/ACE_UI_language.cs_cz.conf.meta new file mode 100644 index 00000000..d9b28859 --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.cs_cz.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{BF1E2012E3DEE9C1}Language/ACE_UI_language.cs_cz.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.de_de.conf b/addons/ui/Language/ACE_UI_language.de_de.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.de_de.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.de_de.conf.meta b/addons/ui/Language/ACE_UI_language.de_de.conf.meta new file mode 100644 index 00000000..c7b258ae --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.de_de.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{6A603A21F07DF8E1}Language/ACE_UI_language.de_de.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.en_us.conf b/addons/ui/Language/ACE_UI_language.en_us.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.en_us.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.en_us.conf.meta b/addons/ui/Language/ACE_UI_language.en_us.conf.meta new file mode 100644 index 00000000..e0b1e97b --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.en_us.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{3490B06A9A8EFDE0}Language/ACE_UI_language.en_us.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.es_es.conf b/addons/ui/Language/ACE_UI_language.es_es.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.es_es.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.es_es.conf.meta b/addons/ui/Language/ACE_UI_language.es_es.conf.meta new file mode 100644 index 00000000..dde23965 --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.es_es.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{F1DCFDE3748C96FF}Language/ACE_UI_language.es_es.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.fr_fr.conf b/addons/ui/Language/ACE_UI_language.fr_fr.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.fr_fr.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.fr_fr.conf.meta b/addons/ui/Language/ACE_UI_language.fr_fr.conf.meta new file mode 100644 index 00000000..4f11c7ca --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.fr_fr.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{4A7408D4920F75FD}Language/ACE_UI_language.fr_fr.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.it_it.conf b/addons/ui/Language/ACE_UI_language.it_it.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.it_it.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.it_it.conf.meta b/addons/ui/Language/ACE_UI_language.it_it.conf.meta new file mode 100644 index 00000000..25dbf9bf --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.it_it.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{CA6887E03F2DF604}Language/ACE_UI_language.it_it.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.ja_jp.conf b/addons/ui/Language/ACE_UI_language.ja_jp.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.ja_jp.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.ja_jp.conf.meta b/addons/ui/Language/ACE_UI_language.ja_jp.conf.meta new file mode 100644 index 00000000..9f71cf03 --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.ja_jp.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{DA733A72015CC6AF}Language/ACE_UI_language.ja_jp.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.ko_kr.conf b/addons/ui/Language/ACE_UI_language.ko_kr.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.ko_kr.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.ko_kr.conf.meta b/addons/ui/Language/ACE_UI_language.ko_kr.conf.meta new file mode 100644 index 00000000..74fa3c2c --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.ko_kr.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{7ACD12DE9271C590}Language/ACE_UI_language.ko_kr.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.pl_pl.conf b/addons/ui/Language/ACE_UI_language.pl_pl.conf new file mode 100644 index 00000000..171f37b4 --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.pl_pl.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Pisk transmisji kanału 1" + "Pisk transmisji kanału 2" + "Wysoki" + "Niski" + "Wyłączony" + "Pisk przy zmianie nadajnika" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.pl_pl.conf.meta b/addons/ui/Language/ACE_UI_language.pl_pl.conf.meta new file mode 100644 index 00000000..4f0a0ea6 --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.pl_pl.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{26BCB4242C9E59EC}Language/ACE_UI_language.pl_pl.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.pt_br.conf b/addons/ui/Language/ACE_UI_language.pt_br.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.pt_br.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.pt_br.conf.meta b/addons/ui/Language/ACE_UI_language.pt_br.conf.meta new file mode 100644 index 00000000..adc61034 --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.pt_br.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{F3CB2EE817609356}Language/ACE_UI_language.pt_br.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.ru_ru.conf b/addons/ui/Language/ACE_UI_language.ru_ru.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.ru_ru.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.ru_ru.conf.meta b/addons/ui/Language/ACE_UI_language.ru_ru.conf.meta new file mode 100644 index 00000000..386469e7 --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.ru_ru.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A68A3A408A19F620}Language/ACE_UI_language.ru_ru.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.st b/addons/ui/Language/ACE_UI_language.st new file mode 100644 index 00000000..f7e7ab5e --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.st @@ -0,0 +1,61 @@ +StringTable { + ItemClassName "CustomStringTableItem" + Items { + CustomStringTableItem "{644826487CAE8882}" { + Id "ACE_UI-Settings-Radio" + Target_en_us "Radio" + Target_pl_pl "Radio" + Modified 1682450666 + Author "veteran29" + LastChanged "veteran29" + } + CustomStringTableItem "{6448264807CE1461}" { + Id "ACE_UI-Settings-Radio_Beep_Ch1" + Target_en_us "Ch.1 transmission beep" + Target_pl_pl "Pisk transmisji kanału 1" + Modified 1682450683 + Author "veteran29" + LastChanged "veteran29" + } + CustomStringTableItem "{6448264808F0EDBE}" { + Id "ACE_UI-Settings-Radio_Beep_Ch2" + Target_en_us "Ch.2 transmission beep" + Target_pl_pl "Pisk transmisji kanału 2" + Modified 1682450690 + Author "veteran29" + LastChanged "veteran29" + } + CustomStringTableItem "{644826481FB40F2F}" { + Id "ACE_UI-Settings-Radio_Beep_High" + Target_en_us "High" + Target_pl_pl "Wysoki" + Modified 1682450695 + Author "veteran29" + LastChanged "veteran29" + } + CustomStringTableItem "{6448264811A5CBD7}" { + Id "ACE_UI-Settings-Radio_Beep_Low" + Target_en_us "Low" + Target_pl_pl "Niski" + Modified 1682450698 + Author "veteran29" + LastChanged "veteran29" + } + CustomStringTableItem "{644826480D886913}" { + Id "ACE_UI-Settings-Radio_Beep_Off" + Target_en_us "Off" + Target_pl_pl "Wyłączony" + Modified 1682450701 + Author "veteran29" + LastChanged "veteran29" + } + CustomStringTableItem "{64482648D1C29B76}" { + Id "ACE_UI-Settings_Beep_Cycle" + Target_en_us "Transceiver cycle beep" + Target_pl_pl "Pisk przy zmianie nadajnika" + Modified 1682450920 + Author "veteran29" + LastChanged "veteran29" + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.st.meta b/addons/ui/Language/ACE_UI_language.st.meta new file mode 100644 index 00000000..789cc895 --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.st.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{C4D719716B02B0B1}Language/ACE_UI_language.st" + Configurations { + StringTableResourceClass PC { + } + StringTableResourceClass XBOX_ONE : PC { + } + StringTableResourceClass XBOX_SERIES : PC { + } + StringTableResourceClass PS4 : PC { + } + StringTableResourceClass PS5 : PC { + } + StringTableResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.uk_ua.conf b/addons/ui/Language/ACE_UI_language.uk_ua.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.uk_ua.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.uk_ua.conf.meta b/addons/ui/Language/ACE_UI_language.uk_ua.conf.meta new file mode 100644 index 00000000..9dea10a1 --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.uk_ua.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{2CD26FB6E6374875}Language/ACE_UI_language.uk_ua.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.zh_cn.conf b/addons/ui/Language/ACE_UI_language.zh_cn.conf new file mode 100644 index 00000000..2adbf2eb --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.zh_cn.conf @@ -0,0 +1,20 @@ +StringTableRuntime { + Ids { + "ACE_UI-Settings-Radio" + "ACE_UI-Settings-Radio_Beep_Ch1" + "ACE_UI-Settings-Radio_Beep_Ch2" + "ACE_UI-Settings-Radio_Beep_High" + "ACE_UI-Settings-Radio_Beep_Low" + "ACE_UI-Settings-Radio_Beep_Off" + "ACE_UI-Settings_Beep_Cycle" + } + Texts { + "Radio" + "Ch.1 transmission beep" + "Ch.2 transmission beep" + "High" + "Low" + "Off" + "Transceiver cycle beep" + } +} \ No newline at end of file diff --git a/addons/ui/Language/ACE_UI_language.zh_cn.conf.meta b/addons/ui/Language/ACE_UI_language.zh_cn.conf.meta new file mode 100644 index 00000000..ea85a49d --- /dev/null +++ b/addons/ui/Language/ACE_UI_language.zh_cn.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{F662018BDF979868}Language/ACE_UI_language.zh_cn.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/ui/addon.gproj b/addons/ui/addon.gproj index 4ffb827a..a98858f7 100644 --- a/addons/ui/addon.gproj +++ b/addons/ui/addon.gproj @@ -5,4 +5,79 @@ GameProject { Dependencies { "60C4CE4888FF4621" "58D0FB3206B6F859" } -} + Configurations { + GameProjectConfig PC { + WidgetManagerSettings WidgetManagerSettings "{AC4BE58770485E02}" { + StringTables { + StringTableDefinition "{64482648F88CE023}" { + StringTableSource "{C4D719716B02B0B1}Language/ACE_UI_language.st" + Languages { + LanguageDefinition "{64482648FE8E786E}" { + Code "cs_cz" + StringTableRuntime "{BF1E2012E3DEE9C1}Language/ACE_UI_language.cs_cz.conf" + } + LanguageDefinition "{64482648FE8987CB}" { + Code "de_de" + StringTableRuntime "{6A603A21F07DF8E1}Language/ACE_UI_language.de_de.conf" + } + LanguageDefinition "{64482648FE8987EF}" { + Code "en_us" + StringTableRuntime "{3490B06A9A8EFDE0}Language/ACE_UI_language.en_us.conf" + } + LanguageDefinition "{64482648FE89870D}" { + Code "es_es" + StringTableRuntime "{F1DCFDE3748C96FF}Language/ACE_UI_language.es_es.conf" + } + LanguageDefinition "{64482648FE898729}" { + Code "fr_fr" + StringTableRuntime "{4A7408D4920F75FD}Language/ACE_UI_language.fr_fr.conf" + } + LanguageDefinition "{64482648FE89877F}" { + Code "it_it" + StringTableRuntime "{CA6887E03F2DF604}Language/ACE_UI_language.it_it.conf" + } + LanguageDefinition "{64482648FE89869A}" { + Code "ja_jp" + StringTableRuntime "{DA733A72015CC6AF}Language/ACE_UI_language.ja_jp.conf" + } + LanguageDefinition "{64482648FE8986B6}" { + Code "ko_kr" + StringTableRuntime "{7ACD12DE9271C590}Language/ACE_UI_language.ko_kr.conf" + } + LanguageDefinition "{64482648FE8986D3}" { + Code "pl_pl" + StringTableRuntime "{26BCB4242C9E59EC}Language/ACE_UI_language.pl_pl.conf" + } + LanguageDefinition "{64482648FE8986CF}" { + Code "pt_br" + StringTableRuntime "{F3CB2EE817609356}Language/ACE_UI_language.pt_br.conf" + } + LanguageDefinition "{64482648FE89861A}" { + Code "ru_ru" + StringTableRuntime "{A68A3A408A19F620}Language/ACE_UI_language.ru_ru.conf" + } + LanguageDefinition "{64482648FE89863A}" { + Code "uk_ua" + StringTableRuntime "{2CD26FB6E6374875}Language/ACE_UI_language.uk_ua.conf" + } + LanguageDefinition "{64482648FE8985B6}" { + Code "zh_cn" + StringTableRuntime "{F662018BDF979868}Language/ACE_UI_language.zh_cn.conf" + } + } + } + } + } + } + GameProjectConfig XBOX_ONE { + } + GameProjectConfig XBOX_SERIES { + } + GameProjectConfig PS4 { + } + GameProjectConfig PS5 { + } + GameProjectConfig HEADLESS { + } + } +} \ No newline at end of file From d46dda7279302026439281679335d1d7e7705c11 Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Sat, 4 Jan 2025 03:49:49 +0100 Subject: [PATCH 8/9] Fix comment --- addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c b/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c index 9d4f83d5..a1d7fab0 100644 --- a/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c +++ b/addons/ui/scripts/Game/ACE_UI/UI/ACE_SettingsSubMenu.c @@ -29,7 +29,7 @@ modded class ACE_SettingsSubMenu : SCR_SettingsSubMenuBase Print("Radio setting 'Beep_Ch1' not found", LogLevel.WARNING); } - // Radio beep Ch1 + // Radio beep Ch2 SCR_SelectionWidgetComponent checkBoxBeep2 = SCR_SelectionWidgetComponent.GetSelectionComponent("Beep_Ch2", wRadioRoot); if (checkBoxBeep2) { From f0a5b8e5c59d77f0b34f0459e8a7685a2c04aaea Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Sat, 4 Jan 2025 03:55:27 +0100 Subject: [PATCH 9/9] Remove AFM leftovers from logs --- addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c b/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c index b3834d06..60209d2c 100644 --- a/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c +++ b/addons/ui/scripts/Game/ACE_UI/VON/SCR_VONController.c @@ -26,7 +26,7 @@ modded class SCR_VONController: ScriptComponent settings.Get(ACE_RadioSettingsModule.BEEPCH2, m_eBeepTypeCh2); settings.Get(ACE_RadioSettingsModule.BEEPCYCLE, m_bBeepCycle); - PrintFormat("SCR_VONController.AFM_LoadSettings: %1, %2", m_eBeepTypeCh1, m_eBeepTypeCh2, level: LogLevel.DEBUG); + PrintFormat("SCR_VONController.ACE_LoadSettings: %1, %2, %3", m_eBeepTypeCh1, m_eBeepTypeCh2, m_bBeepCycle, level: LogLevel.DEBUG); } //------------------------------------------------------------------------------------------------