diff --git a/bwa3_comp_ace/CfgEventhandlers.hpp b/bwa3_comp_ace/CfgEventhandlers.hpp
new file mode 100644
index 0000000..b928bc2
--- /dev/null
+++ b/bwa3_comp_ace/CfgEventhandlers.hpp
@@ -0,0 +1,5 @@
+class Extended_PreInit_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_FILE(XEH_preInit));
+ };
+};
diff --git a/bwa3_comp_ace/CfgMagazines.hpp b/bwa3_comp_ace/CfgMagazines.hpp
index 4eed5b5..9349dc3 100644
--- a/bwa3_comp_ace/CfgMagazines.hpp
+++ b/bwa3_comp_ace/CfgMagazines.hpp
@@ -8,6 +8,19 @@ class CfgMagazines {
ACE_isBelt = 1;
};
+ class 60Rnd_30mm_APFSDS_shells;
+ class BWA3_240Rnd_APFSDS_shells: 60Rnd_30mm_APFSDS_shells {
+ BWA3_MagazineRearmTime = 30;
+ };
+ class 140Rnd_30mm_MP_shells;
+ class BWA3_160Rnd_HE_shells: 140Rnd_30mm_MP_shells {
+ BWA3_MagazineRearmTime = 30;
+ };
+
+ class BWA3_160Rnd_ABM_shells: BWA3_160Rnd_HE_shells {
+ BWA3_MagazineRearmTime = 30;
+ };
+
class BWA3_DM31AT_Mag: CA_Magazine {
ACE_explosives_Placeable = 1;
useAction = 0;
diff --git a/bwa3_comp_ace/CfgVehicles.hpp b/bwa3_comp_ace/CfgVehicles.hpp
index 6aa1cf8..02b0970 100644
--- a/bwa3_comp_ace/CfgVehicles.hpp
+++ b/bwa3_comp_ace/CfgVehicles.hpp
@@ -73,6 +73,17 @@ class CfgVehicles {
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
position = "[0,-1.0,1.3]";
+ class BWA3_MagazineDialog {
+ displayName = "$STR_BWA3_Comp_Ace_ConfigureAmmoLoad";
+ selection = "";
+ position = "";
+ showDisabled = 0;
+ priority = 2;
+ distance = 4;
+ icon = "\A3\ui_f\data\igui\cfg\simpletasks\types\rearm_ca.paa";
+ condition = "[_target] call BWA3_fnc_canOpenMagazineDialog";
+ statement = "[_target,[0]] call BWA3_fnc_OpenMagazineDialog";
+ };
};
class BWA3_CamoNet_show {
@@ -160,6 +171,17 @@ class CfgVehicles {
class ACE_Actions: ACE_Actions {
class ACE_MainActions: ACE_MainActions {
position = "[0,-1.5,1.3]";
+ class BWA3_MagazineDialog {
+ displayName = "$STR_BWA3_Comp_Ace_ConfigureAmmoLoad";
+ selection = "";
+ position = "";
+ showDisabled = 0;
+ priority = 2;
+ distance = 4;
+ icon = "\A3\ui_f\data\igui\cfg\simpletasks\types\rearm_ca.paa";
+ condition = "[_target] call BWA3_fnc_canOpenMagazineDialog";
+ statement = "[_target,[0]] call BWA3_fnc_OpenMagazineDialog";
+ };
};
class BWA3_CamoNet_show {
diff --git a/bwa3_comp_ace/XEH_PREP.sqf b/bwa3_comp_ace/XEH_PREP.sqf
new file mode 100644
index 0000000..a17ded2
--- /dev/null
+++ b/bwa3_comp_ace/XEH_PREP.sqf
@@ -0,0 +1,3 @@
+PREP(canOpenMagazineDialog);
+PREP(OpenMagazineDialog);
+PREP(loadMagazines);
\ No newline at end of file
diff --git a/bwa3_comp_ace/XEH_preInit.sqf b/bwa3_comp_ace/XEH_preInit.sqf
new file mode 100644
index 0000000..6e56dd8
--- /dev/null
+++ b/bwa3_comp_ace/XEH_preInit.sqf
@@ -0,0 +1,21 @@
+#include "script_component.h"
+
+ADDON = false;
+
+#include "XEH_PREP.sqf"
+
+ADDON = true;
+
+If (isNil "BWA3_MagazineDialogDistance") then {
+ BWA3_MagazineDialogDistance = 25;
+};
+
+[
+ "BWA3_MagazineDialogAllowed",
+ "CHECKBOX",
+ "STR_BWA3_Comp_Ace_ConfigureMagazinesLoadAllowed",
+ localize "STR_BWA3_FactionClassBundeswehrName",
+ true,
+ 1
+] call CBA_Settings_fnc_init;
+
diff --git a/bwa3_comp_ace/config.cpp b/bwa3_comp_ace/config.cpp
index a9283c7..29b77ea 100644
--- a/bwa3_comp_ace/config.cpp
+++ b/bwa3_comp_ace/config.cpp
@@ -5,7 +5,7 @@ class CfgPatches {
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
- requiredAddons[] = {BWA3_Common, BWA3_Eagle, BWA3_Weapons, BWA3_VehicleWeapons, BWA3_Explosives, BWA3_Units, BWA3_Puma, BWA3_Leopard2A6M, BWA3_Tiger};
+ requiredAddons[] = {BWA3_Common, BWA3_Eagle, BWA3_Weapons, BWA3_VehicleWeapons, BWA3_Explosives, BWA3_Units, BWA3_Puma, BWA3_Leopard2A6M, BWA3_Tiger, ace_interact_menu};
versionAr[] = {1,0,0};
};
};
@@ -16,3 +16,5 @@ class CfgPatches {
#include "CfgAmmo.hpp"
#include "CfgGlasses.hpp"
#include "CfgRecoils.hpp"
+#include "CfgEventhandlers.hpp"
+#include "dialog.hpp"
diff --git a/bwa3_comp_ace/dialog.hpp b/bwa3_comp_ace/dialog.hpp
new file mode 100644
index 0000000..eef1924
--- /dev/null
+++ b/bwa3_comp_ace/dialog.hpp
@@ -0,0 +1,137 @@
+/*
+ copied macros from: "\a3\ui_f\hpp\defineCommon.inc"
+*/
+#define GUI_GRID_WAbs ((safezoneW / safezoneH) min 1.2)
+#define GUI_GRID_HAbs (GUI_GRID_WAbs / 1.2)
+#define GUI_GRID_W (GUI_GRID_WAbs / 40)
+#define GUI_GRID_H (GUI_GRID_HAbs / 25)
+#define GUI_GRID_CENTER_X (safezoneX + (safezoneW - GUI_GRID_WAbs)/2)
+#define GUI_GRID_CENTER_Y (safezoneY + (safezoneH - GUI_GRID_HAbs)/2)
+
+/*extern*/ class RscText;
+/*extern*/ class RscButtonMenu;
+
+class BWA3_MagazineDialog {
+ idd = IDD_BWA3_MAGAZINEDIALOG;
+ name = "$STR_BWA3_Comp_Ace_MagazineDialog";
+ enableSimulation = 1;
+
+ class Controls {
+ class TextTitlebar: RscText {
+ idc = IDC_BWA3_MAGAZINEDIALOG_TITLE;
+ text = "$STR_BWA3_Comp_Ace_MagazineDialog";
+ x = GUI_GRID_CENTER_X + GUI_GRID_W * 8;
+ y = GUI_GRID_CENTER_Y;
+ w = GUI_GRID_W * 24;
+ h = GUI_GRID_H;
+ sizeEx = GUI_GRID_H;
+ colorBackground[] = {"(profileNamespace getVariable ['GUI_BCG_RGB_R', 0.13])","(profileNamespace getVariable ['GUI_BCG_RGB_G', 0.54])","(profileNamespace getVariable ['GUI_BCG_RGB_B', 0.21])",1};
+ };
+ class BackgroundDialog: RscText {
+ idc = IDC_BWA3_MAGAZINEDIALOG_BACK;
+ x = GUI_GRID_CENTER_X + GUI_GRID_W * 8;
+ y = GUI_GRID_CENTER_Y + GUI_GRID_H;
+ w = GUI_GRID_W * 24;
+ h = GUI_GRID_H * 15;
+ colorBackground[] = {0,0,0,0.5};
+ text = "";
+ };
+ class ButtonApply: RscButtonMenu {
+ idc = 1;
+ text = "$STR_ui_debug_but_apply";
+ x = GUI_GRID_CENTER_X + GUI_GRID_W * 24;
+ y = GUI_GRID_CENTER_Y + GUI_GRID_H * 16;
+ w = GUI_GRID_W * 8;
+ h = GUI_GRID_H;
+ };
+ class ButtonClose: ButtonApply {
+ idc = 2;
+ text = "$STR_disp_cancel";
+ x = GUI_GRID_CENTER_X + GUI_GRID_W * 16;
+ };
+ class ControlsTable {
+ idc = IDC_BWA3_MAGAZINEDIALOG_CONTROLSTABLE;
+ x = GUI_GRID_CENTER_X + GUI_GRID_W * 9;
+ y = GUI_GRID_CENTER_Y + GUI_GRID_H * 2;
+ w = GUI_GRID_W * 22;
+ h = GUI_GRID_H * 13;
+
+ type = 19;
+ style = 0x10;
+
+ lineSpacing = 0.1 * GUI_GRID_H;
+ rowHeight = 1.1 * GUI_GRID_H;
+ headerHeight = 1.2 * GUI_GRID_H;
+
+ firstIDC = IDC_BWA3_MAGAZINEDIALOG_CONTROLSTABLE_START;
+ lastIDC = IDC_BWA3_MAGAZINEDIALOG_CONTROLSTABLE_END;
+
+ selectedRowColorFrom[] = {0.7, 0.85, 1, 0.25};
+ selectedRowColorTo[] = {0.7, 0.85, 1, 0.5};
+ selectedRowAnimLength = 1.2;
+
+ class VScrollBar {
+ color[] = {1,1,1,0.6};
+ colorActive[] = {1,1,1,1};
+ colorDisabled[] = {1,1,1,0.3};
+ thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
+ arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
+ arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
+ border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
+ shadow = 0;
+ scrollSpeed = 0.06;
+ width = GUI_GRID_W * 0.8;
+ autoScrollEnabled = 0;
+ autoScrollDelay = 1;
+ autoScrollRewind = 1;
+ autoScrollSpeed = 1;
+ };
+ class HScrollBar: VScrollBar {
+ height = 0;
+ width = 0;
+ };
+ class HeaderTemplate {
+ class HeaderBackground {
+ controlBaseClassPath[] = {"RscText"};
+ columnX = 0;
+ columnW = GUI_GRID_W * 22;
+ controlOffsetY = 0;
+ };
+ class Column1 {
+ controlBaseClassPath[] = {"RscText"};
+ columnX = GUI_GRID_W * 3;
+ columnW = GUI_GRID_W * 16;
+ controlOffsetY = 0;
+ };
+ };
+ class RowTemplate {
+ class RowBackground {
+ controlBaseClassPath[] = {"RscText"};
+ columnX = 0;
+ columnW = GUI_GRID_W * 22;
+ controlOffsetY = 0;
+ };
+ class Column1 {
+ controlBaseClassPath[] = {"RscText"};
+ columnX = 0;
+ columnW = 7 * GUI_GRID_W;
+ controlOffsetY = 0;
+ };
+ class Column2 {
+ controlBaseClassPath[] = {"RscXSliderH"};
+ columnX = 8 * GUI_GRID_W;
+ columnW = 11 * GUI_GRID_W;
+ controlOffsetY = 0.3 * GUI_GRID_H;
+ controlH = 0.8 * GUI_GRID_H;
+ };
+ class Column3 {
+ controlBaseClassPath[] = {"RscEdit"};
+ columnX = 20 * GUI_GRID_W;
+ columnW = 2 * GUI_GRID_W;
+ controlOffsetY = 0.3 * GUI_GRID_H;
+ controlH = 1 * GUI_GRID_H;
+ };
+ };
+ };
+ };
+};
diff --git a/bwa3_comp_ace/functions/fn_canOpenMagazineDialog.sqf b/bwa3_comp_ace/functions/fn_canOpenMagazineDialog.sqf
new file mode 100644
index 0000000..921eb25
--- /dev/null
+++ b/bwa3_comp_ace/functions/fn_canOpenMagazineDialog.sqf
@@ -0,0 +1,7 @@
+params ["_target"];
+
+private _vehicles = nearestObjects [_target, ["Air", "LandVehicle", "Slingload_base_F", "ReammoBox_F"], BWA3_MagazineDialogDistance];
+private _filter = ["transportAmmo", "ace_rearm_defaultSupply"] select (["ace_rearm"] call ace_common_fnc_isModLoaded);
+private _rearmVehicles = {(getNumber (configFile >> "CfgVehicles" >> typeOf _x >> _filter)) > 0} count _vehicles;
+
+(_rearmVehicles > 0 && {[ace_player, _target] call ace_common_fnc_canInteractWith} && {missionNamespace getVariable ["BWA3_MagazineDialogAllowed", true]})
diff --git a/bwa3_comp_ace/functions/fn_loadMagazines.sqf b/bwa3_comp_ace/functions/fn_loadMagazines.sqf
new file mode 100644
index 0000000..79e3cb3
--- /dev/null
+++ b/bwa3_comp_ace/functions/fn_loadMagazines.sqf
@@ -0,0 +1,55 @@
+params ["_vehicle", "_turret", ["_magazines", [], [[]]]];
+
+If (_magazines isEqualTo []) exitWith {};
+
+// magazine specific reloadTime
+private _reloadTime = getNumber(configFile >> "CfgMagazines" >> ((_magazines select 0) select 0) >> "BWA3_MagazineRearmTime");
+If (_reloadTime == 0) then {_reloadTime = 7;};
+
+private _curMagazine = (_magazines select 0) select 0;
+private _addMagazine = ({(_x select 0) isEqualTo _curMagazine} count ((magazinesAllTurrets _vehicle) select {((_x select 1) isEqualTo _turret) && ((_x select 2) > 0)})) < ((_magazines select 0) select 1);
+
+
+
+[
+ _reloadTime,
+ [_vehicle, _turret, _magazines],
+ {
+ (_this select 0) params ["_vehicle", "_turret", "_magazines"];
+
+ (_magazines select 0) params ["_curMagazine", "_targetAmount"];
+
+ private _curAmount = {(_x select 0) isEqualTo _curMagazine} count ((magazinesAllTurrets _vehicle) select {((_x select 1) isEqualTo _turret) && ((_x select 2) > 0)});
+
+ private _modify = _targetAmount - _curAmount;
+
+ If (_modify < 0) then {
+ _vehicle removeMagazinesTurret [_curMagazine, _turret];
+ for "_i" from 1 to (_curAmount - 1) do {
+ _vehicle addMagazineTurret [_curMagazine, _turret];
+ };
+ };
+ If (_modify > 0) then {
+ _vehicle removeMagazinesTurret [_curMagazine, _turret];
+ for "_i" from (_curAmount + 1) to 1 step -1 do {
+ _vehicle addMagazineTurret [_curMagazine, _turret];
+ };
+ };
+ If (abs _modify <= 1) then {
+ _magazines deleteAt 0;
+ };
+
+ [_vehicle, _turret, _magazines] call BWA3_fnc_loadMagazines;
+ },
+ {
+ [localize "STR_BWA3_Comp_Ace_loadingStopped", false, 5] call ace_common_fnc_displayText;
+ },
+ If (_addMagazine) then {
+ format[localize "STR_BWA3_Comp_Ace_addMagazine", getText(configFile >> "CfgMagazines" >> _curMagazine >> "displayNameShort")];
+ } else {
+ format[localize "STR_BWA3_Comp_Ace_removeMagazine", getText(configFile >> "CfgMagazines" >> _curMagazine >> "displayNameShort")];
+ },
+ {
+ [ACE_player, _vehicle] call ace_common_fnc_canInteractWith
+ }
+] call ace_common_fnc_progressBar;
diff --git a/bwa3_comp_ace/functions/fn_openMagazineDialog.sqf b/bwa3_comp_ace/functions/fn_openMagazineDialog.sqf
new file mode 100644
index 0000000..3083bac
--- /dev/null
+++ b/bwa3_comp_ace/functions/fn_openMagazineDialog.sqf
@@ -0,0 +1,132 @@
+#include "\BWA3_Comp_ACE\script_component.h"
+
+params [["_vehicle", objNull, [objNull]], ["_turret", [0], [[]]]];
+
+If ((!alive _vehicle) || {!(createDialog "BWA3_MagazineDialog")}) exitWith {};
+
+disableSerialization;
+
+private _dialog = findDisplay IDD_BWA3_MAGAZINEDIALOG;
+private _ctrlTable = _dialog displayCtrl IDC_BWA3_MAGAZINEDIALOG_CONTROLSTABLE;
+
+_dialog setVariable ["BWA3_comp_ace_magazineDialog_vehicle", _vehicle];
+_dialog setVariable ["BWA3_comp_ace_magazineDialog_turret", _turret];
+
+(ctAddHeader _ctrlTable) params ["_headerindex", "_headercontrols"];
+_headercontrols params ["_background", "_headertext"];
+_background ctrlSetBackgroundColor [
+ (profileNamespace getVariable ['GUI_BCG_RGB_R', 0.13]),
+ (profileNamespace getVariable ['GUI_BCG_RGB_G', 0.54]),
+ (profileNamespace getVariable ['GUI_BCG_RGB_B', 0.21]),
+ 0.5
+];
+_headertext ctrlsetText getText(configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName");
+
+private _hash = [] call CBA_fnc_hashCreate;
+_dialog setVariable ["BWA3_comp_ace_magazineDialog_hash", _hash];
+private _MaxMagazineAmount = _vehicle getVariable ["BWA3_maxMagazineLoad", count (getArray((_this call CBA_fnc_getTurret) >> "magazines"))];
+_dialog setVariable ["BWA3_comp_ace_magazineDialog_MaxMagazineAmount", _MaxMagazineAmount];
+private _Weapons = _vehicle weaponsTurret _turret;
+private _curMagazinesTurret = (((magazinesAllTurrets _vehicle) select {((_x select 1) isEqualTo _turret) && ((_x select 2) > 0)})) apply {_x select 0};
+
+{
+ private _possibleMagazines = getArray(configFile >> "CfgWeapons" >> _x >> "magazines");
+ _possibleMagazines = _possibleMagazines select {
+ (_x isKindOf ["VehicleMagazine", configFile >> "CfgMagazines"]) ||
+ {getNumber(configFile >> "CfgMagazines" >> _x >> "scope") isEqualTo 1}
+ };
+
+ {
+ private _curMag = _x;
+ [_hash, _curMag, [({_x == _curMag} count _curMagazinesTurret) min _MaxMagazineAmount]] call CBA_fnc_hashSet;
+ nil
+ } count _possibleMagazines;
+ nil
+} count (_vehicle weaponsTurret _turret);
+
+#define UPDATE_VALUES private _curMagazinesAmout = ((ctrlParent _ctrl) getVariable "BWA3_comp_ace_magazineDialog_MaxMagazineAmount") - _value; \
+{ \
+ ([_hash, _x] call CBA_fnc_hashGet) params ["_curAmount", "_ctrlSlider", "_ctrlEdit"]; \
+ If ((_curMagazinesAmout - _curAmount) <= 0) then { \
+ _curAmount = _curMagazinesAmout; \
+ _ctrlSlider sliderSetPosition _curAmount; \
+ _ctrlEdit ctrlsetText str _curAmount; \
+ [_hash, _x, [_curAmount, _ctrlSlider, _ctrlEdit]] call CBA_fnc_hashSet; \
+ }; \
+ _curMagazinesAmout = _curMagazinesAmout - _curAmount; \
+ nil \
+} count (([_hash] call CBA_fnc_hashKeys) - [_curMagazine]); \
+[_hash, _curMagazine, [_value, _ctrlSlider, _ctrlEdit]] call CBA_fnc_hashSet
+
+#define GET_VALUES private _curMagazine = _ctrl getVariable "BWA3_comp_ace_magazineDialog_magazineClass"; \
+private _hash = (ctrlParent _ctrl) getVariable "BWA3_comp_ace_magazineDialog_hash"; \
+([_hash, _curMagazine] call CBA_fnc_hashGet) params ["_curAmount", "_ctrlSlider", "_ctrlEdit"]
+
+{
+ private _curMagazine = _x;
+ ([_hash, _curMagazine] call CBA_fnc_hashGet) params ["_curMagazineAmount"];
+
+ (ctAddRow _ctrlTable) params ["_index","_controls"];
+ _controls params ["_background","_ctrlText","_ctrlSlider","_ctrlEdit"];
+ _ctrlText ctrlsetText getText(configFile >> "CfgMagazines" >> _curMagazine >> "displayNameShort");
+
+ _ctrlSlider sliderSetRange [0, _MaxMagazineAmount];
+ _ctrlSlider sliderSetPosition _curMagazineAmount;
+ _ctrlSlider setVariable ["BWA3_comp_ace_magazineDialog_magazineClass", _curMagazine];
+
+ _ctrlSlider ctrlAddEventHandler ["SliderPosChanged", {
+ params ["_ctrl", "_value"];
+ GET_VALUES;
+ _value = round _value;
+ _ctrlEdit ctrlSetText (str _value);
+ UPDATE_VALUES;
+ }];
+
+ _ctrlEdit ctrlSetText str _curMagazineAmount;
+ _ctrlEdit setVariable ["BWA3_comp_ace_magazineDialog_magazineClass", _curMagazine];
+ _ctrlEdit ctrlAddEventHandler ["KeyUp", {
+ params ["_ctrl"];
+ GET_VALUES;
+ private _value = parseNumber ctrlText _ctrlEdit;
+ _ctrlSlider sliderSetPosition (round _value);
+ UPDATE_VALUES;
+ }];
+ _ctrlEdit ctrlAddEventHandler ["KillFocus", {
+ params ["_ctrl"];
+ GET_VALUES;
+ private _value = sliderPosition _ctrlSlider;
+ _value = round _value;
+ _ctrlEdit ctrlSetText (str _value);
+ UPDATE_VALUES;
+ }];
+
+ [_hash, _curMagazine, [_curMagazineAmount, _ctrlSlider, _ctrlEdit]] call CBA_fnc_hashSet;
+ nil
+} count ([_hash] call CBA_fnc_hashKeys);
+
+_dialog displayAddEventHandler ["Unload", {
+ params ["_dialog","_exitCode"];
+ if !(_exitCode isEqualTo 1) exitWith {};
+
+ private _vehicle = _dialog getVariable "BWA3_comp_ace_magazineDialog_vehicle";
+ private _turret = _dialog getVariable "BWA3_comp_ace_magazineDialog_turret";
+ private _hash = _dialog getVariable "BWA3_comp_ace_magazineDialog_hash";
+
+ private _magazines = [];
+ {
+ private _curMagazine = _x;
+ ([_hash, _curMagazine] call CBA_fnc_hashGet) params ["_amount"];
+
+ // make sure to remove magazines before adding magazines
+ private _curAmount = {(_x select 0) isEqualTo _curMagazine} count ((magazinesAllTurrets _vehicle) select {((_x select 1) isEqualTo _turret) && ((_x select 2) > 0)});
+ If (_curAmount < _amount) then {
+ _magazines pushBack [_curMagazine, _amount];
+ };
+ If (_curAmount > _amount) then {
+ _magazines = [[_curMagazine, _amount]] + _magazines;
+ };
+ nil;
+ } count ([_hash] call CBA_fnc_hashKeys);
+
+ [BWA3_fnc_loadMagazines, [_vehicle, _turret, _magazines]] call CBA_fnc_execNextFrame;
+}];
diff --git a/bwa3_comp_ace/script_component.h b/bwa3_comp_ace/script_component.h
index 4f4863b..e66ecd0 100644
--- a/bwa3_comp_ace/script_component.h
+++ b/bwa3_comp_ace/script_component.h
@@ -1,3 +1,10 @@
-//#include "\bwa3_common\script_component.h"
+#include "script_macros.h"
#define ADDON BWA3_Comp_ACE
+
+#define IDD_BWA3_MAGAZINEDIALOG 10815
+#define IDC_BWA3_MAGAZINEDIALOG_TITLE 10816
+#define IDC_BWA3_MAGAZINEDIALOG_BACK 10817
+#define IDC_BWA3_MAGAZINEDIALOG_CONTROLSTABLE 10818
+#define IDC_BWA3_MAGAZINEDIALOG_CONTROLSTABLE_START 10819
+#define IDC_BWA3_MAGAZINEDIALOG_CONTROLSTABLE_END 10900
diff --git a/bwa3_comp_ace/script_macros.h b/bwa3_comp_ace/script_macros.h
new file mode 100644
index 0000000..ea2d676
--- /dev/null
+++ b/bwa3_comp_ace/script_macros.h
@@ -0,0 +1,82 @@
+
+#define MACRO_ADDWEAPON(WEAPON,COUNT) class _xx_##WEAPON { \
+ weapon = #WEAPON; \
+ count = COUNT; \
+}
+
+#define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \
+ name = #ITEM; \
+ count = COUNT; \
+}
+
+#define MACRO_ADDMAGAZINE(MAGAZINE,COUNT) class _xx_##MAGAZINE { \
+ magazine = #MAGAZINE; \
+ count = COUNT; \
+}
+
+#define MACRO_ADDBACKPACK(BACKPACK,COUNT) class _xx_##BACKPACK { \
+ backpack = #BACKPACK; \
+ count = COUNT; \
+}
+
+#define QUOTE(text) #text
+
+#define COMPILE_FILE(func) compile preprocessFileLineNumbers '\ADDON\func##.sqf'
+
+#ifdef DISABLE_FUNCTION_CACHE
+ #define PREP(func) BWA3_fnc_##func = compileFinal preprocessFileLineNumbers '\ADDON\functions\fn_##func.sqf'
+#else
+ #define PREP(func) BWA3_fnc_##func = if (isNil {uiNamespace getVariable 'BWA3_fnc_##func'}) then {compileFinal preprocessFileLineNumbers '\ADDON\functions\fn_##func.sqf'} else {uiNamespace getVariable 'BWA3_fnc_##func'}
+#endif
+
+#define FORMAT_1(message,arg1) format [message, arg1]
+#define FORMAT_2(message,arg1,arg2) format [message, arg1, arg2]
+#define FORMAT_3(message,arg1,arg2,arg3) format [message, arg1, arg2, arg3]
+#define FORMAT_4(message,arg1,arg2,arg3,arg4) format [message, arg1, arg2, arg3, arg4]
+#define FORMAT_5(message,arg1,arg2,arg3,arg4,arg5) format [message, arg1, arg2, arg3, arg4, arg5]
+#define FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6) format [message, arg1, arg2, arg3, arg4, arg5, arg6]
+#define FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) format [message, arg1, arg2, arg3, arg4, arg5, arg6, arg7]
+#define FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) format [message, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8]
+
+#define BWA3_LOG(level,message) diag_log text BWA3_LOGFORMAT(level,message)
+#define BWA3_LOGFORMAT(level,message) FORMAT_2(QUOTE([BWA3] %1: %2),level,message)
+
+#define BWA3_LOGERROR(message) BWA3_LOG("ERROR",message)
+#define BWA3_LOGERROR_1(message,arg1) BWA3_LOGERROR(FORMAT_1(message,arg1))
+#define BWA3_LOGERROR_2(message,arg1,arg2) BWA3_LOGERROR(FORMAT_2(message,arg1,arg2))
+#define BWA3_LOGERROR_3(message,arg1,arg2,arg3) BWA3_LOGERROR(FORMAT_3(message,arg1,arg2,arg3))
+#define BWA3_LOGERROR_4(message,arg1,arg2,arg3,arg4) BWA3_LOGERROR(FORMAT_4(message,arg1,arg2,arg3,arg4))
+#define BWA3_LOGERROR_5(message,arg1,arg2,arg3,arg4,arg5) BWA3_LOGERROR(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5))
+#define BWA3_LOGERROR_6(message,arg1,arg2,arg3,arg4,arg5,arg6) BWA3_LOGERROR(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6))
+#define BWA3_LOGERROR_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) BWA3_LOGERROR(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7))
+#define BWA3_LOGERROR_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) BWA3_LOGERROR(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8))
+
+#define BWA3_LOGWARNING(message) BWA3_LOG("WARNING",message)
+#define BWA3_LOGWARNING_1(message,arg1) BWA3_LOGWARNING(FORMAT_1(message,arg1))
+#define BWA3_LOGWARNING_2(message,arg1,arg2) BWA3_LOGWARNING(FORMAT_2(message,arg1,arg2))
+#define BWA3_LOGWARNING_3(message,arg1,arg2,arg3) BWA3_LOGWARNING(FORMAT_3(message,arg1,arg2,arg3))
+#define BWA3_LOGWARNING_4(message,arg1,arg2,arg3,arg4) BWA3_LOGWARNING(FORMAT_4(message,arg1,arg2,arg3,arg4))
+#define BWA3_LOGWARNING_5(message,arg1,arg2,arg3,arg4,arg5) BWA3_LOGWARNING(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5))
+#define BWA3_LOGWARNING_6(message,arg1,arg2,arg3,arg4,arg5,arg6) BWA3_LOGWARNING(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6))
+#define BWA3_LOGWARNING_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) BWA3_LOGWARNING(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7))
+#define BWA3_LOGWARNING_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) BWA3_LOGWARNING(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8))
+
+#define BWA3_LOGINFO(message) BWA3_LOG("INFO",message)
+#define BWA3_LOGINFO_1(message,arg1) BWA3_LOGINFO(FORMAT_1(message,arg1))
+#define BWA3_LOGINFO_2(message,arg1,arg2) BWA3_LOGINFO(FORMAT_2(message,arg1,arg2))
+#define BWA3_LOGINFO_3(message,arg1,arg2,arg3) BWA3_LOGINFO(FORMAT_3(message,arg1,arg2,arg3))
+#define BWA3_LOGINFO_4(message,arg1,arg2,arg3,arg4) BWA3_LOGINFO(FORMAT_4(message,arg1,arg2,arg3,arg4))
+#define BWA3_LOGINFO_5(message,arg1,arg2,arg3,arg4,arg5) BWA3_LOGINFO(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5))
+#define BWA3_LOGINFO_6(message,arg1,arg2,arg3,arg4,arg5,arg6) BWA3_LOGINFO(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6))
+#define BWA3_LOGINFO_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) BWA3_LOGINFO(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7))
+#define BWA3_LOGINFO_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) BWA3_LOGINFO(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8))
+
+#define BWA3_LOGDEBUG(message) BWA3_LOG("DEBUG",message)
+#define BWA3_LOGDEBUG_1(message,arg1) BWA3_LOGDEBUG(FORMAT_1(message,arg1))
+#define BWA3_LOGDEBUG_2(message,arg1,arg2) BWA3_LOGDEBUG(FORMAT_2(message,arg1,arg2))
+#define BWA3_LOGDEBUG_3(message,arg1,arg2,arg3) BWA3_LOGDEBUG(FORMAT_3(message,arg1,arg2,arg3))
+#define BWA3_LOGDEBUG_4(message,arg1,arg2,arg3,arg4) BWA3_LOGDEBUG(FORMAT_4(message,arg1,arg2,arg3,arg4))
+#define BWA3_LOGDEBUG_5(message,arg1,arg2,arg3,arg4,arg5) BWA3_LOGDEBUG(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5))
+#define BWA3_LOGDEBUG_6(message,arg1,arg2,arg3,arg4,arg5,arg6) BWA3_LOGDEBUG(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6))
+#define BWA3_LOGDEBUG_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) BWA3_LOGDEBUG(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7))
+#define BWA3_LOGDEBUG_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) BWA3_LOGDEBUG(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8))
diff --git a/bwa3_comp_ace/stringtable.xml b/bwa3_comp_ace/stringtable.xml
index 49d08aa..eefb522 100644
--- a/bwa3_comp_ace/stringtable.xml
+++ b/bwa3_comp_ace/stringtable.xml
@@ -17,5 +17,29 @@
磁性感应器 (底部攻击)
磁性感應器 (底部攻擊)
+
+ Ammunition Dialog
+ Munitionsauswahl
+
+
+ Configure Ammo Load
+ Munitionsauswahl
+
+
+ Magazine dialog allowed
+ Munitionsauswahl erlaubt
+
+
+ Loading %1...
+ Lade %1...
+
+
+ Removing %1...
+ Entlade %1...
+
+
+ Rearming stopped
+ Aufmunitionieren abgebrochen
+