diff --git a/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf
index 8c565e0..e8fd035 100644
--- a/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf
+++ b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf
@@ -4,7 +4,7 @@
* File: fnc_handleUIEvents.sqf
* Author: IDSolutions
* Date: 2026-01-28
- * Last Update: 2026-02-04
+ * Last Update: 2026-02-06
* Public: No
*
* Description:
@@ -41,7 +41,7 @@ switch (_event) do {
case "actor::open::vlocker": { [FORGE_Locker_Box, player, false] spawn AFUNC(arsenal,openBox) };
case "actor::open::phone": { hint "Phone interaction is not yet implemented."; };
case "actor::open::iplayer": { hint "Player interaction is not yet implemented." };
- case "actor::open::store": { hint "Store interaction is not yet implemented."; };
+ case "actor::open::store": { [] spawn EFUNC(store,openUI); };
default { hint format ["Unhandled UI event: %1", _event]; };
};
diff --git a/arma/client/addons/actor/ui/_site/script.js b/arma/client/addons/actor/ui/_site/script.js
index e1f1d58..a5392cf 100644
--- a/arma/client/addons/actor/ui/_site/script.js
+++ b/arma/client/addons/actor/ui/_site/script.js
@@ -75,6 +75,13 @@ const baseMenuItems = [
icon: "",
action: "actor::open::org",
},
+ {
+ id: "store",
+ title: "Store",
+ description: "Browse and purchase items from the store",
+ icon: "",
+ action: "actor::open::store",
+ },
];
const actionDefinitions = {
diff --git a/arma/client/addons/store/$PBOPREFIX$ b/arma/client/addons/store/$PBOPREFIX$
new file mode 100644
index 0000000..b7ca134
--- /dev/null
+++ b/arma/client/addons/store/$PBOPREFIX$
@@ -0,0 +1 @@
+forge\forge_client\addons\store
diff --git a/arma/client/addons/store/CfgEventHandlers.hpp b/arma/client/addons/store/CfgEventHandlers.hpp
new file mode 100644
index 0000000..c6e25db
--- /dev/null
+++ b/arma/client/addons/store/CfgEventHandlers.hpp
@@ -0,0 +1,19 @@
+class Extended_PreStart_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
+ };
+};
+
+class Extended_PreInit_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
+ clientInit = QUOTE(call COMPILE_SCRIPT(XEH_preInitClient));
+ };
+};
+
+class Extended_PostInit_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));
+ clientInit = QUOTE(call COMPILE_SCRIPT(XEH_postInitClient));
+ };
+};
diff --git a/arma/client/addons/store/README.md b/arma/client/addons/store/README.md
new file mode 100644
index 0000000..95092aa
--- /dev/null
+++ b/arma/client/addons/store/README.md
@@ -0,0 +1,4 @@
+forge_client_store
+===================
+
+Description for this addon
diff --git a/arma/client/addons/store/XEH_PREP.hpp b/arma/client/addons/store/XEH_PREP.hpp
new file mode 100644
index 0000000..5e46271
--- /dev/null
+++ b/arma/client/addons/store/XEH_PREP.hpp
@@ -0,0 +1,3 @@
+PREP(handleUIEvents);
+PREP(initStoreClass);
+PREP(openUI);
diff --git a/arma/client/addons/store/XEH_postInit.sqf b/arma/client/addons/store/XEH_postInit.sqf
new file mode 100644
index 0000000..421c54b
--- /dev/null
+++ b/arma/client/addons/store/XEH_postInit.sqf
@@ -0,0 +1 @@
+#include "script_component.hpp"
diff --git a/arma/client/addons/store/XEH_postInitClient.sqf b/arma/client/addons/store/XEH_postInitClient.sqf
new file mode 100644
index 0000000..d7019c2
--- /dev/null
+++ b/arma/client/addons/store/XEH_postInitClient.sqf
@@ -0,0 +1,3 @@
+#include "script_component.hpp"
+
+call FUNC(initStoreClass);
diff --git a/arma/client/addons/store/XEH_preInit.sqf b/arma/client/addons/store/XEH_preInit.sqf
new file mode 100644
index 0000000..dbef1ae
--- /dev/null
+++ b/arma/client/addons/store/XEH_preInit.sqf
@@ -0,0 +1,10 @@
+#include "script_component.hpp"
+
+PREP_RECOMPILE_START;
+#include "XEH_PREP.hpp"
+PREP_RECOMPILE_END;
+
+// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)];
+
+// #include "initSettings.inc.sqf"
+// #include "initKeybinds.inc.sqf"
diff --git a/arma/client/addons/store/XEH_preInitClient.sqf b/arma/client/addons/store/XEH_preInitClient.sqf
new file mode 100644
index 0000000..421c54b
--- /dev/null
+++ b/arma/client/addons/store/XEH_preInitClient.sqf
@@ -0,0 +1 @@
+#include "script_component.hpp"
diff --git a/arma/client/addons/store/XEH_preStart.sqf b/arma/client/addons/store/XEH_preStart.sqf
new file mode 100644
index 0000000..a51262a
--- /dev/null
+++ b/arma/client/addons/store/XEH_preStart.sqf
@@ -0,0 +1,2 @@
+#include "script_component.hpp"
+#include "XEH_PREP.hpp"
diff --git a/arma/client/addons/store/config.cpp b/arma/client/addons/store/config.cpp
new file mode 100644
index 0000000..8a8ad6f
--- /dev/null
+++ b/arma/client/addons/store/config.cpp
@@ -0,0 +1,21 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class ADDON {
+ author = AUTHOR;
+ authors[] = {"J.Schmidt"};
+ url = ECSTRING(main,url);
+ name = COMPONENT_NAME;
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "forge_client_main"
+ };
+ units[] = {};
+ weapons[] = {};
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgEventHandlers.hpp"
+#include "ui\RscCommon.hpp"
+#include "ui\RscStore.hpp"
diff --git a/arma/client/addons/store/functions/fnc_handleUIEvents.sqf b/arma/client/addons/store/functions/fnc_handleUIEvents.sqf
new file mode 100644
index 0000000..26bddf7
--- /dev/null
+++ b/arma/client/addons/store/functions/fnc_handleUIEvents.sqf
@@ -0,0 +1,38 @@
+#include "..\script_component.hpp"
+
+/*
+ * File: fnc_handleUIEvents.sqf
+ * Author: IDSolutions
+ * Date: 2026-01-28
+ * Last Update: 2026-02-06
+ * Public: No
+ *
+ * Description:
+ * Handles the UI events.
+ *
+ * Arguments:
+ * 0: [CONTROL] - The control that triggered the event
+ * 1: [BOOL] - Whether the event is from a confirm dialog
+ * 2: [STRING] - The message containing the event data
+ *
+ * Return Value:
+ * UI events handled [BOOL]
+ *
+ * Example:
+ * call forge_client_store_fnc_handleUIEvents;
+ */
+
+params ["_control", "_isConfirmDialog", "_message"];
+
+private _alert = fromJSON _message;
+private _event = _alert get "event";
+private _data = _alert get "data";
+
+diag_log format ["[FORGE:Client:Store] Handling UI event: %1 with data: %2", _event, _data];
+
+switch (_event) do {
+ case "store::close": { closeDialog 1; };
+ default { hint format ["Unhandled UI event: %1", _event]; };
+};
+
+true;
diff --git a/arma/client/addons/store/functions/fnc_initStoreClass.sqf b/arma/client/addons/store/functions/fnc_initStoreClass.sqf
new file mode 100644
index 0000000..e87c712
--- /dev/null
+++ b/arma/client/addons/store/functions/fnc_initStoreClass.sqf
@@ -0,0 +1,38 @@
+#include "..\script_component.hpp"
+
+/*
+ * File: fnc_initStoreClass.sqf
+ * Author: IDSolutions
+ * Date: 2026-01-28
+ * Last Update: 2026-02-06
+ * Public: Yes
+ *
+ * Description:
+ * Initializes the store class for managing store data.
+ * Provides methods for loading and applying store data.
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * Store class object [HASHMAP OBJECT]
+ *
+ * Example:
+ * call forge_client_store_fnc_initStoreClass
+ */
+
+#pragma hemtt ignore_variables ["_self"]
+GVAR(StoreClass) = createHashMapObject [[
+ ["#type", "IStoreClass"],
+ ["#create", {
+ _self set ["uid", getPlayerUID player];
+ _self set ["store", createHashMap];
+ _self set ["isLoaded", false];
+ _self set ["lastSave", time];
+
+ systemChat format ["Store class initialized for %1", (name player)];
+ diag_log "[FORGE:Client:Store] Store Class Initialized!";
+ }]
+]];
+
+GVAR(StoreClass)
diff --git a/arma/client/addons/store/functions/fnc_openUI.sqf b/arma/client/addons/store/functions/fnc_openUI.sqf
new file mode 100644
index 0000000..f5988ec
--- /dev/null
+++ b/arma/client/addons/store/functions/fnc_openUI.sqf
@@ -0,0 +1,35 @@
+#include "..\script_component.hpp"
+
+/*
+ * File: fnc_openUI.sqf
+ * Author: IDSolutions
+ * Date: 2026-01-28
+ * Last Update: 2026-02-06
+ * Public: No
+ *
+ * Description:
+ * Opens the store interface.
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * UI opened [BOOL]
+ *
+ * Example:
+ * call forge_client_store_fnc_openUI;
+ */
+
+private _display = createDialog ["RscStore", true];
+private _ctrl = _display displayCtrl 1004;
+
+_ctrl ctrlAddEventHandler ["JSDialog", {
+ params ["_control", "_isConfirmDialog", "_message"];
+
+ [_control, _isConfirmDialog, _message] call FUNC(handleUIEvents);
+}];
+
+_ctrl ctrlWebBrowserAction ["LoadFile", QPATHTOF2(ui\_site\index.html)];
+// _ctrl ctrlWebBrowserAction ["OpenDevConsole"];
+
+true;
diff --git a/arma/client/addons/store/initKeybinds.inc.sqf b/arma/client/addons/store/initKeybinds.inc.sqf
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/arma/client/addons/store/initKeybinds.inc.sqf
@@ -0,0 +1 @@
+
diff --git a/arma/client/addons/store/initSettings.inc.sqf b/arma/client/addons/store/initSettings.inc.sqf
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/arma/client/addons/store/initSettings.inc.sqf
@@ -0,0 +1 @@
+
diff --git a/arma/client/addons/store/script_component.hpp b/arma/client/addons/store/script_component.hpp
new file mode 100644
index 0000000..5416b30
--- /dev/null
+++ b/arma/client/addons/store/script_component.hpp
@@ -0,0 +1,9 @@
+#define COMPONENT store
+#define COMPONENT_BEAUTIFIED Store
+#include "\forge\forge_client\addons\main\script_mod.hpp"
+
+// #define DEBUG_MODE_FULL
+// #define DISABLE_COMPILE_CACHE
+// #define ENABLE_PERFORMANCE_COUNTERS
+
+#include "\forge\forge_client\addons\main\script_macros.hpp"
diff --git a/arma/client/addons/store/stringtable.xml b/arma/client/addons/store/stringtable.xml
new file mode 100644
index 0000000..f0a0c86
--- /dev/null
+++ b/arma/client/addons/store/stringtable.xml
@@ -0,0 +1,8 @@
+
+