From 7ce6c0bcad4fd0b6d38b9b40937427f7322bc320 Mon Sep 17 00:00:00 2001 From: Jacob Schmidt Date: Sat, 22 Nov 2025 22:43:37 -0600 Subject: [PATCH] Initial commit --- .editorconfig | 12 + .gitattributes | 13 + .gitea/CONTRIBUTING.md | 12 + .gitea/ISSUE_TEMPLATE/bug-report.md | 25 + .gitea/ISSUE_TEMPLATE/feature-request.md | 15 + .gitea/PULL_REQUEST_TEMPLATE.md | 12 + .gitea/assets/placeholder.txt | 1 + .gitignore | 26 + Architecture_Diagram.md | 131 ++ Cargo.toml | 18 + LICENSE.md | 119 ++ README.md | 294 +++ arma/client/.editorconfig | 12 + arma/client/.gitattributes | 13 + arma/client/.github/CONTRIBUTING.md | 12 + .../.github/ISSUE_TEMPLATE/bug-report.md | 25 + .../.github/ISSUE_TEMPLATE/feature-request.md | 15 + arma/client/.github/PULL_REQUEST_TEMPLATE.md | 12 + arma/client/.github/assets/placeholder.txt | 1 + arma/client/.github/workflows/check.yml | 28 + arma/client/.gitignore | 17 + .../.hemtt/commands/ctrlWebBrowserAction.yml | 28 + .../hooks/post_release/01_move_readme.rhai | 13 + .../hooks/pre_build/01_set_version.rhai | 26 + arma/client/.hemtt/launch.toml | 16 + arma/client/.hemtt/lints.toml | 40 + arma/client/.hemtt/project.toml | 24 + arma/client/.hemtt/scripts/update_build.rhai | 19 + arma/client/.hemtt/scripts/update_minor.rhai | 23 + arma/client/.hemtt/scripts/update_patch.rhai | 20 + arma/client/LICENSE.md | 119 ++ arma/client/README.md | 27 + arma/client/addons/actor/$PBOPREFIX$ | 1 + arma/client/addons/actor/CfgEventHandlers.hpp | 19 + arma/client/addons/actor/README.md | 4 + arma/client/addons/actor/XEH_PREP.hpp | 3 + arma/client/addons/actor/XEH_postInit.sqf | 1 + .../addons/actor/XEH_postInitClient.sqf | 42 + arma/client/addons/actor/XEH_preInit.sqf | 10 + .../client/addons/actor/XEH_preInitClient.sqf | 1 + arma/client/addons/actor/XEH_preStart.sqf | 3 + arma/client/addons/actor/config.cpp | 21 + .../actor/functions/fnc_handleUIEvents.sqf | 45 + .../actor/functions/fnc_initActorClass.sqf | 165 ++ .../addons/actor/functions/fnc_openUI.sqf | 31 + arma/client/addons/actor/initKeybinds.inc.sqf | 8 + arma/client/addons/actor/initSettings.inc.sqf | 24 + arma/client/addons/actor/script_component.hpp | 9 + arma/client/addons/actor/stringtable.xml | 38 + arma/client/addons/actor/ui/RscActorMenu.hpp | 21 + arma/client/addons/actor/ui/RscCommon.hpp | 98 + arma/client/addons/actor/ui/_site/garage.css | 605 ++++++ arma/client/addons/actor/ui/_site/garage.html | 205 ++ arma/client/addons/actor/ui/_site/garage.js | 317 +++ arma/client/addons/actor/ui/_site/index.html | 70 + arma/client/addons/actor/ui/_site/script.js | 424 ++++ .../addons/actor/ui/_site/script.js.bak | 417 ++++ arma/client/addons/actor/ui/_site/store.css | 567 +++++ arma/client/addons/actor/ui/_site/store.html | 149 ++ arma/client/addons/actor/ui/_site/store.js | 339 +++ arma/client/addons/actor/ui/_site/style.css | 116 ++ .../addons/actor/ui/_site/style.css.bak | 186 ++ arma/client/addons/bank/$PBOPREFIX$ | 1 + arma/client/addons/bank/CfgEventHandlers.hpp | 19 + arma/client/addons/bank/README.md | 4 + arma/client/addons/bank/XEH_PREP.hpp | 3 + arma/client/addons/bank/XEH_postInit.sqf | 1 + .../client/addons/bank/XEH_postInitClient.sqf | 28 + arma/client/addons/bank/XEH_preInit.sqf | 10 + arma/client/addons/bank/XEH_preInitClient.sqf | 1 + arma/client/addons/bank/XEH_preStart.sqf | 3 + arma/client/addons/bank/config.cpp | 21 + .../bank/functions/fnc_handleUIEvents.sqf | 33 + .../bank/functions/fnc_initBankClass.sqf | 88 + .../addons/bank/functions/fnc_openUI.sqf | 31 + arma/client/addons/bank/initKeybinds.inc.sqf | 1 + arma/client/addons/bank/initSettings.inc.sqf | 1 + arma/client/addons/bank/script_component.hpp | 9 + arma/client/addons/bank/stringtable.xml | 8 + arma/client/addons/bank/ui/RscBank.hpp | 21 + arma/client/addons/bank/ui/RscCommon.hpp | 98 + arma/client/addons/bank/ui/_site/atm.css | 585 ++++++ arma/client/addons/bank/ui/_site/atm.html | 255 +++ arma/client/addons/bank/ui/_site/atm.js | 284 +++ arma/client/addons/bank/ui/_site/index.html | 237 +++ arma/client/addons/bank/ui/_site/script.js | 248 +++ arma/client/addons/bank/ui/_site/style.css | 471 +++++ arma/client/addons/common/$PBOPREFIX$ | 1 + .../client/addons/common/CfgEventHandlers.hpp | 11 + arma/client/addons/common/README.md | 4 + arma/client/addons/common/XEH_PREP.hpp | 1 + arma/client/addons/common/XEH_preInit.sqf | 10 + arma/client/addons/common/XEH_preStart.sqf | 3 + arma/client/addons/common/config.cpp | 19 + .../client/addons/common/script_component.hpp | 9 + arma/client/addons/common/stringtable.xml | 8 + arma/client/addons/main/$PBOPREFIX$ | 1 + arma/client/addons/main/CfgSettings.hpp | 13 + arma/client/addons/main/README.md | 4 + arma/client/addons/main/config.cpp | 19 + .../addons/main/data/hpp/defineDIKCodes.hpp | 33 + .../addons/main/data/ui/placeholder.txt | 1 + arma/client/addons/main/script_component.hpp | 9 + arma/client/addons/main/script_macros.hpp | 148 ++ arma/client/addons/main/script_mod.hpp | 26 + arma/client/addons/main/script_version.hpp | 4 + arma/client/addons/main/stringtable.xml | 24 + arma/client/addons/org/$PBOPREFIX$ | 1 + arma/client/addons/org/CfgEventHandlers.hpp | 19 + arma/client/addons/org/README.md | 4 + arma/client/addons/org/XEH_PREP.hpp | 3 + arma/client/addons/org/XEH_postInit.sqf | 1 + arma/client/addons/org/XEH_postInitClient.sqf | 28 + arma/client/addons/org/XEH_preInit.sqf | 10 + arma/client/addons/org/XEH_preInitClient.sqf | 1 + arma/client/addons/org/XEH_preStart.sqf | 3 + arma/client/addons/org/config.cpp | 21 + .../org/functions/fnc_handleUIEvents.sqf | 33 + .../addons/org/functions/fnc_initOrgClass.sqf | 81 + .../addons/org/functions/fnc_openUI.sqf | 31 + arma/client/addons/org/initKeybinds.inc.sqf | 1 + arma/client/addons/org/initSettings.inc.sqf | 1 + arma/client/addons/org/script_component.hpp | 9 + arma/client/addons/org/stringtable.xml | 8 + arma/client/addons/org/ui/RscCommon.hpp | 98 + arma/client/addons/org/ui/RscOrg.hpp | 21 + arma/client/addons/org/ui/_site.7z | Bin 0 -> 8973 bytes arma/client/addons/org/ui/_site/index.html | 243 +++ arma/client/addons/org/ui/_site/script.js | 179 ++ arma/client/addons/org/ui/_site/style.css | 469 +++++ arma/client/client.code-workspace | 22 + arma/client/docs/README.md | 49 + arma/client/extra/example_addon/$PBOPREFIX$ | 1 + .../extra/example_addon/CfgEventHandlers.hpp | 11 + arma/client/extra/example_addon/README.md | 4 + arma/client/extra/example_addon/XEH_PREP.hpp | 1 + .../extra/example_addon/XEH_preInit.sqf | 10 + .../extra/example_addon/XEH_preStart.sqf | 3 + arma/client/extra/example_addon/config.cpp | 19 + .../example_addon/functions/fnc_empty.sqf | 16 + .../extra/example_addon/initKeybinds.inc.sqf | 8 + .../extra/example_addon/initSettings.inc.sqf | 6 + .../extra/example_addon/script_component.hpp | 9 + .../extra/example_addon/stringtable.xml | 8 + arma/client/extra/example_subaddon/config.cpp | 18 + .../example_subaddon/script_component.hpp | 4 + arma/client/icon_128_ca.paa | Bin 0 -> 22016 bytes arma/client/icon_128_highlight_ca.paa | Bin 0 -> 22016 bytes arma/client/icon_64_ca.paa | Bin 0 -> 5625 bytes .../include/a3/ui_f/hpp/defineDIKCodes.inc | 190 ++ .../cba/addons/main/script_macros_common.hpp | 1833 +++++++++++++++++ .../include/x/cba/addons/xeh/script_xeh.hpp | 118 ++ arma/client/meta.cpp | 4 + arma/client/mod.cpp | 15 + arma/client/title_ca.paa | Bin 0 -> 756068 bytes arma/client/tools/config_style_checker.py | 187 ++ arma/client/tools/release.bat | 4 + arma/client/tools/release_patch.bat | 4 + arma/example_data.sqf | 5 + arma/server/.editorconfig | 12 + arma/server/.gitattributes | 13 + arma/server/.github/CONTRIBUTING.md | 12 + .../.github/ISSUE_TEMPLATE/bug-report.md | 25 + .../.github/ISSUE_TEMPLATE/feature-request.md | 15 + arma/server/.github/PULL_REQUEST_TEMPLATE.md | 12 + arma/server/.github/assets/placeholder.txt | 1 + arma/server/.github/workflows/check.yml | 28 + arma/server/.gitignore | 17 + .../.hemtt/commands/ctrlWebBrowserAction.yml | 28 + .../hooks/post_release/01_move_readme.rhai | 13 + .../hooks/pre_build/01_set_version.rhai | 26 + arma/server/.hemtt/launch.toml | 16 + arma/server/.hemtt/lints.toml | 35 + arma/server/.hemtt/project.toml | 24 + arma/server/.hemtt/scripts/update_build.rhai | 19 + arma/server/.hemtt/scripts/update_minor.rhai | 23 + arma/server/.hemtt/scripts/update_patch.rhai | 20 + arma/server/LICENSE.md | 119 ++ arma/server/README.md | 27 + arma/server/addons/actor/$PBOPREFIX$ | 1 + arma/server/addons/actor/CfgEventHandlers.hpp | 17 + arma/server/addons/actor/README.md | 4 + arma/server/addons/actor/XEH_PREP.hpp | 1 + arma/server/addons/actor/XEH_postInit.sqf | 1 + arma/server/addons/actor/XEH_preInit.sqf | 85 + arma/server/addons/actor/XEH_preStart.sqf | 3 + arma/server/addons/actor/config.cpp | 19 + .../actor/functions/fnc_initActorStore.sqf | 181 ++ arma/server/addons/actor/script_component.hpp | 9 + arma/server/addons/actor/stringtable.xml | 8 + arma/server/addons/bank/$PBOPREFIX$ | 1 + arma/server/addons/bank/CfgEventHandlers.hpp | 17 + arma/server/addons/bank/README.md | 4 + arma/server/addons/bank/XEH_PREP.hpp | 1 + arma/server/addons/bank/XEH_postInit.sqf | 1 + arma/server/addons/bank/XEH_preInit.sqf | 85 + arma/server/addons/bank/XEH_preStart.sqf | 3 + arma/server/addons/bank/config.cpp | 19 + .../bank/functions/fnc_initBankStore.sqf | 170 ++ arma/server/addons/bank/script_component.hpp | 9 + arma/server/addons/bank/stringtable.xml | 8 + arma/server/addons/common/$PBOPREFIX$ | 1 + .../server/addons/common/CfgEventHandlers.hpp | 11 + arma/server/addons/common/README.md | 4 + arma/server/addons/common/XEH_PREP.hpp | 4 + arma/server/addons/common/XEH_preInit.sqf | 7 + arma/server/addons/common/XEH_preStart.sqf | 3 + arma/server/addons/common/config.cpp | 19 + .../common/functions/fnc_generateHash.sqf | 33 + .../functions/fnc_generateSecureData.sqf | 36 + .../addons/common/functions/fnc_getPlayer.sqf | 27 + .../common/functions/fnc_timeToSeconds.sqf | 36 + .../server/addons/common/script_component.hpp | 9 + arma/server/addons/common/stringtable.xml | 8 + arma/server/addons/main/$PBOPREFIX$ | 1 + arma/server/addons/main/CfgSettings.hpp | 13 + arma/server/addons/main/README.md | 4 + arma/server/addons/main/config.cpp | 19 + arma/server/addons/main/script_component.hpp | 9 + arma/server/addons/main/script_macros.hpp | 159 ++ arma/server/addons/main/script_mod.hpp | 26 + arma/server/addons/main/script_version.hpp | 4 + arma/server/addons/main/stringtable.xml | 24 + arma/server/addons/org/$PBOPREFIX$ | 1 + arma/server/addons/org/CfgEventHandlers.hpp | 17 + arma/server/addons/org/README.md | 4 + arma/server/addons/org/XEH_PREP.hpp | 1 + arma/server/addons/org/XEH_postInit.sqf | 1 + arma/server/addons/org/XEH_preInit.sqf | 85 + arma/server/addons/org/XEH_preStart.sqf | 3 + arma/server/addons/org/config.cpp | 19 + .../addons/org/functions/fnc_initOrgStore.sqf | 205 ++ arma/server/addons/org/script_component.hpp | 9 + arma/server/addons/org/stringtable.xml | 8 + arma/server/config.example.toml | 35 + arma/server/docs/README.md | 268 +++ arma/server/docs/api-reference.md | 388 ++++ arma/server/docs/usage-examples.md | 427 ++++ arma/server/extension/Cargo.toml | 24 + arma/server/extension/README.md | 399 ++++ arma/server/extension/config.example.toml | 35 + arma/server/extension/src/actor.rs | 308 +++ arma/server/extension/src/adapters/README.md | 261 +++ arma/server/extension/src/adapters/mod.rs | 3 + .../extension/src/adapters/redis_client.rs | 148 ++ arma/server/extension/src/bank.rs | 304 +++ arma/server/extension/src/helpers.rs | 12 + arma/server/extension/src/lib.rs | 106 + arma/server/extension/src/lib.rs.bak | 54 + arma/server/extension/src/log.rs | 49 + arma/server/extension/src/org.rs | 189 ++ arma/server/extension/src/redis/README.md | 278 +++ arma/server/extension/src/redis/client.rs | 43 + arma/server/extension/src/redis/common.rs | 74 + arma/server/extension/src/redis/config.rs | 122 ++ arma/server/extension/src/redis/hash.rs | 102 + arma/server/extension/src/redis/helpers.rs | 73 + arma/server/extension/src/redis/list.rs | 167 ++ arma/server/extension/src/redis/macros.rs | 65 + arma/server/extension/src/redis/mod.rs | 69 + arma/server/extension/src/redis/set.rs | 87 + arma/server/icon_128_ca.paa | Bin 0 -> 22016 bytes arma/server/icon_128_highlight_ca.paa | Bin 0 -> 22016 bytes arma/server/icon_64_ca.paa | Bin 0 -> 5625 bytes .../include/a3/ui_f/hpp/defineDIKCodes.inc | 190 ++ .../cba/addons/main/script_macros_common.hpp | 1833 +++++++++++++++++ .../include/x/cba/addons/xeh/script_xeh.hpp | 118 ++ arma/server/meta.cpp | 4 + arma/server/mod.cpp | 15 + arma/server/server.code-workspace | 24 + arma/server/title_ca.paa | Bin 0 -> 756068 bytes arma/server/tools/config_style_checker.py | 187 ++ arma/server/tools/release.bat | 4 + arma/server/tools/release_patch.bat | 4 + build-arma.ps1 | 69 + forge.code-workspace | 22 + lib/README.md | 244 +++ lib/models/Cargo.toml | 21 + lib/models/README.md | 140 ++ lib/models/src/actor.rs | 347 ++++ lib/models/src/bank.rs | 259 +++ lib/models/src/lib.rs | 7 + lib/models/src/org.rs | 203 ++ lib/repositories/Cargo.toml | 16 + lib/repositories/README.md | 197 ++ lib/repositories/src/actor.rs | 161 ++ lib/repositories/src/bank.rs | 161 ++ lib/repositories/src/lib.rs | 10 + lib/repositories/src/org.rs | 248 +++ lib/services/Cargo.toml | 10 + lib/services/README.md | 174 ++ lib/services/src/actor.rs | 133 ++ lib/services/src/bank.rs | 123 ++ lib/services/src/lib.rs | 7 + lib/services/src/org.rs | 171 ++ lib/shared/Cargo.toml | 8 + lib/shared/src/lib.rs | 25 + lib/shared/src/redis_client.rs | 67 + lib/shared/src/validation.rs | 148 ++ 299 files changed, 23112 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitea/CONTRIBUTING.md create mode 100644 .gitea/ISSUE_TEMPLATE/bug-report.md create mode 100644 .gitea/ISSUE_TEMPLATE/feature-request.md create mode 100644 .gitea/PULL_REQUEST_TEMPLATE.md create mode 100644 .gitea/assets/placeholder.txt create mode 100644 .gitignore create mode 100644 Architecture_Diagram.md create mode 100644 Cargo.toml create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 arma/client/.editorconfig create mode 100644 arma/client/.gitattributes create mode 100644 arma/client/.github/CONTRIBUTING.md create mode 100644 arma/client/.github/ISSUE_TEMPLATE/bug-report.md create mode 100644 arma/client/.github/ISSUE_TEMPLATE/feature-request.md create mode 100644 arma/client/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 arma/client/.github/assets/placeholder.txt create mode 100644 arma/client/.github/workflows/check.yml create mode 100644 arma/client/.gitignore create mode 100644 arma/client/.hemtt/commands/ctrlWebBrowserAction.yml create mode 100644 arma/client/.hemtt/hooks/post_release/01_move_readme.rhai create mode 100644 arma/client/.hemtt/hooks/pre_build/01_set_version.rhai create mode 100644 arma/client/.hemtt/launch.toml create mode 100644 arma/client/.hemtt/lints.toml create mode 100644 arma/client/.hemtt/project.toml create mode 100644 arma/client/.hemtt/scripts/update_build.rhai create mode 100644 arma/client/.hemtt/scripts/update_minor.rhai create mode 100644 arma/client/.hemtt/scripts/update_patch.rhai create mode 100644 arma/client/LICENSE.md create mode 100644 arma/client/README.md create mode 100644 arma/client/addons/actor/$PBOPREFIX$ create mode 100644 arma/client/addons/actor/CfgEventHandlers.hpp create mode 100644 arma/client/addons/actor/README.md create mode 100644 arma/client/addons/actor/XEH_PREP.hpp create mode 100644 arma/client/addons/actor/XEH_postInit.sqf create mode 100644 arma/client/addons/actor/XEH_postInitClient.sqf create mode 100644 arma/client/addons/actor/XEH_preInit.sqf create mode 100644 arma/client/addons/actor/XEH_preInitClient.sqf create mode 100644 arma/client/addons/actor/XEH_preStart.sqf create mode 100644 arma/client/addons/actor/config.cpp create mode 100644 arma/client/addons/actor/functions/fnc_handleUIEvents.sqf create mode 100644 arma/client/addons/actor/functions/fnc_initActorClass.sqf create mode 100644 arma/client/addons/actor/functions/fnc_openUI.sqf create mode 100644 arma/client/addons/actor/initKeybinds.inc.sqf create mode 100644 arma/client/addons/actor/initSettings.inc.sqf create mode 100644 arma/client/addons/actor/script_component.hpp create mode 100644 arma/client/addons/actor/stringtable.xml create mode 100644 arma/client/addons/actor/ui/RscActorMenu.hpp create mode 100644 arma/client/addons/actor/ui/RscCommon.hpp create mode 100644 arma/client/addons/actor/ui/_site/garage.css create mode 100644 arma/client/addons/actor/ui/_site/garage.html create mode 100644 arma/client/addons/actor/ui/_site/garage.js create mode 100644 arma/client/addons/actor/ui/_site/index.html create mode 100644 arma/client/addons/actor/ui/_site/script.js create mode 100644 arma/client/addons/actor/ui/_site/script.js.bak create mode 100644 arma/client/addons/actor/ui/_site/store.css create mode 100644 arma/client/addons/actor/ui/_site/store.html create mode 100644 arma/client/addons/actor/ui/_site/store.js create mode 100644 arma/client/addons/actor/ui/_site/style.css create mode 100644 arma/client/addons/actor/ui/_site/style.css.bak create mode 100644 arma/client/addons/bank/$PBOPREFIX$ create mode 100644 arma/client/addons/bank/CfgEventHandlers.hpp create mode 100644 arma/client/addons/bank/README.md create mode 100644 arma/client/addons/bank/XEH_PREP.hpp create mode 100644 arma/client/addons/bank/XEH_postInit.sqf create mode 100644 arma/client/addons/bank/XEH_postInitClient.sqf create mode 100644 arma/client/addons/bank/XEH_preInit.sqf create mode 100644 arma/client/addons/bank/XEH_preInitClient.sqf create mode 100644 arma/client/addons/bank/XEH_preStart.sqf create mode 100644 arma/client/addons/bank/config.cpp create mode 100644 arma/client/addons/bank/functions/fnc_handleUIEvents.sqf create mode 100644 arma/client/addons/bank/functions/fnc_initBankClass.sqf create mode 100644 arma/client/addons/bank/functions/fnc_openUI.sqf create mode 100644 arma/client/addons/bank/initKeybinds.inc.sqf create mode 100644 arma/client/addons/bank/initSettings.inc.sqf create mode 100644 arma/client/addons/bank/script_component.hpp create mode 100644 arma/client/addons/bank/stringtable.xml create mode 100644 arma/client/addons/bank/ui/RscBank.hpp create mode 100644 arma/client/addons/bank/ui/RscCommon.hpp create mode 100644 arma/client/addons/bank/ui/_site/atm.css create mode 100644 arma/client/addons/bank/ui/_site/atm.html create mode 100644 arma/client/addons/bank/ui/_site/atm.js create mode 100644 arma/client/addons/bank/ui/_site/index.html create mode 100644 arma/client/addons/bank/ui/_site/script.js create mode 100644 arma/client/addons/bank/ui/_site/style.css create mode 100644 arma/client/addons/common/$PBOPREFIX$ create mode 100644 arma/client/addons/common/CfgEventHandlers.hpp create mode 100644 arma/client/addons/common/README.md create mode 100644 arma/client/addons/common/XEH_PREP.hpp create mode 100644 arma/client/addons/common/XEH_preInit.sqf create mode 100644 arma/client/addons/common/XEH_preStart.sqf create mode 100644 arma/client/addons/common/config.cpp create mode 100644 arma/client/addons/common/script_component.hpp create mode 100644 arma/client/addons/common/stringtable.xml create mode 100644 arma/client/addons/main/$PBOPREFIX$ create mode 100644 arma/client/addons/main/CfgSettings.hpp create mode 100644 arma/client/addons/main/README.md create mode 100644 arma/client/addons/main/config.cpp create mode 100644 arma/client/addons/main/data/hpp/defineDIKCodes.hpp create mode 100644 arma/client/addons/main/data/ui/placeholder.txt create mode 100644 arma/client/addons/main/script_component.hpp create mode 100644 arma/client/addons/main/script_macros.hpp create mode 100644 arma/client/addons/main/script_mod.hpp create mode 100644 arma/client/addons/main/script_version.hpp create mode 100644 arma/client/addons/main/stringtable.xml create mode 100644 arma/client/addons/org/$PBOPREFIX$ create mode 100644 arma/client/addons/org/CfgEventHandlers.hpp create mode 100644 arma/client/addons/org/README.md create mode 100644 arma/client/addons/org/XEH_PREP.hpp create mode 100644 arma/client/addons/org/XEH_postInit.sqf create mode 100644 arma/client/addons/org/XEH_postInitClient.sqf create mode 100644 arma/client/addons/org/XEH_preInit.sqf create mode 100644 arma/client/addons/org/XEH_preInitClient.sqf create mode 100644 arma/client/addons/org/XEH_preStart.sqf create mode 100644 arma/client/addons/org/config.cpp create mode 100644 arma/client/addons/org/functions/fnc_handleUIEvents.sqf create mode 100644 arma/client/addons/org/functions/fnc_initOrgClass.sqf create mode 100644 arma/client/addons/org/functions/fnc_openUI.sqf create mode 100644 arma/client/addons/org/initKeybinds.inc.sqf create mode 100644 arma/client/addons/org/initSettings.inc.sqf create mode 100644 arma/client/addons/org/script_component.hpp create mode 100644 arma/client/addons/org/stringtable.xml create mode 100644 arma/client/addons/org/ui/RscCommon.hpp create mode 100644 arma/client/addons/org/ui/RscOrg.hpp create mode 100644 arma/client/addons/org/ui/_site.7z create mode 100644 arma/client/addons/org/ui/_site/index.html create mode 100644 arma/client/addons/org/ui/_site/script.js create mode 100644 arma/client/addons/org/ui/_site/style.css create mode 100644 arma/client/client.code-workspace create mode 100644 arma/client/docs/README.md create mode 100644 arma/client/extra/example_addon/$PBOPREFIX$ create mode 100644 arma/client/extra/example_addon/CfgEventHandlers.hpp create mode 100644 arma/client/extra/example_addon/README.md create mode 100644 arma/client/extra/example_addon/XEH_PREP.hpp create mode 100644 arma/client/extra/example_addon/XEH_preInit.sqf create mode 100644 arma/client/extra/example_addon/XEH_preStart.sqf create mode 100644 arma/client/extra/example_addon/config.cpp create mode 100644 arma/client/extra/example_addon/functions/fnc_empty.sqf create mode 100644 arma/client/extra/example_addon/initKeybinds.inc.sqf create mode 100644 arma/client/extra/example_addon/initSettings.inc.sqf create mode 100644 arma/client/extra/example_addon/script_component.hpp create mode 100644 arma/client/extra/example_addon/stringtable.xml create mode 100644 arma/client/extra/example_subaddon/config.cpp create mode 100644 arma/client/extra/example_subaddon/script_component.hpp create mode 100644 arma/client/icon_128_ca.paa create mode 100644 arma/client/icon_128_highlight_ca.paa create mode 100644 arma/client/icon_64_ca.paa create mode 100644 arma/client/include/a3/ui_f/hpp/defineDIKCodes.inc create mode 100644 arma/client/include/x/cba/addons/main/script_macros_common.hpp create mode 100644 arma/client/include/x/cba/addons/xeh/script_xeh.hpp create mode 100644 arma/client/meta.cpp create mode 100644 arma/client/mod.cpp create mode 100644 arma/client/title_ca.paa create mode 100644 arma/client/tools/config_style_checker.py create mode 100644 arma/client/tools/release.bat create mode 100644 arma/client/tools/release_patch.bat create mode 100644 arma/example_data.sqf create mode 100644 arma/server/.editorconfig create mode 100644 arma/server/.gitattributes create mode 100644 arma/server/.github/CONTRIBUTING.md create mode 100644 arma/server/.github/ISSUE_TEMPLATE/bug-report.md create mode 100644 arma/server/.github/ISSUE_TEMPLATE/feature-request.md create mode 100644 arma/server/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 arma/server/.github/assets/placeholder.txt create mode 100644 arma/server/.github/workflows/check.yml create mode 100644 arma/server/.gitignore create mode 100644 arma/server/.hemtt/commands/ctrlWebBrowserAction.yml create mode 100644 arma/server/.hemtt/hooks/post_release/01_move_readme.rhai create mode 100644 arma/server/.hemtt/hooks/pre_build/01_set_version.rhai create mode 100644 arma/server/.hemtt/launch.toml create mode 100644 arma/server/.hemtt/lints.toml create mode 100644 arma/server/.hemtt/project.toml create mode 100644 arma/server/.hemtt/scripts/update_build.rhai create mode 100644 arma/server/.hemtt/scripts/update_minor.rhai create mode 100644 arma/server/.hemtt/scripts/update_patch.rhai create mode 100644 arma/server/LICENSE.md create mode 100644 arma/server/README.md create mode 100644 arma/server/addons/actor/$PBOPREFIX$ create mode 100644 arma/server/addons/actor/CfgEventHandlers.hpp create mode 100644 arma/server/addons/actor/README.md create mode 100644 arma/server/addons/actor/XEH_PREP.hpp create mode 100644 arma/server/addons/actor/XEH_postInit.sqf create mode 100644 arma/server/addons/actor/XEH_preInit.sqf create mode 100644 arma/server/addons/actor/XEH_preStart.sqf create mode 100644 arma/server/addons/actor/config.cpp create mode 100644 arma/server/addons/actor/functions/fnc_initActorStore.sqf create mode 100644 arma/server/addons/actor/script_component.hpp create mode 100644 arma/server/addons/actor/stringtable.xml create mode 100644 arma/server/addons/bank/$PBOPREFIX$ create mode 100644 arma/server/addons/bank/CfgEventHandlers.hpp create mode 100644 arma/server/addons/bank/README.md create mode 100644 arma/server/addons/bank/XEH_PREP.hpp create mode 100644 arma/server/addons/bank/XEH_postInit.sqf create mode 100644 arma/server/addons/bank/XEH_preInit.sqf create mode 100644 arma/server/addons/bank/XEH_preStart.sqf create mode 100644 arma/server/addons/bank/config.cpp create mode 100644 arma/server/addons/bank/functions/fnc_initBankStore.sqf create mode 100644 arma/server/addons/bank/script_component.hpp create mode 100644 arma/server/addons/bank/stringtable.xml create mode 100644 arma/server/addons/common/$PBOPREFIX$ create mode 100644 arma/server/addons/common/CfgEventHandlers.hpp create mode 100644 arma/server/addons/common/README.md create mode 100644 arma/server/addons/common/XEH_PREP.hpp create mode 100644 arma/server/addons/common/XEH_preInit.sqf create mode 100644 arma/server/addons/common/XEH_preStart.sqf create mode 100644 arma/server/addons/common/config.cpp create mode 100644 arma/server/addons/common/functions/fnc_generateHash.sqf create mode 100644 arma/server/addons/common/functions/fnc_generateSecureData.sqf create mode 100644 arma/server/addons/common/functions/fnc_getPlayer.sqf create mode 100644 arma/server/addons/common/functions/fnc_timeToSeconds.sqf create mode 100644 arma/server/addons/common/script_component.hpp create mode 100644 arma/server/addons/common/stringtable.xml create mode 100644 arma/server/addons/main/$PBOPREFIX$ create mode 100644 arma/server/addons/main/CfgSettings.hpp create mode 100644 arma/server/addons/main/README.md create mode 100644 arma/server/addons/main/config.cpp create mode 100644 arma/server/addons/main/script_component.hpp create mode 100644 arma/server/addons/main/script_macros.hpp create mode 100644 arma/server/addons/main/script_mod.hpp create mode 100644 arma/server/addons/main/script_version.hpp create mode 100644 arma/server/addons/main/stringtable.xml create mode 100644 arma/server/addons/org/$PBOPREFIX$ create mode 100644 arma/server/addons/org/CfgEventHandlers.hpp create mode 100644 arma/server/addons/org/README.md create mode 100644 arma/server/addons/org/XEH_PREP.hpp create mode 100644 arma/server/addons/org/XEH_postInit.sqf create mode 100644 arma/server/addons/org/XEH_preInit.sqf create mode 100644 arma/server/addons/org/XEH_preStart.sqf create mode 100644 arma/server/addons/org/config.cpp create mode 100644 arma/server/addons/org/functions/fnc_initOrgStore.sqf create mode 100644 arma/server/addons/org/script_component.hpp create mode 100644 arma/server/addons/org/stringtable.xml create mode 100644 arma/server/config.example.toml create mode 100644 arma/server/docs/README.md create mode 100644 arma/server/docs/api-reference.md create mode 100644 arma/server/docs/usage-examples.md create mode 100644 arma/server/extension/Cargo.toml create mode 100644 arma/server/extension/README.md create mode 100644 arma/server/extension/config.example.toml create mode 100644 arma/server/extension/src/actor.rs create mode 100644 arma/server/extension/src/adapters/README.md create mode 100644 arma/server/extension/src/adapters/mod.rs create mode 100644 arma/server/extension/src/adapters/redis_client.rs create mode 100644 arma/server/extension/src/bank.rs create mode 100644 arma/server/extension/src/helpers.rs create mode 100644 arma/server/extension/src/lib.rs create mode 100644 arma/server/extension/src/lib.rs.bak create mode 100644 arma/server/extension/src/log.rs create mode 100644 arma/server/extension/src/org.rs create mode 100644 arma/server/extension/src/redis/README.md create mode 100644 arma/server/extension/src/redis/client.rs create mode 100644 arma/server/extension/src/redis/common.rs create mode 100644 arma/server/extension/src/redis/config.rs create mode 100644 arma/server/extension/src/redis/hash.rs create mode 100644 arma/server/extension/src/redis/helpers.rs create mode 100644 arma/server/extension/src/redis/list.rs create mode 100644 arma/server/extension/src/redis/macros.rs create mode 100644 arma/server/extension/src/redis/mod.rs create mode 100644 arma/server/extension/src/redis/set.rs create mode 100644 arma/server/icon_128_ca.paa create mode 100644 arma/server/icon_128_highlight_ca.paa create mode 100644 arma/server/icon_64_ca.paa create mode 100644 arma/server/include/a3/ui_f/hpp/defineDIKCodes.inc create mode 100644 arma/server/include/x/cba/addons/main/script_macros_common.hpp create mode 100644 arma/server/include/x/cba/addons/xeh/script_xeh.hpp create mode 100644 arma/server/meta.cpp create mode 100644 arma/server/mod.cpp create mode 100644 arma/server/server.code-workspace create mode 100644 arma/server/title_ca.paa create mode 100644 arma/server/tools/config_style_checker.py create mode 100644 arma/server/tools/release.bat create mode 100644 arma/server/tools/release_patch.bat create mode 100644 build-arma.ps1 create mode 100644 forge.code-workspace create mode 100644 lib/README.md create mode 100644 lib/models/Cargo.toml create mode 100644 lib/models/README.md create mode 100644 lib/models/src/actor.rs create mode 100644 lib/models/src/bank.rs create mode 100644 lib/models/src/lib.rs create mode 100644 lib/models/src/org.rs create mode 100644 lib/repositories/Cargo.toml create mode 100644 lib/repositories/README.md create mode 100644 lib/repositories/src/actor.rs create mode 100644 lib/repositories/src/bank.rs create mode 100644 lib/repositories/src/lib.rs create mode 100644 lib/repositories/src/org.rs create mode 100644 lib/services/Cargo.toml create mode 100644 lib/services/README.md create mode 100644 lib/services/src/actor.rs create mode 100644 lib/services/src/bank.rs create mode 100644 lib/services/src/lib.rs create mode 100644 lib/services/src/org.rs create mode 100644 lib/shared/Cargo.toml create mode 100644 lib/shared/src/lib.rs create mode 100644 lib/shared/src/redis_client.rs create mode 100644 lib/shared/src/validation.rs diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4246311 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +end_of_line = crlf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.yml] +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dae0c81 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +# Sources +*.cpp text diff=cpp linguist-language=cpp +*.hpp text diff=cpp linguist-language=cpp +*.rhai text diff=rust linguist-language=rust + +*.png binary +*.jpg binary +*.paa binary + +# Linguistics +# Exclude included files and examples from stats +include/* linguist-vendored +extra/* linguist-vendored diff --git a/.gitea/CONTRIBUTING.md b/.gitea/CONTRIBUTING.md new file mode 100644 index 0000000..b7b4679 --- /dev/null +++ b/.gitea/CONTRIBUTING.md @@ -0,0 +1,12 @@ +# Contributing Setup & Guidelines + +## Setting up the Development Environment +### 1. Clone the repository from GitHub +### 2. Install HEMTT +The latest version of HEMTT can be installed by running: +```cmd +winget install hemtt +``` + +## Coding Guidelines +This mod follows the same coding guidelines as the ACE3 mod, which can be found [here](https://ace3.acemod.org/wiki/development/coding-guidelines). diff --git a/.gitea/ISSUE_TEMPLATE/bug-report.md b/.gitea/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..d4c384f --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,25 @@ +--- +name: Bug report +about: Create a bug report to help us improve +title: '' +labels: kind/bug +--- + +## Describe the bug +A clear and concise description of what the bug is. + +## To reproduce +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Expected behavior +A clear and concise description of what you expected to happen. + +## Attachments +If applicable, add screenshots or RPT logs to help explain your problem. + +## Additional context +Add any other context about the problem here. diff --git a/.gitea/ISSUE_TEMPLATE/feature-request.md b/.gitea/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..709ee6c --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,15 @@ +--- +name: Feature Request +about: Suggest a feature to be added +title: '' +labels: kind/feature-request +--- + +## Describe the feature that you would like +A clear and concise description of the feature you'd want. + +## Possible alternatives +Possible alternatives to your suggestion. + +## Additional context +Add any other context about the feature here. diff --git a/.gitea/PULL_REQUEST_TEMPLATE.md b/.gitea/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..6f72c35 --- /dev/null +++ b/.gitea/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,12 @@ +**When merged this pull request will:** +- Describe what this pull request will do +- Each change in a separate line + +### Important +- [ ] If the contribution affects [the documentation](../docs), please include your changes in this pull request. +- [ ] [Development Guidelines](https://github.com/IDSolutions/MOD_REPO/blob/main/.github/CONTRIBUTING.md) are read, understood and applied. +- [ ] Title of this PR uses our standard template `Component - Add|Fix|Improve|Change|Make|Remove {changes}`. + + +### Known Issues +- [ ] Issue diff --git a/.gitea/assets/placeholder.txt b/.gitea/assets/placeholder.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.gitea/assets/placeholder.txt @@ -0,0 +1 @@ + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ced595b --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Rust +/target/ +**/*.rs.bk +*.pdb + +# Cargo +Cargo.lock +debug/ +target/ + +# Build artifacts +*.exe +*.dll +*.so +*.dylib + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db diff --git a/Architecture_Diagram.md b/Architecture_Diagram.md new file mode 100644 index 0000000..686faf6 --- /dev/null +++ b/Architecture_Diagram.md @@ -0,0 +1,131 @@ +# Forge Architecture & Data Flow Diagram + +## 🏗️ **System Architecture Overview** + +```mermaid +graph TD + subgraph ForgeSystem [FORGE SYSTEM] + subgraph Clients [Clients #40;Read-Only#41;] + ClientA[CLIENT A] + ClientB[CLIENT B] + ClientN[CLIENT N] + + subgraph OptimisticCache [Optimistic Cache] + ActorObj[Actor Object
- loadout
- position
- stats] + end + + ClientA --- OptimisticCache + ClientB --- OptimisticCache + ClientN --- OptimisticCache + end + + subgraph Server [ArmA 3 SERVER #40;Hot Cache#41;] + ActorRegistry["GVAR(ActorRegistry)
In-Memory HashMap
UID -> {loadout, position, stats...}"] + SessionMgmt[Session Management
- Token Generation
- UID Resolution
- Player State] + end + + subgraph Rust [EXTENSION #40;Cold Storage#41;] + ConnPool["Connection Pool
(bb8-redis)
2-10 connections"] + RedisOps[Redis Operations
- actor_get/set/update
- Async I/O] + end + + subgraph Redis [DATABASE #40;Saved to Disc#41;] + ActorDataStore[Actor Data Store
actor:UID -> JSON] + Modules[Additional Modules
garage, locker, bank, org] + end + + Clients -->|Event Driven
#40;CBA A3 Events#41;| Server + Server -->|Extension Calls
#40;Rust FFI#41;| Rust + Rust -->|Redis Protocol
#40;bb8-redis#41;| Redis + end +``` + +## 🔄 **Data Flow Sequence** + +### **1. Player Connection & Initial Data Load** + +```mermaid +sequenceDiagram + participant Client + participant Server as Server (Hot Cache) + participant Extension as Extension (Cold Storage) + participant Redis as Redis (Database) + + Note over Client, Redis: 1. Player Connection & Initial Data Load + + Client->>Server: 1. Connect + Client->>Server: 2. Request Actor Data + Server->>Server: 3. Check Cache (Cache Miss) + Server->>Extension: 4. Extension Call + Extension->>Redis: 5. Redis Query + Redis-->>Extension: 6. JSON Data + Extension-->>Server: 7. Actor Data + Server->>Server: 8. Store in Hot Cache + Server-->>Client: 9. Secure Response + Client->>Client: 10. Update Local Cache +``` + +### **2. Subsequent Data Access (Cache Hit)** + +```mermaid +sequenceDiagram + participant Client + participant Server as Server (Hot Cache) + participant Extension as Extension (Cold Storage) + participant Redis as Redis (Database) + + Note over Client, Redis: 2. Subsequent Data Access (Cache Hit) + + Client->>Server: 1. Request Actor Data + Server->>Server: 2. Check Cache (Cache Hit!) + Server-->>Client: 3. Instant Response + Client->>Client: 4. Update Local Cache +``` + +### **3. Data Update (Write-Through)** + +```mermaid +sequenceDiagram + participant Client + participant Server as Server (Hot Cache) + participant Extension as Extension (Cold Storage) + participant Redis as Redis (Database) + + Note over Client, Redis: 3. Data Update (Write-Through) + + Client->>Server: 1. Action (Move, etc) + Server->>Server: 2. Validate & Update Cache + Server->>Extension: 3. Persist to Database + Extension->>Redis: 4. Redis Update + Redis-->>Extension: 5. Confirmation + Extension-->>Server: 6. Success + Server-->>Client: 7. Sync to All Clients +``` + +## 🚀 **Performance Characteristics** + +### **Access Times** +- **Hot Cache (Server)**: `< 1ms` (HashMap lookup) +- **Cold Storage (Redis)**: `1-5ms` (Network + Redis) +- **Client Cache**: `< 0.1ms` (Local object access) + +### **Cache Hit Ratios** +- **Hot Cache**: `~95%` (Active players) +- **Cold Storage**: `~5%` (New connections, cache misses) + +### **Memory Usage** +- **Server Registry**: `~1KB per active player` +- **Client Cache**: `~500B per player object` +- **Redis**: `~2KB per player (persistent)` + +## 🔒 **Security & Session Management** + +```mermaid +flowchart TD + subgraph SessionMgmt [SERVER-SIDE #40;Session MGT#41;] + Conn[Player Connection] --> Token[Session Token Generation
#40;Generated on server#41;] + Token --> UID[UID Resolution
#40;Steam UID mapping#41;] + UID --> State[Player State Tracking
#40;Tracked in ActorRegistry#41;] + State --> Access[Data Access Authorized
#40;Authorized via session#41;] + end +``` diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..aabe7fe --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,18 @@ +[workspace] +members = [ + "arma/server/extension", + "lib/models", + "lib/repositories", + "lib/services", + "lib/shared", +] +resolver = "3" + +[workspace.dependencies] +arma-rs = { version = "1.11.15", features = ["chrono", "serde_json", "uuid"] } +chrono = "0.4.42" +redis = "1.0.0-rc.1" +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.145" +tokio = { version = "1.47.1", features = ["full"] } +uuid = { version = "1.18.1", features = ["v4"] } diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..659cbdc --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,119 @@ +![APL-SA](https://www.bohemia.net/assets/img/licenses/APL-SA.png) + +## Brief summary of this Licence + +PLEASE, NOTE THAT THIS SUMMARY HAS NO LEGAL EFFECT AND IS ONLY OF AN INFORMATORY NATURE DESIGNED FOR YOU TO GET THE BASIC INFORMATION ABOUT THE CONTENT OF THIS LICENCE. THE ONLY LEGALLY BINDING PROVISIONS ARE THOSE IN THE ORIGINAL AND FULL TEXT OF THIS LICENCE. + +With this licence you are free to adapt (i.e. modify, rework or update) and share (i.e. copy, distribute or transmit) the material under the following conditions: + +* **Attribution** - You must attribute the material in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the material). +* **Noncommercial** - You may not use this material for any commercial purposes. +* **Arma Only** - You may not convert or adapt this material to be used in other games than Arma. +* **Share Alike** - If you adapt, or build upon this material, you may distribute the resulting material only under the same license. + +--- + +# Full version of licence + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Arma Public License - Share Alike ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +### Section 1 – Definitions + +1. **Adapted Material** means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. +2. **Adapter's License** means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. +3. **ArmaOnly** means primarily intended for or directed towards the use in any of existing and future Arma games, including but not limited to Arma: Cold War Assault, Arma, Arma 2 and Arma 3 and its official sequels and expansion packs. +4. **Arma Public Share Alike Compatible License** means a license listed at [https://www.bohemia.net/community/licenses](https://www.bohemia.net/community/licenses) as essentially the equivalent of this Public License. +5. **Copyright and Similar Rights** means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. +6. **Effective Technological Measures** means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. +7. **Exceptions and Limitations** means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. +8. **Licensed Material** means the artistic or literary work, database, or other material to which the Licensor applied this Public License. +9. **Licensed Rights** means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. +10. **Licensor** means the individual(s) or entity(ies) granting rights under this Public License. +11. **NonCommercial** means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. +12. **Share** means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. +13. **Sui Generis Database Rights** means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. +14. **You** means the individual or entity exercising the Licensed Rights under this Public License. **Your** has a corresponding meaning. + +### Section 2 – Scope + +1. **License grant** + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + 1. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial and ArmaOnly purposes only; and + 2. produce, reproduce, and Share Adapted Material for NonCommercial and ArmaOnly purposes only. + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + 3. Term. The term of this Public License is specified in Section 6(a). + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + 5. Downstream recipients. + 1. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + 2. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + 3. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(a)(i). +2. **Other rights** + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + 2. Patent and trademark rights are not licensed under this Public License. + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial and ArmaOnly purposes. + +### Section 3 – License Conditions + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +1. **Attribution** + 1. If You Share the Licensed Material (including in modified form), You must: + 1. retain the following if it is supplied by the Licensor with the Licensed Material: + 1. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + 2. a copyright notice; + 3. a notice that refers to this Public License; + 4. a notice that refers to the disclaimer of warranties; + 5. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + 2. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + 3. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(a) to the extent reasonably practicable. +2. **ShareAlike** + In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + 1. The Adapter’s License You apply must be this Public License, or an Arma Public Share Alike Compatible License. + 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +### Section 4 – Sui Generis Database Rights + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +1. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial and ArmaOnly purposes only; +2. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and +3. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +### Section 5 – Disclaimer of Warranties and Limitation of Liability + +1. **Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.** +2. **To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.** +3. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +### Section 6 – Term and Termination + +1. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. +2. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + 2. upon express reinstatement by the Licensor. + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. +3. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. +4. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +### Section 7 – Other Terms and Conditions + +1. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. +2. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +### Section 8 – Interpretation + +1. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. +2. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. +3. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. +4. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +### Bohemia Interactive Notices + +1. Bohemia Interactive a.s. is not a party to this License, and makes no warranty whatsoever in connection with the Licensed Material. Bohemia Interactive a.s. will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, Bohemia Interactive a.s. may elect to apply the Public License to material it publishes and in those instances it becomes the "Licensor". +2. Except for the limited purpose of indicating to the public that the Licensed Material is shared under this Public License, Bohemia Interactive a.s. does not authorize the use by either party of the trademarks "Arma", "Bohemia Interactive" or any related trademark or logo of Arma or Bohemia Interactive without the prior written consent of Bohemia Interactive a.s. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0ae66ab --- /dev/null +++ b/README.md @@ -0,0 +1,294 @@ +# Forge Framework + +**Forge** is a high-performance, production-ready framework for Arma 3 persistent game servers, built with Rust and Redis for optimal performance and reliability. + +## Overview + +Forge provides a complete solution for managing persistent player data, organizations, and game state in Arma 3 multiplayer environments. It combines the performance of Rust with the flexibility of Redis to deliver sub-millisecond response times while maintaining data consistency across server restarts. + +### Key Features + +- **🚀 High Performance**: Sub-millisecond data access through intelligent caching +- **🔒 Data Integrity**: Strict validation and type safety at every layer +- **🏗️ Clean Architecture**: Layered design following SOLID principles +- **📦 Modular Design**: Easy to extend with new entities and features +- **🔄 Real-time Sync**: Automatic state synchronization across all clients +- **💾 Persistent Storage**: Redis-backed storage with automatic failover +- **🧪 Testable**: Mock-friendly architecture for comprehensive testing + +## Architecture + +Forge follows a **layered architecture** pattern: + +```mermaid +graph TD + Extension[Extension Layer
ArmA 3 Interface <---> Rust] + Services[Services Layer
#40;Business Logic#41;] + Repositories[Repositories Layer
#40;Data Persistence#41;] + Models[Models Layer
#40;Data Structures & Validation#41;] + + Extension --> Services + Services --> Repositories + Repositories --> Models +``` + +**Communication Flow**: +- **Clients** → Use events (`CBA_Events`) to communicate with server +- **Server** → Calls Rust extension via `callExtension` +- **Extension** → Manages Redis connection pool and data operations + +For detailed architecture information, see [Diagram](Architecture_Diagram.md). + +## Project Structure + +``` +forge/ +├── arma/ +│ ├── client/ # Client-side SQF mod +│ │ ├── addons/ +│ │ │ ├── main/ # Core initialization & config +│ │ │ ├── common/ # Shared utilities & helpers +│ │ │ ├── actor/ # Actor/player UI, class & events +│ │ │ ├── org/ # Organization UI, class & events +│ │ │ └── bank/ # Banking UI, class & events +│ │ ├── include/ # Header files +│ │ └── tools/ # Build tools +│ ├── server/ +│ │ ├── addons/ +│ │ │ ├── main/ # Core initialization & config +│ │ │ ├── common/ # Shared utilities & helpers +│ │ │ ├── actor/ # Actor/player Registry, Store & events +│ │ │ └── org/ # Organization Registry, Store & events +│ │ ├── include/ # Header files +│ │ ├── tools/ # Build tools +│ │ └── extension/ # Rust extension (Arma 3 interface) +│ │ ├── src/ +│ │ │ ├── actor.rs # Actor/player commands +│ │ │ ├── org.rs # Organization commands +│ │ │ ├── redis/ # Redis operations module +│ │ │ └── adapters/ # Repository adapters +│ │ └── README.md +├── lib/ +│ ├── models/ # Data structures & validation +│ ├── repositories/ # Data persistence layer +│ ├── services/ # Business logic layer +│ ├── shared/ # Common utilities & traits +│ └── README.md +└── FORGE_Architecture_Diagram.md +``` + +## Quick Start + +### Prerequisites + +- Rust 1.70+ with `cargo` +- Redis 6.0+ +- HEMTT + +1. Clone the repository from Gitea +2. Install HEMTT +The latest version of HEMTT can be installed by running: +```cmd +winget install hemtt +``` + +### Coding Guidelines +This mod follows the same coding guidelines as the ACE3 mod, which can be found [here](https://ace3.acemod.org/wiki/development/coding-guidelines). + +### Building the Extension + +```bash +# Build for release +cargo build --release + +# The compiled extension will be at: +# target/release/forge_server.dll (Windows) +# target/release/forge_server.so (Linux) +``` + +### Configuration + +Create `@forge_server/config.toml`: + +```toml +[redis] +host = "127.0.0.1" +port = 6379 +password = "" # Optional +max_connections = 10 +min_connections = 2 +idle_timeout = 300 +``` + +### SQF Usage + +```sqf +// Create an actor +private _data = createHashMapFromArray [ + ["name", "John Doe"], + ["bank", 1000], + ["level", 1] +]; +private _result = "forge_server" callExtension ["actor:create", [getPlayerUID player, toJSON _data]]; + +// Get actor data +private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; +private _actorData = fromJSON (_result select 0); + +// Update actor +private _update = createHashMapFromArray [["bank", 1500]]; +"forge_server" callExtension ["actor:update", [getPlayerUID player, toJSON _update]]; +``` + +## Core Modules + +### Models +Defines strict data structures with built-in validation: +- `Actor`: Player data (stats, inventory, position) +- `Org`: Organization/clan data (members, roles, metadata) + +[Documentation](lib/models/README.md) + +### Repositories +Manages data persistence with Redis: +- Hash-based storage for structured data +- Set-based storage for collections +- Generic over Redis client implementations + +[Documentation](lib/repositories/README.md) + +### Services +Implements business logic and orchestration: +- Get-or-create patterns +- Data validation and transformation +- Complex workflows + +[Documentation](lib/services/README.md) + +### Extension +Arma 3 interface layer: +- Command routing and parsing +- Session management +- Error handling and logging + +[Documentation](arma/server/extension/README.md) + +### Client Mod +Client-side SQF addon that provides: +- **UI Components**: Player interfaces for inventory, organizations, banking +- **Event Handlers**: CBA event listeners for server communication +- **Optimistic Caching**: Local data caching for instant UI updates +- **State Management**: Client-side state synchronization +- **Input Validation**: Client-side validation before server requests + +The client mod communicates with the server using **CBA Events**, ensuring: +- No direct extension calls from clients (security) +- Event-driven architecture for scalability +- Automatic state synchronization across all clients +- Reduced server load through client-side caching + +## Available Commands + +### Actor Commands +| Command | Description | +|---------|-------------| +| `actor:get` | Retrieve actor data by UID | +| `actor:create` | Create a new actor | +| `actor:update` | Update actor fields | +| `actor:exists` | Check if actor exists | +| `actor:delete` | Delete actor data | + +### Organization Commands +| Command | Description | +|---------|-------------| +| `org:get` | Retrieve organization data | +| `org:create` | Create a new organization | +| `org:update` | Update organization fields | +| `org:exists` | Check if organization exists | +| `org:delete` | Delete organization | +| `org:add_member` | Add member to organization | +| `org:remove_member` | Remove member from organization | +| `org:get_members` | Get all organization members | + +### Redis Operations +Direct Redis operations for advanced use cases: +- **Common**: Key-value operations (set, get, incr, decr, del) +- **Hash**: Structured data (hset, hget, hgetall, hdel) +- **List**: Ordered collections (lpush, rpush, lrange, lpop, rpop) +- **Set**: Unique collections (sadd, smembers, srem, sismember) + +[Documentation](arma/server/extension/src/redis/README.md) + +## Performance + +- **Hot Cache (Server)**: < 1ms (HashMap lookup) +- **Cold Storage (Redis)**: 1-5ms (Network + Redis query) +- **Cache Hit Ratio**: ~95% for active players +- **Memory Usage**: ~1KB per active player (server), ~2KB per player (Redis) + +## Contributing + +We welcome contributions! Please see the contributing guides for each layer: + +- [Extension Contributing Guide](arma/server/extension/README.md#contributing) +- [Services Contributing Guide](lib/services/README.md#contributing) +- [Repositories Contributing Guide](lib/repositories/README.md#contributing) +- [Models Contributing Guide](lib/models/README.md#contributing) +- [Library Contributing Guide](lib/README.md#contributing) +- [Adapter Contributing Guide](arma/server/extension/src/adapters/#contributing) + +### Development Workflow + +1. **Define Model**: Create data structure with validation +2. **Create Repository**: Implement persistence layer +3. **Build Service**: Add business logic +4. **Expose in Extension**: Create SQF-callable commands +5. **Test**: Verify each layer independently + +## Error Handling + +All commands return consistent error messages: + +```sqf +private _result = "forge_server" callExtension ["actor:get", ["invalid_uid"]]; +private _response = _result select 0; + +if (_response find "Error:" == 0) then { + diag_log format ["Operation failed: %1", _response]; +} else { + private _data = fromJSON _response; + // Use data +}; +``` + +## Logging + +Logs are automatically created in `@forge_server/logs/`: +- `actor.log` - Actor operations +- `org.log` - Organization operations +- `redis.log` - Redis connection and operations +- `debug.log` - General debug information + +## License + +[Your License Here] + +## Support + +- **Issues**: [Gitea Issues](https://gitea.innovativedevsolutions.org/IDSolutions/forge/issues) +- **Documentation**: See individual module READMEs +- **Architecture**: [FORGE_Architecture_Diagram.md](FORGE_Architecture_Diagram.md) + +## Roadmap + +- [ ] Admin system +- [ ] Arsenal system +- [ ] Banking system +- [ ] Economy system +- [ ] Garage system +- [ ] Locker system +- [ ] Mission template + +--- + +Built using **Rust**, **Redis**, and **Arma 3** diff --git a/arma/client/.editorconfig b/arma/client/.editorconfig new file mode 100644 index 0000000..4246311 --- /dev/null +++ b/arma/client/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +end_of_line = crlf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.yml] +indent_size = 2 diff --git a/arma/client/.gitattributes b/arma/client/.gitattributes new file mode 100644 index 0000000..dae0c81 --- /dev/null +++ b/arma/client/.gitattributes @@ -0,0 +1,13 @@ +# Sources +*.cpp text diff=cpp linguist-language=cpp +*.hpp text diff=cpp linguist-language=cpp +*.rhai text diff=rust linguist-language=rust + +*.png binary +*.jpg binary +*.paa binary + +# Linguistics +# Exclude included files and examples from stats +include/* linguist-vendored +extra/* linguist-vendored diff --git a/arma/client/.github/CONTRIBUTING.md b/arma/client/.github/CONTRIBUTING.md new file mode 100644 index 0000000..b7b4679 --- /dev/null +++ b/arma/client/.github/CONTRIBUTING.md @@ -0,0 +1,12 @@ +# Contributing Setup & Guidelines + +## Setting up the Development Environment +### 1. Clone the repository from GitHub +### 2. Install HEMTT +The latest version of HEMTT can be installed by running: +```cmd +winget install hemtt +``` + +## Coding Guidelines +This mod follows the same coding guidelines as the ACE3 mod, which can be found [here](https://ace3.acemod.org/wiki/development/coding-guidelines). diff --git a/arma/client/.github/ISSUE_TEMPLATE/bug-report.md b/arma/client/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..d4c384f --- /dev/null +++ b/arma/client/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,25 @@ +--- +name: Bug report +about: Create a bug report to help us improve +title: '' +labels: kind/bug +--- + +## Describe the bug +A clear and concise description of what the bug is. + +## To reproduce +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Expected behavior +A clear and concise description of what you expected to happen. + +## Attachments +If applicable, add screenshots or RPT logs to help explain your problem. + +## Additional context +Add any other context about the problem here. diff --git a/arma/client/.github/ISSUE_TEMPLATE/feature-request.md b/arma/client/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..709ee6c --- /dev/null +++ b/arma/client/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,15 @@ +--- +name: Feature Request +about: Suggest a feature to be added +title: '' +labels: kind/feature-request +--- + +## Describe the feature that you would like +A clear and concise description of the feature you'd want. + +## Possible alternatives +Possible alternatives to your suggestion. + +## Additional context +Add any other context about the feature here. diff --git a/arma/client/.github/PULL_REQUEST_TEMPLATE.md b/arma/client/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..6f72c35 --- /dev/null +++ b/arma/client/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,12 @@ +**When merged this pull request will:** +- Describe what this pull request will do +- Each change in a separate line + +### Important +- [ ] If the contribution affects [the documentation](../docs), please include your changes in this pull request. +- [ ] [Development Guidelines](https://github.com/IDSolutions/MOD_REPO/blob/main/.github/CONTRIBUTING.md) are read, understood and applied. +- [ ] Title of this PR uses our standard template `Component - Add|Fix|Improve|Change|Make|Remove {changes}`. + + +### Known Issues +- [ ] Issue diff --git a/arma/client/.github/assets/placeholder.txt b/arma/client/.github/assets/placeholder.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/arma/client/.github/assets/placeholder.txt @@ -0,0 +1 @@ + diff --git a/arma/client/.github/workflows/check.yml b/arma/client/.github/workflows/check.yml new file mode 100644 index 0000000..9d2f654 --- /dev/null +++ b/arma/client/.github/workflows/check.yml @@ -0,0 +1,28 @@ +name: HEMTT + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + + - name: Validate Config + run: python tools/config_style_checker.py + - name: Check for BOM + uses: arma-actions/bom-check@master + with: + path: "addons" + + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Run HEMTT check + run: hemtt check --pedantic diff --git a/arma/client/.gitignore b/arma/client/.gitignore new file mode 100644 index 0000000..b786b16 --- /dev/null +++ b/arma/client/.gitignore @@ -0,0 +1,17 @@ +# HEMTT +hemtt.exe +.hemtt/missions/~* +.hemttout/ +releases/ + +# Textures +Exports/ +*.spp +*.spp.painter_lock +*.psd + +# Other +*.biprivatekey +*.zip +*.pbo +*.sqfc diff --git a/arma/client/.hemtt/commands/ctrlWebBrowserAction.yml b/arma/client/.hemtt/commands/ctrlWebBrowserAction.yml new file mode 100644 index 0000000..97b2d5f --- /dev/null +++ b/arma/client/.hemtt/commands/ctrlWebBrowserAction.yml @@ -0,0 +1,28 @@ +name: ctrlWebBrowserAction +description: Executes an action on a web browser control +groups: + - GUI Control +syntax: + - call: !Binary [control, actionArray] + ret: + - Nothing + - Nothing + params: + - name: control + type: Control + description: Web browser control to execute action on + - name: actionArray + type: ArrayUnknown + description: | + Array in format [actionType, actionData] where: + - actionType (String): Type of action ("ExecJS", "LoadURL", "Reload", "Stop", etc.) + - actionData (String): Data for the action (JavaScript code for ExecJS, URL for LoadURL, empty string for others) +argument_loc: Local +effect_loc: Local +since: + arma_3: + major: 2 + minor: 2 +examples: + - _control ctrlWebBrowserAction ["ExecJS", "document.getElementById('test').innerHTML = 'Hello World!'"]; + - _control ctrlWebBrowserAction ["LoadURL", "https://community.bistudio.com"]; diff --git a/arma/client/.hemtt/hooks/post_release/01_move_readme.rhai b/arma/client/.hemtt/hooks/post_release/01_move_readme.rhai new file mode 100644 index 0000000..eb59898 --- /dev/null +++ b/arma/client/.hemtt/hooks/post_release/01_move_readme.rhai @@ -0,0 +1,13 @@ +let readme = HEMTT_RFS.join("docs") + .join("README.md") + .open_file() + .read(); +readme.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_RFS.join("README.md") + .create_file() + .write(readme); +print("README.md version set to " + HEMTT.project().version()); diff --git a/arma/client/.hemtt/hooks/pre_build/01_set_version.rhai b/arma/client/.hemtt/hooks/pre_build/01_set_version.rhai new file mode 100644 index 0000000..c7930cd --- /dev/null +++ b/arma/client/.hemtt/hooks/pre_build/01_set_version.rhai @@ -0,0 +1,26 @@ +let modcpp = HEMTT_VFS.join("mod.cpp") + .open_file() + .read(); +modcpp.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_VFS.join("mod.cpp") + .create_file() + .write(modcpp); +print("mod.cpp version set to " + HEMTT.project().version()); + +// Currently unused, but included anyway +let readme = HEMTT_VFS.join("README.md") + .open_file() + .read(); +readme.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_VFS.join("README.md") + .create_file() + .write(readme); +print("README.md version set to " + HEMTT.project().version()); diff --git a/arma/client/.hemtt/launch.toml b/arma/client/.hemtt/launch.toml new file mode 100644 index 0000000..1e2e390 --- /dev/null +++ b/arma/client/.hemtt/launch.toml @@ -0,0 +1,16 @@ +[default] +workshop = [ + "450814997", # CBA_A3 + "3499977893", # Advanced Dev Tools + "623475643", # 3DEN Enhanced +] +presets = [] +dlc = [] +optionals = [] +parameters = [] + +[ace] +extends = "default" +workshop = [ + "463939057", # ACE +] diff --git a/arma/client/.hemtt/lints.toml b/arma/client/.hemtt/lints.toml new file mode 100644 index 0000000..af141f2 --- /dev/null +++ b/arma/client/.hemtt/lints.toml @@ -0,0 +1,40 @@ +[sqf.banned_commands] +options.banned = [ + # "spawn", # Scheduled should be avoided whenever possible + "execVM", # Script files should never be run directly, they should be functions + "remoteExec", # CBA events should be used for networking +] + +[sqf.banned_macros] +options.release = [ + "DEBUG_MODE_FULL", + "DISABLE_COMPILE_CACHE", +] + +[sqf.event_unknown] +options.ignore = [ + "JSDialog", +] + +[sqf.this_call] +enabled = true + +[sqf.undefined] +enabled = true +options.check_orphan_code = true + +[sqf.unused] +enabled = true # many false positives without DEBUG_MODE_FULL +options.check_params = false + +[sqf.shadowed] +enabled = false + +[sqf.not_private] +enabled = true + +[config.file_type] +options.allow_no_extension = false + +[stringtables.usage] +options.ignore_unused = true diff --git a/arma/client/.hemtt/project.toml b/arma/client/.hemtt/project.toml new file mode 100644 index 0000000..7c308fc --- /dev/null +++ b/arma/client/.hemtt/project.toml @@ -0,0 +1,24 @@ +name = "forge-client" +author = "J.Schmidt" +prefix = "forge_client" +mainprefix = "forge" + +[version] +path = "addons/main/script_version.hpp" +git_hash = 0 + +[files] +include = [ + "mod.cpp", + "meta.cpp", + "logo_forge_client.png", + "logo_forge_client_over.png", + "logo_forge_client_ca.paa", + "logo_forge_client_over_ca.paa", + "LICENSE.md", + "README.md", +] +exclude = [] + +[properties] +author = "J.Schmidt" diff --git a/arma/client/.hemtt/scripts/update_build.rhai b/arma/client/.hemtt/scripts/update_build.rhai new file mode 100644 index 0000000..14bdbeb --- /dev/null +++ b/arma/client/.hemtt/scripts/update_build.rhai @@ -0,0 +1,19 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define BUILD "; +let current = HEMTT.project().version().build(); +let next = current + 1; +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/client/.hemtt/scripts/update_minor.rhai b/arma/client/.hemtt/scripts/update_minor.rhai new file mode 100644 index 0000000..b8344fb --- /dev/null +++ b/arma/client/.hemtt/scripts/update_minor.rhai @@ -0,0 +1,23 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define MINOR "; +let current = HEMTT.project().version().minor(); +let next = current + 1; + +// Updating minor version should reset patch number +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); +current = HEMTT.project().version().patch(); +script_version.replace("#define PATCH " + current.to_string(), "#define PATCH 0"); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/client/.hemtt/scripts/update_patch.rhai b/arma/client/.hemtt/scripts/update_patch.rhai new file mode 100644 index 0000000..a90383f --- /dev/null +++ b/arma/client/.hemtt/scripts/update_patch.rhai @@ -0,0 +1,20 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define PATCH "; +let current = HEMTT.project().version().patch(); +let next = current + 1; + +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/client/LICENSE.md b/arma/client/LICENSE.md new file mode 100644 index 0000000..659cbdc --- /dev/null +++ b/arma/client/LICENSE.md @@ -0,0 +1,119 @@ +![APL-SA](https://www.bohemia.net/assets/img/licenses/APL-SA.png) + +## Brief summary of this Licence + +PLEASE, NOTE THAT THIS SUMMARY HAS NO LEGAL EFFECT AND IS ONLY OF AN INFORMATORY NATURE DESIGNED FOR YOU TO GET THE BASIC INFORMATION ABOUT THE CONTENT OF THIS LICENCE. THE ONLY LEGALLY BINDING PROVISIONS ARE THOSE IN THE ORIGINAL AND FULL TEXT OF THIS LICENCE. + +With this licence you are free to adapt (i.e. modify, rework or update) and share (i.e. copy, distribute or transmit) the material under the following conditions: + +* **Attribution** - You must attribute the material in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the material). +* **Noncommercial** - You may not use this material for any commercial purposes. +* **Arma Only** - You may not convert or adapt this material to be used in other games than Arma. +* **Share Alike** - If you adapt, or build upon this material, you may distribute the resulting material only under the same license. + +--- + +# Full version of licence + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Arma Public License - Share Alike ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +### Section 1 – Definitions + +1. **Adapted Material** means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. +2. **Adapter's License** means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. +3. **ArmaOnly** means primarily intended for or directed towards the use in any of existing and future Arma games, including but not limited to Arma: Cold War Assault, Arma, Arma 2 and Arma 3 and its official sequels and expansion packs. +4. **Arma Public Share Alike Compatible License** means a license listed at [https://www.bohemia.net/community/licenses](https://www.bohemia.net/community/licenses) as essentially the equivalent of this Public License. +5. **Copyright and Similar Rights** means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. +6. **Effective Technological Measures** means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. +7. **Exceptions and Limitations** means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. +8. **Licensed Material** means the artistic or literary work, database, or other material to which the Licensor applied this Public License. +9. **Licensed Rights** means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. +10. **Licensor** means the individual(s) or entity(ies) granting rights under this Public License. +11. **NonCommercial** means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. +12. **Share** means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. +13. **Sui Generis Database Rights** means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. +14. **You** means the individual or entity exercising the Licensed Rights under this Public License. **Your** has a corresponding meaning. + +### Section 2 – Scope + +1. **License grant** + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + 1. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial and ArmaOnly purposes only; and + 2. produce, reproduce, and Share Adapted Material for NonCommercial and ArmaOnly purposes only. + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + 3. Term. The term of this Public License is specified in Section 6(a). + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + 5. Downstream recipients. + 1. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + 2. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + 3. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(a)(i). +2. **Other rights** + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + 2. Patent and trademark rights are not licensed under this Public License. + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial and ArmaOnly purposes. + +### Section 3 – License Conditions + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +1. **Attribution** + 1. If You Share the Licensed Material (including in modified form), You must: + 1. retain the following if it is supplied by the Licensor with the Licensed Material: + 1. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + 2. a copyright notice; + 3. a notice that refers to this Public License; + 4. a notice that refers to the disclaimer of warranties; + 5. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + 2. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + 3. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(a) to the extent reasonably practicable. +2. **ShareAlike** + In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + 1. The Adapter’s License You apply must be this Public License, or an Arma Public Share Alike Compatible License. + 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +### Section 4 – Sui Generis Database Rights + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +1. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial and ArmaOnly purposes only; +2. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and +3. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +### Section 5 – Disclaimer of Warranties and Limitation of Liability + +1. **Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.** +2. **To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.** +3. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +### Section 6 – Term and Termination + +1. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. +2. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + 2. upon express reinstatement by the Licensor. + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. +3. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. +4. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +### Section 7 – Other Terms and Conditions + +1. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. +2. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +### Section 8 – Interpretation + +1. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. +2. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. +3. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. +4. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +### Bohemia Interactive Notices + +1. Bohemia Interactive a.s. is not a party to this License, and makes no warranty whatsoever in connection with the Licensed Material. Bohemia Interactive a.s. will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, Bohemia Interactive a.s. may elect to apply the Public License to material it publishes and in those instances it becomes the "Licensor". +2. Except for the limited purpose of indicating to the public that the Licensed Material is shared under this Public License, Bohemia Interactive a.s. does not authorize the use by either party of the trademarks "Arma", "Bohemia Interactive" or any related trademark or logo of Arma or Bohemia Interactive without the prior written consent of Bohemia Interactive a.s. \ No newline at end of file diff --git a/arma/client/README.md b/arma/client/README.md new file mode 100644 index 0000000..f65d2bd --- /dev/null +++ b/arma/client/README.md @@ -0,0 +1,27 @@ +

Forge Client

+

+ Version + Issues + + License +
+ HEMTT + CBA A3 +

+ +

+ Requires the latest version of CBA A3 +

+ +**Forge Client** aims to... + +The project is entirely **open-source** and any contributions are welcome. + +## Core Features +- Feature + +## Contributing +For new contributers, see the [Contributing Setup & Guidelines](./.github/CONTRIBUTING.md). + +## License +Forge Client is licensed under [APL-SA](./LICENSE.md). diff --git a/arma/client/addons/actor/$PBOPREFIX$ b/arma/client/addons/actor/$PBOPREFIX$ new file mode 100644 index 0000000..b2c67a6 --- /dev/null +++ b/arma/client/addons/actor/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\actor diff --git a/arma/client/addons/actor/CfgEventHandlers.hpp b/arma/client/addons/actor/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/actor/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/actor/README.md b/arma/client/addons/actor/README.md new file mode 100644 index 0000000..9dcb48a --- /dev/null +++ b/arma/client/addons/actor/README.md @@ -0,0 +1,4 @@ +forge_client_actor +=================== + +Description for this addon diff --git a/arma/client/addons/actor/XEH_PREP.hpp b/arma/client/addons/actor/XEH_PREP.hpp new file mode 100644 index 0000000..0dcc312 --- /dev/null +++ b/arma/client/addons/actor/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(handleUIEvents); +PREP(initActorClass); +PREP(openUI); diff --git a/arma/client/addons/actor/XEH_postInit.sqf b/arma/client/addons/actor/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/actor/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/actor/XEH_postInitClient.sqf b/arma/client/addons/actor/XEH_postInitClient.sqf new file mode 100644 index 0000000..d22f14d --- /dev/null +++ b/arma/client/addons/actor/XEH_postInitClient.sqf @@ -0,0 +1,42 @@ +#include "script_component.hpp" + +removeAllWeapons player; +removeAllAssignedItems player; +removeUniform player; +removeVest player; +removeBackpack player; +removeGoggles player; +removeHeadgear player; + +SETPVAR(player,FORGE_actorIsLoaded,false); +cutText ["Loading In...", "BLACK", 1]; + +if (isNil QGVAR(ActorClass)) then { [] call FUNC(initActorClass); }; + +[QGVAR(initActor), { + GVAR(ActorClass) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitActor), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(ActorClass) call ["sync", [_data, true]]; + + SETPVAR(player,FORGE_isLoaded,true); + cutText ["", "PLAIN", 1]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncActor), { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + GVAR(ActorClass) call ["sync", [_data, _jip]]; +}] call CFUNC(addEventHandler); + +[QGVAR(initActor), []] call CFUNC(localEvent); + +[{ + GETVAR(player,FORGE_actorIsLoaded,false) +}, { + private _holster = GVAR(ActorClass) call ["get", ["holster", true]]; + if (_holster) then { [player] call AFUNC(weaponselect,putWeaponAway); }; +}] call CFUNC(waitUntilAndExecute); diff --git a/arma/client/addons/actor/XEH_preInit.sqf b/arma/client/addons/actor/XEH_preInit.sqf new file mode 100644 index 0000000..8d45ad6 --- /dev/null +++ b/arma/client/addons/actor/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/actor/XEH_preInitClient.sqf b/arma/client/addons/actor/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/actor/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/actor/XEH_preStart.sqf b/arma/client/addons/actor/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/client/addons/actor/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/actor/config.cpp b/arma/client/addons/actor/config.cpp new file mode 100644 index 0000000..94b4a94 --- /dev/null +++ b/arma/client/addons/actor/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\RscActorMenu.hpp" diff --git a/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..bcde6ec --- /dev/null +++ b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,45 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Handles the UI events. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_client_actor_fnc_handleUIEvents; + * + * Public: No + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; +private _display = displayChild findDisplay 46; + +diag_log format ["[FORGE:Client:Actor] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "actor::get::actions": { GVAR(ActorClass) call ["getNearbyActions", [_control]]; }; + // case "actor::open::bank": { [] spawn EFUNC(bank,openUI); }; + case "actor::open::bank": { [] spawn EFUNC(bank,openUI); }; + case "actor::open::device": { hint "Device interaction is not yet implemented."; }; // TODO: Implement device interaction + case "actor::open::garage": { hint "Garage interaction is not yet implemented."; }; // TODO: Implement garage interaction + case "actor::open::org": { [] spawn EFUNC(org,openUI); }; + case "actor::open::locker": { hint "Locker interaction is not yet implemented."; }; // TODO: Implement locker interaction + // case "actor::open::phone": { [] spawn EFUNC(phone,openUI) }; + case "actor::open::phone": { hint "Phone interaction is not yet implemented."; }; // TODO: Implement phone interaction + case "actor::open::iplayer": { hint "Player interaction is not yet implemented." }; // TODO: Implement player interaction + case "actor::open::store": { hint "Store interaction is not yet implemented."; }; // TODO: Implement store interaction + default { hint format ["Unhandled UI event: %1", _event]; }; +}; + +if (_event isNotEqualTo "actor::get::actions") then { _display closeDisplay 1; }; + +true; diff --git a/arma/client/addons/actor/functions/fnc_initActorClass.sqf b/arma/client/addons/actor/functions/fnc_initActorClass.sqf new file mode 100644 index 0000000..b0119ec --- /dev/null +++ b/arma/client/addons/actor/functions/fnc_initActorClass.sqf @@ -0,0 +1,165 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the actor class. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Examples: + * [] call forge_client_actor_fnc_initActorClass + * + * Public: Yes + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(ActorClass) = createHashMapObject [[ + ["#type", "IActorClass"], + ["#create", { + _self set ["uid", getPlayerUID player]; + _self set ["actor", createHashMap]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + + private _actor = createHashMap; + _actor set ["uid", (getPlayerUID player)]; + _actor set ["name", (name player)]; + _actor set ["loadout", [[],[],[],["U_BG_Guerrilla_6_1",[]],[],[],"H_Cap_blk_ION","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]]; + _actor set ["position", (getPosASL player)]; + _actor set ["direction", (getDir player)]; + _actor set ["stance", (stance player)]; + _actor set ["rank", (rank player)]; + _actor set ["state", (lifeState player)]; + _actor set ["phone_number", ""]; + _actor set ["email", ""]; + _actor set ["organization", ""]; + _actor set ["holster", true]; + + _self set ["actor", _actor]; + }], + ["init", { + private _uid = _self get "uid"; + private _actor = _self get "actor"; + + [SRPC(actor,requestInitActor), [_uid, _actor]] call CFUNC(serverEvent); + + systemChat format ["Actor loaded for %1", (name player)]; + diag_log "[FORGE:Client:Actor] Actor Class Initialized!"; + }], + ["save", { + params [["_sync", false, [false]]]; + + private _uid = _self get "uid"; + [SRPC(actor,requestSaveActor), [_uid, _sync]] call CFUNC(serverEvent); + + _self set ["lastSave", time]; + }], + ["sync", { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + private _actor = _self get "actor"; + private _isLoaded = _self get "isLoaded"; + + if !(_isLoaded) then { _self set ["isLoaded", true]; }; + if (_data isEqualTo createHashMap) exitWith { + diag_log "[FORGE:Client:Actor] Empty data received for sync, skipping."; + }; + + { + _actor set [_x, _y]; + + if (_jip) then { + switch (_x) do { + case "position": { _self call ["applyPosition"]; }; + case "direction": { _self call ["applyDirection"]; }; + case "stance": { _self call ["applyStance"]; }; + case "rank": { _self call ["applyRank"]; }; + case "loadout": { _self call ["applyLoadout"]; }; + default {}; + }; + }; + + } forEach _data; + + _self set ["actor", _actor]; + + SETPVAR(player,FORGE_actorIsLoaded,true); + diag_log "[FORGE:Client:Actor] Sync completed"; + }], + ["get", { + params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; + + private _actor = _self get "actor"; + _actor getOrDefault [_key, _default]; + }], + ["applyPosition", { + private _position = _self call ["get", ["position", [0, 0, 0]]]; + + if (GVAR(enableLoc)) then { + player setPosASL _position; + + private _pAlt = ((getPosATLVisual player) select 2); + private _pVelZ = ((velocity player) select 2); + + if (_pAlt > 5 && _pVelZ < 0) then { + player setVelocity [0, 0, 0]; + player setPosATL [((getPosATLVisual player) select 0), ((getPosATLVisual player) select 1), 1]; + + hint "You logged off mid air. You were moved to a safe position on the ground"; + }; + }; + }], + ["applyDirection", { + private _direction = _self call ["get", ["direction", 0]]; + + if (GVAR(enableLoc)) then { player setDir _direction; }; + }], + ["applyStance", { + private _stance = _self call ["get", ["stance", "STAND"]]; + + if (GVAR(enableLoc)) then { player playAction _stance; }; + }], + ["applyRank", { + private _rank = _self call ["get", ["rank", "PRIVATE"]]; + + player setUnitRank _rank; + }], + ["applyLoadout", { + private _loadout = _self call ["get", ["loadout", []]]; + + if (GVAR(enableGear) && count _loadout > 0) then { player setUnitLoadout _loadout; }; + }], + ["getNearbyActions", { + params [["_control", controlNull, [controlNull]]]; + + private _nearbyActions = []; + + { + private _storeType = _x getVariable ["storeType", ""]; + private _isBank = _x getVariable ["isBank", false]; + private _isGarage = _x getVariable ["isGarage", false]; + private _isLocker = _x getVariable ["isLocker", false]; + private _garageType = _x getVariable ["garageType", ""]; + private _deviceType = _x getVariable ["deviceType", ""]; + private _isPlayer = _x isKindOf "Man" && isPlayer _x; + + if (_storeType isNotEqualTo "") then { _nearbyActions pushBack ["store", _storeType]; }; + if (_isBank) then { _nearbyActions pushBack ["bank", true]; }; + if (_isLocker) then { _nearbyActions pushBack ["locker", true]; }; + if (_isLocker && GVAR(enableVA)) then { _nearbyActions pushBack ["va", true]; }; + if (_isGarage) then { _nearbyActions pushBack ["garage", _garageType]; }; + if (_isGarage && GVAR(enableVG)) then { _nearbyActions pushBack ["vg", true]; }; + if (_deviceType isNotEqualTo "") then { _nearbyActions pushBack ["device", _deviceType]; }; + if (_isPlayer) then { _nearbyActions pushBack ["player", name _x]; }; + } forEach (player nearObjects 5); + + _control ctrlWebBrowserAction ["ExecJS", format ["updateAvailableActions(%1)", (toJSON _nearbyActions)]]; + }] +]]; + +SETVAR(player,FORGE_ActorClass,GVAR(ActorClass)); +GVAR(ActorClass) diff --git a/arma/client/addons/actor/functions/fnc_openUI.sqf b/arma/client/addons/actor/functions/fnc_openUI.sqf new file mode 100644 index 0000000..3517f5c --- /dev/null +++ b/arma/client/addons/actor/functions/fnc_openUI.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Opens the player interaction interface. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_client_actor_fnc_openUI; + * + * Public: No + */ + +private _display = (findDisplay 46) createDisplay "RscActorMenu"; +private _ctrl = (_display displayCtrl 1001); + +_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/actor/initKeybinds.inc.sqf b/arma/client/addons/actor/initKeybinds.inc.sqf new file mode 100644 index 0000000..20eb498 --- /dev/null +++ b/arma/client/addons/actor/initKeybinds.inc.sqf @@ -0,0 +1,8 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" + +[ + _category, QGVAR(ForgeIMenu), + [LSTRING(iMenu), LSTRING(iMenuTooltip)], { + call FUNC(openUI) + }, {}, [DIK_TAB, false, false, false] // Default keybind +] call CBA_fnc_addKeybind; diff --git a/arma/client/addons/actor/initSettings.inc.sqf b/arma/client/addons/actor/initSettings.inc.sqf new file mode 100644 index 0000000..3ff3391 --- /dev/null +++ b/arma/client/addons/actor/initSettings.inc.sqf @@ -0,0 +1,24 @@ +// Can use localize "STR_ACE_Common_Enabled" for name if ACE is required +[ + QGVAR(enableLoc), "CHECKBOX", + [LSTRING(enableLoc), LSTRING(enableLocTooltip)], + _category, true, true +] call CBA_fnc_addSetting; + +[ + QGVAR(enableGear), "CHECKBOX", + [LSTRING(enableGear), LSTRING(enableGearTooltip)], + _category, true, true +] call CBA_fnc_addSetting; + +[ + QGVAR(enableVA), "CHECKBOX", + [LSTRING(enableVA), LSTRING(enableVATooltip)], + _category, false, true +] call CBA_fnc_addSetting; + +[ + QGVAR(enableVG), "CHECKBOX", + [LSTRING(enableVG), LSTRING(enableVGTooltip)], + _category, false, true +] call CBA_fnc_addSetting; diff --git a/arma/client/addons/actor/script_component.hpp b/arma/client/addons/actor/script_component.hpp new file mode 100644 index 0000000..95c04da --- /dev/null +++ b/arma/client/addons/actor/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT actor +#define COMPONENT_BEAUTIFIED Actor +#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/actor/stringtable.xml b/arma/client/addons/actor/stringtable.xml new file mode 100644 index 0000000..6e50634 --- /dev/null +++ b/arma/client/addons/actor/stringtable.xml @@ -0,0 +1,38 @@ + + + + + Actor + + + Persistent Gear + + + Enable Persistent Gear + + + Persistent Location + + + Enable Persistent Location + + + Virtual Arsenal + + + Enable Virtual Arsenal + + + Virtual Garage + + + Enable Virtual Garage + + + Interaction Menu + + + Open your interaction menu + + + diff --git a/arma/client/addons/actor/ui/RscActorMenu.hpp b/arma/client/addons/actor/ui/RscActorMenu.hpp new file mode 100644 index 0000000..7b45e60 --- /dev/null +++ b/arma/client/addons/actor/ui/RscActorMenu.hpp @@ -0,0 +1,21 @@ +class RscActorMenu { + idd = 1000; + fadeIn = 0; + fadeOut = 0; + duration = 1e011; + onLoad = "uiNamespace setVariable ['RscActorMenu', _this select 0]"; + onUnLoad = "uinamespace setVariable ['RscActorMenu', nil]"; + + class controlsBackground {}; + class controls { + class IFrame: RscText { + type = 106; + idc = 1001; + x = "safeZoneXAbs"; + y = "safeZoneY"; + w = "safeZoneWAbs"; + h = "safeZoneH"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/actor/ui/RscCommon.hpp b/arma/client/addons/actor/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/actor/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/actor/ui/_site/garage.css b/arma/client/addons/actor/ui/_site/garage.css new file mode 100644 index 0000000..a5c1ef7 --- /dev/null +++ b/arma/client/addons/actor/ui/_site/garage.css @@ -0,0 +1,605 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + height: 100vh; + width: 100vw; + background: rgba(0, 0, 0, 0.7); + font-family: Arial, sans-serif; + color: rgba(200, 220, 240, 0.95); + overflow: hidden; +} + +.garage-container { + height: 100vh; + width: 100vw; + padding: 2rem; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +/* Header Section */ +.garage-header { + display: flex; + align-items: center; + gap: 1.5rem; + padding: 1.25rem 1.5rem; + background: rgba(15, 20, 30, 0.9); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + box-shadow: + 0 0 20px rgba(100, 150, 200, 0.15), + 0 4px 16px rgba(0, 0, 0, 0.8); +} + +.garage-logo { + width: 60px; + height: 60px; + background: rgba(20, 30, 45, 0.8); + border: 2px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; +} + +.logo-icon { + font-size: 2rem; +} + +.garage-info { + flex: 1; +} + +.garage-title { + font-size: 1.5rem; + font-weight: 600; + letter-spacing: 0.5px; + text-transform: uppercase; + color: rgba(200, 220, 255, 1); + margin-bottom: 0.25rem; +} + +.garage-subtitle { + font-size: 0.875rem; + color: rgba(140, 160, 180, 0.8); + letter-spacing: 0.5px; +} + +.garage-stats { + display: flex; + gap: 1.5rem; +} + +.stat-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.25rem; + padding: 0.75rem 1.25rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 4px; +} + +.stat-label { + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(140, 160, 180, 0.8); +} + +.stat-value { + font-size: 1.25rem; + font-weight: 600; + color: rgba(100, 200, 150, 1); +} + +.header-actions { + display: flex; + gap: 0.75rem; +} + +.action-btn { + padding: 0.625rem 1.25rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.875rem; + text-transform: uppercase; + letter-spacing: 0.5px; + cursor: pointer; + transition: all 0.15s ease; +} + +.action-btn:hover { + background: rgba(30, 45, 70, 0.9); + border-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.2), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.close-btn { + border-color: rgba(200, 100, 100, 0.4); +} + +.close-btn:hover { + border-color: rgba(255, 100, 100, 0.7); + box-shadow: + 0 0 15px rgba(200, 100, 100, 0.2), + inset 0 0 20px rgba(200, 100, 100, 0.05); +} + +/* Main Content */ +.garage-content { + flex: 1; + display: grid; + grid-template-columns: 250px 1fr 350px; + gap: 1.5rem; + overflow: hidden; +} + +/* Panels */ +.garage-panel { + background: rgba(15, 20, 30, 0.9); + border: 1px solid rgba(100, 150, 200, 0.4); + border-left: 3px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + display: flex; + flex-direction: column; + box-shadow: + 0 0 20px rgba(100, 150, 200, 0.1), + 0 4px 16px rgba(0, 0, 0, 0.6); +} + +.panel-header { + padding: 1.25rem 1.5rem; + border-bottom: 1px solid rgba(100, 150, 200, 0.2); +} + +.panel-title { + font-size: 1rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(200, 220, 255, 1); +} + +.panel-content { + flex: 1; + padding: 1.5rem; + overflow-y: auto; +} + +/* Custom Scrollbar */ +.panel-content::-webkit-scrollbar { + width: 8px; +} + +.panel-content::-webkit-scrollbar-track { + background: rgba(15, 20, 30, 0.5); + border-radius: 4px; +} + +.panel-content::-webkit-scrollbar-thumb { + background: rgba(100, 150, 200, 0.3); + border-radius: 4px; +} + +.panel-content::-webkit-scrollbar-thumb:hover { + background: rgba(100, 150, 200, 0.5); +} + +/* Filters */ +.filter-section { + margin-bottom: 2rem; +} + +.filter-section:last-child { + margin-bottom: 0; +} + +.filter-title { + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(160, 180, 200, 0.85); + margin-bottom: 0.75rem; +} + +.filter-buttons { + display: flex; + gap: 0.5rem; +} + +.filter-btn { + flex: 1; + padding: 0.625rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + cursor: pointer; + transition: all 0.15s ease; +} + +.filter-btn:hover { + background: rgba(30, 45, 70, 0.8); + border-color: rgba(150, 200, 255, 0.5); +} + +.filter-btn.active { + background: rgba(100, 150, 200, 0.2); + border-color: rgba(100, 150, 200, 0.6); + box-shadow: + 0 0 10px rgba(100, 150, 200, 0.15), + inset 0 0 15px rgba(100, 150, 200, 0.05); +} + +.type-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.type-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.875rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + cursor: pointer; + transition: all 0.15s ease; + text-align: left; +} + +.type-item:hover { + background: rgba(30, 45, 70, 0.8); + border-left-color: rgba(150, 200, 255, 0.7); +} + +.type-item.active { + background: rgba(30, 45, 70, 0.9); + border-left-color: rgba(100, 200, 150, 0.8); + box-shadow: + 0 0 15px rgba(100, 200, 150, 0.15), + inset 0 0 20px rgba(100, 200, 150, 0.05); +} + +.type-icon { + font-size: 1.5rem; +} + +.type-name { + font-size: 0.875rem; + color: rgba(200, 220, 240, 0.95); +} + +.search-input { + width: 100%; + padding: 0.75rem 1rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.875rem; + transition: all 0.15s ease; +} + +.search-input:focus { + outline: none; + border-color: rgba(150, 200, 255, 0.6); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.search-input::placeholder { + color: rgba(100, 120, 140, 0.6); +} + +/* Vehicles Grid */ +.vehicles-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 1rem; +} + +.vehicle-card { + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + padding: 1.25rem; + cursor: pointer; + transition: all 0.15s ease; + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.vehicle-card:hover { + background: rgba(30, 45, 70, 0.7); + border-left-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.vehicle-card.selected { + background: rgba(30, 45, 70, 0.8); + border-left-color: rgba(100, 200, 150, 0.8); + box-shadow: + 0 0 20px rgba(100, 200, 150, 0.2), + inset 0 0 25px rgba(100, 200, 150, 0.05); +} + +.vehicle-icon { + font-size: 3rem; + text-align: center; +} + +.vehicle-name { + font-size: 0.95rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); + text-align: center; +} + +.vehicle-type { + font-size: 0.75rem; + color: rgba(140, 160, 180, 0.85); + text-align: center; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.vehicle-status { + padding: 0.375rem; + background: rgba(100, 150, 200, 0.2); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 3px; + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.5px; + text-align: center; + font-weight: 600; +} + +.vehicle-status.stored { + background: rgba(100, 150, 200, 0.2); + border-color: rgba(100, 150, 200, 0.4); + color: rgba(150, 200, 255, 0.9); +} + +.vehicle-status.active { + background: rgba(100, 200, 150, 0.2); + border-color: rgba(100, 200, 150, 0.4); + color: rgba(150, 255, 200, 0.9); +} + +/* Vehicle Details */ +.no-selection { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + padding: 3rem 1rem; +} + +.no-selection-icon { + font-size: 4rem; + opacity: 0.3; +} + +.no-selection p { + font-size: 0.875rem; + color: rgba(140, 160, 180, 0.7); +} + +.vehicle-details { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.detail-header { + display: flex; + align-items: center; + gap: 1rem; + padding: 1.25rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; +} + +.detail-icon { + font-size: 3rem; +} + +.detail-info { + flex: 1; +} + +.detail-name { + font-size: 1.125rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); + margin-bottom: 0.25rem; +} + +.detail-type { + font-size: 0.75rem; + color: rgba(140, 160, 180, 0.85); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.detail-stats { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.75rem; +} + +.detail-stat { + padding: 0.875rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 4px; + display: flex; + flex-direction: column; + gap: 0.375rem; +} + +.detail-label { + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(140, 160, 180, 0.85); +} + +.detail-value { + font-size: 0.95rem; + font-weight: 600; + color: rgba(200, 220, 240, 0.95); +} + +.detail-actions { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.detail-btn { + padding: 1rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + gap: 0.75rem; + cursor: pointer; + transition: all 0.15s ease; +} + +.detail-btn:hover { + background: rgba(30, 45, 70, 0.9); + border-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.2), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.spawn-btn { + background: rgba(100, 150, 200, 0.2); + border-color: rgba(100, 150, 200, 0.5); +} + +.spawn-btn:hover { + background: rgba(100, 150, 200, 0.3); + border-color: rgba(150, 200, 255, 0.7); +} + +.store-btn { + background: rgba(200, 150, 100, 0.2); + border-color: rgba(200, 150, 100, 0.4); +} + +.store-btn:hover { + background: rgba(200, 150, 100, 0.3); + border-color: rgba(255, 200, 150, 0.6); +} + +.btn-icon { + font-size: 1.25rem; +} + +.btn-text { + font-size: 0.875rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(200, 220, 240, 0.95); +} + +.detail-specs { + padding: 1.25rem; + background: rgba(20, 30, 45, 0.5); + border: 1px solid rgba(100, 150, 200, 0.2); + border-radius: 4px; +} + +.specs-title { + font-size: 0.875rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(180, 200, 220, 0.9); + margin-bottom: 1rem; +} + +.specs-list { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.spec-item { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 0.75rem; + border-bottom: 1px solid rgba(100, 150, 200, 0.15); +} + +.spec-item:last-child { + padding-bottom: 0; + border-bottom: none; +} + +.spec-label { + font-size: 0.8rem; + color: rgba(140, 160, 180, 0.85); +} + +.spec-value { + font-size: 0.875rem; + font-weight: 600; + color: rgba(200, 220, 240, 0.95); +} + +/* Responsive */ +@media (max-width: 1400px) { + .garage-content { + grid-template-columns: 220px 1fr 320px; + } + + .vehicles-grid { + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + } +} + +@media (max-width: 1200px) { + .garage-content { + grid-template-columns: 1fr 350px; + } + + .filters-panel { + display: none; + } +} diff --git a/arma/client/addons/actor/ui/_site/garage.html b/arma/client/addons/actor/ui/_site/garage.html new file mode 100644 index 0000000..7942d3d --- /dev/null +++ b/arma/client/addons/actor/ui/_site/garage.html @@ -0,0 +1,205 @@ + + + + + + + Vehicle Garage + + + + + + +
+ +
+ +
+

Vehicle Garage

+

Vehicle Management System

+
+
+
+ Stored + 12 +
+
+ Active + 2 +
+
+ Capacity + 20 +
+
+
+ +
+
+ + +
+ +
+
+

Filters

+
+
+ +
+

Status

+
+ + + +
+
+ + +
+

Vehicle Type

+
+ + + + + +
+
+ + +
+

Search

+ +
+
+
+ + +
+
+

Your Vehicles

+
+
+
+ +
+
+
+ + +
+
+

Vehicle Details

+
+
+
+
🚗
+

Select a vehicle to view details

+
+ + +
+
+
+
+ + + + + diff --git a/arma/client/addons/actor/ui/_site/garage.js b/arma/client/addons/actor/ui/_site/garage.js new file mode 100644 index 0000000..6094cac --- /dev/null +++ b/arma/client/addons/actor/ui/_site/garage.js @@ -0,0 +1,317 @@ +/** + * Vehicle Garage Interface + * Handles vehicle management with spawn and store actions + */ + +// Mock data - sample vehicles +const mockData = { + vehicles: [ + // Cars + { id: 1, name: "Sedan", type: "car", icon: "🚗", status: "stored", condition: 95, fuel: 80, location: "Garage A", seats: 4, speed: "180 km/h", cargo: "200 kg" }, + { id: 2, name: "Sports Car", type: "car", icon: "🏎️", status: "stored", condition: 100, fuel: 100, location: "Garage A", seats: 2, speed: "250 km/h", cargo: "50 kg" }, + { id: 3, name: "SUV", type: "car", icon: "🚙", status: "active", condition: 85, fuel: 60, location: "In Use", seats: 6, speed: "160 km/h", cargo: "400 kg" }, + { id: 4, name: "Hatchback", type: "car", icon: "🚗", status: "stored", condition: 90, fuel: 75, location: "Garage B", seats: 4, speed: "170 km/h", cargo: "250 kg" }, + + // Trucks + { id: 5, name: "Pickup Truck", type: "truck", icon: "🚛", status: "stored", condition: 88, fuel: 70, location: "Garage A", seats: 2, speed: "140 km/h", cargo: "800 kg" }, + { id: 6, name: "Delivery Van", type: "truck", icon: "🚚", status: "stored", condition: 92, fuel: 85, location: "Garage B", seats: 3, speed: "130 km/h", cargo: "1200 kg" }, + { id: 7, name: "Heavy Truck", type: "truck", icon: "🚛", status: "active", condition: 75, fuel: 50, location: "In Use", seats: 2, speed: "120 km/h", cargo: "2000 kg" }, + { id: 8, name: "Box Truck", type: "truck", icon: "📦", status: "stored", condition: 80, fuel: 65, location: "Garage A", seats: 3, speed: "110 km/h", cargo: "1500 kg" }, + + // Aircraft + { id: 9, name: "Helicopter", type: "air", icon: "🚁", status: "stored", condition: 95, fuel: 90, location: "Helipad", seats: 6, speed: "280 km/h", cargo: "500 kg" }, + { id: 10, name: "Light Plane", type: "air", icon: "✈️", status: "stored", condition: 100, fuel: 100, location: "Hangar", seats: 4, speed: "320 km/h", cargo: "300 kg" }, + + // Boats + { id: 11, name: "Speedboat", type: "sea", icon: "🚤", status: "stored", condition: 93, fuel: 80, location: "Marina", seats: 4, speed: "100 km/h", cargo: "150 kg" }, + { id: 12, name: "Yacht", type: "sea", icon: "🛥️", status: "stored", condition: 98, fuel: 95, location: "Marina", seats: 12, speed: "60 km/h", cargo: "800 kg" } + ] +}; + +// State +let selectedVehicle = null; +let statusFilter = 'all'; +let typeFilter = 'all'; +let searchQuery = ''; + +// Icons by type +const typeIcons = { + car: '🚗', + truck: '🚛', + air: '🚁', + sea: '🚤' +}; + +// Initialize +function initGarage() { + console.log('Garage interface initializing...'); + + setupEventHandlers(); + renderVehicles(); + updateStats(); + + console.log('Garage interface initialized'); +} + +// Event Handlers +function setupEventHandlers() { + // Close button + const closeBtn = document.querySelector('.close-btn'); + if (closeBtn) { + closeBtn.addEventListener('click', () => { + console.log('Closing garage...'); + sendEvent('garage::close', {}); + }); + } + + // Status filters + const filterBtns = document.querySelectorAll('.filter-btn'); + filterBtns.forEach(btn => { + btn.addEventListener('click', () => { + filterBtns.forEach(b => b.classList.remove('active')); + btn.classList.add('active'); + statusFilter = btn.dataset.filter; + renderVehicles(); + }); + }); + + // Type filters + const typeItems = document.querySelectorAll('.type-item'); + typeItems.forEach(item => { + item.addEventListener('click', () => { + typeItems.forEach(i => i.classList.remove('active')); + item.classList.add('active'); + typeFilter = item.dataset.type; + renderVehicles(); + }); + }); + + // Search + const searchInput = document.getElementById('searchInput'); + if (searchInput) { + searchInput.addEventListener('input', (e) => { + searchQuery = e.target.value.toLowerCase(); + renderVehicles(); + }); + } + + // Spawn button + const spawnBtn = document.getElementById('spawnBtn'); + if (spawnBtn) { + spawnBtn.addEventListener('click', () => { + if (selectedVehicle) { + spawnVehicle(selectedVehicle); + } + }); + } + + // Store button + const storeBtn = document.getElementById('storeBtn'); + if (storeBtn) { + storeBtn.addEventListener('click', () => { + if (selectedVehicle) { + storeVehicle(selectedVehicle); + } + }); + } +} + +// Render vehicles +function renderVehicles() { + const vehiclesGrid = document.getElementById('vehiclesGrid'); + if (!vehiclesGrid) return; + + vehiclesGrid.innerHTML = ''; + + // Filter vehicles + let filtered = mockData.vehicles; + + // Status filter + if (statusFilter !== 'all') { + filtered = filtered.filter(v => v.status === statusFilter); + } + + // Type filter + if (typeFilter !== 'all') { + filtered = filtered.filter(v => v.type === typeFilter); + } + + // Search filter + if (searchQuery) { + filtered = filtered.filter(v => + v.name.toLowerCase().includes(searchQuery) || + v.type.toLowerCase().includes(searchQuery) + ); + } + + // Render vehicles + filtered.forEach(vehicle => { + const card = document.createElement('div'); + card.className = 'vehicle-card'; + if (selectedVehicle && selectedVehicle.id === vehicle.id) { + card.classList.add('selected'); + } + + card.innerHTML = ` +
${vehicle.icon}
+
${vehicle.name}
+
${vehicle.type}
+
${vehicle.status}
+ `; + + card.addEventListener('click', () => selectVehicle(vehicle)); + vehiclesGrid.appendChild(card); + }); + + console.log(`Rendered ${filtered.length} vehicles`); +} + +// Select vehicle +function selectVehicle(vehicle) { + selectedVehicle = vehicle; + + // Update selected state in grid + document.querySelectorAll('.vehicle-card').forEach(card => { + card.classList.remove('selected'); + }); + event.currentTarget.classList.add('selected'); + + // Show details + showVehicleDetails(vehicle); +} + +// Show vehicle details +function showVehicleDetails(vehicle) { + const noSelection = document.getElementById('noSelection'); + const vehicleDetails = document.getElementById('vehicleDetails'); + const spawnBtn = document.getElementById('spawnBtn'); + const storeBtn = document.getElementById('storeBtn'); + + if (noSelection) noSelection.style.display = 'none'; + if (vehicleDetails) vehicleDetails.style.display = 'flex'; + + // Update details + document.getElementById('detailIcon').textContent = vehicle.icon; + document.getElementById('detailName').textContent = vehicle.name; + document.getElementById('detailType').textContent = vehicle.type; + document.getElementById('detailStatus').textContent = vehicle.status; + document.getElementById('detailCondition').textContent = `${vehicle.condition}%`; + document.getElementById('detailFuel').textContent = `${vehicle.fuel}%`; + document.getElementById('detailLocation').textContent = vehicle.location; + document.getElementById('detailSeats').textContent = vehicle.seats; + document.getElementById('detailSpeed').textContent = vehicle.speed; + document.getElementById('detailCargo').textContent = vehicle.cargo; + + // Show/hide action buttons based on status + if (vehicle.status === 'stored') { + spawnBtn.style.display = 'flex'; + storeBtn.style.display = 'none'; + } else { + spawnBtn.style.display = 'none'; + storeBtn.style.display = 'flex'; + } +} + +// Spawn vehicle +function spawnVehicle(vehicle) { + console.log('Spawning vehicle:', vehicle.name); + + // Update local state + vehicle.status = 'active'; + vehicle.location = 'In Use'; + + sendEvent('garage::spawn', { + vehicleId: vehicle.id, + vehicleName: vehicle.name, + vehicleType: vehicle.type + }); + + // Re-render + renderVehicles(); + updateStats(); + if (selectedVehicle && selectedVehicle.id === vehicle.id) { + showVehicleDetails(vehicle); + } +} + +// Store vehicle +function storeVehicle(vehicle) { + console.log('Storing vehicle:', vehicle.name); + + // Update local state + vehicle.status = 'stored'; + vehicle.location = 'Garage A'; + + sendEvent('garage::store', { + vehicleId: vehicle.id, + vehicleName: vehicle.name, + vehicleType: vehicle.type + }); + + // Re-render + renderVehicles(); + updateStats(); + if (selectedVehicle && selectedVehicle.id === vehicle.id) { + showVehicleDetails(vehicle); + } +} + +// Update stats +function updateStats() { + const stored = mockData.vehicles.filter(v => v.status === 'stored').length; + const active = mockData.vehicles.filter(v => v.status === 'active').length; + const capacity = mockData.vehicles.length + 6; // Mock capacity + + document.getElementById('storedCount').textContent = stored; + document.getElementById('activeCount').textContent = active; + document.getElementById('capacityCount').textContent = capacity; +} + +// Update garage data from external source +function updateGarageData(data) { + if (data.vehicles) { + mockData.vehicles = data.vehicles; + renderVehicles(); + updateStats(); + + // Update selected vehicle if it still exists + if (selectedVehicle) { + const updated = mockData.vehicles.find(v => v.id === selectedVehicle.id); + if (updated) { + selectedVehicle = updated; + showVehicleDetails(updated); + } else { + selectedVehicle = null; + const noSelection = document.getElementById('noSelection'); + const vehicleDetails = document.getElementById('vehicleDetails'); + if (noSelection) noSelection.style.display = 'flex'; + if (vehicleDetails) vehicleDetails.style.display = 'none'; + } + } + } +} + +// Send event to Arma +function sendEvent(event, data) { + if (typeof A3API !== 'undefined') { + A3API.SendAlert(JSON.stringify({ + event: event, + data: data + })); + } else { + console.log('Event:', event, 'Data:', data); + } +} + +// Auto-initialize +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initGarage); +} else { + initGarage(); +} + +// Expose functions globally +window.updateGarageData = updateGarageData; +window.selectVehicle = selectVehicle; +window.spawnVehicle = spawnVehicle; +window.storeVehicle = storeVehicle; diff --git a/arma/client/addons/actor/ui/_site/index.html b/arma/client/addons/actor/ui/_site/index.html new file mode 100644 index 0000000..8b482e8 --- /dev/null +++ b/arma/client/addons/actor/ui/_site/index.html @@ -0,0 +1,70 @@ + + + + + + + Interaction Menu + + + + + + +
+
+
+ +
+
+
+ + + + + + diff --git a/arma/client/addons/actor/ui/_site/script.js b/arma/client/addons/actor/ui/_site/script.js new file mode 100644 index 0000000..7f0a62f --- /dev/null +++ b/arma/client/addons/actor/ui/_site/script.js @@ -0,0 +1,424 @@ +/** + * Redux-like Pattern for Actor Menu Management + */ + +//============================================================================= +// #region ACTIONS +//============================================================================= + +// Action Types +const ActionTypes = { + SET_AVAILABLE_ACTIONS: "SET_AVAILABLE_ACTIONS", + SET_MENU_ITEMS: "SET_MENU_ITEMS", + ADD_ACTION: "ADD_ACTION", + REMOVE_ACTION: "REMOVE_ACTION", + CLEAR_ACTIONS: "CLEAR_ACTIONS", +}; + +// Action Creators +const actions = { + setAvailableActions: (actionTypes) => ({ + type: ActionTypes.SET_AVAILABLE_ACTIONS, + payload: actionTypes, + }), + + setMenuItems: (menuItems) => ({ + type: ActionTypes.SET_MENU_ITEMS, + payload: menuItems, + }), + + addAction: (actionType) => ({ + type: ActionTypes.ADD_ACTION, + payload: actionType, + }), + + removeAction: (actionType) => ({ + type: ActionTypes.REMOVE_ACTION, + payload: actionType, + }), + + clearActions: () => ({ + type: ActionTypes.CLEAR_ACTIONS, + }), +}; + +//============================================================================= +// #region REDUCER +//============================================================================= + +const baseMenuItems = [ + { + id: "bank", + title: "Banking Services", + description: "Access your bank account and manage finances", + icon: "", + action: "actor::open::bank", + }, + { + id: "phone", + title: "Personal Phone", + description: "Access and manage your personal phone", + icon: "", + action: "actor::open::phone", + }, + { + id: "org", + title: "Organization Dashboard", + description: "View and manage your organization data", + icon: "", + action: "actor::open::org", + }, +]; + +const actionDefinitions = { + device: { + id: "device", + title: "Device Interaction", + description: "Manage devices and settings", + icon: "", + action: "actor::open::device", + }, + garage: { + id: "garage", + title: "Vehicle Garage", + description: "Access and manage your vehicle collection", + icon: "", + action: "actor::open::garage", + }, + locker: { + id: "locker", + title: "Locker", + description: "Access your personal locker for storage", + icon: "", + action: "actor::open::locker", + }, + player: { + id: "player", + title: "Player Interaction", + description: "Interact with player-specific actions", + icon: "", + action: "actor::open::iplayer", + }, + store: { + id: "store", + title: "Store", + description: "Browse and purchase items from the store", + icon: "", + action: "actor::open::store", + }, + va: { + id: "va", + title: "Virtual Arsenal", + description: "Access your virtual arsenal", + icon: "", + action: "actor::open::arsenal", + }, + vg: { + id: "vg", + title: "Virtual Garage", + description: "Access your virtual garage", + icon: "", + action: "actor::open::vgarage", + }, +}; + +const initialState = { + availableActions: [], + menuItems: [...baseMenuItems], + baseMenuItems: [...baseMenuItems], + actionDefinitions: { ...actionDefinitions }, +}; + +function actorReducer(state = initialState, action) { + switch (action.type) { + case ActionTypes.SET_AVAILABLE_ACTIONS: + const newMenuItems = [...state.baseMenuItems]; + + // Process available actions + const actionArray = Array.isArray(action.payload) + ? action.payload + : []; + actionArray.forEach((actionItem) => { + if (Array.isArray(actionItem) && actionItem.length === 2) { + const [type, value] = actionItem; + const definition = state.actionDefinitions[value]; + if (definition) { + newMenuItems.push(definition); + } else { + console.warn( + `No definition found for: ${type} - ${value}`, + ); + } + } else { + console.warn("Invalid action format:", actionItem); + } + }); + + return { + ...state, + availableActions: action.payload, + menuItems: newMenuItems, + }; + + case ActionTypes.SET_MENU_ITEMS: + return { + ...state, + menuItems: action.payload, + }; + + case ActionTypes.ADD_ACTION: + const definition = state.actionDefinitions[action.payload]; + if ( + definition && + !state.menuItems.find((item) => item.id === definition.id) + ) { + return { + ...state, + menuItems: [...state.menuItems, definition], + }; + } + return state; + + case ActionTypes.REMOVE_ACTION: + return { + ...state, + menuItems: state.menuItems.filter( + (item) => item.id !== action.payload, + ), + }; + + case ActionTypes.CLEAR_ACTIONS: + return { + ...state, + availableActions: [], + menuItems: [...state.baseMenuItems], + }; + + default: + return state; + } +} + +//============================================================================= +// #region STORE +//============================================================================= + +class Store { + constructor(reducer, initialState) { + this.reducer = reducer; + this.state = initialState; + this.listeners = []; + } + + getState() { + return this.state; + } + + dispatch(action) { + console.log("Dispatching action:", action); + this.state = this.reducer(this.state, action); + this.listeners.forEach((listener) => listener(this.state)); + } + + subscribe(listener) { + this.listeners.push(listener); + return () => { + this.listeners = this.listeners.filter((l) => l !== listener); + }; + } +} + +// Create store instance +const store = new Store(actorReducer, initialState); + +//============================================================================= +// #region SELECTORS +//============================================================================= + +const selectors = { + getMenuItems: (state) => state.menuItems, + getAvailableActions: (state) => state.availableActions, + getBaseMenuItems: (state) => state.baseMenuItems, + getActionDefinitions: (state) => state.actionDefinitions, + getMenuItemById: (state, id) => + state.menuItems.find((item) => item.id === id), + getMenuItemsCount: (state) => state.menuItems.length, +}; + +//============================================================================= +// #region UI COMPONENTS (Redux-connected) +//============================================================================= + +class ActorUI { + constructor(store) { + this.store = store; + this.unsubscribe = null; + } + + init() { + console.log("ActorUI initializing..."); + + // Subscribe to state changes + this.unsubscribe = this.store.subscribe((state) => { + this.render(state); + }); + + // Initial render + this.render(this.store.getState()); + + // Request initial data + this.requestInitialData(); + + console.log("ActorUI initialized successfully"); + } + + render(state) { + this.updateMenuDisplay(state); + } + + updateMenuDisplay(state) { + const grid = document.getElementById("menuGrid"); + if (!grid) { + console.error("Menu grid element not found"); + return; + } + + // Clear existing menu items + grid.innerHTML = ""; + + // Render menu items + const menuItems = selectors.getMenuItems(state); + menuItems.forEach((item) => { + const menuItem = document.createElement("div"); + menuItem.className = "neu-menu-item"; + menuItem.setAttribute("data-action", item.action); + menuItem.innerHTML = ` +
${item.icon}
+
${item.title}
+
${item.description}
+ `; + menuItem.addEventListener("click", () => + this.handleMenuItemClick(item), + ); + + grid.appendChild(menuItem); + }); + + console.log(`Rendered ${menuItems.length} menu items`); + } + + handleMenuItemClick(item) { + console.log("Menu item clicked:", item); + const alert = { + event: item.action, + data: {}, + }; + A3API.SendAlert(JSON.stringify(alert)); + } + + requestInitialData() { + console.log("Requesting initial actor data..."); + const alert = { + event: "actor::get::actions", + data: {}, + }; + A3API.SendAlert(JSON.stringify(alert)); + } + + destroy() { + if (this.unsubscribe) { + this.unsubscribe(); + } + } +} + +//============================================================================= +// #region DATA HANDLERS (Redux-connected) +//============================================================================= + +function updateAvailableActions(actionTypes) { + console.log("Updating available actions:", actionTypes); + store.dispatch(actions.setAvailableActions(actionTypes)); +} + +function handleGetActionsResponse(data) { + console.log("Received actions data:", data); + store.dispatch(actions.setAvailableActions(data)); +} + +//============================================================================= +// #region ACTION HANDLERS +//============================================================================= + +function handleMenuItemClick(item) { + console.log("Legacy menu item click handler:", item); + const alert = { + event: item.action, + data: {}, + }; + A3API.SendAlert(JSON.stringify(alert)); +} + +//============================================================================= +// #region INITIALIZATION FUNCTIONS +//============================================================================= + +// Global flag to prevent double initialization +let actorUIInitialized = false; + +/** + * Initialize the actor interface - called from HTML after script loads + */ +function initializeMenu() { + console.log("initializeMenu() called"); + + if (actorUIInitialized) { + console.log("ActorUI already initialized, skipping..."); + return; + } + + // Check if DOM is ready + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", () => { + if (!actorUIInitialized) { + console.log("DOM loaded, initializing ActorUI..."); + window.actorUI = new ActorUI(store); + window.actorUI.init(); + actorUIInitialized = true; + } + }); + } else { + // DOM is already ready + console.log("DOM already ready, initializing ActorUI..."); + window.actorUI = new ActorUI(store); + window.actorUI.init(); + actorUIInitialized = true; + } +} + +//============================================================================= +// #region GLOBAL VARIABLES +//============================================================================= + +// Make actorUI globally accessible +let actorUI; + +// Auto-initialize if DOM is already loaded when script executes +if (document.readyState !== "loading") { + console.log("Script loaded after DOM ready, auto-initializing..."); + if (!actorUIInitialized) { + actorUI = new ActorUI(store); + actorUI.init(); + actorUIInitialized = true; + } +} else { + // Wait for DOM to be ready + document.addEventListener("DOMContentLoaded", () => { + if (!actorUIInitialized) { + console.log("DOM loaded, initializing ActorUI..."); + actorUI = new ActorUI(store); + actorUI.init(); + actorUIInitialized = true; + } + }); +} diff --git a/arma/client/addons/actor/ui/_site/script.js.bak b/arma/client/addons/actor/ui/_site/script.js.bak new file mode 100644 index 0000000..288057e --- /dev/null +++ b/arma/client/addons/actor/ui/_site/script.js.bak @@ -0,0 +1,417 @@ +/** + * Redux-like Pattern for Actor Menu Management + */ + +//============================================================================= +// #region ACTIONS +//============================================================================= + +// Action Types +const ActionTypes = { + SET_AVAILABLE_ACTIONS: "SET_AVAILABLE_ACTIONS", + SET_MENU_ITEMS: "SET_MENU_ITEMS", + ADD_ACTION: "ADD_ACTION", + REMOVE_ACTION: "REMOVE_ACTION", + CLEAR_ACTIONS: "CLEAR_ACTIONS", +}; + +// Action Creators +const actions = { + setAvailableActions: (actionTypes) => ({ + type: ActionTypes.SET_AVAILABLE_ACTIONS, + payload: actionTypes, + }), + + setMenuItems: (menuItems) => ({ + type: ActionTypes.SET_MENU_ITEMS, + payload: menuItems, + }), + + addAction: (actionType) => ({ + type: ActionTypes.ADD_ACTION, + payload: actionType, + }), + + removeAction: (actionType) => ({ + type: ActionTypes.REMOVE_ACTION, + payload: actionType, + }), + + clearActions: () => ({ + type: ActionTypes.CLEAR_ACTIONS, + }), +}; + +//============================================================================= +// #region REDUCER +//============================================================================= + +const baseMenuItems = [ + { + id: "bank", + title: "Banking Services", + description: "Access your bank account and manage finances", + icon: "", + action: "actor::open::bank", + }, + { + id: "phone", + title: "Personal Phone", + description: "Access and manage your personal phone", + icon: "", + action: "actor::open::phone", + }, +]; + +const actionDefinitions = { + device: { + id: "device", + title: "Device Interaction", + description: "Manage devices and settings", + icon: "", + action: "actor::open::device", + }, + garage: { + id: "garage", + title: "Vehicle Garage", + description: "Access and manage your vehicle collection", + icon: "", + action: "actor::open::garage", + }, + locker: { + id: "locker", + title: "Locker", + description: "Access your personal locker for storage", + icon: "", + action: "actor::open::locker", + }, + player: { + id: "player", + title: "Player Interaction", + description: "Interact with player-specific actions", + icon: "", + action: "actor::open::iplayer", + }, + store: { + id: "store", + title: "Store", + description: "Browse and purchase items from the store", + icon: "", + action: "actor::open::store", + }, + va: { + id: "va", + title: "Virtual Arsenal", + description: "Access your virtual arsenal", + icon: "", + action: "actor::open::arsenal", + }, + vg: { + id: "vg", + title: "Virtual Garage", + description: "Access your virtual garage", + icon: "", + action: "actor::open::vgarage", + }, +}; + +const initialState = { + availableActions: [], + menuItems: [...baseMenuItems], + baseMenuItems: [...baseMenuItems], + actionDefinitions: { ...actionDefinitions }, +}; + +function actorReducer(state = initialState, action) { + switch (action.type) { + case ActionTypes.SET_AVAILABLE_ACTIONS: + const newMenuItems = [...state.baseMenuItems]; + + // Process available actions + const actionArray = Array.isArray(action.payload) + ? action.payload + : []; + actionArray.forEach((actionItem) => { + if (Array.isArray(actionItem) && actionItem.length === 2) { + const [type, value] = actionItem; + const definition = state.actionDefinitions[value]; + if (definition) { + newMenuItems.push(definition); + } else { + console.warn( + `No definition found for: ${type} - ${value}`, + ); + } + } else { + console.warn("Invalid action format:", actionItem); + } + }); + + return { + ...state, + availableActions: action.payload, + menuItems: newMenuItems, + }; + + case ActionTypes.SET_MENU_ITEMS: + return { + ...state, + menuItems: action.payload, + }; + + case ActionTypes.ADD_ACTION: + const definition = state.actionDefinitions[action.payload]; + if ( + definition && + !state.menuItems.find((item) => item.id === definition.id) + ) { + return { + ...state, + menuItems: [...state.menuItems, definition], + }; + } + return state; + + case ActionTypes.REMOVE_ACTION: + return { + ...state, + menuItems: state.menuItems.filter( + (item) => item.id !== action.payload, + ), + }; + + case ActionTypes.CLEAR_ACTIONS: + return { + ...state, + availableActions: [], + menuItems: [...state.baseMenuItems], + }; + + default: + return state; + } +} + +//============================================================================= +// #region STORE +//============================================================================= + +class Store { + constructor(reducer, initialState) { + this.reducer = reducer; + this.state = initialState; + this.listeners = []; + } + + getState() { + return this.state; + } + + dispatch(action) { + console.log("Dispatching action:", action); + this.state = this.reducer(this.state, action); + this.listeners.forEach((listener) => listener(this.state)); + } + + subscribe(listener) { + this.listeners.push(listener); + return () => { + this.listeners = this.listeners.filter((l) => l !== listener); + }; + } +} + +// Create store instance +const store = new Store(actorReducer, initialState); + +//============================================================================= +// #region SELECTORS +//============================================================================= + +const selectors = { + getMenuItems: (state) => state.menuItems, + getAvailableActions: (state) => state.availableActions, + getBaseMenuItems: (state) => state.baseMenuItems, + getActionDefinitions: (state) => state.actionDefinitions, + getMenuItemById: (state, id) => + state.menuItems.find((item) => item.id === id), + getMenuItemsCount: (state) => state.menuItems.length, +}; + +//============================================================================= +// #region UI COMPONENTS (Redux-connected) +//============================================================================= + +class ActorUI { + constructor(store) { + this.store = store; + this.unsubscribe = null; + } + + init() { + console.log("ActorUI initializing..."); + + // Subscribe to state changes + this.unsubscribe = this.store.subscribe((state) => { + this.render(state); + }); + + // Initial render + this.render(this.store.getState()); + + // Request initial data + this.requestInitialData(); + + console.log("ActorUI initialized successfully"); + } + + render(state) { + this.updateMenuDisplay(state); + } + + updateMenuDisplay(state) { + const grid = document.getElementById("menuGrid"); + if (!grid) { + console.error("Menu grid element not found"); + return; + } + + // Clear existing menu items + grid.innerHTML = ""; + + // Render menu items + const menuItems = selectors.getMenuItems(state); + menuItems.forEach((item) => { + const menuItem = document.createElement("div"); + menuItem.className = "neu-menu-item"; + menuItem.setAttribute("data-action", item.action); + menuItem.innerHTML = ` +
${item.icon}
+
${item.title}
+
${item.description}
+ `; + menuItem.addEventListener("click", () => + this.handleMenuItemClick(item), + ); + + grid.appendChild(menuItem); + }); + + console.log(`Rendered ${menuItems.length} menu items`); + } + + handleMenuItemClick(item) { + console.log("Menu item clicked:", item); + const alert = { + event: item.action, + data: {}, + }; + A3API.SendAlert(JSON.stringify(alert)); + } + + requestInitialData() { + console.log("Requesting initial actor data..."); + const alert = { + event: "actor::get::actions", + data: {}, + }; + A3API.SendAlert(JSON.stringify(alert)); + } + + destroy() { + if (this.unsubscribe) { + this.unsubscribe(); + } + } +} + +//============================================================================= +// #region DATA HANDLERS (Redux-connected) +//============================================================================= + +function updateAvailableActions(actionTypes) { + console.log("Updating available actions:", actionTypes); + store.dispatch(actions.setAvailableActions(actionTypes)); +} + +function handleGetActionsResponse(data) { + console.log("Received actions data:", data); + store.dispatch(actions.setAvailableActions(data)); +} + +//============================================================================= +// #region ACTION HANDLERS +//============================================================================= + +function handleMenuItemClick(item) { + console.log("Legacy menu item click handler:", item); + const alert = { + event: item.action, + data: {}, + }; + A3API.SendAlert(JSON.stringify(alert)); +} + +//============================================================================= +// #region INITIALIZATION FUNCTIONS +//============================================================================= + +// Global flag to prevent double initialization +let actorUIInitialized = false; + +/** + * Initialize the actor interface - called from HTML after script loads + */ +function initializeMenu() { + console.log("initializeMenu() called"); + + if (actorUIInitialized) { + console.log("ActorUI already initialized, skipping..."); + return; + } + + // Check if DOM is ready + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", () => { + if (!actorUIInitialized) { + console.log("DOM loaded, initializing ActorUI..."); + window.actorUI = new ActorUI(store); + window.actorUI.init(); + actorUIInitialized = true; + } + }); + } else { + // DOM is already ready + console.log("DOM already ready, initializing ActorUI..."); + window.actorUI = new ActorUI(store); + window.actorUI.init(); + actorUIInitialized = true; + } +} + +//============================================================================= +// #region GLOBAL VARIABLES +//============================================================================= + +// Make actorUI globally accessible +let actorUI; + +// Auto-initialize if DOM is already loaded when script executes +if (document.readyState !== "loading") { + console.log("Script loaded after DOM ready, auto-initializing..."); + if (!actorUIInitialized) { + actorUI = new ActorUI(store); + actorUI.init(); + actorUIInitialized = true; + } +} else { + // Wait for DOM to be ready + document.addEventListener("DOMContentLoaded", () => { + if (!actorUIInitialized) { + console.log("DOM loaded, initializing ActorUI..."); + actorUI = new ActorUI(store); + actorUI.init(); + actorUIInitialized = true; + } + }); +} diff --git a/arma/client/addons/actor/ui/_site/store.css b/arma/client/addons/actor/ui/_site/store.css new file mode 100644 index 0000000..4974a9b --- /dev/null +++ b/arma/client/addons/actor/ui/_site/store.css @@ -0,0 +1,567 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + height: 100vh; + width: 100vw; + background: rgba(0, 0, 0, 0.7); + font-family: Arial, sans-serif; + color: rgba(200, 220, 240, 0.95); + overflow: hidden; +} + +.store-container { + height: 100vh; + width: 100vw; + padding: 2rem; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +/* Header Section */ +.store-header { + display: flex; + align-items: center; + gap: 1.5rem; + padding: 1.25rem 1.5rem; + background: rgba(15, 20, 30, 0.9); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + box-shadow: + 0 0 20px rgba(100, 150, 200, 0.15), + 0 4px 16px rgba(0, 0, 0, 0.8); +} + +.store-logo { + width: 60px; + height: 60px; + background: rgba(20, 30, 45, 0.8); + border: 2px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; +} + +.logo-icon { + font-size: 2rem; +} + +.store-info { + flex: 1; +} + +.store-title { + font-size: 1.5rem; + font-weight: 600; + letter-spacing: 0.5px; + text-transform: uppercase; + color: rgba(200, 220, 255, 1); + margin-bottom: 0.25rem; +} + +.store-subtitle { + font-size: 0.875rem; + color: rgba(140, 160, 180, 0.8); + letter-spacing: 0.5px; +} + +.balance-display { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 0.25rem; + padding: 0.75rem 1.25rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 200, 150, 0.4); + border-radius: 4px; +} + +.balance-label { + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(140, 160, 180, 0.8); +} + +.balance-amount { + font-size: 1.25rem; + font-weight: 600; + color: rgba(100, 200, 150, 1); +} + +.header-actions { + display: flex; + gap: 0.75rem; +} + +.action-btn { + padding: 0.625rem 1.25rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.875rem; + text-transform: uppercase; + letter-spacing: 0.5px; + cursor: pointer; + transition: all 0.15s ease; +} + +.action-btn:hover { + background: rgba(30, 45, 70, 0.9); + border-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.2), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.cart-btn { + display: flex; + align-items: center; + gap: 0.5rem; + position: relative; +} + +.cart-icon { + font-size: 1.25rem; +} + +.cart-count { + min-width: 24px; + height: 24px; + padding: 0 0.5rem; + background: rgba(100, 150, 200, 0.3); + border: 1px solid rgba(100, 150, 200, 0.5); + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.75rem; + font-weight: 600; +} + +.close-btn { + border-color: rgba(200, 100, 100, 0.4); +} + +.close-btn:hover { + border-color: rgba(255, 100, 100, 0.7); + box-shadow: + 0 0 15px rgba(200, 100, 100, 0.2), + inset 0 0 20px rgba(200, 100, 100, 0.05); +} + +/* Main Content */ +.store-content { + flex: 1; + display: grid; + grid-template-columns: 250px 1fr; + gap: 1.5rem; + overflow: hidden; +} + +.store-content.cart-open { + grid-template-columns: 250px 1fr 350px; +} + +/* Panels */ +.store-panel { + background: rgba(15, 20, 30, 0.9); + border: 1px solid rgba(100, 150, 200, 0.4); + border-left: 3px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + display: flex; + flex-direction: column; + box-shadow: + 0 0 20px rgba(100, 150, 200, 0.1), + 0 4px 16px rgba(0, 0, 0, 0.6); +} + +.panel-header { + padding: 1.25rem 1.5rem; + border-bottom: 1px solid rgba(100, 150, 200, 0.2); + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +.panel-title { + font-size: 1rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(200, 220, 255, 1); +} + +.panel-content { + flex: 1; + padding: 1.5rem; + overflow-y: auto; +} + +/* Custom Scrollbar */ +.panel-content::-webkit-scrollbar { + width: 8px; +} + +.panel-content::-webkit-scrollbar-track { + background: rgba(15, 20, 30, 0.5); + border-radius: 4px; +} + +.panel-content::-webkit-scrollbar-thumb { + background: rgba(100, 150, 200, 0.3); + border-radius: 4px; +} + +.panel-content::-webkit-scrollbar-thumb:hover { + background: rgba(100, 150, 200, 0.5); +} + +/* Search Box */ +.search-box { + flex: 1; + max-width: 300px; +} + +.search-input { + width: 100%; + padding: 0.625rem 1rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.875rem; + transition: all 0.15s ease; +} + +.search-input:focus { + outline: none; + border-color: rgba(150, 200, 255, 0.6); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.search-input::placeholder { + color: rgba(100, 120, 140, 0.6); +} + +/* Category List */ +.category-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.category-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 1rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + cursor: pointer; + transition: all 0.15s ease; + text-align: left; +} + +.category-item:hover { + background: rgba(30, 45, 70, 0.7); + border-left-color: rgba(150, 200, 255, 0.7); +} + +.category-item.active { + background: rgba(30, 45, 70, 0.8); + border-left-color: rgba(100, 200, 150, 0.8); + box-shadow: + 0 0 15px rgba(100, 200, 150, 0.15), + inset 0 0 20px rgba(100, 200, 150, 0.05); +} + +.category-icon { + font-size: 1.5rem; +} + +.category-name { + flex: 1; + font-size: 0.875rem; + font-weight: 500; +} + +.category-count { + padding: 0.25rem 0.5rem; + background: rgba(100, 150, 200, 0.2); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 3px; + font-size: 0.75rem; + font-weight: 600; +} + +/* Items Grid */ +.items-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 1rem; +} + +.item-card { + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + padding: 1.25rem; + cursor: pointer; + transition: all 0.15s ease; + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.item-card:hover { + background: rgba(30, 45, 70, 0.7); + border-left-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.item-icon { + font-size: 3rem; + text-align: center; +} + +.item-name { + font-size: 0.95rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); + text-align: center; +} + +.item-description { + font-size: 0.75rem; + color: rgba(140, 160, 180, 0.85); + text-align: center; + line-height: 1.3; + min-height: 2.6rem; +} + +.item-price { + font-size: 1.125rem; + font-weight: 600; + color: rgba(100, 200, 150, 1); + text-align: center; + margin-top: auto; +} + +.item-actions { + display: flex; + gap: 0.5rem; + margin-top: 0.5rem; +} + +.add-to-cart-btn { + flex: 1; + padding: 0.625rem; + background: rgba(100, 150, 200, 0.2); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + cursor: pointer; + transition: all 0.15s ease; +} + +.add-to-cart-btn:hover { + background: rgba(100, 150, 200, 0.3); + border-color: rgba(150, 200, 255, 0.6); +} + +/* Cart Panel */ +.cart-items { + display: flex; + flex-direction: column; + gap: 0.75rem; + margin-bottom: 1.5rem; +} + +.empty-cart { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + padding: 3rem 1rem; +} + +.empty-icon { + font-size: 3rem; + opacity: 0.3; +} + +.empty-text { + font-size: 0.875rem; + color: rgba(140, 160, 180, 0.7); +} + +.cart-item { + padding: 1rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; +} + +.cart-item-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.5rem; +} + +.cart-item-name { + font-size: 0.875rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); +} + +.cart-item-remove { + padding: 0.25rem 0.5rem; + background: rgba(200, 100, 100, 0.2); + border: 1px solid rgba(200, 100, 100, 0.4); + border-radius: 3px; + color: rgba(255, 150, 150, 0.9); + font-size: 0.7rem; + cursor: pointer; + transition: all 0.15s ease; +} + +.cart-item-remove:hover { + background: rgba(200, 100, 100, 0.3); +} + +.cart-item-details { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 0.8rem; + color: rgba(160, 180, 200, 0.85); +} + +.cart-item-price { + color: rgba(100, 200, 150, 1); + font-weight: 600; +} + +.clear-cart-btn { + padding: 0.5rem 0.75rem; + background: rgba(200, 100, 100, 0.2); + border: 1px solid rgba(200, 100, 100, 0.4); + border-radius: 4px; + color: rgba(255, 150, 150, 0.9); + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + cursor: pointer; + transition: all 0.15s ease; +} + +.clear-cart-btn:hover { + background: rgba(200, 100, 100, 0.3); +} + +/* Cart Summary */ +.cart-summary { + padding-top: 1.5rem; + border-top: 1px solid rgba(100, 150, 200, 0.2); +} + +.summary-row { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.75rem; +} + +.summary-label { + font-size: 0.875rem; + color: rgba(160, 180, 200, 0.85); +} + +.summary-value { + font-size: 0.95rem; + font-weight: 600; + color: rgba(200, 220, 240, 0.95); +} + +.summary-total { + padding-top: 0.75rem; + border-top: 1px solid rgba(100, 150, 200, 0.2); + margin-top: 0.5rem; +} + +.summary-total .summary-label { + font-size: 1rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); +} + +.summary-total .summary-value { + font-size: 1.25rem; + color: rgba(100, 200, 150, 1); +} + +.action-btn-primary { + width: 100%; + padding: 0.875rem; + margin-top: 1rem; + background: rgba(100, 150, 200, 0.2); + border: 1px solid rgba(100, 150, 200, 0.5); +} + +.action-btn-primary:hover { + background: rgba(100, 150, 200, 0.3); + border-color: rgba(150, 200, 255, 0.7); +} + +.checkout-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.checkout-btn:disabled:hover { + background: rgba(100, 150, 200, 0.2); + border-color: rgba(100, 150, 200, 0.5); + box-shadow: none; +} + +/* Responsive adjustments */ +@media (max-width: 1400px) { + .items-grid { + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + } +} + +@media (max-width: 1200px) { + .store-content { + grid-template-columns: 1fr; + } + + .store-content.cart-open { + grid-template-columns: 1fr 350px; + } + + .categories-panel { + display: none; + } +} diff --git a/arma/client/addons/actor/ui/_site/store.html b/arma/client/addons/actor/ui/_site/store.html new file mode 100644 index 0000000..debed7c --- /dev/null +++ b/arma/client/addons/actor/ui/_site/store.html @@ -0,0 +1,149 @@ + + + + + + + Store + + + + + + +
+ +
+ +
+

Supply Store

+

Equipment & Resources

+
+
+ Available Funds + $45,750 +
+
+ + +
+
+ + +
+ +
+
+

Categories

+
+
+
+ + + + + +
+
+
+ + +
+
+

Available Items

+ +
+
+
+ +
+
+
+ + + +
+
+ + + + + diff --git a/arma/client/addons/actor/ui/_site/store.js b/arma/client/addons/actor/ui/_site/store.js new file mode 100644 index 0000000..8d85756 --- /dev/null +++ b/arma/client/addons/actor/ui/_site/store.js @@ -0,0 +1,339 @@ +/** + * Store Interface + * Handles item browsing, cart management, and purchases + */ + +// Mock data +const mockData = { + balance: 45750, + items: [ + // Weapons + { id: 1, name: "Assault Rifle", category: "weapons", icon: "🔫", description: "Standard military-grade rifle", price: 2500 }, + { id: 2, name: "Sniper Rifle", category: "weapons", icon: "🎯", description: "Long-range precision weapon", price: 4500 }, + { id: 3, name: "SMG", category: "weapons", icon: "🔫", description: "Close-quarters combat", price: 1800 }, + { id: 4, name: "Pistol", category: "weapons", icon: "🔫", description: "Sidearm backup weapon", price: 800 }, + { id: 5, name: "Shotgun", category: "weapons", icon: "🔫", description: "Close-range powerhouse", price: 1500 }, + { id: 6, name: "LMG", category: "weapons", icon: "🔫", description: "Heavy suppression weapon", price: 3500 }, + { id: 7, name: "Grenade Launcher", category: "weapons", icon: "💣", description: "Explosive ordnance", price: 5000 }, + { id: 8, name: "Rocket Launcher", category: "weapons", icon: "🚀", description: "Anti-vehicle weapon", price: 8000 }, + + // Equipment + { id: 9, name: "Body Armor", category: "equipment", icon: "🎽", description: "Ballistic protection", price: 3000 }, + { id: 10, name: "Helmet", category: "equipment", icon: "⛑️", description: "Head protection", price: 1200 }, + { id: 11, name: "Night Vision", category: "equipment", icon: "🕶️", description: "See in the dark", price: 2500 }, + { id: 12, name: "GPS Device", category: "equipment", icon: "📡", description: "Navigation system", price: 800 }, + { id: 13, name: "Radio", category: "equipment", icon: "📻", description: "Team communication", price: 600 }, + { id: 14, name: "Backpack", category: "equipment", icon: "🎒", description: "Extra storage capacity", price: 500 }, + + // Medical + { id: 15, name: "First Aid Kit", category: "medical", icon: "💊", description: "Basic medical supplies", price: 400 }, + { id: 16, name: "Med Kit", category: "medical", icon: "⚕️", description: "Advanced medical kit", price: 1000 }, + { id: 17, name: "Bandages", category: "medical", icon: "🩹", description: "Stop bleeding", price: 150 }, + { id: 18, name: "Morphine", category: "medical", icon: "💉", description: "Pain management", price: 300 }, + { id: 19, name: "Blood Bag", category: "medical", icon: "🩸", description: "Restore blood level", price: 500 }, + + // Supplies + { id: 20, name: "Ammunition Box", category: "supplies", icon: "📦", description: "Mixed ammunition", price: 800 }, + { id: 21, name: "Explosive Charges", category: "supplies", icon: "💣", description: "Demolition supplies", price: 1500 }, + { id: 22, name: "Toolkit", category: "supplies", icon: "🔧", description: "Repair equipment", price: 600 }, + { id: 23, name: "Food Rations", category: "supplies", icon: "🥫", description: "Emergency supplies", price: 200 }, + { id: 24, name: "Water Canteen", category: "supplies", icon: "🧃", description: "Hydration supply", price: 150 } + ] +}; + +// State +let cart = []; +let selectedCategory = 'all'; +let searchQuery = ''; + +// Initialize +function initStore() { + console.log('Store interface initializing...'); + + setupEventHandlers(); + renderItems(); + updateBalance(); + + console.log('Store interface initialized'); +} + +// Event Handlers +function setupEventHandlers() { + // Close button + const closeBtn = document.querySelector('.close-btn'); + if (closeBtn) { + closeBtn.addEventListener('click', () => { + console.log('Closing store...'); + sendEvent('actor::close::store', {}); + }); + } + + // Cart toggle + const cartToggle = document.getElementById('cartToggle'); + const cartPanel = document.getElementById('cartPanel'); + const storeContent = document.querySelector('.store-content'); + + if (cartToggle && cartPanel) { + cartToggle.addEventListener('click', () => { + const isOpen = cartPanel.style.display !== 'none'; + cartPanel.style.display = isOpen ? 'none' : 'flex'; + storeContent.classList.toggle('cart-open', !isOpen); + }); + } + + // Category filters + const categoryItems = document.querySelectorAll('.category-item'); + categoryItems.forEach(item => { + item.addEventListener('click', () => { + categoryItems.forEach(c => c.classList.remove('active')); + item.classList.add('active'); + selectedCategory = item.dataset.category; + renderItems(); + }); + }); + + // Search + const searchInput = document.getElementById('searchInput'); + if (searchInput) { + searchInput.addEventListener('input', (e) => { + searchQuery = e.target.value.toLowerCase(); + renderItems(); + }); + } + + // Clear cart + const clearCartBtn = document.getElementById('clearCart'); + if (clearCartBtn) { + clearCartBtn.addEventListener('click', () => { + if (confirm('Clear all items from cart?')) { + cart = []; + renderCart(); + updateCartCount(); + } + }); + } + + // Checkout + const checkoutBtn = document.getElementById('checkoutBtn'); + if (checkoutBtn) { + checkoutBtn.addEventListener('click', handleCheckout); + } +} + +// Render items +function renderItems() { + const itemsGrid = document.getElementById('itemsGrid'); + if (!itemsGrid) return; + + itemsGrid.innerHTML = ''; + + // Filter items + let filteredItems = mockData.items; + + if (selectedCategory !== 'all') { + filteredItems = filteredItems.filter(item => item.category === selectedCategory); + } + + if (searchQuery) { + filteredItems = filteredItems.filter(item => + item.name.toLowerCase().includes(searchQuery) || + item.description.toLowerCase().includes(searchQuery) + ); + } + + // Render filtered items + filteredItems.forEach(item => { + const card = document.createElement('div'); + card.className = 'item-card'; + + card.innerHTML = ` +
${item.icon}
+
${item.name}
+
${item.description}
+
$${item.price.toLocaleString()}
+
+ +
+ `; + + const addBtn = card.querySelector('.add-to-cart-btn'); + addBtn.addEventListener('click', (e) => { + e.stopPropagation(); + addToCart(item); + }); + + itemsGrid.appendChild(card); + }); + + console.log(`Rendered ${filteredItems.length} items`); +} + +// Cart functions +function addToCart(item) { + const existingItem = cart.find(c => c.id === item.id); + + if (existingItem) { + existingItem.quantity++; + } else { + cart.push({ ...item, quantity: 1 }); + } + + renderCart(); + updateCartCount(); + + // Show cart panel if not visible + const cartPanel = document.getElementById('cartPanel'); + const storeContent = document.querySelector('.store-content'); + if (cartPanel.style.display === 'none') { + cartPanel.style.display = 'flex'; + storeContent.classList.add('cart-open'); + } + + console.log('Added to cart:', item.name); +} + +function removeFromCart(itemId) { + cart = cart.filter(item => item.id !== itemId); + renderCart(); + updateCartCount(); +} + +function renderCart() { + const cartItems = document.getElementById('cartItems'); + if (!cartItems) return; + + cartItems.innerHTML = ''; + + if (cart.length === 0) { + cartItems.innerHTML = ` +
+ 🛒 + Your cart is empty +
+ `; + } else { + cart.forEach(item => { + const cartItem = document.createElement('div'); + cartItem.className = 'cart-item'; + + cartItem.innerHTML = ` +
+ ${item.name} + +
+
+ Qty: ${item.quantity} + $${(item.price * item.quantity).toLocaleString()} +
+ `; + + const removeBtn = cartItem.querySelector('.cart-item-remove'); + removeBtn.addEventListener('click', () => removeFromCart(item.id)); + + cartItems.appendChild(cartItem); + }); + } + + updateCartSummary(); +} + +function updateCartCount() { + const cartCount = document.querySelector('.cart-count'); + if (cartCount) { + const totalItems = cart.reduce((sum, item) => sum + item.quantity, 0); + cartCount.textContent = totalItems; + } +} + +function updateCartSummary() { + const subtotal = cart.reduce((sum, item) => sum + (item.price * item.quantity), 0); + const tax = subtotal * 0.05; + const total = subtotal + tax; + + document.getElementById('cartSubtotal').textContent = `$${subtotal.toLocaleString()}`; + document.getElementById('cartTax').textContent = `$${tax.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; + document.getElementById('cartTotal').textContent = `$${total.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; + + const checkoutBtn = document.getElementById('checkoutBtn'); + if (checkoutBtn) { + checkoutBtn.disabled = cart.length === 0 || total > mockData.balance; + } +} + +function handleCheckout() { + const total = cart.reduce((sum, item) => sum + (item.price * item.quantity), 0); + const tax = total * 0.05; + const grandTotal = total + tax; + + if (grandTotal > mockData.balance) { + alert('Insufficient funds!'); + return; + } + + const purchaseData = { + items: cart.map(item => ({ + id: item.id, + name: item.name, + quantity: item.quantity, + price: item.price + })), + subtotal: total, + tax: tax, + total: grandTotal + }; + + console.log('Purchase request:', purchaseData); + sendEvent('actor::store::purchase', purchaseData); + + // Clear cart after purchase + cart = []; + renderCart(); + updateCartCount(); + + // Update balance (this would normally come from server) + mockData.balance -= grandTotal; + updateBalance(); +} + +function updateBalance() { + const balanceAmount = document.querySelector('.balance-amount'); + if (balanceAmount) { + balanceAmount.textContent = `$${mockData.balance.toLocaleString()}`; + } +} + +// Update store data from external source +function updateStoreData(data) { + if (data.balance !== undefined) { + mockData.balance = data.balance; + updateBalance(); + } + + if (data.items) { + mockData.items = data.items; + renderItems(); + } +} + +// Send event to Arma +function sendEvent(event, data) { + if (typeof A3API !== 'undefined') { + A3API.SendAlert(JSON.stringify({ + event: event, + data: data + })); + } else { + console.log('Event:', event, 'Data:', data); + } +} + +// Auto-initialize +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initStore); +} else { + initStore(); +} + +// Expose functions globally +window.updateStoreData = updateStoreData; +window.addToCart = addToCart; diff --git a/arma/client/addons/actor/ui/_site/style.css b/arma/client/addons/actor/ui/_site/style.css new file mode 100644 index 0000000..6bca60b --- /dev/null +++ b/arma/client/addons/actor/ui/_site/style.css @@ -0,0 +1,116 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + height: 100vh; + width: 100vw; + background: rgba(0, 0, 0, 0.5); + font-family: Arial, sans-serif; +} + +.container { + align-items: flex-end; + display: flex; + flex-direction: column; + justify-content: center; + height: 100%; + padding-right: 5%; + perspective: 1200px; +} + +.neu-menu { + background: rgba(15, 20, 30, 0.9); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + margin-right: 25%; + max-height: 640px; + width: 480px; + transform: rotateY(-10deg) translateZ(0); + transform-style: preserve-3d; + box-shadow: + -5px 0 15px rgba(100, 150, 200, 0.2), + 0 8px 32px rgba(0, 0, 0, 0.8); + + .neu-menu-content { + height: 100%; + overflow: hidden; + padding: 1rem; + + .neu-menu-grid { + display: grid; + max-height: 380px; + overflow-y: auto; + overflow-x: hidden; + scrollbar-width: thin; + -webkit-scrollbar-width: thin; + + .neu-menu-item { + align-items: flex-start; + background: rgba(20, 30, 45, 0.7); + border-left: 3px solid rgba(100, 150, 200, 0.5); + border-radius: 2px; + color: rgba(200, 220, 240, 0.95); + display: flex; + flex-direction: column; + justify-content: center; + margin-bottom: 0.5rem; + min-height: 70px; + padding: 0.75rem 1rem; + text-align: left; + transition: all 0.15s ease; + position: relative; + + &::before { + content: ''; + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 3px; + background: rgba(100, 150, 200, 0.8); + opacity: 0; + transition: opacity 0.15s ease; + } + + &:last-child { + margin-bottom: 0 !important; + } + + &:hover { + background: rgba(30, 45, 70, 0.9); + border-left-color: rgba(150, 200, 255, 0.9); + box-shadow: + 0 0 20px rgba(100, 150, 200, 0.2), + inset 0 0 30px rgba(100, 150, 200, 0.05); + cursor: pointer; + + &::before { + opacity: 1; + } + } + + .neu-menu-item-description { + color: rgba(140, 160, 180, 0.85); + font-size: 0.8rem; + line-height: 1.3; + margin-top: 0.35rem; + } + + .neu-menu-item-icon { + display: none; + } + + .neu-menu-item-title { + color: rgba(200, 220, 255, 1); + font-size: 1rem; + font-weight: 600; + letter-spacing: 0.5px; + text-transform: uppercase; + } + } + } + } +} diff --git a/arma/client/addons/actor/ui/_site/style.css.bak b/arma/client/addons/actor/ui/_site/style.css.bak new file mode 100644 index 0000000..ad7d0ec --- /dev/null +++ b/arma/client/addons/actor/ui/_site/style.css.bak @@ -0,0 +1,186 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + --primary-color: #3b82f6; + --primary-hover: #2563eb; + --secondary-color: #1e293b; + --background-color: rgba(15, 23, 42, 0.85); + --card-background: rgba(30, 41, 59, 0.95); + --text-primary: #f8fafc; + --text-secondary: #94a3b8; + --border-color: #334155; + --success-color: #16a34a; + --success-hover: #15803d; + --button-hover: #4f46e5; +} + +body { + font-family: + "Inter", + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + sans-serif; + line-height: 1.6; + background-color: transparent; + color: var(--text-primary); + height: 100vh; + display: flex; + justify-content: center; + align-items: center; +} + +.menu-container { + background-color: var(--background-color); + border-radius: 16px; + width: 90%; + max-width: 800px; + backdrop-filter: blur(10px); + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + overflow: hidden; + + .menu-header { + background-color: var(--secondary-color); + padding: 1.5rem; + border-bottom: 1px solid var(--border-color); + margin-bottom: 20px; + + h1 { + color: var(--text-primary); + font-size: 1.5rem; + font-weight: 600; + letter-spacing: -0.025em; + margin: 0; + } + } + + .menu-content { + padding: 1.5rem; + + .menu-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); + gap: 1rem; + } + } +} + +.menu-item { + background-color: var(--card-background); + border-radius: 12px; + padding: 1.25rem; + transition: all 0.3s ease; + cursor: pointer; + border: 1px solid var(--border-color); + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + animation: fadeIn 0.3s ease; + + &:hover { + transform: translateY(-4px); + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + border-color: var(--primary-color); + } + + .menu-item-icon { + font-size: 2rem; + margin-bottom: 1rem; + background: linear-gradient( + 135deg, + var(--primary-color), + var(--button-hover) + ); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + + svg { + width: 24px; + height: 24px; + stroke: currentColor; + fill: none; + } + } + + .menu-item-title { + font-size: 1.1rem; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 0.5rem; + } + + .menu-item-description { + font-size: 0.875rem; + color: var(--text-secondary); + line-height: 1.4; + } +} + +.loading-state { + text-align: center; + padding: 40px 20px; + color: var(--text-secondary); + + .loading-spinner { + width: 40px; + height: 40px; + border: 4px solid rgba(248, 250, 252, 0.1); + border-top: 4px solid var(--primary-color); + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; + } + + .loading-text { + font-size: 16px; + color: var(--text-secondary); + } +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +@media (max-width: 640px) { + .menu-container { + width: 95%; + margin: 1rem; + + .menu-content { + .menu-grid { + grid-template-columns: 1fr; + } + } + + .menu-header { + h1 { + font-size: 1.25rem; + } + } + } +} diff --git a/arma/client/addons/bank/$PBOPREFIX$ b/arma/client/addons/bank/$PBOPREFIX$ new file mode 100644 index 0000000..92cfac2 --- /dev/null +++ b/arma/client/addons/bank/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\bank diff --git a/arma/client/addons/bank/CfgEventHandlers.hpp b/arma/client/addons/bank/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/bank/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/bank/README.md b/arma/client/addons/bank/README.md new file mode 100644 index 0000000..677cfc9 --- /dev/null +++ b/arma/client/addons/bank/README.md @@ -0,0 +1,4 @@ +forge_client_bank +=================== + +Description for this addon diff --git a/arma/client/addons/bank/XEH_PREP.hpp b/arma/client/addons/bank/XEH_PREP.hpp new file mode 100644 index 0000000..c6ce19a --- /dev/null +++ b/arma/client/addons/bank/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(handleUIEvents); +PREP(initBankClass); +PREP(openUI); diff --git a/arma/client/addons/bank/XEH_postInit.sqf b/arma/client/addons/bank/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/bank/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/bank/XEH_postInitClient.sqf b/arma/client/addons/bank/XEH_postInitClient.sqf new file mode 100644 index 0000000..92b0995 --- /dev/null +++ b/arma/client/addons/bank/XEH_postInitClient.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" + +if (isNil QGVAR(BankClass)) then { [] call FUNC(initBankClass); }; + +[QGVAR(initBank), { + GVAR(BankClass) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitBank), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(BankClass) call ["sync", [_data, true]]; + + SETPVAR(player,FORGE_isLoaded,true); + cutText ["", "PLAIN", 1]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncBank), { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + GVAR(BankClass) call ["sync", [_data, _jip]]; +}] call CFUNC(addEventHandler); + +[{ + EGVAR(org,OrgClass) get "isLoaded"; +}, { + [QGVAR(initBank), []] call CFUNC(localEvent); +}] call CFUNC(waitUntilAndExecute); diff --git a/arma/client/addons/bank/XEH_preInit.sqf b/arma/client/addons/bank/XEH_preInit.sqf new file mode 100644 index 0000000..640756c --- /dev/null +++ b/arma/client/addons/bank/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/bank/XEH_preInitClient.sqf b/arma/client/addons/bank/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/bank/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/bank/XEH_preStart.sqf b/arma/client/addons/bank/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/client/addons/bank/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/bank/config.cpp b/arma/client/addons/bank/config.cpp new file mode 100644 index 0000000..efc69e3 --- /dev/null +++ b/arma/client/addons/bank/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\RscBank.hpp" diff --git a/arma/client/addons/bank/functions/fnc_handleUIEvents.sqf b/arma/client/addons/bank/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..6ac4f9a --- /dev/null +++ b/arma/client/addons/bank/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,33 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Handles the UI events. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_client_bank_fnc_handleUIEvents; + * + * Public: No + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; +private _display = displayChild findDisplay 46; + +diag_log format ["[FORGE:Client:Bank] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "bank::close": { _display closeDisplay 1; }; + default { hint format ["Unhandled UI event: %1", _event]; }; +}; + +true; diff --git a/arma/client/addons/bank/functions/fnc_initBankClass.sqf b/arma/client/addons/bank/functions/fnc_initBankClass.sqf new file mode 100644 index 0000000..edd6258 --- /dev/null +++ b/arma/client/addons/bank/functions/fnc_initBankClass.sqf @@ -0,0 +1,88 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the bank class. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Examples: + * [] call forge_client_bank_fnc_initBankClass + * + * Public: Yes + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(BankClass) = createHashMapObject [[ + ["#type", "IBankClass"], + ["#create", { + _self set ["uid", getPlayerUID player]; + _self set ["account", createHashMap]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + + private _actor = EGVAR(actor,ActorClass) get "actor"; + private _phone_number = _actor get "phone_number"; + private _email = _actor get "email"; + + private _account = createHashMap; + _account set ["uid", (getPlayerUID player)]; + _account set ["name", (name player)]; + _account set ["bank", 0]; + _account set ["cash", 0]; + _account set ["earnings", 0]; + _account set ["transactions", []]; + _account set ["phone_number", _phone_number]; + _account set ["email", _email]; + + _self set ["account", _account]; + }], + ["init", { + private _uid = _self get "uid"; + private _account = _self get "account"; + + [SRPC(bank,requestInitBank), [_uid, _account]] call CFUNC(serverEvent); + + systemChat format ["Bank loaded for %1", (name player)]; + diag_log "[FORGE:Client:Bank] Bank Class Initialized!"; + }], + ["save", { + params [["_sync", false, [false]]]; + + private _uid = _self get "uid"; + [SRPC(bank,requestSaveBank), [_uid, _sync]] call CFUNC(serverEvent); + + _self set ["lastSave", time]; + }], + ["sync", { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + private _account = _self get "account"; + private _isLoaded = _self get "isLoaded"; + + if !(_isLoaded) then { _self set ["isLoaded", true]; }; + if (_data isEqualTo createHashMap) exitWith { + diag_log "[FORGE:Client:Bank] Empty data received for sync, skipping."; + }; + + { + _account set [_x, _y]; + } forEach _data; + + _self set ["account", _account]; + diag_log "[FORGE:Client:Bank] Sync completed"; + }], + ["get", { + params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; + + private _account = _self get "account"; + _account getOrDefault [_key, _default]; + }] +]]; + +SETVAR(player,FORGE_BankClass,GVAR(BankClass)); +GVAR(BankClass) diff --git a/arma/client/addons/bank/functions/fnc_openUI.sqf b/arma/client/addons/bank/functions/fnc_openUI.sqf new file mode 100644 index 0000000..bf40ab3 --- /dev/null +++ b/arma/client/addons/bank/functions/fnc_openUI.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Opens the player bank interaction interface. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_client_bank_fnc_openUI; + * + * Public: No + */ + +private _display = (findDisplay 46) createDisplay "RscBank"; +private _ctrl = (_display displayCtrl 1002); + +_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/bank/initKeybinds.inc.sqf b/arma/client/addons/bank/initKeybinds.inc.sqf new file mode 100644 index 0000000..2922c52 --- /dev/null +++ b/arma/client/addons/bank/initKeybinds.inc.sqf @@ -0,0 +1 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" diff --git a/arma/client/addons/bank/initSettings.inc.sqf b/arma/client/addons/bank/initSettings.inc.sqf new file mode 100644 index 0000000..416ff52 --- /dev/null +++ b/arma/client/addons/bank/initSettings.inc.sqf @@ -0,0 +1 @@ +// Can use localize "STR_ACE_Common_Enabled" for name if ACE is required diff --git a/arma/client/addons/bank/script_component.hpp b/arma/client/addons/bank/script_component.hpp new file mode 100644 index 0000000..61a928d --- /dev/null +++ b/arma/client/addons/bank/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT bank +#define COMPONENT_BEAUTIFIED Bank +#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/bank/stringtable.xml b/arma/client/addons/bank/stringtable.xml new file mode 100644 index 0000000..a995b52 --- /dev/null +++ b/arma/client/addons/bank/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Bank + + + diff --git a/arma/client/addons/bank/ui/RscBank.hpp b/arma/client/addons/bank/ui/RscBank.hpp new file mode 100644 index 0000000..dc9ec5b --- /dev/null +++ b/arma/client/addons/bank/ui/RscBank.hpp @@ -0,0 +1,21 @@ +class RscBank { + idd = 1001; + fadeIn = 0; + fadeOut = 0; + duration = 1e011; + onLoad = "uiNamespace setVariable ['RscBank', _this select 0]"; + onUnLoad = "uinamespace setVariable ['RscBank', nil]"; + + class controlsBackground {}; + class controls { + class IFrame: RscText { + type = 106; + idc = 1002; + x = "safeZoneXAbs"; + y = "safeZoneY"; + w = "safeZoneWAbs"; + h = "safeZoneH"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/bank/ui/RscCommon.hpp b/arma/client/addons/bank/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/bank/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/bank/ui/_site/atm.css b/arma/client/addons/bank/ui/_site/atm.css new file mode 100644 index 0000000..4d7ba74 --- /dev/null +++ b/arma/client/addons/bank/ui/_site/atm.css @@ -0,0 +1,585 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + height: 100vh; + width: 100vw; + background: rgba(0, 0, 0, 0.5); + font-family: Arial, sans-serif; + color: rgba(200, 220, 240, 0.95); + overflow: hidden; +} + +.atm-container { + height: 100vh; + width: 100vw; + display: flex; + align-items: center; + justify-content: flex-end; + padding-right: 5%; + perspective: 1200px; +} + +.atm-screen { + width: 480px; + height: 640px; + background: rgba(15, 20, 30, 0.95); + border: 2px solid rgba(100, 150, 200, 0.5); + border-radius: 8px; + transform: rotateY(-10deg) translateZ(0); + transform-style: preserve-3d; + box-shadow: + -8px 0 20px rgba(100, 150, 200, 0.25), + 0 8px 32px rgba(0, 0, 0, 0.8); + display: grid; + grid-template-rows: auto 1fr auto; + overflow: hidden; + margin-right: 25%; +} + +/* Header */ +.atm-header { + padding: 1.25rem 1.5rem; + background: rgba(20, 30, 45, 0.9); + border-bottom: 2px solid rgba(100, 150, 200, 0.3); + display: flex; + align-items: center; + gap: 1rem; +} + +.atm-logo { + font-size: 2rem; +} + +.atm-title { + font-size: 1rem; + font-weight: 600; + letter-spacing: 1px; + text-transform: uppercase; + color: rgba(100, 150, 200, 1); +} + +/* Content */ +.atm-content { + flex: 1; + padding: 1.5rem; + overflow-y: auto; + overflow-x: hidden; +} + +.atm-content::-webkit-scrollbar { + width: 6px; +} + +.atm-content::-webkit-scrollbar-track { + background: rgba(15, 20, 30, 0.5); +} + +.atm-content::-webkit-scrollbar-thumb { + background: rgba(100, 150, 200, 0.3); + border-radius: 3px; +} + +.atm-view { + display: flex; + flex-direction: column; + gap: 1.5rem; + height: 100%; + justify-content: space-between; +} + +.atm-view h3 { + font-size: 1.125rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(200, 220, 255, 1); + text-align: center; + padding-bottom: 1rem; + border-bottom: 1px solid rgba(100, 150, 200, 0.2); +} + +/* Welcome Screen */ +.welcome-message { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 1rem; + padding: 2rem 1rem; + flex: 1; +} + +.welcome-icon { + font-size: 4rem; + opacity: 0.6; +} + +.welcome-message h2 { + font-size: 1.5rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); +} + +.welcome-message p { + font-size: 0.875rem; + color: rgba(140, 160, 180, 0.85); +} + +/* PIN Entry */ +.pin-entry { + display: flex; + flex-direction: column; + gap: 1.5rem; + flex: 1; + justify-content: center; +} + +.pin-entry h3 { + margin: 0; + padding: 0; + border: none; +} + +.pin-display { + display: flex; + justify-content: center; + gap: 1rem; + padding: 1.5rem; +} + +.pin-dot { + width: 16px; + height: 16px; + border-radius: 50%; + background: rgba(100, 150, 200, 0.2); + border: 2px solid rgba(100, 150, 200, 0.4); + transition: all 0.2s ease; +} + +.pin-dot.filled { + background: rgba(100, 150, 200, 0.8); + border-color: rgba(150, 200, 255, 0.8); + box-shadow: 0 0 10px rgba(100, 150, 200, 0.5); +} + +.keypad { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 0.75rem; +} + +.key-btn { + padding: 1rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 1.125rem; + font-weight: 600; + cursor: pointer; + transition: all 0.15s ease; +} + +.key-btn:hover { + background: rgba(30, 45, 70, 0.9); + border-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.2), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.key-btn:active { + transform: scale(0.95); +} + +.key-clear { + background: rgba(200, 150, 100, 0.2); + border-color: rgba(200, 150, 100, 0.4); +} + +.key-clear:hover { + background: rgba(200, 150, 100, 0.3); + border-color: rgba(255, 200, 150, 0.6); +} + +.key-enter { + background: rgba(100, 150, 200, 0.2); + border-color: rgba(100, 150, 200, 0.5); +} + +.key-enter:hover { + background: rgba(100, 150, 200, 0.3); + border-color: rgba(150, 200, 255, 0.7); +} + +/* Account Summary */ +.account-summary { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; + flex-shrink: 0; +} + +.summary-item { + padding: 1.25rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.summary-label { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(140, 160, 180, 0.85); +} + +.summary-value { + font-size: 1.25rem; + font-weight: 600; + color: rgba(100, 200, 150, 1); +} + +/* Menu Options */ +.menu-options { + display: grid; + grid-template-rows: 1fr; + gap: 1rem; +} + +.menu-btn { + padding: 1rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + display: flex; + flex-direction: column; + align-items: center; + gap: 0.75rem; + cursor: pointer; + transition: all 0.15s ease; +} + +.menu-btn:hover { + background: rgba(30, 45, 70, 0.8); + border-left-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.menu-icon { + font-size: 2rem; +} + +.menu-text { + font-size: 0.875rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(200, 220, 240, 0.95); +} + +/* Quick Amounts */ +.withdraw-display, +.deposit-display, +.transfer-display { + flex: 1; + display: flex; + flex-direction: column; + gap: 1.25rem; +} + +.quick-amounts { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.75rem; +} + +.amount-btn { + padding: 1rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + color: rgba(100, 200, 150, 1); + font-size: 1.125rem; + font-weight: 600; + cursor: pointer; + transition: all 0.15s ease; +} + +.amount-btn:hover { + background: rgba(30, 45, 70, 0.9); + border-color: rgba(150, 200, 255, 0.6); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +/* Custom Amount */ +.custom-amount { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.custom-amount label { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(140, 160, 180, 0.85); +} + +/* Form Fields */ +.transfer-form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.form-field { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.form-field label { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(140, 160, 180, 0.85); +} + +.amount-input, +.text-input { + padding: 0.875rem 1rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 1rem; + transition: all 0.15s ease; +} + +.amount-input:focus, +.text-input:focus { + outline: none; + border-color: rgba(150, 200, 255, 0.6); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.amount-input::placeholder, +.text-input::placeholder { + color: rgba(100, 120, 140, 0.6); +} + +/* Balance Display */ +.balance-display { + display: flex; + flex-direction: column; + gap: 1rem; + flex: 1; +} + +.balance-item { + padding: 1.25rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + display: flex; + justify-content: space-between; + align-items: center; +} + +.balance-label { + font-size: 0.875rem; + color: rgba(160, 180, 200, 0.85); +} + +.balance-amount { + font-size: 1.25rem; + font-weight: 600; + color: rgba(100, 200, 150, 1); +} + +.balance-total { + border-left-color: rgba(100, 200, 150, 0.6); + background: rgba(30, 45, 70, 0.7); +} + +.balance-total .balance-label { + font-size: 1rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); +} + +.balance-total .balance-amount { + font-size: 1.5rem; +} + +/* Deposit Info */ +.atm-btn-group { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.deposit-info { + padding: 1rem; + background: rgba(20, 30, 45, 0.5); + border: 1px solid rgba(100, 150, 200, 0.2); + border-radius: 4px; + text-align: center; +} + +.deposit-info p { + font-size: 0.875rem; + color: rgba(160, 180, 200, 0.85); +} + +.deposit-info span { + font-weight: 600; + color: rgba(100, 200, 150, 1); +} + +/* Transaction Result */ +.transaction-result { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 1rem; + padding: 2rem 1rem; + flex: 1; +} + +.result-icon { + width: 80px; + height: 80px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 3rem; + font-weight: bold; +} + +.transaction-result.success .result-icon { + background: rgba(100, 200, 150, 0.2); + border: 3px solid rgba(100, 200, 150, 0.6); + color: rgba(150, 255, 200, 1); + box-shadow: 0 0 20px rgba(100, 200, 150, 0.3); +} + +.transaction-result.error .result-icon { + background: rgba(200, 100, 100, 0.2); + border: 3px solid rgba(200, 100, 100, 0.6); + color: rgba(255, 150, 150, 1); + box-shadow: 0 0 20px rgba(200, 100, 100, 0.3); +} + +.transaction-result h3 { + margin: 0; + padding: 0; + border: none; +} + +.transaction-result p { + font-size: 0.875rem; + color: rgba(160, 180, 200, 0.85); + text-align: center; +} + +/* Buttons */ +.atm-btn { + padding: 1rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.875rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + cursor: pointer; + transition: all 0.15s ease; +} + +.atm-btn:hover { + background: rgba(30, 45, 70, 0.9); + border-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.2), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.atm-btn-primary { + background: rgba(100, 150, 200, 0.2); + border-color: rgba(100, 150, 200, 0.5); +} + +.atm-btn-primary:hover { + background: rgba(100, 150, 200, 0.3); + border-color: rgba(150, 200, 255, 0.7); +} + +.atm-btn-secondary { + background: rgba(200, 150, 100, 0.2); + border-color: rgba(200, 150, 100, 0.4); +} + +.atm-btn-secondary:hover { + background: rgba(200, 150, 100, 0.3); + border-color: rgba(255, 200, 150, 0.6); +} + +.atm-btn-full { + background: rgba(100, 200, 150, 0.2); + border-color: rgba(100, 200, 150, 0.4); +} + +.atm-btn-full:hover { + background: rgba(100, 200, 150, 0.3); + border-color: rgba(150, 255, 200, 0.6); +} + +/* Footer */ +.atm-footer { + padding: 1rem 1.5rem; + background: rgba(20, 30, 45, 0.9); + border-top: 2px solid rgba(100, 150, 200, 0.3); + text-align: center; +} + +.footer-text { + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 1px; + color: rgba(100, 150, 200, 0.7); +} + +/* Responsive */ +@media (max-width: 768px) { + .atm-container { + justify-content: center; + padding: 1rem; + } + + .atm-screen { + transform: none; + width: 100%; + max-width: 450px; + } +} diff --git a/arma/client/addons/bank/ui/_site/atm.html b/arma/client/addons/bank/ui/_site/atm.html new file mode 100644 index 0000000..6fba7a5 --- /dev/null +++ b/arma/client/addons/bank/ui/_site/atm.html @@ -0,0 +1,255 @@ + + + + + + + ATM + + + + + + +
+
+ +
+ +
AUTOMATED TELLER
+
+ + +
+ +
+
+
👤
+

Welcome

+

Insert your card to begin

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + + diff --git a/arma/client/addons/bank/ui/_site/atm.js b/arma/client/addons/bank/ui/_site/atm.js new file mode 100644 index 0000000..89ed2df --- /dev/null +++ b/arma/client/addons/bank/ui/_site/atm.js @@ -0,0 +1,284 @@ +/** + * ATM Interface + * Handles banking transactions with PIN authentication + */ + +// Mock data +const mockData = { + cash: 2500, + bank: 45750, + pin: '1234' // For demo purposes +}; + +// State +let enteredPin = ''; +let currentView = 'welcomeView'; + +// View Management +function showView(viewId) { + // Hide all views + document.querySelectorAll('.atm-view').forEach(view => { + view.style.display = 'none'; + }); + + // Show selected view + const view = document.getElementById(viewId); + if (view) { + view.style.display = 'flex'; + currentView = viewId; + + // Update balance displays when showing certain views + if (viewId === 'menuView' || viewId === 'balanceView' || viewId === 'depositView') { + updateBalances(); + } + } +} + +// PIN Entry +function enterPin(digit) { + if (enteredPin.length < 4) { + enteredPin += digit; + updatePinDisplay(); + } +} + +function clearPin() { + enteredPin = ''; + updatePinDisplay(); +} + +function updatePinDisplay() { + const dots = document.querySelectorAll('.pin-dot'); + dots.forEach((dot, index) => { + if (index < enteredPin.length) { + dot.classList.add('filled'); + } else { + dot.classList.remove('filled'); + } + }); +} + +function submitPin() { + if (enteredPin.length !== 4) { + showError('Please enter a 4-digit PIN'); + return; + } + + // In a real implementation, this would validate with the server + if (enteredPin === mockData.pin) { + enteredPin = ''; + updatePinDisplay(); + showView('menuView'); + } else { + showError('Incorrect PIN'); + clearPin(); + } +} + +// Balance Updates +function updateBalances() { + // Update all balance displays + const cashElements = ['cashBalance', 'cashBalanceDetail', 'availableCash']; + const bankElements = ['bankBalance', 'bankBalanceDetail']; + + cashElements.forEach(id => { + const el = document.getElementById(id); + if (el) el.textContent = `$${mockData.cash.toLocaleString()}`; + }); + + bankElements.forEach(id => { + const el = document.getElementById(id); + if (el) el.textContent = `$${mockData.bank.toLocaleString()}`; + }); + + const totalEl = document.getElementById('totalBalance'); + if (totalEl) { + const total = mockData.cash + mockData.bank; + totalEl.textContent = `$${total.toLocaleString()}`; + } +} + +// Withdraw Functions +function withdrawAmount(amount) { + if (amount > mockData.bank) { + showError('Insufficient funds'); + return; + } + + mockData.bank -= amount; + mockData.cash += amount; + + // sendEvent('atm::withdraw', { amount: amount }); + showSuccess(`Withdrew $${amount.toLocaleString()}`); +} + +function withdrawCustom() { + const input = document.getElementById('withdrawInput'); + const amount = parseFloat(input.value); + + if (!amount || amount <= 0) { + showError('Please enter a valid amount'); + return; + } + + if (amount > mockData.bank) { + showError('Insufficient funds'); + return; + } + + mockData.bank -= amount; + mockData.cash += amount; + + // sendEvent('atm::withdraw', { amount: amount }); + input.value = ''; + showSuccess(`Withdrew $${amount.toLocaleString()}`); +} + +// Deposit Functions +function depositAmount() { + const input = document.getElementById('depositInput'); + const amount = parseFloat(input.value); + + if (!amount || amount <= 0) { + showError('Please enter a valid amount'); + return; + } + + if (amount > mockData.cash) { + showError('Insufficient cash'); + return; + } + + mockData.cash -= amount; + mockData.bank += amount; + + // sendEvent('atm::deposit', { amount: amount }); + input.value = ''; + showSuccess(`Deposited $${amount.toLocaleString()}`); +} + +function depositAll() { + if (mockData.cash <= 0) { + showError('No cash to deposit'); + return; + } + + const amount = mockData.cash; + mockData.cash = 0; + mockData.bank += amount; + + // sendEvent('atm::deposit', { amount: amount }); + showSuccess(`Deposited $${amount.toLocaleString()}`); +} + +// Transfer Function +function transferFunds() { + const playerIdInput = document.getElementById('transferPlayerId'); + const amountInput = document.getElementById('transferAmount'); + + const playerId = playerIdInput.value.trim(); + const amount = parseFloat(amountInput.value); + + if (!playerId) { + showError('Please enter a player ID'); + return; + } + + if (!amount || amount <= 0) { + showError('Please enter a valid amount'); + return; + } + + if (amount > mockData.bank) { + showError('Insufficient funds'); + return; + } + + mockData.bank -= amount; + + // sendEvent('atm::transfer', { + // playerId: playerId, + // amount: amount + // }); + + playerIdInput.value = ''; + amountInput.value = ''; + + showSuccess(`Transferred $${amount.toLocaleString()} to Player ${playerId}`); +} + +// Result Screens +function showSuccess(message) { + document.getElementById('successMessage').textContent = message; + showView('successView'); + updateBalances(); +} + +function showError(message) { + document.getElementById('errorMessage').textContent = message; + showView('errorView'); +} + +// Exit ATM +function exitATM() { + enteredPin = ''; + updatePinDisplay(); + sendEvent('atm::exit', {}); + showView('welcomeView'); +} + +// Send event to Arma +function sendEvent(event, data) { + if (typeof A3API !== 'undefined') { + A3API.SendAlert(JSON.stringify({ + event: event, + data: data + })); + } else { + console.log('Event:', event, 'Data:', data); + } +} + +// Update ATM data from external source +function updateATMData(data) { + if (data.cash !== undefined) { + mockData.cash = data.cash; + } + if (data.bank !== undefined) { + mockData.bank = data.bank; + } + updateBalances(); +} + +// Initialize +function initATM() { + console.log('ATM interface initializing...'); + + // Show welcome screen + showView('welcomeView'); + + // Update initial balances + updateBalances(); + + console.log('ATM interface initialized'); +} + +// Auto-initialize +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initATM); +} else { + initATM(); +} + +// Expose functions globally +window.showView = showView; +window.enterPin = enterPin; +window.clearPin = clearPin; +window.submitPin = submitPin; +window.withdrawAmount = withdrawAmount; +window.withdrawCustom = withdrawCustom; +window.depositAmount = depositAmount; +window.depositAll = depositAll; +window.transferFunds = transferFunds; +window.exitATM = exitATM; +window.updateATMData = updateATMData; diff --git a/arma/client/addons/bank/ui/_site/index.html b/arma/client/addons/bank/ui/_site/index.html new file mode 100644 index 0000000..0e64929 --- /dev/null +++ b/arma/client/addons/bank/ui/_site/index.html @@ -0,0 +1,237 @@ + + + + + + + Banking Services + + + + + + +
+ +
+ +
+

Banking Services

+

Secure Financial Management

+
+
+ +
+
+ + +
+ +
+
+

Your Accounts

+
+
+ + + + + + + + +
+
+ + +
+
+

Quick Actions

+
+
+ +
+

Transfer Funds

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + +
+

Quick Access

+
+ + + + +
+
+
+
+ + +
+
+

Recent Transactions

+
+
+
+
+
+ Deposit + +$5,000 +
+
+ From Cash + 2 hours ago +
+
+ +
+
+ Withdrawal + -$1,200 +
+
+ To Cash + 5 hours ago +
+
+ +
+
+ Transfer + -$500 +
+
+ To Player #1234 + 1 day ago +
+
+ +
+
+ Deposit + +$10,000 +
+
+ Mission Reward + 2 days ago +
+
+ +
+
+ Transfer + +$2,000 +
+
+ From Player #5678 + 3 days ago +
+
+
+
+
+
+
+ + + + + diff --git a/arma/client/addons/bank/ui/_site/script.js b/arma/client/addons/bank/ui/_site/script.js new file mode 100644 index 0000000..b1cd040 --- /dev/null +++ b/arma/client/addons/bank/ui/_site/script.js @@ -0,0 +1,248 @@ +/** + * Banking Interface + * Handles transfers, deposits, withdrawals, and account management + */ + +// Mock data +const mockData = { + accounts: { + cash: { name: "Cash", balance: 2500, type: "Physical Currency" }, + bank: { name: "Bank Account", balance: 45750, type: "Savings • Protected" }, + org: { name: "Organization", balance: 125000, type: "Shared • View Only", readOnly: true } + }, + transactions: [ + { type: "deposit", amount: 5000, desc: "From Cash", time: "2 hours ago" }, + { type: "withdrawal", amount: -1200, desc: "To Cash", time: "5 hours ago" }, + { type: "transfer", amount: -500, desc: "To Player #1234", time: "1 day ago" }, + { type: "deposit", amount: 10000, desc: "Mission Reward", time: "2 days ago" }, + { type: "transfer", amount: 2000, desc: "From Player #5678", time: "3 days ago" } + ] +}; + +// State +let selectedAccount = 'cash'; + +// Initialize +function initBank() { + console.log('Banking interface initializing...'); + + setupEventHandlers(); + updateBalances(); + + console.log('Banking interface initialized'); +} + +// Event Handlers +function setupEventHandlers() { + // Close button + const closeBtn = document.querySelector('.close-btn'); + if (closeBtn) { + closeBtn.addEventListener('click', () => { + console.log('Closing bank...'); + sendEvent('bank::close', {}); + }); + } + + // Account card selection + const accountCards = document.querySelectorAll('.account-card'); + accountCards.forEach(card => { + card.addEventListener('click', () => { + accountCards.forEach(c => c.classList.remove('active')); + card.classList.add('active'); + selectedAccount = card.dataset.account; + console.log('Selected account:', selectedAccount); + }); + }); + + // Transfer form + const transferBtn = document.getElementById('transferBtn'); + const transferFrom = document.getElementById('transferFrom'); + const transferTo = document.getElementById('transferTo'); + const transferAmount = document.getElementById('transferAmount'); + const playerId = document.getElementById('playerId'); + const playerIdGroup = document.getElementById('playerIdGroup'); + + // Show/hide player ID field + if (transferTo) { + transferTo.addEventListener('change', () => { + if (transferTo.value === 'player') { + playerIdGroup.style.display = 'flex'; + } else { + playerIdGroup.style.display = 'none'; + } + }); + } + + // Transfer button + if (transferBtn) { + transferBtn.addEventListener('click', () => { + const from = transferFrom.value; + const to = transferTo.value; + const amount = parseFloat(transferAmount.value); + + if (!amount || amount <= 0) { + alert('Please enter a valid amount'); + return; + } + + if (from === to) { + alert('Source and destination must be different'); + return; + } + + const fromAccount = mockData.accounts[from]; + if (amount > fromAccount.balance) { + alert('Insufficient funds'); + return; + } + + if (to === 'player' && !playerId.value) { + alert('Please enter a player ID'); + return; + } + + const transferData = { + from: from, + to: to, + amount: amount, + playerId: to === 'player' ? playerId.value : null + }; + + console.log('Transfer request:', transferData); + sendEvent('bank::transfer', transferData); + + // Clear form + transferAmount.value = ''; + if (to === 'player') playerId.value = ''; + }); + } + + // Quick action buttons + const quickActionBtns = document.querySelectorAll('.quick-action-btn'); + quickActionBtns.forEach(btn => { + btn.addEventListener('click', () => { + const action = btn.dataset.action; + console.log('Quick action:', action); + + switch (action) { + case 'deposit': + const cashBalance = mockData.accounts.cash.balance; + if (cashBalance <= 0) { + alert('No cash to deposit'); + return; + } + sendEvent('bank::deposit', { amount: cashBalance }); + break; + case 'withdraw': + const amount = prompt('Enter amount to withdraw:'); + if (amount && parseFloat(amount) > 0) { + sendEvent('bank::withdraw', { amount: parseFloat(amount) }); + } + break; + case 'statement': + sendEvent('bank::statement', {}); + break; + } + }); + }); + + // Transaction items + const transactionItems = document.querySelectorAll('.transaction-item'); + transactionItems.forEach((item, index) => { + item.addEventListener('click', () => { + console.log('Transaction clicked:', mockData.transactions[index]); + sendEvent('bank::transaction::view', { transaction: mockData.transactions[index] }); + }); + }); +} + +// Update balances +function updateBalances() { + const balanceElements = document.querySelectorAll('.balance-amount'); + balanceElements[0].textContent = `$${mockData.accounts.cash.balance.toLocaleString()}`; + balanceElements[1].textContent = `$${mockData.accounts.bank.balance.toLocaleString()}`; + balanceElements[2].textContent = `$${mockData.accounts.org.balance.toLocaleString()}`; + + // Update form options + const transferFrom = document.getElementById('transferFrom'); + const transferTo = document.getElementById('transferTo'); + + if (transferFrom) { + transferFrom.innerHTML = ` + + + `; + } +} + +// Update bank data +function updateBankData(data) { + if (data.accounts) { + Object.assign(mockData.accounts, data.accounts); + updateBalances(); + } + + if (data.transactions) { + // Update transaction list + mockData.transactions = data.transactions; + // Re-render transaction list + renderTransactions(); + } +} + +// Render transactions +function renderTransactions() { + const transactionList = document.querySelector('.transaction-list'); + if (!transactionList) return; + + transactionList.innerHTML = ''; + + mockData.transactions.forEach((transaction, index) => { + const item = document.createElement('div'); + item.className = 'transaction-item'; + + const isPositive = transaction.amount > 0; + const amountClass = isPositive ? 'positive' : 'negative'; + const displayAmount = isPositive ? `+$${transaction.amount.toLocaleString()}` : `-$${Math.abs(transaction.amount).toLocaleString()}`; + + item.innerHTML = ` +
+ ${transaction.type} + ${displayAmount} +
+
+ ${transaction.desc} + ${transaction.time} +
+ `; + + item.addEventListener('click', () => { + console.log('Transaction clicked:', transaction); + sendEvent('bank::transaction::view', { transaction: transaction }); + }); + + transactionList.appendChild(item); + }); +} + +// Send event to Arma +function sendEvent(event, data) { + if (typeof A3API !== 'undefined') { + A3API.SendAlert(JSON.stringify({ + event: event, + data: data + })); + } else { + console.log('Event:', event, 'Data:', data); + } +} + +// Auto-initialize +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initBank); +} else { + initBank(); +} + +// Expose functions globally +window.updateBankData = updateBankData; diff --git a/arma/client/addons/bank/ui/_site/style.css b/arma/client/addons/bank/ui/_site/style.css new file mode 100644 index 0000000..6974c7e --- /dev/null +++ b/arma/client/addons/bank/ui/_site/style.css @@ -0,0 +1,471 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + height: 100vh; + width: 100vw; + background: rgba(0, 0, 0, 0.7); + font-family: Arial, sans-serif; + color: rgba(200, 220, 240, 0.95); + overflow: hidden; +} + +.bank-container { + height: 100vh; + width: 100vw; + padding: 2rem; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +/* Header Section */ +.bank-header { + display: flex; + align-items: center; + gap: 1.5rem; + padding: 1.25rem 1.5rem; + background: rgba(15, 20, 30, 0.9); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + box-shadow: + 0 0 20px rgba(100, 150, 200, 0.15), + 0 4px 16px rgba(0, 0, 0, 0.8); +} + +.bank-logo { + width: 60px; + height: 60px; + background: rgba(20, 30, 45, 0.8); + border: 2px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; +} + +.logo-icon { + font-size: 2rem; +} + +.bank-info { + flex: 1; +} + +.bank-title { + font-size: 1.5rem; + font-weight: 600; + letter-spacing: 0.5px; + text-transform: uppercase; + color: rgba(200, 220, 255, 1); + margin-bottom: 0.25rem; +} + +.bank-subtitle { + font-size: 0.875rem; + color: rgba(140, 160, 180, 0.8); + letter-spacing: 0.5px; +} + +.header-actions { + display: flex; + gap: 0.75rem; +} + +.action-btn { + padding: 0.625rem 1.25rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.875rem; + text-transform: uppercase; + letter-spacing: 0.5px; + cursor: pointer; + transition: all 0.15s ease; +} + +.action-btn:hover { + background: rgba(30, 45, 70, 0.9); + border-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.2), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.action-btn-primary { + background: rgba(100, 150, 200, 0.2); + border-color: rgba(100, 150, 200, 0.5); + width: 100%; + margin-top: 0.5rem; +} + +.action-btn-primary:hover { + background: rgba(100, 150, 200, 0.3); + border-color: rgba(150, 200, 255, 0.7); +} + +.close-btn { + border-color: rgba(200, 100, 100, 0.4); +} + +.close-btn:hover { + border-color: rgba(255, 100, 100, 0.7); + box-shadow: + 0 0 15px rgba(200, 100, 100, 0.2), + inset 0 0 20px rgba(200, 100, 100, 0.05); +} + +/* Main Content */ +.bank-content { + flex: 1; + display: grid; + grid-template-columns: 300px 1fr 350px; + gap: 1.5rem; + overflow: hidden; +} + +/* Panels */ +.bank-panel { + background: rgba(15, 20, 30, 0.9); + border: 1px solid rgba(100, 150, 200, 0.4); + border-left: 3px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + display: flex; + flex-direction: column; + box-shadow: + 0 0 20px rgba(100, 150, 200, 0.1), + 0 4px 16px rgba(0, 0, 0, 0.6); +} + +.panel-main { + grid-column: 2; +} + +.panel-header { + padding: 1.25rem 1.5rem; + border-bottom: 1px solid rgba(100, 150, 200, 0.2); +} + +.panel-title { + font-size: 1rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(200, 220, 255, 1); +} + +.panel-content { + flex: 1; + padding: 1.5rem; + overflow-y: auto; +} + +/* Custom Scrollbar */ +.panel-content::-webkit-scrollbar { + width: 8px; +} + +.panel-content::-webkit-scrollbar-track { + background: rgba(15, 20, 30, 0.5); + border-radius: 4px; +} + +.panel-content::-webkit-scrollbar-thumb { + background: rgba(100, 150, 200, 0.3); + border-radius: 4px; +} + +.panel-content::-webkit-scrollbar-thumb:hover { + background: rgba(100, 150, 200, 0.5); +} + +/* Account Cards */ +.account-card { + padding: 1.25rem; + margin-bottom: 1rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + cursor: pointer; + transition: all 0.15s ease; +} + +.account-card:last-child { + margin-bottom: 0; +} + +.account-card:hover { + background: rgba(30, 45, 70, 0.7); + border-left-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.account-card.active { + background: rgba(30, 45, 70, 0.8); + border-left-color: rgba(100, 200, 150, 0.8); + box-shadow: + 0 0 20px rgba(100, 200, 150, 0.2), + inset 0 0 25px rgba(100, 200, 150, 0.05); +} + +.account-header { + display: flex; + align-items: center; + gap: 1rem; + margin-bottom: 1rem; +} + +.account-icon { + font-size: 1.75rem; +} + +.account-info { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.account-name { + font-size: 1rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); +} + +.account-type { + font-size: 0.75rem; + color: rgba(140, 160, 180, 0.8); +} + +.account-balance { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 1rem; + border-top: 1px solid rgba(100, 150, 200, 0.2); +} + +.balance-label { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(140, 160, 180, 0.8); +} + +.balance-amount { + font-size: 1.25rem; + font-weight: 600; + color: rgba(100, 200, 150, 1); +} + +/* Action Section */ +.action-section { + margin-bottom: 2rem; +} + +.action-section:last-child { + margin-bottom: 0; +} + +.section-title { + font-size: 0.875rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(180, 200, 220, 0.9); + margin-bottom: 1rem; +} + +/* Transfer Form */ +.transfer-form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.form-group { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.form-label { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(140, 160, 180, 0.9); +} + +.form-select, +.form-input { + padding: 0.75rem 1rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.875rem; + transition: all 0.15s ease; +} + +.form-select:focus, +.form-input:focus { + outline: none; + border-color: rgba(150, 200, 255, 0.6); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.form-input::placeholder { + color: rgba(100, 120, 140, 0.6); +} + +/* Quick Actions */ +.quick-actions { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); + gap: 1rem; +} + +.quick-action-btn { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.75rem; + padding: 1.25rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 4px; + cursor: pointer; + transition: all 0.15s ease; +} + +.quick-action-btn:hover { + background: rgba(30, 45, 70, 0.8); + border-color: rgba(150, 200, 255, 0.5); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.15), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.quick-action-icon { + font-size: 2rem; +} + +.quick-action-label { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + text-align: center; + color: rgba(180, 200, 220, 0.9); +} + +/* Transaction List */ +.transaction-list { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.transaction-item { + padding: 1rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.2); + border-left: 3px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + transition: all 0.15s ease; +} + +.transaction-item:hover { + background: rgba(30, 45, 70, 0.7); + border-left-color: rgba(150, 200, 255, 0.6); +} + +.transaction-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.5rem; +} + +.transaction-type { + padding: 0.25rem 0.625rem; + border-radius: 3px; + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.5px; + font-weight: 600; +} + +.transaction-type.deposit { + background: rgba(100, 200, 150, 0.2); + border: 1px solid rgba(100, 200, 150, 0.4); + color: rgba(150, 255, 200, 0.9); +} + +.transaction-type.withdrawal { + background: rgba(200, 150, 100, 0.2); + border: 1px solid rgba(200, 150, 100, 0.4); + color: rgba(255, 200, 150, 0.9); +} + +.transaction-type.transfer { + background: rgba(100, 150, 200, 0.2); + border: 1px solid rgba(100, 150, 200, 0.4); + color: rgba(150, 200, 255, 0.9); +} + +.transaction-amount { + font-size: 1rem; + font-weight: 600; +} + +.transaction-amount.positive { + color: rgba(100, 200, 150, 1); +} + +.transaction-amount.negative { + color: rgba(200, 150, 100, 1); +} + +.transaction-details { + display: flex; + justify-content: space-between; + align-items: center; +} + +.transaction-desc { + font-size: 0.875rem; + color: rgba(180, 200, 220, 0.9); +} + +.transaction-time { + font-size: 0.7rem; + color: rgba(100, 150, 200, 0.7); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +/* Responsive adjustments */ +@media (max-width: 1400px) { + .bank-content { + grid-template-columns: 280px 1fr 300px; + } +} + +@media (max-width: 1200px) { + .bank-content { + grid-template-columns: 1fr; + grid-template-rows: auto 1fr auto; + } + + .panel-main { + grid-column: 1; + } +} diff --git a/arma/client/addons/common/$PBOPREFIX$ b/arma/client/addons/common/$PBOPREFIX$ new file mode 100644 index 0000000..c2897bb --- /dev/null +++ b/arma/client/addons/common/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\common diff --git a/arma/client/addons/common/CfgEventHandlers.hpp b/arma/client/addons/common/CfgEventHandlers.hpp new file mode 100644 index 0000000..865276c --- /dev/null +++ b/arma/client/addons/common/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +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)); + }; +}; diff --git a/arma/client/addons/common/README.md b/arma/client/addons/common/README.md new file mode 100644 index 0000000..9ce0564 --- /dev/null +++ b/arma/client/addons/common/README.md @@ -0,0 +1,4 @@ +forge_client_common +=================== + +Common functionality shared between addons. diff --git a/arma/client/addons/common/XEH_PREP.hpp b/arma/client/addons/common/XEH_PREP.hpp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/arma/client/addons/common/XEH_PREP.hpp @@ -0,0 +1 @@ + diff --git a/arma/client/addons/common/XEH_preInit.sqf b/arma/client/addons/common/XEH_preInit.sqf new file mode 100644 index 0000000..dbef1ae --- /dev/null +++ b/arma/client/addons/common/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/common/XEH_preStart.sqf b/arma/client/addons/common/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/client/addons/common/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/common/config.cpp b/arma/client/addons/common/config.cpp new file mode 100644 index 0000000..595b77a --- /dev/null +++ b/arma/client/addons/common/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/client/addons/common/script_component.hpp b/arma/client/addons/common/script_component.hpp new file mode 100644 index 0000000..39adea8 --- /dev/null +++ b/arma/client/addons/common/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT common +#define COMPONENT_BEAUTIFIED Common +#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/common/stringtable.xml b/arma/client/addons/common/stringtable.xml new file mode 100644 index 0000000..1ba94dc --- /dev/null +++ b/arma/client/addons/common/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Common + + + diff --git a/arma/client/addons/main/$PBOPREFIX$ b/arma/client/addons/main/$PBOPREFIX$ new file mode 100644 index 0000000..1d61036 --- /dev/null +++ b/arma/client/addons/main/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\main diff --git a/arma/client/addons/main/CfgSettings.hpp b/arma/client/addons/main/CfgSettings.hpp new file mode 100644 index 0000000..05d0b0b --- /dev/null +++ b/arma/client/addons/main/CfgSettings.hpp @@ -0,0 +1,13 @@ +class CfgSettings { + class CBA { + class Versioning { + class PREFIX { + main_addon = QUOTE(ADDON); + + class dependencies { + CBA[] = {"cba_main", REQUIRED_CBA_VERSION, "true"}; + }; + }; + }; + }; +}; diff --git a/arma/client/addons/main/README.md b/arma/client/addons/main/README.md new file mode 100644 index 0000000..d2499a7 --- /dev/null +++ b/arma/client/addons/main/README.md @@ -0,0 +1,4 @@ +forge_client_main +=================== + +Main Addon for forge-client diff --git a/arma/client/addons/main/config.cpp b/arma/client/addons/main/config.cpp new file mode 100644 index 0000000..2b42b1e --- /dev/null +++ b/arma/client/addons/main/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = CSTRING(url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "cba_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgSettings.hpp" diff --git a/arma/client/addons/main/data/hpp/defineDIKCodes.hpp b/arma/client/addons/main/data/hpp/defineDIKCodes.hpp new file mode 100644 index 0000000..6eca2b4 --- /dev/null +++ b/arma/client/addons/main/data/hpp/defineDIKCodes.hpp @@ -0,0 +1,33 @@ +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +#define DIK_MOUSELEFT 0xF0 +#define DIK_MOUSERIGHT 0xF1 +#define DIK_MOUSEMIDDLE 0xF2 +#define DIK_MOUSE4 0xF3 +#define DIK_MOUSE5 0xF4 +#define DIK_MOUSE6 0xF5 +#define DIK_MOUSE7 0xF6 +#define DIK_MOUSE8 0xF7 +#define DIK_MOUSEUP 0xF8 +#define DIK_MOUSEDOWN 0xF9 + +#define DIK_USERCUSTOM1 0xFA +#define DIK_USERCUSTOM2 0xFB +#define DIK_USERCUSTOM3 0xFC +#define DIK_USERCUSTOM4 0xFD +#define DIK_USERCUSTOM5 0xFE +#define DIK_USERCUSTOM6 0xFF +#define DIK_USERCUSTOM7 0x100 +#define DIK_USERCUSTOM8 0x101 +#define DIK_USERCUSTOM9 0x102 +#define DIK_USERCUSTOM10 0x103 +#define DIK_USERCUSTOM11 0x104 +#define DIK_USERCUSTOM12 0x105 +#define DIK_USERCUSTOM13 0x106 +#define DIK_USERCUSTOM14 0x107 +#define DIK_USERCUSTOM15 0x108 +#define DIK_USERCUSTOM16 0x109 +#define DIK_USERCUSTOM17 0x10A +#define DIK_USERCUSTOM18 0x10B +#define DIK_USERCUSTOM19 0x10C +#define DIK_USERCUSTOM20 0x10D diff --git a/arma/client/addons/main/data/ui/placeholder.txt b/arma/client/addons/main/data/ui/placeholder.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/arma/client/addons/main/data/ui/placeholder.txt @@ -0,0 +1 @@ + diff --git a/arma/client/addons/main/script_component.hpp b/arma/client/addons/main/script_component.hpp new file mode 100644 index 0000000..32d193a --- /dev/null +++ b/arma/client/addons/main/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT main +#define COMPONENT_BEAUTIFIED Main +#include "script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "script_macros.hpp" diff --git a/arma/client/addons/main/script_macros.hpp b/arma/client/addons/main/script_macros.hpp new file mode 100644 index 0000000..415ad5c --- /dev/null +++ b/arma/client/addons/main/script_macros.hpp @@ -0,0 +1,148 @@ +// Global toggles for caching/logging +// #define DISABLE_COMPILE_CACHE +// #define DEBUG_MODE_FULL +#define DEBUG_SYNCHRONOUS + +#include "\x\cba\addons\main\script_macros_common.hpp" +#include "\x\cba\addons\xeh\script_xeh.hpp" + +// Functions +#define AFUNC(var1,var2) TRIPLES(DOUBLES(ace,var1),fnc,var2) +#define BFUNC(var1) TRIPLES(BIS,fnc,var1) +#define CFUNC(var1) TRIPLES(CBA,fnc,var1) + +// Remote Procedure Calls +#define CRPC(var1,var2) QUOTE(DOUBLES(DOUBLES(forge_client,var1),var2)) +#define SRPC(var1,var2) QUOTE(DOUBLES(DOUBLES(forge_server,var1),var2)) + +#define QQUOTE(var1) QUOTE(QUOTE(var1)) + +// QPATHTOF but without a leading slash +#define PATHTOF2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\var1 +#define QPATHTOF2(var1) QUOTE(PATHTOF2(var1)) + +#ifdef SUBCOMPONENT + #define SUBADDON DOUBLES(ADDON,SUBCOMPONENT) + + // Update PATHTO macros to point to subaddon instead + #undef PATHTO + #define PATHTO(var1) \MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1.sqf + #undef PATHTOF + #define PATHTOF(var1) \MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1 + #undef PATHTO2 + #define PATHTO2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1.sqf + #undef PATHTOF2 + #define PATHTOF2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1 +#endif + +#undef PREP +#ifdef DISABLE_COMPILE_CACHE + #define LINKFUNC(x) {call FUNC(x)} + #define PREP(fncName) FUNC(fncName) = compile preprocessFileLineNumbers QPATHTOF(functions\DOUBLES(fnc,fncName).sqf) + #define PREP_RECOMPILE_START if (isNil "forge_client_fnc_recompile") then {forge_client_recompiles = []; forge_client_fnc_recompile = {{call _x} forEach forge_client_recompiles;}}; private _recomp = { + #define PREP_RECOMPILE_END }; call _recomp; forge_client_recompiles pushBack _recomp; +#else + #define LINKFUNC(x) FUNC(x) + #define PREP(fncName) [QPATHTOF(functions\DOUBLES(fnc,fncName).sqf), QFUNC(fncName)] call CBA_fnc_compileFunction + #define PREP_RECOMPILE_START ; /* disabled */ + #define PREP_RECOMPILE_END ; /* disabled */ +#endif + +#define GETVAR_SYS(var1,var2) getVariable [ARR_2(QUOTE(var1),var2)] +#define SETVAR_SYS(var1,var2) setVariable [ARR_2(QUOTE(var1),var2)] +#define SETPVAR_SYS(var1,var2) setVariable [ARR_3(QUOTE(var1),var2,true)] + +#undef GETVAR +#define GETVAR(var1,var2,var3) (var1 GETVAR_SYS(var2,var3)) +#define GETMVAR(var1,var2) (missionNamespace GETVAR_SYS(var1,var2)) +#define GETUVAR(var1,var2) (uiNamespace GETVAR_SYS(var1,var2)) +#define GETPRVAR(var1,var2) (profileNamespace GETVAR_SYS(var1,var2)) +#define GETPAVAR(var1,var2) (parsingNamespace GETVAR_SYS(var1,var2)) + +#undef SETVAR +#define SETVAR(var1,var2,var3) var1 SETVAR_SYS(var2,var3) +#define SETPVAR(var1,var2,var3) var1 SETPVAR_SYS(var2,var3) +#define SETMVAR(var1,var2) missionNamespace SETVAR_SYS(var1,var2) +#define SETUVAR(var1,var2) uiNamespace SETVAR_SYS(var1,var2) +#define SETPRVAR(var1,var2) profileNamespace SETVAR_SYS(var1,var2) +#define SETPAVAR(var1,var2) parsingNamespace SETVAR_SYS(var1,var2) + +#define GETGVAR(var1,var2) GETMVAR(GVAR(var1),var2) +#define GETEGVAR(var1,var2,var3) GETMVAR(EGVAR(var1,var2),var3) + +#define WEAP_XX(WEAP, COUNT) class DOUBLES(_xx,WEAP) { \ + weapon = QUOTE(WEAP); \ + count = COUNT; \ +} + +#define MAG_XX(MAG, COUNT) class DOUBLES(_xx,MAG) { \ + magazine = QUOTE(MAG); \ + count = COUNT; \ +} + +#define ITEM_XX(ITEM, COUNT) class DOUBLES(_xx,ITEM) { \ + name = QUOTE(ITEM); \ + count = COUNT; \ +} + +// ACE Cargo +#define CARGO_XX(ITEM, COUNT) class ITEM { \ + type = QUOTE(ITEM); \ + amount = COUNT; \ +} + +#define MAG_CSW(var1,var2) class DOUBLES(var1,csw): var1 { \ + scope = var2; \ + type = TYPE_MAGAZINE_PRIMARY_AND_THROW; \ +} + +// Debug textures, mainly for testing hiddenSelections +#define DBUG_TEX_RED "#(rgb,8,8,3)color(1,0,0,1)" +#define DBUG_TEX_GRN "#(rgb,8,8,3)color(0,1,0,1)" +#define DBUG_TEX_BLU "#(rgb,8,8,3)color(0,0,1,1)" +#define DBUG_TEX_PUR "#(rgb,8,8,3)color(1,0,1,1)" +#define DBUG_TEX_YEL "#(rgb,8,8,3)color(1,1,0,1)" + +// Statements and conditions +#define CLAMP(var1,lower,upper) (lower max (var1 min upper)) + +// Weapon types +#define TYPE_WEAPON_PRIMARY 1 +#define TYPE_WEAPON_HANDGUN 2 +#define TYPE_WEAPON_SECONDARY 4 +// Magazine types +#define TYPE_MAGAZINE_HANDGUN_AND_GL 16 // mainly +#define TYPE_MAGAZINE_PRIMARY_AND_THROW 256 +#define TYPE_MAGAZINE_SECONDARY_AND_PUT 512 // mainly +#define TYPE_MAGAZINE_MISSILE 768 +// More types +#define TYPE_BINOCULAR_AND_NVG 4096 +#define TYPE_WEAPON_VEHICLE 65536 +#define TYPE_ITEM 131072 +// Item types +#define TYPE_DEFAULT 0 +#define TYPE_MUZZLE 101 +#define TYPE_OPTICS 201 +#define TYPE_FLASHLIGHT 301 +#define TYPE_BIPOD 302 +#define TYPE_FIRST_AID_KIT 401 +#define TYPE_FINS 501 // not implemented +#define TYPE_BREATHING_BOMB 601 // not implemented +#define TYPE_NVG 602 +#define TYPE_GOGGLE 603 +#define TYPE_SCUBA 604 // not implemented +#define TYPE_HEADGEAR 605 +#define TYPE_FACTOR 607 +#define TYPE_MAP 608 +#define TYPE_COMPASS 609 +#define TYPE_WATCH 610 +#define TYPE_RADIO 611 +#define TYPE_GPS 612 +#define TYPE_HMD 616 +#define TYPE_BINOCULAR 617 +#define TYPE_MEDIKIT 619 +#define TYPE_TOOLKIT 620 +#define TYPE_UAV_TERMINAL 621 +#define TYPE_VEST 701 +#define TYPE_UNIFORM 801 +#define TYPE_BACKPACK 901 diff --git a/arma/client/addons/main/script_mod.hpp b/arma/client/addons/main/script_mod.hpp new file mode 100644 index 0000000..d1337cc --- /dev/null +++ b/arma/client/addons/main/script_mod.hpp @@ -0,0 +1,26 @@ +#define MAINPREFIX forge +#define PREFIX forge_client +#define MOD_NAME forge-client +#define AUTHOR "J.Schmidt" + +#define REQUIRED_VERSION 2.20 +#define REQUIRED_CBA_VERSION {3,18,4} +#define REQUIRED_ACE_VERSION {3,20,0} + +#include "script_version.hpp" + +#define VERSION MAJOR.MINOR +#define VERSION_STR MAJOR.MINOR.PATCH.BUILD +#define VERSION_AR MAJOR,MINOR,PATCH,BUILD + +#ifndef COMPONENT_BEAUTIFIED + #define COMPONENT_BEAUTIFIED COMPONENT +#endif +#ifdef SUBCOMPONENT + #ifndef SUBCOMPONENT_BEAUTIFIED + #define SUBCOMPONENT_BEAUTIFIED SUBCOMPONENT + #endif + #define COMPONENT_NAME QUOTE(MOD_NAME - COMPONENT_BEAUTIFIED (SUBCOMPONENT_BEAUTIFIED)) +#else + #define COMPONENT_NAME QUOTE(MOD_NAME - COMPONENT_BEAUTIFIED) +#endif diff --git a/arma/client/addons/main/script_version.hpp b/arma/client/addons/main/script_version.hpp new file mode 100644 index 0000000..3e6aaab --- /dev/null +++ b/arma/client/addons/main/script_version.hpp @@ -0,0 +1,4 @@ +#define MAJOR 1 +#define MINOR 0 +#define PATCH 0 +#define BUILD 0 diff --git a/arma/client/addons/main/stringtable.xml b/arma/client/addons/main/stringtable.xml new file mode 100644 index 0000000..99b18ab --- /dev/null +++ b/arma/client/addons/main/stringtable.xml @@ -0,0 +1,24 @@ + + + + + Main + + + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + + + diff --git a/arma/client/addons/org/$PBOPREFIX$ b/arma/client/addons/org/$PBOPREFIX$ new file mode 100644 index 0000000..cc69cc0 --- /dev/null +++ b/arma/client/addons/org/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\org diff --git a/arma/client/addons/org/CfgEventHandlers.hpp b/arma/client/addons/org/CfgEventHandlers.hpp new file mode 100644 index 0000000..c6e25db --- /dev/null +++ b/arma/client/addons/org/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/org/README.md b/arma/client/addons/org/README.md new file mode 100644 index 0000000..1c007ba --- /dev/null +++ b/arma/client/addons/org/README.md @@ -0,0 +1,4 @@ +forge_client_org +=================== + +Description for this addon diff --git a/arma/client/addons/org/XEH_PREP.hpp b/arma/client/addons/org/XEH_PREP.hpp new file mode 100644 index 0000000..d83118a --- /dev/null +++ b/arma/client/addons/org/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(handleUIEvents); +PREP(initOrgClass); +PREP(openUI); diff --git a/arma/client/addons/org/XEH_postInit.sqf b/arma/client/addons/org/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/org/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/org/XEH_postInitClient.sqf b/arma/client/addons/org/XEH_postInitClient.sqf new file mode 100644 index 0000000..5982469 --- /dev/null +++ b/arma/client/addons/org/XEH_postInitClient.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" + +if (isNil QGVAR(OrgClass)) then { [] call FUNC(initOrgClass); }; + +[QGVAR(initOrg), { + GVAR(OrgClass) call ["init", []]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseInitOrg), { + params [["_data", createHashMap, [createHashMap]]]; + + GVAR(OrgClass) call ["sync", [_data, true]]; + + SETPVAR(player,FORGE_isLoaded,true); + cutText ["", "PLAIN", 1]; +}] call CFUNC(addEventHandler); + +[QGVAR(responseSyncOrg), { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + GVAR(OrgClass) call ["sync", [_data, _jip]]; +}] call CFUNC(addEventHandler); + +[{ + EGVAR(actor,ActorClass) get "isLoaded"; +}, { + [QGVAR(initOrg), []] call CFUNC(localEvent); +}] call CFUNC(waitUntilAndExecute); diff --git a/arma/client/addons/org/XEH_preInit.sqf b/arma/client/addons/org/XEH_preInit.sqf new file mode 100644 index 0000000..640756c --- /dev/null +++ b/arma/client/addons/org/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/org/XEH_preInitClient.sqf b/arma/client/addons/org/XEH_preInitClient.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/client/addons/org/XEH_preInitClient.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/client/addons/org/XEH_preStart.sqf b/arma/client/addons/org/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/client/addons/org/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/client/addons/org/config.cpp b/arma/client/addons/org/config.cpp new file mode 100644 index 0000000..2b01e51 --- /dev/null +++ b/arma/client/addons/org/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\RscOrg.hpp" diff --git a/arma/client/addons/org/functions/fnc_handleUIEvents.sqf b/arma/client/addons/org/functions/fnc_handleUIEvents.sqf new file mode 100644 index 0000000..ce70c0f --- /dev/null +++ b/arma/client/addons/org/functions/fnc_handleUIEvents.sqf @@ -0,0 +1,33 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Handles the UI events. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_client_org_fnc_handleUIEvents; + * + * Public: No + */ + +params ["_control", "_isConfirmDialog", "_message"]; + +private _alert = fromJSON _message; +private _event = _alert get "event"; +private _data = _alert get "data"; +private _display = displayChild findDisplay 46; + +diag_log format ["[FORGE:Client:Org] Handling UI event: %1 with data: %2", _event, _data]; + +switch (_event) do { + case "org::close": { _display closeDisplay 1; }; + default { hint format ["Unhandled UI event: %1", _event]; }; +}; + +true; diff --git a/arma/client/addons/org/functions/fnc_initOrgClass.sqf b/arma/client/addons/org/functions/fnc_initOrgClass.sqf new file mode 100644 index 0000000..ae1a4df --- /dev/null +++ b/arma/client/addons/org/functions/fnc_initOrgClass.sqf @@ -0,0 +1,81 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the org class. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Examples: + * [] call forge_client_org_fnc_initOrgClass + * + * Public: Yes + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(OrgClass) = createHashMapObject [[ + ["#type", "IOrgClass"], + ["#create", { + _self set ["uid", getPlayerUID player]; + _self set ["org", createHashMap]; + _self set ["isLoaded", false]; + _self set ["lastSave", time]; + + private _org = createHashMap; + _org set ["id", ""]; + _org set ["owner", ""]; + _org set ["name", ""]; + _org set ["funds", 0]; + _org set ["reputation", 0]; + _org set ["assets", createHashMap]; + _org set ["members", createHashMap]; + + _self set ["org", _org]; + }], + ["init", { + private _uid = _self get "uid"; + private _org = _self get "org"; + + [SRPC(org,requestInitOrg), [_uid, _org]] call CFUNC(serverEvent); + + systemChat format ["Org loaded for %1", (name player)]; + diag_log "[FORGE:Client:Org] Org Class Initialized!"; + }], + ["save", { + params [["_sync", false, [false]]]; + + private _uid = _self get "uid"; + [SRPC(org,requestSaveOrg), [_uid, _sync]] call CFUNC(serverEvent); + + _self set ["lastSave", time]; + }], + ["sync", { + params [["_data", createHashMap, [createHashMap]], ["_jip", false, [false]]]; + + private _isLoaded = _self get "isLoaded"; + private _org = _self get "org"; + + if !(_isLoaded) then { _self set ["isLoaded", true]; }; + if (_data isEqualTo createHashMap) exitWith { + diag_log "[FORGE:Client:Org] Empty data received for sync, skipping."; + }; + + { _org set [_x, _y]; } forEach _data; + + _self set ["org", _org]; + diag_log "[FORGE:Client:Org] Sync completed"; + }], + ["get", { + params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; + + private _org = _self get "org"; + _org getOrDefault [_key, _default]; + }] +]]; + +SETVAR(player,FORGE_OrgClass,GVAR(OrgClass)); +GVAR(OrgClass) diff --git a/arma/client/addons/org/functions/fnc_openUI.sqf b/arma/client/addons/org/functions/fnc_openUI.sqf new file mode 100644 index 0000000..f36395d --- /dev/null +++ b/arma/client/addons/org/functions/fnc_openUI.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Opens the player interaction interface. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_client_org_fnc_openUI; + * + * Public: No + */ + +private _display = (findDisplay 46) createDisplay "RscOrg"; +private _ctrl = (_display displayCtrl 1003); + +_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/org/initKeybinds.inc.sqf b/arma/client/addons/org/initKeybinds.inc.sqf new file mode 100644 index 0000000..2922c52 --- /dev/null +++ b/arma/client/addons/org/initKeybinds.inc.sqf @@ -0,0 +1 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" diff --git a/arma/client/addons/org/initSettings.inc.sqf b/arma/client/addons/org/initSettings.inc.sqf new file mode 100644 index 0000000..416ff52 --- /dev/null +++ b/arma/client/addons/org/initSettings.inc.sqf @@ -0,0 +1 @@ +// Can use localize "STR_ACE_Common_Enabled" for name if ACE is required diff --git a/arma/client/addons/org/script_component.hpp b/arma/client/addons/org/script_component.hpp new file mode 100644 index 0000000..746956a --- /dev/null +++ b/arma/client/addons/org/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT org +#define COMPONENT_BEAUTIFIED Org +#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/org/stringtable.xml b/arma/client/addons/org/stringtable.xml new file mode 100644 index 0000000..cd5b9ba --- /dev/null +++ b/arma/client/addons/org/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Org + + + diff --git a/arma/client/addons/org/ui/RscCommon.hpp b/arma/client/addons/org/ui/RscCommon.hpp new file mode 100644 index 0000000..8b57936 --- /dev/null +++ b/arma/client/addons/org/ui/RscCommon.hpp @@ -0,0 +1,98 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// Default text sizes +#define GUI_TEXT_SIZE_SMALL (GUI_GRID_H * 0.8) +#define GUI_TEXT_SIZE_MEDIUM (GUI_GRID_H * 1) +#define GUI_TEXT_SIZE_LARGE (GUI_GRID_H * 1.2) + +// Pixel grid +#define pixelScale 0.50 +#define GRID_W (pixelW * pixelGrid * pixelScale) +#define GRID_H (pixelH * pixelGrid * pixelScale) + +class RscText; diff --git a/arma/client/addons/org/ui/RscOrg.hpp b/arma/client/addons/org/ui/RscOrg.hpp new file mode 100644 index 0000000..d63a41c --- /dev/null +++ b/arma/client/addons/org/ui/RscOrg.hpp @@ -0,0 +1,21 @@ +class RscOrg { + idd = 1002; + fadeIn = 0; + fadeOut = 0; + duration = 1e011; + onLoad = "uiNamespace setVariable ['RscOrg', _this select 0]"; + onUnLoad = "uinamespace setVariable ['RscOrg', nil]"; + + class controlsBackground {}; + class controls { + class IFrame: RscText { + type = 106; + idc = 1003; + x = "safeZoneXAbs"; + y = "safeZoneY"; + w = "safeZoneWAbs"; + h = "safeZoneH"; + colorBackground[] = {0, 0, 0, 0}; + }; + }; +}; diff --git a/arma/client/addons/org/ui/_site.7z b/arma/client/addons/org/ui/_site.7z new file mode 100644 index 0000000000000000000000000000000000000000..22e7cf6b0474cf65428db462a1d2cb177565addb GIT binary patch literal 8973 zcmV+oBl6rgdc3bE8~_AU$>FHVA^-pY0000Z000000002TRe*WmmM9?0T>t=J1duEw z3!9m$UgDyR;YFDVlAr~fs~72YM}2dQB!dj{0}AM^2V)<<)re0^c!fh`dpRn^QuhaK zi;c>%mbrfwZ1U5Tw_}p^=wngckWXa<@vCQ)Gg^w3)W-jN9MjGOA7a9=3rFimfYd;O zS%6n1%ChtDSrADAtzDVzr!mEM^^P?a@Z~3%2tWDx5e!Ib`Lr2GA`fvEj7ic4023udtXL7pUGQnZS_W^ z5`HY}C@GQZfKY?|KJed!yt2sNz)QvVw}VC6u70>0{fSP%NtpBO?(T78mzCaw7YyyR z$j*=qv<}C^urp^-ay9flewvnZAy`V9e2`T5I@;NBwrMChy(k4NOLb7s_8*UbFzwFQ zCY-CHO)!kiCJhl@4$&=cWDuqI4y@I`@VO1DenT?U7ih>sGiy|CZcc*Qv!a^D-RKJvUaPXP5bRr)ITC+ z-WH_K^;J1>bQk#i;GY!W;92veXi5;+#uxx2u()8R=;hj?cq3SX2VFp2jBJGn0R1B`l6($jq`mqK zugb%OOG$g#ID4@l6X$v2t`8&G8j)+pMC9_VsEWMd|0Ydv~K>DqliUzO1<1X427k8c;YUBQJ)qdj;@Cr}1{OqJc>{y9WQxKje@k(LYQDFy*KvQrP<9d%T^0^CkQEJ@~0sm z(P~mYdP_vgXYXfDU^I$^de_WY9L|8kWnWcED|8wp+%l6C1+@wbJz_?4zY_w_LqcpA z9UK2zfp!zh$w1^lSnEX8JVe5YrQo0y9#@%{Xp^2L>R*MxLtKDxq>bOW0goP=7`3|T zQ%E0(n6FNVQb0Usm)**%y9ia(Z}%P0mak1fHC|A8l!s;|K5Ocew-$vkH=hR( zY|8YAfzW-X#)A}l>2ANX97`=X#hc5I6*mjS*-n2XSwmt}0}O5LCr79qsx2;y)#@WY zW!cpVrt@TA+9WvfHFt%NyNp*q;n3oq#Xd!DodC*hY{f0Gl@0WFG6XiUc=>8FqX5VT zuQwb-CqW@f+#>b13LKw60W|3d-Ar0R>?ipq=Tl)7ZLO=Rw>5^SfV6~Miih>LvI##I%IH)S$(OIT zs=NCT0=z1{c_h(I=yJH9zbF_39=ZKuc$PL?7ZO+j%T6gkxe`7<}X-wvL};q?Oo$=649;bl#$w1h^ zGA9vDvb=N1hPw-mL*nvRf4L+iXr!!s<1U1yDSrYIktn*qRs^c38E&XPhd(Ya(h09F z#)$wFR&nv-+o8YB@QjM(@`5vV5uLH|126|5WGA?Brmv9+2SUVn>dfuEO1v)H$UPKR zyNDMPcd81ksiy!Sc_EpT6sh9;{AIuz-?#{}$^bLa#VPXQ!U5;r(kWcgLHNS9#%D=p z#uW4qrjq4(1EBz!sVD)m`)zXN!PYJYs~D%Bx-B1_j~d;9%l82B4ZAQJCK_N@*0-mi za-eb^o}_K`84Q6O4P{mpM`@l#wVi!m;3+8~l#4q1-#A3zP_`@3f8wSR{(fP3>r@tw zSWBq@mieTNsmWRQXGdSO?b-{KyIh|$NA(V+jPRR^@j#V*%DFd{zVmI6qcXeXMW#Ex zlUI{r{~|owE8YR(0u|+Q6Duz&dX^Lt(2r_&fh_h>tqb(mLbN@ZLhK@P;~R)&nYe3Y z%)$M!z*WxhLX?gxOsPmC%74=`=M?L7|L%HA*aaLaC!4auKF1w<&%b z=iMgvqyj9(u2~^0d?D)S5H6g|3$edu9K<8#sq0W42xN^*KD_*zq9dra*rXm#MrbPT z$N$aX*($_&=fsqW#ZbdF=~SbkARG6VCC~gKq(i*#O;3gX(s|SXQC*6p&+re z_4O`&iBsd*q8Y7~mQ79brSkWs&bK68?luzHH#C3+&>;*I@9tdLN)Uvh9r$nEOt(c*$^QUiR4-EA=uFP>uSuXfAk|QiYVYUVkCD zn0JVEurAK!146x)16|pr=wDt<_CL?=Zo|+gs1;fg{!we7tUf$D`Q@bSS{DVJS(X9I z`X9e2D-$Y?&6!`XH-*Si_U@z&qxd^qY2d!;d|Kewy&#H=rY++x*|Qd z#5bIJ@s8(ZzD^js3m&o5lH+_wyw-AF>3a5sL=yu3{lO{EAu07@$d0tqS|UOu6frEl zeYSKU6kENpm5i=Of-DKPzk`2Slhmh>V3oPvF++B^?mf_t1t`dUhpfLF1B>KUYNZ86 zvbPqPKu}#&opO2f=FfQ+;XiYef;Cp;Oz`j)ODL^QV$yCU=jPWSH<&2{nzlon_MYiU zr#W}pICR!2*`vl%ADP8F?9~WGQ_^_S{%6w2RO0B{U_D28omN8 zS+s^dW}zWH(t;xu^%W-W$TdV6TEGb*e`=0N)$?9Xr$~yfrea@>pQ(p`l?1vm+gK7wLNWsyAzukZNW1{{;rS~dSTtNF`Gx2V)- zht&~TLnpCoUcaMPYIF2iyA7xx9FF256wTcpw-Ohn4^SB!HlE-sgQK2m6ZsR@wrLn8 z%gR`=tti(ve5ES_^qKn6r*yg{7TmleG#$2WJA+A9rZR=Xk^H0H5e(V{mVkIr9Z5Y( zHwBk|HVE!79hvLVJ4D9Tl&KEUulQ)%=468Tvkq1D-NAvE_3{Lo$$EL6(ps6~VLdJ0 zeFUs^$S41Pd@_=IPzQ3oiJ^t`%kUbym7A9HHG#o4E{y}4)|fSiLzR@BcI?wU*kLmZ z^dV;Mw1LKGrIHr$ZUQl+^#7gi&=z?;v`e<_O|CTzIPF@kwM4;P7%~7^=}+zO)2YzZ z6HjevVWf==f5bodzqNay!^o6UQWXcs2{TM13Z3&M+^)icO#`DTrbG)-^T~&$#FjWk z2aYAkeB^is4fK4?sq?6NX*fYd-2&)mtD)J;WaHWRnJ+CkJ?u5h_f)G>%JcLKhtzUpObFiPhkLAH}hC)mFi+10F$S&pSr{{mBMZVxl@; zo!7A;JU>XSZV1eizK~K=6=NVry-|2`>aC2DVfHKZOMI!{Xn&ZpWm~bK*cc(uKk^_V zpE8F#VLrrLEZ&W8YpmSUAW36LB9zdtm!hFy1wx2s>>Rq;@{0>v8P7@Ks_l~U=XFOD z+0-`EsyWasaZI<6^e1D{3(T*&U#RTm)6;n^@u`@F?#L{MGB29xCgixWaP!?iQo-1^ zGqqYtxgetQ7eHUlo|370l0Cl_DI^rjhJ)1YRrE9x3er-)SF@?Jq_qOOv*FcHJzy8$9T)FTSiqv-I=6>0@l$V|Qjotx;B2yXid+(d#sn5zqD)W!L-@2k2PIvf1JT#3{lnF7 zMhA5%vJNqB3P9Rm1gB?7W^;15O|D}K!rsbvrd9X2w{DWHJVlPvv(Vn!rZEj7)~$P`6-aSLO8yw*J)IukXS>9`g99iahsEqb+tA zBgvnDg&c$~D9oR#;V&#H^7>X72xwiW^B~S=tSTEEy|;omD?=fdJ+2LNT2U*$3~B`w z4R`{BI^)wt9NT2Tdtclv&(~FnIYhEk#mefutw6-5zPsglMNo?e6=Hbg$QR7psw1k^ zXiiHN>DQdOOh(@!aSlHd!~fx|VeZ263t8}BhX`m_bV7qz_F1DTs{Bb)bG<@V0=Mhi zR2)59*oJxhR;8dsR6RseyUQEe+9GNAvb!Tk^8}!$8?FG3d;_VV@ZN^q6Qkswwo@ss zpqB3MR`kb6gdw4nY}F+y`qWc2Y|8_05`DQ-YC(RNaxLMm&l^7hw2r(x2E+1ds`!KX zlSz^qtz2^8=59=)0cSXLGQ<>fR2l8Jm)GFP&#| z4;D7VR=B0xe|@IIEPZwB`57*~GDql9uir+^!?Dvnhc8tQuK`45o#Lvj~nnaL}O-463K6;P9L08Ab}Q013eP`P1Sv zLf!+nA>3bLrq5%8AFIb$d>07UxD_#Bx?p9T$)3kP9Sv-<>^9BH2Qo@A{&O?gC1ZT(u4RAlw8i`Mx411@8-tpje$yzZ0L zV=cF(P8|;|cbp)+aE}X516@SLQ>A)ljf7#`wG8 zoVuv^Ek#STpHg^OJya0nV?S@w8BZ6JTahAoDwSfIen@In_>nkBPC&Q2e*XAs6}%$p z)ke%%R;LS{@BQmieISx|25pjUZ9;Mp&Wlh}u#d|av|C)zmAy~=Rw1Evk8 z>F*6PenjHyEAIRaXn*%euU4*%U-G`C&G8lGhUzt0+RG_M6= z!yDG)HkK5QDhDHb26~~D*hGg9{pLVh3y34Ne7DxBG=e;f;i`` zc`^6XcC^A83au8z?=!5EXcU57uq>gx` z6RY!GT9hZ!r9Z3X{Wcm%n4WF!TqMFu;JD#3>@N6Wm)xnSO>+e07vJmmK9AhqV2MUI zX@3Fw^*tEOI`t!!w~r6ChK6(->PP|6@#G$ToxUWA3R%=OtH>|S6aE#~T1#)7++5q= z-8~L-Q(MwjV9tv&aT733wV|rHSZW3ktec*yCH6ql8xDQ&`xNqUSm`l5(4CDo58+xs zJMy((AC8OMl9xW2znmT>NP8Yk8$HJYBA&voKEz6CD|ugBD<`JEEQ>*v!n}=)s!zk% z?+OGN(myBDFg+t+q;%Y>cq$_OIyu2{3-|q*xi`zAAS-dkaars(GgC**s2Ya?0jlN} z5>zt6Pf>7tIp^qnT}#&IAkFfSUtpfm+*%hlX4#LXB9%XR#R2IDaQWxYEs_~)!LW7P zyTAlf=JgXMJhe?nPRtZmaQrk_5U=8|QTf&d>!mt)v2Kue0O2#G>En3W%|k~#+-^ns z5YdP#8l`gd$E8b0?skKg+;!~OKg>WaisKmHIEnu+vJ!E ztlCtKuaaVFE?Erk>aym8bseM_?3G>qT4no=B2m@Ur`?oUV{?8L&>el@`)ztA!fX=i z9!*^dcwdMqI0cxKB2DY>|ITdbLUBI0pkw42UZM9I*VRd&Y8>U-$7;=Da%a4zb*5T|+Vt7@;nM_}$^;lDT7 znJ1If(g1~4WTK8iwP0I$qjnoFomrVaEZ@}--oRZ=|8XhR!di0aLT%+9*0rNBloILY zO{G5Y5woX~jW*OM3@;?N$Mk}`?c=Nn-bFT;JQYRK$>ZD!q(^i~c&$J)ObL>T28;>^ z>Fo|?J-gmj7y1XCUs0MuVWt?7yrW{<0C+zJKBMv8#SBK4%7063--~*eO)EMB*Ph0h zmk9;cmt{rKrU+KKyUw{N*4gGo)yS}~YKYT$Tins>TKxq1+TiRzB9}H#FH9*$d=%%pRsA+3n4`iidN;q1zT> zZmnMas$rZtL#c5sMe{#GfD*d+uH|`sM`gg7h;eCyTl1MKTCsL3zvjJ1q_#-uGB;1c z5MwIsLFiXnCjl4ei^zZ%IKV5>wd~BuYVOSd&AOeimlKK(LBapEXshMQ7O6Zw%|X?V zIFY3P+>o2a-}ehasLz=n{qqwcaN}tVp9FSnjAO-ey^@yJvYiI?YR1znO&4*VwC4^K zMm|2MpLP3K4Pu$Bw}b*X{Ft%=hsxF^0PqCHgU6v;gUy@;haIOd0s$}zI?Rpmxi$>F z#+F(O#DXxVQ_)bPlW5YyV{tIdVF9SPyuXI!wYPQJjKOi8wn zA5wrq+>&15v}KV5m+r=a&^1&J=Q`+os5sk{+N$!xZj?lK5TV9$hr&jbz%v%X ztF*8m3HFC*pg)Lr6hzljEOTWZk)R8)e~WE(`lG@zc`_zxCXG~W_mT1s|3UUT0-17c zjFc&M!6hk#QSi5GK?e576PfeE_;&_!O$-owys2XSIWAvf+l55n+{HTM^zk;gHPYpC z5e}_v>g~5GSifUysLR9S3T}LdcMLRg?_R+VNw1f{aIb(S_eV0`j*`VqV0aWOTNfVH zSUp7z+A7Z^EKDpCKiwman)9y!TadH-ul61}=sMBOe2~^v4zQh*O>=&6h1|`iH8BTW zi;$@B!zW+!qEMrbeZ3q)x+h`FcS)^9a_r2=2(8jU;Sks63s>r$eQs4s7PbDpDY(){ zbuU~>B^L-da*g{$Y}+>+x9{RvR8#6>L~R|_(*lJNZsg{*giC+Ou!9s*#=f`S(J|fo zs((BI7)(6qO*Oa;GouwBe+9{LQ>i3MH!j)ciCTef2g`hK#0nil# zbZd{%SS%qbehQP+qI~tTZE^$(Ioav)l+WS!Y^u@Si23@n;-x+=Qmh3!nJ3}C(@TZ< zL!=nC5pl>^<(o*+7`nMg*1)o&b!+Y@p!s^H9~fD+LnTtvv8 zRcZ?(AXt4`w8?A}haw0~B^;YUhO@;6TJBb1rwO+uUl=HlRBqvfQpeKj3j8o4lLF>^ z4ioKgI%A?RuR%2~fE8zgrimJ0cz>du@qMgg-?de-wtBV;5Bs#YIkC^mzc zsytnY`D8PEhHfGpi zcUxKX(w;UofypHaNUa`^CV*J&kku1%U?ynRa z;YYNx=if*QXP6z-*GH{gHvj+tfinlL57v>6N!KLP{)`Q3jF_^f?M-gwW?! z_J^Per^M;oghtK-Xtq(TT$A!_5MnW^_)g=}%=!9wFa~cx)wR)~I*P(_nto@p^c$pK zGr`-AURo}Qt8X?=k7N5_;FUb<-WF1Yx(ftr`f)lDnG zDu7ywS>T7(ql$2d&*6uW{RDeKG?*;DPO@GSIaWuVKyd<{-zwf4@@^102a;OcZMYM| zQi;5Vkc4MkU;H+4bj)*{7)2*z;gYyn%;Z9RDGlikva|)8kXg(>`Rboj_gxbu1bZP< zb+12W3CpM@DBvkd3v;J7B$@|vNc4dQ-2K?_WHr{tolzH*IV&c9c43^alIx10CnnGp zznvC`sDDie`Tw-omWQb%7bHm))0GkMR*5{02o^cWH}W}~44EcHnL70Tc;8KmriNg* n02cuaO01Slg3IPjwO!5E#rFl{c literal 0 HcmV?d00001 diff --git a/arma/client/addons/org/ui/_site/index.html b/arma/client/addons/org/ui/_site/index.html new file mode 100644 index 0000000..b68277e --- /dev/null +++ b/arma/client/addons/org/ui/_site/index.html @@ -0,0 +1,243 @@ + + + + + + + Organization Dashboard + + + + + + +
+ +
+ +
+

Organization Name

+

FACTION-001

+
+
+ + +
+
+ + +
+ +
+
+

Overview

+
Active
+
+
+
+
+ Total Members + 24 +
+
+ Online Now + 8 +
+
+ Org Balance + $125,000 +
+
+ Reputation + Level 5 +
+
+
+
+ + +
+
+

Members Online

+ 8 +
+
+
+
+
+
+ John Doe + Leader +
+
+
+
+
+ Jane Smith + Officer +
+
+
+
+
+ Mike Johnson + Member +
+
+
+
+
+ Sarah Wilson + Member +
+
+
+
+
+ + +
+
+

Recent Activity

+
+
+
+
+
2m ago
+
Mike Johnson completed mission "Alpha Strike"
+
+
+
15m ago
+
Jane Smith deposited $5,000 to org bank
+
+
+
1h ago
+
New member Alex Brown joined the organization
+
+
+
2h ago
+
Organization captured territory: Zone-7
+
+
+
+
+ + +
+
+

Assets

+
+
+
+
+ 🏢 +
+ Headquarters + Downtown +
+
+
+ 🚁 +
+ Helicopters + 3 units +
+
+
+ 🚗 +
+ Vehicles + 12 units +
+
+
+ 📦 +
+ Storage Units + 5 locations +
+
+
+
+
+ + +
+
+

Active Missions

+ 3 +
+
+
+
+
+ Supply Run + High Priority +
+
Deliver supplies to northern outpost
+
+
+
+
+ 65% +
+
+
+
+ Recon Operation + Medium Priority +
+
Scout enemy positions in Zone-4
+
+
+
+
+ 30% +
+
+
+
+ Territory Defense + Low Priority +
+
Maintain control of captured zones
+
+
+
+
+ 90% +
+
+
+
+
+
+
+ + + + + diff --git a/arma/client/addons/org/ui/_site/script.js b/arma/client/addons/org/ui/_site/script.js new file mode 100644 index 0000000..43e1821 --- /dev/null +++ b/arma/client/addons/org/ui/_site/script.js @@ -0,0 +1,179 @@ +/** + * Organization Dashboard + * Handles real-time updates and interactions + */ + +// Mock data for demonstration +const mockData = { + org: { + name: "Black Phoenix Initiative", + tag: "BPI-001", + status: "Active" + }, + stats: { + totalMembers: 24, + onlineMembers: 8, + balance: 125000, + reputation: 5 + }, + membersOnline: [ + { name: "John Doe", rank: "Leader", online: true }, + { name: "Jane Smith", rank: "Officer", online: true }, + { name: "Mike Johnson", rank: "Member", online: true }, + { name: "Sarah Wilson", rank: "Member", online: true }, + { name: "Alex Brown", rank: "Member", online: true }, + { name: "Chris Davis", rank: "Member", online: true }, + { name: "Pat Lee", rank: "Recruit", online: true }, + { name: "Sam Taylor", rank: "Recruit", online: true } + ], + activities: [ + { time: "2m ago", text: "Mike Johnson completed mission \"Alpha Strike\"" }, + { time: "15m ago", text: "Jane Smith deposited $5,000 to org bank" }, + { time: "1h ago", text: "New member Alex Brown joined the organization" }, + { time: "2h ago", text: "Organization captured territory: Zone-7" } + ], + assets: [ + { icon: "🏢", name: "Headquarters", location: "Downtown" }, + { icon: "🚁", name: "Helicopters", location: "3 units" }, + { icon: "🚗", name: "Vehicles", location: "12 units" }, + { icon: "📦", name: "Storage Units", location: "5 locations" } + ], + missions: [ + { + name: "Supply Run", + priority: "high", + description: "Deliver supplies to northern outpost", + progress: 65 + }, + { + name: "Recon Operation", + priority: "medium", + description: "Scout enemy positions in Zone-4", + progress: 30 + }, + { + name: "Territory Defense", + priority: "low", + description: "Maintain control of captured zones", + progress: 90 + } + ] +}; + +// Update dashboard with data +function updateDashboard(data) { + // Update header + if (data.org) { + const orgName = document.querySelector('.org-name'); + const orgTag = document.querySelector('.org-tag'); + if (orgName) orgName.textContent = data.org.name; + if (orgTag) orgTag.textContent = data.org.tag; + } + + // Update stats + if (data.stats) { + const statValues = document.querySelectorAll('.stat-value'); + if (statValues[0]) statValues[0].textContent = data.stats.totalMembers; + if (statValues[1]) statValues[1].textContent = data.stats.onlineMembers; + if (statValues[2]) statValues[2].textContent = `$${data.stats.balance.toLocaleString()}`; + if (statValues[3]) statValues[3].textContent = `Level ${data.stats.reputation}`; + } +} + +// Event handlers +function setupEventHandlers() { + // Close button + const closeBtn = document.querySelector('.close-btn'); + if (closeBtn) { + closeBtn.addEventListener('click', () => { + console.log('Closing dashboard...'); + // Send close event to Arma + if (typeof A3API !== 'undefined') { + A3API.SendAlert(JSON.stringify({ + event: 'org::close', + data: {} + })); + } + }); + } + + // Settings button + const settingsBtn = document.querySelectorAll('.action-btn')[0]; + if (settingsBtn && !settingsBtn.classList.contains('close-btn')) { + settingsBtn.addEventListener('click', () => { + console.log('Opening settings...'); + // Send settings event to Arma + if (typeof A3API !== 'undefined') { + A3API.SendAlert(JSON.stringify({ + event: 'org::settings', + data: {} + })); + } + }); + } + + // Member item clicks + const memberItems = document.querySelectorAll('.member-item'); + memberItems.forEach((item, index) => { + item.addEventListener('click', () => { + console.log('Member clicked:', mockData.membersOnline[index]); + if (typeof A3API !== 'undefined') { + A3API.SendAlert(JSON.stringify({ + event: 'org::member::view', + data: { member: mockData.membersOnline[index] } + })); + } + }); + }); + + // Asset item clicks + const assetItems = document.querySelectorAll('.asset-item'); + assetItems.forEach((item, index) => { + item.addEventListener('click', () => { + console.log('Asset clicked:', mockData.assets[index]); + if (typeof A3API !== 'undefined') { + A3API.SendAlert(JSON.stringify({ + event: 'org::asset::view', + data: { asset: mockData.assets[index] } + })); + } + }); + }); + + // Mission item clicks + const missionItems = document.querySelectorAll('.mission-item'); + missionItems.forEach((item, index) => { + item.addEventListener('click', () => { + console.log('Mission clicked:', mockData.missions[index]); + if (typeof A3API !== 'undefined') { + A3API.SendAlert(JSON.stringify({ + event: 'org::mission::view', + data: { mission: mockData.missions[index] } + })); + } + }); + }); +} + +// Initialize dashboard +function initDashboard() { + console.log('Organization Dashboard initializing...'); + + // Update with mock data + updateDashboard(mockData); + + // Setup event handlers + setupEventHandlers(); + + console.log('Organization Dashboard initialized'); +} + +// Auto-initialize when DOM is ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initDashboard); +} else { + initDashboard(); +} + +// Expose functions globally for Arma integration +window.updateOrgDashboard = updateDashboard; diff --git a/arma/client/addons/org/ui/_site/style.css b/arma/client/addons/org/ui/_site/style.css new file mode 100644 index 0000000..a4f93c1 --- /dev/null +++ b/arma/client/addons/org/ui/_site/style.css @@ -0,0 +1,469 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + height: 100vh; + width: 100vw; + background: rgba(0, 0, 0, 0.6); + font-family: Arial, sans-serif; + color: rgba(200, 220, 240, 0.95); + overflow: hidden; +} + +.dashboard-container { + height: 100vh; + width: 100vw; + padding: 2rem; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +/* Header Section */ +.dashboard-header { + display: flex; + align-items: center; + gap: 1.5rem; + padding: 1.25rem 1.5rem; + background: rgba(15, 20, 30, 0.9); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + box-shadow: + 0 0 20px rgba(100, 150, 200, 0.15), + 0 4px 16px rgba(0, 0, 0, 0.8); +} + +.org-logo { + width: 60px; + height: 60px; + background: rgba(20, 30, 45, 0.8); + border: 2px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; +} + +.logo-placeholder { + font-size: 1.5rem; + font-weight: bold; + color: rgba(100, 150, 200, 0.9); +} + +.org-info { + flex: 1; +} + +.org-name { + font-size: 1.5rem; + font-weight: 600; + letter-spacing: 0.5px; + text-transform: uppercase; + color: rgba(200, 220, 255, 1); + margin-bottom: 0.25rem; +} + +.org-tag { + font-size: 0.875rem; + color: rgba(140, 160, 180, 0.8); + letter-spacing: 1px; +} + +.header-actions { + display: flex; + gap: 0.75rem; +} + +.action-btn { + padding: 0.625rem 1.25rem; + background: rgba(20, 30, 45, 0.7); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 4px; + color: rgba(200, 220, 240, 0.95); + font-size: 0.875rem; + text-transform: uppercase; + letter-spacing: 0.5px; + cursor: pointer; + transition: all 0.15s ease; +} + +.action-btn:hover { + background: rgba(30, 45, 70, 0.9); + border-color: rgba(150, 200, 255, 0.7); + box-shadow: + 0 0 15px rgba(100, 150, 200, 0.2), + inset 0 0 20px rgba(100, 150, 200, 0.05); +} + +.close-btn { + border-color: rgba(200, 100, 100, 0.4); +} + +.close-btn:hover { + border-color: rgba(255, 100, 100, 0.7); + box-shadow: + 0 0 15px rgba(200, 100, 100, 0.2), + inset 0 0 20px rgba(200, 100, 100, 0.05); +} + +/* Dashboard Grid */ +.dashboard-grid { + flex: 1; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1.25rem; + overflow-y: auto; + padding-right: 0.5rem; +} + +/* Custom Scrollbar */ +.dashboard-grid::-webkit-scrollbar { + width: 8px; +} + +.dashboard-grid::-webkit-scrollbar-track { + background: rgba(15, 20, 30, 0.5); + border-radius: 4px; +} + +.dashboard-grid::-webkit-scrollbar-thumb { + background: rgba(100, 150, 200, 0.3); + border-radius: 4px; +} + +.dashboard-grid::-webkit-scrollbar-thumb:hover { + background: rgba(100, 150, 200, 0.5); +} + +/* Dashboard Cards */ +.dashboard-card { + background: rgba(15, 20, 30, 0.9); + border: 1px solid rgba(100, 150, 200, 0.4); + border-left: 3px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; + padding: 1.25rem; + box-shadow: + 0 0 20px rgba(100, 150, 200, 0.1), + 0 4px 16px rgba(0, 0, 0, 0.6); + transition: all 0.2s ease; +} + +.dashboard-card:hover { + border-left-color: rgba(150, 200, 255, 0.8); + box-shadow: + 0 0 25px rgba(100, 150, 200, 0.2), + 0 4px 20px rgba(0, 0, 0, 0.7); +} + +.card-wide { + grid-column: span 2; +} + +.card-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 1rem; + padding-bottom: 0.75rem; + border-bottom: 1px solid rgba(100, 150, 200, 0.2); +} + +.card-title { + font-size: 1rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(200, 220, 255, 1); +} + +.card-status { + padding: 0.25rem 0.75rem; + background: rgba(100, 200, 150, 0.2); + border: 1px solid rgba(100, 200, 150, 0.4); + border-radius: 3px; + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(150, 255, 200, 0.9); +} + +.card-badge { + padding: 0.25rem 0.625rem; + background: rgba(100, 150, 200, 0.2); + border: 1px solid rgba(100, 150, 200, 0.4); + border-radius: 3px; + font-size: 0.75rem; + font-weight: 600; + color: rgba(150, 200, 255, 0.9); +} + +.card-content { + color: rgba(180, 200, 220, 0.9); +} + +/* Stat Grid */ +.stat-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); + gap: 1.25rem; +} + +.stat-item { + display: flex; + flex-direction: column; + gap: 0.5rem; + padding: 1rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 4px; +} + +.stat-label { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(140, 160, 180, 0.85); +} + +.stat-value { + font-size: 1.75rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); +} + +/* Member List */ +.member-list { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.member-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.75rem; + background: rgba(20, 30, 45, 0.5); + border: 1px solid rgba(100, 150, 200, 0.2); + border-radius: 4px; + transition: all 0.15s ease; +} + +.member-item:hover { + background: rgba(30, 45, 70, 0.7); + border-color: rgba(100, 150, 200, 0.4); +} + +.member-status { + width: 10px; + height: 10px; + border-radius: 50%; + background: rgba(100, 100, 100, 0.5); +} + +.member-status.online { + background: rgba(100, 200, 150, 0.9); + box-shadow: 0 0 8px rgba(100, 200, 150, 0.5); +} + +.member-info { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.member-name { + font-size: 0.875rem; + font-weight: 500; + color: rgba(200, 220, 240, 0.95); +} + +.member-rank { + font-size: 0.75rem; + color: rgba(140, 160, 180, 0.8); +} + +/* Activity List */ +.activity-list { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.activity-item { + padding: 0.75rem; + background: rgba(20, 30, 45, 0.5); + border-left: 2px solid rgba(100, 150, 200, 0.4); + border-radius: 2px; +} + +.activity-time { + font-size: 0.7rem; + color: rgba(100, 150, 200, 0.7); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 0.375rem; +} + +.activity-text { + font-size: 0.875rem; + color: rgba(180, 200, 220, 0.9); + line-height: 1.4; +} + +/* Asset List */ +.asset-list { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.asset-item { + display: flex; + align-items: center; + gap: 1rem; + padding: 0.75rem; + background: rgba(20, 30, 45, 0.5); + border: 1px solid rgba(100, 150, 200, 0.2); + border-radius: 4px; + transition: all 0.15s ease; +} + +.asset-item:hover { + background: rgba(30, 45, 70, 0.7); + border-color: rgba(100, 150, 200, 0.4); +} + +.asset-icon { + font-size: 1.5rem; +} + +.asset-info { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.asset-name { + font-size: 0.875rem; + font-weight: 500; + color: rgba(200, 220, 240, 0.95); +} + +.asset-location { + font-size: 0.75rem; + color: rgba(140, 160, 180, 0.8); +} + +/* Mission List */ +.mission-list { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.mission-item { + padding: 1rem; + background: rgba(20, 30, 45, 0.6); + border: 1px solid rgba(100, 150, 200, 0.3); + border-left: 3px solid rgba(100, 150, 200, 0.5); + border-radius: 4px; +} + +.mission-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.5rem; +} + +.mission-name { + font-size: 0.95rem; + font-weight: 600; + color: rgba(200, 220, 255, 1); +} + +.mission-priority { + padding: 0.25rem 0.625rem; + border-radius: 3px; + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.5px; + font-weight: 600; +} + +.mission-priority.high { + background: rgba(200, 100, 100, 0.2); + border: 1px solid rgba(200, 100, 100, 0.4); + color: rgba(255, 150, 150, 0.9); +} + +.mission-priority.medium { + background: rgba(200, 150, 100, 0.2); + border: 1px solid rgba(200, 150, 100, 0.4); + color: rgba(255, 200, 150, 0.9); +} + +.mission-priority.low { + background: rgba(100, 150, 200, 0.2); + border: 1px solid rgba(100, 150, 200, 0.4); + color: rgba(150, 200, 255, 0.9); +} + +.mission-description { + font-size: 0.85rem; + color: rgba(160, 180, 200, 0.85); + margin-bottom: 0.75rem; + line-height: 1.4; +} + +.mission-progress { + display: flex; + align-items: center; + gap: 0.75rem; +} + +.progress-bar { + flex: 1; + height: 6px; + background: rgba(20, 30, 45, 0.8); + border: 1px solid rgba(100, 150, 200, 0.3); + border-radius: 3px; + overflow: hidden; +} + +.progress-fill { + height: 100%; + background: linear-gradient(90deg, + rgba(100, 150, 200, 0.6), + rgba(150, 200, 255, 0.8)); + box-shadow: 0 0 10px rgba(100, 150, 200, 0.5); + transition: width 0.3s ease; +} + +.progress-text { + font-size: 0.75rem; + font-weight: 600; + color: rgba(100, 150, 200, 0.9); + min-width: 40px; +} + +/* Responsive adjustments */ +@media (max-width: 1200px) { + .card-wide { + grid-column: span 1; + } +} + +@media (max-width: 768px) { + .dashboard-container { + padding: 1rem; + } + + .dashboard-grid { + grid-template-columns: 1fr; + } +} diff --git a/arma/client/client.code-workspace b/arma/client/client.code-workspace new file mode 100644 index 0000000..e24ee21 --- /dev/null +++ b/arma/client/client.code-workspace @@ -0,0 +1,22 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "files.autoSave": "onFocusChange", + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.associations": { + "*.cpp": "arma-config", + "*.hpp": "arma-config", + "*.inc": "arma-config", + "*.cfg": "arma-config", + "*.rvmat": "arma-config" + } + } +} diff --git a/arma/client/docs/README.md b/arma/client/docs/README.md new file mode 100644 index 0000000..8320d12 --- /dev/null +++ b/arma/client/docs/README.md @@ -0,0 +1,49 @@ + + +

forge-client

+

+ + forge-client Version + + + forge-client Issues + + + forge-client Downloads + + + forge-client License + +
+ HEMTT +

+ +

+ Requires the latest version of CBA A3 +

+ +# Initial Project Setup! +Delete this section after the project has been initially set up: +1. Find and replace all instances of `forge-client` with the mod's name. +2. Find and replace all instances of `MOD_REPO` with the mod's name *and no spaces*. + - This should be the name of the repository on GitHub. +3. Find and replace all instances of `forge_client` with the mod's prefix. + - This should be all lowercase. +4. Find and replace all instances of `MOD_ACRONYM` with the mod's acronym. + - This should be all uppercase. +5. After the initial Steam upload, find and replace all instances of `MOD_ID` with the mod's Steam Workshop id. + +For third parties, make sure to also replace `IDSolutions` with your Github username / organization name, and to replace `DartRuffian` with your username. + +**forge-client** (MOD_ACRONYM) aims to... + +The project is entirely **open-source** and any contributions are welcome. + +## Core Features +- Feature + +## Contributing +For new contributers, see the [Contributing Setup & Guidelines](./.github/CONTRIBUTING.md). + +## License +forge-client is licensed under [APL-ND](./LICENSE.md). diff --git a/arma/client/extra/example_addon/$PBOPREFIX$ b/arma/client/extra/example_addon/$PBOPREFIX$ new file mode 100644 index 0000000..ae5f222 --- /dev/null +++ b/arma/client/extra/example_addon/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_client\addons\addonName diff --git a/arma/client/extra/example_addon/CfgEventHandlers.hpp b/arma/client/extra/example_addon/CfgEventHandlers.hpp new file mode 100644 index 0000000..865276c --- /dev/null +++ b/arma/client/extra/example_addon/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +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)); + }; +}; diff --git a/arma/client/extra/example_addon/README.md b/arma/client/extra/example_addon/README.md new file mode 100644 index 0000000..87592d8 --- /dev/null +++ b/arma/client/extra/example_addon/README.md @@ -0,0 +1,4 @@ +forge_client_addonName +=================== + +Description for this addon diff --git a/arma/client/extra/example_addon/XEH_PREP.hpp b/arma/client/extra/example_addon/XEH_PREP.hpp new file mode 100644 index 0000000..171d26d --- /dev/null +++ b/arma/client/extra/example_addon/XEH_PREP.hpp @@ -0,0 +1 @@ +// PREP(empty); diff --git a/arma/client/extra/example_addon/XEH_preInit.sqf b/arma/client/extra/example_addon/XEH_preInit.sqf new file mode 100644 index 0000000..8d45ad6 --- /dev/null +++ b/arma/client/extra/example_addon/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/extra/example_addon/XEH_preStart.sqf b/arma/client/extra/example_addon/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/client/extra/example_addon/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/client/extra/example_addon/config.cpp b/arma/client/extra/example_addon/config.cpp new file mode 100644 index 0000000..78d0972 --- /dev/null +++ b/arma/client/extra/example_addon/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"You!"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_client_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/client/extra/example_addon/functions/fnc_empty.sqf b/arma/client/extra/example_addon/functions/fnc_empty.sqf new file mode 100644 index 0000000..07b0282 --- /dev/null +++ b/arma/client/extra/example_addon/functions/fnc_empty.sqf @@ -0,0 +1,16 @@ +#include "..\script_component.hpp" +/* + * Author: You! + * An empty function that does nothing. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call forge_client_addonName_fnc_empty; + * + * Public: No + */ diff --git a/arma/client/extra/example_addon/initKeybinds.inc.sqf b/arma/client/extra/example_addon/initKeybinds.inc.sqf new file mode 100644 index 0000000..0e6dd20 --- /dev/null +++ b/arma/client/extra/example_addon/initKeybinds.inc.sqf @@ -0,0 +1,8 @@ +#include "\forge\forge_client\addons\main\data\hpp\defineDIKCodes.hpp" + +[ + _category, QGVAR(key_doTheThing), + [LSTRING(doTheThing_name), LSTRING(doTheThing_tooltip)], { + // ... + }, {}, [DIK_KEYNAME, _shift, _ctrl, _alt] // Default keybind +] call CBA_fnc_addKeybind; diff --git a/arma/client/extra/example_addon/initSettings.inc.sqf b/arma/client/extra/example_addon/initSettings.inc.sqf new file mode 100644 index 0000000..b29e374 --- /dev/null +++ b/arma/client/extra/example_addon/initSettings.inc.sqf @@ -0,0 +1,6 @@ +// Can use localize "STR_ACE_Common_Enabled" for name if ACE is required +[ + QGVAR(enabled), "CHECKBOX", + [LSTRING(enabled_name), LSTRING(enabled_tooltip)], + _category, true, true +] call CBA_fnc_addSetting; diff --git a/arma/client/extra/example_addon/script_component.hpp b/arma/client/extra/example_addon/script_component.hpp new file mode 100644 index 0000000..ef74027 --- /dev/null +++ b/arma/client/extra/example_addon/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT addonName +#define COMPONENT_BEAUTIFIED Addon Name +#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/extra/example_addon/stringtable.xml b/arma/client/extra/example_addon/stringtable.xml new file mode 100644 index 0000000..51ac06f --- /dev/null +++ b/arma/client/extra/example_addon/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Addon Name + + + diff --git a/arma/client/extra/example_subaddon/config.cpp b/arma/client/extra/example_subaddon/config.cpp new file mode 100644 index 0000000..ed5ce38 --- /dev/null +++ b/arma/client/extra/example_subaddon/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + author = AUTHOR; + authors[] = {"You!"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + addonRootClass = QUOTE(ADDON); + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + QUOTE(ADDON) + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; diff --git a/arma/client/extra/example_subaddon/script_component.hpp b/arma/client/extra/example_subaddon/script_component.hpp new file mode 100644 index 0000000..63dfda0 --- /dev/null +++ b/arma/client/extra/example_subaddon/script_component.hpp @@ -0,0 +1,4 @@ +#define SUBCOMPONENT subaddonName +#define SUBCOMPONENT_BEAUTIFIED Sub Addon + +#include "..\script_component.hpp" diff --git a/arma/client/icon_128_ca.paa b/arma/client/icon_128_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..02dc39ec2b7ff4ef386de22f57c38b384f902b7e GIT binary patch literal 22016 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 literal 0 HcmV?d00001 diff --git a/arma/client/include/a3/ui_f/hpp/defineDIKCodes.inc b/arma/client/include/a3/ui_f/hpp/defineDIKCodes.inc new file mode 100644 index 0000000..4031b6b --- /dev/null +++ b/arma/client/include/a3/ui_f/hpp/defineDIKCodes.inc @@ -0,0 +1,190 @@ +#ifndef DIK_ESCAPE + +/**************************************************************************** + * + * DirectInput keyboard scan codes + * + ****************************************************************************/ + +#define DIK_ESCAPE 0x01 +#define DIK_1 0x02 +#define DIK_2 0x03 +#define DIK_3 0x04 +#define DIK_4 0x05 +#define DIK_5 0x06 +#define DIK_6 0x07 +#define DIK_7 0x08 +#define DIK_8 0x09 +#define DIK_9 0x0A +#define DIK_0 0x0B +#define DIK_MINUS 0x0C /* - on main keyboard */ +#define DIK_EQUALS 0x0D +#define DIK_BACK 0x0E /* backspace */ +#define DIK_TAB 0x0F +#define DIK_Q 0x10 +#define DIK_W 0x11 +#define DIK_E 0x12 +#define DIK_R 0x13 +#define DIK_T 0x14 +#define DIK_Y 0x15 +#define DIK_U 0x16 +#define DIK_I 0x17 +#define DIK_O 0x18 +#define DIK_P 0x19 +#define DIK_LBRACKET 0x1A +#define DIK_RBRACKET 0x1B +#define DIK_RETURN 0x1C /* Enter on main keyboard */ +#define DIK_LCONTROL 0x1D +#define DIK_A 0x1E +#define DIK_S 0x1F +#define DIK_D 0x20 +#define DIK_F 0x21 +#define DIK_G 0x22 +#define DIK_H 0x23 +#define DIK_J 0x24 +#define DIK_K 0x25 +#define DIK_L 0x26 +#define DIK_SEMICOLON 0x27 +#define DIK_APOSTROPHE 0x28 +#define DIK_GRAVE 0x29 /* accent grave */ +#define DIK_LSHIFT 0x2A +#define DIK_BACKSLASH 0x2B +#define DIK_Z 0x2C +#define DIK_X 0x2D +#define DIK_C 0x2E +#define DIK_V 0x2F +#define DIK_B 0x30 +#define DIK_N 0x31 +#define DIK_M 0x32 +#define DIK_COMMA 0x33 +#define DIK_PERIOD 0x34 /* . on main keyboard */ +#define DIK_SLASH 0x35 /* / on main keyboard */ +#define DIK_RSHIFT 0x36 +#define DIK_MULTIPLY 0x37 /* * on numeric keypad */ +#define DIK_LMENU 0x38 /* left Alt */ +#define DIK_SPACE 0x39 +#define DIK_CAPITAL 0x3A +#define DIK_F1 0x3B +#define DIK_F2 0x3C +#define DIK_F3 0x3D +#define DIK_F4 0x3E +#define DIK_F5 0x3F +#define DIK_F6 0x40 +#define DIK_F7 0x41 +#define DIK_F8 0x42 +#define DIK_F9 0x43 +#define DIK_F10 0x44 +#define DIK_NUMLOCK 0x45 +#define DIK_SCROLL 0x46 /* Scroll Lock */ +#define DIK_NUMPAD7 0x47 +#define DIK_NUMPAD8 0x48 +#define DIK_NUMPAD9 0x49 +#define DIK_SUBTRACT 0x4A /* - on numeric keypad */ +#define DIK_NUMPAD4 0x4B +#define DIK_NUMPAD5 0x4C +#define DIK_NUMPAD6 0x4D +#define DIK_ADD 0x4E /* + on numeric keypad */ +#define DIK_NUMPAD1 0x4F +#define DIK_NUMPAD2 0x50 +#define DIK_NUMPAD3 0x51 +#define DIK_NUMPAD0 0x52 +#define DIK_DECIMAL 0x53 /* . on numeric keypad */ +#define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ +#define DIK_F11 0x57 +#define DIK_F12 0x58 + +#define DIK_F13 0x64 /* (NEC PC98) */ +#define DIK_F14 0x65 /* (NEC PC98) */ +#define DIK_F15 0x66 /* (NEC PC98) */ + +#define DIK_KANA 0x70 /* (Japanese keyboard) */ +#define DIK_ABNT_C1 0x73 /* / ? on Portugese (Brazilian) keyboards */ +#define DIK_CONVERT 0x79 /* (Japanese keyboard) */ +#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */ +#define DIK_YEN 0x7D /* (Japanese keyboard) */ +#define DIK_ABNT_C2 0x7E /* Numpad . on Portugese (Brazilian) keyboards */ +#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ +#define DIK_PREVTRACK 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ +#define DIK_AT 0x91 /* (NEC PC98) */ +#define DIK_COLON 0x92 /* (NEC PC98) */ +#define DIK_UNDERLINE 0x93 /* (NEC PC98) */ +#define DIK_KANJI 0x94 /* (Japanese keyboard) */ +#define DIK_STOP 0x95 /* (NEC PC98) */ +#define DIK_AX 0x96 /* (Japan AX) */ +#define DIK_UNLABELED 0x97 /* (J3100) */ +#define DIK_NEXTTRACK 0x99 /* Next Track */ +#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */ +#define DIK_RCONTROL 0x9D +#define DIK_MUTE 0xA0 /* Mute */ +#define DIK_CALCULATOR 0xA1 /* Calculator */ +#define DIK_PLAYPAUSE 0xA2 /* Play / Pause */ +#define DIK_MEDIASTOP 0xA4 /* Media Stop */ +#define DIK_VOLUMEDOWN 0xAE /* Volume - */ +#define DIK_VOLUMEUP 0xB0 /* Volume + */ +#define DIK_WEBHOME 0xB2 /* Web home */ +#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ +#define DIK_DIVIDE 0xB5 /* / on numeric keypad */ +#define DIK_SYSRQ 0xB7 +#define DIK_RMENU 0xB8 /* right Alt */ +#define DIK_PAUSE 0xC5 /* Pause */ +#define DIK_HOME 0xC7 /* Home on arrow keypad */ +#define DIK_UP 0xC8 /* UpArrow on arrow keypad */ +#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */ +#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */ +#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */ +#define DIK_END 0xCF /* End on arrow keypad */ +#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */ +#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */ +#define DIK_INSERT 0xD2 /* Insert on arrow keypad */ +#define DIK_DELETE 0xD3 /* Delete on arrow keypad */ +#define DIK_LWIN 0xDB /* Left Windows key */ +#define DIK_RWIN 0xDC /* Right Windows key */ +#define DIK_APPS 0xDD /* AppMenu key */ +#define DIK_POWER 0xDE /* System Power */ +#define DIK_SLEEP 0xDF /* System Sleep */ +#define DIK_WAKE 0xE3 /* System Wake */ +#define DIK_WEBSEARCH 0xE5 /* Web Search */ +#define DIK_WEBFAVORITES 0xE6 /* Web Favorites */ +#define DIK_WEBREFRESH 0xE7 /* Web Refresh */ +#define DIK_WEBSTOP 0xE8 /* Web Stop */ +#define DIK_WEBFORWARD 0xE9 /* Web Forward */ +#define DIK_WEBBACK 0xEA /* Web Back */ +#define DIK_MYCOMPUTER 0xEB /* My Computer */ +#define DIK_MAIL 0xEC /* Mail */ +#define DIK_MEDIASELECT 0xED /* Media Select */ + +/* + * Alternate names for keys, to facilitate transition from DOS. + */ +#define DIK_BACKSPACE DIK_BACK /* backspace */ +#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */ +#define DIK_LALT DIK_LMENU /* left Alt */ +#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */ +#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */ +#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */ +#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */ +#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */ +#define DIK_RALT DIK_RMENU /* right Alt */ +#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */ +#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */ +#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */ +#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */ +#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */ +#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */ + +/* + * Alternate names for keys originally not used on US keyboards. + */ +#define DIK_CIRCUMFLEX DIK_PREVTRACK /* Japanese keyboard */ + + +/* + * Combination keys + */ +#define INPUT_CTRL_OFFSET 512 +#define INPUT_SHIFT_OFFSET 1024 +#define INPUT_ALT_OFFSET 2048 + + +#endif /* DIK_ESCAPE */ + diff --git a/arma/client/include/x/cba/addons/main/script_macros_common.hpp b/arma/client/include/x/cba/addons/main/script_macros_common.hpp new file mode 100644 index 0000000..be13021 --- /dev/null +++ b/arma/client/include/x/cba/addons/main/script_macros_common.hpp @@ -0,0 +1,1833 @@ +/* + Header: script_macros_common.hpp + + Description: + A general set of useful macro functions for use by CBA itself or by any module that uses CBA. + + Authors: + Sickboy and Spooner +*/ + +/* **************************************************** + New - Should be exported to general addon + Aim: + - Simplify (shorten) the amount of characters required for repetitive tasks + - Provide a solid structure that can be dynamic and easy editable (Which sometimes means we cannot adhere to Aim #1 ;-) + An example is the path that is built from defines. Some available in this file, others in mods and addons. + + Follows Standard: + Object variables: PREFIX_COMPONENT + Main-object variables: PREFIX_main + Paths: MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SCRIPTNAME.sqf + e.g: x\six\addons\sys_menu\fDate.sqf + + Usage: + define PREFIX and COMPONENT, then include this file + (Note, you could have a main addon for your mod, define the PREFIX in a macros.hpp, + and include this script_macros_common.hpp file. + Then in your addons, add a component.hpp, define the COMPONENT, + and include your mod's script_macros.hpp + In your scripts you can then include the addon's component.hpp with relative path) + + TODO: + - Try only to use 1 string type " vs ' + - Evaluate double functions, and simplification + - Evaluate naming scheme; current = prototype + - Evaluate "Debug" features.. + - Evaluate "create mini function per precompiled script, that will load the script on first usage, rather than on init" + - Also saw "Namespace" typeName, evaluate which we need :P + - Single/Multi player gamelogics? (Incase of MP, you would want only 1 gamelogic per component, which is pv'ed from server, etc) + */ + +#ifndef MAINPREFIX + #define MAINPREFIX x +#endif + +#ifndef SUBPREFIX + #define SUBPREFIX addons +#endif + +#ifndef MAINLOGIC + #define MAINLOGIC main +#endif + +#define ADDON DOUBLES(PREFIX,COMPONENT) +#define MAIN_ADDON DOUBLES(PREFIX,main) + +/* ------------------------------------------- +Macro: VERSION_CONFIG + Define CBA Versioning System config entries. + + VERSION should be a floating-point number (1 separator). + VERSION_STR is a string representation of the version. + VERSION_AR is an array representation of the version. + + VERSION must always be defined, otherwise it is 0. + VERSION_STR and VERSION_AR default to VERSION if undefined. + +Parameters: + None + +Example: + (begin example) + #define VERSION 1.0 + #define VERSION_STR 1.0.1 + #define VERSION_AR 1,0,1 + + class CfgPatches { + class MyMod_main { + VERSION_CONFIG; + }; + }; + (end) + +Author: + ?, Jonpas +------------------------------------------- */ +#ifndef VERSION + #define VERSION 0 +#endif + +#ifndef VERSION_STR + #define VERSION_STR VERSION +#endif + +#ifndef VERSION_AR + #define VERSION_AR VERSION +#endif + +#ifndef VERSION_CONFIG + #define VERSION_CONFIG version = VERSION; versionStr = QUOTE(VERSION_STR); versionAr[] = {VERSION_AR} +#endif + +/* ------------------------------------------- +Group: Debugging +------------------------------------------- */ + +/* ------------------------------------------- +Macros: DEBUG_MODE_x + Managing debugging based on debug level. + + According to the *highest* level of debugging that has been defined *before* script_macros_common.hpp is included, + only the appropriate debugging commands will be functional. With no level explicitely defined, assume DEBUG_MODE_NORMAL. + + DEBUG_MODE_FULL - Full debugging output. + DEBUG_MODE_NORMAL - All debugging except and (Default setting if none specified). + DEBUG_MODE_MINIMAL - Only and enabled. + +Examples: + In order to turn on full debugging for a single file, + (begin example) + // Top of individual script file. + #define DEBUG_MODE_FULL + #include "script_component.hpp" + (end) + + In order to force minimal debugging for a single component, + (begin example) + // Top of addons\\script_component.hpp + // Ensure that any FULL and NORMAL setting from the individual files are undefined and MINIMAL is set. + #ifdef DEBUG_MODE_FULL + #undef DEBUG_MODE_FULL + #endif + #ifdef DEBUG_MODE_NORMAL + #undef DEBUG_MODE_NORMAL + #endif + #ifndef DEBUG_MODE_MINIMAL + #define DEBUG_MODE_MINIMAL + #endif + #include "script_macros.hpp" + (end) + + In order to turn on full debugging for a whole addon, + (begin example) + // Top of addons\main\script_macros.hpp + #ifndef DEBUG_MODE_FULL + #define DEBUG_MODE_FULL + #endif + #include "\x\cba\addons\main\script_macros_common.hpp" + (end) + +Author: + Spooner +------------------------------------------- */ + +// If DEBUG_MODE_FULL, then also enable DEBUG_MODE_NORMAL. +#ifdef DEBUG_MODE_FULL +#define DEBUG_MODE_NORMAL +#endif + +// If DEBUG_MODE_NORMAL, then also enable DEBUG_MODE_MINIMAL. +#ifdef DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +// If no debug modes specified, use DEBUG_MODE_NORMAL (+ DEBUG_MODE_MINIMAL). +#ifndef DEBUG_MODE_MINIMAL +#define DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +#define LOG_SYS_FORMAT(LEVEL,MESSAGE) format ['[%1] (%2) %3: %4', toUpper 'PREFIX', 'COMPONENT', LEVEL, MESSAGE] + +#ifdef DEBUG_SYNCHRONOUS +#define LOG_SYS(LEVEL,MESSAGE) diag_log text LOG_SYS_FORMAT(LEVEL,MESSAGE) +#else +#define LOG_SYS(LEVEL,MESSAGE) LOG_SYS_FORMAT(LEVEL,MESSAGE) call CBA_fnc_log +#endif + +#define LOG_SYS_FILELINENUMBERS(LEVEL,MESSAGE) LOG_SYS(LEVEL,format [ARR_4('%1 %2:%3',MESSAGE,__FILE__,__LINE__ + 1)]) + +/* ------------------------------------------- +Macro: LOG() + Log a debug message into the RPT log. + + Only run if is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + LOG("Initiated clog-dancing simulator."); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_FULL + +#define LOG(MESSAGE) LOG_SYS('LOG',MESSAGE) +#define LOG_1(MESSAGE,ARG1) LOG(FORMAT_1(MESSAGE,ARG1)) +#define LOG_2(MESSAGE,ARG1,ARG2) LOG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) LOG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) LOG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) LOG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) LOG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) LOG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) LOG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define LOG(MESSAGE) /* disabled */ +#define LOG_1(MESSAGE,ARG1) /* disabled */ +#define LOG_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: INFO() + Record a message without file and line number in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + INFO("Mod X is loaded, do Y"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define INFO(MESSAGE) LOG_SYS('INFO',MESSAGE) +#define INFO_1(MESSAGE,ARG1) INFO(FORMAT_1(MESSAGE,ARG1)) +#define INFO_2(MESSAGE,ARG1,ARG2) INFO(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define INFO_3(MESSAGE,ARG1,ARG2,ARG3) INFO(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define INFO_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) INFO(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define INFO_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) INFO(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define INFO_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) INFO(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define INFO_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) INFO(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define INFO_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) INFO(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: WARNING() + Record a non-critical error in the RPT log. + + Only run if or higher is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + WARNING("This function has been deprecated. Please don't use it in future!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_NORMAL + +#define WARNING(MESSAGE) LOG_SYS('WARNING',MESSAGE) +#define WARNING_1(MESSAGE,ARG1) WARNING(FORMAT_1(MESSAGE,ARG1)) +#define WARNING_2(MESSAGE,ARG1,ARG2) WARNING(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) WARNING(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) WARNING(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) WARNING(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) WARNING(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) WARNING(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) WARNING(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define WARNING(MESSAGE) /* disabled */ +#define WARNING_1(MESSAGE,ARG1) /* disabled */ +#define WARNING_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: ERROR() + Record a critical error in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR("value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR(MESSAGE) LOG_SYS('ERROR',MESSAGE) +#define ERROR_1(MESSAGE,ARG1) ERROR(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_2(MESSAGE,ARG1,ARG2) ERROR(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_3(MESSAGE,ARG1,ARG2,ARG3) ERROR(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_MSG() + Record a critical error in the RPT log and display on screen error message. + + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR_MSG("value of frog not found in config ...yada...yada..."); + (end) + +Author: + commy2 +------------------------------------------- */ +#define ERROR_MSG(MESSAGE) ['PREFIX', 'COMPONENT', nil, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_MSG_1(MESSAGE,ARG1) ERROR_MSG(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_MSG_2(MESSAGE,ARG1,ARG2) ERROR_MSG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_MSG_3(MESSAGE,ARG1,ARG2,ARG3) ERROR_MSG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_MSG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_MSG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_MSG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_MSG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_MSG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_MSG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_MSG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_MSG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_MSG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_MSG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_WITH_TITLE() + Record a critical error in the RPT log. + + The title can be specified (in the heading is always just "ERROR") + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + TITLE - Title of error message + MESSAGE - Body of error message + +Example: + (begin example) + ERROR_WITH_TITLE("Value not found","Value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR_WITH_TITLE(TITLE,MESSAGE) ['PREFIX', 'COMPONENT', TITLE, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_WITH_TITLE_1(TITLE,MESSAGE,ARG1) ERROR_WITH_TITLE(TITLE,FORMAT_1(MESSAGE,ARG1)) +#define ERROR_WITH_TITLE_2(TITLE,MESSAGE,ARG1,ARG2) ERROR_WITH_TITLE(TITLE,FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_WITH_TITLE_3(TITLE,MESSAGE,ARG1,ARG2,ARG3) ERROR_WITH_TITLE(TITLE,FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_WITH_TITLE_4(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_WITH_TITLE(TITLE,FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_WITH_TITLE_5(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_WITH_TITLE(TITLE,FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_WITH_TITLE_6(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_WITH_TITLE(TITLE,FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_WITH_TITLE_7(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_WITH_TITLE(TITLE,FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_WITH_TITLE_8(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_WITH_TITLE(TITLE,FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: MESSAGE_WITH_TITLE() + Record a single line in the RPT log. + +Parameters: + TITLE - Title of log message + MESSAGE - Body of message + +Example: + (begin example) + MESSAGE_WITH_TITLE("Value found","Value of frog found in config "); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define MESSAGE_WITH_TITLE(TITLE,MESSAGE) LOG_SYS_FILELINENUMBERS(TITLE,MESSAGE) + +/* ------------------------------------------- +Macro: RETDEF() + If a variable is undefined, return the default value. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + DEFAULT_VALUE - the default value to use if variable is undefined + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=5" + _var = 7; + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=7" + (end example) +Author: + 654wak654 +------------------------------------------- */ +#define RETDEF(VARIABLE,DEFAULT_VALUE) (if (isNil {VARIABLE}) then [{DEFAULT_VALUE}, {VARIABLE}]) + +/* ------------------------------------------- +Macro: RETNIL() + If a variable is undefined, return the value nil. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETNIL(_var)]; // "_var=any" + (end example) + +Author: + Alef (see CBA issue #8514) +------------------------------------------- */ +#define RETNIL(VARIABLE) RETDEF(VARIABLE,nil) + +/* ------------------------------------------- +Macros: TRACE_n() + Log a message and 1-8 variables to the RPT log. + + Only run if is defined. + + TRACE_1(MESSAGE,A) - Log 1 variable. + TRACE_2(MESSAGE,A,B) - Log 2 variables. + TRACE_3(MESSAGE,A,B,C) - Log 3 variables. + TRACE_4(MESSAGE,A,B,C,D) - Log 4 variables. + TRACE_5(MESSAGE,A,B,C,D,E) - Log 5 variables. + TRACE_6(MESSAGE,A,B,C,D,E,F) - Log 6 variables. + TRACE_7(MESSAGE,A,B,C,D,E,F,G) - Log 7 variables. + TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) - Log 8 variables. + TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) - Log 9 variables. + +Parameters: + MESSAGE - Message to add to the trace [String] + A..H - Variable names to log values of [Any] + +Example: + (begin example) + TRACE_3("After takeoff",_vehicle player,getPos (_vehicle player), getPosASL (_vehicle player)); + (end) + +Author: + Spooner +------------------------------------------- */ +#define PFORMAT_1(MESSAGE,A) \ + format ['%1: A=%2', MESSAGE, RETNIL(A)] + +#define PFORMAT_2(MESSAGE,A,B) \ + format ['%1: A=%2, B=%3', MESSAGE, RETNIL(A), RETNIL(B)] + +#define PFORMAT_3(MESSAGE,A,B,C) \ + format ['%1: A=%2, B=%3, C=%4', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C)] + +#define PFORMAT_4(MESSAGE,A,B,C,D) \ + format ['%1: A=%2, B=%3, C=%4, D=%5', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D)] + +#define PFORMAT_5(MESSAGE,A,B,C,D,E) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E)] + +#define PFORMAT_6(MESSAGE,A,B,C,D,E,F) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F)] + +#define PFORMAT_7(MESSAGE,A,B,C,D,E,F,G) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G)] + +#define PFORMAT_8(MESSAGE,A,B,C,D,E,F,G,H) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H)] + +#define PFORMAT_9(MESSAGE,A,B,C,D,E,F,G,H,I) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9, I=%10', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H), RETNIL(I)] + + +#ifdef DEBUG_MODE_FULL +#define TRACE_1(MESSAGE,A) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_1(str diag_frameNo + ' ' + (MESSAGE),A)) +#define TRACE_2(MESSAGE,A,B) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_2(str diag_frameNo + ' ' + (MESSAGE),A,B)) +#define TRACE_3(MESSAGE,A,B,C) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_3(str diag_frameNo + ' ' + (MESSAGE),A,B,C)) +#define TRACE_4(MESSAGE,A,B,C,D) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_4(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D)) +#define TRACE_5(MESSAGE,A,B,C,D,E) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_5(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E)) +#define TRACE_6(MESSAGE,A,B,C,D,E,F) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_6(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F)) +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_7(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G)) +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_8(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H)) +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_9(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H,I)) +#else +#define TRACE_1(MESSAGE,A) /* disabled */ +#define TRACE_2(MESSAGE,A,B) /* disabled */ +#define TRACE_3(MESSAGE,A,B,C) /* disabled */ +#define TRACE_4(MESSAGE,A,B,C,D) /* disabled */ +#define TRACE_5(MESSAGE,A,B,C,D,E) /* disabled */ +#define TRACE_6(MESSAGE,A,B,C,D,E,F) /* disabled */ +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) /* disabled */ +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) /* disabled */ +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) /* disabled */ +#endif + +/* ------------------------------------------- +Group: General +------------------------------------------- */ + +// ************************************* +// Internal Functions +#define DOUBLES(var1,var2) var1##_##var2 +#define TRIPLES(var1,var2,var3) var1##_##var2##_##var3 +#define QUOTE(var1) #var1 + +#ifdef MODULAR + #define COMPONENT_T DOUBLES(t,COMPONENT) + #define COMPONENT_M DOUBLES(m,COMPONENT) + #define COMPONENT_S DOUBLES(s,COMPONENT) + #define COMPONENT_C DOUBLES(c,COMPONENT) + #define COMPONENT_F COMPONENT_C +#else + #define COMPONENT_T COMPONENT + #define COMPONENT_M COMPONENT + #define COMPONENT_S COMPONENT + #define COMPONENT_F COMPONENT + #define COMPONENT_C COMPONENT +#endif + +/* ------------------------------------------- +Macro: INC() + +Description: + Increase a number by one. + +Parameters: + VAR - Variable to increment [Number] + +Example: + (begin example) + _counter = 0; + INC(_counter); + // _counter => 1 + (end) + +Author: + Spooner +------------------------------------------- */ +#define INC(var) var = (var) + 1 + +/* ------------------------------------------- +Macro: DEC() + +Description: + Decrease a number by one. + +Parameters: + VAR - Variable to decrement [Number] + +Example: + (begin example) + _counter = 99; + DEC(_counter); + // _counter => 98 + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEC(var) var = (var) - 1 + +/* ------------------------------------------- +Macro: ADD() + +Description: + Add a value to a variable. Variable and value should be both Numbers or both Strings. + +Parameters: + VAR - Variable to add to [Number or String] + VALUE - Value to add [Number or String] + +Examples: + (begin example) + _counter = 2; + ADD(_counter,3); + // _counter => 5 + (end) + (begin example) + _str = "hello"; + ADD(_str," "); + ADD(_str,"Fred"); + // _str => "hello Fred" + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ADD(var1,var2) var1 = (var1) + (var2) + +/* ------------------------------------------- +Macro: SUB() + +Description: + Subtract a value from a number variable. VAR and VALUE should both be Numbers. + +Parameters: + VAR - Variable to subtract from [Number] + VALUE - Value to subtract [Number] + +Examples: + (begin example) + _numChickens = 2; + SUB(_numChickens,3); + // _numChickens => -1 + (end) +------------------------------------------- */ +#define SUB(var1,var2) var1 = (var1) - (var2) + +/* ------------------------------------------- +Macro: REM() + +Description: + Remove an element from an array each time it occurs. + + This recreates the entire array, so use BIS_fnc_removeIndex if modification of the original array is required + or if only one of the elements that matches ELEMENT needs to be removed. + +Parameters: + ARRAY - Array to modify [Array] + ELEMENT - Element to remove [Any] + +Examples: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + REM(_array,3); + // _array = [1, 2, 4, 8]; + (end) + +Author: + Spooner +------------------------------------------- */ +#define REM(var1,var2) SUB(var1,[var2]) + +/* ------------------------------------------- +Macro: PUSH() + +Description: + Appends a single value onto the end of an ARRAY. Change is made to the ARRAY itself, not creating a new array. + +Parameters: + ARRAY - Array to push element onto [Array] + ELEMENT - Element to push [Any] + +Examples: + (begin example) + _fish = ["blue", "green", "smelly"]; + PUSH(_fish,"monkey-flavoured"); + // _fish => ["blue", "green", "smelly", "monkey-flavoured"] + (end) + +Author: + Spooner +------------------------------------------- */ +#define PUSH(var1,var2) (var1) pushBack (var2) + +/* ------------------------------------------- +Macro: MAP() +Description: + Applies given code to each element of the array, then assigns the + resulting array to the original +Parameters: + ARRAY - Array to be modified + CODE - Code that'll be applied to each element of the array. +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + MAP(_array,_x + 1); + // _array is now [2, 3, 4, 5, 4, 9]; + (end) +Author: + 654wak654 +------------------------------------------- */ +#define MAP(ARR,CODE) ARR = ARR apply {CODE} + +/* ------------------------------------------- +Macro: FILTER() +Description: + Filters an array based on given code, then assigns the resulting array + to the original +Parameters: + ARRAY - Array to be filtered + CODE - Condition to pick elements +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + FILTER(_array,_x % 2 == 0) + // _array is now [2, 4, 8]; + (end) +Author: + Commy2 +------------------------------------------- */ +#define FILTER(ARR,CODE) ARR = ARR select {CODE} + +/* ------------------------------------------- +Macro: UNIQUE() +Description: + Removes duplicate values in given array +Parameters: + ARRAY - The array to be modified +Example: + (begin example) + _someArray = [4, 4, 5, 5, 5, 2]; + UNIQUE(_someArray); + // _someArray is now [4, 5, 2] + (end) +Author: + Commy2 +------------------------------------------- */ +#define UNIQUE(ARR) ARR = ARR arrayIntersect ARR + +/* ------------------------------------------- +Macro: INTERSECTION() +Description: + Finds unique common elements between two arrays and assigns them + to the first array +Parameters: + ARRAY0 - The array to be modified + ARRAY1 - The array to find intersections with +Example: + (begin example) + _someArray = [1, 2, 3, 4, 5, 5]; + _anotherArray = [4, 5, 6, 7]; + INTERSECTION(_someArray,_anotherArray); + // _someArray is now [4, 5] + (end) +Author: + 654wak654 +------------------------------------------- */ +#define INTERSECTION(ARG0,ARG1) ARG0 = ARG0 arrayIntersect (ARG1) + +/* ------------------------------------------- +Macro: ISNILS() + +Description: + Sets a variable with a value, but only if it is undefined. + +Parameters: + VARIABLE - Variable to set [Any, not nil] + DEFAULT_VALUE - Value to set VARIABLE to if it is undefined [Any, not nil] + +Examples: + (begin example) + // _fish is undefined + ISNILS(_fish,0); + // _fish => 0 + (end) + (begin example) + _fish = 12; + // ...later... + ISNILS(_fish,0); + // _fish => 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ISNILS(VARIABLE,DEFAULT_VALUE) if (isNil #VARIABLE) then { VARIABLE = DEFAULT_VALUE } +#define ISNILS2(var1,var2,var3,var4) ISNILS(TRIPLES(var1,var2,var3),var4) +#define ISNILS3(var1,var2,var3) ISNILS(DOUBLES(var1,var2),var3) +#define ISNIL(var1,var2) ISNILS2(PREFIX,COMPONENT,var1,var2) +#define ISNILMAIN(var1,var2) ISNILS3(PREFIX,var1,var2) + +#define CREATELOGICS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"] +#define CREATELOGICLOCALS(var1,var2) var1##_##var2 = "LOGIC" createVehicleLocal [0, 0, 0] +#define CREATELOGICGLOBALS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"]; publicVariable QUOTE(DOUBLES(var1,var2)) +#define CREATELOGICGLOBALTESTS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit [QUOTE(DOUBLES(ADDON,logic)), [0, 0, 0], [], 0, "NONE"] + +#define GETVARS(var1,var2,var3) (var1##_##var2 getVariable #var3) +#define GETVARMAINS(var1,var2) GETVARS(var1,MAINLOGIC,var2) + +#ifndef PATHTO_SYS + #define PATHTO_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3.sqf +#endif +#ifndef PATHTOF_SYS + #define PATHTOF_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#ifndef PATHTOF2_SYS + #define PATHTOF2_SYS(var1,var2,var3) MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#define PATHTO_R(var1) PATHTOF2_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_T(var1) PATHTOF_SYS(PREFIX,COMPONENT_T,var1) +#define PATHTO_M(var1) PATHTOF_SYS(PREFIX,COMPONENT_M,var1) +#define PATHTO_S(var1) PATHTOF_SYS(PREFIX,COMPONENT_S,var1) +#define PATHTO_C(var1) PATHTOF_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_F(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) + +// Already quoted "" +#define QPATHTO_R(var1) QUOTE(PATHTO_R(var1)) +#define QPATHTO_T(var1) QUOTE(PATHTO_T(var1)) +#define QPATHTO_M(var1) QUOTE(PATHTO_M(var1)) +#define QPATHTO_S(var1) QUOTE(PATHTO_S(var1)) +#define QPATHTO_C(var1) QUOTE(PATHTO_C(var1)) +#define QPATHTO_F(var1) QUOTE(PATHTO_F(var1)) + +// This only works for binarized configs after recompiling the pbos +// TODO: Reduce amount of calls / code.. +#define COMPILE_FILE2_CFG_SYS(var1) compile preprocessFileLineNumbers var1 +#define COMPILE_FILE2_SYS(var1) COMPILE_FILE2_CFG_SYS(var1) + +#define COMPILE_FILE_SYS(var1,var2,var3) COMPILE_FILE2_SYS('PATHTO_SYS(var1,var2,var3)') +#define COMPILE_FILE_CFG_SYS(var1,var2,var3) COMPILE_FILE2_CFG_SYS('PATHTO_SYS(var1,var2,var3)') + +#define SETVARS(var1,var2) var1##_##var2 setVariable +#define SETVARMAINS(var1) SETVARS(var1,MAINLOGIC) +#define GVARMAINS(var1,var2) var1##_##var2 +#define CFGSETTINGSS(var1,var2) configFile >> "CfgSettings" >> #var1 >> #var2 +//#define SETGVARS(var1,var2,var3) var1##_##var2##_##var3 = +//#define SETGVARMAINS(var1,var2) var1##_##var2 = + +// Compile-Once, JIT: On first use. +// #define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = { var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_fnc_##var3 } else { _this call var1##_fnc_##var3 } } +// #define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = { var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_##var2##_fnc_##var3 } else { _this call var1##_##var2##_fnc_##var3 } } +// #define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = { var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)); if (isNil "_this") then { call var1##_##var2##_fnc_##var4 } else { _this call var1##_##var2##_fnc_##var4 } } + +// Compile-Once, at Macro. As opposed to Compile-Once, on first use. +#define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)) + +#define LSTR(var1) TRIPLES(ADDON,STR,var1) + +#ifndef DEBUG_SETTINGS + #define DEBUG_SETTINGS [false, true, false] +#endif + +#define MSG_INIT QUOTE(Initializing: ADDON version: VERSION) + +// ************************************* +// User Functions +#define CFGSETTINGS CFGSETTINGSS(PREFIX,COMPONENT) +#define PATHTO(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) +#define PATHTOF(var1) PATHTOF_SYS(PREFIX,COMPONENT,var1) +#define PATHTOEF(var1,var2) PATHTOF_SYS(PREFIX,var1,var2) +#define QPATHTOF(var1) QUOTE(PATHTOF(var1)) +#define QPATHTOEF(var1,var2) QUOTE(PATHTOEF(var1,var2)) + +#define COMPILE_FILE(var1) COMPILE_FILE_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE_CFG(var1) COMPILE_FILE_CFG_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE2(var1) COMPILE_FILE2_SYS('var1') +#define COMPILE_FILE2_CFG(var1) COMPILE_FILE2_CFG_SYS('var1') + +#define COMPILE_SCRIPT(var1) compileScript ['PATHTO_SYS(PREFIX,COMPONENT_F,var1)'] + + +#define VERSIONING_SYS(var1) class CfgSettings \ +{ \ + class CBA \ + { \ + class Versioning \ + { \ + class var1 \ + { \ + }; \ + }; \ + }; \ +}; + +#define VERSIONING VERSIONING_SYS(PREFIX) + +/* ------------------------------------------- +Macro: GVAR() + Get full variable identifier for a global variable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + (begin example) + GVAR(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_FrogDancing_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVAR(var1) DOUBLES(ADDON,var1) +#define EGVAR(var1,var2) TRIPLES(PREFIX,var1,var2) +#define QGVAR(var1) QUOTE(GVAR(var1)) +#define QEGVAR(var1,var2) QUOTE(EGVAR(var1,var2)) +#define QQGVAR(var1) QUOTE(QGVAR(var1)) +#define QQEGVAR(var1,var2) QUOTE(QEGVAR(var1,var2)) + +/* ------------------------------------------- +Macro: GVARMAIN() + Get full variable identifier for a global variable owned by this addon. + +Parameters: + VARIABLE - Partial name of global variable owned by this addon [Any]. + +Example: + (begin example) + GVARMAIN(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVARMAIN(var1) GVARMAINS(PREFIX,var1) +#define QGVARMAIN(var1) QUOTE(GVARMAIN(var1)) +#define QQGVARMAIN(var1) QUOTE(QGVARMAIN(var1)) +// TODO: What's this? +#define SETTINGS DOUBLES(PREFIX,settings) +#define CREATELOGIC CREATELOGICS(PREFIX,COMPONENT) +#define CREATELOGICGLOBAL CREATELOGICGLOBALS(PREFIX,COMPONENT) +#define CREATELOGICGLOBALTEST CREATELOGICGLOBALTESTS(PREFIX,COMPONENT) +#define CREATELOGICLOCAL CREATELOGICLOCALS(PREFIX,COMPONENT) +#define CREATELOGICMAIN CREATELOGICS(PREFIX,MAINLOGIC) +#define GETVAR(var1) GETVARS(PREFIX,COMPONENT,var1) +#define SETVAR SETVARS(PREFIX,COMPONENT) +#define SETVARMAIN SETVARMAINS(PREFIX) +#define IFCOUNT(var1,var2,var3) if (count var1 > var2) then { var3 = var1 select var2 }; + +/* ------------------------------------------- +Macro: PREP() + +Description: + Defines a function. + + Full file path: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + + Resulting function name: + 'PREFIX_COMPONENT_' + + The PREP macro should be placed in a script run by a XEH preStart and XEH preInit event. + + The PREP macro allows for CBA function caching, which drastically speeds up load times. + Beware though that function caching is enabled by default and as such to disable it, you need to + #define DISABLE_COMPILE_CACHE above your #include "script_components.hpp" include! + + The function will be defined in ui and mission namespace. It can not be overwritten without + a mission restart. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + PREP(banana); + call FUNC(banana); + (end) + +Author: + dixon13 + ------------------------------------------- */ +//#define PREP(var1) PREP_SYS(PREFIX,COMPONENT_F,var1) + +#ifdef DISABLE_COMPILE_CACHE + #define PREP(var1) TRIPLES(ADDON,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' + #define PREPMAIN(var1) TRIPLES(PREFIX,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' +#else + #define PREP(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(ADDON,fnc,var1)'] call SLX_XEH_COMPILE_NEW + #define PREPMAIN(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(PREFIX,fnc,var1)'] call SLX_XEH_COMPILE_NEW +#endif + +/* ------------------------------------------- +Macro: PATHTO_FNC() + +Description: + Defines a function inside CfgFunctions. + + Full file path in addons: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + Define 'RECOMPILE' to enable recompiling. + Define 'SKIP_FUNCTION_HEADER' to skip adding function header. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + // file name: fnc_addPerFrameHandler.sqf + class CfgFunctions { + class CBA { + class Misc { + PATHTO_FNC(addPerFrameHandler); + }; + }; + }; + // -> CBA_fnc_addPerFrameHandler + (end) + +Author: + dixon13, commy2 + ------------------------------------------- */ +#ifdef RECOMPILE + #undef RECOMPILE + #define RECOMPILE recompile = 1 +#else + #define RECOMPILE recompile = 0 +#endif +// Set function header type: -1 - no header; 0 - default header; 1 - system header. +#ifdef SKIP_FUNCTION_HEADER + #define CFGFUNCTION_HEADER headerType = -1 +#else + #define CFGFUNCTION_HEADER headerType = 0 +#endif + +#define PATHTO_FNC(func) class func {\ + file = QPATHTOF(DOUBLES(fnc,func).sqf);\ + CFGFUNCTION_HEADER;\ + RECOMPILE;\ +} + +#define FUNC(var1) TRIPLES(ADDON,fnc,var1) +#define FUNCMAIN(var1) TRIPLES(PREFIX,fnc,var1) +#define FUNC_INNER(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),fnc,var2) +#define EFUNC(var1,var2) FUNC_INNER(var1,var2) +#define QFUNC(var1) QUOTE(FUNC(var1)) +#define QFUNCMAIN(var1) QUOTE(FUNCMAIN(var1)) +#define QFUNC_INNER(var1,var2) QUOTE(FUNC_INNER(var1,var2)) +#define QEFUNC(var1,var2) QUOTE(EFUNC(var1,var2)) +#define QQFUNC(var1) QUOTE(QFUNC(var1)) +#define QQFUNCMAIN(var1) QUOTE(QFUNCMAIN(var1)) +#define QQFUNC_INNER(var1,var2) QUOTE(QFUNC_INNER(var1,var2)) +#define QQEFUNC(var1,var2) QUOTE(QEFUNC(var1,var2)) + +#ifndef PRELOAD_ADDONS + #define PRELOAD_ADDONS class CfgAddons \ +{ \ + class PreloadAddons \ + { \ + class ADDON \ + { \ + list[]={ QUOTE(ADDON) }; \ + }; \ + }; \ +} +#endif + +/* ------------------------------------------- +Macros: ARG_#() + Select from list of array arguments + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Rommel +------------------------------------------- */ +#define ARG_1(A,B) ((A) select (B)) +#define ARG_2(A,B,C) (ARG_1(ARG_1(A,B),C)) +#define ARG_3(A,B,C,D) (ARG_1(ARG_2(A,B,C),D)) +#define ARG_4(A,B,C,D,E) (ARG_1(ARG_3(A,B,C,D),E)) +#define ARG_5(A,B,C,D,E,F) (ARG_1(ARG_4(A,B,C,D,E),F)) +#define ARG_6(A,B,C,D,E,F,G) (ARG_1(ARG_5(A,B,C,D,E,F),G)) +#define ARG_7(A,B,C,D,E,F,G,H) (ARG_1(ARG_6(A,B,C,D,E,E,F,G),H)) +#define ARG_8(A,B,C,D,E,F,G,H,I) (ARG_1(ARG_7(A,B,C,D,E,E,F,G,H),I)) + +/* ------------------------------------------- +Macros: ARR_#() + Create list from arguments. Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Nou +------------------------------------------- */ +#define ARR_1(ARG1) ARG1 +#define ARR_2(ARG1,ARG2) ARG1, ARG2 +#define ARR_3(ARG1,ARG2,ARG3) ARG1, ARG2, ARG3 +#define ARR_4(ARG1,ARG2,ARG3,ARG4) ARG1, ARG2, ARG3, ARG4 +#define ARR_5(ARG1,ARG2,ARG3,ARG4,ARG5) ARG1, ARG2, ARG3, ARG4, ARG5 +#define ARR_6(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 +#define ARR_7(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7 +#define ARR_8(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8 + +/* ------------------------------------------- +Macros: FORMAT_#(STR, ARG1) + Format - Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + STRING - string used by format + VARIABLE(1-8) - elements for usage in format + +Author: + Nou & Sickboy +------------------------------------------- */ +#define FORMAT_1(STR,ARG1) format[STR, ARG1] +#define FORMAT_2(STR,ARG1,ARG2) format[STR, ARG1, ARG2] +#define FORMAT_3(STR,ARG1,ARG2,ARG3) format[STR, ARG1, ARG2, ARG3] +#define FORMAT_4(STR,ARG1,ARG2,ARG3,ARG4) format[STR, ARG1, ARG2, ARG3, ARG4] +#define FORMAT_5(STR,ARG1,ARG2,ARG3,ARG4,ARG5) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5] +#define FORMAT_6(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6] +#define FORMAT_7(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7] +#define FORMAT_8(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8] + +// CONTROL(46) 12 +#define DISPLAY(A) (findDisplay A) +#define CONTROL(A) DISPLAY(A) displayCtrl + +/* ------------------------------------------- +Macros: IS_x() + Checking the data types of variables. + + IS_ARRAY() - Array + IS_BOOL() - Boolean + IS_BOOLEAN() - UI display handle(synonym for ) + IS_CODE() - Code block (i.e a compiled function) + IS_CONFIG() - Configuration + IS_CONTROL() - UI control handle. + IS_DISPLAY() - UI display handle. + IS_FUNCTION() - A compiled function (synonym for ) + IS_GROUP() - Group. + IS_INTEGER() - Is a number a whole number? + IS_LOCATION() - World location. + IS_NUMBER() - A floating point number (synonym for ) + IS_OBJECT() - World object. + IS_SCALAR() - Floating point number. + IS_SCRIPT() - A script handle (as returned by execVM and spawn commands). + IS_SIDE() - Game side. + IS_STRING() - World object. + IS_TEXT() - Structured text. + +Parameters: + VARIABLE - Variable to check if it is of a particular type [Any, not nil] + +Author: + Spooner +------------------------------------------- */ +#define IS_META_SYS(VAR,TYPE) (if (isNil {VAR}) then {false} else {(VAR) isEqualType TYPE}) +#define IS_ARRAY(VAR) IS_META_SYS(VAR,[]) +#define IS_BOOL(VAR) IS_META_SYS(VAR,false) +#define IS_CODE(VAR) IS_META_SYS(VAR,{}) +#define IS_CONFIG(VAR) IS_META_SYS(VAR,configNull) +#define IS_CONTROL(VAR) IS_META_SYS(VAR,controlNull) +#define IS_DISPLAY(VAR) IS_META_SYS(VAR,displayNull) +#define IS_GROUP(VAR) IS_META_SYS(VAR,grpNull) +#define IS_OBJECT(VAR) IS_META_SYS(VAR,objNull) +#define IS_SCALAR(VAR) IS_META_SYS(VAR,0) +#define IS_SCRIPT(VAR) IS_META_SYS(VAR,scriptNull) +#define IS_SIDE(VAR) IS_META_SYS(VAR,west) +#define IS_STRING(VAR) IS_META_SYS(VAR,"STRING") +#define IS_TEXT(VAR) IS_META_SYS(VAR,text "") +#define IS_LOCATION(VAR) IS_META_SYS(VAR,locationNull) + +#define IS_BOOLEAN(VAR) IS_BOOL(VAR) +#define IS_FUNCTION(VAR) IS_CODE(VAR) +#define IS_INTEGER(VAR) (if (IS_SCALAR(VAR)) then {floor (VAR) == (VAR)} else {false}) +#define IS_NUMBER(VAR) IS_SCALAR(VAR) + +#define FLOAT_TO_STRING(num) (if (_this == 0) then {"0"} else {str parseNumber (str (_this % _this) + str floor abs _this) + "." + (str (abs _this - floor abs _this) select [2]) + "0"}) + +/* ------------------------------------------- +Macro: SCRIPT() + Sets name of script (relies on PREFIX and COMPONENT values being #defined). + Define 'SKIP_SCRIPT_NAME' to skip adding scriptName. + +Parameters: + NAME - Name of script [Indentifier] + +Example: + (begin example) + SCRIPT(eradicateMuppets); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifndef SKIP_SCRIPT_NAME + #define SCRIPT(NAME) scriptName 'PREFIX\COMPONENT\NAME' +#else + #define SCRIPT(NAME) /* nope */ +#endif + +/* ------------------------------------------- +Macros: EXPLODE_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Splitting an ARRAY into a number of variables (A, B, C, etc). + + Note that this NOT does make the created variables private. + _PVT variants do. + + EXPLODE_1(ARRAY,A,B) - Split a 1-element array into separate variable. + EXPLODE_2(ARRAY,A,B) - Split a 2-element array into separate variables. + EXPLODE_3(ARRAY,A,B,C) - Split a 3-element array into separate variables. + EXPLODE_4(ARRAY,A,B,C,D) - Split a 4-element array into separate variables. + EXPLODE_5(ARRAY,A,B,C,D,E) - Split a 5-element array into separate variables. + EXPLODE_6(ARRAY,A,B,C,D,E,F) - Split a 6-element array into separate variables. + EXPLODE_7(ARRAY,A,B,C,D,E,F,G) - Split a 7-element array into separate variables. + EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) - Split a 8-element array into separate variables. + EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) - Split a 9-element array into separate variables. + +Parameters: + ARRAY - Array to read from [Array] + A..H - Names of variables to set from array [Identifier] + +Example: + (begin example) + _array = ["fred", 156.8, 120.9]; + EXPLODE_3(_array,_name,_height,_weight); + (end) + +Author: + Spooner +------------------------------------------- */ +#define EXPLODE_1_SYS(ARRAY,A) A = ARRAY param [0] +#define EXPLODE_1(ARRAY,A) EXPLODE_1_SYS(ARRAY,A); TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) +#define EXPLODE_1_PVT(ARRAY,A) ARRAY params [#A]; TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) + +#define EXPLODE_2_SYS(ARRAY,A,B) EXPLODE_1_SYS(ARRAY,A); B = ARRAY param [1] +#define EXPLODE_2(ARRAY,A,B) EXPLODE_2_SYS(ARRAY,A,B); TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) +#define EXPLODE_2_PVT(ARRAY,A,B) ARRAY params [#A,#B]; TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) + +#define EXPLODE_3_SYS(ARRAY,A,B,C) EXPLODE_2_SYS(ARRAY,A,B); C = ARRAY param [2] +#define EXPLODE_3(ARRAY,A,B,C) EXPLODE_3_SYS(ARRAY,A,B,C); TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) +#define EXPLODE_3_PVT(ARRAY,A,B,C) ARRAY params [#A,#B,#C]; TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) + +#define EXPLODE_4_SYS(ARRAY,A,B,C,D) EXPLODE_3_SYS(ARRAY,A,B,C); D = ARRAY param [3] +#define EXPLODE_4(ARRAY,A,B,C,D) EXPLODE_4_SYS(ARRAY,A,B,C,D); TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) +#define EXPLODE_4_PVT(ARRAY,A,B,C,D) ARRAY params [#A,#B,#C,#D]; TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) + +#define EXPLODE_5_SYS(ARRAY,A,B,C,D,E) EXPLODE_4_SYS(ARRAY,A,B,C,D); E = ARRAY param [4] +#define EXPLODE_5(ARRAY,A,B,C,D,E) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) +#define EXPLODE_5_PVT(ARRAY,A,B,C,D,E) ARRAY params [#A,#B,#C,#D,#E]; TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) + +#define EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); F = ARRAY param [5] +#define EXPLODE_6(ARRAY,A,B,C,D,E,F) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) +#define EXPLODE_6_PVT(ARRAY,A,B,C,D,E,F) ARRAY params [#A,#B,#C,#D,#E,#F]; TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) + +#define EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); G = ARRAY param [6] +#define EXPLODE_7(ARRAY,A,B,C,D,E,F,G) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) +#define EXPLODE_7_PVT(ARRAY,A,B,C,D,E,F,G) ARRAY params [#A,#B,#C,#D,#E,#F,#G]; TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) + +#define EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); H = ARRAY param [7] +#define EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) +#define EXPLODE_8_PVT(ARRAY,A,B,C,D,E,F,G,H) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H]; TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) + +#define EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); I = ARRAY param [8] +#define EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I); TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) +#define EXPLODE_9_PVT(ARRAY,A,B,C,D,E,F,G,H,I) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H,#I]; TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: xSTRING() + Get full string identifier from a stringtable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + ADDON is CBA_Balls. + (begin example) + // Localized String (localize command must still be used with it) + LSTRING(Example); // STR_CBA_Balls_Example; + // Config String (note the $) + CSTRING(Example); // $STR_CBA_Balls_Example; + (end) + +Author: + Jonpas +------------------------------------------- */ +#ifndef STRING_MACROS_GUARD +#define STRING_MACROS_GUARD + #define LSTRING(var1) QUOTE(TRIPLES(STR,ADDON,var1)) + #define ELSTRING(var1,var2) QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) + #define CSTRING(var1) QUOTE(TRIPLES($STR,ADDON,var1)) + #define ECSTRING(var1,var2) QUOTE(TRIPLES($STR,DOUBLES(PREFIX,var1),var2)) + + #define LLSTRING(var1) localize QUOTE(TRIPLES(STR,ADDON,var1)) + #define LELSTRING(var1,var2) localize QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) +#endif + + +/* ------------------------------------------- +Group: Managing Function Parameters +------------------------------------------- */ + +/* ------------------------------------------- +Macros: PARAMS_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Setting variables based on parameters passed to a function. + + Each parameter is defines as private and set to the appropriate value from _this. + + PARAMS_1(A) - Get 1 parameter from the _this array (or _this if it's not an array). + PARAMS_2(A,B) - Get 2 parameters from the _this array. + PARAMS_3(A,B,C) - Get 3 parameters from the _this array. + PARAMS_4(A,B,C,D) - Get 4 parameters from the _this array. + PARAMS_5(A,B,C,D,E) - Get 5 parameters from the _this array. + PARAMS_6(A,B,C,D,E,F) - Get 6 parameters from the _this array. + PARAMS_7(A,B,C,D,E,F,G) - Get 7 parameters from the _this array. + PARAMS_8(A,B,C,D,E,F,G,H) - Get 8 parameters from the _this array. + +Parameters: + A..H - Name of variable to read from _this [Identifier] + +Example: + A function called like this: + (begin example) + [_name,_address,_telephone] call recordPersonalDetails; + (end) + expects 3 parameters and those variables could be initialised at the start of the function definition with: + (begin example) + recordPersonalDetails = { + PARAMS_3(_name,_address,_telephone); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define PARAMS_1(A) EXPLODE_1_PVT(_this,A) +#define PARAMS_2(A,B) EXPLODE_2_PVT(_this,A,B) +#define PARAMS_3(A,B,C) EXPLODE_3_PVT(_this,A,B,C) +#define PARAMS_4(A,B,C,D) EXPLODE_4_PVT(_this,A,B,C,D) +#define PARAMS_5(A,B,C,D,E) EXPLODE_5_PVT(_this,A,B,C,D,E) +#define PARAMS_6(A,B,C,D,E,F) EXPLODE_6_PVT(_this,A,B,C,D,E,F) +#define PARAMS_7(A,B,C,D,E,F,G) EXPLODE_7_PVT(_this,A,B,C,D,E,F,G) +#define PARAMS_8(A,B,C,D,E,F,G,H) EXPLODE_8_PVT(_this,A,B,C,D,E,F,G,H) +#define PARAMS_9(A,B,C,D,E,F,G,H,I) EXPLODE_9_PVT(_this,A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: DEFAULT_PARAM() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Getting a default function parameter. This may be used together with to have a mix of required and + optional parameters. + +Parameters: + INDEX - Index of parameter in _this [Integer, 0+] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case the array is too short or the value at INDEX is nil [Any] + +Example: + A function called with optional parameters: + (begin example) + [_name] call myFunction; + [_name, _numberOfLegs] call myFunction; + [_name, _numberOfLegs, _hasAHead] call myFunction; + (end) + 1 required parameter and 2 optional parameters. Those variables could be initialised at the start of the function + definition with: + (begin example) + myFunction = { + PARAMS_1(_name); + DEFAULT_PARAM(1,_numberOfLegs,2); + DEFAULT_PARAM(2,_hasAHead,true); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEFAULT_PARAM(INDEX,NAME,DEF_VALUE) \ + private [#NAME,"_this"]; \ + ISNILS(_this,[]); \ + NAME = _this param [INDEX, DEF_VALUE]; \ + TRACE_3("DEFAULT_PARAM",INDEX,NAME,DEF_VALUE) + +/* ------------------------------------------- +Macro: KEY_PARAM() + Get value from key in _this list, return default when key is not included in list. + +Parameters: + KEY - Key name [String] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case key not found [ANY] + +Example: + + +Author: + Muzzleflash +------------------------------------------- */ +#define KEY_PARAM(KEY,NAME,DEF_VALUE) \ + private #NAME; \ + NAME = [toLower KEY, toUpper KEY, DEF_VALUE, RETNIL(_this)] call CBA_fnc_getArg; \ + TRACE_3("KEY_PARAM",KEY,NAME,DEF_VALUE) + +/* ------------------------------------------- +Group: Assertions +------------------------------------------- */ + +#define ASSERTION_ERROR(MESSAGE) ERROR_WITH_TITLE("Assertion failed!",MESSAGE) + +/* ------------------------------------------- +Macro: ASSERT_TRUE() + Asserts that a CONDITION is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + ASSERT_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_TRUE(CONDITION,MESSAGE) \ + if (not (CONDITION)) then \ + { \ + ASSERTION_ERROR('Assertion (CONDITION) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_FALSE() + Asserts that a CONDITION is false. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + ASSERT_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_FALSE(CONDITION,MESSAGE) \ + if (CONDITION) then \ + { \ + ASSERTION_ERROR('Assertion (not (CONDITION)) failed!\n\n' + (MESSAGE)) \ + } + +/* ------------------------------------------- +Macro: ASSERT_OP() + Asserts that (A OPERATOR B) is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + ASSERT_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_OP(A,OPERATOR,B,MESSAGE) \ + if (not ((A) OPERATOR (B))) then \ + { \ + ASSERTION_ERROR('Assertion (A OPERATOR B) failed!\n' + 'A: ' + (str (A)) + '\n' + 'B: ' + (str (B)) + "\n\n" + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_DEFINED() + Asserts that a VARIABLE is defined. When an assertion fails, an error is raised with the given MESSAGE.. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + ASSERT_DEFINED("_anUndefinedVar","Too few fish!"); + ASSERT_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_DEFINED(VARIABLE,MESSAGE) \ + if (isNil VARIABLE) then \ + { \ + ASSERTION_ERROR('Assertion (VARIABLE is defined) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Unit tests +------------------------------------------- */ +#define TEST_SUCCESS(MESSAGE) MESSAGE_WITH_TITLE("Test OK",MESSAGE) +#define TEST_FAIL(MESSAGE) ERROR_WITH_TITLE("Test FAIL",MESSAGE) + +/* ------------------------------------------- +Macro: TEST_TRUE() + Tests that a CONDITION is true. + If the condition is not true, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + TEST_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_TRUE(CONDITION, MESSAGE) \ + if (CONDITION) then \ + { \ + TEST_SUCCESS('(CONDITION)'); \ + } \ + else \ + { \ + TEST_FAIL('(CONDITION) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_FALSE() + Tests that a CONDITION is false. + If the condition is not false, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to test as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + TEST_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_FALSE(CONDITION, MESSAGE) \ + if (not (CONDITION)) then \ + { \ + TEST_SUCCESS('(not (CONDITION))'); \ + } \ + else \ + { \ + TEST_FAIL('(not (CONDITION)) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_OP() + Tests that (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_OP(A,OPERATOR,B,MESSAGE) \ + if ((A) OPERATOR (B)) then \ + { \ + TEST_SUCCESS('(A OPERATOR B)') \ + } \ + else \ + { \ + TEST_FAIL('(A OPERATOR B)') \ + }; + +/* ------------------------------------------- +Macro: TEST_DEFINED_AND_OP() + Tests that A and B are defined and (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch, PabstMirror +------------------------------------------- */ +#define TEST_DEFINED_AND_OP(A,OPERATOR,B,MESSAGE) \ + if (isNil #A) then { \ + TEST_FAIL('(A is not defined) ' + (MESSAGE)); \ + } else { \ + if (isNil #B) then { \ + TEST_FAIL('(B is not defined) ' + (MESSAGE)); \ + } else { \ + if ((A) OPERATOR (B)) then { \ + TEST_SUCCESS('(A OPERATOR B) ' + (MESSAGE)) \ + } else { \ + TEST_FAIL('(A OPERATOR B) ' + (MESSAGE)) \ + }; }; }; + + +/* ------------------------------------------- +Macro: TEST_DEFINED() + Tests that a VARIABLE is defined. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + TEST_DEFINED("_anUndefinedVar","Too few fish!"); + TEST_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_DEFINED(VARIABLE,MESSAGE) \ + if (not isNil VARIABLE) then \ + { \ + TEST_SUCCESS('(' + VARIABLE + ' is defined)'); \ + } \ + else \ + { \ + TEST_FAIL('(' + VARIABLE + ' is not defined)' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Managing Deprecation +------------------------------------------- */ + +/* ------------------------------------------- +Macro: DEPRECATE_SYS() + Allow deprecation of a function that has been renamed. + + Replaces an old OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + NEW_FUNCTION - Full name of new function [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE_SYS(CBA_fnc_frog,CBA_fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE_SYS(OLD_FUNCTION,NEW_FUNCTION) \ + OLD_FUNCTION = { \ + WARNING('Deprecated function used: OLD_FUNCTION (new: NEW_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call NEW_FUNCTION } else { _this call NEW_FUNCTION }; \ + } + +/* ------------------------------------------- +Macro: DEPRECATE() + Allow deprecation of a function, in the current component, that has been renamed. + + Replaces an OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + NEW_FUNCTION - Name of new function, assuming PREFIX [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE(fnc_frog,fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE(OLD_FUNCTION,NEW_FUNCTION) \ + DEPRECATE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),DOUBLES(PREFIX,NEW_FUNCTION)) + +/* ------------------------------------------- +Macro: OBSOLETE_SYS() + Replace a function that has become obsolete. + + Replace an obsolete OLD_FUNCTION with a simple COMMAND_FUNCTION, with the intention that anyone + using the function should replace it with the simple command, since the function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, and runs the command function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE_SYS(CBA_fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE_SYS(OLD_FUNCTION,COMMAND_CODE) \ + OLD_FUNCTION = { \ + WARNING('Obsolete function used: (use: OLD_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call COMMAND_CODE } else { _this call COMMAND_CODE }; \ + } + +/* ------------------------------------------- +Macro: OBSOLETE() + Replace a function, in the current component, that has become obsolete. + + Replace an obsolete OLD_FUNCTION (which will have PREFIX_ prepended) with a simple + COMMAND_CODE, with the intention that anyone using the function should replace it with the simple + command. + + Shows a warning in RPT each time the deprecated function is used. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE(fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE(OLD_FUNCTION,COMMAND_CODE) \ + OBSOLETE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),COMMAND_CODE) + +#define BWC_CONFIG(NAME) class NAME { \ + units[] = {}; \ + weapons[] = {}; \ + requiredVersion = REQUIRED_VERSION; \ + requiredAddons[] = {}; \ + version = VERSION; \ +} + +// XEH Specific +#define XEH_CLASS CBA_Extended_EventHandlers +#define XEH_CLASS_BASE DOUBLES(XEH_CLASS,base) +#define XEH_DISABLED class EventHandlers { class XEH_CLASS {}; }; SLX_XEH_DISABLED = 1 +#define XEH_ENABLED class EventHandlers { class XEH_CLASS { EXTENDED_EVENTHANDLERS }; }; SLX_XEH_DISABLED = 0 + +// TODO: These are actually outdated; _Once ? +#define XEH_PRE_INIT QUOTE(call COMPILE_FILE(XEH_PreInit_Once)) +#define XEH_PRE_CINIT QUOTE(call COMPILE_FILE(XEH_PreClientInit_Once)) +#define XEH_PRE_SINIT QUOTE(call COMPILE_FILE(XEH_PreServerInit_Once)) + +#define XEH_POST_INIT QUOTE(call COMPILE_FILE(XEH_PostInit_Once)) +#define XEH_POST_CINIT QUOTE(call COMPILE_FILE(XEH_PostClientInit_Once)) +#define XEH_POST_SINIT QUOTE(call COMPILE_FILE(XEH_PostServerInit_Once)) + +/* ------------------------------------------- +Macro: IS_ADMIN + Check if the local machine is an admin in the multiplayer environment. + + Reports 'true' for logged and voted in admins. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin + systemChat str IS_ADMIN; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_SYS(x) x##kick +#define IS_ADMIN serverCommandAvailable 'IS_ADMIN_SYS(#)' + +/* ------------------------------------------- +Macro: IS_ADMIN_LOGGED + Check if the local machine is a logged in admin in the multiplayer environment. + + Reports 'false' if the player was voted to be the admin. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin and entered in the server password + systemChat str IS_ADMIN_LOGGED; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_LOGGED_SYS(x) x##shutdown +#define IS_ADMIN_LOGGED serverCommandAvailable 'IS_ADMIN_LOGGED_SYS(#)' + +/* ------------------------------------------- +Macro: FILE_EXISTS + Check if a file exists + + Reports "false" if the file does not exist. + +Parameters: + FILE - Path to the file + +Example: + (begin example) + // print "true" if file exists + systemChat str FILE_EXISTS("\A3\ui_f\data\igui\cfg\cursors\weapon_ca.paa"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define FILE_EXISTS(FILE) (fileExists (FILE)) diff --git a/arma/client/include/x/cba/addons/xeh/script_xeh.hpp b/arma/client/include/x/cba/addons/xeh/script_xeh.hpp new file mode 100644 index 0000000..2eba000 --- /dev/null +++ b/arma/client/include/x/cba/addons/xeh/script_xeh.hpp @@ -0,0 +1,118 @@ +/* + Header: script_xeh.hpp + + Description: + Used internally. +*/ +///////////////////////////////////////////////////////////////////////////////// +// MACRO: EXTENDED_EVENTHANDLERS +// Add all XEH event handlers +///////////////////////////////////////////////////////////////////////////////// + +#define EXTENDED_EVENTHANDLERS init = "call cba_xeh_fnc_init"; \ +fired = "call cba_xeh_fnc_fired"; \ +animChanged = "call cba_xeh_fnc_animChanged"; \ +animDone = "call cba_xeh_fnc_animDone"; \ +animStateChanged = "call cba_xeh_fnc_animStateChanged"; \ +containerClosed = "call cba_xeh_fnc_containerClosed"; \ +containerOpened = "call cba_xeh_fnc_containerOpened"; \ +controlsShifted = "call cba_xeh_fnc_controlsShifted"; \ +dammaged = "call cba_xeh_fnc_dammaged"; \ +engine = "call cba_xeh_fnc_engine"; \ +epeContact = "call cba_xeh_fnc_epeContact"; \ +epeContactEnd = "call cba_xeh_fnc_epeContactEnd"; \ +epeContactStart = "call cba_xeh_fnc_epeContactStart"; \ +explosion = "call cba_xeh_fnc_explosion"; \ +firedNear = "call cba_xeh_fnc_firedNear"; \ +fuel = "call cba_xeh_fnc_cba_xeh_fuel"; \ +gear = "call cba_xeh_fnc_gear"; \ +getIn = "call cba_xeh_fnc_getIn"; \ +getInMan = "call cba_xeh_fnc_getInMan"; \ +getOut = "call cba_xeh_fnc_getOut"; \ +getOutMan = "call cba_xeh_fnc_getOutMan"; \ +handleHeal = "call cba_xeh_fnc_handleHeal"; \ +hit = "call cba_xeh_fnc_hit"; \ +hitPart = "call cba_xeh_fnc_hitPart"; \ +incomingMissile = "call cba_xeh_fnc_incomingMissile"; \ +inventoryClosed = "call cba_xeh_fnc_inventoryClosed"; \ +inventoryOpened = "call cba_xeh_fnc_inventoryOpened"; \ +killed = "call cba_xeh_fnc_killed"; \ +landedTouchDown = "call cba_xeh_fnc_landedTouchDown"; \ +landedStopped = "call cba_xeh_fnc_landedStopped"; \ +local = "call cba_xeh_fnc_local"; \ +respawn = "call cba_xeh_fnc_respawn"; \ +put = "call cba_xeh_fnc_put"; \ +take = "call cba_xeh_fnc_take"; \ +seatSwitched = "call cba_xeh_fnc_seatSwitched"; \ +seatSwitchedMan = "call cba_xeh_fnc_seatSwitchedMan"; \ +soundPlayed = "call cba_xeh_fnc_soundPlayed"; \ +weaponAssembled = "call cba_xeh_fnc_weaponAssembled"; \ +weaponDisassembled = "call cba_xeh_fnc_weaponDisassembled"; \ +weaponDeployed = "call cba_xeh_fnc_weaponDeployed"; \ +weaponRested = "call cba_xeh_fnc_weaponRested"; \ +reloaded = "call cba_xeh_fnc_reloaded"; \ +firedMan = "call cba_xeh_fnc_firedMan"; \ +turnIn = "call cba_xeh_fnc_turnIn"; \ +turnOut = "call cba_xeh_fnc_turnOut"; \ +deleted = "call cba_xeh_fnc_deleted"; \ +disassembled = "call cba_xeh_fnc_disassembled"; \ +Suppressed = "call cba_xeh_fnc_Suppressed"; \ +gestureChanged = "call cba_xeh_fnc_gestureChanged"; \ +gestureDone = "call cba_xeh_fnc_gestureDone"; + +/* + MACRO: DELETE_EVENTHANDLERS + + Removes all event handlers. +*/ + +#define DELETE_EVENTHANDLERS init = ""; \ +fired = ""; \ +animChanged = ""; \ +animDone = ""; \ +animStateChanged = ""; \ +containerClosed = ""; \ +containerOpened = ""; \ +controlsShifted = ""; \ +dammaged = ""; \ +engine = ""; \ +epeContact = ""; \ +epeContactEnd = ""; \ +epeContactStart = ""; \ +explosion = ""; \ +firedNear = ""; \ +fuel = ""; \ +gear = ""; \ +getIn = ""; \ +getInMan = ""; \ +getOut = ""; \ +getOutMan = ""; \ +handleHeal = ""; \ +hit = ""; \ +hitPart = ""; \ +incomingMissile = ""; \ +inventoryClosed = ""; \ +inventoryOpened = ""; \ +killed = ""; \ +landedTouchDown = ""; \ +landedStopped = ""; \ +local = ""; \ +respawn = ""; \ +put = ""; \ +take = ""; \ +seatSwitched = ""; \ +seatSwitchedMan = ""; \ +soundPlayed = ""; \ +weaponAssembled = ""; \ +weaponDisassembled = ""; \ +weaponDeployed = ""; \ +weaponRested = ""; \ +reloaded = ""; \ +firedMan = ""; \ +turnIn = ""; \ +turnOut = ""; \ +deleted = ""; \ +disassembled = ""; \ +Suppressed = ""; \ +gestureChanged = ""; \ +gestureDone = "" diff --git a/arma/client/meta.cpp b/arma/client/meta.cpp new file mode 100644 index 0000000..1ef1072 --- /dev/null +++ b/arma/client/meta.cpp @@ -0,0 +1,4 @@ +protocol = 1; +publishedid = MOD_ID; +name = "forge-client"; +timestamp = 5250140732737923549; diff --git a/arma/client/mod.cpp b/arma/client/mod.cpp new file mode 100644 index 0000000..c833d00 --- /dev/null +++ b/arma/client/mod.cpp @@ -0,0 +1,15 @@ +dir = "@forge_client"; +author = "J.Schmidt"; +name = "Forge Client"; +description = "Forge Client - Version 1.0.0"; +overview = ""; +overviewPicture = "title_ca.paa"; +picture = "title_ca.paa"; +logoSmall = "icon_64_ca.paa"; +logo = "icon_128_ca.paa"; +logoOver = "icon_128_highlight_ca.paa"; +tooltip = "Forge Client"; +tooltipOwned = "IDS Owned"; +action = "https://innovativedevsolutions.org"; +actionName = "Website"; +dlcColor[] = {0.45, 0.47, 0.41, 1}; diff --git a/arma/client/title_ca.paa b/arma/client/title_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..f46f6d0447e91f5766e82e7bc4050a9af1b04deb GIT binary patch literal 756068 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 xXa+WS0ts?qN6}b8;!Ak+4 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 z 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%0AV#D@ng-VLfq_Q^8e?iiz_=Qr< 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 LKxj5AJxKUJ;Qb-y literal 0 HcmV?d00001 diff --git a/arma/client/tools/config_style_checker.py b/arma/client/tools/config_style_checker.py new file mode 100644 index 0000000..2332750 --- /dev/null +++ b/arma/client/tools/config_style_checker.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 + +import fnmatch +import os +import re +import ntpath +import sys +import argparse + +def check_config_style(filepath): + bad_count_file = 0 + def pushClosing(t): + closingStack.append(closing.expr) + closing << Literal( closingFor[t[0]] ) + + def popClosing(): + closing << closingStack.pop() + + reIsClass = re.compile(r'^\s*class(.*)') + reIsClassInherit = re.compile(r'^\s*class(.*):') + reIsClassBody = re.compile(r'^\s*class(.*){') + reBadColon = re.compile(r'\s*class (.*) :') + reSpaceAfterColon = re.compile(r'\s*class (.*): ') + reSpaceBeforeCurly = re.compile(r'\s*class (.*) {') + reClassSingleLine = re.compile(r'\s*class (.*)[{;]') + + with open(filepath, 'r', encoding='utf-8', errors='ignore') as file: + content = file.read() + + # Store all brackets we find in this file, so we can validate everything on the end + brackets_list = [] + + # To check if we are in a comment block + isInCommentBlock = False + checkIfInComment = False + # Used in case we are in a line comment (//) + ignoreTillEndOfLine = False + # Used in case we are in a comment block (/* */). This is true if we detect a * inside a comment block. + # If the next character is a /, it means we end our comment block. + checkIfNextIsClosingBlock = False + + # We ignore everything inside a string + isInString = False + # Used to store the starting type of a string, so we can match that to the end of a string + inStringType = ''; + + lastIsCurlyBrace = False + checkForSemiColumn = False + + # Extra information so we know what line we find errors at + lineNumber = 1 + + indexOfCharacter = 0 + # Parse all characters in the content of this file to search for potential errors + for c in content: + if (lastIsCurlyBrace): + lastIsCurlyBrace = False + if c == '\n': # Keeping track of our line numbers + lineNumber += 1 # so we can print accurate line number information when we detect a possible error + if (isInString): # while we are in a string, we can ignore everything else, except the end of the string + if (c == inStringType): + isInString = False + # if we are not in a comment block, we will check if we are at the start of one or count the () {} and [] + elif (isInCommentBlock == False): + + # This means we have encountered a /, so we are now checking if this is an inline comment or a comment block + if (checkIfInComment): + checkIfInComment = False + if c == '*': # if the next character after / is a *, we are at the start of a comment block + isInCommentBlock = True + elif (c == '/'): # Otherwise, will check if we are in an line comment + ignoreTillEndOfLine = True # and an line comment is a / followed by another / (//) We won't care about anything that comes after it + + if (isInCommentBlock == False): + if (ignoreTillEndOfLine): # we are in a line comment, just continue going through the characters until we find an end of line + if (c == '\n'): + ignoreTillEndOfLine = False + else: # validate brackets + if (c == '"' or c == "'"): + isInString = True + inStringType = c + elif (c == '/'): + checkIfInComment = True + elif (c == '('): + brackets_list.append('(') + elif (c == ')'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '[']): + print("ERROR: Possible missing round bracket ')' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(')') + elif (c == '['): + brackets_list.append('[') + elif (c == ']'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '(']): + print("ERROR: Possible missing square bracket ']' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(']') + elif (c == '{'): + brackets_list.append('{') + elif (c == '}'): + lastIsCurlyBrace = True + if (len(brackets_list) > 0 and brackets_list[-1] in ['(', '[']): + print("ERROR: Possible missing curly brace '}}' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append('}') + elif (c== '\t'): + print("ERROR: Tab detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + + else: # Look for the end of our comment block + if (c == '*'): + checkIfNextIsClosingBlock = True; + elif (checkIfNextIsClosingBlock): + if (c == '/'): + isInCommentBlock = False + elif (c != '*'): + checkIfNextIsClosingBlock = False + indexOfCharacter += 1 + + if brackets_list.count('[') != brackets_list.count(']'): + print("ERROR: A possible missing square bracket [ or ] in file {0} [ = {1} ] = {2}".format(filepath,brackets_list.count('['),brackets_list.count(']'))) + bad_count_file += 1 + if brackets_list.count('(') != brackets_list.count(')'): + print("ERROR: A possible missing round bracket ( or ) in file {0} ( = {1} ) = {2}".format(filepath,brackets_list.count('('),brackets_list.count(')'))) + bad_count_file += 1 + if brackets_list.count('{') != brackets_list.count('}'): + print("ERROR: A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}'))) + bad_count_file += 1 + + file.seek(0) + for lineNumber, line in enumerate(file.readlines()): + if reIsClass.match(line): + if reBadColon.match(line): + print(f"WARNING: bad class colon {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + if reIsClassInherit.match(line): + if not reSpaceAfterColon.match(line): + print(f"WARNING: bad class missing space after colon {filepath} Line number: {lineNumber+1}") + if reIsClassBody.match(line): + if not reSpaceBeforeCurly.match(line): + print(f"WARNING: bad class inherit missing space before curly braces {filepath} Line number: {lineNumber+1}") + if not reClassSingleLine.match(line): + print(f"WARNING: bad class braces placement {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + + return bad_count_file + +def main(): + + print("Validating Config Style") + + sqf_list = [] + bad_count = 0 + + parser = argparse.ArgumentParser() + parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="") + args = parser.parse_args() + + for folder in ['addons', 'optionals']: + # Allow running from root directory as well as from inside the tools directory + rootDir = "../" + folder + if (os.path.exists(folder)): + rootDir = folder + + for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.rvmat'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.cfg'): + sqf_list.append(os.path.join(root, filename)) + + for filename in sqf_list: + bad_count = bad_count + check_config_style(filename) + + print("------\nChecked {0} files\nErrors detected: {1}".format(len(sqf_list), bad_count)) + if (bad_count == 0): + print("Config validation PASSED") + else: + print("Config validation FAILED") + + return bad_count + +if __name__ == "__main__": + sys.exit(main()) diff --git a/arma/client/tools/release.bat b/arma/client/tools/release.bat new file mode 100644 index 0000000..667a74c --- /dev/null +++ b/arma/client/tools/release.bat @@ -0,0 +1,4 @@ +@ECHO off +hemtt script update_build.rhai +hemtt script update_minor.rhai +hemtt release diff --git a/arma/client/tools/release_patch.bat b/arma/client/tools/release_patch.bat new file mode 100644 index 0000000..ec4db02 --- /dev/null +++ b/arma/client/tools/release_patch.bat @@ -0,0 +1,4 @@ +@ECHO off +hemtt script update_build.rhai +hemtt script update_patch.rhai +hemtt release diff --git a/arma/example_data.sqf b/arma/example_data.sqf new file mode 100644 index 0000000..c3ddf3c --- /dev/null +++ b/arma/example_data.sqf @@ -0,0 +1,5 @@ +[["76561198027566824",[["rank","PRIVATE"],["earnings",0],["holster",true],["state","HEALTHY"],["bank",0],["organization","0160566824_org"],["transactions",[]],["loadout",[[],[],[],["U_BG_Guerrilla_6_1",[]],[],[],"H_Cap_blk_ION","",[],["ItemMap","ItemGPS","ItemRadio","ItemCompass","ItemWatch",""]]],["stance","CROUCH"],["cash",0],["uid","76561198027566824"],["phone_number","0160566824"],["direction",0],["position",[4000,4000,0]],["email","0160566824@spearnet.mil"]]]]; + +["{""uid"":""76561198027566824"",""loadout"":[[],[],[],[""U_BG_Guerrilla_6_1"",[]],[],[],""H_Cap_blk_ION"","""",[],[""ItemMap"",""ItemGPS"",""ItemRadio"",""ItemCompass"",""ItemWatch"",""""]],""position"":[4000.0,4000.0,0.0],""direction"":0.0,""stance"":""CROUCH"",""email"":""0160566824@spearnet.mil"",""phone_number"":""0160566824"",""bank"":0.0,""cash"":0.0,""earnings"":0.0,""state"":""HEALTHY"",""holster"":true,""rank"":""PRIVATE"",""organization"":""0160566824_org"",""transactions"":[]}",0,0]; + +["{""id"":""0160566824_org"",""owner"":""76561198027566824"",""name"":""Black Rifle Company"",""funds"":0.0,""reputation"":0}",0,0]; diff --git a/arma/server/.editorconfig b/arma/server/.editorconfig new file mode 100644 index 0000000..4246311 --- /dev/null +++ b/arma/server/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +end_of_line = crlf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.yml] +indent_size = 2 diff --git a/arma/server/.gitattributes b/arma/server/.gitattributes new file mode 100644 index 0000000..dae0c81 --- /dev/null +++ b/arma/server/.gitattributes @@ -0,0 +1,13 @@ +# Sources +*.cpp text diff=cpp linguist-language=cpp +*.hpp text diff=cpp linguist-language=cpp +*.rhai text diff=rust linguist-language=rust + +*.png binary +*.jpg binary +*.paa binary + +# Linguistics +# Exclude included files and examples from stats +include/* linguist-vendored +extra/* linguist-vendored diff --git a/arma/server/.github/CONTRIBUTING.md b/arma/server/.github/CONTRIBUTING.md new file mode 100644 index 0000000..b7b4679 --- /dev/null +++ b/arma/server/.github/CONTRIBUTING.md @@ -0,0 +1,12 @@ +# Contributing Setup & Guidelines + +## Setting up the Development Environment +### 1. Clone the repository from GitHub +### 2. Install HEMTT +The latest version of HEMTT can be installed by running: +```cmd +winget install hemtt +``` + +## Coding Guidelines +This mod follows the same coding guidelines as the ACE3 mod, which can be found [here](https://ace3.acemod.org/wiki/development/coding-guidelines). diff --git a/arma/server/.github/ISSUE_TEMPLATE/bug-report.md b/arma/server/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..d4c384f --- /dev/null +++ b/arma/server/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,25 @@ +--- +name: Bug report +about: Create a bug report to help us improve +title: '' +labels: kind/bug +--- + +## Describe the bug +A clear and concise description of what the bug is. + +## To reproduce +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Expected behavior +A clear and concise description of what you expected to happen. + +## Attachments +If applicable, add screenshots or RPT logs to help explain your problem. + +## Additional context +Add any other context about the problem here. diff --git a/arma/server/.github/ISSUE_TEMPLATE/feature-request.md b/arma/server/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..709ee6c --- /dev/null +++ b/arma/server/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,15 @@ +--- +name: Feature Request +about: Suggest a feature to be added +title: '' +labels: kind/feature-request +--- + +## Describe the feature that you would like +A clear and concise description of the feature you'd want. + +## Possible alternatives +Possible alternatives to your suggestion. + +## Additional context +Add any other context about the feature here. diff --git a/arma/server/.github/PULL_REQUEST_TEMPLATE.md b/arma/server/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..6f72c35 --- /dev/null +++ b/arma/server/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,12 @@ +**When merged this pull request will:** +- Describe what this pull request will do +- Each change in a separate line + +### Important +- [ ] If the contribution affects [the documentation](../docs), please include your changes in this pull request. +- [ ] [Development Guidelines](https://github.com/IDSolutions/MOD_REPO/blob/main/.github/CONTRIBUTING.md) are read, understood and applied. +- [ ] Title of this PR uses our standard template `Component - Add|Fix|Improve|Change|Make|Remove {changes}`. + + +### Known Issues +- [ ] Issue diff --git a/arma/server/.github/assets/placeholder.txt b/arma/server/.github/assets/placeholder.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/arma/server/.github/assets/placeholder.txt @@ -0,0 +1 @@ + diff --git a/arma/server/.github/workflows/check.yml b/arma/server/.github/workflows/check.yml new file mode 100644 index 0000000..9d2f654 --- /dev/null +++ b/arma/server/.github/workflows/check.yml @@ -0,0 +1,28 @@ +name: HEMTT + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + + - name: Validate Config + run: python tools/config_style_checker.py + - name: Check for BOM + uses: arma-actions/bom-check@master + with: + path: "addons" + + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Run HEMTT check + run: hemtt check --pedantic diff --git a/arma/server/.gitignore b/arma/server/.gitignore new file mode 100644 index 0000000..b786b16 --- /dev/null +++ b/arma/server/.gitignore @@ -0,0 +1,17 @@ +# HEMTT +hemtt.exe +.hemtt/missions/~* +.hemttout/ +releases/ + +# Textures +Exports/ +*.spp +*.spp.painter_lock +*.psd + +# Other +*.biprivatekey +*.zip +*.pbo +*.sqfc diff --git a/arma/server/.hemtt/commands/ctrlWebBrowserAction.yml b/arma/server/.hemtt/commands/ctrlWebBrowserAction.yml new file mode 100644 index 0000000..97b2d5f --- /dev/null +++ b/arma/server/.hemtt/commands/ctrlWebBrowserAction.yml @@ -0,0 +1,28 @@ +name: ctrlWebBrowserAction +description: Executes an action on a web browser control +groups: + - GUI Control +syntax: + - call: !Binary [control, actionArray] + ret: + - Nothing + - Nothing + params: + - name: control + type: Control + description: Web browser control to execute action on + - name: actionArray + type: ArrayUnknown + description: | + Array in format [actionType, actionData] where: + - actionType (String): Type of action ("ExecJS", "LoadURL", "Reload", "Stop", etc.) + - actionData (String): Data for the action (JavaScript code for ExecJS, URL for LoadURL, empty string for others) +argument_loc: Local +effect_loc: Local +since: + arma_3: + major: 2 + minor: 2 +examples: + - _control ctrlWebBrowserAction ["ExecJS", "document.getElementById('test').innerHTML = 'Hello World!'"]; + - _control ctrlWebBrowserAction ["LoadURL", "https://community.bistudio.com"]; diff --git a/arma/server/.hemtt/hooks/post_release/01_move_readme.rhai b/arma/server/.hemtt/hooks/post_release/01_move_readme.rhai new file mode 100644 index 0000000..eb59898 --- /dev/null +++ b/arma/server/.hemtt/hooks/post_release/01_move_readme.rhai @@ -0,0 +1,13 @@ +let readme = HEMTT_RFS.join("docs") + .join("README.md") + .open_file() + .read(); +readme.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_RFS.join("README.md") + .create_file() + .write(readme); +print("README.md version set to " + HEMTT.project().version()); diff --git a/arma/server/.hemtt/hooks/pre_build/01_set_version.rhai b/arma/server/.hemtt/hooks/pre_build/01_set_version.rhai new file mode 100644 index 0000000..c7930cd --- /dev/null +++ b/arma/server/.hemtt/hooks/pre_build/01_set_version.rhai @@ -0,0 +1,26 @@ +let modcpp = HEMTT_VFS.join("mod.cpp") + .open_file() + .read(); +modcpp.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_VFS.join("mod.cpp") + .create_file() + .write(modcpp); +print("mod.cpp version set to " + HEMTT.project().version()); + +// Currently unused, but included anyway +let readme = HEMTT_VFS.join("README.md") + .open_file() + .read(); +readme.replace("0.0.0", + HEMTT.project() + .version() + .to_string_short() +); +HEMTT_VFS.join("README.md") + .create_file() + .write(readme); +print("README.md version set to " + HEMTT.project().version()); diff --git a/arma/server/.hemtt/launch.toml b/arma/server/.hemtt/launch.toml new file mode 100644 index 0000000..1e2e390 --- /dev/null +++ b/arma/server/.hemtt/launch.toml @@ -0,0 +1,16 @@ +[default] +workshop = [ + "450814997", # CBA_A3 + "3499977893", # Advanced Dev Tools + "623475643", # 3DEN Enhanced +] +presets = [] +dlc = [] +optionals = [] +parameters = [] + +[ace] +extends = "default" +workshop = [ + "463939057", # ACE +] diff --git a/arma/server/.hemtt/lints.toml b/arma/server/.hemtt/lints.toml new file mode 100644 index 0000000..98a617b --- /dev/null +++ b/arma/server/.hemtt/lints.toml @@ -0,0 +1,35 @@ +[sqf.banned_commands] +options.banned = [ + "spawn", # Scheduled should be avoided whenever possible + "execVM", # Script files should never be run directly, they should be functions + "remoteExec", # CBA events should be used for networking +] + +[sqf.banned_macros] +options.release = [ + "DEBUG_MODE_FULL", + "DISABLE_COMPILE_CACHE" +] + +[sqf.this_call] +enabled = true + +[sqf.undefined] +enabled = true +options.check_orphan_code = true + +[sqf.unused] +enabled = true # many false positives without DEBUG_MODE_FULL +options.check_params = false + +[sqf.shadowed] +enabled = false + +[sqf.not_private] +enabled = true + +[config.file_type] +options.allow_no_extension = false + +[stringtables.usage] +options.ignore_unused = true diff --git a/arma/server/.hemtt/project.toml b/arma/server/.hemtt/project.toml new file mode 100644 index 0000000..11b6a3c --- /dev/null +++ b/arma/server/.hemtt/project.toml @@ -0,0 +1,24 @@ +name = "forge-server" +author = "J.Schmidt" +prefix = "forge_server" +mainprefix = "forge" + +[version] +path = "addons/main/script_version.hpp" +git_hash = 0 + +[files] +include = [ + "mod.cpp", + "meta.cpp", + "logo_forge_server.png", + "logo_forge_server_over.png", + "logo_forge_server_ca.paa", + "logo_forge_server_over_ca.paa", + "LICENSE.md", + "README.md", +] +exclude = [] + +[properties] +author = "J.Schmidt" diff --git a/arma/server/.hemtt/scripts/update_build.rhai b/arma/server/.hemtt/scripts/update_build.rhai new file mode 100644 index 0000000..14bdbeb --- /dev/null +++ b/arma/server/.hemtt/scripts/update_build.rhai @@ -0,0 +1,19 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define BUILD "; +let current = HEMTT.project().version().build(); +let next = current + 1; +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/server/.hemtt/scripts/update_minor.rhai b/arma/server/.hemtt/scripts/update_minor.rhai new file mode 100644 index 0000000..b8344fb --- /dev/null +++ b/arma/server/.hemtt/scripts/update_minor.rhai @@ -0,0 +1,23 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define MINOR "; +let current = HEMTT.project().version().minor(); +let next = current + 1; + +// Updating minor version should reset patch number +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); +current = HEMTT.project().version().patch(); +script_version.replace("#define PATCH " + current.to_string(), "#define PATCH 0"); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/server/.hemtt/scripts/update_patch.rhai b/arma/server/.hemtt/scripts/update_patch.rhai new file mode 100644 index 0000000..a90383f --- /dev/null +++ b/arma/server/.hemtt/scripts/update_patch.rhai @@ -0,0 +1,20 @@ +// Read the current contents of script_version.hpp +let script_version = HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .open_file() + .read(); + +// Replace the current version with the new version +let prefix = "#define PATCH "; +let current = HEMTT.project().version().patch(); +let next = current + 1; + +script_version.replace(prefix + current.to_string(), prefix + next.to_string()); + +// Write the modified contents to script_version.hpp +HEMTT_RFS.join("addons") + .join("main") + .join("script_version.hpp") + .create_file() + .write(script_version); diff --git a/arma/server/LICENSE.md b/arma/server/LICENSE.md new file mode 100644 index 0000000..659cbdc --- /dev/null +++ b/arma/server/LICENSE.md @@ -0,0 +1,119 @@ +![APL-SA](https://www.bohemia.net/assets/img/licenses/APL-SA.png) + +## Brief summary of this Licence + +PLEASE, NOTE THAT THIS SUMMARY HAS NO LEGAL EFFECT AND IS ONLY OF AN INFORMATORY NATURE DESIGNED FOR YOU TO GET THE BASIC INFORMATION ABOUT THE CONTENT OF THIS LICENCE. THE ONLY LEGALLY BINDING PROVISIONS ARE THOSE IN THE ORIGINAL AND FULL TEXT OF THIS LICENCE. + +With this licence you are free to adapt (i.e. modify, rework or update) and share (i.e. copy, distribute or transmit) the material under the following conditions: + +* **Attribution** - You must attribute the material in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the material). +* **Noncommercial** - You may not use this material for any commercial purposes. +* **Arma Only** - You may not convert or adapt this material to be used in other games than Arma. +* **Share Alike** - If you adapt, or build upon this material, you may distribute the resulting material only under the same license. + +--- + +# Full version of licence + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Arma Public License - Share Alike ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +### Section 1 – Definitions + +1. **Adapted Material** means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. +2. **Adapter's License** means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. +3. **ArmaOnly** means primarily intended for or directed towards the use in any of existing and future Arma games, including but not limited to Arma: Cold War Assault, Arma, Arma 2 and Arma 3 and its official sequels and expansion packs. +4. **Arma Public Share Alike Compatible License** means a license listed at [https://www.bohemia.net/community/licenses](https://www.bohemia.net/community/licenses) as essentially the equivalent of this Public License. +5. **Copyright and Similar Rights** means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. +6. **Effective Technological Measures** means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. +7. **Exceptions and Limitations** means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. +8. **Licensed Material** means the artistic or literary work, database, or other material to which the Licensor applied this Public License. +9. **Licensed Rights** means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. +10. **Licensor** means the individual(s) or entity(ies) granting rights under this Public License. +11. **NonCommercial** means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. +12. **Share** means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. +13. **Sui Generis Database Rights** means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. +14. **You** means the individual or entity exercising the Licensed Rights under this Public License. **Your** has a corresponding meaning. + +### Section 2 – Scope + +1. **License grant** + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + 1. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial and ArmaOnly purposes only; and + 2. produce, reproduce, and Share Adapted Material for NonCommercial and ArmaOnly purposes only. + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + 3. Term. The term of this Public License is specified in Section 6(a). + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + 5. Downstream recipients. + 1. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + 2. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + 3. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(a)(i). +2. **Other rights** + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + 2. Patent and trademark rights are not licensed under this Public License. + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial and ArmaOnly purposes. + +### Section 3 – License Conditions + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +1. **Attribution** + 1. If You Share the Licensed Material (including in modified form), You must: + 1. retain the following if it is supplied by the Licensor with the Licensed Material: + 1. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + 2. a copyright notice; + 3. a notice that refers to this Public License; + 4. a notice that refers to the disclaimer of warranties; + 5. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + 2. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + 3. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(a) to the extent reasonably practicable. +2. **ShareAlike** + In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + 1. The Adapter’s License You apply must be this Public License, or an Arma Public Share Alike Compatible License. + 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +### Section 4 – Sui Generis Database Rights + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +1. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial and ArmaOnly purposes only; +2. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and +3. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +### Section 5 – Disclaimer of Warranties and Limitation of Liability + +1. **Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.** +2. **To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.** +3. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +### Section 6 – Term and Termination + +1. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. +2. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + 2. upon express reinstatement by the Licensor. + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. +3. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. +4. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +### Section 7 – Other Terms and Conditions + +1. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. +2. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +### Section 8 – Interpretation + +1. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. +2. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. +3. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. +4. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +### Bohemia Interactive Notices + +1. Bohemia Interactive a.s. is not a party to this License, and makes no warranty whatsoever in connection with the Licensed Material. Bohemia Interactive a.s. will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, Bohemia Interactive a.s. may elect to apply the Public License to material it publishes and in those instances it becomes the "Licensor". +2. Except for the limited purpose of indicating to the public that the Licensed Material is shared under this Public License, Bohemia Interactive a.s. does not authorize the use by either party of the trademarks "Arma", "Bohemia Interactive" or any related trademark or logo of Arma or Bohemia Interactive without the prior written consent of Bohemia Interactive a.s. \ No newline at end of file diff --git a/arma/server/README.md b/arma/server/README.md new file mode 100644 index 0000000..970fcd3 --- /dev/null +++ b/arma/server/README.md @@ -0,0 +1,27 @@ +

Forge Server

+

+ Version + Issues + + License +
+ HEMTT + CBA A3 +

+ +

+ Requires the latest version of CBA A3 +

+ +**Forge Server** aims to... + +The project is entirely **open-source** and any contributions are welcome. + +## Core Features +- Feature + +## Contributing +For new contributers, see the [Contributing Setup & Guidelines](./.github/CONTRIBUTING.md). + +## License +Forge Server is licensed under [APL-SA](./LICENSE.md). diff --git a/arma/server/addons/actor/$PBOPREFIX$ b/arma/server/addons/actor/$PBOPREFIX$ new file mode 100644 index 0000000..0d8ae67 --- /dev/null +++ b/arma/server/addons/actor/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\actor diff --git a/arma/server/addons/actor/CfgEventHandlers.hpp b/arma/server/addons/actor/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/actor/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +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)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/actor/README.md b/arma/server/addons/actor/README.md new file mode 100644 index 0000000..66b48ec --- /dev/null +++ b/arma/server/addons/actor/README.md @@ -0,0 +1,4 @@ +forge_server_actor +=================== + +Description for this addon diff --git a/arma/server/addons/actor/XEH_PREP.hpp b/arma/server/addons/actor/XEH_PREP.hpp new file mode 100644 index 0000000..50e6a39 --- /dev/null +++ b/arma/server/addons/actor/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(initActorStore); diff --git a/arma/server/addons/actor/XEH_postInit.sqf b/arma/server/addons/actor/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/server/addons/actor/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/server/addons/actor/XEH_preInit.sqf b/arma/server/addons/actor/XEH_preInit.sqf new file mode 100644 index 0000000..e46d7bd --- /dev/null +++ b/arma/server/addons/actor/XEH_preInit.sqf @@ -0,0 +1,85 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +if (isNil QGVAR(ActorStore)) then { [] call FUNC(initActorStore); }; + +[QGVAR(requestInitActor), { + params [["_uid", "", [""]], ["_actor", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + if (_actor isEqualTo createHashMap) exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid Actor data!" }; + + GVAR(ActorStore) call ["init", [_uid, _actor]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestGetActor), { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + + private _session = GVAR(PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid Session!" }; + + GVAR(ActorStore) call ["get", [_uid, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSetActor), { + params [["_uid", "", [""]], ["_key", "", [""]], ["_value", nil, [[], "", 0, false, createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "" || _key isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID or Key!" }; + + private _session = GVAR(PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid Session!" }; + + GVAR(ActorStore) call ["set", [_uid, _key, _value, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestMSetActor), { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + if ((_fieldValuePairs isEqualTo createHashMap) || !(_fieldValuePairs isEqualType createHashMap)) exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid field pairs!" }; + + private _session = GVAR(PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid Session!" }; + + GVAR(ActorStore) call ["mset", [_uid, _fieldValuePairs, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSaveActor), { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + + private _session = GVAR(PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid Session!" }; + + GVAR(ActorStore) call ["save", [_uid, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestRemoveActor), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid UID!" }; + + GVAR(ActorStore) call ["remove", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestResync), { + params ["_player"]; + + private _uid = getPlayerUID _player; + private _actor = GVAR(ActorStore) call ["get", [_uid, true]]; + + private _session = GVAR(PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Actor] Empty/Invalid Session!" }; + + [CRPC(actor,responseSyncActor), [_actor, true], _player] call CFUNC(targetEvent); + + diag_log format ["[FORGE:Server:Actor] Resync completed for %1", _uid]; +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/actor/XEH_preStart.sqf b/arma/server/addons/actor/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/server/addons/actor/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/actor/config.cpp b/arma/server/addons/actor/config.cpp new file mode 100644 index 0000000..05c825e --- /dev/null +++ b/arma/server/addons/actor/config.cpp @@ -0,0 +1,19 @@ +#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_server_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/actor/functions/fnc_initActorStore.sqf b/arma/server/addons/actor/functions/fnc_initActorStore.sqf new file mode 100644 index 0000000..b0447e0 --- /dev/null +++ b/arma/server/addons/actor/functions/fnc_initActorStore.sqf @@ -0,0 +1,181 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the actor store. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Examples: + * [] call forge_server_actor_fnc_initActorStore + * + * Public: Yes + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(ActorStore) = createHashMapObject [[ + ["#type", "IActorStore"], + ["#create", { + GVAR(ActorRegistry) = createHashMap; + GVAR(PlayerSessions) = createHashMap; + diag_log "[FORGE:Server:Actor] Actor Store Initialized!"; + }], + ["generateSessionToken", { + params [["_uid", "", [""]]]; + + private _token = format ["%1_%2_%3", _uid, floor(random 999999), time]; + private _sessionToken = _token call EFUNC(common,generateHash); + + GVAR(PlayerSessions) set [_uid, _sessionToken]; + _sessionToken + }], + ["init", { + params [["_uid", "", [""]], ["_defaultActor", createHashMap, [createHashMap]]]; + + _self call ["generateSessionToken", [_uid]]; + private _finalActor = createHashMap; + + EXTCALL("actor:exists",[ARR_1(_uid)]); + private _exists = (_ext_res select 0) == "true"; + + if !(_exists) then { + _finalActor = _defaultActor; + _finalActor set ["uid", _uid]; + + private _json = _self call ["toJSON", [_finalActor]]; + EXTCALL("actor:create",[ARR_2(_uid,_json)]); + + private _phone_number = _finalActor getOrDefault ["phone_number", ""]; + private _email = _finalActor getOrDefault ["email", ""]; + + diag_log format ["[FORGE:Server:Actor] New player %1 registered with phone number: %2, email: %3", _uid, _phone_number, _email]; + } else { + private _existingActor = _self call ["fetch", [_uid]]; + _finalActor = _existingActor; + + { + if !(_x in _finalActor) then { _finalActor set [_x, _y]; }; + } forEach _defaultActor; + }; + + GVAR(ActorRegistry) set [_uid, _finalActor]; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(actor,responseInitActor), [_finalActor], _player] call CFUNC(targetEvent); + + _finalActor + }], + ["fetch", { + params [["_uid", "", [""]]]; + + private _actor = createHashMap; + + EXTCALL("actor:get",[ARR_1(_uid)]); + diag_log format ["[FORGE:Server:Actor] Data: %1", _ext_res]; + + private _ext_res_actor = _ext_res select 0; + if (count _ext_res_actor > 0) then { _actor = _self call ["toHashMap", [_ext_res_actor]]; }; + + _actor + }], + ["get", { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + private _finalActor = createHashMap; + + if (_sync) then { + private _existingActor = _self call ["fetch", [_uid]]; + _finalActor = _existingActor; + + GVAR(ActorRegistry) set [_uid, _finalActor]; + } else { + _finalActor = GVAR(ActorRegistry) get _uid; + }; + + _finalActor + }], + ["set", { + params [["_uid", "", [""]], ["_field", "", [""]], ["_value", nil], ["_sync", false, [false]]]; + + private _existingActor = GVAR(ActorRegistry) get _uid; + private _finalActor = +_existingActor; + private _hashMap = createHashMap; + + _finalActor set [_field, _value]; + _hashMap set [_field, _value]; + + GVAR(ActorRegistry) set [_uid, _finalActor]; + + if (_sync) then { + private _json = _self call ["toJSON", [_hashMap]]; + EXTCALL("actor:update",[ARR_2(_uid,_json)]); + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(actor,responseSyncActor), [_hashMap], _player] call CFUNC(targetEvent); + + _hashMap + }], + ["mset", { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + private _existingActor = GVAR(ActorRegistry) get _uid; + private _finalActor = +_existingActor; + private _hashMap = createHashMap; + + { _finalActor set [_x, _y]; } forEach _fieldValuePairs; + { _hashMap set [_x, _y]; } forEach _fieldValuePairs; + + GVAR(ActorRegistry) set [_uid, _finalActor]; + + if (_sync) then { + private _json = _self call ["toJSON", [_hashMap]]; + EXTCALL("actor:update",[ARR_2(_uid,_json)]); + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(actor,responseSyncActor), [_hashMap], _player] call CFUNC(targetEvent); + + _hashMap + }], + ["save", { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + private _existingActor = GVAR(ActorRegistry) get _uid; + private _finalActor = +_existingActor; + private _json = _self call ["toJSON", [_finalActor]]; + + EXTCALL("actor:update",[ARR_2(_uid,_json)]); + + if (_sync) then { + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(actor,responseSyncActor), [_finalActor], _player] call CFUNC(targetEvent); + }; + + _finalActor + }], + ["remove", { + params [["_uid", "", [""]]]; + + GVAR(ActorRegistry) deleteAt _uid; + }], + ["toHashMap", { + params [["_data", "", [""]]]; + + private _hashMap = fromJSON _data; + _hashMap + }], + ["toJSON", { + params [["_data", createHashMap, [createHashMap]]]; + + private _json = toJSON _data; + _json + }] +]]; + +SETMVAR(FORGE_ActorStore,GVAR(ActorStore)); +GVAR(ActorStore) diff --git a/arma/server/addons/actor/script_component.hpp b/arma/server/addons/actor/script_component.hpp new file mode 100644 index 0000000..dec8071 --- /dev/null +++ b/arma/server/addons/actor/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT actor +#define COMPONENT_BEAUTIFIED Actor +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/actor/stringtable.xml b/arma/server/addons/actor/stringtable.xml new file mode 100644 index 0000000..95427c0 --- /dev/null +++ b/arma/server/addons/actor/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Actor + + + diff --git a/arma/server/addons/bank/$PBOPREFIX$ b/arma/server/addons/bank/$PBOPREFIX$ new file mode 100644 index 0000000..d4d3bbc --- /dev/null +++ b/arma/server/addons/bank/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\bank diff --git a/arma/server/addons/bank/CfgEventHandlers.hpp b/arma/server/addons/bank/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/bank/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +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)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/bank/README.md b/arma/server/addons/bank/README.md new file mode 100644 index 0000000..3617706 --- /dev/null +++ b/arma/server/addons/bank/README.md @@ -0,0 +1,4 @@ +forge_server_bank +=================== + +Description for this addon diff --git a/arma/server/addons/bank/XEH_PREP.hpp b/arma/server/addons/bank/XEH_PREP.hpp new file mode 100644 index 0000000..5dbb105 --- /dev/null +++ b/arma/server/addons/bank/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(initBankStore); diff --git a/arma/server/addons/bank/XEH_postInit.sqf b/arma/server/addons/bank/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/server/addons/bank/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/server/addons/bank/XEH_preInit.sqf b/arma/server/addons/bank/XEH_preInit.sqf new file mode 100644 index 0000000..276041b --- /dev/null +++ b/arma/server/addons/bank/XEH_preInit.sqf @@ -0,0 +1,85 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +if (isNil QGVAR(BankStore)) then { [] call FUNC(initBankStore); }; + +[QGVAR(requestInitBank), { + params [["_uid", "", [""]], ["_bank", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid UID!" }; + if (_bank isEqualTo createHashMap) exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid Bank data!" }; + + GVAR(BankStore) call ["init", [_uid, _bank]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestGetBank), { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid UID!" }; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid Session!" }; + + GVAR(BankStore) call ["get", [_uid, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSetBank), { + params [["_uid", "", [""]], ["_key", "", [""]], ["_value", nil, [[], "", 0, false, createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "" || _key isEqualTo "") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid UID or Key!" }; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid Session!" }; + + GVAR(BankStore) call ["set", [_uid, _key, _value, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestMSetBank), { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid UID!" }; + if ((_fieldValuePairs isEqualTo createHashMap) || !(_fieldValuePairs isEqualType createHashMap)) exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid field pairs!" }; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid Session!" }; + + GVAR(BankStore) call ["mset", [_uid, _fieldValuePairs, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSaveBank), { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid UID!" }; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid Session!" }; + + GVAR(BankStore) call ["save", [_uid, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestRemoveBank), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid UID!" }; + + GVAR(BankStore) call ["remove", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestResync), { + params ["_player"]; + + private _uid = getPlayerUID _player; + private _bank = GVAR(BankStore) call ["get", [_uid, true]]; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Bank] Empty/Invalid Session!" }; + + [CRPC(bank,responseSyncBank), [_bank, true], _player] call CFUNC(targetEvent); + + diag_log format ["[FORGE:Server:Bank] Resync completed for %1", _uid]; +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/bank/XEH_preStart.sqf b/arma/server/addons/bank/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/server/addons/bank/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/bank/config.cpp b/arma/server/addons/bank/config.cpp new file mode 100644 index 0000000..05c825e --- /dev/null +++ b/arma/server/addons/bank/config.cpp @@ -0,0 +1,19 @@ +#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_server_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/bank/functions/fnc_initBankStore.sqf b/arma/server/addons/bank/functions/fnc_initBankStore.sqf new file mode 100644 index 0000000..0abbc71 --- /dev/null +++ b/arma/server/addons/bank/functions/fnc_initBankStore.sqf @@ -0,0 +1,170 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the bank store. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Examples: + * [] call forge_server_bank_fnc_initBankStore + * + * Public: Yes + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(BankStore) = createHashMapObject [[ + ["#type", "IBankStore"], + ["#create", { + GVAR(BankRegistry) = createHashMap; + diag_log "[FORGE:Server:Bank] Bank Store Initialized!"; + }], + ["init", { + params [["_uid", "", [""]], ["_defaultAccount", createHashMap, [createHashMap]]]; + + private _finalAccount = createHashMap; + + EXTCALL("bank:exists",[ARR_1(_uid)]); + + private _exists = (_ext_res select 0) == "true"; + + if !(_exists) then { + _finalAccount = _defaultAccount; + _finalAccount set ["uid", _uid]; + + private _json = _self call ["toJSON", [_finalAccount]]; + EXTCALL("bank:create",[ARR_2(_uid,_json)]); + + diag_log format ["[FORGE:Server:Bank] Created new bank account for %1", _uid]; + } else { + private _existingAccount = _self call ["fetch", [_uid]]; + _finalAccount = _existingAccount; + + { + if !(_x in _finalAccount) then { _finalAccount set [_x, _y]; }; + } forEach _defaultAccount; + + diag_log format ["[FORGE:Server:Bank] Found bank account for %1", _uid]; + }; + + GVAR(BankRegistry) set [_uid, _finalAccount, true]; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(bank,responseInitBank), [_finalAccount], _player] call CFUNC(targetEvent); + + _finalAccount + }], + ["fetch", { + params [["_uid", "", [""]]]; + + private _account = createHashMap; + + EXTCALL("bank:get",[ARR_1(_uid)]); + diag_log format ["[FORGE:Server:Bank] Data: %1", _ext_res]; + + private _ext_res_account = _ext_res select 0; + if (count _ext_res_account > 0) then { _account = _self call ["toHashMap", [_ext_res_account]]; }; + + _account + }], + ["get", { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + private _finalAccount = createHashMap; + + if (_sync) then { + private _existingAccount = _self call ["fetch", [_uid]]; + _finalAccount = _existingAccount; + + GVAR(BankRegistry) set [_uid, _finalAccount]; + } else { + _finalAccount = GVAR(BankRegistry) get _uid; + }; + + _finalAccount + }], + ["set", { + params [["_uid", "", [""]], ["_field", "", [""]], ["_value", nil], ["_sync", false, [false]]]; + + private _existingAccount = GVAR(BankRegistry) get _uid; + private _finalAccount = +_existingAccount; + private _hashMap = createHashMap; + + _finalAccount set [_field, _value]; + _hashMap set [_field, _value]; + + GVAR(BankRegistry) set [_uid, _finalAccount]; + + if (_sync) then { + private _json = _self call ["toJSON", [_hashMap]]; + EXTCALL("bank:update",[ARR_2(_uid,_json)]); + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(bank,responseSyncBank), [_hashMap], _player] call CFUNC(targetEvent); + + _hashMap + }], + ["mset", { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + private _existingAccount = GVAR(BankRegistry) get _uid; + private _finalAccount = +_existingAccount; + private _hashMap = createHashMap; + + { _finalAccount set [_x, _y]; } forEach _fieldValuePairs; + { _hashMap set [_x, _y]; } forEach _fieldValuePairs; + + GVAR(BankRegistry) set [_uid, _finalAccount]; + + if (_sync) then { + private _json = _self call ["toJSON", [_hashMap]]; + EXTCALL("bank:update",[ARR_2(_uid,_json)]); + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(bank,responseSyncBank), [_hashMap], _player] call CFUNC(targetEvent); + + _hashMap + }], + ["save", { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + private _existingAccount = GVAR(BankRegistry) get _uid; + private _finalAccount = +_existingAccount; + private _json = _self call ["toJSON", [_finalAccount]]; + + EXTCALL("bank:update",[ARR_2(_uid,_json)]); + + if (_sync) then { + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(bank,responseSyncBank), [_finalAccount], _player] call CFUNC(targetEvent); + }; + + _finalAccount + }], + ["remove", { + params [["_uid", "", [""]]]; + + GVAR(BankRegistry) deleteAt _uid; + }], + ["toHashMap", { + params [["_data", "", [""]]]; + + private _hashMap = fromJSON _data; + _hashMap + }], + ["toJSON", { + params [["_data", createHashMap, [createHashMap]]]; + + private _json = toJSON _data; + _json + }] +]]; + +SETMVAR(FORGE_BankStore,GVAR(BankStore)); +GVAR(BankStore) diff --git a/arma/server/addons/bank/script_component.hpp b/arma/server/addons/bank/script_component.hpp new file mode 100644 index 0000000..7b0884d --- /dev/null +++ b/arma/server/addons/bank/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT bank +#define COMPONENT_BEAUTIFIED Bank +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/bank/stringtable.xml b/arma/server/addons/bank/stringtable.xml new file mode 100644 index 0000000..0cd5b23 --- /dev/null +++ b/arma/server/addons/bank/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Bank + + + diff --git a/arma/server/addons/common/$PBOPREFIX$ b/arma/server/addons/common/$PBOPREFIX$ new file mode 100644 index 0000000..dd94028 --- /dev/null +++ b/arma/server/addons/common/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\common diff --git a/arma/server/addons/common/CfgEventHandlers.hpp b/arma/server/addons/common/CfgEventHandlers.hpp new file mode 100644 index 0000000..865276c --- /dev/null +++ b/arma/server/addons/common/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +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)); + }; +}; diff --git a/arma/server/addons/common/README.md b/arma/server/addons/common/README.md new file mode 100644 index 0000000..f6ac3d5 --- /dev/null +++ b/arma/server/addons/common/README.md @@ -0,0 +1,4 @@ +forge_server_common +=================== + +Common functionality shared between addons. diff --git a/arma/server/addons/common/XEH_PREP.hpp b/arma/server/addons/common/XEH_PREP.hpp new file mode 100644 index 0000000..b7ecf76 --- /dev/null +++ b/arma/server/addons/common/XEH_PREP.hpp @@ -0,0 +1,4 @@ +PREP(getPlayer); +PREP(generateHash); +PREP(generateSecureData); +PREP(timeToSeconds); diff --git a/arma/server/addons/common/XEH_preInit.sqf b/arma/server/addons/common/XEH_preInit.sqf new file mode 100644 index 0000000..9dd4ebf --- /dev/null +++ b/arma/server/addons/common/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; diff --git a/arma/server/addons/common/XEH_preStart.sqf b/arma/server/addons/common/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/server/addons/common/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/common/config.cpp b/arma/server/addons/common/config.cpp new file mode 100644 index 0000000..4023b3c --- /dev/null +++ b/arma/server/addons/common/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"IDSolutions"}; + url = ECSTRING(main,url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "forge_server_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/common/functions/fnc_generateHash.sqf b/arma/server/addons/common/functions/fnc_generateHash.sqf new file mode 100644 index 0000000..9dcdb99 --- /dev/null +++ b/arma/server/addons/common/functions/fnc_generateHash.sqf @@ -0,0 +1,33 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Generates a 6-digit hash from input string using DJB2 algorithm. + * + * Arguments: + * 0: Input string to hash + * + * Return Value: + * 6-digit hash string + * + * Example: + * ["test_input"] call forge_server_common_fnc_generateHash + * // Returns: "461324" + * + * Public: Yes + */ + +params [["_input", "", [""]]]; + +private _hash = 5381; +private _chars = toArray _input; + +{ + _hash = ((_hash * 33) + _x) mod 999999; +} forEach _chars; + +private _result = str _hash; + +while { count _result < 6 } do { _result = "0" + _result; }; + +_result diff --git a/arma/server/addons/common/functions/fnc_generateSecureData.sqf b/arma/server/addons/common/functions/fnc_generateSecureData.sqf new file mode 100644 index 0000000..486b992 --- /dev/null +++ b/arma/server/addons/common/functions/fnc_generateSecureData.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Generates a secure data object with timestamp, signature, and token. + * + * Arguments: + * 0: Player UID + * 1: Data to secure + * + * Return Value: + * Secure data object + * + * Example: + * ["test_uid", createHashMap] call forge_server_common_fnc_generateSecureData + * // Returns: ["data", createHashMap], ["timestamp", ], ["signature", ], ["token", ] + * + * Public: Yes + */ + +params [["_uid", "", [""]], ["_data", createHashMap, [createHashMap]]]; + +private _timestamp = systemTime; +private _sessionToken = EGVAR(actor,PlayerSessions) getOrDefault [_uid, ""]; +private _sigInput = format ["%1|%2|%3|%4", _uid, str _data, _timestamp, _sessionToken]; +private _signature = _sigInput call EFUNC(common,generateHash); + +private _secureData = createHashMap; +_secureData set ["data", _data]; +_secureData set ["timestamp", _timestamp]; +_secureData set ["signature", _signature]; +_secureData set ["token", _sessionToken]; + +diag_log format ["[SECURITY] Generated secure data for %1: sig=%2", _uid, _signature]; + +_secureData diff --git a/arma/server/addons/common/functions/fnc_getPlayer.sqf b/arma/server/addons/common/functions/fnc_getPlayer.sqf new file mode 100644 index 0000000..d86f7f6 --- /dev/null +++ b/arma/server/addons/common/functions/fnc_getPlayer.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Gets a player object by UID. + * + * Arguments: + * 0: Player UID + * + * Return Value: + * Player object or objNull if not found + * + * Example: + * ["0123456789"] call forge_server_common_fnc_getPlayer + * + * Public: Yes + */ + +params ["_uid"]; + +private _player = objNull; + +{ + if ((getPlayerUID _x) isEqualTo _uid) exitWith { _player = _x; }; +} forEach allPlayers; + +_player diff --git a/arma/server/addons/common/functions/fnc_timeToSeconds.sqf b/arma/server/addons/common/functions/fnc_timeToSeconds.sqf new file mode 100644 index 0000000..9674445 --- /dev/null +++ b/arma/server/addons/common/functions/fnc_timeToSeconds.sqf @@ -0,0 +1,36 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Converts systemTime array to total seconds since midnight. + * + * Arguments: + * 0: System time array from systemTime command + * + * Return Value: + * Total seconds since midnight + * + * Example: + * [systemTime] call forge_server_common_fnc_timeToSeconds + * // Returns: 43200 (for 12:00:00) + * + * Public: Yes + */ + +params [["_systemTime", [], [[]]]]; + +if (typeName _systemTime != "ARRAY") exitWith { + diag_log format ["[ERROR] timeToSeconds received %1 instead of ARRAY: %2", typeName _systemTime, _systemTime]; + 0 +}; + +if (count _systemTime < 6) exitWith { + diag_log format ["[ERROR] timeToSeconds received array with %1 elements, need at least 6: %2", count _systemTime, _systemTime]; + 0 +}; + +private _hours = _systemTime select 3; +private _minutes = _systemTime select 4; +private _seconds = _systemTime select 5; + +(_hours * 3600) + (_minutes * 60) + _seconds diff --git a/arma/server/addons/common/script_component.hpp b/arma/server/addons/common/script_component.hpp new file mode 100644 index 0000000..26eec82 --- /dev/null +++ b/arma/server/addons/common/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT common +#define COMPONENT_BEAUTIFIED Common +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/common/stringtable.xml b/arma/server/addons/common/stringtable.xml new file mode 100644 index 0000000..936e702 --- /dev/null +++ b/arma/server/addons/common/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Common + + + diff --git a/arma/server/addons/main/$PBOPREFIX$ b/arma/server/addons/main/$PBOPREFIX$ new file mode 100644 index 0000000..9e6049b --- /dev/null +++ b/arma/server/addons/main/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\main diff --git a/arma/server/addons/main/CfgSettings.hpp b/arma/server/addons/main/CfgSettings.hpp new file mode 100644 index 0000000..05d0b0b --- /dev/null +++ b/arma/server/addons/main/CfgSettings.hpp @@ -0,0 +1,13 @@ +class CfgSettings { + class CBA { + class Versioning { + class PREFIX { + main_addon = QUOTE(ADDON); + + class dependencies { + CBA[] = {"cba_main", REQUIRED_CBA_VERSION, "true"}; + }; + }; + }; + }; +}; diff --git a/arma/server/addons/main/README.md b/arma/server/addons/main/README.md new file mode 100644 index 0000000..4de302b --- /dev/null +++ b/arma/server/addons/main/README.md @@ -0,0 +1,4 @@ +forge_server_main +=================== + +Main Addon for forge-server diff --git a/arma/server/addons/main/config.cpp b/arma/server/addons/main/config.cpp new file mode 100644 index 0000000..2b42b1e --- /dev/null +++ b/arma/server/addons/main/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = AUTHOR; + authors[] = {"J.Schmidt"}; + url = CSTRING(url); + name = COMPONENT_NAME; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "cba_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgSettings.hpp" diff --git a/arma/server/addons/main/script_component.hpp b/arma/server/addons/main/script_component.hpp new file mode 100644 index 0000000..32d193a --- /dev/null +++ b/arma/server/addons/main/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT main +#define COMPONENT_BEAUTIFIED Main +#include "script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "script_macros.hpp" diff --git a/arma/server/addons/main/script_macros.hpp b/arma/server/addons/main/script_macros.hpp new file mode 100644 index 0000000..e64fe52 --- /dev/null +++ b/arma/server/addons/main/script_macros.hpp @@ -0,0 +1,159 @@ +// Global toggles for caching/logging +// #define DISABLE_COMPILE_CACHE +// #define DEBUG_MODE_FULL +#define DEBUG_SYNCHRONOUS + +#include "\x\cba\addons\main\script_macros_common.hpp" +#include "\x\cba\addons\xeh\script_xeh.hpp" + +// Functions +#define AFUNC(var1,var2) TRIPLES(DOUBLES(ace,var1),fnc,var2) +#define BFUNC(var1) TRIPLES(BIS,fnc,var1) +#define CFUNC(var1) TRIPLES(CBA,fnc,var1) + +// Remote Procedure Calls +#define CRPC(var1,var2) QUOTE(DOUBLES(DOUBLES(forge_client,var1),var2)) +#define SRPC(var1,var2) QUOTE(DOUBLES(DOUBLES(forge_server,var1),var2)) + +#define QQUOTE(var1) QUOTE(QUOTE(var1)) + +// QPATHTOF but without a leading slash +#define PATHTOF2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\var1 +#define QPATHTOF2(var1) QUOTE(PATHTOF2(var1)) + +#ifdef SUBCOMPONENT + #define SUBADDON DOUBLES(ADDON,SUBCOMPONENT) + + // Update PATHTO macros to point to subaddon instead + #undef PATHTO + #define PATHTO(var1) \MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1.sqf + #undef PATHTOF + #define PATHTOF(var1) \MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1 + #undef PATHTO2 + #define PATHTO2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1.sqf + #undef PATHTOF2 + #define PATHTOF2(var1) MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SUBCOMPONENT\var1 +#endif + +#undef PREP +#ifdef DISABLE_COMPILE_CACHE + #define LINKFUNC(x) {call FUNC(x)} + #define PREP(fncName) FUNC(fncName) = compile preprocessFileLineNumbers QPATHTOF(functions\DOUBLES(fnc,fncName).sqf) + #define PREP_RECOMPILE_START if (isNil "forge_server_fnc_recompile") then {forge_server_recompiles = []; forge_server_fnc_recompile = {{call _x} forEach forge_server_recompiles;}}; private _recomp = { + #define PREP_RECOMPILE_END }; call _recomp; forge_server_recompiles pushBack _recomp; +#else + #define LINKFUNC(x) FUNC(x) + #define PREP(fncName) [QPATHTOF(functions\DOUBLES(fnc,fncName).sqf), QFUNC(fncName)] call CBA_fnc_compileFunction + #define PREP_RECOMPILE_START ; /* disabled */ + #define PREP_RECOMPILE_END ; /* disabled */ +#endif + +#define GETVAR_SYS(var1,var2) getVariable [ARR_2(QUOTE(var1),var2)] +#define SETVAR_SYS(var1,var2) setVariable [ARR_2(QUOTE(var1),var2)] +#define SETPVAR_SYS(var1,var2) setVariable [ARR_3(QUOTE(var1),var2,true)] + +#undef GETVAR +#define GETVAR(var1,var2,var3) (var1 GETVAR_SYS(var2,var3)) +#define GETMVAR(var1,var2) (missionNamespace GETVAR_SYS(var1,var2)) +#define GETUVAR(var1,var2) (uiNamespace GETVAR_SYS(var1,var2)) +#define GETPRVAR(var1,var2) (profileNamespace GETVAR_SYS(var1,var2)) +#define GETPAVAR(var1,var2) (parsingNamespace GETVAR_SYS(var1,var2)) + +#undef SETVAR +#define SETVAR(var1,var2,var3) var1 SETVAR_SYS(var2,var3) +#define SETPVAR(var1,var2,var3) var1 SETPVAR_SYS(var2,var3) +#define SETMVAR(var1,var2) missionNamespace SETVAR_SYS(var1,var2) +#define SETUVAR(var1,var2) uiNamespace SETVAR_SYS(var1,var2) +#define SETPRVAR(var1,var2) profileNamespace SETVAR_SYS(var1,var2) +#define SETPAVAR(var1,var2) parsingNamespace SETVAR_SYS(var1,var2) + +#define GETGVAR(var1,var2) GETMVAR(GVAR(var1),var2) +#define GETEGVAR(var1,var2,var3) GETMVAR(EGVAR(var1,var2),var3) + +// Extension +#define EXT "forge_server" + +#define EXTCALL(function,args) private _ext_res = EXT callExtension [function, args]; \ +if ((_ext_res select 1) != 0) then { \ + ERROR_2("Error calling %1: %2",function,(_ext_res select 1)); \ + ERROR_1("ARGS: %1",args); \ +} + +#define EXTFUNC(function) EXTCALL(function,[]) + +#define WEAP_XX(WEAP, COUNT) class DOUBLES(_xx,WEAP) { \ + weapon = QUOTE(WEAP); \ + count = COUNT; \ +} + +#define MAG_XX(MAG, COUNT) class DOUBLES(_xx,MAG) { \ + magazine = QUOTE(MAG); \ + count = COUNT; \ +} + +#define ITEM_XX(ITEM, COUNT) class DOUBLES(_xx,ITEM) { \ + name = QUOTE(ITEM); \ + count = COUNT; \ +} + +// ACE Cargo +#define CARGO_XX(ITEM, COUNT) class ITEM { \ + type = QUOTE(ITEM); \ + amount = COUNT; \ +} + +#define MAG_CSW(var1,var2) class DOUBLES(var1,csw): var1 { \ + scope = var2; \ + type = TYPE_MAGAZINE_PRIMARY_AND_THROW; \ +} + +// Debug textures, mainly for testing hiddenSelections +#define DBUG_TEX_RED "#(rgb,8,8,3)color(1,0,0,1)" +#define DBUG_TEX_GRN "#(rgb,8,8,3)color(0,1,0,1)" +#define DBUG_TEX_BLU "#(rgb,8,8,3)color(0,0,1,1)" +#define DBUG_TEX_PUR "#(rgb,8,8,3)color(1,0,1,1)" +#define DBUG_TEX_YEL "#(rgb,8,8,3)color(1,1,0,1)" + +// Statements and conditions +#define CLAMP(var1,lower,upper) (lower max (var1 min upper)) + +// Weapon types +#define TYPE_WEAPON_PRIMARY 1 +#define TYPE_WEAPON_HANDGUN 2 +#define TYPE_WEAPON_SECONDARY 4 +// Magazine types +#define TYPE_MAGAZINE_HANDGUN_AND_GL 16 // mainly +#define TYPE_MAGAZINE_PRIMARY_AND_THROW 256 +#define TYPE_MAGAZINE_SECONDARY_AND_PUT 512 // mainly +#define TYPE_MAGAZINE_MISSILE 768 +// More types +#define TYPE_BINOCULAR_AND_NVG 4096 +#define TYPE_WEAPON_VEHICLE 65536 +#define TYPE_ITEM 131072 +// Item types +#define TYPE_DEFAULT 0 +#define TYPE_MUZZLE 101 +#define TYPE_OPTICS 201 +#define TYPE_FLASHLIGHT 301 +#define TYPE_BIPOD 302 +#define TYPE_FIRST_AID_KIT 401 +#define TYPE_FINS 501 // not implemented +#define TYPE_BREATHING_BOMB 601 // not implemented +#define TYPE_NVG 602 +#define TYPE_GOGGLE 603 +#define TYPE_SCUBA 604 // not implemented +#define TYPE_HEADGEAR 605 +#define TYPE_FACTOR 607 +#define TYPE_MAP 608 +#define TYPE_COMPASS 609 +#define TYPE_WATCH 610 +#define TYPE_RADIO 611 +#define TYPE_GPS 612 +#define TYPE_HMD 616 +#define TYPE_BINOCULAR 617 +#define TYPE_MEDIKIT 619 +#define TYPE_TOOLKIT 620 +#define TYPE_UAV_TERMINAL 621 +#define TYPE_VEST 701 +#define TYPE_UNIFORM 801 +#define TYPE_BACKPACK 901 diff --git a/arma/server/addons/main/script_mod.hpp b/arma/server/addons/main/script_mod.hpp new file mode 100644 index 0000000..475c6bf --- /dev/null +++ b/arma/server/addons/main/script_mod.hpp @@ -0,0 +1,26 @@ +#define MAINPREFIX forge +#define PREFIX forge_server +#define MOD_NAME forge-server +#define AUTHOR "J.Schmidt" + +#define REQUIRED_VERSION 2.20 +#define REQUIRED_CBA_VERSION {3,18,4} +#define REQUIRED_ACE_VERSION {3,20,0} + +#include "script_version.hpp" + +#define VERSION MAJOR.MINOR +#define VERSION_STR MAJOR.MINOR.PATCH.BUILD +#define VERSION_AR MAJOR,MINOR,PATCH,BUILD + +#ifndef COMPONENT_BEAUTIFIED + #define COMPONENT_BEAUTIFIED COMPONENT +#endif +#ifdef SUBCOMPONENT + #ifndef SUBCOMPONENT_BEAUTIFIED + #define SUBCOMPONENT_BEAUTIFIED SUBCOMPONENT + #endif + #define COMPONENT_NAME QUOTE(MOD_NAME - COMPONENT_BEAUTIFIED (SUBCOMPONENT_BEAUTIFIED)) +#else + #define COMPONENT_NAME QUOTE(MOD_NAME - COMPONENT_BEAUTIFIED) +#endif diff --git a/arma/server/addons/main/script_version.hpp b/arma/server/addons/main/script_version.hpp new file mode 100644 index 0000000..3e6aaab --- /dev/null +++ b/arma/server/addons/main/script_version.hpp @@ -0,0 +1,4 @@ +#define MAJOR 1 +#define MINOR 0 +#define PATCH 0 +#define BUILD 0 diff --git a/arma/server/addons/main/stringtable.xml b/arma/server/addons/main/stringtable.xml new file mode 100644 index 0000000..c40749d --- /dev/null +++ b/arma/server/addons/main/stringtable.xml @@ -0,0 +1,24 @@ + + + + + Main + + + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + https://github.com/IDSolutions/MOD_REPO + + + diff --git a/arma/server/addons/org/$PBOPREFIX$ b/arma/server/addons/org/$PBOPREFIX$ new file mode 100644 index 0000000..75b39af --- /dev/null +++ b/arma/server/addons/org/$PBOPREFIX$ @@ -0,0 +1 @@ +forge\forge_server\addons\org diff --git a/arma/server/addons/org/CfgEventHandlers.hpp b/arma/server/addons/org/CfgEventHandlers.hpp new file mode 100644 index 0000000..f6503c2 --- /dev/null +++ b/arma/server/addons/org/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +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)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; +}; diff --git a/arma/server/addons/org/README.md b/arma/server/addons/org/README.md new file mode 100644 index 0000000..d498671 --- /dev/null +++ b/arma/server/addons/org/README.md @@ -0,0 +1,4 @@ +forge_server_org +=================== + +Description for this addon diff --git a/arma/server/addons/org/XEH_PREP.hpp b/arma/server/addons/org/XEH_PREP.hpp new file mode 100644 index 0000000..c7b9330 --- /dev/null +++ b/arma/server/addons/org/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(initOrgStore); diff --git a/arma/server/addons/org/XEH_postInit.sqf b/arma/server/addons/org/XEH_postInit.sqf new file mode 100644 index 0000000..421c54b --- /dev/null +++ b/arma/server/addons/org/XEH_postInit.sqf @@ -0,0 +1 @@ +#include "script_component.hpp" diff --git a/arma/server/addons/org/XEH_preInit.sqf b/arma/server/addons/org/XEH_preInit.sqf new file mode 100644 index 0000000..f1e7190 --- /dev/null +++ b/arma/server/addons/org/XEH_preInit.sqf @@ -0,0 +1,85 @@ +#include "script_component.hpp" + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// private _category = [QUOTE(MOD_NAME), LLSTRING(displayName)]; + +if (isNil QGVAR(OrgStore)) then { [] call FUNC(initOrgStore); }; + +[QGVAR(requestInitOrg), { + params [["_uid", "", [""]], ["_org", createHashMap, [createHashMap]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid UID!" }; + if (_org isEqualTo createHashMap) exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid Org data!" }; + + GVAR(OrgStore) call ["init", [_uid, _org]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestGetOrg), { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid UID!" }; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid Session!" }; + + GVAR(OrgStore) call ["get", [_uid, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSetOrg), { + params [["_uid", "", [""]], ["_key", "", [""]], ["_value", nil, [[], "", 0, false, createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "" || _key isEqualTo "") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid UID or Key!" }; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid Session!" }; + + GVAR(OrgStore) call ["set", [_uid, _key, _value, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestMSetOrg), { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid UID!" }; + if ((_fieldValuePairs isEqualTo createHashMap) || !(_fieldValuePairs isEqualType createHashMap)) exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid field pairs!" }; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid Session!" }; + + GVAR(OrgStore) call ["mset", [_uid, _fieldValuePairs, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestSaveOrg), { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid UID!" }; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid Session!" }; + + GVAR(OrgStore) call ["save", [_uid, _sync]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestRemoveOrg), { + params [["_uid", "", [""]]]; + + if (_uid isEqualTo "") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid UID!" }; + + GVAR(OrgStore) call ["remove", [_uid]]; +}] call CFUNC(addEventHandler); + +[QGVAR(requestResync), { + params ["_player"]; + + private _uid = getPlayerUID _player; + private _org = GVAR(OrgStore) call ["get", [_uid, true]]; + + private _session = EGVAR(actor,PlayerSessions) getOrDefault [_uid, nil]; + if (isNil "_session") exitWith { diag_log "[FORGE:Server:Org] Empty/Invalid Session!" }; + + [CRPC(org,responseSyncOrg), [_org, true], _player] call CFUNC(targetEvent); + + diag_log format ["[FORGE:Server:Org] Resync completed for %1", _uid]; +}] call CFUNC(addEventHandler); diff --git a/arma/server/addons/org/XEH_preStart.sqf b/arma/server/addons/org/XEH_preStart.sqf new file mode 100644 index 0000000..0228885 --- /dev/null +++ b/arma/server/addons/org/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/arma/server/addons/org/config.cpp b/arma/server/addons/org/config.cpp new file mode 100644 index 0000000..05c825e --- /dev/null +++ b/arma/server/addons/org/config.cpp @@ -0,0 +1,19 @@ +#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_server_main" + }; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" diff --git a/arma/server/addons/org/functions/fnc_initOrgStore.sqf b/arma/server/addons/org/functions/fnc_initOrgStore.sqf new file mode 100644 index 0000000..c65e8f3 --- /dev/null +++ b/arma/server/addons/org/functions/fnc_initOrgStore.sqf @@ -0,0 +1,205 @@ +#include "..\script_component.hpp" + +/* + * Author: IDSolutions + * Initializes the org store. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Examples: + * [] call forge_server_org_fnc_initOrgStore + * + * Public: Yes + */ + +#pragma hemtt ignore_variables ["_self"] +GVAR(OrgStore) = createHashMapObject [[ + ["#type", "IOrgStore"], + ["#create", { + GVAR(IndexRegistry) = createHashMap; + GVAR(OrgRegistry) = createHashMap; + diag_log "[FORGE:Server:Org] Org Store Initialized!"; + }], + ["init", { + params [["_uid", "", [""]], ["_defaultOrg", createHashMap, [createHashMap]]]; + + private _actor = EGVAR(actor,ActorRegistry) get _uid; + private _orgID = _actor get "organization"; + + EXTCALL("org:exists",[ARR_1(_orgID)]); + + private _exists = (_ext_res select 0) == "true"; + private _player = [_uid] call EFUNC(common,getPlayer); + + if !(_exists) exitWith { + [CRPC(org,responseInitOrg), [createHashMap], _player] call CFUNC(targetEvent); + diag_log format ["[FORGE:Server:Org] No existing org found for %1, using default org.", _uid]; + }; + + GVAR(IndexRegistry) set [_uid, _orgID]; + + private _organization = _self call ["fetch", [_uid]]; + private _members = _self call ["fetchMembers", [_uid]]; + // private _assets = _self call ["fetchAssets", [_uid]]; + + private _finalOrg = GVAR(OrgRegistry) getOrDefault [_orgID, _organization]; + _finalOrg set ["members", _members]; + // _finalOrg set ["assets", _assets]; + + GVAR(OrgRegistry) set [_orgID, _finalOrg, true]; + + [CRPC(org,responseInitOrg), [_finalOrg], _player] call CFUNC(targetEvent); + + _finalOrg + }], + ["fetch", { + params [["_uid", "", [""]]]; + + private _organization = createHashMap; + private _orgID = GVAR(IndexRegistry) get _uid; + + EXTCALL("org:get",[ARR_1(_orgID)]); + diag_log format ["[FORGE:Server:Org] Data: %1", _ext_res]; + + private _ext_res_org = _ext_res select 0; + if (count _ext_res_org > 0) then { _organization = _self call ["toHashMap", [_ext_res_org]]; }; + + _organization + }], + ["fetchAssets", { + params [["_uid", "", [""]]]; + + private _assets = createHashMap; + private _orgID = GVAR(IndexRegistry) get _uid; + + EXTCALL("org:get_assets",[ARR_1(_orgID)]); + diag_log format ["[FORGE:Server:Org] Assets: %1", _ext_res]; + + private _ext_res_assets = _ext_res select 0; + if (count _ext_res_assets > 0) then { _assets = _self call ["toHashMap", [_ext_res_assets]]; }; + + _assets + }], + ["fetchMembers", { + params [["_uid", "", [""]]]; + + private _members = createHashMap; + private _orgID = GVAR(IndexRegistry) get _uid; + + EXTCALL("org:get_members",[ARR_1(_orgID)]); + diag_log format ["[FORGE:Server:Org] Members: %1", _ext_res]; + + private _ext_res_members = _ext_res select 0; + private _raw_members = _self call ["toHashMap", [_ext_res_members]]; + + { + private _uid = _x get "uid"; + _members set [_uid, _x]; + } forEach _raw_members; + + _members + }], + ["get", { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + private _finalOrg = createHashMap; + private _orgID = GVAR(IndexRegistry) get _uid; + + if (_sync) then { + _finalOrg = _self call ["fetch", [_uid]]; + GVAR(OrgRegistry) set [_orgID, _finalOrg]; + } else { + _finalOrg = GVAR(OrgRegistry) getOrDefault [_orgID, createHashMap]; + }; + + _finalOrg + }], + ["set", { + params [["_uid", "", [""]], ["_field", "", [""]], ["_value", nil], ["_sync", false, [false]]]; + + private _orgID = GVAR(IndexRegistry) get _uid; + private _organization = GVAR(OrgRegistry) get _orgID; + private _finalOrg = +_organization; + private _hashMap = createHashMap; + + _finalOrg set [_field, _value]; + _hashMap set [_field, _value]; + + GVAR(OrgRegistry) set [_orgID, _finalOrg]; + + if (_sync) then { + private _json = _self call ["toJSON", [_hashMap]]; + EXTCALL("org:update",[ARR_2(_orgID,_json)]); + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(org,responseSyncOrg), [_hashMap], _player] call CFUNC(targetEvent); + + _hashMap + }], + ["mset", { + params [["_uid", "", [""]], ["_fieldValuePairs", createHashMap, [createHashMap]], ["_sync", false, [false]]]; + + private _orgID = GVAR(IndexRegistry) get _uid; + private _organization = GVAR(OrgRegistry) get _orgID; + private _finalOrg = +_organization; + private _hashMap = createHashMap; + + { _finalOrg set [_x, _y]; } forEach _fieldValuePairs; + { _hashMap set [_x, _y]; } forEach _fieldValuePairs; + + GVAR(OrgRegistry) set [_orgID, _finalOrg]; + + if (_sync) then { + private _json = _self call ["toJSON", [_hashMap]]; + EXTCALL("org:update",[ARR_2(_orgID,_json)]); + }; + + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(org,responseSyncOrg), [_hashMap], _player] call CFUNC(targetEvent); + + _hashMap + }], + ["save", { + params [["_uid", "", [""]], ["_sync", false, [false]]]; + + private _orgID = GVAR(IndexRegistry) get _uid; + private _organization = GVAR(OrgRegistry) get _orgID; + private _finalOrg = +_organization; + private _json = _self call ["toJSON", [_finalOrg]]; + + EXTCALL("org:update",[ARR_2(_orgID,_json)]); + + if (_sync) then { + private _player = [_uid] call EFUNC(common,getPlayer); + [CRPC(org,responseSyncOrg), [_finalOrg], _player] call CFUNC(targetEvent); + }; + + _finalOrg + }], + ["remove", { + params [["_uid", "", [""]]]; + + private _orgID = GVAR(IndexRegistry) get _uid; + GVAR(OrgRegistry) deleteAt _orgID; + }], + ["toHashMap", { + params [["_data", "", [""]]]; + + private _hashMap = fromJSON _data; + _hashMap + }], + ["toJSON", { + params [["_data", createHashMap, [createHashMap]]]; + + private _json = toJSON _data; + _json + }] +]]; + +SETMVAR(FORGE_OrgStore,GVAR(OrgStore)); +GVAR(OrgStore) diff --git a/arma/server/addons/org/script_component.hpp b/arma/server/addons/org/script_component.hpp new file mode 100644 index 0000000..b51fe86 --- /dev/null +++ b/arma/server/addons/org/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT org +#define COMPONENT_BEAUTIFIED Org +#include "\forge\forge_server\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#include "\forge\forge_server\addons\main\script_macros.hpp" diff --git a/arma/server/addons/org/stringtable.xml b/arma/server/addons/org/stringtable.xml new file mode 100644 index 0000000..4c73262 --- /dev/null +++ b/arma/server/addons/org/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Org + + + diff --git a/arma/server/config.example.toml b/arma/server/config.example.toml new file mode 100644 index 0000000..eddb170 --- /dev/null +++ b/arma/server/config.example.toml @@ -0,0 +1,35 @@ +# Crate Server Configuration +# Copy this file to config.toml and modify as needed +# Place this file in the same directory as your crate_server_x64.dll + +[redis] +# Redis server connection settings +host = "127.0.0.1" +port = 6379 +db = 0 # Redis database number (0-15) + +# Optional authentication +# username = "your_username" +# password = "your_password" + +# Optional connection pool settings +max_connections = 10 # Maximum number of connections in pool +min_connections = 2 # Minimum number of idle connections +idle_timeout = 60 # Idle connection timeout in seconds + +# Example configurations for different environments: + +# Development (local Redis) +# host = "127.0.0.1" +# port = 6379 +# max_connections = 5 +# min_connections = 1 + +# Production (remote Redis with auth) +# host = "redis.example.com" +# port = 6379 +# username = "arma_server" +# password = "secure_password_here" +# max_connections = 20 +# min_connections = 5 +# idle_timeout = 30 diff --git a/arma/server/docs/README.md b/arma/server/docs/README.md new file mode 100644 index 0000000..5aea712 --- /dev/null +++ b/arma/server/docs/README.md @@ -0,0 +1,268 @@ +# Forge Server - Redis Client Module + +A high-performance arma-rs extension for Arma 3, featuring a **low-level Redis data access layer** that provides raw Redis operations as a foundation for higher-level game modules. + +## 🎯 Overview + +The Forge Server Redis module is designed as a **foundational data access layer** that: +- **Returns raw Redis responses** for maximum performance and flexibility +- **Serves as the foundation** for higher-level game modules (actor, garage, locker, bank, etc.) +- **Provides connection pooling** and error handling for Redis operations +- **Enables persistent data storage** across server restarts +- **Supports cross-server data sharing** in multi-server environments + +## 🏗️ Layered Architecture + +``` +SQF Scripts + ↓ (JSON responses) +Game Modules (actor, garage, locker, bank) + ↓ (raw Redis responses) +Redis Client Module + ↓ (Redis protocol) +Redis Server +``` + +**This module handles the bottom layer** - raw Redis operations with connection pooling and error handling. + +## 🏗️ Internal Architecture + +``` +forge_server_x64.dll Extension +├── lib.rs # Core extension initialization & global runtime +├── config.example.toml # Example configuration file +└── redis/ # Redis Client module + ├── mod.rs # Group definitions & module exports + ├── client.rs # Connection pool management + ├── config.rs # Configuration system + ├── macros.rs # redis_operation! macro for boilerplate elimination + ├── common.rs # String/key operations + ├── hash.rs # Hash operations (HSET, HGET, etc.) + ├── list.rs # List operations (LPUSH, LPOP, etc.) + └── set.rs # Set operations (SADD, SMEMBERS, etc.) +``` + +### Key Components +- **lib.rs**: Manages global Redis pool and single Tokio runtime +- **macros.rs**: Provides `redis_operation!` macro to eliminate boilerplate +- **Operation modules**: Focus purely on Redis logic using the macro +- **Synchronous Interface**: All functions appear synchronous to Arma while using async Redis internally + +## 🚀 Features + +### Raw Redis Operations +- **String Operations**: SET, GET, INCR, DECR, DEL, KEYS +- **Hash Operations**: HSET, HGET, HMSET, HGETALL, HDEL, HKEYS, HVALS, HLEN +- **List Operations**: LSET, LGET, LLEN, LRANGE, LPUSH, RPUSH, LPOP, RPOP, LTRIM, LREM +- **Set Operations**: SADD, SMEMBERS, SCARD, SREM, SISMEMBER, SPOP, SRANDMEMBER + +### Performance Features +- **Connection Pooling**: bb8-redis pool with configurable size and timeouts +- **Single Runtime**: One shared Tokio runtime for all async operations +- **Macro-Based**: `redis_operation!` macro eliminates boilerplate while maintaining performance +- **Synchronous Interface**: Functions block until completion, compatible with Arma's threading model +- **Raw Responses**: Returns native Redis values for maximum performance +- **Thread Safety**: Safe concurrent access from multiple Arma threads + +## ⚙️ Configuration System + +Forge Server uses a TOML-based configuration system for flexible Redis connection management. + +### Configuration File + +Create a `config.toml` file in your extension directory: + +```toml +[redis] +host = "127.0.0.1" +port = 6379 +# db = 0 # Optional: Redis database number +# username = "user" # Optional: Redis username +# password = "password" # Optional: Redis password +# max_connections = 10 # Optional: Maximum connections in pool +# min_connections = 2 # Optional: Minimum idle connections in pool +# idle_timeout = 60 # Optional: Connection idle timeout (seconds) +``` + +### Fallback Behavior + +The extension uses a robust fallback system: +1. **Loads `config.toml`** if present in the extension directory +2. **Falls back to defaults** if configuration fails or file is missing +3. **Only fails** if both config and defaults cannot establish connection + +**Default Settings:** +- **Host**: `127.0.0.1` +- **Port**: `6379` +- **Max Connections**: `10` +- **Min Connections**: `2` +- **Idle Timeout**: `60 seconds` + +### Common Configurations + +**Development (Local Redis)**: +```toml +[redis] +host = "127.0.0.1" +port = 6379 +max_connections = 5 +min_connections = 1 +``` + +**Production (Remote Redis with Authentication)**: +```toml +[redis] +host = "redis.example.com" +port = 6379 +username = "arma_server" +password = "secure_password" +max_connections = 20 +min_connections = 5 +idle_timeout = 60 +``` + +### Troubleshooting + +**Connection Issues:** +- Verify Redis server is running: `redis-cli ping` +- Check host/port settings in `config.toml` +- Ensure firewall allows connection + +**Authentication Issues:** +- Verify username/password in config +- Check Redis server auth settings + +**Config File Issues:** +- Check TOML syntax with online validators +- Ensure quotes are properly closed +- Verify file permissions + +**Connection Pool Benefits:** +- Pre-warmed connections for zero-latency operations +- Automatic connection recovery on network issues +- Resource-efficient connection sharing +- Configurable pool sizing for different deployment scenarios + +## 🔧 Installation + +1. **Prerequisites**: + - Redis server (local or remote) + - Arma 3 server with extension support + +2. **Extension Setup**: + - Build the extension: `cargo build --release` + - Copy the compiled `forge_server_x64.dll` to your Arma 3 server + - Copy `config.example.toml` to `config.toml` and configure as needed + - Load in server config or mission + +3. **Redis Server**: + ```bash + # Start Redis server + redis-server + + # Verify connection + redis-cli ping + ``` + +## 📝 Documentation + +- **[API Reference](./api-reference.md)** - Complete Redis command reference +- **[Usage Examples](./usage-examples.md)** - Practical SQF integration examples + +## 📊 Performance + +- **Connection Pool**: 2-10 persistent connections using bb8-redis +- **Single Runtime**: One shared Tokio runtime eliminates overhead from multiple runtimes +- **Macro Efficiency**: Zero-cost abstraction – macros expand to optimal code at compile time +- **Synchronous Blocking**: Functions use `block_on()` for Arma compatibility without sacrificing async I/O benefits +- **Response Format**: Raw Redis responses for minimal overhead +- **Thread Safety**: Multiple Arma threads can safely call operations concurrently +- **Memory Efficient**: Minimal resource usage per operation + +## 🔄 Response Format + +This module returns **raw Redis responses** as strings for maximum performance: + +### Success Responses +- **String values**: `"John"` (raw string) +- **Numbers**: `"42"` (number as string) +- **Lists/Arrays**: `"item1,item2,item3"` (comma-separated) +- **Hashes**: `"key1,value1,key2,value2"` (comma-separated key-value pairs) +- **Boolean**: `"1"` or `"0"` (for exists checks) +- **Status**: `"OK"` (for successful SET operations) + +### Error Responses +- **Format**: `"Error: "` +- **Pool errors**: `"Error: Redis pool not initialized"` +- **Connection errors**: `"Error: "` +- **Redis errors**: `"Error: "` + +### Higher-Level JSON Formatting +Game modules (actor, garage, etc.) will wrap these raw responses in structured JSON for SQF consumption. + +## ⚙️ Macro-Based Implementation + +This extension uses a **macro-based architecture** to eliminate boilerplate while maintaining performance: + +### The `redis_operation!` Macro + +```rust +pub fn set_key(key: String, value: String) -> String { + redis_operation!(conn => { + match conn.set::<_, _, ()>(&key, &value).await { + Ok(()) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} +``` + +### What the Macro Handles + +- **Pool Management**: Retrieves Redis connection pool +- **Error Handling**: Returns "Error: ..." for pool/connection failures +- **Async Bridging**: Uses shared Tokio runtime via `block_on()` +- **Connection Acquisition**: Gets connection from pool with error handling +- **Cleanup**: Automatic connection return to pool + +### Benefits + +- **Reduced Code**: 70% less boilerplate per function +- **Consistency**: Identical error handling across all operations +- **Maintainability**: Changes to connection logic in one place +- **Performance**: No runtime overhead from abstraction +- **Synchronous Interface**: Functions block until Redis operation completes + +## 🛠️ Development + +- **Language**: Rust (Edition 2024) +- **Dependencies**: arma-rs, bb8-redis, redis, tokio +- **Architecture**: Macro-based design with single runtime and connection pool +- **Key Patterns**: + - Global state management in `lib.rs` + - Boilerplate elimination via `redis_operation!` macro + - Synchronous interfaces over async operations + - Raw Redis responses for minimal overhead +- **Testing**: Unit tests for core functionality + + +## 🚨 Error Handling + +The extension provides comprehensive error handling: +- Connection failures +- Redis operation errors +- Invalid parameters +- Pool initialization errors + +All errors include descriptive messages for debugging. + +## 🔍 Monitoring + +Connection pool status and Redis operations can be monitored through: +- Extension logs +- Redis server logs +- Connection pool metrics + +--- + +**Built with ❤️ for the Arma 3 community** \ No newline at end of file diff --git a/arma/server/docs/api-reference.md b/arma/server/docs/api-reference.md new file mode 100644 index 0000000..a039827 --- /dev/null +++ b/arma/server/docs/api-reference.md @@ -0,0 +1,388 @@ +# Redis Client API Reference + +Complete reference for **raw Redis operations** available in the Forge Server extension. This module returns native Redis values without JSON formatting. + +> **Note**: This is a low-level data access layer. Higher-level game modules (actor, garage, etc.) will provide structured JSON responses for SQF consumption. + +## 🏗️ Implementation + +All Redis operations are implemented using the `redis_operation!` macro for: +- **Consistent Error Handling**: All functions return identical error formats +- **Connection Management**: Automatic pool and connection handling +- **Synchronous Interface**: Functions block until Redis operations complete +- **Performance**: Zero-cost abstraction with compile-time optimization + +## 🔗 Command Structure + +All redis client commands follow the pattern: `"forge_server" callExtension ["redis:command", [parameters]]` + +## 📝 Common Operations + +### SET - Store a key-value pair +**Command**: `redis:common:set` +**Parameters**: `[key, value]` + +```sqf +"forge_server" callExtension ["redis:common:set", ["player_name", "John"]] +``` + +**Raw Response**: `"OK"` + +### GET - Retrieve a value by key +**Command**: `redis:common:get` +**Parameters**: `[key]` + +```sqf +"forge_server" callExtension ["redis:common:get", ["player_name"]] +``` + +**Raw Response**: `"John"` (the actual stored value) + +### INCR - Increment a numeric value +**Command**: `redis:common:incr` +**Parameters**: `[key, increment_amount]` + +```sqf +"forge_server" callExtension ["redis:common:incr", ["player_score", 10]] +``` + +**Raw Response**: `"110"` (the new value as string) + +### DECR - Decrement a numeric value +**Command**: `redis:common:decr` +**Parameters**: `[key, decrement_amount]` + +```sqf +"forge_server" callExtension ["redis:common:decr", ["player_lives", 1]] +``` + +**Raw Response**: `"2"` (the new value as string) + +### DEL - Delete a key +**Command**: `redis:common:del` +**Parameters**: `[key]` + +```sqf +"forge_server" callExtension ["redis:common:del", ["temp_data"]] +``` + +**Raw Response**: `"1"` (number of keys deleted) + +### KEYS - List all keys matching pattern +**Command**: `redis:common:keys` +**Parameters**: `[]` (currently returns all keys with "*" pattern) + +```sqf +"forge_server" callExtension ["redis:common:keys", []] +``` + +**Raw Response**: `"player_name,player_score,mission_state"` (comma-separated list) + +## 🗂️ Hash Operations + +### HSET - Set hash field +**Command**: `redis:hash:set` +**Parameters**: `[hash_key, field, value]` + +```sqf +"forge_server" callExtension ["redis:hash:set", ["player:123", "name", "John"]] +``` + +**Raw Response**: `"1"` (number of fields added) + +### HGET - Get hash field +**Command**: `redis:hash:get` +**Parameters**: `[hash_key, field]` + +```sqf +"forge_server" callExtension ["redis:hash:get", ["player:123", "name"]] +``` + +**Raw Response**: `"John"` (the field value) + +### HMSET - Set multiple hash fields +**Command**: `redis:hash:mset` +**Parameters**: `[hash_key, [[field1, value1], [field2, value2], ...]]` + +```sqf +"forge_server" callExtension ["redis:hash:mset", ["player:123", [["name", "John"], ["score", "100"]]]] +``` + +**Raw Response**: `"OK"` + +### HGETALL - Get all hash fields +**Command**: `redis:hash:getall` +**Parameters**: `[hash_key]` + +```sqf +"forge_server" callExtension ["redis:hash:getall", ["player:123"]] +``` + +**Raw Response**: `"name,John,score,100,level,5"` (comma-separated key-value pairs) + +### HDEL - Delete hash field +**Command**: `redis:hash:del` +**Parameters**: `[hash_key, field]` + +```sqf +"forge_server" callExtension ["redis:hash:del", ["player:123", "temp_field"]] +``` + +**Raw Response**: `"1"` (number of fields removed) + +### HKEYS - Get all hash field names +**Command**: `redis:hash:keys` +**Parameters**: `[hash_key]` + +```sqf +"forge_server" callExtension ["redis:hash:keys", ["player:123"]] +``` + +**Raw Response**: `"name,score,level"` (comma-separated field names) + +### HVALS - Get all hash values +**Command**: `redis:hash:vals` +**Parameters**: `[hash_key]` + +```sqf +"forge_server" callExtension ["redis:hash:vals", ["player:123"]] +``` + +**Raw Response**: `"John,100,5"` (comma-separated values) + +### HLEN - Get hash field count +**Command**: `redis:hash:len` +**Parameters**: `[hash_key]` + +```sqf +"forge_server" callExtension ["redis:hash:len", ["player:123"]] +``` + +**Raw Response**: `"3"` (number of fields in hash) + +## 📋 List Operations + +### LSET - Set list element by index +**Command**: `redis:list:set` +**Parameters**: `[list_key, index, value]` + +```sqf +"forge_server" callExtension ["redis:list:set", ["mission_queue", 0, "patrol_alpha"]] +``` + +**Raw Response**: `"OK"` + +### LGET - Get list element by index +**Command**: `redis:list:get` +**Parameters**: `[list_key, index]` + +```sqf +"forge_server" callExtension ["redis:list:get", ["mission_queue", 0]] +``` + +**Raw Response**: `"patrol_alpha"` (the element value) + +### LLEN - Get list length +**Command**: `redis:list:len` +**Parameters**: `[list_key]` + +```sqf +"forge_server" callExtension ["redis:list:len", ["mission_queue"]] +``` + +**Raw Response**: `"5"` (list length) + +### LRANGE - Get list elements in range +**Command**: `redis:list:range` +**Parameters**: `[list_key, start_index, end_index]` + +```sqf +"forge_server" callExtension ["redis:list:range", ["mission_queue", 0, 2]] +``` + +**Raw Response**: `"patrol_alpha,escort_beta,defend_gamma"` (comma-separated values) + +### LPUSH - Add element to list head +**Command**: `redis:list:lpush` +**Parameters**: `[list_key, value]` + +```sqf +"forge_server" callExtension ["redis:list:lpush", ["recent_actions", "player_joined"]] +``` + +**Raw Response**: `"6"` (new list length) + +### RPUSH - Add element to list tail +**Command**: `redis:list:rpush` +**Parameters**: `[list_key, value]` + +```sqf +"forge_server" callExtension ["redis:list:rpush", ["mission_queue", "new_objective"]] +``` + +**Raw Response**: `"6"` (new list length) + +### LPOP - Remove and return element from list head +**Command**: `redis:list:lpop` +**Parameters**: `[list_key, count]` + +```sqf +"forge_server" callExtension ["redis:list:lpop", ["recent_actions", 1]] +``` + +**Raw Response**: `"player_joined"` (removed element) or `"item1,item2"` (if count > 1) + +### RPOP - Remove and return element from list tail +**Command**: `redis:list:rpop` +**Parameters**: `[list_key, count]` + +```sqf +"forge_server" callExtension ["redis:list:rpop", ["mission_queue", 1]] +``` + +**Raw Response**: `"new_objective"` (removed element) or `"item1,item2"` (if count > 1) + +### LTRIM - Trim list to specified range +**Command**: `redis:list:trim` +**Parameters**: `[list_key, start_index, end_index]` + +```sqf +"forge_server" callExtension ["redis:list:trim", ["recent_actions", 0, 9]] // Keep only last 10 items +``` + +**Raw Response**: `"OK"` + +### LREM - Remove elements from list +**Command**: `redis:list:del` +**Parameters**: `[list_key, count, value]` + +```sqf +"forge_server" callExtension ["redis:list:del", ["mission_queue", 1, "completed_mission"]] +``` + +**Raw Response**: `"1"` (number of elements removed) + +## 🎯 Set Operations + +### SADD - Add element to set +**Command**: `redis:set:add` +**Parameters**: `[set_key, value]` + +```sqf +"forge_server" callExtension ["redis:set:add", ["online_players", "player_123"]] +``` + +**Raw Response**: `"1"` (1 if element was added, 0 if already existed) + +### SMEMBERS - Get all set members +**Command**: `redis:set:members` +**Parameters**: `[set_key]` + +```sqf +"forge_server" callExtension ["redis:set:members", ["online_players"]] +``` + +**Raw Response**: `"player_123,player_456,player_789"` (comma-separated members) + +### SCARD - Get set size +**Command**: `redis:set:card` +**Parameters**: `[set_key]` + +```sqf +"forge_server" callExtension ["redis:set:card", ["online_players"]] +``` + +**Raw Response**: `"3"` (number of elements in set) + +### SREM - Remove element from set +**Command**: `redis:set:del` +**Parameters**: `[set_key, value]` + +```sqf +"forge_server" callExtension ["redis:set:del", ["online_players", "player_456"]] +``` + +**Raw Response**: `"1"` (1 if element was removed, 0 if didn't exist) + +### SISMEMBER - Check if element is in set +**Command**: `redis:set:ismember` +**Parameters**: `[set_key, value]` + +```sqf +"forge_server" callExtension ["redis:set:ismember", ["online_players", "player_123"]] +``` + +**Raw Response**: `"1"` (1 if member exists, 0 if not) + +### SPOP - Remove and return random element +**Command**: `redis:set:pop` +**Parameters**: `[set_key]` + +```sqf +"forge_server" callExtension ["redis:set:pop", ["available_missions"]] +``` + +**Raw Response**: `"mission_alpha"` (the removed element) + +### SRANDMEMBER - Get random element without removing +**Command**: `redis:set:randmember` +**Parameters**: `[set_key]` + +```sqf +"forge_server" callExtension ["redis:set:randmember", ["available_missions"]] +``` + +**Raw Response**: `"mission_beta"` (a random element) + +### SRANDMEMBER - Get multiple random elements +**Command**: `redis:set:randmembers` +**Parameters**: `[set_key, count]` + +```sqf +"forge_server" callExtension ["redis:set:randmembers", ["available_missions", 3]] +``` + +**Raw Response**: `"mission_alpha,mission_gamma,mission_delta"` (comma-separated random elements) + +## ⚠️ Error Responses + +All commands may return error responses in this format: + +**Raw Error Response**: `"Error: "` + +### Common Error Types +- **Pool not initialized**: `"Error: Redis pool not initialized"` +- **Connection failed**: `"Error: Connection refused (os error 61)"` +- **Key not found**: `"Error: key not found"` (for operations on non-existent keys) +- **Invalid type**: `"Error: WRONGTYPE Operation against a key holding the wrong kind of value"` +- **Index out of range**: `"Error: index out of range"` (for list operations) + +### Error Handling in Game Modules +Higher-level game modules should check if the response starts with `"Error: "` to distinguish between successful responses and errors. + +```json +{ + "status": "error", + "error": "Failed to connect to Redis server" +} +``` + +Common error types: +- **Connection errors**: Redis server unavailable +- **Operation errors**: Invalid data type for operation +- **Parameter errors**: Missing or invalid parameters +- **Pool errors**: Connection pool exhausted + +## 📊 Response Fields + +### Common Fields +- `status`: Always present - "success" or "error" +- `key`: The Redis key being operated on +- `error`: Error message (only on error responses) + +### Success-Specific Fields +- `data`: The retrieved data (for GET operations) +- `value`: The stored value (for SET operations) +- `was_new`: Boolean indicating if operation created new data +- `removed_count`: Number of elements removed +- `fields_set`: Number of fields set in hash operations diff --git a/arma/server/docs/usage-examples.md b/arma/server/docs/usage-examples.md new file mode 100644 index 0000000..24515e2 --- /dev/null +++ b/arma/server/docs/usage-examples.md @@ -0,0 +1,427 @@ +# Redis Client Usage Examples + +Practical examples of using the **raw Redis client module** as a foundation for higher-level game modules. These examples show low-level Redis operations that would typically be wrapped by game-specific modules (actor, garage, locker, bank). + +> **Note**: These examples show raw Redis responses. In practice, your game modules would wrap these calls and return structured JSON to SQF scripts. + +## 🚀 Function Behavior + +All Redis functions are **synchronous from SQF's perspective**: +- Functions **block** until Redis operation completes +- **No callbacks** or async handling needed in SQF +- **Direct return values** – either data or error strings +- **Thread-safe** – multiple scripts can call simultaneously + +The extension handles all async complexity internally using a macro-based architecture. + +## 🎮 Player Management + +### Player Join/Leave Tracking +```sqf +// When player joins +_playerUID = getPlayerUID player; +_playerName = name player; + +// Store player info in hash +"forge_server" callExtension ["redis:hash:set", [format ["player:%1", _playerUID], "name", _playerName]]; +"forge_server" callExtension ["redis:hash:set", [format ["player:%1", _playerUID], "join_time", str time]]; + +// Add to online players set +"forge_server" callExtension ["redis:set:add", ["online_players", _playerUID]]; + +// When player leaves +"forge_server" callExtension ["redis:set:del", ["online_players", _playerUID]]; +"forge_server" callExtension ["redis:hash:set", [format ["player:%1", _playerUID], "leave_time", str time]]; +``` + +### Player Statistics System +```sqf +// Initialize player stats +fnc_initPlayerStats = { + params ["_playerUID"]; + + _playerKey = format ["stats:%1", _playerUID]; + "forge_server" callExtension ["redis:hash:mset", [_playerKey, [ + ["kills", "0"], + ["deaths", "0"], + ["score", "0"], + ["playtime", "0"] + ]]]; +}; + +// Update player kill +fnc_addPlayerKill = { + params ["_playerUID"]; + + _playerKey = format ["stats:%1", _playerUID]; + "forge_server" callExtension ["redis:hash:incr", [_playerKey, "kills", 1]]; + "forge_server" callExtension ["redis:hash:incr", [_playerKey, "score", 10]]; +}; + +// Get player stats (raw response) +fnc_getPlayerStats = { + params ["_playerUID"]; + + _playerKey = format ["stats:%1", _playerUID]; + _rawResult = "forge_server" callExtension ["redis:hash:getall", [_playerKey]]; + // _rawResult is now "kills,15,deaths,3,score,150,playtime,7200" + + // Game modules would parse this into structured data + // For now, return raw comma-separated response + _rawResult select 0; +}; +``` + +## 🏆 Leaderboards and Rankings + +### Global Kill Leaderboard +```sqf +// Add score to sorted leaderboard (using list for simplicity) +fnc_updateLeaderboard = { + params ["_playerName", "_kills"]; + + // Store individual score + "forge_server" callExtension ["redis:common:set", [format ["kills:%1", _playerName], str _kills]]; + + // Add to leaderboard tracking + "forge_server" callExtension ["redis:set:add", ["leaderboard_players", _playerName]]; +}; + +// Get top 10 players (raw response handling) +fnc_getTopPlayers = { + // Get all leaderboard players - returns comma-separated list + _playersResult = "forge_server" callExtension ["redis:set:members", ["leaderboard_players"]]; + _rawPlayers = _playersResult select 0; + + // Check for error + if (_rawPlayers find "Error:" == 0) exitWith { [] }; + + // Split comma-separated player list + _players = _rawPlayers splitString ","; + _scoreArray = []; + + // Get scores for all players + { + _killsResult = "forge_server" callExtension ["redis:common:get", [format ["kills:%1", _x]]]; + _rawKills = _killsResult select 0; + + // Check for valid response (not an error) + if (_rawKills find "Error:" != 0) then { + _scoreArray pushBack [_x, parseNumber _rawKills]; + }; + } forEach _players; + + // Sort by score (highest first) + _scoreArray sort false; + _scoreArray resize (10 min (count _scoreArray)); // Top 10 + + _scoreArray; +}; +``` + +## 🎯 Mission State Management + +### Objective System +```sqf +// Set mission objectives +fnc_initMissionObjectives = { + "forge_server" callExtension ["redis:list:rpush", ["objectives", "Secure Alpha Base"]]; + "forge_server" callExtension ["redis:list:rpush", ["objectives", "Extract Intel"]]; + "forge_server" callExtension ["redis:list:rpush", ["objectives", "Eliminate HVT"]]; + + // Set current objective pointer + "forge_server" callExtension ["redis:common:set", ["current_objective", "0"]]; +}; + +// Complete current objective +fnc_completeObjective = { + // Get current objective index - returns raw string + _indexResult = "forge_server" callExtension ["redis:common:get", ["current_objective"]]; + _rawIndex = _indexResult select 0; + + // Check for error + if (_rawIndex find "Error:" == 0) exitWith {}; + + _currentIndex = parseNumber _rawIndex; + + // Get objective name - returns raw string + _objResult = "forge_server" callExtension ["redis:list:get", ["objectives", _currentIndex]]; + _objectiveName = _objResult select 0; + + // Check for valid response + if (_objectiveName find "Error:" != 0) then { + // Move to completed objectives - returns new list length + "forge_server" callExtension ["redis:list:rpush", ["completed_objectives", _objectiveName]]; + + // Move to next objective - returns "OK" + "forge_server" callExtension ["redis:common:set", ["current_objective", str (_currentIndex + 1)]]; + + // Broadcast completion + [format ["Objective Complete: %1", _objectiveName]] remoteExec ["hint"]; + }; +}; + +// Get mission progress - raw responses +fnc_getMissionProgress = { + _totalResult = "forge_server" callExtension ["redis:list:len", ["objectives"]]; + _completedResult = "forge_server" callExtension ["redis:list:len", ["completed_objectives"]]; + + _rawTotal = _totalResult select 0; + _rawCompleted = _completedResult select 0; + + // Check for errors + if (_rawTotal find "Error:" == 0 || _rawCompleted find "Error:" == 0) exitWith { + "Mission Progress: Unknown"; + }; + + _total = parseNumber _rawTotal; + _completed = parseNumber _rawCompleted; + + format ["Mission Progress: %1/%2 objectives completed", _completed, _total]; +}; +``` + +## 🚁 Vehicle and Equipment Tracking + +### Vehicle Pool System +```sqf +// Initialize vehicle pool +fnc_initVehiclePool = { + params ["_vehicleClass", "_count"]; + + for "_i" from 1 to _count do { + _vehicleId = format ["%1_%2", _vehicleClass, _i]; + "forge_server" callExtension ["redis:set:add", ["available_vehicles", _vehicleId]]; + "forge_server" callExtension ["redis:hash:mset", [format ["vehicle:%1", _vehicleId], [ + ["class", _vehicleClass], + ["status", "available"], + ["condition", "100"] + ]]]; + }; +}; + +// Request vehicle +fnc_requestVehicle = { + params ["_playerUID"]; + + // Get random available vehicle + _result = "forge_server" callExtension ["redis:set:pop", ["available_vehicles"]]; + _data = fromJSON (_result select 0); + + if ((_data select "status") == "success") then { + _vehicleId = _data select "data"; + + // Mark as in use + "forge_server" callExtension ["redis:hash:set", [format ["vehicle:%1", _vehicleId], "status", "in_use"]]; + "forge_server" callExtension ["redis:hash:set", [format ["vehicle:%1", _vehicleId], "user", _playerUID]]; + "forge_server" callExtension ["redis:set:add", ["used_vehicles", _vehicleId]]; + + _vehicleId; + } else { + ""; // No vehicles available + }; +}; + +// Return vehicle +fnc_returnVehicle = { + params ["_vehicleId", "_condition"]; + + // Update condition + "forge_server" callExtension ["redis:hash:set", [format ["vehicle:%1", _vehicleId], "condition", str _condition]]; + + // Return to pool if condition is good + if (_condition > 50) then { + "forge_server" callExtension ["redis:hash:set", [format ["vehicle:%1", _vehicleId], "status", "available"]]; + "forge_server" callExtension ["redis:hash:del", [format ["vehicle:%1", _vehicleId], "user"]]; + "forge_server" callExtension ["redis:set:del", ["used_vehicles", _vehicleId]]; + "forge_server" callExtension ["redis:set:add", ["available_vehicles", _vehicleId]]; + } else { + "forge_server" callExtension ["redis:hash:set", [format ["vehicle:%1", _vehicleId], "status", "maintenance"]]; + "forge_server" callExtension ["redis:set:add", ["maintenance_vehicles", _vehicleId]]; + }; +}; +``` + +## 📊 Server Analytics + +### Player Session Tracking +```sqf +// Track player session start +fnc_startPlayerSession = { + params ["_playerUID"]; + + _sessionId = format ["%1_%2", _playerUID, floor time]; + _sessionKey = format ["session:%1", _sessionId]; + + "forge_server" callExtension ["redis:hash:mset", [_sessionKey, [ + ["player_uid", _playerUID], + ["start_time", str time], + ["server_id", serverName], + ["player_count", str (count allPlayers)] + ]]]; + + // Store current session for player + "forge_server" callExtension ["redis:common:set", [format ["current_session:%1", _playerUID], _sessionId]]; + + _sessionId; +}; + +// End player session +fnc_endPlayerSession = { + params ["_playerUID", "_sessionStats"]; + + // Get current session + _result = "forge_server" callExtension ["redis:common:get", [format ["current_session:%1", _playerUID]]]; + _data = fromJSON (_result select 0); + + if ((_data select "status") == "success") then { + _sessionId = _data select "data"; + _sessionKey = format ["session:%1", _sessionId]; + + // Update session with end data + "forge_server" callExtension ["redis:hash:mset", [_sessionKey, [ + ["end_time", str time], + ["duration", str (_sessionStats select "duration")], + ["kills", str (_sessionStats select "kills")], + ["deaths", str (_sessionStats select "deaths")] + ]]]; + + // Clean up current session tracking + "forge_server" callExtension ["redis:common:del", [format ["current_session:%1", _playerUID]]]; + }; +}; +``` + +## 🔄 Cross-Server Communication + +### Message Queue System +```sqf +// Send message to other servers +fnc_sendCrossServerMessage = { + params ["_targetServer", "_messageType", "_messageData"]; + + _message = createHashMap; + _message set ["from_server", serverName]; + _message set ["type", _messageType]; + _message set ["data", _messageData]; + _message set ["timestamp", str time]; + + _queueKey = format ["messages:%1", _targetServer]; + "forge_server" callExtension ["redis:list:rpush", [_queueKey, str _message]]; +}; + +// Check for incoming messages +fnc_checkMessages = { + _queueKey = format ["messages:%1", serverName]; + + // Get next message + _result = "forge_server" callExtension ["redis:list:lpop", [_queueKey, 1]]; + _data = fromJSON (_result select 0); + + if ((_data select "status") == "success") then { + _messages = _data select "data"; + if (count _messages > 0) then { + _messageStr = _messages select 0; + _message = fromJSON _messageStr; + + // Process message based on type + _type = _message select "type"; + _messageData = _message select "data"; + + switch (_type) do { + case "player_transfer": { + [_messageData] call fnc_handlePlayerTransfer; + }; + case "server_status": { + [_messageData] call fnc_handleServerStatus; + }; + case "admin_broadcast": { + [_messageData select "message"] remoteExec ["hint"]; + }; + }; + }; + }; +}; + +// Run message checker periodically +[] spawn { + while {true} do { + call fnc_checkMessages; + sleep 5; // Check every 5 seconds + }; +}; +``` + +## 🛠️ Utility Functions + +### Redis Helper Functions +```sqf +// Parse Redis response safely +fnc_parseRedisResponse = { + params ["_response"]; + + try { + _data = fromJSON (_response select 0); + if ((_data select "status") == "success") then { + _data select "data"; + } else { + diag_log format ["Redis Error: %1", _data select "error"]; + nil; + }; + } catch { + diag_log format ["JSON Parse Error: %1", _exception]; + nil; + }; +}; + +// Batch Redis operations +fnc_redisBatch = { + params ["_operations"]; + + _results = []; + { + _op = _x; + _result = "forge_server" callExtension [_op select 0, _op select 1]; + _results pushBack (fromJSON (_result select 0)); + } forEach _operations; + + _results; +}; + +// Example batch usage: +_batchOps = [ + ["redis:common:set", ["key1", "value1"]], + ["redis:common:set", ["key2", "value2"]], + ["redis:common:get", ["key1"]] +]; +_results = [_batchOps] call fnc_redisBatch; +``` + +## 🎯 Best Practices + +### Error Handling Pattern +```sqf +fnc_safeRedisCall = { + params ["_command", "_params", ["_defaultValue", nil]]; + + try { + _result = "forge_server" callExtension [_command, _params]; + _data = fromJSON (_result select 0); + + if ((_data select "status") == "success") then { + _data select "data"; + } else { + diag_log format ["Redis operation failed: %1 - %2", _command, _data select "error"]; + _defaultValue; + }; + } catch { + diag_log format ["Redis call exception: %1 - %2", _command, _exception]; + _defaultValue; + }; +}; + +// Usage: +_playerName = ["redis:common:get", ["player_name"], "Unknown"] call fnc_safeRedisCall; +``` + +These examples demonstrate real-world usage patterns for the Redis extension in Arma 3 environments, covering player management, mission state, analytics, and cross-server communication. \ No newline at end of file diff --git a/arma/server/extension/Cargo.toml b/arma/server/extension/Cargo.toml new file mode 100644 index 0000000..613facc --- /dev/null +++ b/arma/server/extension/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "forge-server" +version = "0.1.0" +edition = "2024" + +[lib] +name = "forge_server_x64" +crate-type = ["cdylib"] + +[dependencies] +arma-rs = { workspace = true } +base64 = "0.22.1" +bb8-redis = "0.25.0-rc.1" +chrono = { workspace = true } +forge-models = { path = "../../../lib/models", features = ["actor"] } +forge-repositories = { path = "../../../lib/repositories" } +forge-services = { path = "../../../lib/services" } +forge-shared = { path = "../../../lib/shared" } +redis = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +tokio = { workspace = true } +toml = "0.9.8" +uuid = { workspace = true } diff --git a/arma/server/extension/README.md b/arma/server/extension/README.md new file mode 100644 index 0000000..f1c535a --- /dev/null +++ b/arma/server/extension/README.md @@ -0,0 +1,399 @@ +# Forge Arma 3 Server Extension + +This extension provides the core server-side functionality for the Forge framework, handling persistent data storage, actor management, and game state synchronization through a high-performance Rust backend. + +## Architecture + +The extension follows a layered architecture designed for reliability, performance, and maintainability: + +- **Extension Layer**: Handles the raw Arma 3 `callExtension` interface, parameter parsing, and command routing. +- **Service Layer**: Implements business logic, validation, and orchestration of operations (e.g., `ActorService`). +- **Repository Layer**: Manages data persistence and retrieval using Redis (e.g., `RedisActorRepository`). +- **Model Layer**: Defines strict data structures and validation rules (e.g., `Actor` model). + +This separation ensures that game logic is decoupled from data storage and that all data entering the system is validated before persistence. + +### Module Documentation + +For detailed information about specific modules, see: + +- **[Redis Operations](src/redis/README.md)**: Comprehensive guide to Redis commands (hash, list, set, common operations) +- **[Adapters](src/adapters/README.md)**: Adapter pattern implementation bridging repositories with Redis + +## Organization Management + +The Organization module handles guild/clan management, allowing players to form groups, manage members, and persist organizational data. It supports role management, automatic UID resolution, and robust error handling. + +### Available Commands + +| Command | Description | +|---------|-------------| +| `org:get` | Retrieve organization data by key or ID. | +| `org:create` | Create a new organization with provided JSON data. | +| `org:update` | Update an existing organization with partial JSON data. | +| `org:delete` | Permanently remove an organization and its data. | +| `org:exists` | Check if an organization exists. | +| `org:get_members` | Retrieve a list of organization members. | +| `org:add_member` | Add a member to an organization. | +| `org:remove_member` | Remove a member from an organization. | + +### SQF Examples + +#### Retrieving an Organization + +```sqf +// Get organization by ID +private _result = "forge_server" callExtension ["org:get", ["elite_squad"]]; +private _orgData = fromJSON (_result select 0); + +// Access data +private _name = _orgData get "name"; +private _leader = _orgData get "leader"; +``` + +#### Creating an Organization + +```sqf +// Prepare data using HashMap +private _data = createHashMapFromArray [ + ["name", "Elite Squad"], + ["description", "Best players"], + ["leader", getPlayerUID player], + ["max_members", 50], + ["type", "military"] +]; + +// Create the organization +private _result = "forge_server" callExtension ["org:create", ["elite_squad", toJSON _data]]; + +if ((_result select 0) find "Error:" == 0) then { + diag_log format ["Failed to create org: %1", _result select 0]; +} else { + private _createdOrg = fromJSON (_result select 0); + systemChat format ["Created organization: %1", _createdOrg get "name"]; +}; +``` + +#### Updating an Organization + +```sqf +// Prepare partial update +private _update = createHashMapFromArray [ + ["description", "Updated description"], + ["max_members", 100] +]; + +// Apply update +private _result = "forge_server" callExtension ["org:update", ["elite_squad", toJSON _update]]; +``` + +#### Managing Members + +```sqf +// Get members +private _result = "forge_server" callExtension ["org:get_members", ["elite_squad"]]; +private _members = fromJSON (_result select 0); + +// Add a member +private _addResult = "forge_server" callExtension ["org:add_member", ["elite_squad", "76561198123456789"]]; + +// Remove a member +private _removeResult = "forge_server" callExtension ["org:remove_member", ["elite_squad", "76561198123456789"]]; +``` + +#### Checking Existence + +```sqf +private _exists = "forge_server" callExtension ["org:exists", ["elite_squad"]]; + +if ((_exists select 0) == "true") then { + systemChat "Organization exists."; +}; +``` + +#### Deleting an Organization + +```sqf +// Permanently delete organization +private _result = "forge_server" callExtension ["org:delete", ["elite_squad"]]; + +if ((_result select 0) == "OK") then { + systemChat "Organization deleted."; +}; +``` + +## Actor Management + +The Actor module handles all player-related operations, including data retrieval, creation, updates, and existence checks. It features automatic Steam UID resolution and robust error handling. + +### Available Commands + +| Command | Description | +|---------|-------------| +| `actor:get` | Retrieve actor data by key or UID. | +| `actor:create` | Create a new actor with provided JSON data. | +| `actor:update` | Update an existing actor with partial JSON data. | +| `actor:exists` | Check if an actor exists in the database. | +| `actor:delete` | Permanently remove an actor and their data. | + +### SQF Examples + +The extension is designed to work seamlessly with modern Arma 3 SQF features like `HashMap` and `toJSON`/`fromJSON`. + +#### Retrieving an Actor + +```sqf +// Get actor by Steam UID +private _result = "forge_server" callExtension ["actor:get", ["76561198123456789"]]; +private _actorData = fromJSON (_result select 0); + +// Access data +private _name = _actorData get "name"; +private _bank = _actorData get "bank"; +``` + +#### Creating an Actor + +```sqf +// Prepare data using HashMap +private _data = createHashMapFromArray [ + ["name", "John Doe"], + ["bank", 1000], + ["cash", 100], + ["level", 1], + ["class", "civilian"] +]; + +// Create the actor +private _result = "forge_server" callExtension ["actor:create", ["player123", toJSON _data]]; + +if ((_result select 0) find "Error:" == 0) then { + diag_log format ["Failed to create actor: %1", _result select 0]; +} else { + private _createdActor = fromJSON (_result select 0); + systemChat format ["Welcome, %1!", _createdActor get "name"]; +}; +``` + +#### Updating an Actor + +```sqf +// Prepare partial update +private _update = createHashMapFromArray [ + ["bank", 1500], + ["level", 2] +]; + +// Apply update +private _result = "forge_server" callExtension ["actor:update", ["player123", toJSON _update]]; +``` + +#### Checking Existence + +```sqf +private _exists = "forge_server" callExtension ["actor:exists", ["player123"]]; + +if ((_exists select 0) == "true") then { + systemChat "Player profile found."; +} else { + systemChat "Player profile not found."; +}; +``` + +#### Deleting an Actor + +```sqf +// Permanently delete actor data +private _result = "forge_server" callExtension ["actor:delete", ["player123"]]; + +if ((_result select 0) == "OK") then { + systemChat "Actor deleted successfully."; +}; +``` + +## Error Handling + +The extension uses a consistent error reporting format. If an operation fails, the returned string will start with `Error: ` followed by a descriptive message. + +- **Consistent Responses**: All commands return JSON on success or an error message on failure. +- **No Fallbacks**: `actor:get` and `org:get` will return error messages if the requested entity cannot be found, rather than fallback objects with dummy data. +- **Validation**: All input data is validated against the strict schema defined in the models. Invalid data will result in an error message. + +### Example Error Handling + +```sqf +private _result = "forge_server" callExtension ["actor:get", ["76561198123456789"]]; +private _response = _result select 0; + +if (_response find "Error:" == 0) then { + diag_log format ["Failed to get actor: %1", _response]; +} else { + private _actorData = fromJSON _response; + systemChat format ["Welcome, %1!", _actorData get "name"]; +}; +``` + +## Performance + +- **Asynchronous Core**: Built on `tokio`, the extension performs heavy I/O operations (like database writes) without blocking the Arma 3 simulation thread. +- **Connection Pooling**: Uses a Redis connection pool to efficiently manage database connections. +- **Lazy Initialization**: Services are initialized only when first needed, reducing startup time. +- **Minimal Serialization**: Only necessary data is serialized and transferred between Rust and SQF to minimize overhead. + +## Contributing + +We welcome contributions to the Forge Extension! This guide will help you understand how to add new commands and maintain the existing codebase. + +### Adding a Command to an Existing Module + +To add a new command to an existing module (e.g., `actor:set_position`), follow these steps: + +1. **Register the Command**: In the module file (e.g., `src/actor.rs`), add the command to the `group()` function. + ```rust + pub fn group() -> Group { + Group::new() + .command("get", get_actor) + .command("exists", exists_actor) + .command("create", create_actor) + .command("update", update_actor) + .command("delete", delete_actor) + .command("set_position", set_actor_position) // New command + } + ``` + +2. **Implement the Handler Function**: Create the function that handles the command logic. + ```rust + use crate::log::log; + + /// Sets the position of an actor. + pub fn set_actor_position(call_context: CallContext, key: String, position: String) -> String { + log("actor", "DEBUG", &format!("Setting position for key: {}", key)); + + // 1. Resolve UID + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => uid, + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + // 2. Parse and validate input + let position_data: Vec = match serde_json::from_str(&position) { + Ok(data) => data, + Err(e) => { + let error_msg = format!("Error: Invalid position JSON: {}", e); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + // 3. Get the actor, update position, and save + match ACTOR_SERVICE.get_actor(resolved_uid.clone()) { + Ok(mut actor) => { + actor.set_position(position_data); + + match ACTOR_SERVICE.update_actor(actor.clone()) { + Ok(_) => { + log("actor", "INFO", &format!("Updated position for: {}", resolved_uid)); + match serde_json::to_string(&actor) { + Ok(json) => json, + Err(e) => format!("Error: Failed to serialize actor: {}", e), + } + } + Err(e) => format!("Error: {}", e), + } + } + Err(e) => format!("Error: {}", e), + } + } + ``` + +### Creating a New Module + +To create a new module (e.g., `vehicle`), follow these steps: + +1. **Create the Module File**: Add `src/vehicle.rs`. +2. **Create the Global Service Instance**: Define a lazily initialized singleton service. + ```rust + use std::sync::LazyLock; + use forge_services::VehicleService; + use forge_repositories::RedisVehicleRepository; + use crate::adapters::ExtensionRedisClient; + + static VEHICLE_SERVICE: LazyLock>> = + LazyLock::new(|| { + let redis_client = ExtensionRedisClient::new(); + let repository = RedisVehicleRepository::new(redis_client); + VehicleService::new(repository) + }); + ``` +3. **Register the Command**: In the module file, register the command in the `group()` function. + ```rust + pub fn group() -> Group { + Group::new() + .command("get", get_vehicle) + .command("create", create_vehicle) + // ... other commands + } + ``` +4. **Use Logging**: Import and use the generic `log` function in your handler functions. + ```rust + use crate::log::log; + + pub fn get_vehicle(key: String) -> String { + log("vehicle", "DEBUG", &format!("Getting vehicle for key: {}", key)); + + // Call service layer + match VEHICLE_SERVICE.get_vehicle(key.clone()) { + Ok(vehicle) => { + log("vehicle", "INFO", &format!("Successfully retrieved vehicle: {}", key)); + match serde_json::to_string(&vehicle) { + Ok(json) => { + log("vehicle", "DEBUG", &format!("Serialized vehicle to JSON: {}", json)); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize vehicle: {}", e); + log("vehicle", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log("vehicle", "ERROR", &format!("Failed to get vehicle '{}': {}", key, e)); + error_msg + } + } + } + ``` + + The `log` function takes three parameters: + - `category`: The log category (e.g., "vehicle", "actor", "org") + - `level`: The log level ("INFO", "DEBUG", "WARN", "ERROR") + - `message`: The message to log + + Log files are created automatically in `@forge_server/logs/{category}.log`. + +5. **Register the Module** (if new): If you created a new module, add it to `src/lib.rs`. + ```rust + pub mod vehicle; + + // In the extension function, register the group + extension.group("vehicle", vehicle::group()); + ``` + +### Testing + +- **In-Game Testing**: Test your commands in Arma 3 to ensure they work correctly with SQF. +- **Error Cases**: Test error scenarios (invalid input, missing entities, etc.) to ensure proper error messages. + +### Best Practices + +- **Return Types**: Always return `String` (JSON on success, error message on failure). +- **Error Messages**: Prefix all error messages with `"Error: "` for consistency. +- **Logging**: Use the `log(category, level, message)` function to track operations. +- **Service Layer**: Delegate business logic to the service layer. The extension layer should only handle parameter parsing and response formatting. +- **Validation**: Validate inputs before calling the service layer to provide clear error messages. diff --git a/arma/server/extension/config.example.toml b/arma/server/extension/config.example.toml new file mode 100644 index 0000000..2f0e061 --- /dev/null +++ b/arma/server/extension/config.example.toml @@ -0,0 +1,35 @@ +# Crate Server Configuration +# Copy this file to config.toml and modify as needed +# Place this file in the same directory as your crate_server_x64.dll + +[redis] +# Redis server connection settings +host = "127.0.0.1" +port = 6379 +db = 0 # Redis database number (0-15) + +# Optional authentication +# username = "your_username" +# password = "your_password" + +# Optional connection pool settings +max_connections = 10 # Maximum number of connections in pool +min_connections = 2 # Minimum number of idle connections +idle_timeout = 60 # Idle connection timeout in seconds + +# Example configurations for different environments: + +# Development (local Redis) +# host = "127.0.0.1" +# port = 6379 +# max_connections = 5 +# min_connections = 1 + +# Production (remote Redis with auth) +# host = "redis.example.com" +# port = 6379 +# username = "arma_server" +# password = "secure_password_here" +# max_connections = 20 +# min_connections = 5 +# idle_timeout = 30 diff --git a/arma/server/extension/src/actor.rs b/arma/server/extension/src/actor.rs new file mode 100644 index 0000000..892b268 --- /dev/null +++ b/arma/server/extension/src/actor.rs @@ -0,0 +1,308 @@ +//! Actor management operations for the Arma 3 server extension. +//! +//! Provides Arma 3 extension commands for player data storage, retrieval, and updates. +//! Handles SQF command mapping and parameter validation. + +use arma_rs::{CallContext, Group}; +use forge_repositories::RedisActorRepository; +use forge_services::ActorService; +use std::sync::LazyLock; + +use crate::adapters::ExtensionRedisClient; +use crate::helpers::resolve_uid; +use crate::log::log; + +/// Global actor service instance. +/// +/// Lazily initialized singleton combining Redis adapter, repository, and service layers. +static ACTOR_SERVICE: LazyLock>> = + LazyLock::new(|| { + let redis_client = ExtensionRedisClient::new(); + let repository = RedisActorRepository::new(redis_client); + ActorService::new(repository) + }); + +/// Creates the Arma 3 command group for actor operations. +/// +/// Registers commands: `get`, `exists`, `create`, `update`, `delete`. +pub fn group() -> Group { + Group::new() + .command("get", get_actor) + .command("exists", actor_exists) + .command("create", create_actor) + .command("update", update_actor) + .command("delete", delete_actor) +} + +/// Retrieves an actor by key/UID. +/// +/// Resolves the key to a Steam UID and returns the actor as JSON. +/// Returns an error message if resolution fails or retrieval fails. +pub fn get_actor(call_context: CallContext, key: String) -> String { + log("actor", "DEBUG", &format!("Getting actor for key: {}", key)); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("actor", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + match ACTOR_SERVICE.get_actor(resolved_uid.clone()) { + Ok(actor) => { + log( + "actor", + "INFO", + &format!("Successfully retrieved actor: {}", resolved_uid), + ); + match serde_json::to_string(&actor) { + Ok(json) => { + log( + "actor", + "DEBUG", + &format!("Serialized actor to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize actor: {}", e); + log("actor", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "actor", + "ERROR", + &format!("Failed to get actor '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Creates a new actor with the provided JSON data. +/// +/// Resolves key to UID, validates JSON data, and persists the new actor. +pub fn create_actor(call_context: CallContext, key: String, json_data: String) -> String { + log( + "actor", + "DEBUG", + &format!("Creating actor for key: {} with data: {}", key, json_data), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "actor", + "DEBUG", + &format!("Resolved UID for creation: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + match ACTOR_SERVICE.create_actor(resolved_uid.clone(), json_data) { + Ok(actor) => { + log( + "actor", + "INFO", + &format!("Successfully created actor: {}", resolved_uid), + ); + match serde_json::to_string(&actor) { + Ok(json) => { + log( + "actor", + "DEBUG", + &format!("Serialized actor to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize actor: {}", e); + log("actor", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "actor", + "ERROR", + &format!("Failed to create actor '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Updates an existing actor with JSON data. +/// +/// Resolves key to UID, applies partial updates from JSON, and persists changes. +pub fn update_actor(call_context: CallContext, key: String, json_update: String) -> String { + log( + "actor", + "DEBUG", + &format!("Updating actor for key: {} with data: {}", key, json_update), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "actor", + "DEBUG", + &format!("Resolved UID for update: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + match ACTOR_SERVICE.update_actor(resolved_uid.clone(), json_update) { + Ok(actor) => { + log( + "actor", + "INFO", + &format!("Successfully updated actor: {}", resolved_uid), + ); + match serde_json::to_string(&actor) { + Ok(json) => { + log( + "actor", + "DEBUG", + &format!("Serialized updated actor to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize actor: {}", e); + log("actor", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "actor", + "ERROR", + &format!("Failed to update actor '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Checks if an actor exists in the database. +/// +/// Returns "true" if the actor exists, "false" otherwise. +pub fn actor_exists(call_context: CallContext, key: String) -> String { + log( + "actor", + "DEBUG", + &format!("Checking if actor exists for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "actor", + "DEBUG", + &format!("Resolved UID for existence check: {}", uid), + ); + uid + } + None => { + log( + "actor", + "WARN", + &format!("Failed to resolve UID for key: {}", key), + ); + return "false".to_string(); + } + }; + + match ACTOR_SERVICE.actor_exists(resolved_uid.clone()) { + Ok(exists) => { + let result = if exists { "true" } else { "false" }; + log( + "actor", + "DEBUG", + &format!("Actor '{}' exists: {}", resolved_uid, result), + ); + result.to_string() + } + Err(e) => { + log( + "actor", + "ERROR", + &format!("Failed to check if actor '{}' exists: {}", resolved_uid, e), + ); + "false".to_string() + } + } +} + +/// Permanently deletes an actor. +/// +/// Resolves key to UID and removes the actor and associated data. +pub fn delete_actor(call_context: CallContext, key: String) -> String { + log( + "actor", + "DEBUG", + &format!("Deleting actor for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "actor", + "DEBUG", + &format!("Resolved UID for deletion: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("actor", "ERROR", &error_msg); + return error_msg; + } + }; + + match ACTOR_SERVICE.delete_actor(resolved_uid.clone()) { + Ok(_) => { + log( + "actor", + "INFO", + &format!("Successfully deleted actor: {}", resolved_uid), + ); + "OK".to_string() + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "actor", + "ERROR", + &format!("Failed to delete actor '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} diff --git a/arma/server/extension/src/adapters/README.md b/arma/server/extension/src/adapters/README.md new file mode 100644 index 0000000..311a2f4 --- /dev/null +++ b/arma/server/extension/src/adapters/README.md @@ -0,0 +1,261 @@ +# Adapters Module + +This module provides adapter implementations that bridge the repository layer with the extension's Redis operations. Adapters translate between the generic `RedisClient` trait and the extension-specific Redis module. + +## Architecture + +The adapters module follows the **Adapter Pattern**, allowing the repository layer to remain decoupled from the specific Redis implementation: + +```mermaid +graph TD + Repo[Repository Layer
#40;forge-repositories#41;] + Trait[RedisClient Trait
#40;forge-shared#41;] + Adapter[ExtensionRedisClient
#40;adapter#41;] + Redis[Redis Module
#40;extension#41;] + + Repo --> Trait + Trait --> Adapter + Adapter --> Redis +``` + +This design enables: +- **Testability**: Repositories can use mock adapters for testing +- **Flexibility**: Different Redis implementations can be swapped without changing repositories +- **Separation of Concerns**: Repository logic is independent of Redis connection details + +## ExtensionRedisClient + +The `ExtensionRedisClient` is the primary adapter that implements the `RedisClient` trait from `forge_shared`. + +### Responsibilities + +- **Translate Calls**: Convert trait method calls to Redis module function calls +- **Error Handling**: Parse Redis operation results and convert to `Result` types +- **Data Transformation**: Handle response parsing (e.g., JSON arrays for lists/sets) +- **Logging**: Log debug information for Redis operations + +### Implemented Operations + +#### Hash Operations + +| Method | Description | Returns | +|--------|-------------|---------| +| `hash_mset` | Set multiple fields atomically | `Result<(), String>` | +| `hash_get_all` | Get all fields and values | `Result` | +| `hash_get` | Get a single field value | `Result` | +| `hash_del` | Delete a field | `Result<(), String>` | + +#### List Operations + +| Method | Description | Returns | +|--------|-------------|---------| +| `list_rpush` | Append to list | `Result<(), String>` | +| `list_range` | Get range of elements | `Result, String>` | +| `list_del` | Remove by value | `Result<(), String>` | + +#### Set Operations + +| Method | Description | Returns | +|--------|-------------|---------| +| `set_add` | Add member | `Result<(), String>` | +| `set_members` | Get all members | `Result, String>` | +| `set_del` | Remove member | `Result<(), String>` | + +#### Common Operations + +| Method | Description | Returns | +|--------|-------------|---------| +| `key_exists` | Check if key exists | `Result` | +| `delete_key` | Delete key | `Result<(), String>` | + +### Usage Example + +```rust +use crate::adapters::ExtensionRedisClient; +use forge_shared::RedisClient; + +// Create the adapter +let client = ExtensionRedisClient::new(); + +// Use it with the RedisClient trait +let fields = vec![ + ("name".to_string(), "John".to_string()), + ("age".to_string(), "30".to_string()), +]; +client.hash_mset("user:123".to_string(), fields)?; + +// Retrieve data +let data = client.hash_get_all("user:123".to_string())?; +``` + +## Error Handling + +The adapter translates Redis string responses to Rust `Result` types: + +- **Success**: Returns `Ok(value)` with the appropriate type +- **Error**: Returns `Err(message)` if the response starts with "Error:" + +```rust +// Redis module returns "OK" → Adapter returns Ok(()) +// Redis module returns "Error: Connection failed" → Adapter returns Err("Error: Connection failed") +``` + +### Response Parsing + +For operations that return collections, the adapter parses JSON responses: + +```rust +// list_range returns JSON: ["item1", "item2", "item3"] +let items = client.list_range("mylist".to_string(), 0, -1)?; +// items: Vec = vec!["item1", "item2", "item3"] +``` + +## Contributing + +We welcome contributions to the adapters module! Follow these guidelines to add new adapter methods or create new adapters. + +### Adding a New Method to ExtensionRedisClient + +To add a new method (e.g., `hash_exists`), follow these steps: + +1. **Check the Trait**: Ensure the method is defined in the `RedisClient` trait in `forge_shared`. + ```rust + // In forge_shared/src/redis_client.rs + pub trait RedisClient: Send + Sync { + fn hash_exists(&self, key: String, field: String) -> Result; + } + ``` + +2. **Implement the Method**: Add the implementation to `ExtensionRedisClient`. + ```rust + impl RedisClient for ExtensionRedisClient { + fn hash_exists(&self, key: String, field: String) -> Result { + // Call the Redis module function + let result = redis::hash::hash_exists(key, field); + + // Parse the response + match result.as_str() { + "1" => Ok(true), + "0" => Ok(false), + _ if result.starts_with("Error:") => Err(result), + _ => Err(format!("Unexpected response: {}", result)), + } + } + } + ``` + +3. **Add Logging** (if needed): For debugging, log the operation. + ```rust + fn hash_exists(&self, key: String, field: String) -> Result { + let result = redis::hash::hash_exists(key, field); + log("debug", "DEBUG", &format!("hash_exists({}, {}): {}", key, field, result)); + + match result.as_str() { + "1" => Ok(true), + "0" => Ok(false), + _ if result.starts_with("Error:") => Err(result), + _ => Err(format!("Unexpected response: {}", result)), + } + } + ``` + +4. **Handle Response Types**: Match the return type to the trait signature. + - **Unit type** (`()`): Return `Ok(())` on success + - **Boolean**: Parse "1"/"0" to `true`/`false` + - **String**: Return the value directly + - **Vec**: Parse JSON array response + - **Number**: Parse string to number + +### Creating a New Adapter + +To create a new adapter (e.g., `MockRedisClient` for testing): + +1. **Create the Module File**: Add `src/adapters/mock_client.rs`. +2. **Define the Struct**: Create the adapter struct. + ```rust + use forge_shared::RedisClient; + use std::collections::HashMap; + use std::sync::RwLock; + + /// Mock Redis client for testing. + /// + /// Uses RwLock to allow multiple concurrent readers while maintaining thread safety. + pub struct MockRedisClient { + data: RwLock>, + } + + impl MockRedisClient { + pub fn new() -> Self { + Self { + data: RwLock::new(HashMap::new()), + } + } + } + ``` + +3. **Implement the Trait**: Implement all `RedisClient` methods. + ```rust + impl RedisClient for MockRedisClient { + fn hash_mset(&self, key: String, fields: Vec<(String, String)>) -> Result<(), String> { + // Acquire write lock only when modifying data + let mut data = self.data.write().unwrap(); + for (field, value) in fields { + let hash_key = format!("{}:{}", key, field); + data.insert(hash_key, value); + } + Ok(()) + } + + fn hash_get(&self, key: String, field: String) -> Result { + // Acquire read lock - multiple threads can read concurrently + let data = self.data.read().unwrap(); + let hash_key = format!("{}:{}", key, field); + Ok(data.get(&hash_key) + .map(|v| v.clone()) + .unwrap_or_default()) + } + + // ... implement other methods + } + ``` + +4. **Register the Module**: Add to `src/adapters/mod.rs`. + ```rust + pub mod redis_client; + pub mod mock_client; + + pub use redis_client::ExtensionRedisClient; + pub use mock_client::MockRedisClient; + ``` + +### Concurrency Best Practices + +> [!IMPORTANT] +> Choose the right synchronization primitive based on your access patterns and performance requirements. + +**Recommended Synchronization Primitives:** + +| Primitive | Use Case | Performance | Dependency | +|-----------|----------|-------------|------------| +| **`RwLock`** | Read-heavy workloads, concurrent readers | Good (multiple readers) | Standard library | +| **`Mutex`** | Write-heavy or exclusive access required | Fair (single lock) | Standard library | +| **`DashMap`** | Extreme high-frequency reads/writes | Excellent (lock-free) | External crate | + +**When to use each:** +- **`RwLock`**: Best for most use cases. Allows multiple concurrent readers, only blocks on writes. Use this by default. +- **`Mutex`**: Only when you need exclusive access or operations are very lightweight (< 1μs). +- **`DashMap`**: When profiling shows `RwLock` is a bottleneck and you need lock-free performance. + +**Why avoid `Mutex` for read-heavy workloads?** +- Blocks all threads (readers and writers) on every access +- No concurrent reads possible +- Can cause performance bottlenecks in high-concurrency scenarios + +### Best Practices + +- **Error Consistency**: Always check for "Error:" prefix in Redis responses +- **Type Safety**: Ensure return types match the trait signature exactly +- **Logging**: Log operations at DEBUG level for troubleshooting +- **Response Parsing**: Handle all possible response formats (success, error, unexpected) +- **Documentation**: Document the purpose and behavior of each method +- **Testing**: Test adapters with both success and error scenarios diff --git a/arma/server/extension/src/adapters/mod.rs b/arma/server/extension/src/adapters/mod.rs new file mode 100644 index 0000000..6fa6c1c --- /dev/null +++ b/arma/server/extension/src/adapters/mod.rs @@ -0,0 +1,3 @@ +pub mod redis_client; + +pub use redis_client::ExtensionRedisClient; diff --git a/arma/server/extension/src/adapters/redis_client.rs b/arma/server/extension/src/adapters/redis_client.rs new file mode 100644 index 0000000..298d963 --- /dev/null +++ b/arma/server/extension/src/adapters/redis_client.rs @@ -0,0 +1,148 @@ +use crate::log::log; +use crate::redis; +use forge_shared::RedisClient; + +/// Redis client implementation that bridges the repository layer with the extension's Redis module. +pub struct ExtensionRedisClient; + +impl ExtensionRedisClient { + /// Creates a new instance of the Redis client adapter. + pub fn new() -> Self { + Self + } +} + +impl RedisClient for ExtensionRedisClient { + /// Sets multiple fields in a Redis hash. + fn hash_mset(&self, key: String, fields: Vec<(String, String)>) -> Result<(), String> { + let result = redis::hash::hash_mset(key, fields); + if result == "OK" { Ok(()) } else { Err(result) } + } + + /// Retrieves all fields and values from a Redis hash. + fn hash_get_all(&self, key: String) -> Result { + let result = redis::hash::hash_get_all(key); + log("debug", "DEBUG", &result); + + if result.starts_with("Error:") { + Err(result) + } else { + Ok(result) + } + } + + /// Retrieves a single field value from a Redis hash. + fn hash_get(&self, key: String, field: String) -> Result { + let result = redis::hash::hash_get(key, field); + log("debug", "DEBUG", &result); + + if result.starts_with("Error:") { + Err(result) + } else { + Ok(result) + } + } + + /// Deletes a specific field from a Redis hash. + fn hash_del(&self, key: String, field: String) -> Result<(), String> { + let result = redis::hash::hash_del(key, field); + log("debug", "DEBUG", &result); + + if result.starts_with("Error:") { + Err(result) + } else { + Ok(()) + } + } + + /// Appends a value to the end of a Redis list. + fn list_rpush(&self, key: String, value: String) -> Result<(), String> { + let result = redis::list::list_rpush(key, value); + if result.starts_with("Error:") { + Err(result) + } else { + Ok(()) + } + } + + /// Retrieves a range of elements from a Redis list. + fn list_range(&self, key: String, start: isize, end: isize) -> Result, String> { + let result = redis::list::list_range(key, start, end); + log("debug", "DEBUG", &result); + + if result.starts_with("Error:") { + Err(result) + } else { + // Parse the JSON array response + match serde_json::from_str::>(&result) { + Ok(values) => Ok(values), + Err(e) => Err(format!("Failed to parse list response: {}", e)), + } + } + } + + /// Removes elements from a Redis list by value. + fn list_del(&self, key: String, count: isize, value: String) -> Result<(), String> { + let result = redis::list::list_del(key, count, value); + if result.starts_with("Error:") { + Err(result) + } else { + Ok(()) + } + } + + /// # Set operations + + /// Adds a member to a Redis set. + fn set_add(&self, key: String, member: String) -> Result<(), String> { + let result = redis::set::set_add(key, member); + if result.starts_with("Error:") { + Err(result) + } else { + Ok(()) + } + } + + /// Retrieves all members from a Redis set. + fn set_members(&self, key: String) -> Result, String> { + let result = redis::set::set_members(key); + if result.starts_with("Error:") { + Err(result) + } else { + match serde_json::from_str::>(&result) { + Ok(values) => Ok(values), + Err(e) => Err(format!("Failed to parse set members response: {}", e)), + } + } + } + + /// Removes a member from a Redis set. + fn set_del(&self, key: String, member: String) -> Result<(), String> { + let result = redis::set::set_del(key, member); + if result.starts_with("Error:") { + Err(result) + } else { + Ok(()) + } + } + + /// Checks if a Redis key exists. + fn key_exists(&self, key: String) -> Result { + let result = redis::common::key_exists(key); + match result.as_str() { + "1" => Ok(true), + "0" => Ok(false), + _ => Err(format!("Unexpected Redis response: {}", result)), + } + } + + /// Deletes a Redis key and all its associated data. + fn delete_key(&self, key: String) -> Result<(), String> { + let result = redis::common::delete_key(key); + if result.starts_with("Error:") { + Err(result) + } else { + Ok(()) + } + } +} diff --git a/arma/server/extension/src/bank.rs b/arma/server/extension/src/bank.rs new file mode 100644 index 0000000..46a67a2 --- /dev/null +++ b/arma/server/extension/src/bank.rs @@ -0,0 +1,304 @@ +//! Bank management operations for the Arma 3 server extension. +//! +//! Provides Arma 3 extension commands for player data storage, retrieval, and updates. +//! Handles SQF command mapping and parameter validation. + +use arma_rs::{CallContext, Group}; +use forge_repositories::RedisBankRepository; +use forge_services::BankService; +use std::sync::LazyLock; + +use crate::adapters::ExtensionRedisClient; +use crate::helpers::resolve_uid; +use crate::log::log; + +/// Global bank service instance. +/// +/// Lazily initialized singleton combining Redis adapter, repository, and service layers. +static BANK_SERVICE: LazyLock>> = + LazyLock::new(|| { + let redis_client = ExtensionRedisClient::new(); + let repository = RedisBankRepository::new(redis_client); + BankService::new(repository) + }); + +/// Creates the Arma 3 command group for bank operations. +/// +/// Registers commands: `get`, `exists`, `create`, `update`, `delete`. +pub fn group() -> Group { + Group::new() + .command("get", get_bank) + .command("exists", bank_exists) + .command("create", create_bank) + .command("update", update_bank) + .command("delete", delete_bank) +} + +/// Retrieves an bank by key/UID. +/// +/// Resolves the key to a Steam UID and returns the bank as JSON. +/// Returns an error message if resolution fails or retrieval fails. +pub fn get_bank(call_context: CallContext, key: String) -> String { + log("bank", "DEBUG", &format!("Getting bank for key: {}", key)); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log("bank", "DEBUG", &format!("Resolved UID: {}", uid)); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("bank", "ERROR", &error_msg); + return error_msg; + } + }; + + match BANK_SERVICE.get_bank(resolved_uid.clone()) { + Ok(bank) => { + log( + "bank", + "INFO", + &format!("Successfully retrieved bank: {}", resolved_uid), + ); + match serde_json::to_string(&bank) { + Ok(json) => { + log( + "bank", + "DEBUG", + &format!("Serialized bank to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize bank: {}", e); + log("bank", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "bank", + "ERROR", + &format!("Failed to get bank '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Creates a new bank with the provided JSON data. +/// +/// Resolves key to UID, validates JSON data, and persists the new bank. +pub fn create_bank(call_context: CallContext, key: String, json_data: String) -> String { + log( + "bank", + "DEBUG", + &format!("Creating bank for key: {} with data: {}", key, json_data), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "bank", + "DEBUG", + &format!("Resolved UID for creation: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("bank", "ERROR", &error_msg); + return error_msg; + } + }; + + match BANK_SERVICE.create(resolved_uid.clone(), json_data) { + Ok(bank) => { + log( + "bank", + "INFO", + &format!("Successfully created bank: {}", resolved_uid), + ); + match serde_json::to_string(&bank) { + Ok(json) => { + log( + "bank", + "DEBUG", + &format!("Serialized bank to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize bank: {}", e); + log("bank", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "bank", + "ERROR", + &format!("Failed to create bank '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Updates an existing bank with JSON data. +/// +/// Resolves key to UID, applies partial updates from JSON, and persists changes. +pub fn update_bank(call_context: CallContext, key: String, json_update: String) -> String { + log( + "bank", + "DEBUG", + &format!("Updating bank for key: {} with data: {}", key, json_update), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "bank", + "DEBUG", + &format!("Resolved UID for update: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("bank", "ERROR", &error_msg); + return error_msg; + } + }; + + match BANK_SERVICE.update_bank(resolved_uid.clone(), json_update) { + Ok(bank) => { + log( + "bank", + "INFO", + &format!("Successfully updated bank: {}", resolved_uid), + ); + match serde_json::to_string(&bank) { + Ok(json) => { + log( + "bank", + "DEBUG", + &format!("Serialized updated bank to JSON: {}", json), + ); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize bank: {}", e); + log("bank", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "bank", + "ERROR", + &format!("Failed to update bank '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} + +/// Checks if an bank exists in the database. +/// +/// Returns "true" if the bank exists, "false" otherwise. +pub fn bank_exists(call_context: CallContext, key: String) -> String { + log( + "bank", + "DEBUG", + &format!("Checking if bank exists for key: {}", key), + ); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "bank", + "DEBUG", + &format!("Resolved UID for existence check: {}", uid), + ); + uid + } + None => { + log( + "bank", + "WARN", + &format!("Failed to resolve UID for key: {}", key), + ); + return "false".to_string(); + } + }; + + match BANK_SERVICE.bank_exists(resolved_uid.clone()) { + Ok(exists) => { + let result = if exists { "true" } else { "false" }; + log( + "bank", + "DEBUG", + &format!("Bank '{}' exists: {}", resolved_uid, result), + ); + result.to_string() + } + Err(e) => { + log( + "bank", + "ERROR", + &format!("Failed to check if bank '{}' exists: {}", resolved_uid, e), + ); + "false".to_string() + } + } +} + +/// Permanently deletes an bank. +/// +/// Resolves key to UID and removes the bank and associated data. +pub fn delete_bank(call_context: CallContext, key: String) -> String { + log("bank", "DEBUG", &format!("Deleting bank for key: {}", key)); + + let resolved_uid = match resolve_uid(&key, &call_context) { + Some(uid) => { + log( + "bank", + "DEBUG", + &format!("Resolved UID for deletion: {}", uid), + ); + uid + } + None => { + let error_msg = format!("Error: Failed to resolve UID for key: {}", key); + log("bank", "ERROR", &error_msg); + return error_msg; + } + }; + + match BANK_SERVICE.delete_bank(resolved_uid.clone()) { + Ok(_) => { + log( + "bank", + "INFO", + &format!("Successfully deleted bank: {}", resolved_uid), + ); + "OK".to_string() + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "bank", + "ERROR", + &format!("Failed to delete bank '{}': {}", resolved_uid, e), + ); + error_msg + } + } +} diff --git a/arma/server/extension/src/helpers.rs b/arma/server/extension/src/helpers.rs new file mode 100644 index 0000000..dfd6b6d --- /dev/null +++ b/arma/server/extension/src/helpers.rs @@ -0,0 +1,12 @@ +use arma_rs::CallContext; + +pub fn resolve_uid(uid: &str, call_context: &CallContext) -> Option { + if !uid.is_empty() && uid != "_SP_PLAYER_" { + return Some(uid.to_string()); + } + + match call_context.caller() { + arma_rs::Caller::Steam(steam_id) => Some(steam_id.to_string()), + arma_rs::Caller::Unknown => None, + } +} diff --git a/arma/server/extension/src/lib.rs b/arma/server/extension/src/lib.rs new file mode 100644 index 0000000..e780192 --- /dev/null +++ b/arma/server/extension/src/lib.rs @@ -0,0 +1,106 @@ +//! Entry point and runtime bootstrap for the Forge Arma server extension. +//! +//! Initializes a global async runtime, the Redis connection pool, and registers +//! all command groups. Provides status/version commands and maintains a shared +//! Arma `Context` for engine interop. +//! +use arma_rs::{Context, Extension, arma}; +use std::sync::{LazyLock, OnceLock, RwLock as StdRwLock}; +use tokio::runtime::{Builder, Runtime}; +use tokio::sync::RwLock as TokioRwLock; + +pub mod actor; +pub mod adapters; +pub mod bank; +pub mod helpers; +mod log; +pub mod org; +pub mod redis; + +/// Global Arma `Context` captured at initialization and made available to +/// commands that need engine interop. Stored inside an async `RwLock` to +/// allow mutation by the startup task and later reads. +static CONTEXT: LazyLock>> = LazyLock::new(|| TokioRwLock::new(None)); +/// Global Redis connection pool, created once and shared by all commands. +/// Initialized asynchronously after `init()` returns so the extension starts +/// quickly without blocking the main thread. +static REDIS_POOL: OnceLock = OnceLock::new(); +/// Global multi-threaded Tokio runtime used to execute async operations from +/// command handlers and startup tasks. +static RUNTIME: LazyLock = LazyLock::new(|| { + Builder::new_multi_thread() + .enable_all() + .build() + .expect("Failed to create tokio runtime") +}); + +#[derive(Clone, Copy, PartialEq)] +/// Connection state for the Redis pool so SQF can gate behavior on readiness. +enum ConnectionState { + Initializing, + Connected, + Failed, +} +static CONNECTION_STATE: LazyLock> = + LazyLock::new(|| StdRwLock::new(ConnectionState::Initializing)); + +#[arma] +/// Initializes the extension, registers commands/groups, and asynchronously +/// creates the Redis connection pool on the global runtime. +fn init() -> Extension { + let config = redis::config::load(); + let ext = Extension::build() + .command("version", get_version) + .command("status", get_status) + .group("redis", redis::group()) + .group("actor", actor::group()) + .group("bank", bank::group()) + .group("org", org::group()) + .finish(); + + let ctx = ext.context(); + + // Spawn the connection task on the runtime. + // This returns immediately, allowing Arma to continue. + RUNTIME.spawn(async move { + // Store context immediately if needed, or pass it to the connection logic + *CONTEXT.write().await = Some(ctx); + + let pool_result = redis::client::create_redis_pool(&config.redis).await; + let pool = match pool_result { + Ok(pool) => pool, + Err(_e) => { + // Log error, maybe try default config, or set state to Failed + let default_config = redis::RedisConfig::default(); + redis::client::create_redis_pool(&default_config) + .await + .expect("Failed to create default Redis pool") + } + }; + + if REDIS_POOL.set(pool).is_ok() { + *CONNECTION_STATE.write().unwrap() = ConnectionState::Connected; + } else { + *CONNECTION_STATE.write().unwrap() = ConnectionState::Failed; + } + }); + + ext +} + +/// Returns current Redis connection state as a string: `initializing`, +/// `connected`, or `failed`. Intended for SQF polling before issuing +/// operations that require Redis. +fn get_status() -> String { + let state = *CONNECTION_STATE.read().unwrap(); + match state { + ConnectionState::Initializing => "initializing".into(), + ConnectionState::Connected => "connected".into(), + ConnectionState::Failed => "failed".into(), + } +} + +/// Returns the extension version string for diagnostics and tooling. +pub fn get_version() -> String { + format!("forge-server v{}", env!("CARGO_PKG_VERSION")) +} diff --git a/arma/server/extension/src/lib.rs.bak b/arma/server/extension/src/lib.rs.bak new file mode 100644 index 0000000..68937f5 --- /dev/null +++ b/arma/server/extension/src/lib.rs.bak @@ -0,0 +1,54 @@ +use arma_rs::{Context, Extension, arma}; +use std::sync::{LazyLock, OnceLock}; +use tokio::runtime::{Builder, Runtime}; +use tokio::sync::RwLock; + +pub mod actor; +pub mod adapters; +pub mod helpers; +mod log; +pub mod org; +pub mod redis; + +static CONTEXT: LazyLock>> = LazyLock::new(|| RwLock::new(None)); +static REDIS_POOL: OnceLock = OnceLock::new(); +static RUNTIME: LazyLock = LazyLock::new(|| { + Builder::new_multi_thread() + .enable_all() + .build() + .expect("Failed to create tokio runtime") +}); + +#[arma] +fn init() -> Extension { + let config = redis::config::load(); + let ext = Extension::build() + .command("version", get_version) + .group("redis", redis::group()) + .group("actor", actor::group()) + .group("org", org::group()) + .finish(); + + let ctx = ext.context(); + + RUNTIME.block_on(async { + let pool = match redis::client::create_redis_pool(&config.redis).await { + Ok(pool) => pool, + Err(_) => { + let default_config = redis::RedisConfig::default(); + redis::client::create_redis_pool(&default_config) + .await + .expect("Failed to create Redis pool") + } + }; + + REDIS_POOL.set(pool).ok(); + *CONTEXT.write().await = Some(ctx); + }); + + ext +} + +pub fn get_version() -> String { + format!("forge-server v{}", env!("CARGO_PKG_VERSION")) +} diff --git a/arma/server/extension/src/log.rs b/arma/server/extension/src/log.rs new file mode 100644 index 0000000..8ec4660 --- /dev/null +++ b/arma/server/extension/src/log.rs @@ -0,0 +1,49 @@ +#![allow(dead_code)] + +use std::collections::HashMap; +use std::fs::{File, OpenOptions, create_dir_all}; +use std::io::Write; +use std::path::Path; +use std::sync::LazyLock; +use std::sync::Mutex; + +static LOG_FILES: LazyLock>> = LazyLock::new(|| { + let logs_dir = Path::new("@forge_server/logs"); + create_dir_all(logs_dir).expect("Failed to create logs directory"); + Mutex::new(HashMap::new()) +}); + +/// Generic logging function that creates log files on-demand. +/// +/// # Arguments +/// * `category` - The log category (e.g., "actor", "org", "vehicle") +/// * `level` - The log level (e.g., "INFO", "DEBUG", "WARN", "ERROR") +/// * `message` - The message to log +/// +/// # Example +/// ``` +/// log("actor", "INFO", "Actor created successfully"); +/// log("vehicle", "ERROR", "Failed to spawn vehicle"); +/// ``` +pub fn log(category: &str, level: &str, message: &str) { + let timestamp = chrono::Local::now().format("%Y-%m-%d %H:%M:%S"); + let log_entry = format!("[{}] [{}] {}\n", timestamp, level, message); + + if let Ok(mut files) = LOG_FILES.lock() { + // Get or create the log file for this category + let file = files.entry(category.to_string()).or_insert_with(|| { + let logs_dir = Path::new("@forge_server/logs"); + let filename = format!("{}.log", category); + let path = logs_dir.join(filename); + + OpenOptions::new() + .create(true) + .append(true) + .open(path) + .expect(&format!("Failed to open {} log file", category)) + }); + + let _ = file.write_all(log_entry.as_bytes()); + let _ = file.flush(); + } +} diff --git a/arma/server/extension/src/org.rs b/arma/server/extension/src/org.rs new file mode 100644 index 0000000..3f42545 --- /dev/null +++ b/arma/server/extension/src/org.rs @@ -0,0 +1,189 @@ +//! Organization management operations for the Arma 3 server extension. +//! +//! Provides Arma 3 extension commands for organization data storage, retrieval, and updates. +//! Handles SQF command mapping and parameter validation. + +use arma_rs::Group; +use forge_repositories::RedisOrgRepository; +use forge_services::OrgService; +use std::sync::LazyLock; + +use crate::adapters::ExtensionRedisClient; +use crate::log::log; + +/// Global organization service instance. +/// +/// Lazily initialized singleton combining Redis adapter, repository, and service layers. +static ORG_SERVICE: LazyLock>> = + LazyLock::new(|| { + let redis_client = ExtensionRedisClient::new(); + let repository = RedisOrgRepository::new(redis_client); + OrgService::new(repository) + }); + +/// Creates the Arma 3 command group for organization operations. +/// +/// Registers commands: `get`, `get_members`, `add_member`, `remove_member`, `exists`, `create`, `update`, `delete`. +pub fn group() -> Group { + Group::new() + .command("get", get_org) + .command("get_members", get_members) + .command("add_member", add_member) + .command("remove_member", remove_member) + .command("exists", org_exists) + .command("create", create_org) + .command("update", update_org) + .command("delete", delete_org) +} + +/// Retrieves an organization by key/ID. +/// +/// Returns the organization as JSON or an error message if not found. +pub fn get_org(key: String) -> String { + log( + "org", + "DEBUG", + &format!("Getting organization for key: {}", key), + ); + + match ORG_SERVICE.get_org(key.clone()) { + Ok(org) => { + log( + "org", + "INFO", + &format!("Successfully retrieved organization: {}", key), + ); + match serde_json::to_string(&org) { + Ok(json) => { + log("org", "DEBUG", &format!("Serialized org to JSON: {}", json)); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize org: {}", e); + log("org", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "org", + "ERROR", + &format!("Failed to get organization '{}': {}", key, e), + ); + error_msg + } + } +} + +/// Retrieves organization members as a JSON object. +/// +/// Returns a map of member UIDs to names. Returns empty object if not found. +pub fn get_members(key: String) -> String { + match ORG_SERVICE.get_members(key) { + Ok(members) => match serde_json::to_string(&members) { + Ok(json) => json, + Err(_) => "{}".to_string(), + }, + Err(_) => "{}".to_string(), + } +} + +/// Creates a new organization with the provided JSON data. +/// +/// Resolves key to ID, validates JSON data, and persists the new organization. +pub fn create_org(key: String, json_data: String) -> String { + log( + "org", + "DEBUG", + &format!( + "Creating organization for key: {} with data: {}", + key, json_data + ), + ); + + match ORG_SERVICE.create_org(key.clone(), json_data) { + Ok(org) => { + log( + "org", + "INFO", + &format!("Successfully created organization: {}", key), + ); + match serde_json::to_string(&org) { + Ok(json) => { + log("org", "DEBUG", &format!("Serialized org to JSON: {}", json)); + json + } + Err(e) => { + let error_msg = format!("Error: Failed to serialize org: {}", e); + log("org", "ERROR", &error_msg); + error_msg + } + } + } + Err(e) => { + let error_msg = format!("Error: {}", e); + log( + "org", + "ERROR", + &format!("Failed to create organization '{}': {}", key, e), + ); + error_msg + } + } +} + +/// Updates an existing organization with JSON data. +/// +/// Resolves key to ID, applies partial updates from JSON, and persists changes. +pub fn update_org(key: String, json_update: String) -> String { + match ORG_SERVICE.update_org(key, json_update) { + Ok(org) => match serde_json::to_string(&org) { + Ok(json) => json, + Err(e) => format!("Error: Failed to serialize org: {}", e), + }, + Err(e) => format!("Error: {}", e), + } +} + +/// Checks if an organization exists in the database. +/// +/// Returns "true" if the organization exists, "false" otherwise. +pub fn org_exists(key: String) -> String { + match ORG_SERVICE.org_exists(key) { + Ok(exists) => if exists { "true" } else { "false" }.to_string(), + Err(_) => "false".to_string(), + } +} + +/// Permanently deletes an organization. +/// +/// Resolves key to ID and removes the organization and associated data. +pub fn delete_org(key: String) -> String { + match ORG_SERVICE.delete_org(key) { + Ok(_) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } +} + +/// Adds a new member to an organization by their UID. +/// +/// Resolves organization key to ID and adds the member UID. +/// Redis sets automatically prevent duplicate members. +pub fn add_member(key: String, member_uid: String) -> String { + match ORG_SERVICE.add_member(key, member_uid) { + Ok(_) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } +} + +/// Removes a member from an organization by their UID. +/// +/// Resolves organization key to ID and removes the member UID. +pub fn remove_member(key: String, member_uid: String) -> String { + match ORG_SERVICE.remove_member(key, member_uid) { + Ok(_) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } +} diff --git a/arma/server/extension/src/redis/README.md b/arma/server/extension/src/redis/README.md new file mode 100644 index 0000000..7183ace --- /dev/null +++ b/arma/server/extension/src/redis/README.md @@ -0,0 +1,278 @@ +# Redis Module + +This module provides comprehensive Redis operations for the Forge extension, enabling persistent data storage and retrieval from SQF scripts. + +## Architecture + +The Redis module is organized into specialized operation groups: + +- **Common**: Basic key-value operations +- **Hash**: Structured data storage (field-value pairs) +- **List**: Ordered collections and queues +- **Set**: Unique collections and membership tracking + +## Connection Management + +### Connection Pool + +The module uses `bb8` for connection pooling, providing: +- **Automatic connection reuse**: Reduces overhead +- **Configurable pool size**: Control max/min connections +- **Idle timeout**: Prevents stale connections +- **Lazy initialization**: Pool created on first use + +### Configuration + +Redis connection settings are loaded from `@forge_server/config.toml`: + +```toml +[redis] +host = "127.0.0.1" +port = 6379 +password = "" # Optional +max_connections = 10 +min_connections = 2 +idle_timeout = 300 # seconds +``` + +## Common Operations + +Basic key-value operations for simple data storage. + +### Available Commands + +| Command | Description | Returns | +|---------|-------------|---------| +| `redis:common:set` | Set a string value | "OK" | +| `redis:common:get` | Get a string value | Value or empty string | +| `redis:common:incr` | Increment a numeric value | New value | +| `redis:common:decr` | Decrement a numeric value | New value | +| `redis:common:del` | Delete a key | Number of keys removed | +| `redis:common:keys` | List all keys | Comma-separated keys | + +### SQF Examples + +```sqf +// Set a value +"forge_server" callExtension ["redis:common:set", ["player_count", "42"]]; + +// Get a value +private _result = "forge_server" callExtension ["redis:common:get", ["player_count"]]; +private _count = _result select 0; // "42" + +// Increment +"forge_server" callExtension ["redis:common:incr", ["player_count", 1]]; + +// Delete +"forge_server" callExtension ["redis:common:del", ["player_count"]]; +``` + +## Hash Operations + +Hash operations store structured data as field-value pairs, ideal for objects and entities. + +### Available Commands + +| Command | Description | Returns | +|---------|-------------|---------| +| `redis:hash:set` | Set a single field | 1 if new, 0 if updated | +| `redis:hash:mset` | Set multiple fields atomically | "OK" | +| `redis:hash:get` | Get a field value | Value or empty string | +| `redis:hash:getall` | Get all fields and values | Comma-separated pairs | +| `redis:hash:del` | Delete a field | Number of fields removed | +| `redis:hash:keys` | Get all field names | Comma-separated keys | +| `redis:hash:vals` | Get all values | Comma-separated values | +| `redis:hash:len` | Get number of fields | Field count | +| `redis:hash:exists` | Check if field exists | "1" or "0" | + +### SQF Examples + +```sqf +// Set a single field +"forge_server" callExtension ["redis:hash:set", ["actor:76561198123456789", "name", "John Doe"]]; + +// Set multiple fields atomically +private _fields = [ + ["name", "John Doe"], + ["bank", "1000"], + ["level", "5"] +]; +"forge_server" callExtension ["redis:hash:mset", ["actor:76561198123456789", _fields]]; + +// Get a field +private _result = "forge_server" callExtension ["redis:hash:get", ["actor:76561198123456789", "name"]]; +private _name = _result select 0; // "John Doe" + +// Get all fields +private _result = "forge_server" callExtension ["redis:hash:getall", ["actor:76561198123456789"]]; +// Returns: "name, John Doe, bank, 1000, level, 5" + +// Check if field exists +private _result = "forge_server" callExtension ["redis:hash:exists", ["actor:76561198123456789", "name"]]; +private _exists = (_result select 0) == "1"; +``` + +## List Operations + +List operations manage ordered collections, useful for queues, logs, and sequential data. + +### Available Commands + +| Command | Description | Returns | +|---------|-------------|---------| +| `redis:list:set` | Set element at index | "OK" | +| `redis:list:get` | Get element at index | Value (base64 decoded) | +| `redis:list:len` | Get list length | Element count | +| `redis:list:range` | Get range of elements | JSON array | +| `redis:list:lpush` | Prepend to list | New length | +| `redis:list:rpush` | Append to list | New length | +| `redis:list:lpop` | Remove from beginning | JSON array of removed elements | +| `redis:list:rpop` | Remove from end | JSON array of removed elements | +| `redis:list:trim` | Trim to range | "OK" | +| `redis:list:del` | Remove by value | Number removed | + +### SQF Examples + +```sqf +// Append to list +"forge_server" callExtension ["redis:list:rpush", ["event_log", "Player joined"]]; +"forge_server" callExtension ["redis:list:rpush", ["event_log", "Player spawned"]]; + +// Get range +private _result = "forge_server" callExtension ["redis:list:range", ["event_log", 0, -1]]; +private _events = parseJSON (_result select 0); // Array of all events + +// Pop from end +private _result = "forge_server" callExtension ["redis:list:rpop", ["event_log", 1]]; +private _lastEvent = parseJSON (_result select 0); // ["Player spawned"] + +// Trim to last 100 entries +"forge_server" callExtension ["redis:list:trim", ["event_log", -100, -1]]; +``` + +> [!NOTE] +> List values are automatically base64 encoded/decoded to handle special characters safely. + +## Set Operations + +Set operations manage unique collections, perfect for membership tracking and preventing duplicates. + +### Available Commands + +| Command | Description | Returns | +|---------|-------------|---------| +| `redis:set:add` | Add member to set | 1 if new, 0 if exists | +| `redis:set:members` | Get all members | Comma-separated members | +| `redis:set:card` | Get member count | Cardinality | +| `redis:set:ismember` | Check membership | "1" or "0" | +| `redis:set:randmember` | Get random member | Member value | +| `redis:set:randmembers` | Get N random members | Comma-separated members | +| `redis:set:pop` | Remove random member | Removed member | +| `redis:set:del` | Remove specific member | 1 if removed, 0 if not found | + +### SQF Examples + +```sqf +// Add members to a set +"forge_server" callExtension ["redis:set:add", ["org:elite_squad:members", "76561198123456789"]]; +"forge_server" callExtension ["redis:set:add", ["org:elite_squad:members", "76561198987654321"]]; + +// Check membership +private _result = "forge_server" callExtension ["redis:set:ismember", ["org:elite_squad:members", "76561198123456789"]]; +private _isMember = (_result select 0) == "1"; + +// Get all members +private _result = "forge_server" callExtension ["redis:set:members", ["org:elite_squad:members"]]; +private _memberUIDs = (_result select 0) splitString ","; + +// Get member count +private _result = "forge_server" callExtension ["redis:set:card", ["org:elite_squad:members"]]; +private _memberCount = parseNumber (_result select 0); + +// Remove member +"forge_server" callExtension ["redis:set:del", ["org:elite_squad:members", "76561198123456789"]]; +``` + +## Helper Utilities + +### Base64 Encoding + +List operations use base64 encoding to safely store complex strings: + +```rust +use crate::redis::helpers::{encode_b64, decode_b64}; + +let encoded = encode_b64("Complex [string] with {special} chars"); +let decoded = decode_b64(&encoded)?; // Original string +``` + +### Value Parsing + +The `parse_redis_value` function intelligently converts Redis strings to JSON types: + +```rust +use crate::redis::helpers::parse_redis_value; + +parse_redis_value("42"); // Number(42) +parse_redis_value("true"); // Bool(true) +parse_redis_value("{\"key\":1}"); // Object +parse_redis_value("text"); // String("text") +``` + +## Macro Usage + +The `redis_operation!` macro handles all connection and async boilerplate: + +```rust +use crate::redis_operation; +use bb8_redis::redis::AsyncCommands; + +pub fn my_redis_command(key: String) -> String { + redis_operation!(conn => { + match conn.get::<_, String>(&key).await { + Ok(value) => value, + Err(e) => format!("Error: {}", e), + } + }) +} +``` + +The macro automatically: +- Acquires a connection from the pool +- Handles lazy initialization if needed +- Executes the operation asynchronously +- Returns the result to SQF + +## Error Handling + +All Redis operations return strings: +- **Success**: Operation result (e.g., "OK", value, count) +- **Error**: String starting with "Error: " followed by the error message + +```sqf +private _result = "forge_server" callExtension ["redis:common:get", ["mykey"]]; +private _value = _result select 0; + +if (_value find "Error:" == 0) then { + diag_log format ["Redis error: %1", _value]; +} else { + // Use the value + systemChat format ["Value: %1", _value]; +}; +``` + +## Performance Considerations + +- **Connection Pooling**: Reuses connections to minimize overhead +- **Async Operations**: Non-blocking I/O prevents server lag +- **Atomic Operations**: `hash:mset` sets multiple fields in one operation +- **Batch Operations**: Use lists and sets for bulk data + +## Best Practices + +1. **Use Hashes for Objects**: Store actor/org data as hash fields +2. **Use Sets for Membership**: Track organization members, online players +3. **Use Lists for Logs**: Event logs, chat history, audit trails +4. **Prefix Keys**: Use namespaces like `actor:`, `org:`, `vehicle:` +5. **Handle Errors**: Always check for "Error:" prefix in results +6. **Atomic Updates**: Use `hash:mset` instead of multiple `hash:set` calls diff --git a/arma/server/extension/src/redis/client.rs b/arma/server/extension/src/redis/client.rs new file mode 100644 index 0000000..3067ac9 --- /dev/null +++ b/arma/server/extension/src/redis/client.rs @@ -0,0 +1,43 @@ +use super::config::RedisConfig; +use bb8_redis::{RedisConnectionManager, bb8}; +use std::error::Error; + +/// Redis connection pool type alias. +pub type RedisClient = bb8::Pool; + +/// Creates a Redis connection pool with the specified configuration. +pub async fn create_redis_pool( + config: &RedisConfig, +) -> Result> { + // Generate the Redis connection string from configuration + let connection_string = config.connection_string(); + + // Create the connection manager that will handle individual connections + let manager = RedisConnectionManager::new(connection_string)?; + + // Start building the connection pool with default settings + let mut pool_builder = bb8::Pool::builder(); + + // Configure maximum number of connections if specified + // This prevents overwhelming the Redis server with too many connections + if let Some(max_conn) = config.max_connections { + pool_builder = pool_builder.max_size(max_conn as u32); + } + + // Configure minimum idle connections if specified + // This ensures quick response times by keeping connections ready + if let Some(min_conn) = config.min_connections { + pool_builder = pool_builder.min_idle(Some(min_conn as u32)); + } + + // Configure idle connection timeout if specified + // This prevents keeping stale connections that might be closed by the server + if let Some(idle_timeout) = config.idle_timeout { + use std::time::Duration; + pool_builder = pool_builder.idle_timeout(Some(Duration::from_secs(idle_timeout))); + } + + // Build the final connection pool with all configured parameters + let pool = pool_builder.build(manager).await?; + Ok(pool) +} diff --git a/arma/server/extension/src/redis/common.rs b/arma/server/extension/src/redis/common.rs new file mode 100644 index 0000000..4ddce19 --- /dev/null +++ b/arma/server/extension/src/redis/common.rs @@ -0,0 +1,74 @@ +//! Common Redis operations for basic key-value functionality. + +use crate::redis_operation; +use bb8_redis::redis::AsyncCommands; + +/// Sets a string value for the specified Redis key. +pub fn set_key(key: String, value: String) -> String { + redis_operation!(conn => { + match conn.set(&key, &value).await { + Ok(()) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Retrieves the string value for the specified Redis key. +pub fn get_key(key: String) -> String { + redis_operation!(conn => { + match conn.get::<_, String>(&key).await { + Ok(value) => value, + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Increments a numeric value stored at the specified key. +pub fn incr_key(key: String, count: usize) -> String { + redis_operation!(conn => { + match conn.incr::<_, _, i64>(&key, count).await { + Ok(value) => value.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Decrements a numeric value stored at the specified key. +pub fn decr_key(key: String, count: usize) -> String { + redis_operation!(conn => { + match conn.decr::<_, _, i64>(&key, count).await { + Ok(value) => value.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Checks if a Redis key exists. +pub fn key_exists(key: String) -> String { + redis_operation!(conn => { + match conn.exists::<_, i32>(&key).await { + Ok(exists) => exists.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Deletes a Redis key and its associated value. +pub fn delete_key(key: String) -> String { + redis_operation!(conn => { + match conn.del::<_, usize>(&key).await { + Ok(removed) => removed.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Lists all Redis keys matching the wildcard pattern "*". +pub fn list_keys() -> String { + redis_operation!(conn => { + match conn.keys::<_, Vec>("*").await { + Ok(keys) => keys.join(","), + Err(e) => format!("Error: {}", e), + } + }) +} diff --git a/arma/server/extension/src/redis/config.rs b/arma/server/extension/src/redis/config.rs new file mode 100644 index 0000000..eaadfa5 --- /dev/null +++ b/arma/server/extension/src/redis/config.rs @@ -0,0 +1,122 @@ +//! Configuration management for Redis connection and application settings. + +use serde::Deserialize; +use std::fs; +use std::path::PathBuf; + +use crate::log::log; + +/// Main configuration structure for the entire application. +#[derive(Debug, Clone, Deserialize)] +pub struct Config { + /// Redis configuration with automatic defaults if not specified + #[serde(default)] + pub redis: RedisConfig, +} + +impl Default for Config { + /// Creates a default configuration with sensible values for development. + fn default() -> Self { + Self { + redis: RedisConfig::default(), + } + } +} + +/// Redis connection and connection pool configuration. +#[derive(Debug, Clone, Deserialize)] +pub struct RedisConfig { + /// Redis server hostname or IP address + pub host: String, + /// Redis server port number + pub port: u16, + /// Redis database number (0-15) + pub db: u8, + /// Username for Redis ACL authentication (Redis 6.0+) + pub username: Option, + /// Password for Redis authentication + pub password: Option, + /// Maximum number of connections in the pool + pub max_connections: Option, + /// Minimum number of idle connections to maintain + pub min_connections: Option, + /// Idle connection timeout in seconds + pub idle_timeout: Option, +} + +impl Default for RedisConfig { + /// Creates default Redis configuration suitable for local development. + fn default() -> Self { + Self { + host: "127.0.0.1".to_string(), + port: 6379, + db: 0, + username: None, + password: None, + max_connections: Some(10), + min_connections: Some(2), + idle_timeout: Some(60), + } + } +} + +impl RedisConfig { + /// Generates a Redis connection string from the configuration. + pub fn connection_string(&self) -> String { + // Build authentication part of the URL + let auth_part = match (&self.username, &self.password) { + (Some(username), Some(password)) => format!("{}:{}@", username, password), + (None, Some(password)) => format!(":{}@", password), + (Some(username), None) => format!("{}@", username), + (None, None) => String::new(), + }; + + let mut conn_str = format!("redis://{}{}", auth_part, self.host); + + if self.port != 6379 { + conn_str.push_str(&format!(":{}", self.port)); + } + + if self.db != 0 { + conn_str.push_str(&format!("/{}", self.db)); + } + + log( + "main", + "INFO", + &format!("Redis connection string: {}", conn_str), + ); + + conn_str + } +} + +/// Loads configuration from the `config.toml` file with graceful fallback to defaults. +pub fn load() -> Config { + let config_path = std::env::current_exe() + .ok() + .and_then(|exe| { + exe.parent() + .map(|dir| dir.join("@forge_server").join("config.toml")) + }) + .filter(|p| p.exists()) + .unwrap_or_else(|| PathBuf::from("@forge_server/config.toml")); + + match fs::read_to_string(&config_path) { + Ok(contents) => { + log("main", "INFO", &format!("Config file found! Loading...")); + match toml::from_str::(&contents) { + Ok(config) => config, + Err(_) => Config::default(), + } + } + Err(_) => { + log( + "main", + "INFO", + &format!("Config file not found. Using default configuration."), + ); + Config::default() + } + } +} diff --git a/arma/server/extension/src/redis/hash.rs b/arma/server/extension/src/redis/hash.rs new file mode 100644 index 0000000..8b53240 --- /dev/null +++ b/arma/server/extension/src/redis/hash.rs @@ -0,0 +1,102 @@ +//! Redis hash operations for structured data storage. + +use crate::redis_operation; +use bb8_redis::redis::AsyncCommands; +use std::collections::HashMap; + +/// Sets a single field in a Redis hash. +pub fn hash_set(key: String, field: String, value: String) -> String { + redis_operation!(conn => { + match conn.hset::<_, _, _, i32>(&key, &field, &value).await { + Ok(added) => added.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Sets multiple fields in a Redis hash atomically. +pub fn hash_mset(key: String, items: Vec<(String, String)>) -> String { + redis_operation!(conn => { + match conn.hset_multiple(&key, &items).await { + Ok(()) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Retrieves the value of a specific field from a Redis hash. +pub fn hash_get(key: String, field: String) -> String { + redis_operation!(conn => { + match conn.hget::<_, _, Option>(&key, &field).await { + Ok(Some(value)) => value, + Ok(None) => String::new(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Retrieves all fields and values from a Redis hash. +pub fn hash_get_all(key: String) -> String { + redis_operation!(conn => { + match conn.hgetall::<_, HashMap>(&key).await { + Ok(hash_map) => { + let formatted_pairs: Vec = hash_map + .iter() + .map(|(k, v)| format!("{}, {}", k, v)) + .collect(); + formatted_pairs.join(", ") + } + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Removes a field from a Redis hash. +pub fn hash_del(key: String, field: String) -> String { + redis_operation!(conn => { + match conn.hdel::<_, _, i32>(&key, &field).await { + Ok(removed) => removed.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Retrieves all field names from a Redis hash. +pub fn hash_keys(key: String) -> String { + redis_operation!(conn => { + match conn.hkeys::<_, Vec>(&key).await { + Ok(fields) => fields.join(","), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Retrieves all values from a Redis hash. +pub fn hash_values(key: String) -> String { + redis_operation!(conn => { + match conn.hvals::<_, Vec>(&key).await { + Ok(values) => values.join(","), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Returns the number of fields in a Redis hash. +pub fn hash_len(key: String) -> String { + redis_operation!(conn => { + match conn.hlen::<_, i32>(&key).await { + Ok(len) => len.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Tests if a field exists in a Redis hash. +pub fn hash_exists(key: String, field: String) -> String { + redis_operation!(conn => { + match conn.hexists::<_, _, bool>(&key, &field).await { + Ok(exists) => if exists { "1" } else { "0" }.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} diff --git a/arma/server/extension/src/redis/helpers.rs b/arma/server/extension/src/redis/helpers.rs new file mode 100644 index 0000000..04bfcd5 --- /dev/null +++ b/arma/server/extension/src/redis/helpers.rs @@ -0,0 +1,73 @@ +//! Helper utilities for Redis data processing and encoding. + +use serde_json; + +/// Intelligently parses a Redis string value into the appropriate JSON type. +#[allow(dead_code)] +pub fn parse_redis_value(value: &str) -> serde_json::Value { + // Handle empty strings as null values + if value.is_empty() { + return serde_json::Value::Null; + } + + // Try to parse as JSON first (handles objects, arrays, and JSON primitives) + if let Ok(json_val) = serde_json::from_str(value) { + // Special handling: unwrap single-element arrays + if let serde_json::Value::Array(arr) = &json_val { + if arr.len() == 1 { + return arr[0].clone(); + } + } + return json_val; + } + + // Try to parse as integer + if let Ok(int_val) = value.parse::() { + return serde_json::Value::Number(serde_json::Number::from(int_val)); + } + + // Try to parse as float + if let Ok(float_val) = value.parse::() { + if let Some(num) = serde_json::Number::from_f64(float_val) { + return serde_json::Value::Number(num); + } + } + + // Try to parse as boolean (case-insensitive) + match value.to_lowercase().as_str() { + "true" => return serde_json::Value::Bool(true), + "false" => return serde_json::Value::Bool(false), + _ => {} + } + + // Fallback: treat as string + serde_json::Value::String(value.to_string()) +} + +/// Converts a JSON value to a string by wrapping it in an array. +#[allow(dead_code)] +pub fn parse_json_value(value: &serde_json::Value) -> String { + // Wrap the value in a single-element array + let wrapped = serde_json::Value::Array(vec![value.clone()]); + + // Serialize the wrapped array to a JSON string + wrapped.to_string() +} + +/// Encodes a string to base64 for safe Redis storage. +pub fn encode_b64(data: &str) -> String { + use base64::{Engine as _, engine::general_purpose}; + general_purpose::STANDARD.encode(data.as_bytes()) +} + +/// Decodes a base64 string back to its original form. +pub fn decode_b64(encoded: &str) -> Result { + use base64::{Engine as _, engine::general_purpose}; + match general_purpose::STANDARD.decode(encoded) { + Ok(bytes) => match String::from_utf8(bytes) { + Ok(string) => Ok(string), + Err(e) => Err(format!("Invalid UTF-8: {}", e)), + }, + Err(e) => Err(format!("Invalid base64: {}", e)), + } +} diff --git a/arma/server/extension/src/redis/list.rs b/arma/server/extension/src/redis/list.rs new file mode 100644 index 0000000..07068d8 --- /dev/null +++ b/arma/server/extension/src/redis/list.rs @@ -0,0 +1,167 @@ +//! Redis list operations for ordered collections and queues. + +use crate::redis_operation; +use bb8_redis::redis::AsyncCommands; + +/// Sets the value of an element at a specific index in a Redis list. +pub fn list_set(key: String, index: isize, value: String) -> String { + use crate::redis::helpers::encode_b64; + let encoded_value = encode_b64(&value); + redis_operation!(conn => { + match conn.lset(&key, index, &encoded_value).await { + Ok(()) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Retrieves the value of an element at a specific index in a Redis list. +pub fn list_get(key: String, index: isize) -> String { + use crate::redis::helpers::decode_b64; + redis_operation!(conn => { + match conn.lindex::<_, String>(&key, index).await { + Ok(encoded_value) => { + match decode_b64(&encoded_value) { + Ok(decoded) => decoded, + Err(e) => format!("Error decoding base64: {}", e), + } + }, + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Returns the length (number of elements) of a Redis list. +pub fn list_len(key: String) -> String { + redis_operation!(conn => { + match conn.llen::<_, i32>(&key).await { + Ok(len) => len.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Retrieves a range of elements from a Redis list. +pub fn list_range(key: String, start: isize, end: isize) -> String { + use crate::redis::helpers::decode_b64; + redis_operation!(conn => { + match conn.lrange::<_, Vec>(&key, start, end).await { + Ok(encoded_values) => { + let mut decoded_values = Vec::new(); + for encoded in encoded_values { + match decode_b64(&encoded) { + Ok(decoded) => decoded_values.push(decoded), + Err(e) => return format!("Error decoding base64: {}", e), + } + } + match serde_json::to_string(&decoded_values) { + Ok(json_array) => json_array, + Err(e) => format!("Error: Failed to serialize to JSON: {}", e), + } + }, + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Prepends a value to the beginning (left) of a Redis list. +pub fn list_lpush(key: String, value: String) -> String { + use crate::redis::helpers::encode_b64; + let encoded_value = encode_b64(&value); + redis_operation!(conn => { + match conn.lpush::<_, _, usize>(&key, &encoded_value).await { + Ok(len) => len.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Appends a value to the end (right) of a Redis list. +pub fn list_rpush(key: String, value: String) -> String { + use crate::redis::helpers::encode_b64; + let encoded_value = encode_b64(&value); + redis_operation!(conn => { + match conn.rpush::<_, _, usize>(&key, &encoded_value).await { + Ok(len) => len.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Removes and returns elements from the beginning (left) of a Redis list. +pub fn list_lpop(key: String, count: usize) -> String { + use crate::redis::helpers::decode_b64; + redis_operation!(conn => { + let count_option = if count == 0 { + None + } else { + std::num::NonZeroUsize::new(count) + }; + match conn.lpop::<_, Vec>(&key, count_option).await { + Ok(encoded_values) => { + let mut decoded_values = Vec::new(); + for encoded in encoded_values { + match decode_b64(&encoded) { + Ok(decoded) => decoded_values.push(decoded), + Err(e) => return format!("Error decoding base64: {}", e), + } + } + match serde_json::to_string(&decoded_values) { + Ok(json_array) => json_array, + Err(e) => format!("Error: Failed to serialize to JSON: {}", e), + } + }, + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Removes and returns elements from the end (right) of a Redis list. +pub fn list_rpop(key: String, count: usize) -> String { + use crate::redis::helpers::decode_b64; + redis_operation!(conn => { + let count_option = if count == 0 { + None + } else { + std::num::NonZeroUsize::new(count) + }; + match conn.rpop::<_, Vec>(&key, count_option).await { + Ok(encoded_values) => { + let mut decoded_values = Vec::new(); + for encoded in encoded_values { + match decode_b64(&encoded) { + Ok(decoded) => decoded_values.push(decoded), + Err(e) => return format!("Error decoding base64: {}", e), + } + } + match serde_json::to_string(&decoded_values) { + Ok(json_array) => json_array, + Err(e) => format!("Error: Failed to serialize to JSON: {}", e), + } + }, + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Trims a Redis list to keep only elements within the specified range. +pub fn list_trim(key: String, start: isize, end: isize) -> String { + redis_operation!(conn => { + match conn.ltrim(&key, start, end).await { + Ok(()) => "OK".to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Removes elements from a Redis list by value. +pub fn list_del(key: String, count: isize, value: String) -> String { + use crate::redis::helpers::encode_b64; + let encoded_value = encode_b64(&value); + redis_operation!(conn => { + match conn.lrem::<_, _, i32>(&key, count, &encoded_value).await { + Ok(removed) => removed.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} diff --git a/arma/server/extension/src/redis/macros.rs b/arma/server/extension/src/redis/macros.rs new file mode 100644 index 0000000..6115b6e --- /dev/null +++ b/arma/server/extension/src/redis/macros.rs @@ -0,0 +1,65 @@ +//! Macros for Redis operation boilerplate reduction. + +/// Macro for Redis operations that handles all connection and async boilerplate. +#[macro_export] +macro_rules! redis_operation { + ($conn:ident => $operation:block) => {{ + use $crate::redis; + use $crate::{CONNECTION_STATE, ConnectionState, REDIS_POOL, RUNTIME}; + + // Get the Redis connection pool (initialized at startup) + let pool = match REDIS_POOL.get() { + Some(pool) => pool, + None => { + // Attempt lazy initialization if not already initialized + let rt = &RUNTIME; + let init_result = rt.block_on(async move { + let cfg = redis::config::load(); + match redis::client::create_redis_pool(&cfg.redis).await { + Ok(pool) => { + let _ = REDIS_POOL.set(pool); + Ok(()) + } + Err(_e) => { + let default_cfg = redis::RedisConfig::default(); + match redis::client::create_redis_pool(&default_cfg).await { + Ok(pool) => { + let _ = REDIS_POOL.set(pool); + Ok(()) + } + Err(e) => Err(format!("{}", e)), + } + } + } + }); + + match init_result { + Ok(()) => { + *CONNECTION_STATE.write().unwrap() = ConnectionState::Connected; + match REDIS_POOL.get() { + Some(pool) => pool, + None => return "Error: Redis pool not initialized".to_string(), + } + } + Err(err) => { + *CONNECTION_STATE.write().unwrap() = ConnectionState::Failed; + return format!("Error: {}", err); + } + } + } + }; + + // Use the global tokio runtime to execute async operations + let rt = &RUNTIME; + rt.block_on(async move { + // Acquire a connection from the pool + let mut $conn = match pool.get().await { + Ok(conn) => conn, + Err(e) => return format!("Error: {}", e), + }; + + // Execute the user-provided Redis operation + $operation + }) + }}; +} diff --git a/arma/server/extension/src/redis/mod.rs b/arma/server/extension/src/redis/mod.rs new file mode 100644 index 0000000..5a13dc7 --- /dev/null +++ b/arma/server/extension/src/redis/mod.rs @@ -0,0 +1,69 @@ +//! Redis operations and utilities for the Arma 3 server extension. + +use arma_rs::Group; + +pub use client::create_redis_pool; +pub use config::RedisConfig; +pub use helpers::{decode_b64, encode_b64}; + +pub mod client; +pub mod common; +pub mod config; +pub mod hash; +pub mod helpers; +pub mod list; +pub mod macros; +pub mod set; + +pub fn group() -> Group { + Group::new() + .group( + "common", + Group::new() + .command("set", common::set_key) + .command("get", common::get_key) + .command("incr", common::incr_key) + .command("decr", common::decr_key) + .command("del", common::delete_key) + .command("keys", common::list_keys), + ) + .group( + "hash", + Group::new() + .command("set", hash::hash_set) + .command("mset", hash::hash_mset) + .command("get", hash::hash_get) + .command("getall", hash::hash_get_all) + .command("del", hash::hash_del) + .command("keys", hash::hash_keys) + .command("vals", hash::hash_values) + .command("len", hash::hash_len) + .command("exists", hash::hash_exists), + ) + .group( + "list", + Group::new() + .command("set", list::list_set) + .command("get", list::list_get) + .command("len", list::list_len) + .command("range", list::list_range) + .command("lpush", list::list_lpush) + .command("rpush", list::list_rpush) + .command("lpop", list::list_lpop) + .command("rpop", list::list_rpop) + .command("trim", list::list_trim) + .command("del", list::list_del), + ) + .group( + "set", + Group::new() + .command("add", set::set_add) + .command("members", set::set_members) + .command("card", set::set_card) + .command("ismember", set::set_is_member) + .command("randmember", set::set_random_member) + .command("randmembers", set::set_random_members) + .command("pop", set::set_pop) + .command("del", set::set_del), + ) +} diff --git a/arma/server/extension/src/redis/set.rs b/arma/server/extension/src/redis/set.rs new file mode 100644 index 0000000..1be6ce5 --- /dev/null +++ b/arma/server/extension/src/redis/set.rs @@ -0,0 +1,87 @@ +//! Redis set operations for unique collections and membership tracking. + +use crate::redis_operation; +use bb8_redis::redis::AsyncCommands; + +/// Adds a value to a Redis set. +pub fn set_add(key: String, value: String) -> String { + redis_operation!(conn => { + match conn.sadd::<_, _, i32>(&key, &value).await { + Ok(added) => added.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Retrieves all members of a Redis set. +pub fn set_members(key: String) -> String { + redis_operation!(conn => { + match conn.smembers::<_, Vec>(&key).await { + Ok(members) => members.join(","), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Returns the number of members in a Redis set (cardinality). +pub fn set_card(key: String) -> String { + redis_operation!(conn => { + match conn.scard::<_, i32>(&key).await { + Ok(card) => card.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Removes a value from a Redis set. +pub fn set_del(key: String, value: String) -> String { + redis_operation!(conn => { + match conn.srem::<_, _, i32>(&key, &value).await { + Ok(removed) => removed.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Tests if a value is a member of a Redis set. +pub fn set_is_member(key: String, value: String) -> String { + redis_operation!(conn => { + match conn.sismember::<_, _, bool>(&key, &value).await { + Ok(is_member) => if is_member { "1" } else { "0" }.to_string(), + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Removes and returns a random member from a Redis set. +pub fn set_pop(key: String) -> String { + redis_operation!(conn => { + match conn.spop::<_, String>(&key).await { + Ok(value) => value, + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Returns a random member from a Redis set without removing it. +pub fn set_random_member(key: String) -> String { + redis_operation!(conn => { + match conn.srandmember::<_, String>(&key).await { + Ok(value) => value, + Err(e) => format!("Error: {}", e), + } + }) +} + +/// Returns multiple random members from a Redis set without removing them. +pub fn set_random_members(key: String, count: isize) -> String { + redis_operation!(conn => { + match conn + .srandmember_multiple::<_, Vec>(&key, count.try_into().unwrap_or(0)) + .await + { + Ok(values) => values.join(","), + Err(e) => format!("Error: {}", e), + } + }) +} diff --git a/arma/server/icon_128_ca.paa b/arma/server/icon_128_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..02dc39ec2b7ff4ef386de22f57c38b384f902b7e GIT binary patch literal 22016 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 literal 0 HcmV?d00001 diff --git a/arma/server/include/a3/ui_f/hpp/defineDIKCodes.inc b/arma/server/include/a3/ui_f/hpp/defineDIKCodes.inc new file mode 100644 index 0000000..4031b6b --- /dev/null +++ b/arma/server/include/a3/ui_f/hpp/defineDIKCodes.inc @@ -0,0 +1,190 @@ +#ifndef DIK_ESCAPE + +/**************************************************************************** + * + * DirectInput keyboard scan codes + * + ****************************************************************************/ + +#define DIK_ESCAPE 0x01 +#define DIK_1 0x02 +#define DIK_2 0x03 +#define DIK_3 0x04 +#define DIK_4 0x05 +#define DIK_5 0x06 +#define DIK_6 0x07 +#define DIK_7 0x08 +#define DIK_8 0x09 +#define DIK_9 0x0A +#define DIK_0 0x0B +#define DIK_MINUS 0x0C /* - on main keyboard */ +#define DIK_EQUALS 0x0D +#define DIK_BACK 0x0E /* backspace */ +#define DIK_TAB 0x0F +#define DIK_Q 0x10 +#define DIK_W 0x11 +#define DIK_E 0x12 +#define DIK_R 0x13 +#define DIK_T 0x14 +#define DIK_Y 0x15 +#define DIK_U 0x16 +#define DIK_I 0x17 +#define DIK_O 0x18 +#define DIK_P 0x19 +#define DIK_LBRACKET 0x1A +#define DIK_RBRACKET 0x1B +#define DIK_RETURN 0x1C /* Enter on main keyboard */ +#define DIK_LCONTROL 0x1D +#define DIK_A 0x1E +#define DIK_S 0x1F +#define DIK_D 0x20 +#define DIK_F 0x21 +#define DIK_G 0x22 +#define DIK_H 0x23 +#define DIK_J 0x24 +#define DIK_K 0x25 +#define DIK_L 0x26 +#define DIK_SEMICOLON 0x27 +#define DIK_APOSTROPHE 0x28 +#define DIK_GRAVE 0x29 /* accent grave */ +#define DIK_LSHIFT 0x2A +#define DIK_BACKSLASH 0x2B +#define DIK_Z 0x2C +#define DIK_X 0x2D +#define DIK_C 0x2E +#define DIK_V 0x2F +#define DIK_B 0x30 +#define DIK_N 0x31 +#define DIK_M 0x32 +#define DIK_COMMA 0x33 +#define DIK_PERIOD 0x34 /* . on main keyboard */ +#define DIK_SLASH 0x35 /* / on main keyboard */ +#define DIK_RSHIFT 0x36 +#define DIK_MULTIPLY 0x37 /* * on numeric keypad */ +#define DIK_LMENU 0x38 /* left Alt */ +#define DIK_SPACE 0x39 +#define DIK_CAPITAL 0x3A +#define DIK_F1 0x3B +#define DIK_F2 0x3C +#define DIK_F3 0x3D +#define DIK_F4 0x3E +#define DIK_F5 0x3F +#define DIK_F6 0x40 +#define DIK_F7 0x41 +#define DIK_F8 0x42 +#define DIK_F9 0x43 +#define DIK_F10 0x44 +#define DIK_NUMLOCK 0x45 +#define DIK_SCROLL 0x46 /* Scroll Lock */ +#define DIK_NUMPAD7 0x47 +#define DIK_NUMPAD8 0x48 +#define DIK_NUMPAD9 0x49 +#define DIK_SUBTRACT 0x4A /* - on numeric keypad */ +#define DIK_NUMPAD4 0x4B +#define DIK_NUMPAD5 0x4C +#define DIK_NUMPAD6 0x4D +#define DIK_ADD 0x4E /* + on numeric keypad */ +#define DIK_NUMPAD1 0x4F +#define DIK_NUMPAD2 0x50 +#define DIK_NUMPAD3 0x51 +#define DIK_NUMPAD0 0x52 +#define DIK_DECIMAL 0x53 /* . on numeric keypad */ +#define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ +#define DIK_F11 0x57 +#define DIK_F12 0x58 + +#define DIK_F13 0x64 /* (NEC PC98) */ +#define DIK_F14 0x65 /* (NEC PC98) */ +#define DIK_F15 0x66 /* (NEC PC98) */ + +#define DIK_KANA 0x70 /* (Japanese keyboard) */ +#define DIK_ABNT_C1 0x73 /* / ? on Portugese (Brazilian) keyboards */ +#define DIK_CONVERT 0x79 /* (Japanese keyboard) */ +#define DIK_NOCONVERT 0x7B /* (Japanese keyboard) */ +#define DIK_YEN 0x7D /* (Japanese keyboard) */ +#define DIK_ABNT_C2 0x7E /* Numpad . on Portugese (Brazilian) keyboards */ +#define DIK_NUMPADEQUALS 0x8D /* = on numeric keypad (NEC PC98) */ +#define DIK_PREVTRACK 0x90 /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */ +#define DIK_AT 0x91 /* (NEC PC98) */ +#define DIK_COLON 0x92 /* (NEC PC98) */ +#define DIK_UNDERLINE 0x93 /* (NEC PC98) */ +#define DIK_KANJI 0x94 /* (Japanese keyboard) */ +#define DIK_STOP 0x95 /* (NEC PC98) */ +#define DIK_AX 0x96 /* (Japan AX) */ +#define DIK_UNLABELED 0x97 /* (J3100) */ +#define DIK_NEXTTRACK 0x99 /* Next Track */ +#define DIK_NUMPADENTER 0x9C /* Enter on numeric keypad */ +#define DIK_RCONTROL 0x9D +#define DIK_MUTE 0xA0 /* Mute */ +#define DIK_CALCULATOR 0xA1 /* Calculator */ +#define DIK_PLAYPAUSE 0xA2 /* Play / Pause */ +#define DIK_MEDIASTOP 0xA4 /* Media Stop */ +#define DIK_VOLUMEDOWN 0xAE /* Volume - */ +#define DIK_VOLUMEUP 0xB0 /* Volume + */ +#define DIK_WEBHOME 0xB2 /* Web home */ +#define DIK_NUMPADCOMMA 0xB3 /* , on numeric keypad (NEC PC98) */ +#define DIK_DIVIDE 0xB5 /* / on numeric keypad */ +#define DIK_SYSRQ 0xB7 +#define DIK_RMENU 0xB8 /* right Alt */ +#define DIK_PAUSE 0xC5 /* Pause */ +#define DIK_HOME 0xC7 /* Home on arrow keypad */ +#define DIK_UP 0xC8 /* UpArrow on arrow keypad */ +#define DIK_PRIOR 0xC9 /* PgUp on arrow keypad */ +#define DIK_LEFT 0xCB /* LeftArrow on arrow keypad */ +#define DIK_RIGHT 0xCD /* RightArrow on arrow keypad */ +#define DIK_END 0xCF /* End on arrow keypad */ +#define DIK_DOWN 0xD0 /* DownArrow on arrow keypad */ +#define DIK_NEXT 0xD1 /* PgDn on arrow keypad */ +#define DIK_INSERT 0xD2 /* Insert on arrow keypad */ +#define DIK_DELETE 0xD3 /* Delete on arrow keypad */ +#define DIK_LWIN 0xDB /* Left Windows key */ +#define DIK_RWIN 0xDC /* Right Windows key */ +#define DIK_APPS 0xDD /* AppMenu key */ +#define DIK_POWER 0xDE /* System Power */ +#define DIK_SLEEP 0xDF /* System Sleep */ +#define DIK_WAKE 0xE3 /* System Wake */ +#define DIK_WEBSEARCH 0xE5 /* Web Search */ +#define DIK_WEBFAVORITES 0xE6 /* Web Favorites */ +#define DIK_WEBREFRESH 0xE7 /* Web Refresh */ +#define DIK_WEBSTOP 0xE8 /* Web Stop */ +#define DIK_WEBFORWARD 0xE9 /* Web Forward */ +#define DIK_WEBBACK 0xEA /* Web Back */ +#define DIK_MYCOMPUTER 0xEB /* My Computer */ +#define DIK_MAIL 0xEC /* Mail */ +#define DIK_MEDIASELECT 0xED /* Media Select */ + +/* + * Alternate names for keys, to facilitate transition from DOS. + */ +#define DIK_BACKSPACE DIK_BACK /* backspace */ +#define DIK_NUMPADSTAR DIK_MULTIPLY /* * on numeric keypad */ +#define DIK_LALT DIK_LMENU /* left Alt */ +#define DIK_CAPSLOCK DIK_CAPITAL /* CapsLock */ +#define DIK_NUMPADMINUS DIK_SUBTRACT /* - on numeric keypad */ +#define DIK_NUMPADPLUS DIK_ADD /* + on numeric keypad */ +#define DIK_NUMPADPERIOD DIK_DECIMAL /* . on numeric keypad */ +#define DIK_NUMPADSLASH DIK_DIVIDE /* / on numeric keypad */ +#define DIK_RALT DIK_RMENU /* right Alt */ +#define DIK_UPARROW DIK_UP /* UpArrow on arrow keypad */ +#define DIK_PGUP DIK_PRIOR /* PgUp on arrow keypad */ +#define DIK_LEFTARROW DIK_LEFT /* LeftArrow on arrow keypad */ +#define DIK_RIGHTARROW DIK_RIGHT /* RightArrow on arrow keypad */ +#define DIK_DOWNARROW DIK_DOWN /* DownArrow on arrow keypad */ +#define DIK_PGDN DIK_NEXT /* PgDn on arrow keypad */ + +/* + * Alternate names for keys originally not used on US keyboards. + */ +#define DIK_CIRCUMFLEX DIK_PREVTRACK /* Japanese keyboard */ + + +/* + * Combination keys + */ +#define INPUT_CTRL_OFFSET 512 +#define INPUT_SHIFT_OFFSET 1024 +#define INPUT_ALT_OFFSET 2048 + + +#endif /* DIK_ESCAPE */ + diff --git a/arma/server/include/x/cba/addons/main/script_macros_common.hpp b/arma/server/include/x/cba/addons/main/script_macros_common.hpp new file mode 100644 index 0000000..be13021 --- /dev/null +++ b/arma/server/include/x/cba/addons/main/script_macros_common.hpp @@ -0,0 +1,1833 @@ +/* + Header: script_macros_common.hpp + + Description: + A general set of useful macro functions for use by CBA itself or by any module that uses CBA. + + Authors: + Sickboy and Spooner +*/ + +/* **************************************************** + New - Should be exported to general addon + Aim: + - Simplify (shorten) the amount of characters required for repetitive tasks + - Provide a solid structure that can be dynamic and easy editable (Which sometimes means we cannot adhere to Aim #1 ;-) + An example is the path that is built from defines. Some available in this file, others in mods and addons. + + Follows Standard: + Object variables: PREFIX_COMPONENT + Main-object variables: PREFIX_main + Paths: MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\SCRIPTNAME.sqf + e.g: x\six\addons\sys_menu\fDate.sqf + + Usage: + define PREFIX and COMPONENT, then include this file + (Note, you could have a main addon for your mod, define the PREFIX in a macros.hpp, + and include this script_macros_common.hpp file. + Then in your addons, add a component.hpp, define the COMPONENT, + and include your mod's script_macros.hpp + In your scripts you can then include the addon's component.hpp with relative path) + + TODO: + - Try only to use 1 string type " vs ' + - Evaluate double functions, and simplification + - Evaluate naming scheme; current = prototype + - Evaluate "Debug" features.. + - Evaluate "create mini function per precompiled script, that will load the script on first usage, rather than on init" + - Also saw "Namespace" typeName, evaluate which we need :P + - Single/Multi player gamelogics? (Incase of MP, you would want only 1 gamelogic per component, which is pv'ed from server, etc) + */ + +#ifndef MAINPREFIX + #define MAINPREFIX x +#endif + +#ifndef SUBPREFIX + #define SUBPREFIX addons +#endif + +#ifndef MAINLOGIC + #define MAINLOGIC main +#endif + +#define ADDON DOUBLES(PREFIX,COMPONENT) +#define MAIN_ADDON DOUBLES(PREFIX,main) + +/* ------------------------------------------- +Macro: VERSION_CONFIG + Define CBA Versioning System config entries. + + VERSION should be a floating-point number (1 separator). + VERSION_STR is a string representation of the version. + VERSION_AR is an array representation of the version. + + VERSION must always be defined, otherwise it is 0. + VERSION_STR and VERSION_AR default to VERSION if undefined. + +Parameters: + None + +Example: + (begin example) + #define VERSION 1.0 + #define VERSION_STR 1.0.1 + #define VERSION_AR 1,0,1 + + class CfgPatches { + class MyMod_main { + VERSION_CONFIG; + }; + }; + (end) + +Author: + ?, Jonpas +------------------------------------------- */ +#ifndef VERSION + #define VERSION 0 +#endif + +#ifndef VERSION_STR + #define VERSION_STR VERSION +#endif + +#ifndef VERSION_AR + #define VERSION_AR VERSION +#endif + +#ifndef VERSION_CONFIG + #define VERSION_CONFIG version = VERSION; versionStr = QUOTE(VERSION_STR); versionAr[] = {VERSION_AR} +#endif + +/* ------------------------------------------- +Group: Debugging +------------------------------------------- */ + +/* ------------------------------------------- +Macros: DEBUG_MODE_x + Managing debugging based on debug level. + + According to the *highest* level of debugging that has been defined *before* script_macros_common.hpp is included, + only the appropriate debugging commands will be functional. With no level explicitely defined, assume DEBUG_MODE_NORMAL. + + DEBUG_MODE_FULL - Full debugging output. + DEBUG_MODE_NORMAL - All debugging except and (Default setting if none specified). + DEBUG_MODE_MINIMAL - Only and enabled. + +Examples: + In order to turn on full debugging for a single file, + (begin example) + // Top of individual script file. + #define DEBUG_MODE_FULL + #include "script_component.hpp" + (end) + + In order to force minimal debugging for a single component, + (begin example) + // Top of addons\\script_component.hpp + // Ensure that any FULL and NORMAL setting from the individual files are undefined and MINIMAL is set. + #ifdef DEBUG_MODE_FULL + #undef DEBUG_MODE_FULL + #endif + #ifdef DEBUG_MODE_NORMAL + #undef DEBUG_MODE_NORMAL + #endif + #ifndef DEBUG_MODE_MINIMAL + #define DEBUG_MODE_MINIMAL + #endif + #include "script_macros.hpp" + (end) + + In order to turn on full debugging for a whole addon, + (begin example) + // Top of addons\main\script_macros.hpp + #ifndef DEBUG_MODE_FULL + #define DEBUG_MODE_FULL + #endif + #include "\x\cba\addons\main\script_macros_common.hpp" + (end) + +Author: + Spooner +------------------------------------------- */ + +// If DEBUG_MODE_FULL, then also enable DEBUG_MODE_NORMAL. +#ifdef DEBUG_MODE_FULL +#define DEBUG_MODE_NORMAL +#endif + +// If DEBUG_MODE_NORMAL, then also enable DEBUG_MODE_MINIMAL. +#ifdef DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +// If no debug modes specified, use DEBUG_MODE_NORMAL (+ DEBUG_MODE_MINIMAL). +#ifndef DEBUG_MODE_MINIMAL +#define DEBUG_MODE_NORMAL +#define DEBUG_MODE_MINIMAL +#endif + +#define LOG_SYS_FORMAT(LEVEL,MESSAGE) format ['[%1] (%2) %3: %4', toUpper 'PREFIX', 'COMPONENT', LEVEL, MESSAGE] + +#ifdef DEBUG_SYNCHRONOUS +#define LOG_SYS(LEVEL,MESSAGE) diag_log text LOG_SYS_FORMAT(LEVEL,MESSAGE) +#else +#define LOG_SYS(LEVEL,MESSAGE) LOG_SYS_FORMAT(LEVEL,MESSAGE) call CBA_fnc_log +#endif + +#define LOG_SYS_FILELINENUMBERS(LEVEL,MESSAGE) LOG_SYS(LEVEL,format [ARR_4('%1 %2:%3',MESSAGE,__FILE__,__LINE__ + 1)]) + +/* ------------------------------------------- +Macro: LOG() + Log a debug message into the RPT log. + + Only run if is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + LOG("Initiated clog-dancing simulator."); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_FULL + +#define LOG(MESSAGE) LOG_SYS('LOG',MESSAGE) +#define LOG_1(MESSAGE,ARG1) LOG(FORMAT_1(MESSAGE,ARG1)) +#define LOG_2(MESSAGE,ARG1,ARG2) LOG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) LOG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) LOG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) LOG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) LOG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) LOG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) LOG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define LOG(MESSAGE) /* disabled */ +#define LOG_1(MESSAGE,ARG1) /* disabled */ +#define LOG_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define LOG_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define LOG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define LOG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define LOG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define LOG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define LOG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: INFO() + Record a message without file and line number in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + INFO("Mod X is loaded, do Y"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define INFO(MESSAGE) LOG_SYS('INFO',MESSAGE) +#define INFO_1(MESSAGE,ARG1) INFO(FORMAT_1(MESSAGE,ARG1)) +#define INFO_2(MESSAGE,ARG1,ARG2) INFO(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define INFO_3(MESSAGE,ARG1,ARG2,ARG3) INFO(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define INFO_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) INFO(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define INFO_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) INFO(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define INFO_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) INFO(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define INFO_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) INFO(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define INFO_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) INFO(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: WARNING() + Record a non-critical error in the RPT log. + + Only run if or higher is defined. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + WARNING("This function has been deprecated. Please don't use it in future!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifdef DEBUG_MODE_NORMAL + +#define WARNING(MESSAGE) LOG_SYS('WARNING',MESSAGE) +#define WARNING_1(MESSAGE,ARG1) WARNING(FORMAT_1(MESSAGE,ARG1)) +#define WARNING_2(MESSAGE,ARG1,ARG2) WARNING(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) WARNING(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) WARNING(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) WARNING(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) WARNING(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) WARNING(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) WARNING(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +#else + +#define WARNING(MESSAGE) /* disabled */ +#define WARNING_1(MESSAGE,ARG1) /* disabled */ +#define WARNING_2(MESSAGE,ARG1,ARG2) /* disabled */ +#define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) /* disabled */ +#define WARNING_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) /* disabled */ +#define WARNING_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) /* disabled */ +#define WARNING_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) /* disabled */ +#define WARNING_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) /* disabled */ +#define WARNING_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) /* disabled */ + +#endif + +/* ------------------------------------------- +Macro: ERROR() + Record a critical error in the RPT log. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR("value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR(MESSAGE) LOG_SYS('ERROR',MESSAGE) +#define ERROR_1(MESSAGE,ARG1) ERROR(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_2(MESSAGE,ARG1,ARG2) ERROR(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_3(MESSAGE,ARG1,ARG2,ARG3) ERROR(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_MSG() + Record a critical error in the RPT log and display on screen error message. + + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR_MSG("value of frog not found in config ...yada...yada..."); + (end) + +Author: + commy2 +------------------------------------------- */ +#define ERROR_MSG(MESSAGE) ['PREFIX', 'COMPONENT', nil, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_MSG_1(MESSAGE,ARG1) ERROR_MSG(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_MSG_2(MESSAGE,ARG1,ARG2) ERROR_MSG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_MSG_3(MESSAGE,ARG1,ARG2,ARG3) ERROR_MSG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_MSG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_MSG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_MSG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_MSG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_MSG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_MSG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_MSG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_MSG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_MSG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_MSG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: ERROR_WITH_TITLE() + Record a critical error in the RPT log. + + The title can be specified (in the heading is always just "ERROR") + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + TITLE - Title of error message + MESSAGE - Body of error message + +Example: + (begin example) + ERROR_WITH_TITLE("Value not found","Value of frog not found in config ...yada...yada..."); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ERROR_WITH_TITLE(TITLE,MESSAGE) ['PREFIX', 'COMPONENT', TITLE, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_WITH_TITLE_1(TITLE,MESSAGE,ARG1) ERROR_WITH_TITLE(TITLE,FORMAT_1(MESSAGE,ARG1)) +#define ERROR_WITH_TITLE_2(TITLE,MESSAGE,ARG1,ARG2) ERROR_WITH_TITLE(TITLE,FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_WITH_TITLE_3(TITLE,MESSAGE,ARG1,ARG2,ARG3) ERROR_WITH_TITLE(TITLE,FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_WITH_TITLE_4(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_WITH_TITLE(TITLE,FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_WITH_TITLE_5(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_WITH_TITLE(TITLE,FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_WITH_TITLE_6(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_WITH_TITLE(TITLE,FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_WITH_TITLE_7(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_WITH_TITLE(TITLE,FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_WITH_TITLE_8(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_WITH_TITLE(TITLE,FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + +/* ------------------------------------------- +Macro: MESSAGE_WITH_TITLE() + Record a single line in the RPT log. + +Parameters: + TITLE - Title of log message + MESSAGE - Body of message + +Example: + (begin example) + MESSAGE_WITH_TITLE("Value found","Value of frog found in config "); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define MESSAGE_WITH_TITLE(TITLE,MESSAGE) LOG_SYS_FILELINENUMBERS(TITLE,MESSAGE) + +/* ------------------------------------------- +Macro: RETDEF() + If a variable is undefined, return the default value. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + DEFAULT_VALUE - the default value to use if variable is undefined + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=5" + _var = 7; + hintSilent format ["_var=%1", RETDEF(_var,5)]; // "_var=7" + (end example) +Author: + 654wak654 +------------------------------------------- */ +#define RETDEF(VARIABLE,DEFAULT_VALUE) (if (isNil {VARIABLE}) then [{DEFAULT_VALUE}, {VARIABLE}]) + +/* ------------------------------------------- +Macro: RETNIL() + If a variable is undefined, return the value nil. Otherwise, return the + variable itself. + +Parameters: + VARIABLE - the variable to check + +Example: + (begin example) + // _var is undefined + hintSilent format ["_var=%1", RETNIL(_var)]; // "_var=any" + (end example) + +Author: + Alef (see CBA issue #8514) +------------------------------------------- */ +#define RETNIL(VARIABLE) RETDEF(VARIABLE,nil) + +/* ------------------------------------------- +Macros: TRACE_n() + Log a message and 1-8 variables to the RPT log. + + Only run if is defined. + + TRACE_1(MESSAGE,A) - Log 1 variable. + TRACE_2(MESSAGE,A,B) - Log 2 variables. + TRACE_3(MESSAGE,A,B,C) - Log 3 variables. + TRACE_4(MESSAGE,A,B,C,D) - Log 4 variables. + TRACE_5(MESSAGE,A,B,C,D,E) - Log 5 variables. + TRACE_6(MESSAGE,A,B,C,D,E,F) - Log 6 variables. + TRACE_7(MESSAGE,A,B,C,D,E,F,G) - Log 7 variables. + TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) - Log 8 variables. + TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) - Log 9 variables. + +Parameters: + MESSAGE - Message to add to the trace [String] + A..H - Variable names to log values of [Any] + +Example: + (begin example) + TRACE_3("After takeoff",_vehicle player,getPos (_vehicle player), getPosASL (_vehicle player)); + (end) + +Author: + Spooner +------------------------------------------- */ +#define PFORMAT_1(MESSAGE,A) \ + format ['%1: A=%2', MESSAGE, RETNIL(A)] + +#define PFORMAT_2(MESSAGE,A,B) \ + format ['%1: A=%2, B=%3', MESSAGE, RETNIL(A), RETNIL(B)] + +#define PFORMAT_3(MESSAGE,A,B,C) \ + format ['%1: A=%2, B=%3, C=%4', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C)] + +#define PFORMAT_4(MESSAGE,A,B,C,D) \ + format ['%1: A=%2, B=%3, C=%4, D=%5', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D)] + +#define PFORMAT_5(MESSAGE,A,B,C,D,E) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E)] + +#define PFORMAT_6(MESSAGE,A,B,C,D,E,F) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F)] + +#define PFORMAT_7(MESSAGE,A,B,C,D,E,F,G) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G)] + +#define PFORMAT_8(MESSAGE,A,B,C,D,E,F,G,H) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H)] + +#define PFORMAT_9(MESSAGE,A,B,C,D,E,F,G,H,I) \ + format ['%1: A=%2, B=%3, C=%4, D=%5, E=%6, F=%7, G=%8, H=%9, I=%10', MESSAGE, RETNIL(A), RETNIL(B), RETNIL(C), RETNIL(D), RETNIL(E), RETNIL(F), RETNIL(G), RETNIL(H), RETNIL(I)] + + +#ifdef DEBUG_MODE_FULL +#define TRACE_1(MESSAGE,A) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_1(str diag_frameNo + ' ' + (MESSAGE),A)) +#define TRACE_2(MESSAGE,A,B) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_2(str diag_frameNo + ' ' + (MESSAGE),A,B)) +#define TRACE_3(MESSAGE,A,B,C) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_3(str diag_frameNo + ' ' + (MESSAGE),A,B,C)) +#define TRACE_4(MESSAGE,A,B,C,D) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_4(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D)) +#define TRACE_5(MESSAGE,A,B,C,D,E) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_5(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E)) +#define TRACE_6(MESSAGE,A,B,C,D,E,F) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_6(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F)) +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_7(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G)) +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_8(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H)) +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) LOG_SYS_FILELINENUMBERS('TRACE',PFORMAT_9(str diag_frameNo + ' ' + (MESSAGE),A,B,C,D,E,F,G,H,I)) +#else +#define TRACE_1(MESSAGE,A) /* disabled */ +#define TRACE_2(MESSAGE,A,B) /* disabled */ +#define TRACE_3(MESSAGE,A,B,C) /* disabled */ +#define TRACE_4(MESSAGE,A,B,C,D) /* disabled */ +#define TRACE_5(MESSAGE,A,B,C,D,E) /* disabled */ +#define TRACE_6(MESSAGE,A,B,C,D,E,F) /* disabled */ +#define TRACE_7(MESSAGE,A,B,C,D,E,F,G) /* disabled */ +#define TRACE_8(MESSAGE,A,B,C,D,E,F,G,H) /* disabled */ +#define TRACE_9(MESSAGE,A,B,C,D,E,F,G,H,I) /* disabled */ +#endif + +/* ------------------------------------------- +Group: General +------------------------------------------- */ + +// ************************************* +// Internal Functions +#define DOUBLES(var1,var2) var1##_##var2 +#define TRIPLES(var1,var2,var3) var1##_##var2##_##var3 +#define QUOTE(var1) #var1 + +#ifdef MODULAR + #define COMPONENT_T DOUBLES(t,COMPONENT) + #define COMPONENT_M DOUBLES(m,COMPONENT) + #define COMPONENT_S DOUBLES(s,COMPONENT) + #define COMPONENT_C DOUBLES(c,COMPONENT) + #define COMPONENT_F COMPONENT_C +#else + #define COMPONENT_T COMPONENT + #define COMPONENT_M COMPONENT + #define COMPONENT_S COMPONENT + #define COMPONENT_F COMPONENT + #define COMPONENT_C COMPONENT +#endif + +/* ------------------------------------------- +Macro: INC() + +Description: + Increase a number by one. + +Parameters: + VAR - Variable to increment [Number] + +Example: + (begin example) + _counter = 0; + INC(_counter); + // _counter => 1 + (end) + +Author: + Spooner +------------------------------------------- */ +#define INC(var) var = (var) + 1 + +/* ------------------------------------------- +Macro: DEC() + +Description: + Decrease a number by one. + +Parameters: + VAR - Variable to decrement [Number] + +Example: + (begin example) + _counter = 99; + DEC(_counter); + // _counter => 98 + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEC(var) var = (var) - 1 + +/* ------------------------------------------- +Macro: ADD() + +Description: + Add a value to a variable. Variable and value should be both Numbers or both Strings. + +Parameters: + VAR - Variable to add to [Number or String] + VALUE - Value to add [Number or String] + +Examples: + (begin example) + _counter = 2; + ADD(_counter,3); + // _counter => 5 + (end) + (begin example) + _str = "hello"; + ADD(_str," "); + ADD(_str,"Fred"); + // _str => "hello Fred" + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ADD(var1,var2) var1 = (var1) + (var2) + +/* ------------------------------------------- +Macro: SUB() + +Description: + Subtract a value from a number variable. VAR and VALUE should both be Numbers. + +Parameters: + VAR - Variable to subtract from [Number] + VALUE - Value to subtract [Number] + +Examples: + (begin example) + _numChickens = 2; + SUB(_numChickens,3); + // _numChickens => -1 + (end) +------------------------------------------- */ +#define SUB(var1,var2) var1 = (var1) - (var2) + +/* ------------------------------------------- +Macro: REM() + +Description: + Remove an element from an array each time it occurs. + + This recreates the entire array, so use BIS_fnc_removeIndex if modification of the original array is required + or if only one of the elements that matches ELEMENT needs to be removed. + +Parameters: + ARRAY - Array to modify [Array] + ELEMENT - Element to remove [Any] + +Examples: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + REM(_array,3); + // _array = [1, 2, 4, 8]; + (end) + +Author: + Spooner +------------------------------------------- */ +#define REM(var1,var2) SUB(var1,[var2]) + +/* ------------------------------------------- +Macro: PUSH() + +Description: + Appends a single value onto the end of an ARRAY. Change is made to the ARRAY itself, not creating a new array. + +Parameters: + ARRAY - Array to push element onto [Array] + ELEMENT - Element to push [Any] + +Examples: + (begin example) + _fish = ["blue", "green", "smelly"]; + PUSH(_fish,"monkey-flavoured"); + // _fish => ["blue", "green", "smelly", "monkey-flavoured"] + (end) + +Author: + Spooner +------------------------------------------- */ +#define PUSH(var1,var2) (var1) pushBack (var2) + +/* ------------------------------------------- +Macro: MAP() +Description: + Applies given code to each element of the array, then assigns the + resulting array to the original +Parameters: + ARRAY - Array to be modified + CODE - Code that'll be applied to each element of the array. +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + MAP(_array,_x + 1); + // _array is now [2, 3, 4, 5, 4, 9]; + (end) +Author: + 654wak654 +------------------------------------------- */ +#define MAP(ARR,CODE) ARR = ARR apply {CODE} + +/* ------------------------------------------- +Macro: FILTER() +Description: + Filters an array based on given code, then assigns the resulting array + to the original +Parameters: + ARRAY - Array to be filtered + CODE - Condition to pick elements +Example: + (begin example) + _array = [1, 2, 3, 4, 3, 8]; + FILTER(_array,_x % 2 == 0) + // _array is now [2, 4, 8]; + (end) +Author: + Commy2 +------------------------------------------- */ +#define FILTER(ARR,CODE) ARR = ARR select {CODE} + +/* ------------------------------------------- +Macro: UNIQUE() +Description: + Removes duplicate values in given array +Parameters: + ARRAY - The array to be modified +Example: + (begin example) + _someArray = [4, 4, 5, 5, 5, 2]; + UNIQUE(_someArray); + // _someArray is now [4, 5, 2] + (end) +Author: + Commy2 +------------------------------------------- */ +#define UNIQUE(ARR) ARR = ARR arrayIntersect ARR + +/* ------------------------------------------- +Macro: INTERSECTION() +Description: + Finds unique common elements between two arrays and assigns them + to the first array +Parameters: + ARRAY0 - The array to be modified + ARRAY1 - The array to find intersections with +Example: + (begin example) + _someArray = [1, 2, 3, 4, 5, 5]; + _anotherArray = [4, 5, 6, 7]; + INTERSECTION(_someArray,_anotherArray); + // _someArray is now [4, 5] + (end) +Author: + 654wak654 +------------------------------------------- */ +#define INTERSECTION(ARG0,ARG1) ARG0 = ARG0 arrayIntersect (ARG1) + +/* ------------------------------------------- +Macro: ISNILS() + +Description: + Sets a variable with a value, but only if it is undefined. + +Parameters: + VARIABLE - Variable to set [Any, not nil] + DEFAULT_VALUE - Value to set VARIABLE to if it is undefined [Any, not nil] + +Examples: + (begin example) + // _fish is undefined + ISNILS(_fish,0); + // _fish => 0 + (end) + (begin example) + _fish = 12; + // ...later... + ISNILS(_fish,0); + // _fish => 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define ISNILS(VARIABLE,DEFAULT_VALUE) if (isNil #VARIABLE) then { VARIABLE = DEFAULT_VALUE } +#define ISNILS2(var1,var2,var3,var4) ISNILS(TRIPLES(var1,var2,var3),var4) +#define ISNILS3(var1,var2,var3) ISNILS(DOUBLES(var1,var2),var3) +#define ISNIL(var1,var2) ISNILS2(PREFIX,COMPONENT,var1,var2) +#define ISNILMAIN(var1,var2) ISNILS3(PREFIX,var1,var2) + +#define CREATELOGICS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"] +#define CREATELOGICLOCALS(var1,var2) var1##_##var2 = "LOGIC" createVehicleLocal [0, 0, 0] +#define CREATELOGICGLOBALS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit ["LOGIC", [0, 0, 0], [], 0, "NONE"]; publicVariable QUOTE(DOUBLES(var1,var2)) +#define CREATELOGICGLOBALTESTS(var1,var2) var1##_##var2 = ([sideLogic] call CBA_fnc_getSharedGroup) createUnit [QUOTE(DOUBLES(ADDON,logic)), [0, 0, 0], [], 0, "NONE"] + +#define GETVARS(var1,var2,var3) (var1##_##var2 getVariable #var3) +#define GETVARMAINS(var1,var2) GETVARS(var1,MAINLOGIC,var2) + +#ifndef PATHTO_SYS + #define PATHTO_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3.sqf +#endif +#ifndef PATHTOF_SYS + #define PATHTOF_SYS(var1,var2,var3) \MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#ifndef PATHTOF2_SYS + #define PATHTOF2_SYS(var1,var2,var3) MAINPREFIX\var1\SUBPREFIX\var2\var3 +#endif + +#define PATHTO_R(var1) PATHTOF2_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_T(var1) PATHTOF_SYS(PREFIX,COMPONENT_T,var1) +#define PATHTO_M(var1) PATHTOF_SYS(PREFIX,COMPONENT_M,var1) +#define PATHTO_S(var1) PATHTOF_SYS(PREFIX,COMPONENT_S,var1) +#define PATHTO_C(var1) PATHTOF_SYS(PREFIX,COMPONENT_C,var1) +#define PATHTO_F(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) + +// Already quoted "" +#define QPATHTO_R(var1) QUOTE(PATHTO_R(var1)) +#define QPATHTO_T(var1) QUOTE(PATHTO_T(var1)) +#define QPATHTO_M(var1) QUOTE(PATHTO_M(var1)) +#define QPATHTO_S(var1) QUOTE(PATHTO_S(var1)) +#define QPATHTO_C(var1) QUOTE(PATHTO_C(var1)) +#define QPATHTO_F(var1) QUOTE(PATHTO_F(var1)) + +// This only works for binarized configs after recompiling the pbos +// TODO: Reduce amount of calls / code.. +#define COMPILE_FILE2_CFG_SYS(var1) compile preprocessFileLineNumbers var1 +#define COMPILE_FILE2_SYS(var1) COMPILE_FILE2_CFG_SYS(var1) + +#define COMPILE_FILE_SYS(var1,var2,var3) COMPILE_FILE2_SYS('PATHTO_SYS(var1,var2,var3)') +#define COMPILE_FILE_CFG_SYS(var1,var2,var3) COMPILE_FILE2_CFG_SYS('PATHTO_SYS(var1,var2,var3)') + +#define SETVARS(var1,var2) var1##_##var2 setVariable +#define SETVARMAINS(var1) SETVARS(var1,MAINLOGIC) +#define GVARMAINS(var1,var2) var1##_##var2 +#define CFGSETTINGSS(var1,var2) configFile >> "CfgSettings" >> #var1 >> #var2 +//#define SETGVARS(var1,var2,var3) var1##_##var2##_##var3 = +//#define SETGVARMAINS(var1,var2) var1##_##var2 = + +// Compile-Once, JIT: On first use. +// #define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = { var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_fnc_##var3 } else { _this call var1##_fnc_##var3 } } +// #define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = { var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)); if (isNil "_this") then { call var1##_##var2##_fnc_##var3 } else { _this call var1##_##var2##_fnc_##var3 } } +// #define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = { var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)); if (isNil "_this") then { call var1##_##var2##_fnc_##var4 } else { _this call var1##_##var2##_fnc_##var4 } } + +// Compile-Once, at Macro. As opposed to Compile-Once, on first use. +#define PREPMAIN_SYS(var1,var2,var3) var1##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS(var1,var2,var3) var1##_##var2##_fnc_##var3 = COMPILE_FILE_SYS(var1,var2,DOUBLES(fnc,var3)) +#define PREP_SYS2(var1,var2,var3,var4) var1##_##var2##_fnc_##var4 = COMPILE_FILE_SYS(var1,var3,DOUBLES(fnc,var4)) + +#define LSTR(var1) TRIPLES(ADDON,STR,var1) + +#ifndef DEBUG_SETTINGS + #define DEBUG_SETTINGS [false, true, false] +#endif + +#define MSG_INIT QUOTE(Initializing: ADDON version: VERSION) + +// ************************************* +// User Functions +#define CFGSETTINGS CFGSETTINGSS(PREFIX,COMPONENT) +#define PATHTO(var1) PATHTO_SYS(PREFIX,COMPONENT_F,var1) +#define PATHTOF(var1) PATHTOF_SYS(PREFIX,COMPONENT,var1) +#define PATHTOEF(var1,var2) PATHTOF_SYS(PREFIX,var1,var2) +#define QPATHTOF(var1) QUOTE(PATHTOF(var1)) +#define QPATHTOEF(var1,var2) QUOTE(PATHTOEF(var1,var2)) + +#define COMPILE_FILE(var1) COMPILE_FILE_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE_CFG(var1) COMPILE_FILE_CFG_SYS(PREFIX,COMPONENT_F,var1) +#define COMPILE_FILE2(var1) COMPILE_FILE2_SYS('var1') +#define COMPILE_FILE2_CFG(var1) COMPILE_FILE2_CFG_SYS('var1') + +#define COMPILE_SCRIPT(var1) compileScript ['PATHTO_SYS(PREFIX,COMPONENT_F,var1)'] + + +#define VERSIONING_SYS(var1) class CfgSettings \ +{ \ + class CBA \ + { \ + class Versioning \ + { \ + class var1 \ + { \ + }; \ + }; \ + }; \ +}; + +#define VERSIONING VERSIONING_SYS(PREFIX) + +/* ------------------------------------------- +Macro: GVAR() + Get full variable identifier for a global variable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + (begin example) + GVAR(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_FrogDancing_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVAR(var1) DOUBLES(ADDON,var1) +#define EGVAR(var1,var2) TRIPLES(PREFIX,var1,var2) +#define QGVAR(var1) QUOTE(GVAR(var1)) +#define QEGVAR(var1,var2) QUOTE(EGVAR(var1,var2)) +#define QQGVAR(var1) QUOTE(QGVAR(var1)) +#define QQEGVAR(var1,var2) QUOTE(QEGVAR(var1,var2)) + +/* ------------------------------------------- +Macro: GVARMAIN() + Get full variable identifier for a global variable owned by this addon. + +Parameters: + VARIABLE - Partial name of global variable owned by this addon [Any]. + +Example: + (begin example) + GVARMAIN(frog) = 12; + // In SPON_FrogDancing component, equivalent to SPON_frog = 12 + (end) + +Author: + Sickboy +------------------------------------------- */ +#define GVARMAIN(var1) GVARMAINS(PREFIX,var1) +#define QGVARMAIN(var1) QUOTE(GVARMAIN(var1)) +#define QQGVARMAIN(var1) QUOTE(QGVARMAIN(var1)) +// TODO: What's this? +#define SETTINGS DOUBLES(PREFIX,settings) +#define CREATELOGIC CREATELOGICS(PREFIX,COMPONENT) +#define CREATELOGICGLOBAL CREATELOGICGLOBALS(PREFIX,COMPONENT) +#define CREATELOGICGLOBALTEST CREATELOGICGLOBALTESTS(PREFIX,COMPONENT) +#define CREATELOGICLOCAL CREATELOGICLOCALS(PREFIX,COMPONENT) +#define CREATELOGICMAIN CREATELOGICS(PREFIX,MAINLOGIC) +#define GETVAR(var1) GETVARS(PREFIX,COMPONENT,var1) +#define SETVAR SETVARS(PREFIX,COMPONENT) +#define SETVARMAIN SETVARMAINS(PREFIX) +#define IFCOUNT(var1,var2,var3) if (count var1 > var2) then { var3 = var1 select var2 }; + +/* ------------------------------------------- +Macro: PREP() + +Description: + Defines a function. + + Full file path: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + + Resulting function name: + 'PREFIX_COMPONENT_' + + The PREP macro should be placed in a script run by a XEH preStart and XEH preInit event. + + The PREP macro allows for CBA function caching, which drastically speeds up load times. + Beware though that function caching is enabled by default and as such to disable it, you need to + #define DISABLE_COMPILE_CACHE above your #include "script_components.hpp" include! + + The function will be defined in ui and mission namespace. It can not be overwritten without + a mission restart. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + PREP(banana); + call FUNC(banana); + (end) + +Author: + dixon13 + ------------------------------------------- */ +//#define PREP(var1) PREP_SYS(PREFIX,COMPONENT_F,var1) + +#ifdef DISABLE_COMPILE_CACHE + #define PREP(var1) TRIPLES(ADDON,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' + #define PREPMAIN(var1) TRIPLES(PREFIX,fnc,var1) = compile preProcessFileLineNumbers 'PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))' +#else + #define PREP(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(ADDON,fnc,var1)'] call SLX_XEH_COMPILE_NEW + #define PREPMAIN(var1) ['PATHTO_SYS(PREFIX,COMPONENT_F,DOUBLES(fnc,var1))', 'TRIPLES(PREFIX,fnc,var1)'] call SLX_XEH_COMPILE_NEW +#endif + +/* ------------------------------------------- +Macro: PATHTO_FNC() + +Description: + Defines a function inside CfgFunctions. + + Full file path in addons: + '\MAINPREFIX\PREFIX\SUBPREFIX\COMPONENT\fnc_.sqf' + Define 'RECOMPILE' to enable recompiling. + Define 'SKIP_FUNCTION_HEADER' to skip adding function header. + +Parameters: + FUNCTION NAME - Name of the function, unquoted + +Examples: + (begin example) + // file name: fnc_addPerFrameHandler.sqf + class CfgFunctions { + class CBA { + class Misc { + PATHTO_FNC(addPerFrameHandler); + }; + }; + }; + // -> CBA_fnc_addPerFrameHandler + (end) + +Author: + dixon13, commy2 + ------------------------------------------- */ +#ifdef RECOMPILE + #undef RECOMPILE + #define RECOMPILE recompile = 1 +#else + #define RECOMPILE recompile = 0 +#endif +// Set function header type: -1 - no header; 0 - default header; 1 - system header. +#ifdef SKIP_FUNCTION_HEADER + #define CFGFUNCTION_HEADER headerType = -1 +#else + #define CFGFUNCTION_HEADER headerType = 0 +#endif + +#define PATHTO_FNC(func) class func {\ + file = QPATHTOF(DOUBLES(fnc,func).sqf);\ + CFGFUNCTION_HEADER;\ + RECOMPILE;\ +} + +#define FUNC(var1) TRIPLES(ADDON,fnc,var1) +#define FUNCMAIN(var1) TRIPLES(PREFIX,fnc,var1) +#define FUNC_INNER(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),fnc,var2) +#define EFUNC(var1,var2) FUNC_INNER(var1,var2) +#define QFUNC(var1) QUOTE(FUNC(var1)) +#define QFUNCMAIN(var1) QUOTE(FUNCMAIN(var1)) +#define QFUNC_INNER(var1,var2) QUOTE(FUNC_INNER(var1,var2)) +#define QEFUNC(var1,var2) QUOTE(EFUNC(var1,var2)) +#define QQFUNC(var1) QUOTE(QFUNC(var1)) +#define QQFUNCMAIN(var1) QUOTE(QFUNCMAIN(var1)) +#define QQFUNC_INNER(var1,var2) QUOTE(QFUNC_INNER(var1,var2)) +#define QQEFUNC(var1,var2) QUOTE(QEFUNC(var1,var2)) + +#ifndef PRELOAD_ADDONS + #define PRELOAD_ADDONS class CfgAddons \ +{ \ + class PreloadAddons \ + { \ + class ADDON \ + { \ + list[]={ QUOTE(ADDON) }; \ + }; \ + }; \ +} +#endif + +/* ------------------------------------------- +Macros: ARG_#() + Select from list of array arguments + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Rommel +------------------------------------------- */ +#define ARG_1(A,B) ((A) select (B)) +#define ARG_2(A,B,C) (ARG_1(ARG_1(A,B),C)) +#define ARG_3(A,B,C,D) (ARG_1(ARG_2(A,B,C),D)) +#define ARG_4(A,B,C,D,E) (ARG_1(ARG_3(A,B,C,D),E)) +#define ARG_5(A,B,C,D,E,F) (ARG_1(ARG_4(A,B,C,D,E),F)) +#define ARG_6(A,B,C,D,E,F,G) (ARG_1(ARG_5(A,B,C,D,E,F),G)) +#define ARG_7(A,B,C,D,E,F,G,H) (ARG_1(ARG_6(A,B,C,D,E,E,F,G),H)) +#define ARG_8(A,B,C,D,E,F,G,H,I) (ARG_1(ARG_7(A,B,C,D,E,E,F,G,H),I)) + +/* ------------------------------------------- +Macros: ARR_#() + Create list from arguments. Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + VARIABLE(1-8) - elements for the list + +Author: + Nou +------------------------------------------- */ +#define ARR_1(ARG1) ARG1 +#define ARR_2(ARG1,ARG2) ARG1, ARG2 +#define ARR_3(ARG1,ARG2,ARG3) ARG1, ARG2, ARG3 +#define ARR_4(ARG1,ARG2,ARG3,ARG4) ARG1, ARG2, ARG3, ARG4 +#define ARR_5(ARG1,ARG2,ARG3,ARG4,ARG5) ARG1, ARG2, ARG3, ARG4, ARG5 +#define ARR_6(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 +#define ARR_7(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7 +#define ARR_8(ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8 + +/* ------------------------------------------- +Macros: FORMAT_#(STR, ARG1) + Format - Useful for working around , in macro parameters. + 1-8 arguments possible. + +Parameters: + STRING - string used by format + VARIABLE(1-8) - elements for usage in format + +Author: + Nou & Sickboy +------------------------------------------- */ +#define FORMAT_1(STR,ARG1) format[STR, ARG1] +#define FORMAT_2(STR,ARG1,ARG2) format[STR, ARG1, ARG2] +#define FORMAT_3(STR,ARG1,ARG2,ARG3) format[STR, ARG1, ARG2, ARG3] +#define FORMAT_4(STR,ARG1,ARG2,ARG3,ARG4) format[STR, ARG1, ARG2, ARG3, ARG4] +#define FORMAT_5(STR,ARG1,ARG2,ARG3,ARG4,ARG5) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5] +#define FORMAT_6(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6] +#define FORMAT_7(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7] +#define FORMAT_8(STR,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) format[STR, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8] + +// CONTROL(46) 12 +#define DISPLAY(A) (findDisplay A) +#define CONTROL(A) DISPLAY(A) displayCtrl + +/* ------------------------------------------- +Macros: IS_x() + Checking the data types of variables. + + IS_ARRAY() - Array + IS_BOOL() - Boolean + IS_BOOLEAN() - UI display handle(synonym for ) + IS_CODE() - Code block (i.e a compiled function) + IS_CONFIG() - Configuration + IS_CONTROL() - UI control handle. + IS_DISPLAY() - UI display handle. + IS_FUNCTION() - A compiled function (synonym for ) + IS_GROUP() - Group. + IS_INTEGER() - Is a number a whole number? + IS_LOCATION() - World location. + IS_NUMBER() - A floating point number (synonym for ) + IS_OBJECT() - World object. + IS_SCALAR() - Floating point number. + IS_SCRIPT() - A script handle (as returned by execVM and spawn commands). + IS_SIDE() - Game side. + IS_STRING() - World object. + IS_TEXT() - Structured text. + +Parameters: + VARIABLE - Variable to check if it is of a particular type [Any, not nil] + +Author: + Spooner +------------------------------------------- */ +#define IS_META_SYS(VAR,TYPE) (if (isNil {VAR}) then {false} else {(VAR) isEqualType TYPE}) +#define IS_ARRAY(VAR) IS_META_SYS(VAR,[]) +#define IS_BOOL(VAR) IS_META_SYS(VAR,false) +#define IS_CODE(VAR) IS_META_SYS(VAR,{}) +#define IS_CONFIG(VAR) IS_META_SYS(VAR,configNull) +#define IS_CONTROL(VAR) IS_META_SYS(VAR,controlNull) +#define IS_DISPLAY(VAR) IS_META_SYS(VAR,displayNull) +#define IS_GROUP(VAR) IS_META_SYS(VAR,grpNull) +#define IS_OBJECT(VAR) IS_META_SYS(VAR,objNull) +#define IS_SCALAR(VAR) IS_META_SYS(VAR,0) +#define IS_SCRIPT(VAR) IS_META_SYS(VAR,scriptNull) +#define IS_SIDE(VAR) IS_META_SYS(VAR,west) +#define IS_STRING(VAR) IS_META_SYS(VAR,"STRING") +#define IS_TEXT(VAR) IS_META_SYS(VAR,text "") +#define IS_LOCATION(VAR) IS_META_SYS(VAR,locationNull) + +#define IS_BOOLEAN(VAR) IS_BOOL(VAR) +#define IS_FUNCTION(VAR) IS_CODE(VAR) +#define IS_INTEGER(VAR) (if (IS_SCALAR(VAR)) then {floor (VAR) == (VAR)} else {false}) +#define IS_NUMBER(VAR) IS_SCALAR(VAR) + +#define FLOAT_TO_STRING(num) (if (_this == 0) then {"0"} else {str parseNumber (str (_this % _this) + str floor abs _this) + "." + (str (abs _this - floor abs _this) select [2]) + "0"}) + +/* ------------------------------------------- +Macro: SCRIPT() + Sets name of script (relies on PREFIX and COMPONENT values being #defined). + Define 'SKIP_SCRIPT_NAME' to skip adding scriptName. + +Parameters: + NAME - Name of script [Indentifier] + +Example: + (begin example) + SCRIPT(eradicateMuppets); + (end) + +Author: + Spooner +------------------------------------------- */ +#ifndef SKIP_SCRIPT_NAME + #define SCRIPT(NAME) scriptName 'PREFIX\COMPONENT\NAME' +#else + #define SCRIPT(NAME) /* nope */ +#endif + +/* ------------------------------------------- +Macros: EXPLODE_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Splitting an ARRAY into a number of variables (A, B, C, etc). + + Note that this NOT does make the created variables private. + _PVT variants do. + + EXPLODE_1(ARRAY,A,B) - Split a 1-element array into separate variable. + EXPLODE_2(ARRAY,A,B) - Split a 2-element array into separate variables. + EXPLODE_3(ARRAY,A,B,C) - Split a 3-element array into separate variables. + EXPLODE_4(ARRAY,A,B,C,D) - Split a 4-element array into separate variables. + EXPLODE_5(ARRAY,A,B,C,D,E) - Split a 5-element array into separate variables. + EXPLODE_6(ARRAY,A,B,C,D,E,F) - Split a 6-element array into separate variables. + EXPLODE_7(ARRAY,A,B,C,D,E,F,G) - Split a 7-element array into separate variables. + EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) - Split a 8-element array into separate variables. + EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) - Split a 9-element array into separate variables. + +Parameters: + ARRAY - Array to read from [Array] + A..H - Names of variables to set from array [Identifier] + +Example: + (begin example) + _array = ["fred", 156.8, 120.9]; + EXPLODE_3(_array,_name,_height,_weight); + (end) + +Author: + Spooner +------------------------------------------- */ +#define EXPLODE_1_SYS(ARRAY,A) A = ARRAY param [0] +#define EXPLODE_1(ARRAY,A) EXPLODE_1_SYS(ARRAY,A); TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) +#define EXPLODE_1_PVT(ARRAY,A) ARRAY params [#A]; TRACE_1("EXPLODE_1, " + QUOTE(ARRAY),A) + +#define EXPLODE_2_SYS(ARRAY,A,B) EXPLODE_1_SYS(ARRAY,A); B = ARRAY param [1] +#define EXPLODE_2(ARRAY,A,B) EXPLODE_2_SYS(ARRAY,A,B); TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) +#define EXPLODE_2_PVT(ARRAY,A,B) ARRAY params [#A,#B]; TRACE_2("EXPLODE_2, " + QUOTE(ARRAY),A,B) + +#define EXPLODE_3_SYS(ARRAY,A,B,C) EXPLODE_2_SYS(ARRAY,A,B); C = ARRAY param [2] +#define EXPLODE_3(ARRAY,A,B,C) EXPLODE_3_SYS(ARRAY,A,B,C); TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) +#define EXPLODE_3_PVT(ARRAY,A,B,C) ARRAY params [#A,#B,#C]; TRACE_3("EXPLODE_3, " + QUOTE(ARRAY),A,B,C) + +#define EXPLODE_4_SYS(ARRAY,A,B,C,D) EXPLODE_3_SYS(ARRAY,A,B,C); D = ARRAY param [3] +#define EXPLODE_4(ARRAY,A,B,C,D) EXPLODE_4_SYS(ARRAY,A,B,C,D); TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) +#define EXPLODE_4_PVT(ARRAY,A,B,C,D) ARRAY params [#A,#B,#C,#D]; TRACE_4("EXPLODE_4, " + QUOTE(ARRAY),A,B,C,D) + +#define EXPLODE_5_SYS(ARRAY,A,B,C,D,E) EXPLODE_4_SYS(ARRAY,A,B,C,D); E = ARRAY param [4] +#define EXPLODE_5(ARRAY,A,B,C,D,E) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) +#define EXPLODE_5_PVT(ARRAY,A,B,C,D,E) ARRAY params [#A,#B,#C,#D,#E]; TRACE_5("EXPLODE_5, " + QUOTE(ARRAY),A,B,C,D,E) + +#define EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F) EXPLODE_5_SYS(ARRAY,A,B,C,D,E); F = ARRAY param [5] +#define EXPLODE_6(ARRAY,A,B,C,D,E,F) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) +#define EXPLODE_6_PVT(ARRAY,A,B,C,D,E,F) ARRAY params [#A,#B,#C,#D,#E,#F]; TRACE_6("EXPLODE_6, " + QUOTE(ARRAY),A,B,C,D,E,F) + +#define EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G) EXPLODE_6_SYS(ARRAY,A,B,C,D,E,F); G = ARRAY param [6] +#define EXPLODE_7(ARRAY,A,B,C,D,E,F,G) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) +#define EXPLODE_7_PVT(ARRAY,A,B,C,D,E,F,G) ARRAY params [#A,#B,#C,#D,#E,#F,#G]; TRACE_7("EXPLODE_7, " + QUOTE(ARRAY),A,B,C,D,E,F,G) + +#define EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_7_SYS(ARRAY,A,B,C,D,E,F,G); H = ARRAY param [7] +#define EXPLODE_8(ARRAY,A,B,C,D,E,F,G,H) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) +#define EXPLODE_8_PVT(ARRAY,A,B,C,D,E,F,G,H) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H]; TRACE_8("EXPLODE_8, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H) + +#define EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_8_SYS(ARRAY,A,B,C,D,E,F,G,H); I = ARRAY param [8] +#define EXPLODE_9(ARRAY,A,B,C,D,E,F,G,H,I) EXPLODE_9_SYS(ARRAY,A,B,C,D,E,F,G,H,I); TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) +#define EXPLODE_9_PVT(ARRAY,A,B,C,D,E,F,G,H,I) ARRAY params [#A,#B,#C,#D,#E,#F,#G,#H,#I]; TRACE_9("EXPLODE_9, " + QUOTE(ARRAY),A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: xSTRING() + Get full string identifier from a stringtable owned by this component. + +Parameters: + VARIABLE - Partial name of global variable owned by this component [Any]. + +Example: + ADDON is CBA_Balls. + (begin example) + // Localized String (localize command must still be used with it) + LSTRING(Example); // STR_CBA_Balls_Example; + // Config String (note the $) + CSTRING(Example); // $STR_CBA_Balls_Example; + (end) + +Author: + Jonpas +------------------------------------------- */ +#ifndef STRING_MACROS_GUARD +#define STRING_MACROS_GUARD + #define LSTRING(var1) QUOTE(TRIPLES(STR,ADDON,var1)) + #define ELSTRING(var1,var2) QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) + #define CSTRING(var1) QUOTE(TRIPLES($STR,ADDON,var1)) + #define ECSTRING(var1,var2) QUOTE(TRIPLES($STR,DOUBLES(PREFIX,var1),var2)) + + #define LLSTRING(var1) localize QUOTE(TRIPLES(STR,ADDON,var1)) + #define LELSTRING(var1,var2) localize QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) +#endif + + +/* ------------------------------------------- +Group: Managing Function Parameters +------------------------------------------- */ + +/* ------------------------------------------- +Macros: PARAMS_n() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Setting variables based on parameters passed to a function. + + Each parameter is defines as private and set to the appropriate value from _this. + + PARAMS_1(A) - Get 1 parameter from the _this array (or _this if it's not an array). + PARAMS_2(A,B) - Get 2 parameters from the _this array. + PARAMS_3(A,B,C) - Get 3 parameters from the _this array. + PARAMS_4(A,B,C,D) - Get 4 parameters from the _this array. + PARAMS_5(A,B,C,D,E) - Get 5 parameters from the _this array. + PARAMS_6(A,B,C,D,E,F) - Get 6 parameters from the _this array. + PARAMS_7(A,B,C,D,E,F,G) - Get 7 parameters from the _this array. + PARAMS_8(A,B,C,D,E,F,G,H) - Get 8 parameters from the _this array. + +Parameters: + A..H - Name of variable to read from _this [Identifier] + +Example: + A function called like this: + (begin example) + [_name,_address,_telephone] call recordPersonalDetails; + (end) + expects 3 parameters and those variables could be initialised at the start of the function definition with: + (begin example) + recordPersonalDetails = { + PARAMS_3(_name,_address,_telephone); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define PARAMS_1(A) EXPLODE_1_PVT(_this,A) +#define PARAMS_2(A,B) EXPLODE_2_PVT(_this,A,B) +#define PARAMS_3(A,B,C) EXPLODE_3_PVT(_this,A,B,C) +#define PARAMS_4(A,B,C,D) EXPLODE_4_PVT(_this,A,B,C,D) +#define PARAMS_5(A,B,C,D,E) EXPLODE_5_PVT(_this,A,B,C,D,E) +#define PARAMS_6(A,B,C,D,E,F) EXPLODE_6_PVT(_this,A,B,C,D,E,F) +#define PARAMS_7(A,B,C,D,E,F,G) EXPLODE_7_PVT(_this,A,B,C,D,E,F,G) +#define PARAMS_8(A,B,C,D,E,F,G,H) EXPLODE_8_PVT(_this,A,B,C,D,E,F,G,H) +#define PARAMS_9(A,B,C,D,E,F,G,H,I) EXPLODE_9_PVT(_this,A,B,C,D,E,F,G,H,I) + +/* ------------------------------------------- +Macro: DEFAULT_PARAM() + DEPRECATED - Use param/params commands added in Arma 3 1.48 + + Getting a default function parameter. This may be used together with to have a mix of required and + optional parameters. + +Parameters: + INDEX - Index of parameter in _this [Integer, 0+] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case the array is too short or the value at INDEX is nil [Any] + +Example: + A function called with optional parameters: + (begin example) + [_name] call myFunction; + [_name, _numberOfLegs] call myFunction; + [_name, _numberOfLegs, _hasAHead] call myFunction; + (end) + 1 required parameter and 2 optional parameters. Those variables could be initialised at the start of the function + definition with: + (begin example) + myFunction = { + PARAMS_1(_name); + DEFAULT_PARAM(1,_numberOfLegs,2); + DEFAULT_PARAM(2,_hasAHead,true); + // Rest of function follows... + }; + (end) + +Author: + Spooner +------------------------------------------- */ +#define DEFAULT_PARAM(INDEX,NAME,DEF_VALUE) \ + private [#NAME,"_this"]; \ + ISNILS(_this,[]); \ + NAME = _this param [INDEX, DEF_VALUE]; \ + TRACE_3("DEFAULT_PARAM",INDEX,NAME,DEF_VALUE) + +/* ------------------------------------------- +Macro: KEY_PARAM() + Get value from key in _this list, return default when key is not included in list. + +Parameters: + KEY - Key name [String] + NAME - Name of the variable to set [Identifier] + DEF_VALUE - Default value to use in case key not found [ANY] + +Example: + + +Author: + Muzzleflash +------------------------------------------- */ +#define KEY_PARAM(KEY,NAME,DEF_VALUE) \ + private #NAME; \ + NAME = [toLower KEY, toUpper KEY, DEF_VALUE, RETNIL(_this)] call CBA_fnc_getArg; \ + TRACE_3("KEY_PARAM",KEY,NAME,DEF_VALUE) + +/* ------------------------------------------- +Group: Assertions +------------------------------------------- */ + +#define ASSERTION_ERROR(MESSAGE) ERROR_WITH_TITLE("Assertion failed!",MESSAGE) + +/* ------------------------------------------- +Macro: ASSERT_TRUE() + Asserts that a CONDITION is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + ASSERT_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_TRUE(CONDITION,MESSAGE) \ + if (not (CONDITION)) then \ + { \ + ASSERTION_ERROR('Assertion (CONDITION) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_FALSE() + Asserts that a CONDITION is false. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + ASSERT_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_FALSE(CONDITION,MESSAGE) \ + if (CONDITION) then \ + { \ + ASSERTION_ERROR('Assertion (not (CONDITION)) failed!\n\n' + (MESSAGE)) \ + } + +/* ------------------------------------------- +Macro: ASSERT_OP() + Asserts that (A OPERATOR B) is true. When an assertion fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + ASSERT_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_OP(A,OPERATOR,B,MESSAGE) \ + if (not ((A) OPERATOR (B))) then \ + { \ + ASSERTION_ERROR('Assertion (A OPERATOR B) failed!\n' + 'A: ' + (str (A)) + '\n' + 'B: ' + (str (B)) + "\n\n" + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: ASSERT_DEFINED() + Asserts that a VARIABLE is defined. When an assertion fails, an error is raised with the given MESSAGE.. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + ASSERT_DEFINED("_anUndefinedVar","Too few fish!"); + ASSERT_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Spooner +------------------------------------------- */ +#define ASSERT_DEFINED(VARIABLE,MESSAGE) \ + if (isNil VARIABLE) then \ + { \ + ASSERTION_ERROR('Assertion (VARIABLE is defined) failed!\n\n' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Unit tests +------------------------------------------- */ +#define TEST_SUCCESS(MESSAGE) MESSAGE_WITH_TITLE("Test OK",MESSAGE) +#define TEST_FAIL(MESSAGE) ERROR_WITH_TITLE("Test FAIL",MESSAGE) + +/* ------------------------------------------- +Macro: TEST_TRUE() + Tests that a CONDITION is true. + If the condition is not true, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to assert as true [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is false [String] + +Example: + (begin example) + TEST_TRUE(_frogIsDead,"The frog is alive"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_TRUE(CONDITION, MESSAGE) \ + if (CONDITION) then \ + { \ + TEST_SUCCESS('(CONDITION)'); \ + } \ + else \ + { \ + TEST_FAIL('(CONDITION) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_FALSE() + Tests that a CONDITION is false. + If the condition is not false, an error is raised with the given MESSAGE. + +Parameters: + CONDITION - Condition to test as false [Boolean] + MESSSAGE - Message to display if (A OPERATOR B) is true [String] + +Example: + (begin example) + TEST_FALSE(_frogIsDead,"The frog died"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_FALSE(CONDITION, MESSAGE) \ + if (not (CONDITION)) then \ + { \ + TEST_SUCCESS('(not (CONDITION))'); \ + } \ + else \ + { \ + TEST_FAIL('(not (CONDITION)) ' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Macro: TEST_OP() + Tests that (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display if (A OPERATOR B) is false. [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_OP(A,OPERATOR,B,MESSAGE) \ + if ((A) OPERATOR (B)) then \ + { \ + TEST_SUCCESS('(A OPERATOR B)') \ + } \ + else \ + { \ + TEST_FAIL('(A OPERATOR B)') \ + }; + +/* ------------------------------------------- +Macro: TEST_DEFINED_AND_OP() + Tests that A and B are defined and (A OPERATOR B) is true. + If the test fails, an error is raised with the given MESSAGE. + +Parameters: + A - First value [Any] + OPERATOR - Binary operator to use [Operator] + B - Second value [Any] + MESSSAGE - Message to display [String] + +Example: + (begin example) + TEST_OP(_fish,>,5,"Too few fish!"); + (end) + +Author: + Killswitch, PabstMirror +------------------------------------------- */ +#define TEST_DEFINED_AND_OP(A,OPERATOR,B,MESSAGE) \ + if (isNil #A) then { \ + TEST_FAIL('(A is not defined) ' + (MESSAGE)); \ + } else { \ + if (isNil #B) then { \ + TEST_FAIL('(B is not defined) ' + (MESSAGE)); \ + } else { \ + if ((A) OPERATOR (B)) then { \ + TEST_SUCCESS('(A OPERATOR B) ' + (MESSAGE)) \ + } else { \ + TEST_FAIL('(A OPERATOR B) ' + (MESSAGE)) \ + }; }; }; + + +/* ------------------------------------------- +Macro: TEST_DEFINED() + Tests that a VARIABLE is defined. + +Parameters: + VARIABLE - Variable to test if defined [String or Function]. + MESSAGE - Message to display if variable is undefined [String]. + +Examples: + (begin example) + TEST_DEFINED("_anUndefinedVar","Too few fish!"); + TEST_DEFINED({ obj getVariable "anUndefinedVar" },"Too many fish!"); + (end) + +Author: + Killswitch +------------------------------------------- */ +#define TEST_DEFINED(VARIABLE,MESSAGE) \ + if (not isNil VARIABLE) then \ + { \ + TEST_SUCCESS('(' + VARIABLE + ' is defined)'); \ + } \ + else \ + { \ + TEST_FAIL('(' + VARIABLE + ' is not defined)' + (MESSAGE)); \ + } + +/* ------------------------------------------- +Group: Managing Deprecation +------------------------------------------- */ + +/* ------------------------------------------- +Macro: DEPRECATE_SYS() + Allow deprecation of a function that has been renamed. + + Replaces an old OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + NEW_FUNCTION - Full name of new function [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE_SYS(CBA_fnc_frog,CBA_fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE_SYS(OLD_FUNCTION,NEW_FUNCTION) \ + OLD_FUNCTION = { \ + WARNING('Deprecated function used: OLD_FUNCTION (new: NEW_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call NEW_FUNCTION } else { _this call NEW_FUNCTION }; \ + } + +/* ------------------------------------------- +Macro: DEPRECATE() + Allow deprecation of a function, in the current component, that has been renamed. + + Replaces an OLD_FUNCTION (which will have PREFIX_ prepended) with a NEW_FUNCTION + (PREFIX_ prepended) with the intention that the old function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, but runs the new function. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + NEW_FUNCTION - Name of new function, assuming PREFIX [Function] + +Example: + (begin example) + // After renaming CBA_fnc_frog as CBA_fnc_fish + DEPRECATE(fnc_frog,fnc_fish); + (end) + +Author: + Sickboy +------------------------------------------- */ +#define DEPRECATE(OLD_FUNCTION,NEW_FUNCTION) \ + DEPRECATE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),DOUBLES(PREFIX,NEW_FUNCTION)) + +/* ------------------------------------------- +Macro: OBSOLETE_SYS() + Replace a function that has become obsolete. + + Replace an obsolete OLD_FUNCTION with a simple COMMAND_FUNCTION, with the intention that anyone + using the function should replace it with the simple command, since the function will be disabled in the future. + + Shows a warning in RPT each time the deprecated function is used, and runs the command function. + +Parameters: + OLD_FUNCTION - Full name of old function [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE_SYS(CBA_fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE_SYS(OLD_FUNCTION,COMMAND_CODE) \ + OLD_FUNCTION = { \ + WARNING('Obsolete function used: (use: OLD_FUNCTION) in ADDON'); \ + if (isNil "_this") then { call COMMAND_CODE } else { _this call COMMAND_CODE }; \ + } + +/* ------------------------------------------- +Macro: OBSOLETE() + Replace a function, in the current component, that has become obsolete. + + Replace an obsolete OLD_FUNCTION (which will have PREFIX_ prepended) with a simple + COMMAND_CODE, with the intention that anyone using the function should replace it with the simple + command. + + Shows a warning in RPT each time the deprecated function is used. + +Parameters: + OLD_FUNCTION - Name of old function, assuming PREFIX [Identifier for function that does not exist any more] + COMMAND_CODE - Code to replace the old function [Function] + +Example: + (begin example) + // In Arma2, currentWeapon command made the CBA_fMyWeapon function obsolete: + OBSOLETE(fMyWeapon,{ currentWeapon player }); + (end) + +Author: + Spooner +------------------------------------------- */ +#define OBSOLETE(OLD_FUNCTION,COMMAND_CODE) \ + OBSOLETE_SYS(DOUBLES(PREFIX,OLD_FUNCTION),COMMAND_CODE) + +#define BWC_CONFIG(NAME) class NAME { \ + units[] = {}; \ + weapons[] = {}; \ + requiredVersion = REQUIRED_VERSION; \ + requiredAddons[] = {}; \ + version = VERSION; \ +} + +// XEH Specific +#define XEH_CLASS CBA_Extended_EventHandlers +#define XEH_CLASS_BASE DOUBLES(XEH_CLASS,base) +#define XEH_DISABLED class EventHandlers { class XEH_CLASS {}; }; SLX_XEH_DISABLED = 1 +#define XEH_ENABLED class EventHandlers { class XEH_CLASS { EXTENDED_EVENTHANDLERS }; }; SLX_XEH_DISABLED = 0 + +// TODO: These are actually outdated; _Once ? +#define XEH_PRE_INIT QUOTE(call COMPILE_FILE(XEH_PreInit_Once)) +#define XEH_PRE_CINIT QUOTE(call COMPILE_FILE(XEH_PreClientInit_Once)) +#define XEH_PRE_SINIT QUOTE(call COMPILE_FILE(XEH_PreServerInit_Once)) + +#define XEH_POST_INIT QUOTE(call COMPILE_FILE(XEH_PostInit_Once)) +#define XEH_POST_CINIT QUOTE(call COMPILE_FILE(XEH_PostClientInit_Once)) +#define XEH_POST_SINIT QUOTE(call COMPILE_FILE(XEH_PostServerInit_Once)) + +/* ------------------------------------------- +Macro: IS_ADMIN + Check if the local machine is an admin in the multiplayer environment. + + Reports 'true' for logged and voted in admins. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin + systemChat str IS_ADMIN; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_SYS(x) x##kick +#define IS_ADMIN serverCommandAvailable 'IS_ADMIN_SYS(#)' + +/* ------------------------------------------- +Macro: IS_ADMIN_LOGGED + Check if the local machine is a logged in admin in the multiplayer environment. + + Reports 'false' if the player was voted to be the admin. + +Parameters: + None + +Example: + (begin example) + // print "true" if player is admin and entered in the server password + systemChat str IS_ADMIN_LOGGED; + (end) + +Author: + commy2 +------------------------------------------- */ +#define IS_ADMIN_LOGGED_SYS(x) x##shutdown +#define IS_ADMIN_LOGGED serverCommandAvailable 'IS_ADMIN_LOGGED_SYS(#)' + +/* ------------------------------------------- +Macro: FILE_EXISTS + Check if a file exists + + Reports "false" if the file does not exist. + +Parameters: + FILE - Path to the file + +Example: + (begin example) + // print "true" if file exists + systemChat str FILE_EXISTS("\A3\ui_f\data\igui\cfg\cursors\weapon_ca.paa"); + (end) + +Author: + commy2 +------------------------------------------- */ +#define FILE_EXISTS(FILE) (fileExists (FILE)) diff --git a/arma/server/include/x/cba/addons/xeh/script_xeh.hpp b/arma/server/include/x/cba/addons/xeh/script_xeh.hpp new file mode 100644 index 0000000..2eba000 --- /dev/null +++ b/arma/server/include/x/cba/addons/xeh/script_xeh.hpp @@ -0,0 +1,118 @@ +/* + Header: script_xeh.hpp + + Description: + Used internally. +*/ +///////////////////////////////////////////////////////////////////////////////// +// MACRO: EXTENDED_EVENTHANDLERS +// Add all XEH event handlers +///////////////////////////////////////////////////////////////////////////////// + +#define EXTENDED_EVENTHANDLERS init = "call cba_xeh_fnc_init"; \ +fired = "call cba_xeh_fnc_fired"; \ +animChanged = "call cba_xeh_fnc_animChanged"; \ +animDone = "call cba_xeh_fnc_animDone"; \ +animStateChanged = "call cba_xeh_fnc_animStateChanged"; \ +containerClosed = "call cba_xeh_fnc_containerClosed"; \ +containerOpened = "call cba_xeh_fnc_containerOpened"; \ +controlsShifted = "call cba_xeh_fnc_controlsShifted"; \ +dammaged = "call cba_xeh_fnc_dammaged"; \ +engine = "call cba_xeh_fnc_engine"; \ +epeContact = "call cba_xeh_fnc_epeContact"; \ +epeContactEnd = "call cba_xeh_fnc_epeContactEnd"; \ +epeContactStart = "call cba_xeh_fnc_epeContactStart"; \ +explosion = "call cba_xeh_fnc_explosion"; \ +firedNear = "call cba_xeh_fnc_firedNear"; \ +fuel = "call cba_xeh_fnc_cba_xeh_fuel"; \ +gear = "call cba_xeh_fnc_gear"; \ +getIn = "call cba_xeh_fnc_getIn"; \ +getInMan = "call cba_xeh_fnc_getInMan"; \ +getOut = "call cba_xeh_fnc_getOut"; \ +getOutMan = "call cba_xeh_fnc_getOutMan"; \ +handleHeal = "call cba_xeh_fnc_handleHeal"; \ +hit = "call cba_xeh_fnc_hit"; \ +hitPart = "call cba_xeh_fnc_hitPart"; \ +incomingMissile = "call cba_xeh_fnc_incomingMissile"; \ +inventoryClosed = "call cba_xeh_fnc_inventoryClosed"; \ +inventoryOpened = "call cba_xeh_fnc_inventoryOpened"; \ +killed = "call cba_xeh_fnc_killed"; \ +landedTouchDown = "call cba_xeh_fnc_landedTouchDown"; \ +landedStopped = "call cba_xeh_fnc_landedStopped"; \ +local = "call cba_xeh_fnc_local"; \ +respawn = "call cba_xeh_fnc_respawn"; \ +put = "call cba_xeh_fnc_put"; \ +take = "call cba_xeh_fnc_take"; \ +seatSwitched = "call cba_xeh_fnc_seatSwitched"; \ +seatSwitchedMan = "call cba_xeh_fnc_seatSwitchedMan"; \ +soundPlayed = "call cba_xeh_fnc_soundPlayed"; \ +weaponAssembled = "call cba_xeh_fnc_weaponAssembled"; \ +weaponDisassembled = "call cba_xeh_fnc_weaponDisassembled"; \ +weaponDeployed = "call cba_xeh_fnc_weaponDeployed"; \ +weaponRested = "call cba_xeh_fnc_weaponRested"; \ +reloaded = "call cba_xeh_fnc_reloaded"; \ +firedMan = "call cba_xeh_fnc_firedMan"; \ +turnIn = "call cba_xeh_fnc_turnIn"; \ +turnOut = "call cba_xeh_fnc_turnOut"; \ +deleted = "call cba_xeh_fnc_deleted"; \ +disassembled = "call cba_xeh_fnc_disassembled"; \ +Suppressed = "call cba_xeh_fnc_Suppressed"; \ +gestureChanged = "call cba_xeh_fnc_gestureChanged"; \ +gestureDone = "call cba_xeh_fnc_gestureDone"; + +/* + MACRO: DELETE_EVENTHANDLERS + + Removes all event handlers. +*/ + +#define DELETE_EVENTHANDLERS init = ""; \ +fired = ""; \ +animChanged = ""; \ +animDone = ""; \ +animStateChanged = ""; \ +containerClosed = ""; \ +containerOpened = ""; \ +controlsShifted = ""; \ +dammaged = ""; \ +engine = ""; \ +epeContact = ""; \ +epeContactEnd = ""; \ +epeContactStart = ""; \ +explosion = ""; \ +firedNear = ""; \ +fuel = ""; \ +gear = ""; \ +getIn = ""; \ +getInMan = ""; \ +getOut = ""; \ +getOutMan = ""; \ +handleHeal = ""; \ +hit = ""; \ +hitPart = ""; \ +incomingMissile = ""; \ +inventoryClosed = ""; \ +inventoryOpened = ""; \ +killed = ""; \ +landedTouchDown = ""; \ +landedStopped = ""; \ +local = ""; \ +respawn = ""; \ +put = ""; \ +take = ""; \ +seatSwitched = ""; \ +seatSwitchedMan = ""; \ +soundPlayed = ""; \ +weaponAssembled = ""; \ +weaponDisassembled = ""; \ +weaponDeployed = ""; \ +weaponRested = ""; \ +reloaded = ""; \ +firedMan = ""; \ +turnIn = ""; \ +turnOut = ""; \ +deleted = ""; \ +disassembled = ""; \ +Suppressed = ""; \ +gestureChanged = ""; \ +gestureDone = "" diff --git a/arma/server/meta.cpp b/arma/server/meta.cpp new file mode 100644 index 0000000..eed91f1 --- /dev/null +++ b/arma/server/meta.cpp @@ -0,0 +1,4 @@ +protocol = 1; +publishedid = MOD_ID; +name = "forge-server"; +timestamp = 5250140732737923549; diff --git a/arma/server/mod.cpp b/arma/server/mod.cpp new file mode 100644 index 0000000..0455a32 --- /dev/null +++ b/arma/server/mod.cpp @@ -0,0 +1,15 @@ +dir = "@forge_server"; +author = "J.Schmidt"; +name = "Forge Server"; +description = "Forge Server - Version 1.0.0"; +overview = ""; +overviewPicture = "title_ca.paa"; +picture = "title_ca.paa"; +logoSmall = "icon_64_ca.paa"; +logo = "icon_128_ca.paa"; +logoOver = "icon_128_highlight_ca.paa"; +tooltip = "Forge Server"; +tooltipOwned = "IDS Owned"; +action = "https://innovativedevsolutions.org"; +actionName = "Website"; +dlcColor[] = {0.45, 0.47, 0.41, 1}; diff --git a/arma/server/server.code-workspace b/arma/server/server.code-workspace new file mode 100644 index 0000000..e372f7e --- /dev/null +++ b/arma/server/server.code-workspace @@ -0,0 +1,24 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "editor.insertSpaces": true, + "editor.detectIndentation": false, + + "files.autoSave": "onFocusChange", + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + + "files.associations": { + "*.cpp": "arma-config", + "*.hpp": "arma-config", + "*.inc": "arma-config", + "*.cfg": "arma-config", + "*.rvmat": "arma-config" + } + } +} diff --git a/arma/server/title_ca.paa b/arma/server/title_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..f46f6d0447e91f5766e82e7bc4050a9af1b04deb GIT binary patch literal 756068 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 xXa+WS0ts?qN6}b8;!Ak+4 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 z zr?I}y!JP(xgoq*q9z{ZDCOjzg_D=tE!J0v!|7k61@#Nj>9Kz847)P`?D>pMSTw~LD zbsG6}=~vB?vZvP$+HoL@J+{NYlGFTEN&cc_&*>S++`c^>o5S4b}0N(FTZ9pawn7vOfHp~&;x?HL2X z%IhUvwUziiqEg(-ip#ueSLJwig9uC{(i;`0G26JD@?~TyvrKxZ>hbda!LKfJ+on3j z=(l6NeWAFsvcj_DPS#Y$tYyJO{lV}ffaBq)T_Ir6w?!4bqGFrSy8kPVzNZs}-_ri7 zN~YARZ=IF$UF^c8P*;Oe#|h`(<9RmKnz9l^y*Qb3$Sn@~0UZ?WVR!McxOOXuZ^I?K z9hfB+?8pX_BR18*ByLG@(IT9Qa)yH|VNzfF zs_V1Y{stCS)4Zy5OyI*W{uddyvYauD)t>yHaGw?)B+2&Xl)rtwpN{9+Uruf>9lW(& zn+d+R>12T<+^bXUfZhe4D62+pKfQ?lD?%||aR5_yubVyoTcs1Una;U4 z?~m~8YtrgGulm`-m-_q0bcz$AdhEc~_+-wZUW`oL7d2;tEeA5%?Ak^5^br*-Atv zKiQey^lW~9>}`;=Z6hzND8D)vEM}rGB0q9PdCQ@;_tDt))%)6)!=|IxM4b-A{nN4; zh^X@0F#X41-FT#_a_)mOYah11`0FX~a*g`uI#mD3>uxTq9B)4S&>4m5z~qHE zg`oc9{15n7?J3V6kC`Of(S>DaW;tm@Iq8#B%w!q2M-#k1UOq(fK)8YTtNu>4lS7;>fQl5p(^zDlB?;E0h6@$ zB@_?PS*6B$iU%nL%;D7jO0X_T@|Xe*u-Hpbc7mYc3wl2Qvlb6Y_ByB#PLf8M4UzLK zb|(qbij^8a;a5Zg6ozr$TN>`IHitxt-}rKnyF17x3uy=6Y1+TgL7YI)obts_4Xk;# zO?UvS=#vhCkrg6Z_uT!bw|+TTOW2Wd-nS$pu{VSVasNThaz>P~*}YOPzExfF@mWF0 zWlD4J%&ra*v~unF#vH_C`0WtofzV1wGo;^gYZ+tzgd#oK$GeMn}MBR#^|| zsB68)Xg^!xtH;<1q8evgYd81$4K~EzjFBlhV1S=Lgi+6IsZf9wWp&}Gi~LgYIeM1K z%q2*XF#Mhl&3Qxe@$t+&Y1h3}TX9ag(sOTQT`KSCDbjHIjdBA_ovLyj370DRJ2Ap6 zE>>4Z&FbaGWEy%V{VW9wbVNwF{2@djTXr zed)!WV)fLO*)b z)`GMXS^`7D&+PnXdF&_K?oZgo_1xNCnwxX7deT??*L&HsyPQiPKFZT}9Knd0k&@D8 zy)&Lws zUQd+JL-}AD&Ny)E@vdk=E$ICduF%pU0Z3+cy}wSQ;d>ygk(6Igfaul?gI0Qct0B_B z>~w7aqWicZ$V0>`4PlNp#T=Ra%IPm})-FDNHN9hC!FM?OR79}D*QA_3a!%mtgfGDo zFd|Y9!`yIW{EZTk_mdwI`-J7mwJd$Kaiu!;{gUsTj=3_Hj7AIr+zKb(5xvHt#K z)-3Hmrp7wYY@Z%c7Dcb*d(TqpWtc#%Uo$CjS%BHf4TC`v)>FF}C;lw#` zaxEy}L090KKZ@B>vdfe^z=6TQM+1IrLuhdMu6GRsRq%h{G2y`3_W^w5_C{j1S70xX zu*FW+8ulHn zy2dXX)Bu5oNEa6uK9fJ`=VdAKua!4C(~A>67luao^{2K+U$2yE{OSC&+Hh4elaA*9 zL|-7qfV_UWT{-FU!#-Wka#UW0ETBo>nQ{_U*K7-rFRb%K*@>TZbXL5y0$Hvl=jfsY zufeu5xlAT87%=uF(D$|Zhf*!CYl7>`%~nJrin~3#baTxt=>hB>2#M_9Ime@qb_tj> z7YRFqA87$J0#>fDwW z*zac#u&u(#E_SQ)YgCLzMmxg*%-1k_1ghSv&41q7AcWU^^>xkJTYDPvV&|!+1164$ zJX8RmaIby!h5DAx!_8fo?`Y$vp%zzH24F)!&Ke;2(KjjT|A#{cOzTc)te;Xwz8LyQ zt7^ayxK`lCh(n>l91K^af}UNgWq!noHB@9vD`xpw%iPd#?jUU8(?eb6|EC{X2Txzo zER&HiKaWO66fB#Cw!?}MVn~X39pwYxZL>eQPKKQ<&3${uypB4p-@ZiDD%+vS`AO4b znz-;$)F7vLO$&ha0nLGCEwPZuBhE#{p8dR;&s`>2imB19is6V~j_afhKT^k@dtgs> zK8=q4aoIyIm1N3Z)G$j$zQc`QY;(HA0{y4t#YQJ7^9_`T|D+^-K1MIRnm!X)i8OiT zrH$}!QBFB{QKed85ySr|G*$rc608*Ue1y1EKlcR&)w5UqkA@5&M1)Zuo)%EPv`+NI z^-FRG`ttFrqFQn^#z}^$9ma2~ic-G*lf@Ym`kZX(KQJm=S0;Oq-#3*?TT!79L@v)w z`vU^@y3gFI;a6w zKa7tR$Bz~qq}lVJDY*syzuM{P6KA~>ERyX&-T4kL5+50H_WyEsZ;>;NMSIu1^atz- zCxB3#;$OBASOFT?AI;jy+my*x$&VP>PmPvz4RZ~*bZcxZw4^pwz5vxfdNsWlKr1+b zf8fM-TIvtzHtn^oW`lt{3z4xSnf}FOGT~HQiwO=nD2uI5aa8nCFbDc;&2OimJLy!Z z)cbS86)5u9i;dNJb2~aFKF0m+PW{zkC{Pc6{MnwDE`hx+xbocEgHCID=i`IUIpQ}< zkm-^yA%!q2D3BDR%aBDP4ZA>ug*P|hI*!`yDXGpiia&^0JxsZTFjr=}bEjmTm=90v z-r^)RY$2L3H5|b$dURxzr@?r>zyk~+YDvhQN%H^Ikb*54NbWWyr_8xoZ@C|W=XTrK zUw4teXjwBNO|V7FY_RO(_czwEr%z;M%$w+YQ{WdRlQUn`@FhAkaw5_&_KEe^w!{mk zs?ceu=&k=@pok!vh?OpMBW_E4ZljT1hZEDt`!K7!M-2hoVOd9Sc8@mcgCIQR^^S?O z7*@OL88!x0G-Di><%w(qYbrklkk{H|VU5*fHU^;Iz}YoWA(M4&U=|_f7nG)4TF$#( zRm-v^@|x3{w^ES!1^aH4#O^uKio)2zBRsNiYu09LUwp=A1i|WWZ>)WAYkL=V@QZrq z)@7S>oi{baQptybTUIEsqnr0i6roand!sfhZW}eGx}YK62F)STc`+*L=Uq=;XfJ6! z4E|~VJ~R*!rlmEDe$Y|bZiv~n)WQLHMN?s&oWC|FYOD;R8z^pJ&Pe1HHDh{PQaP}? zy(%q(orqD!=e<{`(xd(zy^_e4(MW z76>h_q#Q+octhf8a5aIPtmwoX%bv-9dZlpxn_aG7yQ9t*zyzbGs8Ykds)f;Q5!BxK zLI;q%fFpP(@A+!4qy|uv;v8DEjNjDom=l#X;8_7aH>XsiCD zHof)hB~kQ7phP5*w>P55OCeaz;4dD9deAe(!}dXDnU?<)dfL!H zW;Y2uLDui*n(@H25dFzP)4(7wuoP-iMgpM#M%S?K#RL@}vD8^D^85KOuWKz!p>7tJ zeSC1s(PZv}MX)Un#%$f!vYv7mh>D%yCy<6nYU|=>E!^^k^1<;b(7>V@?|m8*r}&@e zbNl_DAy-CVkv+f2A~(~|K*yS_wNASTdi=-kYNmS%Yrzm1kz7spO+@SGT)uMue2~3> zFxk-7(tTe6|_JX&>@VOBbU2S@ZRxGM$5CyeWm~mb#WUQo@s=q zOeJGF-gfwyq!=yx z8Pd-$O?o%PVr4+8WpjmX~I|zs}d><7@v&jA3 zCv&?~`=MU@smyoqGydyix&@_%L)#mR9zJNh_!GM1k1bFAB)RF#Lo>Tj)L9+ATP@!W z^NN)f7cUmLXNAW`zZ?rT#g2$acgBL)5dqOo|C6Etb@%ANcPEb+?v-a{hYB(W4_bQi3h&tyPL`=pqrGUgOF=y4C4I zA|wC%>yWv1TGDSrPdH_J(TvZo{r+O&AIGC6%`Uxp7)UNhR?U0!iQ5alBNC)?rl&;t zCr`WIhI#sOb*{$#LE^SYVR2pNb<$Po@FPX(5}63aNx4@KKr{`D1Yz>SD`|Lu;rQGk zTAUAeg1b|WbNoRkDei5vDvL%q5)F`JFwl9D9n-N!=O*#W^0Q;T+^>|NE4OM;p{r+YHY5GSgN6>2P0r1 za(+IDf3B9%f|2~$Dz>=y?WPZ(@q8Ept==MM>bK03J!XD$<{hJ1L`K&7;{ z8rXO^@)L+@z@WQG8@PCT;W?S)#@#_~!I}rBJgEu^rg^7EBHt}>h;%PHzm>8Z^LD*< zSIKI-3XK}}6C|SaP;Y+R&+XACDu)qhvoe0Uz2f_%OUIM0ht)!?5@AUCxXBp%xJJ-d zohhA49qR8S}_(fVz5OdK5uF1XL6!q$J&v2K&g&k&;9mlcKf!@my=x zxD@_8FfqcGEtH}2`4{fqTu?ekODsSYl7nBkQuZ)ELqGA~!{dI|5oVXPO3{o+^j2$< z^G;J z$3*>(@`SJySkR$Nvv@RLyo>RVDz+E^%oFF+Ac_Rm)iB7s95C}fRJ9y-J+>O0qYR1m zH)}HY!%!$*g<#B6Da^;(ptJv{;nb6@5K8XdVg6(VEwd_G5UjiI@sD6};9i*Eb*5)U zKd|2mkl?1v*~H{fP|sc`Ue#Ov3akx6Qbagx#8flEwHC&$z|X@%oH+ePkc!~%GubIQSnCEkU$rt$G`R#-dE{!F2uvbF9zsDXi65P_XVP3>!v+h3fd z<+gpI;k^H&j(lCMVb;P*OmmZ#TqcIifD<~ASH5b_DerwFZ%OnReZNk4AS`IC$}NpZ z^MPYuv1Hq)@h?EW-}m1-CWU)i4OD`)Wn;D6{8P^PVYdc<-!qjzlK2ZqZtda>xk46( z!k$_gRRJnUu|xr*nzu>1AD}MqL<RVR$GWD96vHYx5X1$g zHX{;hglK3mh{tK#Zvt+CT@zf|0;Eqi*2C#5+O_ugSIxhvA)hJ(QnO?+`umo|3x~OH zTINII1JS>RbDg&f|LAh5QPXn~%cf02a3`Y5jHx^fZOi%13+tho{L_3Yez z&nb+d5=5m&4ZRfkV2sL?$aSm@Ra{-Y1`oPhpV+J+OC9Vfap`Aw?dLA}$HEkG#F*rn zeB>7WP`>Cb7paE&JEz?JXsAUmJTERA(s%uMka`(d7MA~mYNuIbv`oh>oEsG)LMI5H z6WTUQq5}pxP%uz$^dqBb1PVuphQD1H148^PQ3XBV^BPFmb|e2-FjOvKGpE7Ulr0rQ z9L79`Hdbt{0A)B46>e?`22+lY4#JM}2U@lsMHM=gf0I{h`9f5lI{(qlnoSz&e^d84 zKb8LL;g8%;8{f)Z0HcPeZysvA@9HeCJLhWzJa$hYO4y|H=daXQRz)D{&f;kx; zUu!L94TsaSStZ2*3!I%vhV^QY;=iHoI)W~uBcW<&HA8;` znO?72^&bCqjRcJ6eLyr>`fg%h&R;rP+mVa0jwi#$9wxvxlpF5S8CuH)^hoQ$Pqb_f z5~0f!>2k`irl09A1Dm1==?HYOr@$fOz||A;Tx1=&e5*531Ky7FB^Sl_f81pPoY^2Q zpB#pYU`zX(iN9!w51yNe0N+tr;Blwg*DkNxYOow}FRXwfErVPtm|!Ke*T{s+=z-Dt zqDQk!pI;P>t|;$H*9KZ#k34Z_V5r=KzCEk=*{S?H3mRjx7kBg@faM&P{UTvt&dUt( zZw+~I1%O-KuZ;i6HMTW6PFxCYlxuUT#=1_4u~E(+_5AgzdtEOA6+;=@4ao_sQY_e~ z5bM7%dC;5N^D}J7wnhpSKU;Ze zjq{k6)T^~1zk6co9EyNxQ1~9*iV8I2iX-c*WP1fHoPY%zqwHTP<1e6ftpo?~*62i; z5<9C4oRRHtRXXIU=ySJ6_GzsrF=vVRK6~pX^4O+KmGfy$*gxy*55RHR2eg7h0RQ|iwZZAcSg^l;8e$WgA2MIAmY!0I$P zJ)kx56Gwq^yDr8tSzM1k`^K6^S8mRwO7tdC8Lqr3-Pe`Ab5{PdTX|%!l&%ds1k34) z-K6R>AVmDqwpy%ZcZz#wg>mQMxy4+E{f47d$Y@H&_1y-I&ziZM#CNj(AB*fi`|XN zNBrm#XE-I64hPUzdO9nW?9} zL`$^EGiHGJX(?a_pDuBp)|`CGfnau1PZ5;cX4w6+(O_FP0$d5@#&wuqmFc1f^ug_! znPNDxap-0oXA$QHJ^LNVVZgbX+yzsYH+zaqfNyEp>CdBPja?CR)7Mv|vdU$&&az!p zJ}W*EWP=8c1#I;1kSzAaHts@@J^w9{Jx>1O5A9aF#7P#@;*p^j~9R>X-dhg$s(Y8hM;QYsFua~KLokS2EF zHJ}p_9Rl${>}%dJ>z&i?>?8N0zv=7NSdOCk{q#0B>6AjP&OL!AtGoR1ng)-}#sJKJ1;G?MslTH2%>=bp6ge}hZ zk@#hZ3t7sWUio#;KT{7?d9nD2AV`?P-&1^yAitf+$_(0n`%U1!N#_5E{5JZx0#S@N zO~HNBzT(0sQFrcC<<0tQXlQC+r}>s-QQ?cJwz}{7AeZj!O9KnMa!?zs?uB*-XON5H z6zk(HCO>j66|_^yfoD~>Kmw8c)boQkjea!UM2eIwS`!9ev8akf@3LX8QxYn?FNZ;0 zD_6se^_$tRxY5?$=)H&wN>p~q^9nMq_hJkZHKt8ogh(7~zD+JiKF{y{@y<5xmtEX1 z+Zr{Q2M--Ogj4HqU-YpjwkVp>;r2Dxr;_ehW4$qob9-;(9v7GGnsd1?`eeIH8@P73 zQ9~4q4(?uT_)WZ_ea#8tT=?4uzwaF11e2^*@)ycF9&WZ|(aFEou;1-+E))Zq;?05k zDgIQQhD}GLWkSc~L18pjl8H#L1^aT!ACfLlSPs*x;V?|rEJkp40qTao=JHBlni2># z!~@4?lGbL2wI_l5nrUglq~6~ARAx(T)+@~hh`tSO+8+dYN{;n5I4~r!=;2Souj&!{9xaU7W#B%v zcsq{Aox64Q%QZWHI8>FH+k{~m5q$e9^Rrb`Pd9ta_?t(VC8!tq>R2+hulFbCZPZSW zLdUx!>`2Gh*VBZnz;Y}@q67Rgq?w?pqAVvKn57p zx&sL~Dz++UBcd6gc1Wu@+NyXXpw>!jwOGG>w*rErVi3_f+P7YYtG15X@y1$}iW{+t zvnpJ2zbBuce+Woq+`aDgdOjb|$8bkThw?8vg$t$6Df++Y`O_o=n*c0c|P_5{B-Y=LH# zeJMHe8>}`y0<8JI7*KbP@W=Yp{^V%D#UTxbF zO!)e*kv&OTv6Cw!e+>QvQyEdDxC1la{GfUlZ6x`-z}!3)yYCNi5+;E-0e}^#>|+zG zvvm+*WO0|VtRZWX-JTwlzc2=qa_z{-?*--q)7_x=aoIT_Uf%5ET3QSt41h6V733XS zzCB*JmEpWF!tSXN;BH8po0>*pxf^ayc+7Ct@k1s&CZPjcFH+(v3@1q62jOn|6qT8> z)ygtQwG#pNi@luH7!5V&&qz8X1CLs`qk_yHIb&JYywFcqh1`$;@d9Y!Mf)N9qU!f3 zK^<{;=bD$1--=JRz-(S4ejJz>F!)|y#wv&kKm%0AV#D@ng-VLfq_Q^8e?iiz_=Qr< z)R+^I=$T0a^Y$@im#Ep4qWRzED>35@;baZE?_H>nU6J}Vc=VM5Jn@8ky zz^*T>j2Lc%n@pZs0N5JzYvwsbPWGBpYwjcm*JHBd#|s5%#)m*@i59`4ni^Tife8u( z9X%|)+Vj?M`f#VPoG2fH09LVzZahhN49*J(-f@93E4!F#=r zWxQ3Usu*XOE$pM{C4>i`VLJvW-?wwiBGy%qS^G?F1&AAQQL>)omypW_5pM>$&vV-J zf$%r-i12dS}7#y__rvYlX;u6|NNyi z_|bwJU_6MR$NJSEn)!}m!)fU|sfk$p8j(lEGxtbyq>!wUPmyfB&7@$W0a^W;TGyVY(< zfqqNtl%(H$SsEHvqNR7^1$o%?>sq0m{NM=EnfxvylOC(wHf@1NQ2nN9V4m8 zMoXY5om27(m{0|(I%AIvvJ*;HL}$q*q9`9(Sy>qGI|F|9Fd%?WX04} zgBZK@+`p+=L$xI?bm0kW0NDaF^tuR)jh)_m{Gux#qT6xxfDd5kqhtPiJ*(~`zvOGC zP;w;(ec$rOl@#!iB+!%5>)z6FN4FKWk6jX4`hVQ-a6+SQT?71v#c20o|L3rsNdmga z*>;{s~1f&bPQs(sze;M?PKXryEVG7dJ@A}+8LvsA&iKE0D z7(Qc=eK~0!Eo*VKhQ3f1A(_=q0;e)!?Yh<8uie#0aOtVh`)(&Q5Fa9Nat{?*qWFA0 z(-ZEoy6jp;SeStxMfuv6y#O%NKBH$_8!eikKNuF2&!IV^Z+&()Z2mP6QXWdmpKTOM zGlKFP442%qla0uenYew2=3n~d{r>IIQ;6q(osmh_rZBdE#;it)GvZY$^aGG1ET)K^ zz4+ImpCkE&;eT|!ckgmY{y2kstPxyj;HXjG=*e9#<1sLoAb$;Hyd7hI4fXXhe~dv|;2 zmP`0~i!e6!$eQ&S6cQ<{R6W=JCo#&?z~&yMn34f@7vvO_B@UBj^gjAgMf7<_a~DeO zR41M?;Y3BQD0V$Hm}Arm!2-u03AYS9oz8G8K>}_RrjW~BCS!0)WLjv7(Kt$&@_#)t zHZVIheYW|2JrF#`JryS&aH|_Oe3}*OfpYzjVi|W_VnxD+LNnsHo z?B_3{2Px30{U91Le0&$(TIsl0&iplgGd{Ahp<%m$m%+#elE=pN%xubC`p~Oz3R>Q2 zXmA@W30zOO%2{QOw4qjKe{4XhS5fcLnIFl)luxikKc~* z=TrVc(=jvo@jx+1v8_dF^2rptC~SEhYzbg4o+a8oO!nWvPFBf@;qf+oD1*$7{Hh&j z<1yfkI-=?O0(chDKUZH~hV3ir*af{=j&Cb8wgywZn8t++|B6Pl5`_wecN+u+GTz>@ z>&nY&gnseN`hS36NskwH+xqnBd*j15x;5q{VN>nXZLvSD?|(6w9;hF&q;|zsKSZiC zFG2c!lUdQylN1ZNOGhKF+lRnqSgsnA+-!(6@=0JhW#IhJ4tn)$-PpydtPiI=q4*NC zKzOGyx>IV{^Krt1{mRP}W7)3^q=)Zrs2Umyt{0}y?xf7`p~j}08B+U*Vvgqpm2V_a=DP%YsZT`ouhWta6&quBqCup&2$LjY&)gNa1W}y8 zU(+R4e#eJj*uwlZ;iA%N#C6-Zdm7a;LGF5zyNuO&t+O2*5GFBg$n~IWn14N$U2GCd z)0++&LtJEJn%7UjFbaw?AW1Uu=@h*~5*jwg1R;+uj*GP++1^ogK=~viKEP^Rhmf}XCeng7~w0Ype!h=aQK*r-}8~lBQUEL$N{&Z_$ zjKxKw6)06y%+B4RlvJZ8Z1@-aHIg0;r|xy~;UM&5X=gTftKiMNo+VYMTe~_rK8Pw} zj_0qse`SgC*mwEcNbFsKpb_$Pes?MK*NtL1(bx$x;d=O|fukCq8F&RcYgo}I1&Hzt za=QN4dgXF8fzsw#l62<5kpbQ5oW*(AUhyH;N8#*OrvrHobIqo}B`vi`^c#H=a1^lq zPVu=t6a?m(0uQVKc{R{q_%>K%Ybkm^{6@RjOs`QPb-#=C@_I8(X?JdS3NQR3prpB< zU9Yd#bb)s(&=SVOU|}ohNy7g_g$(JJ=|UxoP)O2?$iQS9fL=01)^+b?``1^+N5{Y7 zLCLhDHbo|RzIXntfAP?%#(G_2iQ&xWU0V8ZWG*i$`MIpX))^9?q{cLlk8TW`x8~7` zk1{>`CQ#@fW-#ZW#%?uaQiscX<#Oo=|Mg4A#%YVLs0$zmJ%g!-6JATO&7Iu77jZ}5 zOmbe$$jiYZr}V<&a|OQt$tr zn7uUVL?A{|sAn@GIfSsEhY@-74R8~e$wvU`s8h|Nh&aiXv z7dhJ6G_ynFoqvZkb9hGmddaI=dO1vdw?)VGKK8ac0$i-^nUZG*X2f0N9@=n`@>RcX zlKekuuk)inJ6}>WKoyvR;a?xwIrpeIes;=&>nW?tZWIfGaKTrMNhla9{r=76tChD^ zIo56qDe!nn(}4I*27V2iKHW(hV7Cgr0R8Nk61Wu?=yKS#PPLZ1bwZx9;*$_?A#h8` zqr((H-vS+tLsM)p*VnFYz|ykFp3J~Os`9hjVjF8u*lkqieJjnShDwiSgo(+kdpuii zf9?Mv#cYB7r|j#6J<>qrJ+e#FvvT|oI)HSiK%2Lzaf2B?FMn{P=ii?mX+8vRG5pAp z;lA46#YZmjxdklxN6wl#bDF^?0Vjf0L=D*r&CxV)f2kYcg13yufY&Kaxy+B+fvLL=TarBHtPa1axL8v>n2N3vd)CVDZJ*%5OC8 zdb)-I$nE0EN}^<2WAje(X6(AxqozI%+l)pYE=(A>@R>HK-%0w#CHAWme0hxWEU5}? zL);es$y7SfbJF2w4|R*m=g{cw9B^^$;(DE8M0A+JAN^uk8His=x~7Le=`U@22nGeE zU0txD&`Ze|9Z&?2_8{DWNN_`q9%2sYdGL%rp52_Dr2uRfO7f^Ec{=oEDARlJ8N?w( zM8u>gOMV(wsyX!5Wv*p!n>8l>xt84m?Ty727NH{6sI9m?85o-Rlj2jEQQPgyBSrE4 z)BJk{4>wrE)RRE6z~BAu`Y+mhzjO-imJm>qMmBu1c3n^kAmAvX;q>zdyE}SYt)y@j z-xOrOPfrC%oGbf6KU(Z!dq-XtewaXyfv(F*fdif=i8+Bp5Ad$Q7{rbPmo5Lu+1Koer z1q|0kaCGj`r3fZv;7h#lSr*{Ad>&Nnhc0akZ`}dAtCbv--D9X`MFr2e7X~kOHA42O zu$D&3Y{g?(L-;}FtHn>X44oR|CxIKgV#<2?SwKyKe<^=R!$%N^kQ@BtM2HXKCHfb8 zT2t$QzXMg6l;q06uL>r+;BzrI(MkXfpoHR6XAwrt-Yu4QDtU^Ygsx8EwgRVz3Y|Yz zJcH9_B_oAhO0wHSACT;Y2!+NH%tMORukg_8-&Z2Xo7EvaOY#OU#{9Tc}Td zr1R0o+qQXhz6&e!BXg2Y^+q43DBZV+m%>$UwWDKY;P0e2LHuJ(#!e?~rGuyV3nS0ZX=7)tcuOTy~i9BXSpOFt;WH=i(c5zYP z?R%}*2b9JC^ZJ{rKneNbziUa~3b&e0#o{;SHskgWm@a%xO8v z2~$FMh?06;bXo=wizY_R&K)?aZUed|zU0Jb;NV_gIU%;Y-@`mF8n)oxcDo6~F?GfU z@=CHSQXei;Sa+$pP4~kvz+Gcs&9z0atM5jYQI+g9I zjIxCyZda0Az6aaX+ucmjn~?3#BQS+SsC8-OCn>CT*V*WPv{T2B?mT%o1xrpINivKT3k3z@L*_YnmR@+aaD_NqWb%2^O zPs8wYrhEI|c+n?Gxak*mR9?$?`&-L>$I2?w{Bhi|1fi5=A~yJqIobQje=|hoCX^Pv zO@>CQJ+o)V@y!FYw1v2qA&Ws6^bmS}J$L8DvYu7gRmK`QS378YSXW!SPH1MA*463w zz1)fr>q@18Dy2Xk&jS{w9*vFQ{DL+6VeU-%tl%yjN`gb0ehAq_kQxpe@_5JUCWDzE zjHdKVSsXiPPCv*~>0v5I^}toXz2UV(c+nS$0Ub$GCq{23#{n}cWGX>8N& z+THM-fr$j6!Yzt_sdOI%-7-93<49pCaQiZ}C14l&NLyV1zz+4lL-TL`-5J!-KNJ5B zyO8nQj1@nNYfq3_ZzNYb6LM9qC6d!;V~MpduuexlPJK@}8P$@0F{Goxv?%v-5 zC(2mTKPuT~>l3h0+;j|2PUXJbb@nZ1oVb!flB@CYwx#k(=eUP-KNYqv{LL{IEaB#% z0kPr}J0f{MZd+C)Nw3a!UIX)b??+=umIXgAvsHE6<_8{H@L>>+T8bV{mRZs%C9&%H z?Pk(E5Rl`Q>B&@cRV0;N-{2{8Toy&YJUVt`y-q^l zTOu-EKvazrsfSNb=)Jw>3u$yWm32G-_U-fZJy9~Io^zHr!QdXi3-G>}V(ZhBOE3{s zy|9a{KpiE{>8Zh_jOgP^^c&cQVb_$|AAs>Lk!LXMN)5%5Bf$@^+2B_;H+j>zwkB^7 z{vY{Y(?LTf0W7>EiY_7!9<)4L_Ll0{+a>&1l{EFMtI_}L9T4fv)*XmWC3anm3Tb#} z^0kNdF{F707B1#Rp_{|r?uTud+TK{Fo9Xdb2mSD}^yZ;?c4H(O8T?-nmKXZ@iT35n z>hiF4Cyu0#t^};F7q&byBUTb7i6KFE3^Bf}v|&4j1qbBM`So&jW@R!cG z?9ZRV;F+!?Ek6q%*spx;TD>j*JM@ARR#2iNbpOv(X7Xx#DVjEQ=1eXBHT@y%1wwZS z95>~}^^E53Zh$Q0=<24{XTTMi6_LgEAhCNq{vM$A!5&b(6suiG>@jnOcsR76+a(%k z1*+dxUvJw;R)R<5Q7+A1aeABc%8_ZJ^Q_3SLj6?6Ju}D?mqvK?1D#0bb%s^xR4oCP{$xTXM;6OQkiyQ4TMMm3;r-y^hQK z9QN0gfyd#Ik!a%Apu707RA83wj#_gwl=F3zj!q!_&-c&l{piiSxWEJn8q{4N#ja}1 zRpF0g!w(dxzxQ}zLd>|~u~N^8L~E)9JTHBR%5OR3^X#)Qyd4-cqeFvu|W%;ZI9n;nZ7f38f zHD8fl(*<;%=I>kJ8X90%TnlTiMVF;U;IRutMeqmCXgUaZHJ1=&H0izLk5iV6gUXIx zN8i?v!GXV$Id5g1)e6Zfw+TI#H#PANlFsWHB8ovFCpmZvBiW*obl3S0?yM$hR~*6R zU#y62%zL7G`V|)a==`Z8^}2umdjI;cBVPqCS$3b2g2??_&&FM0tv{Bkuxyg2@saAf zy&HNg1-9l}udD0eSjO;5w^^+fK%2PBueUduKFcFHp(%b|C>I&&%}VXgbaN(Vg$;mYkPcg?%C?Ad^eHAfx*`e}~#Kq=z zAJAn<$?P!k(KUlPAH93EbTibG!~?%qFACE*EKF@@BqJ9uo;mf^oT=RYm}(Io07egP z_$P+4>0%?C1@WXHLei#cvt6(JY#Ax!D> zZWFten%b&)e9Y*!WPY3DARrhXBD7`A`vgdhBVwK>l1gS*8=QS(rU?LXSnr|>$Db^Zkl=X_fbldrI!3tNo zT4GjWJ2jTw3T!8t$;E5D`Ur|$t^ElOu7atnZQ{!IZIrVqcu~vzxRK<3)GkgYgW2KH}*_iw_)E;IR@T`u6MLwsxF;~LDyr9_%!|b zpL3pDg!5eR6vgTKnJlSvoa)#v+ftp`K(YI|P95?3j*2m0sBY$_*$PA>pO_dh;M41W zEFF@}JbbGBp%MRThbSLhjY#2ZXX&?1F*m?UdyIp?ooL5CIe{ITUt{~hj__AIIO}Pj zOgB@XvwLotLYh5r6$mjk>Q}%&GonqI{r3sF&=LPDY2J?S35e^pt#O|^<9qDilirj1uB~gt4M|^kyuB}pt6GRjMfN) zl&ij%ejEDf4}kSWif%xUM5jv#!h1x9=leU;u4`$KmE?j)jObJmBJY^bo?Wj*bNf-B3TM_-GeZaOJhxt-i!i&C05M#cmT%cP)8RBPQ$2P7XUlcQK|}eWF)YiVVD(dXw(T) zRA?*Ywp#lgd%qcMNYy=}Q7FL>6p!9C#@b{I{TgM`@!1-oj^r0f=X@b_3d2hKQS97Z zT1WXyEj^MF{S~LXNN5fg{y8zDVPmX(-JkprD(m%>Poqom;6=iJU6sA-eB_dMHb+N= zSwvgj&vq1 zLsP2m)S!+Sf?-i^Rg8SMUFtw997(aknC7efraVrK?Wb9sDiS|GNv$DP#1KnkP3f-! z865@f3BDNfJmB&yUP?X;IS6pnTf-!OR2_pJr=H>M5lShs1Rf3-agWzlBed}3Au09> zN#`pA+ulhCSyiNXQxff!3N}08Jzk~6Z_dtDhW?nrNOB}KfnD)xcx+F}68opD>rC0# zeje8JzbH4sbSG8PUo~dlKi!;tg*}@zr>FvV5SO|&l)^k2PckJ_$*cp*yR?Eu%g>a# zizKz25P*3;<(t!Ym~QoNV=2qmFMzONG>&JJto0zPw$1BHOx?_xrL z{DxwoTM=Su25?Fxw$}(uCNLOHgEj?(Q5KbTFKOP8>PyB4fu}8v!Nz8UDV+kEJYy5& zH)N_04&#d`=Bp?x*dQw+qo9f$OP7=8sS?%gj#AU1V(x~z>0-o#v0PKhf;p7n!at#! z@_wsn{+tXI<$(7gdn?8FbLyuto#!H&eG{)#Z(Ptv96Jc&ZVd`c^CSQHy zGc2lNK9*6`z8}0UPsZE635~1L{`|yz3JfBEH*`^4{#F@su6W|_Z3QBC7rwZl#a5%T zE|+kR6~~L~bYtSnUb&k%^9}Mc{TqNF&X}mn@L7AeEAAC3re}u}kn1_HmT3pciRA_0 z&ecJ<38854IN_%-??Gh+#)J^6<^y*?qfgFqU@X?4qw^Bn>q!2;I`b4&#jgfWxtc)PXpE3YBCuZDiS?y0!v~%(g>&q*qO;m_F67(m4LOY!K?(?zfx4D z=ibaqCqACPdIGO?9kHdCXhJ7&fcxubNQf`P^TXy`p75gs>BznRlXldgjT^MNkL^K{ z->t+3NVR{=UoiTRYz{?_L^i8+R`rMEgh486EJF3W>Z_54?t(IVLf)1C>9VS?Wh5Le zs_acP?O2@S{JBp-@0Bm_oq+w?yz2_1%yuE?TI?`iidSeqZ^@<+Z=3kpx)xS817x>t zq;LM#w%+b@FiU5NFq*I1<|DB}%r&eyyNimNFich3rYif0b6KF^< znBU`RFQcWDDn9H=U`K@t|M%}JkQjmLpjtO@{n|m-B(Mf^7v)WB*E3n! z_Fy3bQ@9vA(-#kfgB2NcmTGMl;2_}I;s#R|UJi*!|50T>^Z;xFmiC5BaMol@0Y^k5 zz&oqibq1L2gR0zWpz|o2au9w)kTRx&I@pY{q~Dw7&oe@rIe1DK(+{?k3dwwkWULBu z*YZWGKoUN2fp#r#-yhMvJdyiQSW_xrZUtvsX^v2)zS^lV%;t zUsh1iCy)q?G(K0KS)((Uoun`U&u_WUeCRDy*k6YVu&8KRk%kT_*RQ!%b(EJ?zoQBi zxW1^%%M;#VBQPp1Te(3?yC4zZ;loEMSyLo;lw*#y#P1-z?Ge@Qp|v-Q0OgrR&!^|X zoE%$LEz@L;1t*nv0LzOSx&>s?RoZY|Jr4*4izf~o6%5|4-DrDL=tBi30-Ch0x;S@P zm=YU|u!oBmrubgHRpqz?06w|5%NaGlC9J=tr3NY3es>xjrEg-G_Zc41pLe17p{tX# z#;bM8^0YcWzNX(vZomv%kc*IntL#zEKIt}oN3P_S()}aK%bQy0Co8b+v9IfrtQZfa zCQ%}BFZ)3QK$+O;cqJ|MqxoY@igRiq9^89 zg36x${r%|N&n?Qy<3SzJPwM8Je@6MrV|rN;5Y}ZVEptkHOedQbWSvG|(hC>~$hjNs z0I&6Y0GT-k9z?1Jvx{BQ(E(F37#F;BiAGM|(RCG!;Sz9#8>Hrngn+uIB$paI;LgrQ zz%t|2s+?<3RDm9~91Ioop@m0vGq`j%1NOQsg~4cI_O-zBG=Vh=ml_$>Z1P!Of4e`{ zUwPQ8-ry+LB_5AzFMXmS@*^9YsLZ_^9JACEH{t1xBTTL;4*N=J%|tA-@UY;b7!zs5 zQq1`S1t9l&(UJS#2d{kS=iXhmP*?%KjlED7u8=hHZ5ghaIDL=g)>WzhA^Fddt;O9b zM5zK(ugrrfiqcx>S`vXGs#i?FIJ7V?FO@xitS~w%p}eBGcOVUzWW{~UI@+1;Dte9z ztmCeqIjZlSojidQatfoSx8B8=)(ETHI|mQ{U2-;%QC2o9vRY0?u8uxQTC}zub#%QW zLLD7P`u#e?L}38ydUHA$C55r^sGP2;jlWeDOXTHM*VKMJw}e?A&%bn%_s+7CRG4e^9om^#5K&|sS)DuUZk?GRIXfMOaERcY{SB4=f+!-drS1aCOD2DyS%DjypS6rj7Ont! zrd*1phR)r%HSAscN;1^){jbqPzY4khwh}+1b|Y*}^{j~#$Ckwq^{`6#YWr`=nG3AR z01Al<%*7K8LOSwLjX>O|h}o{MSk4j*f=}iaRR7Nlv#=&HXX=~N707*+ zQN~nrKIzFy>QdIig~2aQIy%+pwv?AC&wi=2mRyl*=q&Q-89e*e{JZy)efK2Nn)sN% zrMQ~%Hc!Q{)XcYLJGYgUVY;{gC2oW9n~uSuaGJ`m(?SG!P>#oqiGd8bWV7104-;#} zDs}aKIKYd>K;kdpFMiXm9VzBl>10&YF}vjNLF&0m_kb&0PLf;Aic^1e$d#Kn4Lx2Q zEs^1dj=y7Xh}~yb(LYOy)NQZCUrarzknR~N1K68LR<6O7J}^!NWvhQ08X4~ zTGqsJ2FBDekTJp3-Q;4*X1WaKR}3`AE@=P@e|bZlF4L{HcN^%^MBIvDdTUua)Vs1C zL_Ssn`a(Tzwa1X&y+MNo$eXZ@zEg=DI3+S7Kw|@xkE=&1d;>j;Tt0GY@Q|!WNx>>$CHR-DTEs~)kA~F2|Qmh^2*%gnz#FSPM&xUrRn-R4n8q%&@NyL{oBnPwb z=s~KL`zJ1*4rF_f&8@5qXoZ>8(*GNioY#gy_|(oQHS! zhplSbS{+}#t(9~3&K~fw18u^ve(nlN7$n)*IJc~zrB90Jl$?Q4BBcq9t&lj=+xNSo z^bI~fj!VtSo^Gu*2xAh^+b-`Qw?lN-a_f$&R=xZ_)eq&ub&{do_pc*n7vg=_*c zvw0c376yjKOcTV>S&tfc*A_&%cuBu9^`{6=D;u zvr#i>r_#LE<}`=^5bEdw0$!bg-p3hnqsiFw?jYDe;!jwe9Y@&=cwA*jcF@Bg1N= zZhbTE)u!r*&j+8ZN{AT#rve>S=P2C@lpcv=!lzKbmQ4KQlX%SKV64HoDwbG#R%u-g z<(iZ3hu*u_hzq48m(v#&@Nz9Y$!bNQB^aZqjzZkMa6FaHu`92{Ys?yoRjcpne46c* zLc9;<&;l4g!2Z2nJKb`kkzF zZ34e*VJLfKb$#rq=8%&6#V;HO4k-HOo2qa0Tw!rfu=L95#|yjk^rV{ZWof+Jz8r2~ zpluo0x52~C6t=(W6E&||y0fP_(CKWJ^{=xu0C`<-OAva7P0KqdtjFu@k_ISvd z7Y!8hD4!O_d9;$sOzt6Jz;%F4fyTHYkv)~{B3K9%f1faVTWqRx+R$&u3ng=581=tA z>$%YREqBEA!tvrjMr0%rqcvyRU%Fb~B%0Yt8?+M_wtq^7>{w%UzUt`IcKaQ&!Ch0J zeLd`_jU*^eYoro*27_B|lH6(=H^=ZL1cn(z{vBoX+8PweN04V+hA*=nXzSn5(%T8B z^QvL(IRFB7yX5NEt7#bx1)QsVVs&;9RlyIf|B{K{Dy~)QtLb>~PmhYMAv{+SCTxHL zs-`po#1r8vdVm)hu8_tcRz+*{z=`1dq%s&bu%{{hQLTqxnn}RmJ8V$l&Qlu&Z~%pt z4z+K*HsT6ujh{^?_d(;nje%%)L|I{gwkHKsR=ml{Xno%M5g(aUKmiw8HDTky*1??cz}_?*w_Rq z0W?{-9>z23!iXk#smCB5MT3m#{x2FK2iBs1^B)2O49xHO;c+@)FhvJvefms(oGmZ8 zoQN5S;aBpolcx(`n_x#&aH(e;{j(G0;&J6!kqkNwom==}2l}b!dP+|L-tdz-6C z)kup-VSy}=L3P+XKwh!4V9yY{^A$Nf9vy6fo=vLAhg_^H-2foC0X%RplR6-KFFZNZ z0>|#>aO~=+&}f${`gxjnfio@BQrF`KD-_Z183gx0UJjDix^&0`VgP%1*jI`NAUjlL z6*(y(w*ckIAe4eBHseY2S%WQUp*%xl&wI}dK7br_W|ApyOlQ6!gNB^dON{_;u1`qAd&;FD&I(X_qLG#y-X)q^--6{&%XERiSm3=lwZ9c zvIC&`rS=}bqk{5ozD*bdPM(B%(rt@);y}aj)XD<@Y9L#D%L9hkpz~qj_w0zs zeV7#G-R?p~AGTIY(Ytrf05poEAKt#}K+*W;(I>Y^9W(x+r4f&1QRhHg42oXamv%%( zc86`Gvcwm=i~_D3akB;$m@@Zu82z0#*9#yEK$Mp7RD}-{I}AQ)kFi)3SR{4;r_sp% zw+Ca!xR=-`;G~U#h=w+?+3g)V^JIFQ*{6oX zPs^ym@#hN+*YzBGfMg9K50RziTqlnvD{Iv;_cOnhQV z*|wu1en_o6F40JIDzrLa4fsSvY_;cXx$L2%OBA)>_wmmI4 z*{wG_>1%~CTv}*yTRW`o!YG%KNvazuWI2`uM)Gn8fx*XEx*3BCcyN|NE{7-2FGAim z6ITfaZLQ@L5IXey`N3I`8klY_)(crsyU+_;%l$pKo32mxmIr$hq@a@GkoRDV%@C3q zjA@xwFua&e=i0w80)5TvJ$Ml2f=Xs(lYvV*=-mM@6vg~{P&xLXEGGETd&##~3KI|5 zzrw%u?79%@g}l)*krfnI_4|c&8d`ANudGEab|3Ptijh5!CNSv@Y~trPC*YSSoUK>C zTjFt!c_41l9*S|Up++W*DtG0CMQz+3Lj)46iIm^-XZQo@@CB zjh2m3jf(Dvp%B{lC9W^RC$$_als$j`?DvafG-G*EAglYJKQHAyWl;JRg#NlZ=@D>H zCOz2SAI;yd%5LAD8c?f_T`yY(i*=Ia7B_6J zlB2(XoAMyQ;{?IrkKI<+Fv^^yjuzx_j|~PmzJ?H@5%3SckzEuX3H*pbLLQ7R6JF{R z@TFQIWWcO2(qCxVMc#u3-v?f=E>n(3_ANO2f?q@d$gH7{8HLA8`9ULd%nK=UD)&r7 z){Ps*|Gz@C3FzV=J`NS5USyXRb({5mi_#K`^F?Vs8maDy#-oRaN9bys1@yE$uy4?*wLt zwVD#Hpsubi@P-0C8VlL=dOAjRd}4bEs~6TOE6xJcWd;wUfdEdV3zK!MNmpltt@4jD z_Wumk*?u{Dph|`EhR)w|%k6d#7bbH|;Ne5)cFp`NX0IGmgCcE^*LuEZ^jxZ=F(`T- zZ5e=J5bsuOY;I0t7d1B;LUVw^BUqVo4AqB=*Zbs;DLsR!*tA)++UP z_Qqz|pGCT@ft27+ox(4jp;Z-O|H0KsR+g3a-`^kG(+`{Je2=q450B{+{NG^B{+yv} z!0Gtl=ENS&VYGJf^sRliaC^0bn z?Z&OAgSZa$TZp}L>zks!y8hc&^(EZabh{)Uj) z^MnRg__!Akb(zxsE=;%S7XvNqi)A#3s+3;4U@(WzSlyQx!(_mI%dut7f;7Lkql^V7 za)VIQ4-A1YH-AU*DF*sl!Fz*@&5)%|^iW^w*>UNaz+G)N8N{TmJ^r9- zCf@`niNwy$6w^iJD}Uke7)evM9aVqq*;)^$h^$0!V!o<9Y7t(G3p@bNOXc|VeK(aK zOwkAr6HtGeoN@LY35s1b?WfXB&(pZCCC4}x3*9A!X5VYVe$jdY{NFLc{$h-v49Ny zwsfT~#D;wuEkgxY3JQ8-`)D%EwEz1>%BFqH#RxSppw=tPQ?`N+!;L~%E^owTzu&G4 z3R_8Lb%#PSMj*30Akm)c*)Ipu+>9q_Sr*`G(ya!5orZ@Utd{$ui*V>NpY8#C2-x&XXHj@t<_ z^m^e7Qp__nANfB33G@xcRT_fj&b^|DMJ_ zR^@zve-W1*se$>I>m^osRqHjKR33k0ru_r^^L}n;T%Za6VwaM@5wy%kHiRR-TZ&xn8$s^~c}BTog?-l=&2B=TENc{H6H1a zt0?s5Y^1JJc+!Q(j&h^HEHen@bS63C5!~%&J^vfUL;jqV$@S~KmTkR2r7j69iAhgC zcrfNJIOGm1y}2EdE@HaFl7nZ|Tya66FZPXKUpaAcSX%TSQleyO!SE>Qo6d+9pv)W=UV(`4F}Fd@0|wHoz^`{=2c;@41199{#N%%VbgK|18Gv?Z0T+7i_+Iyl zJB=<6JH6!?HcluXaB%{ba4b%@9qe~gLbpqk!Jbg#A0m;ceQ^pcOWOX#Q>Qn?^s`j& zu*bk?Ssm}xW@czKSt5ezbn>#YG_SWTJ?lP%fD1Jwvm1QT`=EE1&6o*bZo1_@nAjUE zGuu15(tB*DEtL6lU8dCB|Q|>%U~ZJOlKg1uvm;CO{YJNgW!5Y z8k6zNXkLUsTV#TkJ}vmzXyC6qMmFiqTbWF+A{-;qgdzZK$sP+n;1TEnz)2R5Hp{H| z_m>Z8`L&79FOANM&}6+NN+f1#$<#ra^J@|09gI$Wh?2o!V<~S-wfMjSKRSw&nJs6l zr3pW%w#dwxxn5MpM__$pZV#J#dD8D<1UT-Lc`(oDHmvA!?qjioFY0R(F@MCA`R`pG zqGH08`jJ*aP!#?)jHHW8phI?v6f}KAsEhs8DhM z3wL^A_n1RYVt#i577fCF>_J?sorqW~oSAn(t#Eqw9?8nv*efv5uguKKuI)2-u@5P& zTGl&var7AKYF?^k*x&uIa7sLxWwl-*|CU*PHhLwhWZ|5ud;mDG_gBcU7!7M#xXkGF zwi|t3AU^ZwI7>SqslEm69cfTi3TFq>35nQ!)Zj5xf(Iw0$c4DHtSNPMQ0W_Ze=GA4 z#6F+YdDP3{SxaUz3;>*2(y|tbz~wJ8r1M1()@-w-^-SS_nB17=&1=%rS(JBJv)=61 z($+NY3!}+oWUj-rHdsSj_2ztbk|{mS_t9_E;=Hua8AG`VE%RkucDa zVEY_ItASB8lUZFTPWeE8E+$~p|x31 z^ck|ipgzr46bUhNkB#6vISn8&=(eTVaWMVZO8IBvc%#u=?pWCZQ!?COWEI68Yjo^u zs}9Y(bExR@iK?UO4#P~(IO$fm-DG~qwEb&!>+!Pia*-fbVgnmeFm1mK=xc+yFzL; z8w9ZOpAzB><`e_}ITdV&TaiU&)po#6BZpauX6vi$bz>vUl%qiRTd}>_uaE{#*q7^t3}Q|$kb@y9Hp-wE>ha^n$MPHX=2bN- z!AzgTB7tsSaoOP4(OL#YV$rE)Wg`B0rAJ3^VnH>c%PbkopnEzm8p}TOh-nt8vcm<8 za(9Od#t7ue6Q1bHkl)qN0Y8@#Yea>04P8dDslCf-1XM?Wjx!oIQbEx3&Uot^X`Cqp zETEvXY*5Ey-7?>4=SJI||-gAcs!es!&CrMNvh6mWfTQzisNhnJH z|7!dGxG1aa|7Qk7ex#7CKeCkJhsX~R{OoE{8Vs`9xV6b=8*$7S7*T6XG1^=kg&9YP z!Zl6S+Leltk;Fm7RM=8+K*G$d+=?>E0PzQ5DgGEioSEnQKF@HUdD`92XaD$qzw_Gd z#qmDReeS*I$36F)bI)I#|=brfdL_4;O*oGS^Q;g@4(;0He1`pu8z`z8g z6^CoMrgGA{9U*=`_r<|S;BJbmo|M0%2Iu*R>}NC%R3N>NLrOS#LAIU8szu}u|46*du-K+YCzuHmnJ%8vSZo4{|)i_=nQV%P!xiEDQ+DE zv?BlBDtJG`+#gXS1h?+~SR@h4msOz_45UkUHyos}*N%|2pLHZ&c_*??8^G}nFp)meeiY8gO|f;e@2BUni0k)U@nhKKHtE*;*PvO#;5Vab(&aLST+Ow09$IYJP%c^3hO}W%>-)yRP1w;CDswk}q zW9_mjP0>g_A;RHFvMG38gj1EWDYezr;`emQ@FbqE4P@_|RjEofa&=2#2hZ=7!qWGx z>1GuQCj_x}ADuP50p+S0oTm5D)z!p{?S+Oky~Dwa-y=9f%lAm1N1k+nY6Jm9b!;inUwQbxNbVM}%oUD90_nPxCJr7!YAvuL9JtWA8UbBOT>H zx7cpN`UAAE_N*}qf8<{l$E)z?{GC*eo&EedZob}TW1s?m{1V?Bw{5o<-}FA8jIj5? zANAj0_pTp(zcwyT&e~~wXpdzujlb35#W&3lut*x-^ak@Aod6BlQFaZ>nF>RzK{wejA%L zSe>6)hf$>{)@tuLkDY@P1&J9y9m>IYf(&v+eww~HUG4I=7Xe=qbaRCSYX>^m^Mv0F-n;(9e|DSLJ+j?(X&_#Ld^uPNR9k%u z4LW6Ppgd(mMSXVHrE)&Lr9xxWjx4(2?z~QXu%fl4L^UHropgO4s&hMsKK@yAwyW>^ z#bci(`dASWRqCU&SvdGLs6TV$#S*IuF#OA&UyC_SuXTIJQ)!6QOUGYn@X=wsCiZ*| z<^%j&7)4_h`@6&pK{{sU` zJnQ@HNAfACFFtmn6Gbhv-sNNVw3yYyEVsh;Zbt$5nQbw9%;~+i+%DE1;n&^YEz-Y_ zu1jOzYpZ4LX?Z?6RB4*|?(X{RYcPCY`3UtGJcuEVEMo)UPB zcb-MXI;>xGB5dF6`#Ip}j_!VOKG&k0LB^y0q+x)W(-;^?%)F*vi6peB?kH3Ydn9^Lk}fKip-m) zwyG!f3j4*JPfs1wxNe`(vF}$J3Jv@Z^XJcUUBxx;m1~QTv@ysxu@Uq{KSfmO5<~sX z+}hw%b@})2x;`eV6g7fRq^6E{{_UL;sAQ})RT<{7?E@okV{|V!knsrheHYNTpC|PF14Jg5tn=gdOmALyv>M!gJRYs4tTv@->bM;SC(h4UImN zoPYnkaz6SXHmEf*;gX6yg-J?_F)8+TYR+>8#=RJ1p>QC-FrB29; z*<~oiJ6AJti(yV_s#0i6GzlZ)1_~L4YZ?h&gFg0Yk%d@}e59(A8 zeI~&-@b~1xjBg+B7vy=fuim6+T(#iMX*YN~hpDYN0lK*m`bLq#5{2RV620Mv-)+k88JavRPE>bkT(@qC_@(_e6BU`*0EF{|L_VM@WwcweUl6|48Cs7t!b@REg1#=| zSBLYr6yJ1S0UXczF9N?$06hH857*o$YI)Ev)<@>^tAShNyF+grib6T2eSi7V%-=PU zk{n%RuxcJ1IyqnhIL;pY#DW%cQ=;6o#&6<92z#Kc&>)-Q=UqPRcc_}$?LE)r0RLLI zTV!y8TkWy(7yd~2Uffk^r~tlGLRPzHzkUHI+IUcx{?GU}xb4Z$y+HW8{_&-)mgt_m zMc-y-L)f5;3S9Xm^!;XVzor$+rXl z8`6(_@coS^uKhjZkpsi~{7|LbZ-jhf+|^{^l6w^RXRFOt!oElH0QLeA|6LlLQo0`y zKN}?afeiaOGIxpmPwfqMySU$zeWDH%VExm1OA6EZhVZ{+eSbNB$IcfSBJ)1ku_J!Q z$M&06`;BS@3@W#5H6NOAGdO)r?|FAIQn|0)HPkw3-|RC~h3iB$u2^SP9Af>``MLlm zOa>GFtE#;EX^sKsZyYG}F2Z+qM4`c)4*OL|F7QqAyyVEg;@erE9i6?5@O`tn5d7P? zYSEj|ukzp<(n!EJ`(A{;S>vh}(Z|gK|4Pqqv(PSu>3K&rdz<7v&NIBX1A#sry!b>; zUL^1zC=VH=uR`cIDR_Ot<*-xbD6izdN2as{?XJD=Ku5xr+B-w5kRS5r{?l{g%NjSk zu9Q28pNe+ddO{{5Cmw$@w8$Wzl9D1w6k!mw|DqI|1pj6g;8kpdf;@l%z+ke!VLOoE zKP;)Pu2$rKvai&E;o0+%IG@)5-@)Ib%=0%t4T(W5c)tDPIU##dtPuIgY5$7YUA2>6 zV)8lN=zKShxyYF0|fd!-eGvVmn74KX>R_pqN=Znl;**#Y- z-1=Pya<(IH)kWk~jeU6R_+NjD^?7sCnPMyK584;=*at{I1UZQKCVtK|ELg+Zl}b7A zKOnAmHtbJ!{8&5TAKSf153tW@fd2RwtjDjou3mGN9LdRp`m28M%CzK&w;YWqJEA;$ zChPou_ml1mcWOh^@;0RJ^^05@a*pr&;*Fu#P&{_J{@sZITpp+3P}|slXV-JcOT)A8 zwU`TW9(IWG#{=`+iz2@?CZ^!wd3iX`UCQkmQreVg-Sp_6K zv#mbp!ea+Jr#oE9t?LW1KKJ(WIDZ4boZ7Sju&kG#1Q@!U+Gqltas&1s51d~BSlP=z z--_{}eXWt;8~mToLB9knw5xjgO|2gI*~@6(+ME15>_yc6U>IQJg~0xX{gBHT{UE{P zhPNO}1+aSfXaPP3`AG20-<+<`ZmWOpkzLhcNtDNE_>DWY&Uso>%t4$lU5>9c7m0mt zVm-r@uSS3HY@n_D-ouI4T)QA2mc_kho^WN8t1a2t?1#t*%l@rf(5LW=ggyZN7x7K_ zm&%7!CC&?QV6*3S%2egHx~WqcO!n3~{1{C3O~U`&ZHRcelQeRX#`YqL|hc})1>%@*r&{x;C1qQxx^LQ;LkPP{i6c%l>-Iw(K6UYsZ{hrRt zsF3~RzH>Y8Zif8pOsw8GL4BmD9`($4KIoh|9bw@$hwb&lq5#`Yp+H&2)xh5zt$!mD z@X4ZIxAw2JT+K)P1J_uiMAe_(W zYCeUMTD|Sns4X4n^NpFf^@@1K@h zWl6@Pe>}M1+Et;T)NHGK3R0ulLc6J0wd*XcXGo&IXYlwQ$!jV8Nq;ZEPnaD3qlA7( zQJM@U{7;qa_kzCnZ}5NbA;_!SDMKv8>Lz8+%`t%9A8uI$drcSeK0Gxqg_{lw4DZUlVAV86 zCpgqkF?{*xni9D3XWSff5dx$ zzPP8&2j>aXeD&_J-}7HJf#uE67uC2G#_iZ4ECD?~66W;>GT8Z`GqEv+*d3pi98G- zH{1xVx>L^k>domJ_txL~)j^|cR{0;U?K;pIZ4XVT9$5%`=z(!<2h8VABKjE# z`yB9(UkK>I68-SQ+eCVa%xl&hy7Il3p7d5t^dWl&!)FBAW2?RNMeDohPhNWP!T34` z2JAs!(SCFNEa{Jp^PYNZm^pY7jhFB{Qe1rw{wma9v3t)0UD*}sFn^2s2JDyF@xy|G zMjxwRu@>i-s503UTWsvuvF-iWTrY-3L|J81cDrtU%{x*!e-rU@s%pfR?QWmZ5P}_~!RCd;0x5`QP2|-496q_Y4e(@_%su7wzk` z|HsA0H+Xs@d#kYjPyKB-;(;Inatu2Z{{HvusV_5I@f*w;y+dQO2UiJXtBV$2U3d3(?o<(8Zy?Zx8EK zZC5||zzd@wLwWrQ26ts!H7Bpty1HCMUpGS|QTfw0ckbL#SJn%aONl-!v4622o&OvX z`(syjvj)eNU*H?|GSR+5^M!gH*x z!>>`7gG%)-HV>=oj~YtbaO1dfu~T^~x&{SrPj63I#0O-@rM7dz{H> zd8w)jb6`wFYr^#xjRVPr&~J3%B{qFN&WEmYJ_q*QxklHy`0FTPzu7f*X<4M+<#0?L zKj;s^{+9=TXE*ykou{PsYN7{zpvS`63051u_5h+!EpL;LaMou(UH@Dh@#nKCjr$lr zqe?py@7x)vVld>RM*Z#GXfJF9%$Im!w5zrHFP!{!BlcseLvGBymOS=VFgxt?X?aSe z&9*}%0AW1dZ~^j9WIOD8W7&9fu)mN$M799$BbD#cQaaB%X3l!*xS&r}Lf-GZ<-CyC zW^}gm*NX{GNX}Q!J2UI|gm2VzO8>a)uKju8I7R2bR8@(!+raG^?XfrNI}?57>rL!? zIRC4_?*$Cj!9EO7gvs7h)$iqhg5whGBLCC#2{m5)Q-1^x9klO9=*=pmic)9q2M_NjDppwDs z?~S-v=lag>9D4bHHT~AWm0UJn_}BF~pGfEd_8%B5SUc=1dJ-PL+680E(!IFYf@_4v zZNsMZqFyOR&~4SFkN&I|F%F(LsB|}ft!Dv)FCneG&Eoa{6`8}5xT9WqFSG|@KN)_R~R-XH$R+Y2{x_vnDnH(brHeUz=@d50)}(**mJUBo|~H(@`I8`oE_ zkGyK1}+E4pAbRb zR#X{=@B!nF9au3dCoeo{?5H7vZIWgf0ezp+jCy9vaTU<_kitmhcjE8velPyX{?jwy zHnQi*9vGL<;9xL4pHSn~|EWLXf7VXlOTa(ebLy1I`9tnyvR|au^nE-2bp0C$>=$Jl(>`(2GFDAvNO`B>MzHt6cud=!MNw1=F z=x348$50nxUEmEsPs*X6$&zp!2ypZPPFc!e&SyG3o*RAsx%CSCvF2T9h&)gC)MZIS zh773``^Wq%uBlre3{7@^Wpp-^K00RnuST);5zhaPhU#DM2eVIG*@vnEx+`(p^?bia zWDJ4*&e_+OG4b`f%&vozCqmng-nVsY*HjQ!W1ZQ#)S9Zwe{0D3@bC6-nt~CWfc{_U z(_hP-)7`o+xL3BTEK8C4!FDnJ3H#44_}xtW-tU$F#NYjfOf4H(ZPp~;ez`8=dPU!`U`O(hvL?luZrfEWt*>iy@~*N}RlD}w$kdOKN;bHc z57-I$>EKHqRf505difJ&WFKhfX1W1$TP{?UmWyRDsx1GjnZ8T@VMuP=i1&fE7s$Z@pa#{}38^L<1g3iz8g zq&q`D8Hj23*t4*|E6r7g@%QcV_?sj2I}{N27CbEcn&JO}e3$ThXCi{vMR`yBjb;(w zjqvy3dZh$5jft(b4@x@@A(R#c6$)VelRv4p!7CpGc~Da)$_vsD5K zv>W+^AqU}4sh+yYFz1E-gcX2E9H#P4R`-A__ z+g}J51NjBm#GWVlz^QpiU(X7VJ%(4;Z5Zs|H&%E*Bg+Gu6qNfJ?*|OFM-Glp+<%1r zT8-ECxPxzA=I=gO2>Vd)u}_u1gT~2+Ww()h-)PIQD&S!Z*|*{W*s~NigDfj}JJMU$ z&xCy1p@1Pl)bD6NMw%Cch#$}XF5;i~7w8vZ^6z#_VDkSWGmJd{6=Upnn9^wc6 zzr&a*!FQ@^R_d%-Y`v}MPp8u_7uGX{|Lqwgv3L^13~ z-;R2yj(2m%pTjKi|{dg7bMmKunCMKMw8S7qz32eb1a8 zuJrNQuo2IXpaIZ%LWv)L=XZj9Y$@50E?2jn`}NOoCI>G%gY!}nha6zj2K}Kvx>V(Q zi$&CjDE^~EfE{4$?yx{G%xxClBB2%Do7aC)snZ+)Ck^ z2kjkQ+2P96)RYwIdg-$C2G9D2Kt9Tnfd5q1UI}@5-T~h6&;x3o%92vo2MqDxN6rQ8 zNkzP9eFb|SxxbWItLBO4f5MkcscdHWzKH%)#P>ru^0!PKx$UXJ{vreRgem7|>SB4a z58{8bt>HtYU?DwL4CwzDJ zxJ7=?3Q>gEpa3#_rQqx+N2)*u6Fo@zo9GAZyp6RJePMeL@lW&+1OdR>i5{R&{tG>@ zcCv>c@nFNlH(c#Jju3^0#>A7c4fVo$D>?2`UO3{tIgX*+&wIW|?RefF_>dg(Z6U9Q`V_rQKbIy$Z^CwwN8caDz7PESy%?sd0u$v$}OL>_j2&yV&`3o<`4nE0n#qOZ|zN6FuPk=wL97kMPT2 z8h?=Fd_npH((Bf6S55L1JXE2{QtZPYIZOG?3R2M^FF33>V0#weu58OM;0W3u(Y|CU zAL@&C^8XMV_C0S$$WKJK)e_CCZLvAG`CtxdECTijFt?hsGXa*R7kYZHXHgQ;3^v5^PcYs-_KdXm(%wnaNecwFV5jN6HNR}@H30~ zc0a(vd|E+TwH|+DvnFedH@eMZFYGpGMSi9A>X689T2J6N6H6uhXn!_A0bnrUV@-kg zeZqIuKk;|JM1ByyagA<}deIB+dm!^49jS#M(FcwL4hBDfYfjz{snr#Kd^R^N2Cujn8qIn0l{F>SI{ovo9vVE@l!<@{s-6_<0r7^bKq~O z!9PUts~1ORo{ze?)vPRey<$fm;<5TR7j#yZf-?#<4C zJrx>`cilDphcCuIgSY2oiK!73B z?|!rvn%AMf+<)M(@>8<21>dW<`^Tro++FYbuGZB!q*Mogm}M&)ZyLt?3;!GZsj$b0 z^g#Fqe*4+;g8nAqPg*Y|r7B?Ugl|*Fnsp4O^_J2D;m6X^?`G`+e>=VYb&~FSyXg{-E!P_@?p3*R{5?_eow!^#d8`o6d`@ zT{uq!#lPr&J>!$Y6;WF6mR~nhOPMfjlk3XC)cj1jQJMbD@ckMq2< z-RMk%{RQ&D_mP`M_f5O|e4%-Vg5wfLu>J}WFBt9STa|zR2Yv6>tEC;&Ew-NbMjwH( z9wuVYqpGCj_sMMhY49h(-6GlopFC`^Js65v;Jh4}hc7}w2+V%r(aXp? z0Pj51u2tN4*pntA??74}Rs`+SuXhByr=5)Gv4P+6P8+2LTom*JhXd` z@uz)nBrPjT8S~!WmlGenva8_7eQ)>{mzfmX-+j3;6#Y3R{f)hO@b{1Gqw~6Hj3QCV zg&u`-0PQC72-V=S|TClhu(D-qO zScC`Vfw;dD{RhR*6!A~-=Fh|J?{C^gSJ}vOO1b-yop^l6A738}_KljLYul=6n zsdWD*e48vC-R%1UzxVb!84PZOd|$Yb!3z8##n=C9n7)VoVVn3p$OCK-JcDU}2&%3T z@hQlI28V;S3-SPU-5D&%g9fj@N&1g;zo7jR>Y?~PtuM$)lply!N|(oZ^$oiJ5me() zv;GD8u<@PH)e?FgMKNj_K z+V8-wBK|4D#X7IOlJseaACW#te~{{@ z&6(SJv`S05mL$Ma(U#P8h$68vL5oj@>q|DWaYf5OlI)SkknP`Hfv!=KV? zU)bdQajRe4);kk%?N@SbU#G;i{)XBh_CA><=~|~0M(`d3DJ(`=CkcyaF?VU`T6jnT ziS12i{5Ikm2X7;xEBu6Ok=g;vASi^jNUzP3SxhUrhOL8`MHEQ~dtNprYYeX0|AMVD zGrjE!%r^smW%fL=U29!}IDUG+RWe_*istLR29>7Q;hJk);Dr4&{v{V;4t8nOj$~`< zbAaKgiP-}7dQiiu)n!`T1rlTJW?H2hcN4W zS8{i?HGN?F+!=napucJIM`HGn8*H@tzPADIcQx9M;98}6-KT8)Ie9v)N56%^G+w|R z3`Wp-NP*-UIn5W>1jTKoGn(e>y*9sr<_iLl4Z8iQe}KQc%&A6P&WL(2<{-kF-(Ra8 zaqVPjxv}@eG89X7QEwc;P^nz+@V@I78uHi*gB23F?!kY^j zVYig{>NvS=cflRlNTFE;9Q4t@_(d|GpxvL{cF=WZ?vV;jKJV@i=T-mMIrsbo)xoak zU}fkF`l^1|i9d!ML6~v0?e%-2*nEp{?K{)poj=iQ2JXeO_C~CSR^nHtYje2vn!wuA z^mMHi*IYiUUv~J-F2ypKb*qtBke@q``*6V!8IBeDo*$BT{rVs4PkpgDA7R){(Vttq zZdo#0EL!At8^raaYiS9e=B=J~)roV+t9ZZlw=XPO`aO8tSnvT|I}4ip?tFfqFam|= z8d_uC&=2h>bT+Jw!rDK0t8(|~pT5zp#x=%nt5x%lpk3{;r$26YWxFrWvHIwC{p=iQ z;C{b9@}w2x#rF$7{esQMM;D$1`WNSqpkZ7imxO^r?E-$q`4<{C&@n9G@gpCcTz2QJ za$JMgf4V%^IMa=ogu++G@3MAfyIe!`vL`%l$wFL1*kQ3$y)-yq3iJHd9y@o<+SONG z2wkZ{*w45*FD!cDPjG`8*PY3M+0K;p*Y}3yzK<|yj~VSbh>K?%UtVzrFqzSw*~Ugs zZf1lbA?w6FFL}ZyiM~t_VSFOjD|>N%_p&k{{aWL^jj^ZO*01aTq*R}f&&w9wo z6Rt&w^Y_RL?=hU@7jCsBL|v#~F{@s8#eWad5{zqbjs3~FJGny}iLmwT{MM)D|N0c} zu$0#{bys&~8{5C_Wc|}M02JAkkK=FaCd^)JT~^kZ82ftt*>pIb?EJdvX?ZX+WR01& zq7i2Vm?eu5HdAAZ<&HLDvh@vIRoN`z+QCsf!JB+vEn6(W!;cdD4p(gLfZ5A7Z@93& z@=pp4atb4NC@%FccCWtn+OjgGvU+d*v0r`R>I+SFD3-wu&KpA~W?V(s<@@r=Z{Hlg8^$sF?v(4pNw`d z+fZT~&D@@POLUeAC(*7`xs*AA!UWY%aoor@{tM?c{R1##M+dYn6x~K$*{Mpds(Lq@ zuMfgfO^2bz{KVg!!}t1h!41^7>aSyc^yCKin2{%lyAxdtKSujW+{l6BS6^G%xro9b z_8-&l9`PN2=e`}sTr}Q4jV$Vn{`{3^zQfI@rEr_x?7uCV5zHzX&0jPt3CAwjaVA!K z_>024Hmc%RMBg^PX+N2pxT`c(g?NpxgRbR&KlEkCi?hoRrZKX$)&CWNzRpruMTU0W zTDHEkUj!4yUVrM5NZ22x@guO}Cm zA*`}}xsT7gME~Q?{1(>;c>d7NQ4I+Ds$UFzn^m=OV@o0j`isjy-xw81^vWR_sN>Ue zyK&XAA~VdqJ%)D!@;vg%M+XgNhxZso$1+4siE0-eJEU$-ADt)cY4o21ia_6e6ebV| z>dpFS`Y08~7gdV!^PN++*%7CY=S%>SPi#B?q!&*{PwL_hUZ;)KA1=T$pcSp zC3x4aUEK8kYw>>$I!{$<+z4v)yyB#buFODb5$WHQa_?wN^NmCwR@UI_&?j+SiSrBczvy{HREOX)5@0n9r8)Rozha;e#kC4H0o`Y-lJ!<)t;j!<>lNlxg z`*&ye%LQ!yG@msRw^|4E9jNi*u?qSw+#1qjDVZ(3a78+qsTv$F_OLMZ9g3YP^1!Dr z0bdB)UxI5o1qBO-vGHEQwevL#wK$r2Mlf`PPPI_>k_cZiD^+{mbBJ&Yu2qC|=98P# zL~lgFP4S*7Uvx9J;2Nz4i3cA-V2Yi;GqeR^w~ju?n&&QfE zAL4K0`AAhNCp?cR-^YahhPBN`*al+!`xD;}c-|uqWl3W>Z&(D)R~ptr<3-e?md(ec zAUCKNCjGzLZ4}!H#wk*qKdpzWyl{`{UTzNZt8=%PssGsfalxfK2bRq#OEV~3D2IB( z=F7#VsMy;pT+smc%^1Unh)4t zr1$@LjKq4t>m!;?h+g6#57_sbz&}BlFN4jh&P2#hNASYWbKz!%nKUazKHpXyxbGyv zPeG7C*zKdBk2lG{P>ei4gyqxsEw7jekSaB^O zS2qvyz@XPUui1n68E$cro=KnYmbgu5ylW);!)kUKfe?SLJD^+)sVcN>i&j6bCFQ4GQgnz?Py<4p#b9d{e>W@ECzqZd=4V5;Br3X&uL(b2 z9gZE6>}E~)9+G*8!;Zx5C_07?zcnrE#raheVh%!$LoOcKi2&z!+s466V2R#hv+Nw- zwmSFlG~I>cI7U8vHnwDso4=FHKY4_rPr2CLOM-8tJbZ0^^x=R#N>$~NUGMmQZE84s zup~zY5MTY)czmG)3Ncr{B_c%OBo4F`6vz*kf?8D0t9g52lj(Oju zJ3n%Me=kKp&9zOA_B*?x+Id{xw#(X>D0gJIr=Nu`B1GGgT3p+A|3`$}o1vE|n+@u= zk2nmS8QUOW1(#W4i#U7Y{N;|M{~~X9`0oCP*Kv=18Tq(5lD3&lc&}wsJ!)TvF#i_*HQDpmilKPhMq6RF)$-DKY;u0wB7mg+?BJT#`Se*1Cc*b zp7lW1TgwnVWlU(b_}S{i4m&=-xU94*d+L#V-IKk`t-j$c-?l(ax%#JJ#!yML6KV{I zY^+lu8nMCA`oKQF<(KQ1(e1Xx^Bdb6J||;7-HyvMr@vA>r^D)zu2R8q#=567{)jKc-Hb_ zkWi5s-jHfnt8CYbZyN#A{4FO7wDJuewE+AZy$*7ZeV^tBtyf%cvgXg9uU3a}_^^y? z6;79LkEt{({K54>b)4!(&SM|JDVC~iO}u?{Txb0|vgGZ{i_5GUEm!hR!k75w{&8n6 zm867#i+htBR_k(RFHIxsOF&pm*h6PlUm1BS_oqrEVJJ~>bwe+132QR;AFC>BN~}w< zwZ|Xb{aNEZM;iUmzhSO^<#1>d4^7iOkcOa|prB!n@%wwn?*!(Ht=9CbH(f41aKYy< zb6m^Y|}Gm4z6fJ5|=S3hbK-eRjGiqZf!l!{pl_Fhi^p|A&4u;C#LQi z_fzn6XK7?5E{*m!J}Y^i@$+_1UV){*#NVQ$mJSBbn6h4f&s^uJXfO zqUcqr3fnYi)Uy|+J^Mfoe39~?VMF|DHO^1ph(ANVM^neDdA^XSSkF;SAyZb)&H1Fr LKxj5AJxKUJ;Qb-y literal 0 HcmV?d00001 diff --git a/arma/server/tools/config_style_checker.py b/arma/server/tools/config_style_checker.py new file mode 100644 index 0000000..2332750 --- /dev/null +++ b/arma/server/tools/config_style_checker.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 + +import fnmatch +import os +import re +import ntpath +import sys +import argparse + +def check_config_style(filepath): + bad_count_file = 0 + def pushClosing(t): + closingStack.append(closing.expr) + closing << Literal( closingFor[t[0]] ) + + def popClosing(): + closing << closingStack.pop() + + reIsClass = re.compile(r'^\s*class(.*)') + reIsClassInherit = re.compile(r'^\s*class(.*):') + reIsClassBody = re.compile(r'^\s*class(.*){') + reBadColon = re.compile(r'\s*class (.*) :') + reSpaceAfterColon = re.compile(r'\s*class (.*): ') + reSpaceBeforeCurly = re.compile(r'\s*class (.*) {') + reClassSingleLine = re.compile(r'\s*class (.*)[{;]') + + with open(filepath, 'r', encoding='utf-8', errors='ignore') as file: + content = file.read() + + # Store all brackets we find in this file, so we can validate everything on the end + brackets_list = [] + + # To check if we are in a comment block + isInCommentBlock = False + checkIfInComment = False + # Used in case we are in a line comment (//) + ignoreTillEndOfLine = False + # Used in case we are in a comment block (/* */). This is true if we detect a * inside a comment block. + # If the next character is a /, it means we end our comment block. + checkIfNextIsClosingBlock = False + + # We ignore everything inside a string + isInString = False + # Used to store the starting type of a string, so we can match that to the end of a string + inStringType = ''; + + lastIsCurlyBrace = False + checkForSemiColumn = False + + # Extra information so we know what line we find errors at + lineNumber = 1 + + indexOfCharacter = 0 + # Parse all characters in the content of this file to search for potential errors + for c in content: + if (lastIsCurlyBrace): + lastIsCurlyBrace = False + if c == '\n': # Keeping track of our line numbers + lineNumber += 1 # so we can print accurate line number information when we detect a possible error + if (isInString): # while we are in a string, we can ignore everything else, except the end of the string + if (c == inStringType): + isInString = False + # if we are not in a comment block, we will check if we are at the start of one or count the () {} and [] + elif (isInCommentBlock == False): + + # This means we have encountered a /, so we are now checking if this is an inline comment or a comment block + if (checkIfInComment): + checkIfInComment = False + if c == '*': # if the next character after / is a *, we are at the start of a comment block + isInCommentBlock = True + elif (c == '/'): # Otherwise, will check if we are in an line comment + ignoreTillEndOfLine = True # and an line comment is a / followed by another / (//) We won't care about anything that comes after it + + if (isInCommentBlock == False): + if (ignoreTillEndOfLine): # we are in a line comment, just continue going through the characters until we find an end of line + if (c == '\n'): + ignoreTillEndOfLine = False + else: # validate brackets + if (c == '"' or c == "'"): + isInString = True + inStringType = c + elif (c == '/'): + checkIfInComment = True + elif (c == '('): + brackets_list.append('(') + elif (c == ')'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '[']): + print("ERROR: Possible missing round bracket ')' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(')') + elif (c == '['): + brackets_list.append('[') + elif (c == ']'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '(']): + print("ERROR: Possible missing square bracket ']' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(']') + elif (c == '{'): + brackets_list.append('{') + elif (c == '}'): + lastIsCurlyBrace = True + if (len(brackets_list) > 0 and brackets_list[-1] in ['(', '[']): + print("ERROR: Possible missing curly brace '}}' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append('}') + elif (c== '\t'): + print("ERROR: Tab detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + + else: # Look for the end of our comment block + if (c == '*'): + checkIfNextIsClosingBlock = True; + elif (checkIfNextIsClosingBlock): + if (c == '/'): + isInCommentBlock = False + elif (c != '*'): + checkIfNextIsClosingBlock = False + indexOfCharacter += 1 + + if brackets_list.count('[') != brackets_list.count(']'): + print("ERROR: A possible missing square bracket [ or ] in file {0} [ = {1} ] = {2}".format(filepath,brackets_list.count('['),brackets_list.count(']'))) + bad_count_file += 1 + if brackets_list.count('(') != brackets_list.count(')'): + print("ERROR: A possible missing round bracket ( or ) in file {0} ( = {1} ) = {2}".format(filepath,brackets_list.count('('),brackets_list.count(')'))) + bad_count_file += 1 + if brackets_list.count('{') != brackets_list.count('}'): + print("ERROR: A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}'))) + bad_count_file += 1 + + file.seek(0) + for lineNumber, line in enumerate(file.readlines()): + if reIsClass.match(line): + if reBadColon.match(line): + print(f"WARNING: bad class colon {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + if reIsClassInherit.match(line): + if not reSpaceAfterColon.match(line): + print(f"WARNING: bad class missing space after colon {filepath} Line number: {lineNumber+1}") + if reIsClassBody.match(line): + if not reSpaceBeforeCurly.match(line): + print(f"WARNING: bad class inherit missing space before curly braces {filepath} Line number: {lineNumber+1}") + if not reClassSingleLine.match(line): + print(f"WARNING: bad class braces placement {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + + return bad_count_file + +def main(): + + print("Validating Config Style") + + sqf_list = [] + bad_count = 0 + + parser = argparse.ArgumentParser() + parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="") + args = parser.parse_args() + + for folder in ['addons', 'optionals']: + # Allow running from root directory as well as from inside the tools directory + rootDir = "../" + folder + if (os.path.exists(folder)): + rootDir = folder + + for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.rvmat'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.cfg'): + sqf_list.append(os.path.join(root, filename)) + + for filename in sqf_list: + bad_count = bad_count + check_config_style(filename) + + print("------\nChecked {0} files\nErrors detected: {1}".format(len(sqf_list), bad_count)) + if (bad_count == 0): + print("Config validation PASSED") + else: + print("Config validation FAILED") + + return bad_count + +if __name__ == "__main__": + sys.exit(main()) diff --git a/arma/server/tools/release.bat b/arma/server/tools/release.bat new file mode 100644 index 0000000..667a74c --- /dev/null +++ b/arma/server/tools/release.bat @@ -0,0 +1,4 @@ +@ECHO off +hemtt script update_build.rhai +hemtt script update_minor.rhai +hemtt release diff --git a/arma/server/tools/release_patch.bat b/arma/server/tools/release_patch.bat new file mode 100644 index 0000000..ec4db02 --- /dev/null +++ b/arma/server/tools/release_patch.bat @@ -0,0 +1,4 @@ +@ECHO off +hemtt script update_build.rhai +hemtt script update_patch.rhai +hemtt release diff --git a/build-arma.ps1 b/build-arma.ps1 new file mode 100644 index 0000000..fe6a29f --- /dev/null +++ b/build-arma.ps1 @@ -0,0 +1,69 @@ +#!/usr/bin/env pwsh +<# +.SYNOPSIS + Build both arma/client and arma/server using hemtt + +.DESCRIPTION + This script runs hemtt build for both the client and server Arma mods. + It changes to each directory and runs the build command. + +.PARAMETER Target + Specify which target to build: 'client', 'server', or 'both' (default) + +.EXAMPLE + .\build-arma.ps1 + Builds both client and server + +.EXAMPLE + .\build-arma.ps1 -Target client + Builds only the client +#> + +param( + [Parameter(Mandatory=$false)] + [ValidateSet('client', 'server', 'both')] + [string]$Target = 'both' +) + +$ErrorActionPreference = "Stop" +$scriptDir = $PSScriptRoot + +function Build-HemttProject { + param( + [string]$ProjectPath, + [string]$ProjectName + ) + + Write-Host "`n=== Building $ProjectName ===" -ForegroundColor Cyan + + Push-Location $ProjectPath + try { + & hemtt utils fnl && hemtt build + if ($LASTEXITCODE -ne 0) { + throw "hemtt build failed for $ProjectName with exit code $LASTEXITCODE" + } + Write-Host "✓ $ProjectName build successful" -ForegroundColor Green + } + finally { + Pop-Location + } +} + +$clientPath = Join-Path $scriptDir "arma\client" +$serverPath = Join-Path $scriptDir "arma\server" + +try { + if ($Target -eq 'client' -or $Target -eq 'both') { + Build-HemttProject -ProjectPath $clientPath -ProjectName "Client" + } + + if ($Target -eq 'server' -or $Target -eq 'both') { + Build-HemttProject -ProjectPath $serverPath -ProjectName "Server" + } + + Write-Host "`n=== Build Complete ===" -ForegroundColor Green +} +catch { + Write-Host "`n✗ Build failed: $_" -ForegroundColor Red + exit 1 +} diff --git a/forge.code-workspace b/forge.code-workspace new file mode 100644 index 0000000..e24ee21 --- /dev/null +++ b/forge.code-workspace @@ -0,0 +1,22 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "files.autoSave": "onFocusChange", + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.associations": { + "*.cpp": "arma-config", + "*.hpp": "arma-config", + "*.inc": "arma-config", + "*.cfg": "arma-config", + "*.rvmat": "arma-config" + } + } +} diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..c82ce4a --- /dev/null +++ b/lib/README.md @@ -0,0 +1,244 @@ +# Forge Library + +This directory contains the core business logic and data layers for the Forge framework, organized into modular, reusable crates that follow clean architecture principles. + +## Architecture Overview + +The library follows a **layered architecture** pattern, ensuring separation of concerns and maintainability: + +```mermaid +graph TD + Extension[Extension Layer
#40;ArmA 3 Interface#41;] + Services[Services Layer
#40;Business Logic#41;] + Repositories[Repositories Layer
#40;Data Persistence#41;] + Models[Models Layer
#40;Data Structures#41;] + + Extension --> Services + Services --> Repositories + Repositories --> Models +``` + +## Modules + +### Models (`lib/models`) + +**Purpose**: Defines strict data structures and validation rules for domain entities. + +**Responsibilities**: +- Define entity structures (`Actor`, `Org`) +- Implement validation logic +- Handle serialization/deserialization (JSON, Arma) +- Enforce business rules at the data level + +**Key Features**: +- Strong typing with Rust structs +- Built-in validation on creation and updates +- Automatic email generation for actors +- Arma-specific type conversions + +**Documentation**: [models/README.md](models/README.md) + +### Repositories (`lib/repositories`) + +**Purpose**: Manages data persistence and retrieval using Redis. + +**Responsibilities**: +- Abstract database operations +- Implement CRUD operations +- Handle data serialization to Redis formats +- Manage Redis keys and data structures + +**Key Features**: +- Generic over Redis client implementations +- Hash-based storage for structured data +- Set-based storage for collections (e.g., org members) +- Thread-safe operations (`Send + Sync`) + +**Documentation**: [repositories/README.md](repositories/README.md) + +### Services (`lib/services`) + +**Purpose**: Implements business logic, validation, and orchestration of operations. + +**Responsibilities**: +- Coordinate between repositories +- Enforce business rules +- Handle complex workflows +- Provide high-level APIs for the extension layer + +**Key Features**: +- Generic over repository implementations +- Stateless service design +- Get-or-create patterns for entities +- Comprehensive error handling + +**Documentation**: [services/README.md](services/README.md) + +### Shared (`lib/shared`) + +**Purpose**: Provides common utilities, traits, and helper functions used across all layers. + +**Responsibilities**: +- Define shared traits (`RedisClient`) +- Provide utility functions +- Common type definitions +- Cross-cutting concerns + +**Key Features**: +- `RedisClient` trait for repository abstraction +- JSON/Redis value parsing utilities +- Arma value conversion helpers +- Reusable helper functions + +## How It All Works Together + +### Example: Creating an Actor + +Here's how the layers interact when creating a new actor: + +1. **Extension Layer** receives SQF command: + ```rust + // arma/server/extension/src/actor.rs + pub fn create_actor(key: String, data: String) -> String { + // Parse JSON and call service + ACTOR_SERVICE.create_actor(uid, json_data) + } + ``` + +2. **Service Layer** validates and orchestrates: + ```rust + // lib/services/src/actor.rs + impl ActorService { + pub fn create_actor(&self, uid: String, data: String) -> Result { + // Create actor model (validates data) + let actor = Actor::new(uid, data)?; + + // Persist via repository + self.repository.create(&actor)?; + + Ok(actor) + } + } + ``` + +3. **Repository Layer** persists to Redis: + ```rust + // lib/repositories/src/actor.rs + impl ActorRepository for RedisActorRepository { + fn create(&self, actor: &Actor) -> Result<(), String> { + // Convert actor to Redis hash + let fields = actor.to_redis_fields(); + + // Store in Redis + self.client.hash_mset(format!("actor:{}", actor.uid), fields) + } + } + ``` + +4. **Model Layer** ensures data integrity: + ```rust + // lib/models/src/actor.rs + impl Actor { + pub fn new(uid: String, data: String) -> Result { + // Validate all fields + Self::validate(&uid, &data)?; + + // Create actor with validated data + Ok(Actor { uid, /* ... */ }) + } + } + ``` + +## Contributing + +We welcome contributions to the Forge library! Follow these guidelines to maintain consistency and quality. + +### Adding a New Model + +See [models/README.md - Contributing](models/README.md#contributing) + +**Summary**: +1. Define struct with validation rules +2. Implement `new` and `validate` methods +3. Add serialization traits (`Serialize`, `Deserialize`) +4. Implement Arma conversions (`FromArma`, `IntoArma`) + +### Adding a New Repository + +See [repositories/README.md - Contributing](repositories/README.md#contributing) + +**Summary**: +1. Define repository trait with `Send + Sync` +2. Implement trait for `RedisXRepository` +3. Use `forge_shared::RedisClient` for operations +4. Register module in `lib.rs` + +### Adding a New Service + +See [services/README.md - Contributing](services/README.md#contributing) + +**Summary**: +1. Create service struct generic over repository +2. Implement constructor and business logic methods +3. Delegate data operations to repository +4. Register module in `lib.rs` + +### Best Practices + +#### Separation of Concerns +- **Models**: Only data structures and validation +- **Repositories**: Only data persistence logic +- **Services**: Only business logic and orchestration +- **Shared**: Only common utilities and traits + +#### Error Handling +- Use `Result` for all fallible operations +- Provide descriptive error messages +- Propagate errors up the stack with `?` + +#### Testing +- **Models**: Test validation rules +- **Repositories**: Test with mock Redis clients +- **Services**: Test with mock repositories +- **Integration**: Test full stack in extension layer + +#### Dependencies +- Models should have minimal dependencies +- Repositories depend on models and shared +- Services depend on repositories and models +- Avoid circular dependencies + +#### Thread Safety +- All repository traits require `Send + Sync` +- Services are stateless and thread-safe +- Use appropriate synchronization primitives when needed + +## Module Dependencies + +```mermaid +graph TD + Shared[Shared
#40;No Dependencies#41;] + Models[Models
#40;Depends on Shared#41;] + Repositories[Repositories
#40;Depends on Models, Shared#41;] + Services[Services
#40;Depends on Repositories, Models#41;] + Extension[Extension
#40;Depends on Services, Repositories, Models, Shared#41;] + + Shared --> Services + Services --> Repositories + Repositories --> Models + Models --> Extension +``` + +## Development Workflow + +1. **Define Model**: Start with data structure and validation +2. **Create Repository**: Implement persistence layer +3. **Build Service**: Add business logic +4. **Expose in Extension**: Create SQF-callable commands +5. **Test**: Verify each layer independently and together + +## Additional Resources + +- [Extension Documentation](../arma/server/extension/README.md) +- [Redis Operations](../arma/server/extension/src/redis/README.md) +- [Adapters](../arma/server/extension/src/adapters/README.md) diff --git a/lib/models/Cargo.toml b/lib/models/Cargo.toml new file mode 100644 index 0000000..0e4470c --- /dev/null +++ b/lib/models/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "forge-models" +version = "0.1.0" +edition = "2024" +description = "FORGE data models" +authors = ["IDSolutions", "J. Schmidt"] + +[dependencies] +arma-rs = { workspace = true, optional = true } +serde = { workspace = true } +serde_json = { workspace = true, optional = true } +forge-shared = { path = "../shared" } + +[features] +default = ["actor", "bank", "member", "org"] + +actor = ["arma-rs", "serde_json"] +bank = ["arma-rs", "serde_json"] +member = ["arma-rs", "serde_json"] +org = ["arma-rs", "serde_json"] +arma-rs = ["arma-rs/serde_json"] diff --git a/lib/models/README.md b/lib/models/README.md new file mode 100644 index 0000000..2fbd5d6 --- /dev/null +++ b/lib/models/README.md @@ -0,0 +1,140 @@ +# Forge Models + +This crate defines the shared data structures (models) used throughout the Forge application. These models represent the core entities of the game and are shared between the Extension, Service, and Repository layers. + +## Actor Model + +The `Actor` struct represents a player in the game. It contains all persistent data associated with a character. + +### Fields + +| Field | Type | Description | +| :--- | :--- | :--- | +| `uid` | `String` | Unique Steam ID (64-bit). Immutable. | +| `name` | `Option` | Player's display name. | +| `loadout` | `serde_json::Value` | JSON representation of the player's equipment. | +| `position` | `Option>` | `[x, y, z]` coordinates. | +| `direction` | `f64` | Compass direction (0-360). | +| `stance` | `Option` | Player stance (e.g., "STAND", "CROUCH"). | +| `email` | `String` | In-game email address (auto-generated). | +| `phone_number` | `String` | In-game phone number (auto-generated). | +| `bank` | `f64` | Money in the bank. | +| `cash` | `f64` | Money on hand. | +| `earnings` | `f64` | Total earnings. | +| `state` | `String` | Health/Status state (default: "HEALTHY"). | +| `holster` | `bool` | Whether the weapon is holstered. | +| `rank` | `Option` | Rank within an organization. | +| `organization` | `String` | ID of the organization the player belongs to. | +| `transactions` | `Vec` | History of financial transactions. | + +### Validation Rules + +- **UID**: Must be a 17-digit numeric string. +- **Name**: Max 50 characters, cannot be empty if set. +- **Position**: Must be an array of 3 finite numbers. +- **Direction**: Must be between 0.0 and 360.0. +- **Phone Number**: Must start with "0160" and be 10 digits long. +- **Email**: Must end with "@spearnet.mil". + +### Arma Integration + +The `Actor` struct implements `FromArma` and `IntoArma` for seamless conversion between Rust structs and SQF values. +- **From Arma**: Expects a JSON string. +- **To Arma**: Returns a JSON string. + +## Organization Model + +The `Org` struct represents a guild, clan, or group of players. + +### Fields + +| Field | Type | Description | +| :--- | :--- | :--- | +| `id` | `String` | Unique identifier (slug). | +| `owner` | `String` | UID of the organization leader. | +| `name` | `String` | Display name of the organization. | +| `funds` | `f64` | Shared organization funds. | +| `reputation` | `i64` | Organization's reputation score. | + +### Validation Rules + +- **ID**: Alphanumeric and underscores only. Cannot be empty. +- **Owner**: Must be a valid 17-digit UID. +- **Name**: Max 100 characters, no control characters. +- **Funds**: Cannot be negative. + +## Contributing + +We welcome contributions to the Forge Models crate! When adding a new model, please follow these guidelines to ensure consistency. + +### Adding a New Model + +To add a new model (e.g., `Vehicle`), follow these steps: + +1. **Define the Struct**: Create a new file in `src/` (e.g., `src/vehicle.rs`) and define your struct. + - Derive `Debug`, `Clone`, `Serialize`, and `Deserialize`. + - Use `#[serde(default)]` for optional fields that should have default values. + + ```rust + #[derive(Debug, Clone, Serialize, Deserialize)] + pub struct Vehicle { + pub id: String, + pub class_name: String, + #[serde(default)] + pub damage: f64, + } + ``` + +2. **Implement `new`**: Provide a constructor that initializes the struct with valid defaults. + ```rust + impl Vehicle { + pub fn new(id: String, class_name: String) -> Result { + let vehicle = Self { + id, + class_name, + damage: 0.0, + }; + vehicle.validate()?; + Ok(vehicle) + } + } + ``` + +3. **Implement `validate`**: Create a method to enforce business rules and data integrity. + ```rust + impl Vehicle { + pub fn validate(&self) -> Result<(), String> { + if self.id.is_empty() { + return Err("ID cannot be empty".to_string()); + } + if self.damage < 0.0 || self.damage > 1.0 { + return Err("Damage must be between 0.0 and 1.0".to_string()); + } + Ok(()) + } + } + ``` + +4. **Implement Arma Traits**: Implement `FromArma` and `IntoArma` for SQF interoperability. + ```rust + use arma_rs::{FromArma, IntoArma, Value}; + + impl FromArma for Vehicle { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s).map_err(|e| ... ) + } + } + + impl IntoArma for Vehicle { + fn to_arma(&self) -> Value { + let json = serde_json::to_string(self).unwrap_or_default(); + Value::String(json) + } + } + ``` + +5. **Register the Module**: Add your new module to `src/lib.rs`. + ```rust + pub mod vehicle; + pub use vehicle::Vehicle; + ``` diff --git a/lib/models/src/actor.rs b/lib/models/src/actor.rs new file mode 100644 index 0000000..a2c65fc --- /dev/null +++ b/lib/models/src/actor.rs @@ -0,0 +1,347 @@ +use arma_rs::{ + FromArma, IntoArma, + loadout::{AssignedItems, Loadout as ArmaLoadout}, +}; +use forge_shared::{ActorValidationError, arma_value_to_json}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Actor { + pub uid: String, + pub name: Option, + + #[serde(default)] + pub loadout: serde_json::Value, + + pub position: Option>, + #[serde(default)] + pub direction: f64, + pub stance: Option, + + #[serde(default)] + pub email: String, + #[serde(default)] + pub phone_number: String, + + #[serde(default)] + pub state: String, + #[serde(default)] + pub holster: bool, + pub rank: Option, + #[serde(default)] + pub organization: String, +} + +impl Actor { + pub fn new>(uid: S) -> Result { + let uid_string = uid.into(); + + if uid_string.trim().is_empty() { + return Err(ActorValidationError::EmptyUid); + } + + if !uid_string.chars().all(|c| c.is_numeric()) || uid_string.len() != 17 { + return Err(ActorValidationError::InvalidUid(uid_string)); + } + + let phone_number = Self::generate_phone_number(&uid_string); + let email = Self::generate_email(&phone_number); + + let actor = Self { + uid: uid_string, + name: None, + loadout: Self::default_loadout_json(), + position: None, + direction: 0.0, + stance: None, + email, + phone_number, + state: "HEALTHY".to_string(), + holster: true, + rank: None, + organization: "".to_string(), + }; + + actor.validate()?; + Ok(actor) + } + + pub fn validate(&self) -> Result<(), ActorValidationError> { + if self.uid.trim().is_empty() { + return Err(ActorValidationError::EmptyUid); + } + + if !self.uid.chars().all(|c| c.is_numeric()) || self.uid.len() != 17 { + return Err(ActorValidationError::InvalidUid(self.uid.clone())); + } + + if let Some(ref name) = self.name { + if name.trim().is_empty() || name.len() > 50 { + return Err(ActorValidationError::InvalidName(name.clone())); + } + } + + if let Some(ref pos) = self.position { + if pos.len() != 3 { + return Err(ActorValidationError::InvalidPosition( + "Position must have exactly 3 coordinates".to_string(), + )); + } + for coord in pos { + if !coord.is_finite() { + return Err(ActorValidationError::InvalidPosition( + "Position coordinates must be finite numbers".to_string(), + )); + } + } + } + + if !self.direction.is_finite() || self.direction < 0.0 || self.direction >= 360.0 { + return Err(ActorValidationError::InvalidDirection(self.direction)); + } + + if !self.phone_number.is_empty() { + if !self.phone_number.starts_with("0160") || self.phone_number.len() != 10 { + return Err(ActorValidationError::InvalidPhoneNumber( + self.phone_number.clone(), + )); + } + } + + if !self.email.is_empty() { + if !self.email.contains('@') || !self.email.ends_with(".mil") { + return Err(ActorValidationError::InvalidEmail(self.email.clone())); + } + } + + if !self.organization.is_empty() && self.organization.len() > 100 { + return Err(ActorValidationError::InvalidOrganization( + self.organization.clone(), + )); + } + + Ok(()) + } + + pub fn uid(&self) -> &str { + &self.uid + } + + fn generate_phone_number(uid: &str) -> String { + let uid_chars: Vec = uid.chars().collect(); + let uid_len = uid_chars.len(); + + if uid_len >= 6 { + let last_six: String = uid_chars[uid_len - 6..].iter().collect(); + format!("0160{}", last_six) + } else { + format!("0160{:0>6}", uid) + } + } + + fn generate_email(phone_number: &str) -> String { + if phone_number.is_empty() { + String::new() + } else { + format!("{}@spearnet.mil", phone_number) + } + } + + fn default_loadout_json() -> serde_json::Value { + let mut loadout = ArmaLoadout::default(); + + let uniform = loadout.uniform_mut(); + uniform.set_class("U_BG_Guerrilla_6_1".to_string()); + + loadout.set_headgear("H_Cap_blk_ION".to_string()); + + let mut items = AssignedItems::default(); + items.set_map("ItemMap".to_string()); + items.set_terminal("ItemGPS".to_string()); + items.set_radio("ItemRadio".to_string()); + items.set_compass("ItemCompass".to_string()); + items.set_watch("ItemWatch".to_string()); + loadout.set_assigned_items(items); + + let arma_value = loadout.to_arma(); + arma_value_to_json(&arma_value) + } + + pub fn get_loadout(&self) -> Result { + let loadout_str = serde_json::to_string(&self.loadout) + .map_err(|e| format!("Failed to serialize loadout: {}", e))?; + ArmaLoadout::from_arma(loadout_str).map_err(|e| format!("Failed to parse loadout: {}", e)) + } + + pub fn set_loadout(&mut self, loadout: ArmaLoadout) { + let arma_value = loadout.to_arma(); + self.loadout = arma_value_to_json(&arma_value); + } + + pub fn update_from_json(&mut self, json_obj: serde_json::Value) -> Result<(), String> { + if let serde_json::Value::Object(map) = json_obj { + let mut temp_actor = self.clone(); + + for (field, value) in map { + match field.as_str() { + "uid" => { + return Err( + "UID cannot be modified - it's the player's permanent Steam ID" + .to_string(), + ); + } + "name" => { + temp_actor.name = if value.is_null() { + None + } else { + value.as_str().map(|s| s.to_string()) + }; + } + "position" => { + temp_actor.position = if value.is_null() { + None + } else if let Some(arr) = value.as_array() { + let coords: Result, _> = arr + .iter() + .map(|v| v.as_f64().ok_or("Invalid coordinate")) + .collect(); + match coords { + Ok(pos) if pos.len() == 3 => Some(pos), + _ => return Err("Position must be [x, y, z] array".to_string()), + } + } else { + return Err("Position must be an array".to_string()); + }; + } + "direction" => { + if let Some(dir_val) = value.as_f64() { + temp_actor.direction = dir_val % 360.0; + if temp_actor.direction < 0.0 { + temp_actor.direction += 360.0; + } + } else { + return Err("Direction must be a number".to_string()); + } + } + "stance" => { + temp_actor.stance = if value.is_null() { + None + } else { + value.as_str().map(|s| s.to_string()) + }; + } + "email" => { + if let Some(email_str) = value.as_str() { + temp_actor.email = email_str.to_string(); + } else { + return Err("Email must be a string".to_string()); + } + } + "phone_number" => { + if let Some(phone_str) = value.as_str() { + let old_email = format!("{}@spearnet.mil", self.phone_number); + temp_actor.phone_number = phone_str.to_string(); + + let email_needs_update = + temp_actor.email.is_empty() || temp_actor.email == old_email; + + if email_needs_update { + temp_actor.email = Self::generate_email(&temp_actor.phone_number); + } + } else { + return Err("Phone number must be a string".to_string()); + } + } + "state" => { + if let Some(state_str) = value.as_str() { + temp_actor.state = state_str.to_uppercase(); + } else { + return Err("State must be a string".to_string()); + } + } + "holster" => { + if let Some(holster_val) = value.as_bool() { + temp_actor.holster = holster_val; + } else { + return Err("Holster must be a boolean".to_string()); + } + } + "rank" => { + temp_actor.rank = if value.is_null() { + None + } else if let Some(rank_str) = value.as_str() { + Some(rank_str.to_string()) + } else { + return Err("Rank must be a string or null".to_string()); + }; + } + "organization" => { + temp_actor.organization = if value.is_null() { + String::new() + } else if let Some(org_str) = value.as_str() { + org_str.to_string() + } else { + return Err("Organization must be a string or null".to_string()); + }; + } + "loadout" => { + temp_actor.loadout = value; + } + _ => return Err(format!("Unknown field: {}", field)), + } + } + + if temp_actor.phone_number.is_empty() { + temp_actor.phone_number = Actor::generate_phone_number(&temp_actor.uid); + } + if temp_actor.email.is_empty() { + if temp_actor.phone_number.is_empty() { + temp_actor.phone_number = Actor::generate_phone_number(&temp_actor.uid); + } + temp_actor.email = Actor::generate_email(&temp_actor.phone_number); + } + if temp_actor.organization.trim().is_empty() { + temp_actor.organization = String::new(); + } + + temp_actor + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + *self = temp_actor; + Ok(()) + } else { + Err("Expected JSON object".to_string()) + } + } +} + +impl FromArma for Actor { + fn from_arma(s: String) -> Result { + let mut actor: Actor = serde_json::from_str(&s).map_err(|e| { + arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e)) + })?; + + if actor.phone_number.is_empty() { + actor.phone_number = Actor::generate_phone_number(&actor.uid); + } + if actor.email.is_empty() { + if actor.phone_number.is_empty() { + actor.phone_number = Actor::generate_phone_number(&actor.uid); + } + actor.email = Actor::generate_email(&actor.phone_number); + } + if actor.organization.trim().is_empty() { + actor.organization = String::new(); + } + + Ok(actor) + } +} + +impl IntoArma for Actor { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} diff --git a/lib/models/src/bank.rs b/lib/models/src/bank.rs new file mode 100644 index 0000000..0174778 --- /dev/null +++ b/lib/models/src/bank.rs @@ -0,0 +1,259 @@ +use arma_rs::{FromArma, IntoArma}; +use forge_shared::BankValidationError; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Bank { + pub uid: String, + pub name: String, + pub bank: f64, + pub cash: f64, + pub earnings: f64, + pub transactions: Vec, + pub phone_number: String, + pub email: String, +} + +impl Bank { + pub fn new>( + uid: S, + name: S, + phone_number: S, + email: S, + ) -> Result { + let bank = Self { + uid: uid.into(), + name: name.into(), + bank: 0.0, + cash: 0.0, + earnings: 0.0, + transactions: Vec::new(), + phone_number: phone_number.into(), + email: email.into(), + }; + + bank.validate()?; + Ok(bank) + } + + pub fn validate(&self) -> Result<(), BankValidationError> { + if self.uid.trim().is_empty() { + return Err(BankValidationError::UidEmpty); + } + + if self.name.trim().is_empty() { + return Err(BankValidationError::NameEmpty); + } + + if self.bank < 0.0 { + return Err(BankValidationError::BankNegative); + } + + if self.cash < 0.0 { + return Err(BankValidationError::CashNegative); + } + + if self.phone_number.trim().is_empty() { + return Err(BankValidationError::InvalidPhoneNumber( + self.phone_number.clone(), + )); + } + + if self.email.trim().is_empty() { + return Err(BankValidationError::InvalidEmail(self.email.clone())); + } + + Ok(()) + } + + pub fn uid(&self) -> &str { + &self.uid + } + + pub fn update_field(&mut self, field: &str, value: serde_json::Value) -> Result<(), String> { + let mut temp_bank = self.clone(); + + match field { + "uid" => { + if let Some(uid_str) = value.as_str() { + temp_bank.uid = uid_str.to_string(); + } else { + return Err("UID must be a string".to_string()); + } + } + "name" => { + if let Some(name_str) = value.as_str() { + temp_bank.name = name_str.to_string(); + } else { + return Err("Name must be a string".to_string()); + } + } + "bank" => { + if let Some(bank_val) = value.as_f64() { + temp_bank.bank = bank_val; + } else { + return Err("Bank must be a number".to_string()); + } + } + "cash" => { + if let Some(cash_val) = value.as_f64() { + temp_bank.cash = cash_val; + } else { + return Err("Cash must be a number".to_string()); + } + } + "earnings" => { + if let Some(earnings_val) = value.as_f64() { + temp_bank.earnings = earnings_val; + } else { + return Err("Earnings must be a number".to_string()); + } + } + "transactions" => { + if let serde_json::Value::Array(arr) = value { + temp_bank.transactions = arr + .into_iter() + .filter_map(|val| val.as_str().map(|s| s.to_string())) + .collect(); + } else { + return Err("Transactions must be an array of strings".to_string()); + } + } + "email" => { + if let Some(email_str) = value.as_str() { + temp_bank.email = email_str.to_string(); + } else { + return Err("Email must be a string".to_string()); + } + } + "phone_number" => { + if let Some(phone_str) = value.as_str() { + temp_bank.phone_number = phone_str.to_string(); + } else { + return Err("Phone number must be a string".to_string()); + } + } + _ => return Err(format!("Unknown field: {}", field)), + } + + temp_bank + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + *self = temp_bank; + Ok(()) + } + + pub fn get_field(&self, field: &str) -> Option { + match field { + "uid" => Some(serde_json::Value::String(self.uid.clone())), + "name" => Some(serde_json::Value::String(self.name.clone())), + "bank" => Some(serde_json::Value::from(self.bank)), + "cash" => Some(serde_json::Value::from(self.cash)), + "earnings" => Some(serde_json::Value::from(self.earnings)), + "transactions" => Some(serde_json::Value::Array( + self.transactions + .iter() + .map(|s| serde_json::Value::String(s.clone())) + .collect(), + )), + "phone_number" => Some(serde_json::Value::String(self.phone_number.clone())), + "email" => Some(serde_json::Value::String(self.email.clone())), + _ => None, + } + } + + pub fn update_from_json(&mut self, json_obj: serde_json::Value) -> Result<(), String> { + if let serde_json::Value::Object(map) = json_obj { + let mut temp_bank = self.clone(); + + for (field, value) in map { + match field.as_str() { + "uid" => { + if let Some(uid_str) = value.as_str() { + temp_bank.uid = uid_str.to_string(); + } else { + return Err("UID must be a string".to_string()); + } + } + "name" => { + if let Some(name_str) = value.as_str() { + temp_bank.name = name_str.to_string(); + } else { + return Err("Name must be a string".to_string()); + } + } + "bank" => { + if let Some(bank_val) = value.as_f64() { + temp_bank.bank = bank_val; + } else { + return Err("Bank must be a number".to_string()); + } + } + "cash" => { + if let Some(cash_val) = value.as_f64() { + temp_bank.cash = cash_val; + } else { + return Err("Cash must be a number".to_string()); + } + } + "earnings" => { + if let Some(earnings_val) = value.as_f64() { + temp_bank.earnings = earnings_val; + } else { + return Err("Earnings must be a number".to_string()); + } + } + "transactions" => { + if let serde_json::Value::Array(arr) = value { + temp_bank.transactions = arr + .into_iter() + .filter_map(|val| val.as_str().map(|s| s.to_string())) + .collect(); + } else { + return Err("Transactions must be an array of strings".to_string()); + } + } + "phone_number" => { + if let Some(phone_str) = value.as_str() { + temp_bank.phone_number = phone_str.to_string(); + } else { + return Err("Phone number must be a string".to_string()); + } + } + "email" => { + if let Some(email_str) = value.as_str() { + temp_bank.email = email_str.to_string(); + } else { + return Err("Email must be a string".to_string()); + } + } + _ => return Err(format!("Unknown field: {}", field)), + } + } + + temp_bank + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + *self = temp_bank; + Ok(()) + } else { + Err("Invalid JSON object".to_string()) + } + } +} + +impl FromArma for Bank { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s) + .map_err(|e| arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e))) + } +} + +impl IntoArma for Bank { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} diff --git a/lib/models/src/lib.rs b/lib/models/src/lib.rs new file mode 100644 index 0000000..8d64619 --- /dev/null +++ b/lib/models/src/lib.rs @@ -0,0 +1,7 @@ +pub mod actor; +pub mod bank; +pub mod org; + +pub use actor::Actor; +pub use bank::Bank; +pub use org::{MemberSummary, Org}; diff --git a/lib/models/src/org.rs b/lib/models/src/org.rs new file mode 100644 index 0000000..43c3ffd --- /dev/null +++ b/lib/models/src/org.rs @@ -0,0 +1,203 @@ +use arma_rs::{FromArma, IntoArma}; +use forge_shared::OrgValidationError; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Org { + pub id: String, + pub owner: String, + pub name: String, + + #[serde(default)] + pub funds: f64, + #[serde(default)] + pub reputation: i64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MemberSummary { + pub uid: String, + pub name: String, +} + +impl Org { + pub fn new>(id: S, owner: S, name: S) -> Result { + let org = Self { + id: id.into(), + owner: owner.into(), + name: name.into(), + funds: 0.0, + reputation: 0, + }; + + org.validate()?; + Ok(org) + } + + pub fn validate(&self) -> Result<(), OrgValidationError> { + if self.id.trim().is_empty() { + return Err(OrgValidationError::EmptyId); + } + + if self.owner.trim().is_empty() { + return Err(OrgValidationError::EmptyOwner); + } + + if self.name.trim().is_empty() { + return Err(OrgValidationError::EmptyName); + } + + if self.funds < 0.0 { + return Err(OrgValidationError::NegativeFunds); + } + + if !self.id.chars().all(|c| c.is_alphanumeric() || c == '_') { + return Err(OrgValidationError::InvalidId(self.id.clone())); + } + + if !self.owner.chars().all(|c| c.is_numeric()) || self.owner.len() != 17 { + return Err(OrgValidationError::InvalidOwner(self.owner.clone())); + } + + if self.name.len() > 100 || self.name.chars().any(|c| c.is_control()) { + return Err(OrgValidationError::InvalidName(self.name.clone())); + } + + Ok(()) + } + + pub fn id(&self) -> &str { + &self.id + } + + pub fn update_field(&mut self, field: &str, value: serde_json::Value) -> Result<(), String> { + let mut temp_org = self.clone(); + + match field { + "id" => { + if let Some(id_str) = value.as_str() { + temp_org.id = id_str.to_string(); + } else { + return Err("ID must be a string".to_string()); + } + } + "owner" => { + if let Some(owner_str) = value.as_str() { + temp_org.owner = owner_str.to_string(); + } else { + return Err("Owner must be a string".to_string()); + } + } + "name" => { + if let Some(name_str) = value.as_str() { + temp_org.name = name_str.to_string(); + } else { + return Err("Name must be a string".to_string()); + } + } + "funds" => { + if let Some(funds_val) = value.as_f64() { + temp_org.funds = funds_val; + } else { + return Err("Funds must be a number".to_string()); + } + } + "reputation" => { + if let Some(rep_val) = value.as_i64() { + temp_org.reputation = rep_val; + } else { + return Err("Reputation must be an integer".to_string()); + } + } + _ => return Err(format!("Unknown field: {}", field)), + } + + temp_org + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + *self = temp_org; + Ok(()) + } + + pub fn get_field(&self, field: &str) -> Option { + match field { + "id" => Some(serde_json::Value::String(self.id.clone())), + "owner" => Some(serde_json::Value::String(self.owner.clone())), + "name" => Some(serde_json::Value::String(self.name.clone())), + "funds" => Some(serde_json::Value::from(self.funds)), + "reputation" => Some(serde_json::Value::from(self.reputation)), + _ => None, + } + } + + pub fn update_from_json(&mut self, json_obj: serde_json::Value) -> Result<(), String> { + if let serde_json::Value::Object(map) = json_obj { + let mut temp_org = self.clone(); + + for (field, value) in map { + match field.as_str() { + "id" => { + if let Some(id_str) = value.as_str() { + temp_org.id = id_str.to_string(); + } else { + return Err("ID must be a string".to_string()); + } + } + "owner" => { + if let Some(owner_str) = value.as_str() { + temp_org.owner = owner_str.to_string(); + } else { + return Err("Owner must be a string".to_string()); + } + } + "name" => { + if let Some(name_str) = value.as_str() { + temp_org.name = name_str.to_string(); + } else { + return Err("Name must be a string".to_string()); + } + } + "funds" => { + if let Some(funds_val) = value.as_f64() { + temp_org.funds = funds_val; + } else { + return Err("Funds must be a number".to_string()); + } + } + "reputation" => { + if let Some(rep_val) = value.as_i64() { + temp_org.reputation = rep_val; + } else { + return Err("Reputation must be an integer".to_string()); + } + } + _ => return Err(format!("Unknown field: {}", field)), + } + } + + temp_org + .validate() + .map_err(|e| format!("Validation failed: {}", e))?; + + *self = temp_org; + Ok(()) + } else { + Err("Expected JSON object".to_string()) + } + } +} + +impl FromArma for Org { + fn from_arma(s: String) -> Result { + serde_json::from_str(&s) + .map_err(|e| arma_rs::FromArmaError::InvalidPrimitive(format!("Invalid JSON: {}", e))) + } +} + +impl IntoArma for Org { + fn to_arma(&self) -> arma_rs::Value { + let json_str = serde_json::to_string(self).unwrap_or_default(); + arma_rs::Value::String(json_str) + } +} diff --git a/lib/repositories/Cargo.toml b/lib/repositories/Cargo.toml new file mode 100644 index 0000000..05bc30f --- /dev/null +++ b/lib/repositories/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "forge-repositories" +version = "0.1.0" +edition = "2024" + +[dependencies] +forge-models = { path = "../models" } +forge-shared = { path = "../shared" } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +tokio = { workspace = true } + +# Redis dependencies (only in repository layer) +redis = { workspace = true } +bb8-redis = "0.25.0-rc.1" +base64 = "0.22.1" diff --git a/lib/repositories/README.md b/lib/repositories/README.md new file mode 100644 index 0000000..f58a89d --- /dev/null +++ b/lib/repositories/README.md @@ -0,0 +1,197 @@ +# Forge Repositories + +This crate provides the data access layer for the Forge application, implementing the repository pattern to abstract database operations from business logic. + +## Architecture + +The repository layer sits between the service layer and the database, providing a clean abstraction for data persistence. + +```mermaid +graph TD + Services[Services Layer] + Repositories[Repositories Layer
#40;This Module#41;] + Database[Database] + + Services --> Repositories + Repositories --> Database +``` + +### Dual Storage Strategy +The implementation uses a dual storage strategy in Redis to optimize for different access patterns: +- **Hash Maps (`HMSET`/`HGETALL`):** Used for entity data (Actors, Organizations) to allow O(1) access to specific fields and efficient partial updates. +- **Sets (`SADD`/`SMEMBERS`):** Used for relationships (e.g., Organization Members) to ensure uniqueness and provide efficient membership testing. + +## Key Features + +- **Redis Integration:** Efficient hash-based storage for data +- **JSON Serialization:** Automatic conversion between Rust structs and Redis +- **Type Safety:** Strong typing with error handling +- **Performance Optimized:** Hash operations for fast field-level access +- **Flexible Client:** Generic over Redis client implementations +- **Atomic Operations:** Uses Redis atomicity guarantees for data integrity + +## Actor Repository + +The `ActorRepository` handles persistence for player data. + +### Storage Format +Actors are stored in Redis as hash maps: +```text +actor:{uid} -> Hash { + "uid": "76561198123456789", + "name": "PlayerName", + "bank": "1500.0", + ... +} +``` + +### Usage Example + +```rust +use forge_repositories::ActorRepository; +use forge_models::Actor; + +async fn example_usage(repo: &R) -> Result<(), String> { + // 1. Create + let actor = Actor::new("76561198123456789".to_string())?; + repo.create(&actor)?; + + // 2. Retrieve + if let Some(retrieved) = repo.get_by_id("76561198123456789")? { + println!("Found actor: {}", retrieved.name()); + } + + // 3. Update + // Updates are atomic and preserve fields not present in the update + let mut actor_to_update = repo.get_by_id("76561198123456789")?.unwrap(); + // ... modify actor ... + repo.update(&actor_to_update)?; + + // 4. Check Existence + if repo.exists("76561198123456789")? { + println!("Actor exists"); + } + + // 5. Delete + repo.delete("76561198123456789")?; + + Ok(()) +} +``` + +## Organization Repository + +The `OrgRepository` handles persistence for organizations (guilds/clans) and their members. + +### Storage Format +- **Org Data:** `org:{org_id}` (Hash) +- **Members:** `org:{org_id}:members` (Set) + +### Usage Example + +```rust +use forge_repositories::OrgRepository; +use forge_models::{Org, MemberSummary}; + +async fn example_usage(repo: &R) -> Result<(), String> { + // 1. Create Organization + let org = Org::new("elite_squad".to_string(), "leader_uid".to_string(), "Elite Squad".to_string())?; + repo.create(&org)?; + + // 2. Manage Members + // Add a member (idempotent, handles duplicates) + repo.add_member("elite_squad", "member_uid_1")?; + + // Get all members + let members = repo.get_members("elite_squad")?; + for member in members { + println!("Member: {} ({})", member.name, member.uid); + } + + // Remove a member + repo.remove_member("elite_squad", "member_uid_1")?; + + // 3. Update Organization + let mut org_update = repo.get_by_id("elite_squad")?.unwrap(); + // ... modify org ... + repo.update(&org_update)?; + + // 4. Delete Organization + // Note: This removes the org data but may require separate cleanup for members depending on implementation + repo.delete("elite_squad")?; + + Ok(()) +} +``` + +## Performance & Implementation Details + +### Atomicity +- **Upserts:** `create` and `update` operations use `HMSET` which is atomic. This means either all fields are updated or none are. +- **Schema Evolution:** New fields added to the Rust structs are automatically persisted to Redis. Old fields in Redis that are no longer in the struct are **preserved** (not deleted) during updates, allowing for safe backward compatibility. + +### Thread Safety +All repository implementations are `Send + Sync`, allowing them to be safely shared across threads. The underlying `RedisClient` handles connection pooling and concurrent access. + +### Error Handling +Repositories return `Result` (or custom error types) to propagate database failures, serialization errors, or validation issues up to the service layer. + +## Contributing + +We welcome contributions to the Forge Repository Layer! This guide will help you understand how to add new repositories and maintain the existing codebase. + +### Adding a New Repository + +To add a new repository (e.g., `ItemRepository`), follow these steps: + +1. **Create the Module**: Create a new file in `src/` (e.g., `src/item.rs`). +2. **Define the Trait**: Define a trait that specifies the data access operations. Ensure it requires `Send + Sync`. + ```rust + pub trait ItemRepository: Send + Sync { + fn create(&self, item: &Item) -> Result<(), String>; + fn get_by_id(&self, id: &str) -> Result, String>; + // ... other methods + } + ``` +3. **Implement for Redis**: Implement the trait for a generic `RedisClient`. Use `forge_shared` helpers for value conversion if needed. + ```rust + use forge_shared::{RedisClient, parse_json_value, parse_redis_value}; + + pub struct RedisItemRepository { + client: C, + } + + impl RedisItemRepository { + pub fn new(client: C) -> Self { + Self { client } + } + } + + impl ItemRepository for RedisItemRepository { + fn create(&self, item: &Item) -> Result<(), String> { + let redis_key = format!("item:{}", item.id); + // ... serialization logic ... + // Use self.client to interact with Redis + self.client.hash_mset(redis_key, fields) + } + + // ... other methods + } + ``` +4. **Register the Module**: Add your new module to `src/lib.rs` and export the trait and implementation. + ```rust + pub mod item; + pub use item::{ItemRepository, RedisItemRepository}; + ``` + +### Testing + +- **Integration Tests**: Write integration tests that use a real Redis instance (if available) or a mock. +- **Mocking**: For unit testing services, you don't need to test the repository implementation itself, but you should ensure the repository trait is easy to mock. + +### Best Practices + +- **Abstraction**: Keep the repository trait agnostic of the underlying database technology (e.g., don't expose Redis-specific types in the trait signature). +- **Serialization**: Handle serialization/deserialization within the repository implementation. The service layer should work with domain models, not raw JSON or database rows. +- **Keyspace**: Use a consistent naming convention for Redis keys (e.g., `entity:id`). +- **Atomicity**: Use Redis transactions or atomic commands where possible to ensure data consistency. diff --git a/lib/repositories/src/actor.rs b/lib/repositories/src/actor.rs new file mode 100644 index 0000000..c20fcd8 --- /dev/null +++ b/lib/repositories/src/actor.rs @@ -0,0 +1,161 @@ +//! Actor repository implementation for data persistence operations. +//! +//! This module provides the data access layer for actor (player) management, +//! implementing the repository pattern to abstract database operations. +//! +//! For full documentation and examples, see the [crate README](../README.md). + +use forge_models::Actor; +use forge_shared::{RedisClient, parse_json_value, parse_redis_value}; + +/// Repository trait defining the contract for actor data operations. +/// +/// This trait abstracts the data persistence layer, allowing different +/// implementations (Redis, PostgreSQL, etc.) while maintaining a consistent +/// interface for the service layer. All implementations must be thread-safe. +pub trait ActorRepository: Send + Sync { + /// Creates a new actor in the repository. + fn create(&self, actor: &Actor) -> Result<(), String>; + + /// Retrieves an actor by their unique identifier. + fn get_by_id(&self, id: &str) -> Result, String>; + + /// Updates an existing actor with new data. + fn update(&self, actor: &Actor) -> Result<(), String>; + + /// Permanently removes an actor from the repository. + fn delete(&self, id: &str) -> Result<(), String>; + + /// Checks if an actor exists in the repository. + fn exists(&self, id: &str) -> Result; +} + +/// Redis-based implementation of the ActorRepository trait. +/// +/// This implementation uses Redis hash maps to store actor data, providing +/// efficient field-level access and atomic operations. Each actor is stored +/// as a separate hash with the key format `actor:{uid}`. +pub struct RedisActorRepository { + /// The Redis client used for all database operations. + /// + /// This client handles the actual communication with Redis, including + /// connection management, command execution, and error handling. + client: C, +} + +impl RedisActorRepository { + /// Creates a new Redis actor repository with the provided client. + pub fn new(client: C) -> Self { + Self { client } + } +} + +impl ActorRepository for RedisActorRepository { + /// Creates a new actor in Redis using hash map storage. + /// + /// Stores each actor as a Redis hash map with the key format `actor:{uid}`. + /// Each field of the actor struct becomes a field in the Redis hash. + fn create(&self, actor: &Actor) -> Result<(), String> { + // Generate Redis key using actor UID + let redis_key = format!("actor:{}", actor.uid()); + + // Serialize actor to JSON string + let actor_json = serde_json::to_string(actor) + .map_err(|e| format!("Failed to serialize actor: {}", e))?; + + // Parse JSON string back to Value for field extraction + let json_value: serde_json::Value = serde_json::from_str(&actor_json) + .map_err(|e| format!("Failed to parse actor JSON: {}", e))?; + + // Extract fields from JSON object + if let serde_json::Value::Object(actor_map) = json_value { + // Convert each field to Redis-compatible format + let fields: Vec<(String, String)> = actor_map + .into_iter() + .map(|(field, value)| (field, parse_json_value(&value))) + .collect(); + + // Store all fields atomically using Redis HMSET + self.client.hash_mset(redis_key, fields) + } else { + Err("Failed to convert actor to object".to_string()) + } + } + + /// Retrieves an actor from Redis by their unique identifier. + /// + /// Uses Redis HGETALL to retrieve all fields of the actor hash map, + /// then reconstructs the Actor struct through JSON deserialization. + fn get_by_id(&self, id: &str) -> Result, String> { + // Generate Redis key using actor UID + let redis_key = format!("actor:{}", id); + + // Retrieve all hash fields from Redis + let actor_string = self.client.hash_get_all(redis_key)?; + + // Return None if no data found (actor doesn't exist) + if actor_string.is_empty() { + return Ok(None); + } + + // Parse comma-separated field-value pairs + let parts: Vec<&str> = actor_string.split(", ").collect(); + let mut json_map = serde_json::Map::new(); + let mut i = 0; + + // Process pairs of field names and values + while i + 1 < parts.len() { + let key = parts[i]; + let value = parts[i + 1]; + + // Convert Redis string value back to proper JSON type + let json_value = parse_redis_value(value); + json_map.insert(key.to_string(), json_value); + + i += 2; // Move to next field-value pair + } + + // Reconstruct Actor from JSON object + let json_obj = serde_json::Value::Object(json_map); + match serde_json::from_value::(json_obj) { + Ok(actor) => Ok(Some(actor)), + // Return None for any deserialization errors (corrupted data) + Err(_) => Ok(None), + } + } + + /// Updates an existing actor with the provided data. + /// + /// Uses `HMSET` to atomically update the provided fields. Fields present in Redis + /// but missing from the input are preserved. + fn update(&self, actor: &Actor) -> Result<(), String> { + // Delegate to create() which handles both creation and updates + // Redis HMSET naturally supports upsert behavior + self.create(actor) + } + + /// Permanently deletes an actor and all associated data from Redis. + /// + /// Removes the entire Redis hash containing the actor's data. + /// This operation is irreversible. + fn delete(&self, id: &str) -> Result<(), String> { + // Generate Redis key using actor UID + let redis_key = format!("actor:{}", id); + + // Delete the entire hash key from Redis + // This removes all fields and the key itself atomically + self.client.delete_key(redis_key) + } + + /// Checks if an actor exists in Redis without retrieving the data. + /// + /// Uses Redis EXISTS command for a lightweight check. + fn exists(&self, id: &str) -> Result { + // Generate Redis key using actor UID + let redis_key = format!("actor:{}", id); + + // Check if the key exists in Redis + // This is a lightweight operation that doesn't retrieve data + self.client.key_exists(redis_key) + } +} diff --git a/lib/repositories/src/bank.rs b/lib/repositories/src/bank.rs new file mode 100644 index 0000000..11940d6 --- /dev/null +++ b/lib/repositories/src/bank.rs @@ -0,0 +1,161 @@ +//! Bank repository implementation for data persistence operations. +//! +//! This module provides the data access layer for bank account management, +//! implementing the repository pattern to abstract database operations. +//! +//! For full documentation and examples, see the [crate README](../README.md). + +use forge_models::Bank; +use forge_shared::{RedisClient, parse_json_value, parse_redis_value}; + +/// Repository trait defining the contract for bank data operations. +/// +/// This trait abstracts the data persistence layer, allowing different +/// implementations (Redis, PostgreSQL, etc.) while maintaining a consistent +/// interface for the service layer. All implementations must be thread-safe. +pub trait BankRepository: Send + Sync { + /// Creates a new bank in the repository. + fn create(&self, bank: &Bank) -> Result<(), String>; + + /// Retrieves an bank by their unique identifier. + fn get_by_id(&self, id: &str) -> Result, String>; + + /// Updates an existing bank with new data. + fn update(&self, bank: &Bank) -> Result<(), String>; + + /// Permanently removes an bank from the repository. + fn delete(&self, id: &str) -> Result<(), String>; + + /// Checks if an bank exists in the repository. + fn exists(&self, id: &str) -> Result; +} + +/// Redis-based implementation of the BankRepository trait. +/// +/// This implementation uses Redis hash maps to store bank data, providing +/// efficient field-level access and atomic operations. Each bank is stored +/// as a separate hash with the key format `bank:{uid}`. +pub struct RedisBankRepository { + /// The Redis client used for all database operations. + /// + /// This client handles the actual communication with Redis, including + /// connection management, command execution, and error handling. + client: C, +} + +impl RedisBankRepository { + /// Creates a new Redis bank repository with the provided client. + pub fn new(client: C) -> Self { + Self { client } + } +} + +impl BankRepository for RedisBankRepository { + /// Creates a new bank in Redis using hash map storage. + /// + /// Stores each bank as a Redis hash map with the key format `bank:{uid}`. + /// Each field of the bank struct becomes a field in the Redis hash. + fn create(&self, bank: &Bank) -> Result<(), String> { + // Generate Redis key using bank UID + let redis_key = format!("bank:{}", bank.uid()); + + // Serialize bank to JSON string + let bank_json = + serde_json::to_string(bank).map_err(|e| format!("Failed to serialize bank: {}", e))?; + + // Parse JSON string back to Value for field extraction + let json_value: serde_json::Value = serde_json::from_str(&bank_json) + .map_err(|e| format!("Failed to parse bank JSON: {}", e))?; + + // Extract fields from JSON object + if let serde_json::Value::Object(bank_map) = json_value { + // Convert each field to Redis-compatible format + let fields: Vec<(String, String)> = bank_map + .into_iter() + .map(|(field, value)| (field, parse_json_value(&value))) + .collect(); + + // Store all fields atomically using Redis HMSET + self.client.hash_mset(redis_key, fields) + } else { + Err("Failed to convert bank to object".to_string()) + } + } + + /// Retrieves an bank from Redis by their unique identifier. + /// + /// Uses Redis HGETALL to retrieve all fields of the bank hash map, + /// then reconstructs the Bank struct through JSON deserialization. + fn get_by_id(&self, id: &str) -> Result, String> { + // Generate Redis key using bank UID + let redis_key = format!("bank:{}", id); + + // Retrieve all hash fields from Redis + let bank_string = self.client.hash_get_all(redis_key)?; + + // Return None if no data found (bank doesn't exist) + if bank_string.is_empty() { + return Ok(None); + } + + // Parse comma-separated field-value pairs + let parts: Vec<&str> = bank_string.split(", ").collect(); + let mut json_map = serde_json::Map::new(); + let mut i = 0; + + // Process pairs of field names and values + while i + 1 < parts.len() { + let key = parts[i]; + let value = parts[i + 1]; + + // Convert Redis string value back to proper JSON type + let json_value = parse_redis_value(value); + json_map.insert(key.to_string(), json_value); + + i += 2; // Move to next field-value pair + } + + // Reconstruct Bank from JSON object + let json_obj = serde_json::Value::Object(json_map); + match serde_json::from_value::(json_obj) { + Ok(bank) => Ok(Some(bank)), + // Return None for any deserialization errors (corrupted data) + Err(_) => Ok(None), + } + } + + /// Updates an existing bank with the provided data. + /// + /// Uses `HMSET` to atomically update the provided fields. Fields present in Redis + /// but missing from the input are preserved. + fn update(&self, bank: &Bank) -> Result<(), String> { + // Delegate to create() which handles both creation and updates + // Redis HMSET naturally supports upsert behavior + self.create(bank) + } + + /// Permanently deletes an bank and all associated data from Redis. + /// + /// Removes the entire Redis hash containing the bank's data. + /// This operation is irreversible. + fn delete(&self, id: &str) -> Result<(), String> { + // Generate Redis key using bank UID + let redis_key = format!("bank:{}", id); + + // Delete the entire hash key from Redis + // This removes all fields and the key itself atomically + self.client.delete_key(redis_key) + } + + /// Checks if an bank exists in Redis without retrieving the data. + /// + /// Uses Redis EXISTS command for a lightweight check. + fn exists(&self, id: &str) -> Result { + // Generate Redis key using bank UID + let redis_key = format!("bank:{}", id); + + // Check if the key exists in Redis + // This is a lightweight operation that doesn't retrieve data + self.client.key_exists(redis_key) + } +} diff --git a/lib/repositories/src/lib.rs b/lib/repositories/src/lib.rs new file mode 100644 index 0000000..3860e2b --- /dev/null +++ b/lib/repositories/src/lib.rs @@ -0,0 +1,10 @@ +pub mod actor; +pub mod bank; +pub mod org; + +pub use actor::{ActorRepository, RedisActorRepository}; +pub use bank::{BankRepository, RedisBankRepository}; +pub use org::{OrgRepository, RedisOrgRepository}; + +// Re-export RedisClient from shared library for convenience +pub use forge_shared::RedisClient; diff --git a/lib/repositories/src/org.rs b/lib/repositories/src/org.rs new file mode 100644 index 0000000..2997eea --- /dev/null +++ b/lib/repositories/src/org.rs @@ -0,0 +1,248 @@ +//! Organization repository implementation for data persistence operations. +//! +//! This module provides the data access layer for organization (guild/clan) management, +//! implementing the repository pattern to abstract database operations. +//! +//! For full documentation and examples, see the [crate README](../README.md). + +use forge_models::{MemberSummary, Org}; +use forge_shared::{RedisClient, parse_json_value, parse_redis_value}; + +/// Repository trait defining the contract for organization data operations. +/// +/// This trait abstracts the data persistence layer, allowing different +/// implementations (Redis, PostgreSQL, etc.) while maintaining a consistent +/// interface for the service layer. All implementations must be thread-safe. +pub trait OrgRepository: Send + Sync { + /// Creates a new organization in the repository. + fn create(&self, org: &Org) -> Result<(), String>; + + /// Retrieves an organization by its unique identifier. + fn get_by_id(&self, id: &str) -> Result, String>; + + /// Updates an existing organization with new data. + fn update(&self, org: &Org) -> Result<(), String>; + + /// Permanently removes an organization from the repository. + fn delete(&self, id: &str) -> Result<(), String>; + + /// Checks if an organization exists in the repository. + fn exists(&self, id: &str) -> Result; + + /// Adds a new member UID to an organization. + fn add_member(&self, org_id: &str, member_uid: &str) -> Result<(), String>; + + /// Retrieves all members of an organization as a list of MemberSummary objects. + fn get_members(&self, org_id: &str) -> Result, String>; + + /// Removes a specific member from an organization. + fn remove_member(&self, org_id: &str, member_uid: &str) -> Result<(), String>; +} + +/// Redis-based implementation of the OrgRepository trait. +/// +/// Uses Redis hash maps for organization data providing +/// efficient field-level access and atomic operations. Each organization is stored +/// as a seperate hash with the key format `org:{org_id}`. +/// Member lists are stored as sets with the key format `org:{org_id}:members`. +pub struct RedisOrgRepository { + /// The Redis client used for all database operations. + /// + /// This client handles the actual communication with Redis, including + /// connection management, command execution, and error handling for + /// both organization and member data operations. + client: C, +} + +impl RedisOrgRepository { + /// Creates a new Redis organization repository with the provided client. + pub fn new(client: C) -> Self { + Self { client } + } +} + +impl OrgRepository for RedisOrgRepository { + /// Creates a new organization in Redis using hash map storage. + /// + /// Stores each organization as a Redis hash map with the key format `{org_id}:org`. + /// Each field of the organization struct becomes a field in the Redis hash. + fn create(&self, org: &Org) -> Result<(), String> { + // Generate Redis key using organization ID + let redis_key = format!("org:{}", org.id()); + + // Serialize organization to JSON string + let org_json = + serde_json::to_string(org).map_err(|e| format!("Failed to serialize org: {}", e))?; + + // Parse JSON string back to Value for field extraction + let json_value: serde_json::Value = serde_json::from_str(&org_json) + .map_err(|e| format!("Failed to parse org JSON: {}", e))?; + + // Extract fields from JSON object + if let serde_json::Value::Object(org_map) = json_value { + // Convert each field to Redis-compatible format + let fields: Vec<(String, String)> = org_map + .into_iter() + .map(|(field, value)| (field, parse_json_value(&value))) + .collect(); + + // Store all fields atomically using Redis HMSET + self.client.hash_mset(redis_key, fields) + } else { + Err("Failed to convert org to object".to_string()) + } + } + + /// Retrieves an organization from Redis by its unique identifier. + /// + /// Uses Redis HGETALL to retrieve all fields of the organization hash map, + /// then reconstructs the Org struct through JSON deserialization. + fn get_by_id(&self, id: &str) -> Result, String> { + // Generate Redis key using organization ID + let redis_key = format!("org:{}", id); + + // Retrieve all hash fields from Redis + let org_string = self.client.hash_get_all(redis_key)?; + + // Return None if no data found (organization doesn't exist) + if org_string.is_empty() { + return Ok(None); + } + + // Parse comma-separated field-value pairs + let parts: Vec<&str> = org_string.split(", ").collect(); + let mut json_map = serde_json::Map::new(); + let mut i = 0; + + // Process pairs of field names and values + while i + 1 < parts.len() { + let key = parts[i]; + let value = parts[i + 1]; + + // Convert Redis string value back to proper JSON type + let json_value = parse_redis_value(value); + json_map.insert(key.to_string(), json_value); + + i += 2; // Move to next field-value pair + } + + // Reconstruct Org from JSON object + let json_obj = serde_json::Value::Object(json_map); + match serde_json::from_value::(json_obj) { + Ok(org) => Ok(Some(org)), + // Return None for any deserialization errors (corrupted data) + Err(_) => Ok(None), + } + } + + /// Updates an existing organization with the provided data. + /// + /// Uses `HMSET` to atomically update the provided fields. Fields present in Redis + /// but missing from the input are preserved. + fn update(&self, org: &Org) -> Result<(), String> { + // Delegate to create() which handles both creation and updates + // Redis HMSET naturally supports upsert behavior + self.create(org) + } + + /// Permanently deletes an organization and all associated data from Redis. + /// + /// Removes the organization hash and the associated members list. + /// This operation is irreversible. + fn delete(&self, id: &str) -> Result<(), String> { + // Generate Redis key using organization ID + let redis_key = format!("org:{}", id); + + // Delete the organization hash key from Redis + // Note: This does NOT delete member data stored separately + self.client.delete_key(redis_key) + } + + /// Checks if an organization exists in Redis without retrieving the data. + /// + /// Uses Redis EXISTS command for a lightweight check. + fn exists(&self, id: &str) -> Result { + // Generate Redis key using organization ID + let redis_key = format!("org:{}", id); + + // Check if the key exists in Redis + // This is a lightweight operation that doesn't retrieve data + self.client.key_exists(redis_key) + } + + /// Adds a new member to the organization. + /// + /// Stores member data in a Redis list associated with the organization. + /// Validates that the organization exists before adding the member. + fn add_member(&self, org_id: &str, member_uid: &str) -> Result<(), String> { + // Check if organization exists + if !self.exists(org_id)? { + return Err(format!("Organization {} does not exist", org_id)); + } + + // Generate Redis key for organization member set + let redis_key = format!("org:{}:members", org_id); + + // Add member UID to set using SADD + self.client.set_add(redis_key, member_uid.to_string()) + } + + /// Retrieves all members of the organization. + /// + /// Uses Redis SMEMBERS to get all member UIDs, then retrieves member details. + /// Returns a list of `MemberSummary` objects. + fn get_members(&self, org_id: &str) -> Result, String> { + // Generate Redis key for organization member set + let redis_key = format!("org:{}:members", org_id); + + // Retrieve all member UIDs from the set; fall back to empty on error + let uids: Vec = match self.client.set_members(redis_key) { + Ok(v) => v, + Err(_) => Vec::new(), + }; + + // Pre-allocate result vector + let mut result: Vec = Vec::with_capacity(uids.len()); + + for uid in uids { + if uid.trim().is_empty() { + continue; + } + + // Lookup actor name by UID; fall back to "Unknown" on error/missing + let actor_key = format!("actor:{}", uid); + let raw_name = match self.client.hash_get(actor_key, "name".to_string()) { + Ok(n) => n, + _ => String::new(), + }; + + let name = match parse_redis_value(&raw_name) { + serde_json::Value::String(s) => s, + serde_json::Value::Number(n) => n.to_string(), + serde_json::Value::Bool(b) => b.to_string(), + _ => "Unknown".to_string(), + }; + + let name = if name.trim().is_empty() { + "Unknown".to_string() + } else { + name + }; + + result.push(MemberSummary { uid, name }); + } + + Ok(result) + } + + /// Removes a specific member UID from an organization. + /// + /// Uses Redis SREM to remove the UID from the organization's member set. + fn remove_member(&self, org_id: &str, member_uid: &str) -> Result<(), String> { + // Generate Redis key for organization member set + let redis_key = format!("org:{}:members", org_id); + + // Remove the UID from the set using SREM + self.client.set_del(redis_key, member_uid.to_string()) + } +} diff --git a/lib/services/Cargo.toml b/lib/services/Cargo.toml new file mode 100644 index 0000000..9eb3cb1 --- /dev/null +++ b/lib/services/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "forge-services" +version = "0.1.0" +edition = "2024" + +[dependencies] +forge-models = { path = "../models" } +forge-repositories = { path = "../repositories" } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } diff --git a/lib/services/README.md b/lib/services/README.md new file mode 100644 index 0000000..e0b25cc --- /dev/null +++ b/lib/services/README.md @@ -0,0 +1,174 @@ +# Forge Services + +This crate implements the service layer for the Forge application, containing the core business logic and orchestration. + +## Architecture + +The service layer sits between the API/Extension layer and the Repository layer: + +```mermaid +graph TD + Extension[Extension Layer] + Services[Services Layer
#40;This Module#41;] + Repositories[Repositories Layer] + Database[Database] + + Extension --> Services + Services --> Repositories + Repositories --> Database +``` + +## Responsibilities + +- **Business Logic:** Enforces game rules and constraints. +- **Validation:** Validates input data before processing. +- **Orchestration:** Coordinates operations across multiple repositories. +- **Error Handling:** Converts technical errors into business-friendly messages. +- **Data Transformation:** Handles JSON parsing and model conversion. + +## Actor Service + +The `ActorService` manages player lifecycle and state. + +### Key Features +- **Get-or-Create:** Automatically creates new actors with default values if they don't exist. +- **JSON Integration:** Directly accepts JSON strings for updates and creation. +- **Partial Updates:** Supports updating specific fields without overwriting the entire actor. +- **UID Protection:** Prevents modification of immutable fields like UIDs. + +### Usage Example + +```rust +use forge_services::ActorService; +use forge_repositories::RedisActorRepository; + +// Initialize +let repo = RedisActorRepository::new(client); +let service = ActorService::new(repo); + +// 1. Get Actor (creates default if missing) +let actor = service.get_actor("76561198123456789".to_string())?; + +// 2. Create/Overwrite Actor +let json_data = r#"{"name": "NewPlayer", "bank": 1000.0}"#; +service.create_actor("76561198123456789".to_string(), json_data.to_string())?; + +// 3. Update Actor (Partial) +let update_json = r#"{"bank": 1500.0}"#; +service.update_actor("76561198123456789".to_string(), update_json.to_string())?; + +// 4. Check Existence +if service.actor_exists("76561198123456789".to_string())? { + println!("Actor exists"); +} + +// 5. Delete Actor +// 5. Delete Actor +service.delete_actor("76561198123456789".to_string())?; +``` + +## Organization Service + +The `OrgService` manages organization (guild/clan) lifecycle and member management. + +### Key Features +- **Get-or-Create:** Automatically creates new organizations with default values if they don't exist. +- **Member Management:** Handles adding and removing members with validation. +- **Duplicate Prevention:** Ensures unique organization IDs and member UIDs. +- **Name Validation:** Enforces non-empty organization names. + +### Usage Example + +```rust +use forge_services::OrgService; +use forge_repositories::RedisOrgRepository; + +// Initialize +let repo = RedisOrgRepository::new(client); +let service = OrgService::new(repo); + +// 1. Get Organization (creates default if missing) +let org = service.get_org("elite_squad".to_string())?; + +// 2. Create/Overwrite Organization +let json_data = r#"{"name": "Elite Squad", "description": "Best players", "leader": "76561198123456789"}"#; +service.create_org("elite_squad".to_string(), json_data.to_string())?; + +// 3. Add Member +let member_json = r#"{"uid": "76561198987654321", "rank": "member"}"#; +service.add_member("elite_squad".to_string(), member_json.to_string())?; + +// 4. Update Organization +let update_json = r#"{"description": "New description"}"#; +service.update_org("elite_squad".to_string(), update_json.to_string())?; + +// 5. Check Existence +if service.org_exists("elite_squad".to_string())? { + println!("Organization exists"); +} +``` + +## Error Handling + +The service layer returns `Result` where the error string is a descriptive message suitable for logging or displaying to administrators. It wraps lower-level repository errors with additional context. + +## Contributing + +We welcome contributions to the Forge Service Layer! This guide will help you understand how to add new services and maintain the existing codebase. + +### Adding a New Service + +To add a new service (e.g., `ItemService`), follow these steps: + +1. **Create the Module**: Create a new file in `src/` (e.g., `src/item.rs`). +2. **Define the Struct**: Define your service struct with a generic repository. + ```rust + pub struct ItemService { + repository: R, + } + ``` +3. **Implement `new`**: Provide a constructor that accepts the repository. + ```rust + impl ItemService { + pub fn new(repository: R) -> Self { + Self { repository } + } + } + ``` +4. **Implement Business Logic**: Add methods for your business logic (e.g., `create_item`, `transfer_item`). + ```rust + impl ItemService { + pub fn create_item(&self, item_id: String, data: String) -> Result { + // Validation logic... + if self.repository.exists(&item_id)? { + return Err("Item already exists".to_string()); + } + // ... logic to create item + let item = Item::new(item_id); + self.repository.create(&item)?; + Ok(item) + } + } + ``` +5. **Register the Module**: Add your new module to `src/lib.rs` and export the service struct. + ```rust + pub mod item; + pub use item::ItemService; + ``` + +### Testing + +- **Unit Tests**: Write unit tests for your business logic. +- **Mocking**: Since services use generic repositories, you can easily mock them for testing without a real database. + ```rust + // Example Mock + struct MockRepo; + impl ItemRepository for MockRepo { ... } + ``` + +### Best Practices + +- **Validation**: Always validate data at the service boundary. Do not rely on the API layer or database constraints alone. +- **Error Messages**: Return user-friendly error messages. Avoid exposing internal database errors directly. +- **Immutability**: Respect immutable fields (like UIDs). +- **Documentation**: Document public methods with doc comments (`///`) explaining their purpose, arguments, and return values. diff --git a/lib/services/src/actor.rs b/lib/services/src/actor.rs new file mode 100644 index 0000000..f095821 --- /dev/null +++ b/lib/services/src/actor.rs @@ -0,0 +1,133 @@ +//! Actor service layer providing business logic for actor management operations. +//! +//! Implements the service layer of the actor management system, handling business logic, +//! validation, and orchestration. +//! +//! For full documentation, architecture, and examples, see the [crate README](../README.md). + +use forge_models::Actor; +use forge_repositories::ActorRepository; + +/// Service layer implementation for actor business logic and operations. +/// +/// Orchestrates actor management operations, handling business logic, validation, +/// and data transformation. See [crate README](../README.md) for details. +/// +/// # Thread Safety +/// Thread-safe when used with a thread-safe repository. +pub struct ActorService { + /// The repository instance used for all data persistence operations. + /// + /// This repository handles the actual storage and retrieval of actor data, + /// abstracting away the specific database implementation details. + repository: R, +} + +impl ActorService { + /// Creates a new actor service with the provided repository. + /// + /// The repository must be initialized and ready for use. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new actor with the provided ID and JSON data. + /// + /// Handles validation, duplicate checking, and persistence. + /// See [crate README](../README.md) for JSON format and business rules. + pub fn create_actor(&self, actor_id: String, json_data: String) -> Result { + // Create base actor with the provided UID + let new_actor = Actor::new(actor_id.clone()).map_err(|e| e.to_string())?; + + // Check if actor already exists to prevent duplicates + if self.repository.exists(&actor_id)? { + return Err(format!("Actor with UID '{}' already exists", actor_id)); + } + + // Parse and validate JSON input + let json_obj: serde_json::Value = + serde_json::from_str(&json_data).map_err(|e| format!("Invalid Actor JSON: {}", e))?; + + // Ensure JSON is an object (not array, string, etc.) + if let serde_json::Value::Object(mut map) = json_obj { + // Remove UID field to prevent conflicts (UID is immutable) + map.remove("uid"); + let update_data = serde_json::Value::Object(map); + + // Apply JSON data to the base actor + let mut final_actor = new_actor; + final_actor.update_from_json(update_data)?; + + // Store the actor in the repository + self.repository.create(&final_actor)?; + Ok(final_actor) + } else { + Err("JSON data must be an object".to_string()) + } + } + + /// Retrieves an actor by their unique identifier with automatic fallback creation. + /// + /// Implements a "get-or-create" pattern: if the actor doesn't exist, a new one + /// with default values is returned (but not persisted). + pub fn get_actor(&self, actor_id: String) -> Result { + // Attempt to retrieve actor from repository + match self.repository.get_by_id(&actor_id)? { + // Actor found - return it + Some(actor) => Ok(actor), + // Actor not found - create fallback actor with default values + None => Actor::new(actor_id).map_err(|e| e.to_string()), + } + } + + /// Updates an existing actor with new data from JSON. + /// + /// Handles partial updates, validation, and persistence. + /// See [crate README](../README.md) for JSON format and concurrency details. + pub fn update_actor(&self, actor_id: String, json_update: String) -> Result { + // Retrieve existing actor from repository + let mut actor = match self.repository.get_by_id(&actor_id)? { + Some(actor) => actor, + None => return Err(format!("Actor with UID '{}' not found", actor_id)), + }; + + // Parse and validate JSON update data + let update_data: serde_json::Value = + serde_json::from_str(&json_update).map_err(|e| format!("Invalid JSON: {}", e))?; + + // Ensure update data is a JSON object + if !update_data.is_object() { + return Err("Update data must be a JSON object".to_string()); + } + + // Apply updates to the actor (this validates the changes) + actor.update_from_json(update_data)?; + + // Persist the updated actor to repository + self.repository.update(&actor)?; + + Ok(actor) + } + + /// Permanently deletes an actor from the system. + /// + /// Irreversible operation. Delegates to repository. + pub fn delete_actor(&self, actor_id: String) -> Result<(), String> { + // Delegate deletion to repository layer + // Future enhancements could add business logic here: + // - Authorization checks + // - Audit logging + // - Cascade deletion + // - Soft deletion + self.repository.delete(&actor_id) + } + + /// Checks if an actor exists in the system. + /// + /// Lightweight check without data retrieval. + pub fn actor_exists(&self, actor_id: String) -> Result { + // Delegate existence check to repository layer + // This is a lightweight operation that doesn't retrieve data + self.repository.exists(&actor_id) + } +} diff --git a/lib/services/src/bank.rs b/lib/services/src/bank.rs new file mode 100644 index 0000000..2ad20eb --- /dev/null +++ b/lib/services/src/bank.rs @@ -0,0 +1,123 @@ +//! Bank service layer providing business logic for bank management operations. +//! +//! Implements the service layer of the bank management system, handling business logic, +//! validation, and orchestration. +//! +//! For full documentation, architecture, and examples, see the [crate README](../README.md). + +use forge_models::Bank; +use forge_repositories::BankRepository; + +/// Service layer implementation for bank business logic and operations. +/// +/// Orchestrates bank management operations, handling business logic, validation, +/// and data transformation. See [crate README](../README.md) for details. +/// +/// # Thread Safety +/// Thread-safe when used with a thread-safe repository. +pub struct BankService { + /// The repository instance used for all data persistence operations. + /// + /// This repository handles the actual storage and retrieval of bank data, + /// abstracting away the specific database implementation details. + repository: R, +} + +impl BankService { + /// Creates a new bank service with the provided repository. + /// + /// The repository must be initialized and ready for use. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new bank with the provided ID and JSON data. + /// + /// Handles validation, duplicate checking, and persistence. + /// See [crate README](../README.md) for JSON format and business rules. + pub fn create(&self, uid: String, json_data: String) -> Result { + // Parse JSON data to Bank struct + let mut bank: Bank = + serde_json::from_str(&json_data).map_err(|e| format!("Invalid Bank JSON: {}", e))?; + + bank.uid = uid; + + // Check if bank already exists to prevent duplicates + if self.repository.exists(&bank.uid)? { + return Err(format!("Bank with uid '{}' already exists", bank.uid)); + } + + if let Err(e) = bank.validate() { + return Err(format!("Invalid Bank JSON: {}", e)); + } + + self.repository.create(&bank)?; + + Ok(bank) + } + + /// Retrieves an bank by their unique identifier with automatic fallback creation. + /// + /// Implements a "get-or-create" pattern: if the bank doesn't exist, a new one + /// with default values is returned (but not persisted). + pub fn get_bank(&self, bank_id: String) -> Result { + // Attempt to retrieve bank from repository + match self.repository.get_by_id(&bank_id)? { + // Bank found - return it + Some(bank) => Ok(bank), + // Bank not found - create fallback bank with default values + None => Err(format!("Bank with UID '{}' not found", bank_id)), + } + } + + /// Updates an existing bank with new data from JSON. + /// + /// Handles partial updates, validation, and persistence. + /// See [crate README](../README.md) for JSON format and concurrency details. + pub fn update_bank(&self, bank_id: String, json_update: String) -> Result { + // Retrieve existing bank from repository + let mut bank = match self.repository.get_by_id(&bank_id)? { + Some(bank) => bank, + None => return Err(format!("Bank with UID '{}' not found", bank_id)), + }; + + // Parse and validate JSON update data + let update_data: serde_json::Value = + serde_json::from_str(&json_update).map_err(|e| format!("Invalid JSON: {}", e))?; + + // Ensure update data is a JSON object + if !update_data.is_object() { + return Err("Update data must be a JSON object".to_string()); + } + + // Apply updates to the bank (this validates the changes) + bank.update_from_json(update_data)?; + + // Persist the updated bank to repository + self.repository.update(&bank)?; + + Ok(bank) + } + + /// Permanently deletes an bank from the system. + /// + /// Irreversible operation. Delegates to repository. + pub fn delete_bank(&self, bank_id: String) -> Result<(), String> { + // Delegate deletion to repository layer + // Future enhancements could add business logic here: + // - Authorization checks + // - Audit logging + // - Cascade deletion + // - Soft deletion + self.repository.delete(&bank_id) + } + + /// Checks if an bank exists in the system. + /// + /// Lightweight check without data retrieval. + pub fn bank_exists(&self, bank_id: String) -> Result { + // Delegate existence check to repository layer + // This is a lightweight operation that doesn't retrieve data + self.repository.exists(&bank_id) + } +} diff --git a/lib/services/src/lib.rs b/lib/services/src/lib.rs new file mode 100644 index 0000000..4eca7f5 --- /dev/null +++ b/lib/services/src/lib.rs @@ -0,0 +1,7 @@ +pub mod actor; +pub mod bank; +pub mod org; + +pub use actor::ActorService; +pub use bank::BankService; +pub use org::OrgService; diff --git a/lib/services/src/org.rs b/lib/services/src/org.rs new file mode 100644 index 0000000..6c27658 --- /dev/null +++ b/lib/services/src/org.rs @@ -0,0 +1,171 @@ +//! Organization service layer providing business logic for organization management operations. +//! +//! Implements the service layer of the organization management system, handling business logic, +//! validation, and orchestration. +//! +//! For full documentation, architecture, and examples, see the [crate README](../README.md). + +use forge_models::{MemberSummary, Org}; +use forge_repositories::OrgRepository; + +/// Service layer implementation for organization business logic and operations. +/// +/// Orchestrates organization management operations, handling business logic, validation, +/// and data transformation. See [crate README](../README.md) for details. +/// +/// # Thread Safety +/// Thread-safe when used with a thread-safe repository. +pub struct OrgService { + /// The repository instance used for all data persistence operations. + /// + /// This repository handles the actual storage and retrieval of organization + /// and member data, abstracting away the specific database implementation details. + repository: R, +} + +impl OrgService { + /// Creates a new organization service with the provided repository. + /// + /// The repository must be initialized and ready for use. + pub fn new(repository: R) -> Self { + Self { repository } + } + + /// Creates a new organization with the provided ID and JSON data. + /// + /// Handles validation, duplicate checking, and persistence. + /// See [crate README](../README.md) for JSON format and business rules. + pub fn create_org(&self, key: String, json_data: String) -> Result { + // Parse JSON data to Org struct + let mut org: Org = + serde_json::from_str(&json_data).map_err(|e| format!("Invalid Org JSON: {}", e))?; + + // Override ID with the provided parameter (ensures consistency) + org.id = key; + + // Validate organization name is not empty + if org.name.trim().is_empty() { + return Err("Organization name cannot be empty".to_string()); + } + + // Check if organization already exists to prevent duplicates + if self.repository.exists(&org.id)? { + return Err(format!("Organization with ID '{}' already exists", org.id)); + } + + // Store the organization in the repository + self.repository.create(&org)?; + + Ok(org) + } + + /// Retrieves an organization by its unique identifier with automatic fallback creation. + /// + /// Implements a "get-or-create" pattern: if the organization doesn't exist, a new one + /// with default values is returned (but not persisted). + pub fn get_org(&self, key: String) -> Result { + // Attempt to retrieve organization from repository + match self.repository.get_by_id(&key)? { + // Organization found - return it + Some(org) => Ok(org), + // Organization not found - create fallback organization with default values + None => { + // Create new organization with empty leader and name (requires setup) + Org::new( + key, + "00000000000000000".to_string(), + "Forge Dynamics".to_string(), + ) + .map_err(|e| e.to_string()) + } + } + } + + /// Updates an existing organization with new data from JSON. + /// + /// Handles partial updates, validation, and persistence. + /// See [crate README](../README.md) for JSON format and concurrency details. + pub fn update_org(&self, key: String, json_update: String) -> Result { + // Retrieve existing organization from repository + let mut org = match self.repository.get_by_id(&key)? { + Some(org) => org, + None => return Err(format!("Organization with ID '{}' not found", key)), + }; + + // Parse and validate JSON update data + let update_data: serde_json::Value = + serde_json::from_str(&json_update).map_err(|e| format!("Invalid JSON: {}", e))?; + + // Ensure update data is a JSON object + if !update_data.is_object() { + return Err("Update data must be a JSON object".to_string()); + } + + // Apply updates to the organization (this validates the changes) + org.update_from_json(update_data)?; + + // Validate organization name is not empty after update + if org.name.trim().is_empty() { + return Err("Organization name cannot be empty".to_string()); + } + + // Persist the updated organization to repository + self.repository.update(&org)?; + + Ok(org) + } + + /// Permanently deletes an organization from the system. + /// + /// Irreversible operation. Delegates to repository. + pub fn delete_org(&self, key: String) -> Result<(), String> { + let redis_key = format!("org:{}", key); + let assets_key = format!("org:{}:assets", key); + let members_key = format!("org:{}:members", key); + + // Delegate deletion to repository layer + self.repository.delete(&redis_key)?; + self.repository.delete(&assets_key)?; + self.repository.delete(&members_key)?; + + Ok(()) + } + + /// Checks if an organization exists in the system. + /// + /// Lightweight check without data retrieval. + pub fn org_exists(&self, key: String) -> Result { + // Delegate existence check to repository layer + self.repository.exists(&key) + } + + /// Adds a new member UID to an organization with validation. + pub fn add_member(&self, key: String, member_uid: String) -> Result<(), String> { + // Verify organization exists before adding member + if !self.repository.exists(&key)? { + return Err(format!("Organization with ID '{}' not found", key)); + } + + // Add member UID to organization through repository + self.repository.add_member(&key, &member_uid) + } + + /// Retrieves all members of an organization as a UID to name mapping. + pub fn get_members(&self, key: String) -> Result, String> { + // Delegate member retrieval to repository layer + self.repository.get_members(&key) + } + + /// Permanently removes a specific member from an organization. + /// + /// Irreversible operation. Delegates to repository. + pub fn remove_member(&self, key: String, member_uid: String) -> Result<(), String> { + // Verify organization exists before attempting member removal + if !self.repository.exists(&key)? { + return Err(format!("Organization with ID '{}' not found", key)); + } + + // Delegate member removal to repository layer + self.repository.remove_member(&key, &member_uid) + } +} diff --git a/lib/shared/Cargo.toml b/lib/shared/Cargo.toml new file mode 100644 index 0000000..8de94b7 --- /dev/null +++ b/lib/shared/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "forge-shared" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde_json = { workspace = true } +arma-rs = { workspace = true } diff --git a/lib/shared/src/lib.rs b/lib/shared/src/lib.rs new file mode 100644 index 0000000..7d92c7b --- /dev/null +++ b/lib/shared/src/lib.rs @@ -0,0 +1,25 @@ +pub mod redis_client; +pub mod validation; + +pub use redis_client::{RedisClient, parse_json_value, parse_redis_value}; +pub use validation::{ActorValidationError, BankValidationError, OrgValidationError}; + +/// Converts an arma_rs::Value to a serde_json::Value. +/// +/// This helper function is used to bridge the gap between Arma's SQF data types +/// and standard JSON, which is used for storage and API communication. +pub fn arma_value_to_json(arma_value: &arma_rs::Value) -> serde_json::Value { + match arma_value { + arma_rs::Value::String(s) => serde_json::Value::String(s.clone()), + arma_rs::Value::Number(n) => serde_json::Number::from_f64(*n) + .map(serde_json::Value::Number) + .unwrap_or(serde_json::Value::Null), + arma_rs::Value::Boolean(b) => serde_json::Value::Bool(*b), + arma_rs::Value::Array(arr) => { + let json_array: Vec = arr.iter().map(arma_value_to_json).collect(); + serde_json::Value::Array(json_array) + } + arma_rs::Value::Null => serde_json::Value::Null, + arma_rs::Value::Unknown(s) => serde_json::Value::String(s.clone()), + } +} diff --git a/lib/shared/src/redis_client.rs b/lib/shared/src/redis_client.rs new file mode 100644 index 0000000..3513c5b --- /dev/null +++ b/lib/shared/src/redis_client.rs @@ -0,0 +1,67 @@ +/// Redis client abstraction for dependency injection +pub trait RedisClient: Send + Sync { + // Hash operations + fn hash_mset(&self, key: String, fields: Vec<(String, String)>) -> Result<(), String>; + fn hash_get_all(&self, key: String) -> Result; + fn hash_get(&self, key: String, field: String) -> Result; + fn hash_del(&self, key: String, field: String) -> Result<(), String>; + + // List operations + fn list_rpush(&self, key: String, value: String) -> Result<(), String>; + fn list_range(&self, key: String, start: isize, end: isize) -> Result, String>; + fn list_del(&self, key: String, count: isize, value: String) -> Result<(), String>; + + // Set operations + fn set_add(&self, key: String, member: String) -> Result<(), String>; + fn set_members(&self, key: String) -> Result, String>; + fn set_del(&self, key: String, member: String) -> Result<(), String>; + + // Common operations + fn key_exists(&self, key: String) -> Result; + fn delete_key(&self, key: String) -> Result<(), String>; +} + +/// Converts a JSON value to a Redis-compatible string format. +pub fn parse_json_value(value: &serde_json::Value) -> String { + let wrapped = serde_json::Value::Array(vec![value.clone()]); + wrapped.to_string() +} + +/// Converts a Redis string value back to a JSON value with intelligent type detection. +pub fn parse_redis_value(value: &str) -> serde_json::Value { + // Handle empty values + if value.is_empty() { + return serde_json::Value::Null; + } + + // Try to parse as JSON first + if let Ok(json_val) = serde_json::from_str(value) { + // Special handling for single-element arrays (unwrap them) + if let serde_json::Value::Array(arr) = &json_val { + if arr.len() == 1 { + return arr[0].clone(); + } + } + return json_val; + } + + // Try to parse as integer + if let Ok(int_val) = value.parse::() { + return serde_json::Value::Number(serde_json::Number::from(int_val)); + } + + // Try to parse as float + if let Ok(float_val) = value.parse::() { + if let Some(num) = serde_json::Number::from_f64(float_val) { + return serde_json::Value::Number(num); + } + } + + // Try to parse as boolean (case-insensitive) + match value.to_lowercase().as_str() { + "true" => serde_json::Value::Bool(true), + "false" => serde_json::Value::Bool(false), + // Default to string if no other type matches + _ => serde_json::Value::String(value.to_string()), + } +} diff --git a/lib/shared/src/validation.rs b/lib/shared/src/validation.rs new file mode 100644 index 0000000..2abb143 --- /dev/null +++ b/lib/shared/src/validation.rs @@ -0,0 +1,148 @@ +use std::fmt; + +/// Validation errors for Actor model +#[derive(Debug, Clone)] +pub enum ActorValidationError { + EmptyUid, + InvalidName(String), + InvalidUid(String), + InvalidPosition(String), + InvalidDirection(f64), + InvalidEmail(String), + InvalidPhoneNumber(String), + InvalidState(String), + InvalidRank(String), + InvalidOrganization(String), + LoadoutError(String), + UidModificationAttempt, +} + +impl fmt::Display for ActorValidationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ActorValidationError::EmptyUid => write!(f, "UID cannot be empty"), + ActorValidationError::InvalidName(name) => write!( + f, + "Invalid name '{}' - cannot be empty or longer than 50 characters", + name + ), + ActorValidationError::InvalidUid(uid) => write!( + f, + "Invalid UID format '{}' - must be a 17-digit Steam ID", + uid + ), + ActorValidationError::InvalidPosition(msg) => write!(f, "Invalid position: {}", msg), + ActorValidationError::InvalidDirection(dir) => write!( + f, + "Invalid direction {} - must be between 0 and 360 degrees", + dir + ), + ActorValidationError::InvalidEmail(email) => write!( + f, + "Invalid email format '{}' - must contain @ and end with .mil", + email + ), + ActorValidationError::InvalidPhoneNumber(phone) => write!( + f, + "Invalid phone number '{}' - must start with 0160 and be 10 digits", + phone + ), + ActorValidationError::InvalidState(state) => write!( + f, + "Invalid state '{}' - must be HEALTHY, INJURED, INCAPACITATED, or DEAD", + state + ), + ActorValidationError::InvalidRank(rank) => write!( + f, + "Invalid rank '{}' - cannot be empty or longer than 50 characters", + rank + ), + ActorValidationError::InvalidOrganization(org) => write!( + f, + "Invalid organization '{}' - cannot be empty or longer than 100 characters", + org + ), + ActorValidationError::LoadoutError(msg) => write!(f, "Loadout error: {}", msg), + ActorValidationError::UidModificationAttempt => write!( + f, + "UID cannot be modified - it's the player's permanent Steam ID" + ), + } + } +} + +impl std::error::Error for ActorValidationError {} + +/// Validation errors for Organization model +#[derive(Debug, Clone)] +pub enum OrgValidationError { + EmptyId, + EmptyOwner, + EmptyName, + NegativeFunds, + InvalidId(String), + InvalidOwner(String), + InvalidName(String), +} + +impl fmt::Display for OrgValidationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + OrgValidationError::EmptyId => write!(f, "Organization ID cannot be empty"), + OrgValidationError::EmptyOwner => write!(f, "Organization owner cannot be empty"), + OrgValidationError::EmptyName => write!(f, "Organization name cannot be empty"), + OrgValidationError::NegativeFunds => { + write!(f, "Organization funds cannot be negative") + } + OrgValidationError::InvalidId(id) => write!( + f, + "Invalid organization ID '{}' - must contain only alphanumeric characters and underscores", + id + ), + OrgValidationError::InvalidOwner(owner) => { + write!(f, "Invalid owner '{}' - must be a 17-digit Steam ID", owner) + } + OrgValidationError::InvalidName(name) => write!( + f, + "Invalid organization name '{}' - cannot exceed 100 characters or contain control characters", + name + ), + } + } +} + +impl std::error::Error for OrgValidationError {} + +/// Validation errors for Bank model +#[derive(Debug, Clone)] +pub enum BankValidationError { + UidEmpty, + NameEmpty, + BankNegative, + CashNegative, + InvalidEmail(String), + InvalidPhoneNumber(String), +} + +impl fmt::Display for BankValidationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + BankValidationError::UidEmpty => write!(f, "UID cannot be empty"), + BankValidationError::NameEmpty => write!(f, "Name cannot be empty"), + BankValidationError::BankNegative => write!(f, "Bank balance cannot be negative"), + BankValidationError::CashNegative => write!(f, "Cash cannot be negative"), + BankValidationError::InvalidEmail(email) => write!( + f, + "Invalid email format '{}' - must contain @ and end with .mil", + email + ), + BankValidationError::InvalidPhoneNumber(phone) => write!( + f, + "Invalid phone number '{}' - must start with 0160 and be 10 digits", + phone + ), + } + } +} + +impl std::error::Error for BankValidationError {}

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%0Ab+OdSRE~;qhNYQ** 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%0Ab+OdSRE~;qhNYQ** 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