From 6be064fb1569350028f347c5938d14f268285260 Mon Sep 17 00:00:00 2001 From: Jacob Schmidt Date: Tue, 21 Apr 2026 16:44:21 -0500 Subject: [PATCH] fix: update source file name for surrealdb setup documentation and add new build metadata --- arma/server/docs/README.md | 2 +- docs/DEVELOPMENT_GUIDE.md | 2 +- docs/FRAMEWORK_ARCHITECTURE.md | 2 +- docs/README.md | 2 +- docus/dist/200.html | 2 +- docus/dist/404.html | 2 +- docus/dist/_nuxt/builds/latest.json | 2 +- .../builds/meta/3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a.json | 1 + .../builds/meta/cd17b1fd-ee30-4fca-a256-bc98b65244b8.json | 1 - docus/dist/_payload.json | 2 +- docus/dist/client-addons.html | 4 ++-- docus/dist/client-addons/_payload.json | 2 +- docus/dist/client-addons/actor.html | 4 ++-- docus/dist/client-addons/actor/_payload.json | 2 +- docus/dist/client-addons/bank.html | 4 ++-- docus/dist/client-addons/bank/_payload.json | 2 +- docus/dist/client-addons/cad.html | 4 ++-- docus/dist/client-addons/cad/_payload.json | 2 +- docus/dist/client-addons/common.html | 4 ++-- docus/dist/client-addons/common/_payload.json | 2 +- docus/dist/client-addons/garage.html | 4 ++-- docus/dist/client-addons/garage/_payload.json | 2 +- docus/dist/client-addons/locker.html | 4 ++-- docus/dist/client-addons/locker/_payload.json | 2 +- docus/dist/client-addons/main.html | 4 ++-- docus/dist/client-addons/main/_payload.json | 2 +- docus/dist/client-addons/notifications.html | 4 ++-- docus/dist/client-addons/notifications/_payload.json | 2 +- docus/dist/client-addons/organization.html | 4 ++-- docus/dist/client-addons/organization/_payload.json | 2 +- docus/dist/client-addons/phone.html | 4 ++-- docus/dist/client-addons/phone/_payload.json | 2 +- docus/dist/client-addons/store.html | 4 ++-- docus/dist/client-addons/store/_payload.json | 2 +- docus/dist/getting-started.html | 4 ++-- docus/dist/getting-started/_payload.json | 2 +- docus/dist/getting-started/architecture.html | 4 ++-- docus/dist/getting-started/architecture/_payload.json | 2 +- docus/dist/getting-started/development.html | 4 ++-- docus/dist/getting-started/development/_payload.json | 2 +- docus/dist/getting-started/module-reference.html | 4 ++-- docus/dist/getting-started/module-reference/_payload.json | 2 +- docus/dist/getting-started/surrealdb-setup.html | 4 ++-- docus/dist/getting-started/surrealdb-setup/_payload.json | 2 +- docus/dist/index.html | 4 ++-- docus/dist/server-extension.html | 4 ++-- docus/dist/server-extension/_payload.json | 2 +- docus/dist/server-extension/api-reference.html | 4 ++-- docus/dist/server-extension/api-reference/_payload.json | 2 +- docus/dist/server-extension/usage-examples.html | 4 ++-- docus/dist/server-extension/usage-examples/_payload.json | 2 +- docus/dist/server-modules.html | 4 ++-- docus/dist/server-modules/_payload.json | 2 +- docus/dist/server-modules/actor.html | 4 ++-- docus/dist/server-modules/actor/_payload.json | 2 +- docus/dist/server-modules/bank.html | 4 ++-- docus/dist/server-modules/bank/_payload.json | 2 +- docus/dist/server-modules/cad.html | 4 ++-- docus/dist/server-modules/cad/_payload.json | 2 +- docus/dist/server-modules/economy.html | 4 ++-- docus/dist/server-modules/economy/_payload.json | 2 +- docus/dist/server-modules/garage.html | 4 ++-- docus/dist/server-modules/garage/_payload.json | 2 +- docus/dist/server-modules/locker.html | 4 ++-- docus/dist/server-modules/locker/_payload.json | 2 +- docus/dist/server-modules/organization.html | 4 ++-- docus/dist/server-modules/organization/_payload.json | 2 +- docus/dist/server-modules/owned-storage.html | 4 ++-- docus/dist/server-modules/owned-storage/_payload.json | 2 +- docus/dist/server-modules/phone.html | 4 ++-- docus/dist/server-modules/phone/_payload.json | 2 +- docus/dist/server-modules/store.html | 4 ++-- docus/dist/server-modules/store/_payload.json | 2 +- docus/dist/server-modules/task.html | 4 ++-- docus/dist/server-modules/task/_payload.json | 2 +- tools/sync-docus-docs.mjs | 2 +- 76 files changed, 108 insertions(+), 108 deletions(-) create mode 100644 docus/dist/_nuxt/builds/meta/3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a.json delete mode 100644 docus/dist/_nuxt/builds/meta/cd17b1fd-ee30-4fca-a256-bc98b65244b8.json diff --git a/arma/server/docs/README.md b/arma/server/docs/README.md index 1dea0e0..761e9bc 100644 --- a/arma/server/docs/README.md +++ b/arma/server/docs/README.md @@ -34,7 +34,7 @@ connect_timeout_ms = 5000 ``` For install links and Forge-specific setup steps, see -[SurrealDB Setup](../../../docs/SURREALDB_SETUP.md). +[SurrealDB Setup](../../../docs/surrealdb-setup.md). ## References diff --git a/docs/DEVELOPMENT_GUIDE.md b/docs/DEVELOPMENT_GUIDE.md index 3eb3558..e8b4588 100644 --- a/docs/DEVELOPMENT_GUIDE.md +++ b/docs/DEVELOPMENT_GUIDE.md @@ -5,7 +5,7 @@ This guide covers the usual path for adding or changing a Forge module. ## Local Checks Before running storage-backed workflows locally, complete -[SurrealDB Setup](./SURREALDB_SETUP.md). +[SurrealDB Setup](./surrealdb-setup.md). Run these before pushing Rust or extension changes: diff --git a/docs/FRAMEWORK_ARCHITECTURE.md b/docs/FRAMEWORK_ARCHITECTURE.md index e8f6d4e..df7f4b9 100644 --- a/docs/FRAMEWORK_ARCHITECTURE.md +++ b/docs/FRAMEWORK_ARCHITECTURE.md @@ -126,7 +126,7 @@ connect_timeout_ms = 5000 ``` For install links and role-based setup guidance, see -[SurrealDB Setup](./SURREALDB_SETUP.md). +[SurrealDB Setup](./surrealdb-setup.md). Check persistence readiness before issuing commands that require storage: diff --git a/docs/README.md b/docs/README.md index e9be487..84419e8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,7 +13,7 @@ collects framework-level documentation for those pieces. crates. - [Development Guide](./DEVELOPMENT_GUIDE.md): how to add or change a module without breaking the framework boundaries. -- [SurrealDB Setup](./SURREALDB_SETUP.md): where to get SurrealDB or +- [SurrealDB Setup](./surrealdb-setup.md): where to get SurrealDB or Surrealist and how to connect Forge to it for local or live use. ## Server and Extension Usage Guides diff --git a/docus/dist/200.html b/docus/dist/200.html index ea9bf06..bae9fea 100644 --- a/docus/dist/200.html +++ b/docus/dist/200.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/docus/dist/404.html b/docus/dist/404.html index bdd007e..7ba1d99 100644 --- a/docus/dist/404.html +++ b/docus/dist/404.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/docus/dist/_nuxt/builds/latest.json b/docus/dist/_nuxt/builds/latest.json index b806849..043ab25 100644 --- a/docus/dist/_nuxt/builds/latest.json +++ b/docus/dist/_nuxt/builds/latest.json @@ -1 +1 @@ -{"id":"cd17b1fd-ee30-4fca-a256-bc98b65244b8","timestamp":1776805477911} \ No newline at end of file +{"id":"3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a","timestamp":1776806590495} \ No newline at end of file diff --git a/docus/dist/_nuxt/builds/meta/3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a.json b/docus/dist/_nuxt/builds/meta/3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a.json new file mode 100644 index 0000000..6705147 --- /dev/null +++ b/docus/dist/_nuxt/builds/meta/3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a.json @@ -0,0 +1 @@ +{"id":"3a1bf7b7-6f51-4d2c-9c98-142f71e69a9a","timestamp":1776806590495,"prerendered":["/","/server-extension","/getting-started","/client-addons","/server-modules","/getting-started/surrealdb-setup","/server-extension/api-reference","/getting-started/development","/server-extension/usage-examples","/getting-started/architecture","/server-modules/task","/getting-started/module-reference","/server-modules/actor","/server-modules/store","/server-modules/bank","/client-addons/main","/server-modules/cad","/client-addons/phone","/client-addons/store","/client-addons/common","/server-modules/garage","/client-addons/actor","/server-modules/organization","/server-modules/locker","/server-modules/economy","/client-addons/cad","/client-addons/bank","/server-modules/owned-storage","/server-modules/phone","/client-addons/organization","/client-addons/garage","/client-addons/locker","/client-addons/notifications"]} \ No newline at end of file diff --git a/docus/dist/_nuxt/builds/meta/cd17b1fd-ee30-4fca-a256-bc98b65244b8.json b/docus/dist/_nuxt/builds/meta/cd17b1fd-ee30-4fca-a256-bc98b65244b8.json deleted file mode 100644 index 7c41405..0000000 --- a/docus/dist/_nuxt/builds/meta/cd17b1fd-ee30-4fca-a256-bc98b65244b8.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"cd17b1fd-ee30-4fca-a256-bc98b65244b8","timestamp":1776805477911,"prerendered":["/","/server-extension","/getting-started","/server-modules","/client-addons","/getting-started/surrealdb-setup","/getting-started/module-reference","/getting-started/architecture","/server-modules/actor","/server-extension/api-reference","/getting-started/development","/server-extension/usage-examples","/server-modules/store","/server-modules/bank","/server-modules/cad","/server-modules/task","/server-modules/economy","/server-modules/locker","/client-addons/phone","/server-modules/organization","/server-modules/garage","/server-modules/phone","/client-addons/main","/server-modules/owned-storage","/client-addons/bank","/client-addons/store","/client-addons/notifications","/client-addons/common","/client-addons/actor","/client-addons/garage","/client-addons/cad","/client-addons/locker","/client-addons/organization"]} \ No newline at end of file diff --git a/docus/dist/_payload.json b/docus/dist/_payload.json index bd2f3a4..988f672 100644 --- a/docus/dist/_payload.json +++ b/docus/dist/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":342},["ShallowReactive",2],{"navigation_docs":3,"landing":145},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":147,"body":148,"description":147,"extension":334,"meta":335,"navigation":336,"path":337,"seo":338,"stem":340,"__hash__":341},"landing\u002Findex.md","",{"type":149,"value":150,"toc":331},"minimark",[151,188,280],[152,153,154,158,172],"u-page-hero",{},[155,156,157],"template",{"v-slot:title":147},"Forge Framework Documentation",[155,159,160,169],{"v-slot:description":147},[161,162,163,164,168],"p",{},"Forge is a persistent Arma 3 framework that combines SQF addons, a Rust\n",[165,166,167],"code",{},"arma-rs"," extension, SurrealDB persistence, shared domain crates, and\nbrowser-backed player interfaces.",[161,170,171],{},"Use these docs to understand the runtime architecture, extension API surface,\nserver gameplay modules, and client addon integration patterns.",[155,173,174,181],{"v-slot:links":147},[175,176,180],"u-button",{"color":177,"size":178,"to":6,"trailing-icon":179},"primary","xl","i-lucide-arrow-right","Start here",[175,182,187],{"color":183,"size":178,"to":184,"icon":185,"variant":186},"neutral","https:\u002F\u002Fgithub.com\u002FInnovativeDevSolutions\u002Fforge","simple-icons-github","outline","View source",[189,190,191,194],"u-page-section",{},[155,192,193],{"v-slot:title":147},"What Forge Covers",[155,195,196,212,225,238,250,267],{"v-slot:features":147},[197,198,200,209],"u-page-feature",{"icon":199},"i-lucide-boxes",[155,201,202,203],{"v-slot:title":147},"Domain ",[204,205,208],"span",{"className":206},[207],"text-primary","Modules",[155,210,211],{"v-slot:description":147},"Actor, bank, CAD, garage, locker, organization, phone, store, task, and\nowned-storage workflows share a consistent service and extension model.",[197,213,215,222],{"icon":214},"i-lucide-server",[155,216,217,218],{"v-slot:title":147},"Rust ",[204,219,221],{"className":220},[207],"Extension",[155,223,224],{"v-slot:description":147},"The server extension keeps command parsing thin, routes domain requests into\nservices, and persists durable state through SurrealDB.",[197,226,228,235],{"icon":227},"i-lucide-database-zap",[155,229,230,231],{"v-slot:title":147},"Durable ",[204,232,234],{"className":233},[207],"Persistence",[155,236,237],{"v-slot:description":147},"Repository traits stay storage-agnostic while concrete adapters in the\nextension handle schema and database mapping.",[197,239,240,247],{"icon":144},[155,241,242,243],{"v-slot:title":147},"Browser ",[204,244,246],{"className":245},[207],"UIs",[155,248,249],{"v-slot:description":147},"Client addons host web-based interfaces inside Arma displays and synchronize\nstate through namespaced browser bridge events.",[197,251,253,260],{"icon":252},"i-lucide-arrow-left-right",[155,254,255,256],{"v-slot:title":147},"Transport ",[204,257,259],{"className":258},[207],"Layer",[155,261,262,263,266],{"v-slot:description":147},"Large payloads move through chunked request and response transport while\nsmaller commands still use direct ",[165,264,265],{},"callExtension"," paths.",[197,268,270,277],{"icon":269},"i-lucide-wrench",[155,271,272,273],{"v-slot:title":147},"Development ",[204,274,276],{"className":275},[207],"Workflow",[155,278,279],{"v-slot:description":147},"The docs cover module boundaries, local validation checks, and where new\ndomain logic belongs across Rust, SQF, and web UI layers.",[189,281,282,285],{},[155,283,284],{"v-slot:title":147},"Documentation Areas",[155,286,287,297,309,319],{"v-slot:features":147},[197,288,289,294],{"icon":26,"to":6},[155,290,291],{"v-slot:title":147},[204,292,5],{"className":293},[207],[155,295,296],{"v-slot:description":147},"Framework overview, architecture, module reference, and development rules.",[197,298,300,306],{"icon":299,"to":29},"i-lucide-server-cog",[155,301,302,303],{"v-slot:title":147},"Server ",[204,304,221],{"className":305},[207],[155,307,308],{"v-slot:description":147},"Extension architecture, command surface, and SQF usage examples.",[197,310,311,316],{"icon":92,"to":43},[155,312,302,313],{"v-slot:title":147},[204,314,208],{"className":315},[207],[155,317,318],{"v-slot:description":147},"Gameplay-domain usage guides for persistence, hot state, and command flows.",[197,320,321,328],{"icon":144,"to":95},[155,322,323,324],{"v-slot:title":147},"Client ",[204,325,327],{"className":326},[207],"Addons",[155,329,330],{"v-slot:description":147},"Browser bridge, client UX entry points, and addon-specific event contracts.",{"title":147,"searchDepth":332,"depth":332,"links":333},2,[],"md",{},true,"\u002F",{"title":157,"description":339},"Documentation for the Forge Arma 3 framework, covering architecture, persistence, extension APIs, gameplay modules, and client UIs.","index","z56nrU81noeKPhRmw6SAhUXnhI6zxbOa-u-8PzIaH0c",1776805512094] \ No newline at end of file +[{"data":1,"prerenderedAt":342},["ShallowReactive",2],{"navigation_docs":3,"landing":145},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":147,"body":148,"description":147,"extension":334,"meta":335,"navigation":336,"path":337,"seo":338,"stem":340,"__hash__":341},"landing\u002Findex.md","",{"type":149,"value":150,"toc":331},"minimark",[151,188,280],[152,153,154,158,172],"u-page-hero",{},[155,156,157],"template",{"v-slot:title":147},"Forge Framework Documentation",[155,159,160,169],{"v-slot:description":147},[161,162,163,164,168],"p",{},"Forge is a persistent Arma 3 framework that combines SQF addons, a Rust\n",[165,166,167],"code",{},"arma-rs"," extension, SurrealDB persistence, shared domain crates, and\nbrowser-backed player interfaces.",[161,170,171],{},"Use these docs to understand the runtime architecture, extension API surface,\nserver gameplay modules, and client addon integration patterns.",[155,173,174,181],{"v-slot:links":147},[175,176,180],"u-button",{"color":177,"size":178,"to":6,"trailing-icon":179},"primary","xl","i-lucide-arrow-right","Start here",[175,182,187],{"color":183,"size":178,"to":184,"icon":185,"variant":186},"neutral","https:\u002F\u002Fgithub.com\u002FInnovativeDevSolutions\u002Fforge","simple-icons-github","outline","View source",[189,190,191,194],"u-page-section",{},[155,192,193],{"v-slot:title":147},"What Forge Covers",[155,195,196,212,225,238,250,267],{"v-slot:features":147},[197,198,200,209],"u-page-feature",{"icon":199},"i-lucide-boxes",[155,201,202,203],{"v-slot:title":147},"Domain ",[204,205,208],"span",{"className":206},[207],"text-primary","Modules",[155,210,211],{"v-slot:description":147},"Actor, bank, CAD, garage, locker, organization, phone, store, task, and\nowned-storage workflows share a consistent service and extension model.",[197,213,215,222],{"icon":214},"i-lucide-server",[155,216,217,218],{"v-slot:title":147},"Rust ",[204,219,221],{"className":220},[207],"Extension",[155,223,224],{"v-slot:description":147},"The server extension keeps command parsing thin, routes domain requests into\nservices, and persists durable state through SurrealDB.",[197,226,228,235],{"icon":227},"i-lucide-database-zap",[155,229,230,231],{"v-slot:title":147},"Durable ",[204,232,234],{"className":233},[207],"Persistence",[155,236,237],{"v-slot:description":147},"Repository traits stay storage-agnostic while concrete adapters in the\nextension handle schema and database mapping.",[197,239,240,247],{"icon":144},[155,241,242,243],{"v-slot:title":147},"Browser ",[204,244,246],{"className":245},[207],"UIs",[155,248,249],{"v-slot:description":147},"Client addons host web-based interfaces inside Arma displays and synchronize\nstate through namespaced browser bridge events.",[197,251,253,260],{"icon":252},"i-lucide-arrow-left-right",[155,254,255,256],{"v-slot:title":147},"Transport ",[204,257,259],{"className":258},[207],"Layer",[155,261,262,263,266],{"v-slot:description":147},"Large payloads move through chunked request and response transport while\nsmaller commands still use direct ",[165,264,265],{},"callExtension"," paths.",[197,268,270,277],{"icon":269},"i-lucide-wrench",[155,271,272,273],{"v-slot:title":147},"Development ",[204,274,276],{"className":275},[207],"Workflow",[155,278,279],{"v-slot:description":147},"The docs cover module boundaries, local validation checks, and where new\ndomain logic belongs across Rust, SQF, and web UI layers.",[189,281,282,285],{},[155,283,284],{"v-slot:title":147},"Documentation Areas",[155,286,287,297,309,319],{"v-slot:features":147},[197,288,289,294],{"icon":26,"to":6},[155,290,291],{"v-slot:title":147},[204,292,5],{"className":293},[207],[155,295,296],{"v-slot:description":147},"Framework overview, architecture, module reference, and development rules.",[197,298,300,306],{"icon":299,"to":29},"i-lucide-server-cog",[155,301,302,303],{"v-slot:title":147},"Server ",[204,304,221],{"className":305},[207],[155,307,308],{"v-slot:description":147},"Extension architecture, command surface, and SQF usage examples.",[197,310,311,316],{"icon":92,"to":43},[155,312,302,313],{"v-slot:title":147},[204,314,208],{"className":315},[207],[155,317,318],{"v-slot:description":147},"Gameplay-domain usage guides for persistence, hot state, and command flows.",[197,320,321,328],{"icon":144,"to":95},[155,322,323,324],{"v-slot:title":147},"Client ",[204,325,327],{"className":326},[207],"Addons",[155,329,330],{"v-slot:description":147},"Browser bridge, client UX entry points, and addon-specific event contracts.",{"title":147,"searchDepth":332,"depth":332,"links":333},2,[],"md",{},true,"\u002F",{"title":157,"description":339},"Documentation for the Forge Arma 3 framework, covering architecture, persistence, extension APIs, gameplay modules, and client UIs.","index","z56nrU81noeKPhRmw6SAhUXnhI6zxbOa-u-8PzIaH0c",1776806625126] \ No newline at end of file diff --git a/docus/dist/client-addons.html b/docus/dist/client-addons.html index 2a75cc8..98a9705 100644 --- a/docus/dist/client-addons.html +++ b/docus/dist/client-addons.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Usage Guide - forge-docusQueue or ignore bridge responses when the display is closed.
  • Keep mission object setup on the mission/server side and client display logic on the client side.
  • Phone Usage Guide

    The phone module stores contacts, messages, and emails for each UID. It is a server-extension state module backed by SurrealDB.

    Client Main Usage Guide

    The client main addon provides the shared mod identity, version metadata, -CBA settings, and macro foundation used by the Forge client addons.

    \ No newline at end of file +CBA settings, and macro foundation used by the Forge client addons.

    \ No newline at end of file diff --git a/docus/dist/client-addons/_payload.json b/docus/dist/client-addons/_payload.json index d63210b..2b30bad 100644 --- a/docus/dist/client-addons/_payload.json +++ b/docus/dist/client-addons/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":629},["ShallowReactive",2],{"navigation_docs":3,"-client-addons":145,"-client-addons-surround":624},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":99,"body":147,"description":157,"extension":618,"links":619,"meta":620,"navigation":621,"path":95,"seo":622,"stem":96,"__hash__":623},"docs\u002F4.client-addons\u002F0.index.md",{"type":148,"value":149,"toc":608},"minimark",[150,154,158,161,166,208,212,215,218,233,237,240,285,288,353,357,467,470,474,521,525,531,534,545,548,552,558,567,570,574,604],[151,152,99],"h1",{"id":153},"client-usage-guide",[155,156,157],"p",{},"Forge Client contains the Arma client-side addons that open player interfaces,\nhandle browser events, cache client-visible state, and forward authoritative\nrequests to the server addons.",[155,159,160],{},"Use this guide as the entry point for client-side integration. Domain data,\nvalidation, persistence, rewards, ownership, and checkout behavior remain\nserver-side responsibilities.",[162,163,165],"h2",{"id":164},"client-responsibilities","Client Responsibilities",[167,168,169,178,185,192,195,198,205],"ul",{},[170,171,172,173,177],"li",{},"Open Arma displays and ",[174,175,176],"code",{},"CT_WEBBROWSER"," controls.",[170,179,180,181,184],{},"Load browser UI assets from each addon's ",[174,182,183],{},"ui\u002F_site"," folder.",[170,186,187,188,191],{},"Receive browser alerts through ",[174,189,190],{},"JSDialog"," handlers.",[170,193,194],{},"Translate browser events into local actions or CBA server events.",[170,196,197],{},"Cache display state in client repositories.",[170,199,200,201,204],{},"Push server responses back into browser UIs with ",[174,202,203],{},"ExecJS",".",[170,206,207],{},"Provide local-only utility state where the feature is intentionally local.",[162,209,211],{"id":210},"authoritative-boundaries","Authoritative Boundaries",[155,213,214],{},"Client repositories are view state. They are useful for rendering, local UI\ndecisions, and short-lived session behavior, but they should not be treated as\ndurable state.",[155,216,217],{},"Authoritative state lives in:",[167,219,220,223,230],{},[170,221,222],{},"server SQF addons for mission and player workflow ownership",[170,224,225,226,229],{},"the ",[174,227,228],{},"forge_server"," extension for durable and hot-state domain logic",[170,231,232],{},"SurrealDB where the extension persists durable domain records",[162,234,236],{"id":235},"common-runtime-flow","Common Runtime Flow",[155,238,239],{},"Most browser-backed client addons follow this shape:",[241,242,243,249,254,265,271,274,280],"ol",{},[170,244,245,246,248],{},"The addon creates a display, finds a browser control, and registers a\n",[174,247,190],{}," event handler.",[170,250,251,252,204],{},"The browser loads an HTML entrypoint from ",[174,253,183],{},[170,255,256,257,260,261,264],{},"The browser sends JSON alerts with an ",[174,258,259],{},"event"," name and ",[174,262,263],{},"data"," payload.",[170,266,267,270],{},[174,268,269],{},"fnc_handleUIEvents.sqf"," parses the alert and routes the event.",[170,272,273],{},"A bridge object or repository sends a CBA server event when server data is\nneeded.",[170,275,276,277,204],{},"Server responses are caught in ",[174,278,279],{},"XEH_postInitClient.sqf",[170,281,282,283,204],{},"The bridge sends browser update events back through ",[174,284,203],{},[155,286,287],{},"Browser alert payload:",[289,290,295],"pre",{"className":291,"code":292,"language":293,"meta":294,"style":294},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"event\": \"module::action\",\n \"data\": {}\n}\n","json","",[174,296,297,306,333,347],{"__ignoreMap":294},[298,299,302],"span",{"class":300,"line":301},"line",1,[298,303,305],{"class":304},"sMK4o","{\n",[298,307,309,312,315,318,321,324,328,330],{"class":300,"line":308},2,[298,310,311],{"class":304}," \"",[298,313,259],{"class":314},"spNyl",[298,316,317],{"class":304},"\"",[298,319,320],{"class":304},":",[298,322,323],{"class":304}," \"",[298,325,327],{"class":326},"sfazB","module::action",[298,329,317],{"class":304},[298,331,332],{"class":304},",\n",[298,334,336,338,340,342,344],{"class":300,"line":335},3,[298,337,311],{"class":304},[298,339,263],{"class":314},[298,341,317],{"class":304},[298,343,320],{"class":304},[298,345,346],{"class":304}," {}\n",[298,348,350],{"class":300,"line":349},4,[298,351,352],{"class":304},"}\n",[162,354,356],{"id":355},"open-ui-entry-points","Open UI Entry Points",[358,359,360,373],"table",{},[361,362,363],"thead",{},[364,365,366,370],"tr",{},[367,368,369],"th",{},"UI",[367,371,372],{},"Entry point",[374,375,376,387,397,407,417,427,437,447,457],"tbody",{},[364,377,378,382],{},[379,380,381],"td",{},"Actor menu",[379,383,384],{},[174,385,386],{},"call forge_client_actor_fnc_openUI;",[364,388,389,392],{},[379,390,391],{},"Bank",[379,393,394],{},[174,395,396],{},"call forge_client_bank_fnc_openUI;",[364,398,399,402],{},[379,400,401],{},"ATM",[379,403,404],{},[174,405,406],{},"[true] call forge_client_bank_fnc_openUI;",[364,408,409,412],{},[379,410,411],{},"CAD",[379,413,414],{},[174,415,416],{},"call forge_client_cad_fnc_openUI;",[364,418,419,422],{},[379,420,421],{},"Garage",[379,423,424],{},[174,425,426],{},"call forge_client_garage_fnc_openUI;",[364,428,429,432],{},[379,430,431],{},"Virtual garage",[379,433,434],{},[174,435,436],{},"call forge_client_garage_fnc_openVG;",[364,438,439,442],{},[379,440,441],{},"Organization portal",[379,443,444],{},[174,445,446],{},"call forge_client_org_fnc_openUI;",[364,448,449,452],{},[379,450,451],{},"Phone",[379,453,454],{},[174,455,456],{},"call forge_client_phone_fnc_openUI;",[364,458,459,462],{},[379,460,461],{},"Store",[379,463,464],{},[174,465,466],{},"call forge_client_store_fnc_openUI;",[155,468,469],{},"Notifications are normally opened during client initialization and then updated\nthrough the notification event\u002Fservice.",[162,471,473],{"id":472},"addon-guides","Addon Guides",[167,475,476,481,485,489,493,497,501,505,509,513,517],{},[170,477,478],{},[479,480,101],"a",{"href":102},[170,482,483],{},[479,484,113],{"href":114},[170,486,487],{},[479,488,117],{"href":118},[170,490,491],{},[479,492,121],{"href":122},[170,494,495],{},[479,496,125],{"href":126},[170,498,499],{},[479,500,129],{"href":130},[170,502,503],{},[479,504,133],{"href":134},[170,506,507],{},[479,508,137],{"href":138},[170,510,511],{},[479,512,141],{"href":142},[170,514,515],{},[479,516,105],{"href":106},[170,518,519],{},[479,520,109],{"href":110},[162,522,524],{"id":523},"extension-calls","Extension Calls",[155,526,527,528,530],{},"Client addons should usually call server SQF events, not the ",[174,529,228],{},"\nextension directly. The server addon owns validation context and converts the\nrequest into extension commands.",[155,532,533],{},"Example:",[289,535,539],{"className":536,"code":537,"language":538,"meta":294,"style":294},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[SRPC(bank,requestDeposit), [getPlayerUID player, 100]] call CFUNC(serverEvent);\n","sqf",[174,540,541],{"__ignoreMap":294},[298,542,543],{"class":300,"line":301},[298,544,537],{},[155,546,547],{},"Direct extension calls from client code bypass server authorization boundaries\nand should be avoided.",[162,549,551],{"id":550},"browser-bridge-notes","Browser Bridge Notes",[155,553,554,557],{},[174,555,556],{},"forge_client_common_fnc_initWebUIBridge"," provides reusable bridge and screen\nobjects for newer browser UIs. It queues outbound events until a browser screen\nis ready, then delivers payloads through:",[289,559,561],{"className":536,"code":560,"language":538,"meta":294,"style":294},"_control ctrlWebBrowserAction [\"ExecJS\", format [\"ForgeBridge.receive(%1)\", _json]];\n",[174,562,563],{"__ignoreMap":294},[298,564,565],{"class":300,"line":301},[298,566,560],{},[155,568,569],{},"Feature addons still own their event names, request payloads, and response\nmapping.",[162,571,573],{"id":572},"development-checklist","Development Checklist",[167,575,576,579,582,588,595,598,601],{},[170,577,578],{},"Keep feature-specific behavior in the owning addon.",[170,580,581],{},"Send authoritative changes to the server addon.",[170,583,584,585,204],{},"Use namespaced browser events such as ",[174,586,587],{},"bank::deposit::request",[170,589,590,591,594],{},"Treat ",[174,592,593],{},"profileNamespace"," as local player preference or utility state only.",[170,596,597],{},"Make browser-ready events request the current server state before rendering\nstale data.",[170,599,600],{},"Queue or ignore bridge responses when the display is closed.",[170,602,603],{},"Keep mission object setup on the mission\u002Fserver side and client display logic\non the client side.",[605,606,607],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":294,"searchDepth":308,"depth":308,"links":609},[610,611,612,613,614,615,616,617],{"id":164,"depth":308,"text":165},{"id":210,"depth":308,"text":211},{"id":235,"depth":308,"text":236},{"id":355,"depth":308,"text":356},{"id":472,"depth":308,"text":473},{"id":523,"depth":308,"text":524},{"id":550,"depth":308,"text":551},{"id":572,"depth":308,"text":573},"md",null,{},true,{"title":99,"description":157},"JTkXjG_St8xEkLNECfj9fYzon1OZmDe7brlAXBnT7d8",[625,627],{"title":89,"path":90,"stem":91,"description":626,"children":-1},"The phone module stores contacts, messages, and emails for each UID. It is a\nserver-extension state module backed by SurrealDB.",{"title":101,"path":102,"stem":103,"description":628,"children":-1},"The client main addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.",1776805514039] \ No newline at end of file +[{"data":1,"prerenderedAt":629},["ShallowReactive",2],{"navigation_docs":3,"-client-addons":145,"-client-addons-surround":624},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":99,"body":147,"description":157,"extension":618,"links":619,"meta":620,"navigation":621,"path":95,"seo":622,"stem":96,"__hash__":623},"docs\u002F4.client-addons\u002F0.index.md",{"type":148,"value":149,"toc":608},"minimark",[150,154,158,161,166,208,212,215,218,233,237,240,285,288,353,357,467,470,474,521,525,531,534,545,548,552,558,567,570,574,604],[151,152,99],"h1",{"id":153},"client-usage-guide",[155,156,157],"p",{},"Forge Client contains the Arma client-side addons that open player interfaces,\nhandle browser events, cache client-visible state, and forward authoritative\nrequests to the server addons.",[155,159,160],{},"Use this guide as the entry point for client-side integration. Domain data,\nvalidation, persistence, rewards, ownership, and checkout behavior remain\nserver-side responsibilities.",[162,163,165],"h2",{"id":164},"client-responsibilities","Client Responsibilities",[167,168,169,178,185,192,195,198,205],"ul",{},[170,171,172,173,177],"li",{},"Open Arma displays and ",[174,175,176],"code",{},"CT_WEBBROWSER"," controls.",[170,179,180,181,184],{},"Load browser UI assets from each addon's ",[174,182,183],{},"ui\u002F_site"," folder.",[170,186,187,188,191],{},"Receive browser alerts through ",[174,189,190],{},"JSDialog"," handlers.",[170,193,194],{},"Translate browser events into local actions or CBA server events.",[170,196,197],{},"Cache display state in client repositories.",[170,199,200,201,204],{},"Push server responses back into browser UIs with ",[174,202,203],{},"ExecJS",".",[170,206,207],{},"Provide local-only utility state where the feature is intentionally local.",[162,209,211],{"id":210},"authoritative-boundaries","Authoritative Boundaries",[155,213,214],{},"Client repositories are view state. They are useful for rendering, local UI\ndecisions, and short-lived session behavior, but they should not be treated as\ndurable state.",[155,216,217],{},"Authoritative state lives in:",[167,219,220,223,230],{},[170,221,222],{},"server SQF addons for mission and player workflow ownership",[170,224,225,226,229],{},"the ",[174,227,228],{},"forge_server"," extension for durable and hot-state domain logic",[170,231,232],{},"SurrealDB where the extension persists durable domain records",[162,234,236],{"id":235},"common-runtime-flow","Common Runtime Flow",[155,238,239],{},"Most browser-backed client addons follow this shape:",[241,242,243,249,254,265,271,274,280],"ol",{},[170,244,245,246,248],{},"The addon creates a display, finds a browser control, and registers a\n",[174,247,190],{}," event handler.",[170,250,251,252,204],{},"The browser loads an HTML entrypoint from ",[174,253,183],{},[170,255,256,257,260,261,264],{},"The browser sends JSON alerts with an ",[174,258,259],{},"event"," name and ",[174,262,263],{},"data"," payload.",[170,266,267,270],{},[174,268,269],{},"fnc_handleUIEvents.sqf"," parses the alert and routes the event.",[170,272,273],{},"A bridge object or repository sends a CBA server event when server data is\nneeded.",[170,275,276,277,204],{},"Server responses are caught in ",[174,278,279],{},"XEH_postInitClient.sqf",[170,281,282,283,204],{},"The bridge sends browser update events back through ",[174,284,203],{},[155,286,287],{},"Browser alert payload:",[289,290,295],"pre",{"className":291,"code":292,"language":293,"meta":294,"style":294},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"event\": \"module::action\",\n \"data\": {}\n}\n","json","",[174,296,297,306,333,347],{"__ignoreMap":294},[298,299,302],"span",{"class":300,"line":301},"line",1,[298,303,305],{"class":304},"sMK4o","{\n",[298,307,309,312,315,318,321,324,328,330],{"class":300,"line":308},2,[298,310,311],{"class":304}," \"",[298,313,259],{"class":314},"spNyl",[298,316,317],{"class":304},"\"",[298,319,320],{"class":304},":",[298,322,323],{"class":304}," \"",[298,325,327],{"class":326},"sfazB","module::action",[298,329,317],{"class":304},[298,331,332],{"class":304},",\n",[298,334,336,338,340,342,344],{"class":300,"line":335},3,[298,337,311],{"class":304},[298,339,263],{"class":314},[298,341,317],{"class":304},[298,343,320],{"class":304},[298,345,346],{"class":304}," {}\n",[298,348,350],{"class":300,"line":349},4,[298,351,352],{"class":304},"}\n",[162,354,356],{"id":355},"open-ui-entry-points","Open UI Entry Points",[358,359,360,373],"table",{},[361,362,363],"thead",{},[364,365,366,370],"tr",{},[367,368,369],"th",{},"UI",[367,371,372],{},"Entry point",[374,375,376,387,397,407,417,427,437,447,457],"tbody",{},[364,377,378,382],{},[379,380,381],"td",{},"Actor menu",[379,383,384],{},[174,385,386],{},"call forge_client_actor_fnc_openUI;",[364,388,389,392],{},[379,390,391],{},"Bank",[379,393,394],{},[174,395,396],{},"call forge_client_bank_fnc_openUI;",[364,398,399,402],{},[379,400,401],{},"ATM",[379,403,404],{},[174,405,406],{},"[true] call forge_client_bank_fnc_openUI;",[364,408,409,412],{},[379,410,411],{},"CAD",[379,413,414],{},[174,415,416],{},"call forge_client_cad_fnc_openUI;",[364,418,419,422],{},[379,420,421],{},"Garage",[379,423,424],{},[174,425,426],{},"call forge_client_garage_fnc_openUI;",[364,428,429,432],{},[379,430,431],{},"Virtual garage",[379,433,434],{},[174,435,436],{},"call forge_client_garage_fnc_openVG;",[364,438,439,442],{},[379,440,441],{},"Organization portal",[379,443,444],{},[174,445,446],{},"call forge_client_org_fnc_openUI;",[364,448,449,452],{},[379,450,451],{},"Phone",[379,453,454],{},[174,455,456],{},"call forge_client_phone_fnc_openUI;",[364,458,459,462],{},[379,460,461],{},"Store",[379,463,464],{},[174,465,466],{},"call forge_client_store_fnc_openUI;",[155,468,469],{},"Notifications are normally opened during client initialization and then updated\nthrough the notification event\u002Fservice.",[162,471,473],{"id":472},"addon-guides","Addon Guides",[167,475,476,481,485,489,493,497,501,505,509,513,517],{},[170,477,478],{},[479,480,101],"a",{"href":102},[170,482,483],{},[479,484,113],{"href":114},[170,486,487],{},[479,488,117],{"href":118},[170,490,491],{},[479,492,121],{"href":122},[170,494,495],{},[479,496,125],{"href":126},[170,498,499],{},[479,500,129],{"href":130},[170,502,503],{},[479,504,133],{"href":134},[170,506,507],{},[479,508,137],{"href":138},[170,510,511],{},[479,512,141],{"href":142},[170,514,515],{},[479,516,105],{"href":106},[170,518,519],{},[479,520,109],{"href":110},[162,522,524],{"id":523},"extension-calls","Extension Calls",[155,526,527,528,530],{},"Client addons should usually call server SQF events, not the ",[174,529,228],{},"\nextension directly. The server addon owns validation context and converts the\nrequest into extension commands.",[155,532,533],{},"Example:",[289,535,539],{"className":536,"code":537,"language":538,"meta":294,"style":294},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[SRPC(bank,requestDeposit), [getPlayerUID player, 100]] call CFUNC(serverEvent);\n","sqf",[174,540,541],{"__ignoreMap":294},[298,542,543],{"class":300,"line":301},[298,544,537],{},[155,546,547],{},"Direct extension calls from client code bypass server authorization boundaries\nand should be avoided.",[162,549,551],{"id":550},"browser-bridge-notes","Browser Bridge Notes",[155,553,554,557],{},[174,555,556],{},"forge_client_common_fnc_initWebUIBridge"," provides reusable bridge and screen\nobjects for newer browser UIs. It queues outbound events until a browser screen\nis ready, then delivers payloads through:",[289,559,561],{"className":536,"code":560,"language":538,"meta":294,"style":294},"_control ctrlWebBrowserAction [\"ExecJS\", format [\"ForgeBridge.receive(%1)\", _json]];\n",[174,562,563],{"__ignoreMap":294},[298,564,565],{"class":300,"line":301},[298,566,560],{},[155,568,569],{},"Feature addons still own their event names, request payloads, and response\nmapping.",[162,571,573],{"id":572},"development-checklist","Development Checklist",[167,575,576,579,582,588,595,598,601],{},[170,577,578],{},"Keep feature-specific behavior in the owning addon.",[170,580,581],{},"Send authoritative changes to the server addon.",[170,583,584,585,204],{},"Use namespaced browser events such as ",[174,586,587],{},"bank::deposit::request",[170,589,590,591,594],{},"Treat ",[174,592,593],{},"profileNamespace"," as local player preference or utility state only.",[170,596,597],{},"Make browser-ready events request the current server state before rendering\nstale data.",[170,599,600],{},"Queue or ignore bridge responses when the display is closed.",[170,602,603],{},"Keep mission object setup on the mission\u002Fserver side and client display logic\non the client side.",[605,606,607],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":294,"searchDepth":308,"depth":308,"links":609},[610,611,612,613,614,615,616,617],{"id":164,"depth":308,"text":165},{"id":210,"depth":308,"text":211},{"id":235,"depth":308,"text":236},{"id":355,"depth":308,"text":356},{"id":472,"depth":308,"text":473},{"id":523,"depth":308,"text":524},{"id":550,"depth":308,"text":551},{"id":572,"depth":308,"text":573},"md",null,{},true,{"title":99,"description":157},"JTkXjG_St8xEkLNECfj9fYzon1OZmDe7brlAXBnT7d8",[625,627],{"title":89,"path":90,"stem":91,"description":626,"children":-1},"The phone module stores contacts, messages, and emails for each UID. It is a\nserver-extension state module backed by SurrealDB.",{"title":101,"path":102,"stem":103,"description":628,"children":-1},"The client main addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.",1776806627034] \ No newline at end of file diff --git a/docus/dist/client-addons/actor.html b/docus/dist/client-addons/actor.html index f127167..913df9b 100644 --- a/docus/dist/client-addons/actor.html +++ b/docus/dist/client-addons/actor.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Actor Usage Guide - forge-docusRelated Guides

    Client Common Usage Guide

    The client common addon contains shared browser UI bridge declarations and common client-side browser integration patterns.

    Client Bank Usage Guide

    The client bank addon opens the bank and ATM browser UI, forwards banking requests to the server bank addon, and pushes account updates back into the -browser.

    \ No newline at end of file +browser.

    \ No newline at end of file diff --git a/docus/dist/client-addons/actor/_payload.json b/docus/dist/client-addons/actor/_payload.json index 103a803..b7f0303 100644 --- a/docus/dist/client-addons/actor/_payload.json +++ b/docus/dist/client-addons/actor/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":580},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-actor":145,"-client-addons-actor-surround":575},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":117,"body":147,"description":157,"extension":569,"links":570,"meta":571,"navigation":572,"path":118,"seo":573,"stem":119,"__hash__":574},"docs\u002F4.client-addons\u002F3.actor.md",{"type":148,"value":149,"toc":560},"minimark",[150,154,158,163,180,195,199,208,211,230,233,242,245,254,258,261,269,272,370,376,380,507,510,514,517,521,556],[151,152,117],"h1",{"id":153},"client-actor-usage-guide",[155,156,157],"p",{},"The client actor addon owns the player interaction menu and client-side actor\nrepository. It is the main launcher for nearby player actions and other Forge\nclient UIs.",[159,160,162],"h2",{"id":161},"open-the-actor-menu","Open the Actor Menu",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_actor_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The actor menu opens ",[171,184,185],{},"RscActorMenu",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes\nbrowser alerts through ",[171,192,193],{},"forge_client_actor_fnc_handleUIEvents",".",[159,196,198],{"id":197},"repository","Repository",[155,200,201,204,205,194],{},[171,202,203],{},"forge_client_actor_fnc_initRepository"," creates ",[171,206,207],{},"GVAR(ActorRepository)",[155,209,210],{},"The repository:",[212,213,214,218,221,224,227],"ul",{},[215,216,217],"li",{},"requests actor initialization from the server",[215,219,220],{},"saves actor state through the server actor addon",[215,222,223],{},"caches client-visible actor fields",[215,225,226],{},"applies position, direction, stance, rank, and loadout on JIP sync when the\nrelevant settings allow it",[215,228,229],{},"provides nearby interaction actions to the browser UI",[155,231,232],{},"Initialize actor state through the repository:",[164,234,236],{"className":166,"code":235,"language":168,"meta":169,"style":169},"GVAR(ActorRepository) call [\"init\", []];\n",[171,237,238],{"__ignoreMap":169},[174,239,240],{"class":176,"line":177},[174,241,235],{},[155,243,244],{},"Save actor state through the server:",[164,246,248],{"className":166,"code":247,"language":168,"meta":169,"style":169},"GVAR(ActorRepository) call [\"save\", [true]];\n",[171,249,250],{"__ignoreMap":169},[174,251,252],{"class":176,"line":177},[174,253,247],{},[159,255,257],{"id":256},"nearby-actions","Nearby Actions",[155,259,260],{},"The menu asks for nearby actions with:",[164,262,267],{"className":263,"code":265,"language":266,"meta":169},[264],"language-text","actor::get::actions\n","text",[171,268,265],{"__ignoreMap":169},[155,270,271],{},"The repository scans objects within 5 meters and returns actions based on\nmission object variables:",[273,274,275,288],"table",{},[276,277,278],"thead",{},[279,280,281,285],"tr",{},[282,283,284],"th",{},"Variable",[282,286,287],{},"Action",[289,290,291,302,312,322,332,342,352,362],"tbody",{},[279,292,293,299],{},[294,295,296],"td",{},[171,297,298],{},"storeType",[294,300,301],{},"store",[279,303,304,309],{},[294,305,306],{},[171,307,308],{},"isAtm",[294,310,311],{},"ATM",[279,313,314,319],{},[294,315,316],{},[171,317,318],{},"isBank",[294,320,321],{},"bank",[279,323,324,329],{},[294,325,326],{},[171,327,328],{},"isGarage",[294,330,331],{},"garage",[279,333,334,339],{},[294,335,336],{},[171,337,338],{},"garageType",[294,340,341],{},"garage subtype",[279,343,344,349],{},[294,345,346],{},[171,347,348],{},"isLocker",[294,350,351],{},"virtual arsenal action when VA is enabled",[279,353,354,359],{},[294,355,356],{},[171,357,358],{},"deviceType",[294,360,361],{},"device action placeholder",[279,363,364,367],{},[294,365,366],{},"nearby player unit",[294,368,369],{},"player interaction placeholder",[155,371,372,373,194],{},"The response is pushed into the browser with ",[171,374,375],{},"updateAvailableActions(...)",[159,377,379],{"id":378},"browser-events","Browser Events",[273,381,382,392],{},[276,383,384],{},[279,385,386,389],{},[282,387,388],{},"Event",[282,390,391],{},"Client behavior",[289,393,394,404,414,424,434,444,454,464,474,487,497],{},[279,395,396,401],{},[294,397,398],{},[171,399,400],{},"actor::get::actions",[294,402,403],{},"Refresh nearby actions.",[279,405,406,411],{},[294,407,408],{},[171,409,410],{},"actor::close::menu",[294,412,413],{},"Close actor menu.",[279,415,416,421],{},[294,417,418],{},[171,419,420],{},"actor::open::atm",[294,422,423],{},"Open bank UI in ATM mode.",[279,425,426,431],{},[294,427,428],{},[171,429,430],{},"actor::open::bank",[294,432,433],{},"Open bank UI in bank mode.",[279,435,436,441],{},[294,437,438],{},[171,439,440],{},"actor::open::cad",[294,442,443],{},"Open CAD UI.",[279,445,446,451],{},[294,447,448],{},[171,449,450],{},"actor::open::garage",[294,452,453],{},"Open garage UI.",[279,455,456,461],{},[294,457,458],{},[171,459,460],{},"actor::open::vgarage",[294,462,463],{},"Open virtual garage.",[279,465,466,471],{},[294,467,468],{},[171,469,470],{},"actor::open::org",[294,472,473],{},"Open organization UI.",[279,475,476,481],{},[294,477,478],{},[171,479,480],{},"actor::open::vlocker",[294,482,483,484,194],{},"Open ACE arsenal on ",[171,485,486],{},"FORGE_Locker_Box",[279,488,489,494],{},[294,490,491],{},[171,492,493],{},"actor::open::phone",[294,495,496],{},"Open phone UI.",[279,498,499,504],{},[294,500,501],{},[171,502,503],{},"actor::open::store",[294,505,506],{},"Open store UI.",[155,508,509],{},"Device and player interaction events currently display placeholder feedback.",[159,511,513],{"id":512},"authoritative-state","Authoritative State",[155,515,516],{},"Actor persistence is server-owned. The client repository requests and displays\nactor data, but actor creation, durable updates, and hot-state behavior are\nhandled by the server actor addon and extension.",[159,518,520],{"id":519},"related-guides","Related Guides",[212,522,523,528,532,536,540,544,548,552],{},[215,524,525],{},[526,527,49],"a",{"href":50},[215,529,530],{},[526,531,121],{"href":122},[215,533,534],{},[526,535,125],{"href":126},[215,537,538],{},[526,539,129],{"href":130},[215,541,542],{},[526,543,133],{"href":134},[215,545,546],{},[526,547,141],{"href":142},[215,549,550],{},[526,551,105],{"href":106},[215,553,554],{},[526,555,109],{"href":110},[557,558,559],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":561,"depth":561,"links":562},2,[563,564,565,566,567,568],{"id":161,"depth":561,"text":162},{"id":197,"depth":561,"text":198},{"id":256,"depth":561,"text":257},{"id":378,"depth":561,"text":379},{"id":512,"depth":561,"text":513},{"id":519,"depth":561,"text":520},"md",null,{},true,{"title":117,"description":157},"CeusWIDeAc6KDGfoUngW1_lAMAWRX8g6N17xG10V1Tc",[576,578],{"title":113,"path":114,"stem":115,"description":577,"children":-1},"The client common addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.",{"title":121,"path":122,"stem":123,"description":579,"children":-1},"The client bank addon opens the bank and ATM browser UI, forwards banking\nrequests to the server bank addon, and pushes account updates back into the\nbrowser.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":580},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-actor":145,"-client-addons-actor-surround":575},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":117,"body":147,"description":157,"extension":569,"links":570,"meta":571,"navigation":572,"path":118,"seo":573,"stem":119,"__hash__":574},"docs\u002F4.client-addons\u002F3.actor.md",{"type":148,"value":149,"toc":560},"minimark",[150,154,158,163,180,195,199,208,211,230,233,242,245,254,258,261,269,272,370,376,380,507,510,514,517,521,556],[151,152,117],"h1",{"id":153},"client-actor-usage-guide",[155,156,157],"p",{},"The client actor addon owns the player interaction menu and client-side actor\nrepository. It is the main launcher for nearby player actions and other Forge\nclient UIs.",[159,160,162],"h2",{"id":161},"open-the-actor-menu","Open the Actor Menu",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_actor_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The actor menu opens ",[171,184,185],{},"RscActorMenu",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes\nbrowser alerts through ",[171,192,193],{},"forge_client_actor_fnc_handleUIEvents",".",[159,196,198],{"id":197},"repository","Repository",[155,200,201,204,205,194],{},[171,202,203],{},"forge_client_actor_fnc_initRepository"," creates ",[171,206,207],{},"GVAR(ActorRepository)",[155,209,210],{},"The repository:",[212,213,214,218,221,224,227],"ul",{},[215,216,217],"li",{},"requests actor initialization from the server",[215,219,220],{},"saves actor state through the server actor addon",[215,222,223],{},"caches client-visible actor fields",[215,225,226],{},"applies position, direction, stance, rank, and loadout on JIP sync when the\nrelevant settings allow it",[215,228,229],{},"provides nearby interaction actions to the browser UI",[155,231,232],{},"Initialize actor state through the repository:",[164,234,236],{"className":166,"code":235,"language":168,"meta":169,"style":169},"GVAR(ActorRepository) call [\"init\", []];\n",[171,237,238],{"__ignoreMap":169},[174,239,240],{"class":176,"line":177},[174,241,235],{},[155,243,244],{},"Save actor state through the server:",[164,246,248],{"className":166,"code":247,"language":168,"meta":169,"style":169},"GVAR(ActorRepository) call [\"save\", [true]];\n",[171,249,250],{"__ignoreMap":169},[174,251,252],{"class":176,"line":177},[174,253,247],{},[159,255,257],{"id":256},"nearby-actions","Nearby Actions",[155,259,260],{},"The menu asks for nearby actions with:",[164,262,267],{"className":263,"code":265,"language":266,"meta":169},[264],"language-text","actor::get::actions\n","text",[171,268,265],{"__ignoreMap":169},[155,270,271],{},"The repository scans objects within 5 meters and returns actions based on\nmission object variables:",[273,274,275,288],"table",{},[276,277,278],"thead",{},[279,280,281,285],"tr",{},[282,283,284],"th",{},"Variable",[282,286,287],{},"Action",[289,290,291,302,312,322,332,342,352,362],"tbody",{},[279,292,293,299],{},[294,295,296],"td",{},[171,297,298],{},"storeType",[294,300,301],{},"store",[279,303,304,309],{},[294,305,306],{},[171,307,308],{},"isAtm",[294,310,311],{},"ATM",[279,313,314,319],{},[294,315,316],{},[171,317,318],{},"isBank",[294,320,321],{},"bank",[279,323,324,329],{},[294,325,326],{},[171,327,328],{},"isGarage",[294,330,331],{},"garage",[279,333,334,339],{},[294,335,336],{},[171,337,338],{},"garageType",[294,340,341],{},"garage subtype",[279,343,344,349],{},[294,345,346],{},[171,347,348],{},"isLocker",[294,350,351],{},"virtual arsenal action when VA is enabled",[279,353,354,359],{},[294,355,356],{},[171,357,358],{},"deviceType",[294,360,361],{},"device action placeholder",[279,363,364,367],{},[294,365,366],{},"nearby player unit",[294,368,369],{},"player interaction placeholder",[155,371,372,373,194],{},"The response is pushed into the browser with ",[171,374,375],{},"updateAvailableActions(...)",[159,377,379],{"id":378},"browser-events","Browser Events",[273,381,382,392],{},[276,383,384],{},[279,385,386,389],{},[282,387,388],{},"Event",[282,390,391],{},"Client behavior",[289,393,394,404,414,424,434,444,454,464,474,487,497],{},[279,395,396,401],{},[294,397,398],{},[171,399,400],{},"actor::get::actions",[294,402,403],{},"Refresh nearby actions.",[279,405,406,411],{},[294,407,408],{},[171,409,410],{},"actor::close::menu",[294,412,413],{},"Close actor menu.",[279,415,416,421],{},[294,417,418],{},[171,419,420],{},"actor::open::atm",[294,422,423],{},"Open bank UI in ATM mode.",[279,425,426,431],{},[294,427,428],{},[171,429,430],{},"actor::open::bank",[294,432,433],{},"Open bank UI in bank mode.",[279,435,436,441],{},[294,437,438],{},[171,439,440],{},"actor::open::cad",[294,442,443],{},"Open CAD UI.",[279,445,446,451],{},[294,447,448],{},[171,449,450],{},"actor::open::garage",[294,452,453],{},"Open garage UI.",[279,455,456,461],{},[294,457,458],{},[171,459,460],{},"actor::open::vgarage",[294,462,463],{},"Open virtual garage.",[279,465,466,471],{},[294,467,468],{},[171,469,470],{},"actor::open::org",[294,472,473],{},"Open organization UI.",[279,475,476,481],{},[294,477,478],{},[171,479,480],{},"actor::open::vlocker",[294,482,483,484,194],{},"Open ACE arsenal on ",[171,485,486],{},"FORGE_Locker_Box",[279,488,489,494],{},[294,490,491],{},[171,492,493],{},"actor::open::phone",[294,495,496],{},"Open phone UI.",[279,498,499,504],{},[294,500,501],{},[171,502,503],{},"actor::open::store",[294,505,506],{},"Open store UI.",[155,508,509],{},"Device and player interaction events currently display placeholder feedback.",[159,511,513],{"id":512},"authoritative-state","Authoritative State",[155,515,516],{},"Actor persistence is server-owned. The client repository requests and displays\nactor data, but actor creation, durable updates, and hot-state behavior are\nhandled by the server actor addon and extension.",[159,518,520],{"id":519},"related-guides","Related Guides",[212,522,523,528,532,536,540,544,548,552],{},[215,524,525],{},[526,527,49],"a",{"href":50},[215,529,530],{},[526,531,121],{"href":122},[215,533,534],{},[526,535,125],{"href":126},[215,537,538],{},[526,539,129],{"href":130},[215,541,542],{},[526,543,133],{"href":134},[215,545,546],{},[526,547,141],{"href":142},[215,549,550],{},[526,551,105],{"href":106},[215,553,554],{},[526,555,109],{"href":110},[557,558,559],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":561,"depth":561,"links":562},2,[563,564,565,566,567,568],{"id":161,"depth":561,"text":162},{"id":197,"depth":561,"text":198},{"id":256,"depth":561,"text":257},{"id":378,"depth":561,"text":379},{"id":512,"depth":561,"text":513},{"id":519,"depth":561,"text":520},"md",null,{},true,{"title":117,"description":157},"CeusWIDeAc6KDGfoUngW1_lAMAWRX8g6N17xG10V1Tc",[576,578],{"title":113,"path":114,"stem":115,"description":577,"children":-1},"The client common addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.",{"title":121,"path":122,"stem":123,"description":579,"children":-1},"The client bank addon opens the bank and ATM browser UI, forwards banking\nrequests to the server bank addon, and pushes account updates back into the\nbrowser.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/bank.html b/docus/dist/client-addons/bank.html index 9984c11..8e6268b 100644 --- a/docus/dist/client-addons/bank.html +++ b/docus/dist/client-addons/bank.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Bank Usage Guide - forge-docus

    Client CAD Usage Guide

    The client CAD addon provides the map and dispatch UI for groups, active tasks, task assignment, dispatch orders, support requests, and task -acknowledge/decline workflows.

    \ No newline at end of file +acknowledge/decline workflows.

    \ No newline at end of file diff --git a/docus/dist/client-addons/bank/_payload.json b/docus/dist/client-addons/bank/_payload.json index 7620300..6abbb63 100644 --- a/docus/dist/client-addons/bank/_payload.json +++ b/docus/dist/client-addons/bank/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":507},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-bank":145,"-client-addons-bank-surround":502},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":121,"body":147,"description":157,"extension":496,"links":497,"meta":498,"navigation":499,"path":122,"seo":500,"stem":123,"__hash__":501},"docs\u002F4.client-addons\u002F4.bank.md",{"type":148,"value":149,"toc":486},"minimark",[150,154,158,163,166,183,186,195,218,222,228,234,256,260,370,374,377,420,424,427,456,460,463,467,482],[151,152,121],"h1",{"id":153},"client-bank-usage-guide",[155,156,157],"p",{},"The client bank addon opens the bank and ATM browser UI, forwards banking\nrequests to the server bank addon, and pushes account updates back into the\nbrowser.",[159,160,162],"h2",{"id":161},"open-bank-ui","Open Bank UI",[155,164,165],{},"Open full bank mode:",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_bank_fnc_openUI;\n","sqf","",[174,175,176],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,170],{},[155,184,185],{},"Open ATM mode:",[167,187,189],{"className":169,"code":188,"language":171,"meta":172,"style":172},"[true] call forge_client_bank_fnc_openUI;\n",[174,190,191],{"__ignoreMap":172},[177,192,193],{"class":179,"line":180},[177,194,188],{},[155,196,197,198,201,202,205,206,209,210,213,214,217],{},"The open function creates ",[174,199,200],{},"RscBank",", sets the bridge mode to ",[174,203,204],{},"bank"," or ",[174,207,208],{},"atm",",\nloads ",[174,211,212],{},"ui\u002F_site\u002Findex.html",", and routes browser events through\n",[174,215,216],{},"forge_client_bank_fnc_handleUIEvents",".",[159,219,221],{"id":220},"bridge-and-repository","Bridge and Repository",[155,223,224,227],{},[174,225,226],{},"forge_client_bank_fnc_initRepository"," tracks account load and cached account\nstate.",[155,229,230,233],{},[174,231,232],{},"forge_client_bank_fnc_initUIBridge"," owns:",[235,236,237,241,244,247,250,253],"ul",{},[238,239,240],"li",{},"active browser control tracking",[238,242,243],{},"bank\u002FATM mode",[238,245,246],{},"browser ready handling",[238,248,249],{},"account hydrate and sync responses",[238,251,252],{},"deposit, withdrawal, transfer, earnings deposit, credit repayment, and PIN\nrequests",[238,254,255],{},"browser notice delivery",[159,257,259],{"id":258},"browser-events","Browser Events",[261,262,263,276],"table",{},[264,265,266],"thead",{},[267,268,269,273],"tr",{},[270,271,272],"th",{},"Event",[270,274,275],{},"Client behavior",[277,278,279,290,300,310,320,330,340,350,360],"tbody",{},[267,280,281,287],{},[282,283,284],"td",{},[174,285,286],{},"bank::ready",[282,288,289],{},"Mark browser ready and request hydrate from the server.",[267,291,292,297],{},[282,293,294],{},[174,295,296],{},"bank::refresh",[282,298,299],{},"Request fresh bank hydrate data.",[267,301,302,307],{},[282,303,304],{},[174,305,306],{},"bank::deposit::request",[282,308,309],{},"Forward deposit amount to the server.",[267,311,312,317],{},[282,313,314],{},[174,315,316],{},"bank::withdraw::request",[282,318,319],{},"Forward withdrawal amount to the server.",[267,321,322,327],{},[282,323,324],{},[174,325,326],{},"bank::transfer::request",[282,328,329],{},"Forward target, source field, and amount.",[267,331,332,337],{},[282,333,334],{},[174,335,336],{},"bank::depositEarnings::request",[282,338,339],{},"Request earnings deposit.",[267,341,342,347],{},[282,343,344],{},[174,345,346],{},"bank::repayCreditLine::request",[282,348,349],{},"Request credit-line repayment.",[267,351,352,357],{},[282,353,354],{},[174,355,356],{},"bank::pin::request",[282,358,359],{},"Forward PIN validation request.",[267,361,362,367],{},[282,363,364],{},[174,365,366],{},"bank::close",[282,368,369],{},"Dispose bridge screen state and close the display.",[159,371,373],{"id":372},"browser-response-events","Browser Response Events",[155,375,376],{},"The bridge sends:",[261,378,379,388],{},[264,380,381],{},[267,382,383,385],{},[270,384,272],{},[270,386,387],{},"Purpose",[277,389,390,400,410],{},[267,391,392,397],{},[282,393,394],{},[174,395,396],{},"bank::hydrate",[282,398,399],{},"Full session\u002Faccount payload.",[267,401,402,407],{},[282,403,404],{},[174,405,406],{},"bank::sync",[282,408,409],{},"Account patch or sync data.",[267,411,412,417],{},[282,413,414],{},[174,415,416],{},"bank::notice",[282,418,419],{},"UI-visible notice payload.",[159,421,423],{"id":422},"request-flow","Request Flow",[155,425,426],{},"Example deposit flow:",[428,429,430,439,442,445,448],"ol",{},[238,431,432,433,435,436,217],{},"Browser sends ",[174,434,306],{}," with an ",[174,437,438],{},"amount",[238,440,441],{},"Client bridge calls the server bank request event.",[238,443,444],{},"Server bank addon validates the request and calls bank hot-state logic.",[238,446,447],{},"Server response is caught by the client post-init event handlers.",[238,449,450,451,205,453,455],{},"Client bridge sends ",[174,452,406],{},[174,454,416],{}," back to the browser.",[159,457,459],{"id":458},"authoritative-state","Authoritative State",[155,461,462],{},"Balances, PIN authorization, transfers, checkout charges, credit lines, and\npersistence are server-owned. The client should only display account data and\nrequest mutations through server events.",[159,464,466],{"id":465},"related-guides","Related Guides",[235,468,469,474,478],{},[238,470,471],{},[472,473,61],"a",{"href":62},[238,475,476],{},[472,477,113],{"href":114},[238,479,480],{},[472,481,109],{"href":110},[483,484,485],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":487,"depth":487,"links":488},2,[489,490,491,492,493,494,495],{"id":161,"depth":487,"text":162},{"id":220,"depth":487,"text":221},{"id":258,"depth":487,"text":259},{"id":372,"depth":487,"text":373},{"id":422,"depth":487,"text":423},{"id":458,"depth":487,"text":459},{"id":465,"depth":487,"text":466},"md",null,{},true,{"title":121,"description":157},"9tSr_28NEzJ4LE8au9-O-2Asw_3deKU9B74cukr6ppU",[503,505],{"title":117,"path":118,"stem":119,"description":504,"children":-1},"The client actor addon owns the player interaction menu and client-side actor\nrepository. It is the main launcher for nearby player actions and other Forge\nclient UIs.",{"title":125,"path":126,"stem":127,"description":506,"children":-1},"The client CAD addon provides the map and dispatch UI for groups, active\ntasks, task assignment, dispatch orders, support requests, and task\nacknowledge\u002Fdecline workflows.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":507},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-bank":145,"-client-addons-bank-surround":502},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":121,"body":147,"description":157,"extension":496,"links":497,"meta":498,"navigation":499,"path":122,"seo":500,"stem":123,"__hash__":501},"docs\u002F4.client-addons\u002F4.bank.md",{"type":148,"value":149,"toc":486},"minimark",[150,154,158,163,166,183,186,195,218,222,228,234,256,260,370,374,377,420,424,427,456,460,463,467,482],[151,152,121],"h1",{"id":153},"client-bank-usage-guide",[155,156,157],"p",{},"The client bank addon opens the bank and ATM browser UI, forwards banking\nrequests to the server bank addon, and pushes account updates back into the\nbrowser.",[159,160,162],"h2",{"id":161},"open-bank-ui","Open Bank UI",[155,164,165],{},"Open full bank mode:",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_bank_fnc_openUI;\n","sqf","",[174,175,176],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,170],{},[155,184,185],{},"Open ATM mode:",[167,187,189],{"className":169,"code":188,"language":171,"meta":172,"style":172},"[true] call forge_client_bank_fnc_openUI;\n",[174,190,191],{"__ignoreMap":172},[177,192,193],{"class":179,"line":180},[177,194,188],{},[155,196,197,198,201,202,205,206,209,210,213,214,217],{},"The open function creates ",[174,199,200],{},"RscBank",", sets the bridge mode to ",[174,203,204],{},"bank"," or ",[174,207,208],{},"atm",",\nloads ",[174,211,212],{},"ui\u002F_site\u002Findex.html",", and routes browser events through\n",[174,215,216],{},"forge_client_bank_fnc_handleUIEvents",".",[159,219,221],{"id":220},"bridge-and-repository","Bridge and Repository",[155,223,224,227],{},[174,225,226],{},"forge_client_bank_fnc_initRepository"," tracks account load and cached account\nstate.",[155,229,230,233],{},[174,231,232],{},"forge_client_bank_fnc_initUIBridge"," owns:",[235,236,237,241,244,247,250,253],"ul",{},[238,239,240],"li",{},"active browser control tracking",[238,242,243],{},"bank\u002FATM mode",[238,245,246],{},"browser ready handling",[238,248,249],{},"account hydrate and sync responses",[238,251,252],{},"deposit, withdrawal, transfer, earnings deposit, credit repayment, and PIN\nrequests",[238,254,255],{},"browser notice delivery",[159,257,259],{"id":258},"browser-events","Browser Events",[261,262,263,276],"table",{},[264,265,266],"thead",{},[267,268,269,273],"tr",{},[270,271,272],"th",{},"Event",[270,274,275],{},"Client behavior",[277,278,279,290,300,310,320,330,340,350,360],"tbody",{},[267,280,281,287],{},[282,283,284],"td",{},[174,285,286],{},"bank::ready",[282,288,289],{},"Mark browser ready and request hydrate from the server.",[267,291,292,297],{},[282,293,294],{},[174,295,296],{},"bank::refresh",[282,298,299],{},"Request fresh bank hydrate data.",[267,301,302,307],{},[282,303,304],{},[174,305,306],{},"bank::deposit::request",[282,308,309],{},"Forward deposit amount to the server.",[267,311,312,317],{},[282,313,314],{},[174,315,316],{},"bank::withdraw::request",[282,318,319],{},"Forward withdrawal amount to the server.",[267,321,322,327],{},[282,323,324],{},[174,325,326],{},"bank::transfer::request",[282,328,329],{},"Forward target, source field, and amount.",[267,331,332,337],{},[282,333,334],{},[174,335,336],{},"bank::depositEarnings::request",[282,338,339],{},"Request earnings deposit.",[267,341,342,347],{},[282,343,344],{},[174,345,346],{},"bank::repayCreditLine::request",[282,348,349],{},"Request credit-line repayment.",[267,351,352,357],{},[282,353,354],{},[174,355,356],{},"bank::pin::request",[282,358,359],{},"Forward PIN validation request.",[267,361,362,367],{},[282,363,364],{},[174,365,366],{},"bank::close",[282,368,369],{},"Dispose bridge screen state and close the display.",[159,371,373],{"id":372},"browser-response-events","Browser Response Events",[155,375,376],{},"The bridge sends:",[261,378,379,388],{},[264,380,381],{},[267,382,383,385],{},[270,384,272],{},[270,386,387],{},"Purpose",[277,389,390,400,410],{},[267,391,392,397],{},[282,393,394],{},[174,395,396],{},"bank::hydrate",[282,398,399],{},"Full session\u002Faccount payload.",[267,401,402,407],{},[282,403,404],{},[174,405,406],{},"bank::sync",[282,408,409],{},"Account patch or sync data.",[267,411,412,417],{},[282,413,414],{},[174,415,416],{},"bank::notice",[282,418,419],{},"UI-visible notice payload.",[159,421,423],{"id":422},"request-flow","Request Flow",[155,425,426],{},"Example deposit flow:",[428,429,430,439,442,445,448],"ol",{},[238,431,432,433,435,436,217],{},"Browser sends ",[174,434,306],{}," with an ",[174,437,438],{},"amount",[238,440,441],{},"Client bridge calls the server bank request event.",[238,443,444],{},"Server bank addon validates the request and calls bank hot-state logic.",[238,446,447],{},"Server response is caught by the client post-init event handlers.",[238,449,450,451,205,453,455],{},"Client bridge sends ",[174,452,406],{},[174,454,416],{}," back to the browser.",[159,457,459],{"id":458},"authoritative-state","Authoritative State",[155,461,462],{},"Balances, PIN authorization, transfers, checkout charges, credit lines, and\npersistence are server-owned. The client should only display account data and\nrequest mutations through server events.",[159,464,466],{"id":465},"related-guides","Related Guides",[235,468,469,474,478],{},[238,470,471],{},[472,473,61],"a",{"href":62},[238,475,476],{},[472,477,113],{"href":114},[238,479,480],{},[472,481,109],{"href":110},[483,484,485],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":487,"depth":487,"links":488},2,[489,490,491,492,493,494,495],{"id":161,"depth":487,"text":162},{"id":220,"depth":487,"text":221},{"id":258,"depth":487,"text":259},{"id":372,"depth":487,"text":373},{"id":422,"depth":487,"text":423},{"id":458,"depth":487,"text":459},{"id":465,"depth":487,"text":466},"md",null,{},true,{"title":121,"description":157},"9tSr_28NEzJ4LE8au9-O-2Asw_3deKU9B74cukr6ppU",[503,505],{"title":117,"path":118,"stem":119,"description":504,"children":-1},"The client actor addon owns the player interaction menu and client-side actor\nrepository. It is the main launcher for nearby player actions and other Forge\nclient UIs.",{"title":125,"path":126,"stem":127,"description":506,"children":-1},"The client CAD addon provides the map and dispatch UI for groups, active\ntasks, task assignment, dispatch orders, support requests, and task\nacknowledge\u002Fdecline workflows.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/cad.html b/docus/dist/client-addons/cad.html index 3cc113e..1cdbe29 100644 --- a/docus/dist/client-addons/cad.html +++ b/docus/dist/client-addons/cad.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client CAD Usage Guide - forge-docus

    Client Garage Usage Guide

    The client garage addon provides player vehicle storage UI, vehicle store/retrieve actions, selected nearby vehicle service requests, vehicle -context building, and the virtual garage view.

    \ No newline at end of file +context building, and the virtual garage view.

    \ No newline at end of file diff --git a/docus/dist/client-addons/cad/_payload.json b/docus/dist/client-addons/cad/_payload.json index c3a1bba..3280bfe 100644 --- a/docus/dist/client-addons/cad/_payload.json +++ b/docus/dist/client-addons/cad/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":637},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-cad":145,"-client-addons-cad-surround":632},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":125,"body":147,"description":157,"extension":626,"links":627,"meta":628,"navigation":629,"path":126,"seo":630,"stem":127,"__hash__":631},"docs\u002F4.client-addons\u002F5.cad.md",{"type":148,"value":149,"toc":616},"minimark",[150,154,158,163,180,187,203,206,210,216,222,251,255,505,509,512,565,572,576,583,586,590,593,597,612],[151,152,125],"h1",{"id":153},"client-cad-usage-guide",[155,156,157],"p",{},"The client CAD addon provides the map and dispatch UI for groups, active\ntasks, task assignment, dispatch orders, support requests, and task\nacknowledge\u002Fdecline workflows.",[159,160,162],"h2",{"id":161},"open-cad-ui","Open CAD UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_cad_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186],{},"The CAD UI opens ",[171,184,185],{},"RscMapUI"," and loads separate browser controls for:",[188,189,190,194,197,200],"ul",{},[191,192,193],"li",{},"top bar",[191,195,196],{},"bottom bar",[191,198,199],{},"side panel",[191,201,202],{},"dispatcher board",[155,204,205],{},"The native Arma map remains part of the same display.",[159,207,209],{"id":208},"repository-and-bridge","Repository and Bridge",[155,211,212,215],{},[171,213,214],{},"forge_client_cad_fnc_initRepository"," caches the hydrated CAD payload,\nselected mode, dispatch view, session data, groups, tasks, requests, and\nassignments.",[155,217,218,221],{},[171,219,220],{},"forge_client_cad_fnc_initUIBridge"," owns:",[188,223,224,227,230,233,236,239,242,245,248],{},[191,225,226],{},"ready state for side panel, top bar, and dispatcher board",[191,228,229],{},"operations vs dispatch mode",[191,231,232],{},"board vs map dispatch view",[191,234,235],{},"hydrate requests",[191,237,238],{},"task assignment, acknowledge, and decline requests",[191,240,241],{},"dispatch order create\u002Fclose requests",[191,243,244],{},"support request submit\u002Fclose requests",[191,246,247],{},"group status, role, and profile requests",[191,249,250],{},"map focus actions",[159,252,254],{"id":253},"browser-events","Browser Events",[256,257,258,271],"table",{},[259,260,261],"thead",{},[262,263,264,268],"tr",{},[265,266,267],"th",{},"Event",[265,269,270],{},"Client behavior",[272,273,274,285,295,305,315,325,335,345,355,365,375,385,395,405,415,425,435,445,455,465,475,485,495],"tbody",{},[262,275,276,282],{},[277,278,279],"td",{},[171,280,281],{},"cad::topbar::ready",[277,283,284],{},"Mark top bar ready and push top bar state.",[262,286,287,292],{},[277,288,289],{},[171,290,291],{},"cad::ready",[277,293,294],{},"Mark side panel ready and request hydrate.",[262,296,297,302],{},[277,298,299],{},[171,300,301],{},"cad::dispatcher::ready",[277,303,304],{},"Mark dispatcher board ready and push hydrate data.",[262,306,307,312],{},[277,308,309],{},[171,310,311],{},"cad::mode::set",[277,313,314],{},"Switch between operations and dispatch mode.",[262,316,317,322],{},[277,318,319],{},[171,320,321],{},"cad::dispatchView::set",[277,323,324],{},"Switch dispatch board\u002Fmap view.",[262,326,327,332],{},[277,328,329],{},[171,330,331],{},"cad::refresh",[277,333,334],{},"Request fresh CAD hydrate data.",[262,336,337,342],{},[277,338,339],{},[171,340,341],{},"cad::tasks::assign",[277,343,344],{},"Assign a task to a group.",[262,346,347,352],{},[277,348,349],{},[171,350,351],{},"cad::tasks::acknowledge",[277,353,354],{},"Acknowledge assigned task.",[262,356,357,362],{},[277,358,359],{},[171,360,361],{},"cad::tasks::decline",[277,363,364],{},"Decline assigned task.",[262,366,367,372],{},[277,368,369],{},[171,370,371],{},"cad::dispatchOrder::create",[277,373,374],{},"Create dispatch order.",[262,376,377,382],{},[277,378,379],{},[171,380,381],{},"cad::dispatchOrder::close",[277,383,384],{},"Close dispatch order.",[262,386,387,392],{},[277,388,389],{},[171,390,391],{},"cad::supportRequest::submit",[277,393,394],{},"Submit support request.",[262,396,397,402],{},[277,398,399],{},[171,400,401],{},"cad::supportRequest::close",[277,403,404],{},"Close support request.",[262,406,407,412],{},[277,408,409],{},[171,410,411],{},"cad::groups::status",[277,413,414],{},"Update group status.",[262,416,417,422],{},[277,418,419],{},[171,420,421],{},"cad::groups::role",[277,423,424],{},"Update group role.",[262,426,427,432],{},[277,428,429],{},[171,430,431],{},"cad::groups::profile",[277,433,434],{},"Update status and role together.",[262,436,437,442],{},[277,438,439],{},[171,440,441],{},"cad::groups::focus",[277,443,444],{},"Center map on a group.",[262,446,447,452],{},[277,448,449],{},[171,450,451],{},"cad::tasks::focus",[277,453,454],{},"Center map on a task.",[262,456,457,462],{},[277,458,459],{},[171,460,461],{},"cad::requests::focus",[277,463,464],{},"Center map on a support request.",[262,466,467,472],{},[277,468,469],{},[171,470,471],{},"map::zoomIn",[277,473,474],{},"Zoom native map in.",[262,476,477,482],{},[277,478,479],{},[171,480,481],{},"map::zoomOut",[277,483,484],{},"Zoom native map out.",[262,486,487,492],{},[277,488,489],{},[171,490,491],{},"map::search",[277,493,494],{},"Placeholder status update.",[262,496,497,502],{},[277,498,499],{},[171,500,501],{},"map::close",[277,503,504],{},"Dispose bridge state and close the display.",[159,506,508],{"id":507},"response-events","Response Events",[155,510,511],{},"The bridge pushes:",[256,513,514,523],{},[259,515,516],{},[262,517,518,520],{},[265,519,267],{},[265,521,522],{},"Purpose",[272,524,525,535,545,555],{},[262,526,527,532],{},[277,528,529],{},[171,530,531],{},"cad::hydrate",[277,533,534],{},"Full hydrated CAD payload to the side panel.",[262,536,537,542],{},[277,538,539],{},[171,540,541],{},"cad::assignment::response",[277,543,544],{},"Task assignment\u002Facknowledge\u002Fdecline result.",[262,546,547,552],{},[277,548,549],{},[171,550,551],{},"cad::group::response",[277,553,554],{},"Group status\u002Frole\u002Fprofile result.",[262,556,557,562],{},[277,558,559],{},[171,560,561],{},"cad::request::response",[277,563,564],{},"Support request result.",[155,566,567,568,571],{},"Dispatcher board controls also receive direct ",[171,569,570],{},"ExecJS"," status and hydrate\ncalls.",[159,573,575],{"id":574},"task-compatibility","Task Compatibility",[155,577,578,579,582],{},"CAD task visibility depends on server-side task catalog entries. Tasks created\nthrough Eden Forge task modules or ",[171,580,581],{},"forge_server_task_fnc_startTask"," are the\nnormal CAD-compatible task sources because they register task catalog data.",[155,584,585],{},"Direct handler or task-function calls only work with CAD when the task catalog\nentry already exists.",[159,587,589],{"id":588},"authorization-notes","Authorization Notes",[155,591,592],{},"Only dispatcher sessions can enter dispatch mode. If the hydrated session is\nnot a dispatcher, the bridge forces the UI back to operations mode.",[159,594,596],{"id":595},"related-guides","Related Guides",[188,598,599,604,608],{},[191,600,601],{},[602,603,65],"a",{"href":66},[191,605,606],{},[602,607,57],{"href":58},[191,609,610],{},[602,611,113],{"href":114},[613,614,615],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":617,"depth":617,"links":618},2,[619,620,621,622,623,624,625],{"id":161,"depth":617,"text":162},{"id":208,"depth":617,"text":209},{"id":253,"depth":617,"text":254},{"id":507,"depth":617,"text":508},{"id":574,"depth":617,"text":575},{"id":588,"depth":617,"text":589},{"id":595,"depth":617,"text":596},"md",null,{},true,{"title":125,"description":157},"PkqhI_PomRiB_5NhoA0fI40iHaGK26pYqhDGm9sj2iA",[633,635],{"title":121,"path":122,"stem":123,"description":634,"children":-1},"The client bank addon opens the bank and ATM browser UI, forwards banking\nrequests to the server bank addon, and pushes account updates back into the\nbrowser.",{"title":129,"path":130,"stem":131,"description":636,"children":-1},"The client garage addon provides player vehicle storage UI, vehicle\nstore\u002Fretrieve actions, selected nearby vehicle service requests, vehicle\ncontext building, and the virtual garage view.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":637},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-cad":145,"-client-addons-cad-surround":632},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":125,"body":147,"description":157,"extension":626,"links":627,"meta":628,"navigation":629,"path":126,"seo":630,"stem":127,"__hash__":631},"docs\u002F4.client-addons\u002F5.cad.md",{"type":148,"value":149,"toc":616},"minimark",[150,154,158,163,180,187,203,206,210,216,222,251,255,505,509,512,565,572,576,583,586,590,593,597,612],[151,152,125],"h1",{"id":153},"client-cad-usage-guide",[155,156,157],"p",{},"The client CAD addon provides the map and dispatch UI for groups, active\ntasks, task assignment, dispatch orders, support requests, and task\nacknowledge\u002Fdecline workflows.",[159,160,162],"h2",{"id":161},"open-cad-ui","Open CAD UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_cad_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186],{},"The CAD UI opens ",[171,184,185],{},"RscMapUI"," and loads separate browser controls for:",[188,189,190,194,197,200],"ul",{},[191,192,193],"li",{},"top bar",[191,195,196],{},"bottom bar",[191,198,199],{},"side panel",[191,201,202],{},"dispatcher board",[155,204,205],{},"The native Arma map remains part of the same display.",[159,207,209],{"id":208},"repository-and-bridge","Repository and Bridge",[155,211,212,215],{},[171,213,214],{},"forge_client_cad_fnc_initRepository"," caches the hydrated CAD payload,\nselected mode, dispatch view, session data, groups, tasks, requests, and\nassignments.",[155,217,218,221],{},[171,219,220],{},"forge_client_cad_fnc_initUIBridge"," owns:",[188,223,224,227,230,233,236,239,242,245,248],{},[191,225,226],{},"ready state for side panel, top bar, and dispatcher board",[191,228,229],{},"operations vs dispatch mode",[191,231,232],{},"board vs map dispatch view",[191,234,235],{},"hydrate requests",[191,237,238],{},"task assignment, acknowledge, and decline requests",[191,240,241],{},"dispatch order create\u002Fclose requests",[191,243,244],{},"support request submit\u002Fclose requests",[191,246,247],{},"group status, role, and profile requests",[191,249,250],{},"map focus actions",[159,252,254],{"id":253},"browser-events","Browser Events",[256,257,258,271],"table",{},[259,260,261],"thead",{},[262,263,264,268],"tr",{},[265,266,267],"th",{},"Event",[265,269,270],{},"Client behavior",[272,273,274,285,295,305,315,325,335,345,355,365,375,385,395,405,415,425,435,445,455,465,475,485,495],"tbody",{},[262,275,276,282],{},[277,278,279],"td",{},[171,280,281],{},"cad::topbar::ready",[277,283,284],{},"Mark top bar ready and push top bar state.",[262,286,287,292],{},[277,288,289],{},[171,290,291],{},"cad::ready",[277,293,294],{},"Mark side panel ready and request hydrate.",[262,296,297,302],{},[277,298,299],{},[171,300,301],{},"cad::dispatcher::ready",[277,303,304],{},"Mark dispatcher board ready and push hydrate data.",[262,306,307,312],{},[277,308,309],{},[171,310,311],{},"cad::mode::set",[277,313,314],{},"Switch between operations and dispatch mode.",[262,316,317,322],{},[277,318,319],{},[171,320,321],{},"cad::dispatchView::set",[277,323,324],{},"Switch dispatch board\u002Fmap view.",[262,326,327,332],{},[277,328,329],{},[171,330,331],{},"cad::refresh",[277,333,334],{},"Request fresh CAD hydrate data.",[262,336,337,342],{},[277,338,339],{},[171,340,341],{},"cad::tasks::assign",[277,343,344],{},"Assign a task to a group.",[262,346,347,352],{},[277,348,349],{},[171,350,351],{},"cad::tasks::acknowledge",[277,353,354],{},"Acknowledge assigned task.",[262,356,357,362],{},[277,358,359],{},[171,360,361],{},"cad::tasks::decline",[277,363,364],{},"Decline assigned task.",[262,366,367,372],{},[277,368,369],{},[171,370,371],{},"cad::dispatchOrder::create",[277,373,374],{},"Create dispatch order.",[262,376,377,382],{},[277,378,379],{},[171,380,381],{},"cad::dispatchOrder::close",[277,383,384],{},"Close dispatch order.",[262,386,387,392],{},[277,388,389],{},[171,390,391],{},"cad::supportRequest::submit",[277,393,394],{},"Submit support request.",[262,396,397,402],{},[277,398,399],{},[171,400,401],{},"cad::supportRequest::close",[277,403,404],{},"Close support request.",[262,406,407,412],{},[277,408,409],{},[171,410,411],{},"cad::groups::status",[277,413,414],{},"Update group status.",[262,416,417,422],{},[277,418,419],{},[171,420,421],{},"cad::groups::role",[277,423,424],{},"Update group role.",[262,426,427,432],{},[277,428,429],{},[171,430,431],{},"cad::groups::profile",[277,433,434],{},"Update status and role together.",[262,436,437,442],{},[277,438,439],{},[171,440,441],{},"cad::groups::focus",[277,443,444],{},"Center map on a group.",[262,446,447,452],{},[277,448,449],{},[171,450,451],{},"cad::tasks::focus",[277,453,454],{},"Center map on a task.",[262,456,457,462],{},[277,458,459],{},[171,460,461],{},"cad::requests::focus",[277,463,464],{},"Center map on a support request.",[262,466,467,472],{},[277,468,469],{},[171,470,471],{},"map::zoomIn",[277,473,474],{},"Zoom native map in.",[262,476,477,482],{},[277,478,479],{},[171,480,481],{},"map::zoomOut",[277,483,484],{},"Zoom native map out.",[262,486,487,492],{},[277,488,489],{},[171,490,491],{},"map::search",[277,493,494],{},"Placeholder status update.",[262,496,497,502],{},[277,498,499],{},[171,500,501],{},"map::close",[277,503,504],{},"Dispose bridge state and close the display.",[159,506,508],{"id":507},"response-events","Response Events",[155,510,511],{},"The bridge pushes:",[256,513,514,523],{},[259,515,516],{},[262,517,518,520],{},[265,519,267],{},[265,521,522],{},"Purpose",[272,524,525,535,545,555],{},[262,526,527,532],{},[277,528,529],{},[171,530,531],{},"cad::hydrate",[277,533,534],{},"Full hydrated CAD payload to the side panel.",[262,536,537,542],{},[277,538,539],{},[171,540,541],{},"cad::assignment::response",[277,543,544],{},"Task assignment\u002Facknowledge\u002Fdecline result.",[262,546,547,552],{},[277,548,549],{},[171,550,551],{},"cad::group::response",[277,553,554],{},"Group status\u002Frole\u002Fprofile result.",[262,556,557,562],{},[277,558,559],{},[171,560,561],{},"cad::request::response",[277,563,564],{},"Support request result.",[155,566,567,568,571],{},"Dispatcher board controls also receive direct ",[171,569,570],{},"ExecJS"," status and hydrate\ncalls.",[159,573,575],{"id":574},"task-compatibility","Task Compatibility",[155,577,578,579,582],{},"CAD task visibility depends on server-side task catalog entries. Tasks created\nthrough Eden Forge task modules or ",[171,580,581],{},"forge_server_task_fnc_startTask"," are the\nnormal CAD-compatible task sources because they register task catalog data.",[155,584,585],{},"Direct handler or task-function calls only work with CAD when the task catalog\nentry already exists.",[159,587,589],{"id":588},"authorization-notes","Authorization Notes",[155,591,592],{},"Only dispatcher sessions can enter dispatch mode. If the hydrated session is\nnot a dispatcher, the bridge forces the UI back to operations mode.",[159,594,596],{"id":595},"related-guides","Related Guides",[188,598,599,604,608],{},[191,600,601],{},[602,603,65],"a",{"href":66},[191,605,606],{},[602,607,57],{"href":58},[191,609,610],{},[602,611,113],{"href":114},[613,614,615],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":617,"depth":617,"links":618},2,[619,620,621,622,623,624,625],{"id":161,"depth":617,"text":162},{"id":208,"depth":617,"text":209},{"id":253,"depth":617,"text":254},{"id":507,"depth":617,"text":508},{"id":574,"depth":617,"text":575},{"id":588,"depth":617,"text":589},{"id":595,"depth":617,"text":596},"md",null,{},true,{"title":125,"description":157},"PkqhI_PomRiB_5NhoA0fI40iHaGK26pYqhDGm9sj2iA",[633,635],{"title":121,"path":122,"stem":123,"description":634,"children":-1},"The client bank addon opens the bank and ATM browser UI, forwards banking\nrequests to the server bank addon, and pushes account updates back into the\nbrowser.",{"title":129,"path":130,"stem":131,"description":636,"children":-1},"The client garage addon provides player vehicle storage UI, vehicle\nstore\u002Fretrieve actions, selected nearby vehicle service requests, vehicle\ncontext building, and the virtual garage view.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/common.html b/docus/dist/client-addons/common.html index a742505..240e778 100644 --- a/docus/dist/client-addons/common.html +++ b/docus/dist/client-addons/common.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Common Usage Guide - forge-docus
    Client Addons

    Client Common Usage Guide

    The client common addon contains shared browser UI bridge declarations and common client-side browser integration patterns.

    Client Common Usage Guide

    The client common addon contains shared browser UI bridge declarations and @@ -125,4 +125,4 @@ to

    Client Actor Usage Guide

    The client actor addon owns the player interaction menu and client-side actor repository. It is the main launcher for nearby player actions and other Forge -client UIs.

    Copyright © 2026
    \ No newline at end of file +client UIs.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/client-addons/common/_payload.json b/docus/dist/client-addons/common/_payload.json index 9407a0a..c7351d5 100644 --- a/docus/dist/client-addons/common/_payload.json +++ b/docus/dist/client-addons/common/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":531},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-common":145,"-client-addons-common-surround":526},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":113,"body":147,"description":520,"extension":521,"links":522,"meta":523,"navigation":274,"path":114,"seo":524,"stem":115,"__hash__":525},"docs\u002F4.client-addons\u002F2.common.md",{"type":148,"value":149,"toc":511},"minimark",[150,154,163,168,175,200,203,207,210,233,236,300,304,310,369,376,380,383,432,443,447,450,454,480,484,507],[151,152,113],"h1",{"id":153},"client-common-usage-guide",[155,156,157,158,162],"p",{},"The client ",[159,160,161],"code",{},"common"," addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.",[164,165,167],"h2",{"id":166},"purpose","Purpose",[155,169,170,171,174],{},"Use ",[159,172,173],{},"forge_client_common"," when a browser-backed feature UI needs reusable\nscreen lifecycle behavior:",[176,177,178,182,185,188,194],"ul",{},[179,180,181],"li",{},"active browser control tracking",[179,183,184],{},"browser ready state",[179,186,187],{},"pending event queues",[179,189,190,193],{},[159,191,192],{},"ExecJS"," payload delivery",[179,195,196,197],{},"shared bridge object inheritance through ",[159,198,199],{},"createHashMapObject",[155,201,202],{},"Feature addons still own their app-specific events and server RPC mapping.",[164,204,206],{"id":205},"shared-bridge","Shared Bridge",[155,208,209],{},"Initialize the bridge declarations with:",[211,212,217],"pre",{"className":213,"code":214,"language":215,"meta":216,"style":216},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge;\nprivate _bridgeDeclaration = _webUIDeclarations get \"bridgeDeclaration\";\n","sqf","",[159,218,219,227],{"__ignoreMap":216},[220,221,224],"span",{"class":222,"line":223},"line",1,[220,225,226],{},"private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge;\n",[220,228,230],{"class":222,"line":229},2,[220,231,232],{},"private _bridgeDeclaration = _webUIDeclarations get \"bridgeDeclaration\";\n",[155,234,235],{},"Feature bridges can inherit from the shared declaration:",[211,237,239],{"className":213,"code":238,"language":215,"meta":216,"style":216},"GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [\n [\"#base\", _bridgeDeclaration],\n [\"#type\", \"MyUIBridgeBaseClass\"],\n [\"handleReady\", compileFinal {\n params [[\"_control\", controlNull, [controlNull]]];\n\n _self call [\"setActiveBrowserControl\", [_control]];\n _self call [\"sendEvent\", [\"myAddon::hydrate\", createHashMap, _control]];\n }]\n];\n",[159,240,241,246,251,257,263,269,276,282,288,294],{"__ignoreMap":216},[220,242,243],{"class":222,"line":223},[220,244,245],{},"GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [\n",[220,247,248],{"class":222,"line":229},[220,249,250],{}," [\"#base\", _bridgeDeclaration],\n",[220,252,254],{"class":222,"line":253},3,[220,255,256],{}," [\"#type\", \"MyUIBridgeBaseClass\"],\n",[220,258,260],{"class":222,"line":259},4,[220,261,262],{}," [\"handleReady\", compileFinal {\n",[220,264,266],{"class":222,"line":265},5,[220,267,268],{}," params [[\"_control\", controlNull, [controlNull]]];\n",[220,270,272],{"class":222,"line":271},6,[220,273,275],{"emptyLinePlaceholder":274},true,"\n",[220,277,279],{"class":222,"line":278},7,[220,280,281],{}," _self call [\"setActiveBrowserControl\", [_control]];\n",[220,283,285],{"class":222,"line":284},8,[220,286,287],{}," _self call [\"sendEvent\", [\"myAddon::hydrate\", createHashMap, _control]];\n",[220,289,291],{"class":222,"line":290},9,[220,292,293],{}," }]\n",[220,295,297],{"class":222,"line":296},10,[220,298,299],{},"];\n",[164,301,303],{"id":302},"event-delivery","Event Delivery",[155,305,306,309],{},[159,307,308],{},"sendEvent"," builds this payload:",[211,311,315],{"className":312,"code":313,"language":314,"meta":216,"style":216},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"event\": \"myAddon::event\",\n \"data\": {}\n}\n","json",[159,316,317,323,350,364],{"__ignoreMap":216},[220,318,319],{"class":222,"line":223},[220,320,322],{"class":321},"sMK4o","{\n",[220,324,325,328,332,335,338,341,345,347],{"class":222,"line":229},[220,326,327],{"class":321}," \"",[220,329,331],{"class":330},"spNyl","event",[220,333,334],{"class":321},"\"",[220,336,337],{"class":321},":",[220,339,340],{"class":321}," \"",[220,342,344],{"class":343},"sfazB","myAddon::event",[220,346,334],{"class":321},[220,348,349],{"class":321},",\n",[220,351,352,354,357,359,361],{"class":222,"line":253},[220,353,327],{"class":321},[220,355,356],{"class":330},"data",[220,358,334],{"class":321},[220,360,337],{"class":321},[220,362,363],{"class":321}," {}\n",[220,365,366],{"class":222,"line":259},[220,367,368],{"class":321},"}\n",[155,370,371,372,375],{},"If the browser control is missing or not ready, the payload is queued on the\nscreen object. When the screen marks ready, ",[159,373,374],{},"flushPendingEvents"," delivers the\nqueue.",[164,377,379],{"id":378},"screen-lifecycle","Screen Lifecycle",[155,381,382],{},"The shared screen object tracks:",[384,385,386,398],"table",{},[387,388,389],"thead",{},[390,391,392,396],"tr",{},[393,394,395],"th",{},"Field",[393,397,167],{},[399,400,401,412,422],"tbody",{},[390,402,403,409],{},[404,405,406],"td",{},[159,407,408],{},"control",[404,410,411],{},"Active browser control.",[390,413,414,419],{},[404,415,416],{},[159,417,418],{},"readyState",[404,420,421],{},"Whether the browser app has sent its ready event.",[390,423,424,429],{},[404,425,426],{},[159,427,428],{},"pendingEvents",[404,430,431],{},"Outbound events waiting for a ready browser.",[155,433,434,435,438,439,442],{},"Call ",[159,436,437],{},"handleClose"," or ",[159,440,441],{},"dispose"," when a display closes so stale controls and\nqueued events are cleared.",[164,444,446],{"id":445},"current-consumers","Current Consumers",[155,448,449],{},"The common bridge pattern is used by the newer bank, CAD, garage, and\norganization client bridges. Store currently keeps its own bridge object and\nbrowser bridge function names.",[164,451,453],{"id":452},"usage-rules","Usage Rules",[176,455,456,459,465,471,477],{},[179,457,458],{},"Keep bridge inheritance in feature addons thin and explicit.",[179,460,461,462,464],{},"Keep shared code generic; do not add bank, CAD, org, or store-specific logic\nto ",[159,463,161],{},".",[179,466,467,468,464],{},"Prefer namespaced events such as ",[159,469,470],{},"garage::sync",[179,472,473,474,464],{},"Send hash maps or arrays that can be safely serialized with ",[159,475,476],{},"toJSON",[179,478,479],{},"Avoid direct extension calls from the client bridge; send CBA server events.",[164,481,483],{"id":482},"related-guides","Related Guides",[176,485,486,491,495,499,503],{},[179,487,488],{},[489,490,99],"a",{"href":95},[179,492,493],{},[489,494,121],{"href":122},[179,496,497],{},[489,498,125],{"href":126},[179,500,501],{},[489,502,129],{"href":130},[179,504,505],{},[489,506,141],{"href":142},[508,509,510],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":216,"searchDepth":229,"depth":229,"links":512},[513,514,515,516,517,518,519],{"id":166,"depth":229,"text":167},{"id":205,"depth":229,"text":206},{"id":302,"depth":229,"text":303},{"id":378,"depth":229,"text":379},{"id":445,"depth":229,"text":446},{"id":452,"depth":229,"text":453},{"id":482,"depth":229,"text":483},"The client common addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.","md",null,{},{"title":113,"description":520},"y19oU7ALKU_ma2WFUqXb_vdzt_Y7Yt4fw-1V7_galCk",[527,529],{"title":109,"path":110,"stem":111,"description":528,"children":-1},"The client store addon provides the storefront browser UI for catalog browsing,\ncategory hydration, payment source display, cart handling, and checkout\nrequests.",{"title":117,"path":118,"stem":119,"description":530,"children":-1},"The client actor addon owns the player interaction menu and client-side actor\nrepository. It is the main launcher for nearby player actions and other Forge\nclient UIs.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":531},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-common":145,"-client-addons-common-surround":526},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":113,"body":147,"description":520,"extension":521,"links":522,"meta":523,"navigation":274,"path":114,"seo":524,"stem":115,"__hash__":525},"docs\u002F4.client-addons\u002F2.common.md",{"type":148,"value":149,"toc":511},"minimark",[150,154,163,168,175,200,203,207,210,233,236,300,304,310,369,376,380,383,432,443,447,450,454,480,484,507],[151,152,113],"h1",{"id":153},"client-common-usage-guide",[155,156,157,158,162],"p",{},"The client ",[159,160,161],"code",{},"common"," addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.",[164,165,167],"h2",{"id":166},"purpose","Purpose",[155,169,170,171,174],{},"Use ",[159,172,173],{},"forge_client_common"," when a browser-backed feature UI needs reusable\nscreen lifecycle behavior:",[176,177,178,182,185,188,194],"ul",{},[179,180,181],"li",{},"active browser control tracking",[179,183,184],{},"browser ready state",[179,186,187],{},"pending event queues",[179,189,190,193],{},[159,191,192],{},"ExecJS"," payload delivery",[179,195,196,197],{},"shared bridge object inheritance through ",[159,198,199],{},"createHashMapObject",[155,201,202],{},"Feature addons still own their app-specific events and server RPC mapping.",[164,204,206],{"id":205},"shared-bridge","Shared Bridge",[155,208,209],{},"Initialize the bridge declarations with:",[211,212,217],"pre",{"className":213,"code":214,"language":215,"meta":216,"style":216},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge;\nprivate _bridgeDeclaration = _webUIDeclarations get \"bridgeDeclaration\";\n","sqf","",[159,218,219,227],{"__ignoreMap":216},[220,221,224],"span",{"class":222,"line":223},"line",1,[220,225,226],{},"private _webUIDeclarations = call forge_client_common_fnc_initWebUIBridge;\n",[220,228,230],{"class":222,"line":229},2,[220,231,232],{},"private _bridgeDeclaration = _webUIDeclarations get \"bridgeDeclaration\";\n",[155,234,235],{},"Feature bridges can inherit from the shared declaration:",[211,237,239],{"className":213,"code":238,"language":215,"meta":216,"style":216},"GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [\n [\"#base\", _bridgeDeclaration],\n [\"#type\", \"MyUIBridgeBaseClass\"],\n [\"handleReady\", compileFinal {\n params [[\"_control\", controlNull, [controlNull]]];\n\n _self call [\"setActiveBrowserControl\", [_control]];\n _self call [\"sendEvent\", [\"myAddon::hydrate\", createHashMap, _control]];\n }]\n];\n",[159,240,241,246,251,257,263,269,276,282,288,294],{"__ignoreMap":216},[220,242,243],{"class":222,"line":223},[220,244,245],{},"GVAR(MyUIBridgeBaseClass) = compileFinal createHashMapFromArray [\n",[220,247,248],{"class":222,"line":229},[220,249,250],{}," [\"#base\", _bridgeDeclaration],\n",[220,252,254],{"class":222,"line":253},3,[220,255,256],{}," [\"#type\", \"MyUIBridgeBaseClass\"],\n",[220,258,260],{"class":222,"line":259},4,[220,261,262],{}," [\"handleReady\", compileFinal {\n",[220,264,266],{"class":222,"line":265},5,[220,267,268],{}," params [[\"_control\", controlNull, [controlNull]]];\n",[220,270,272],{"class":222,"line":271},6,[220,273,275],{"emptyLinePlaceholder":274},true,"\n",[220,277,279],{"class":222,"line":278},7,[220,280,281],{}," _self call [\"setActiveBrowserControl\", [_control]];\n",[220,283,285],{"class":222,"line":284},8,[220,286,287],{}," _self call [\"sendEvent\", [\"myAddon::hydrate\", createHashMap, _control]];\n",[220,289,291],{"class":222,"line":290},9,[220,292,293],{}," }]\n",[220,295,297],{"class":222,"line":296},10,[220,298,299],{},"];\n",[164,301,303],{"id":302},"event-delivery","Event Delivery",[155,305,306,309],{},[159,307,308],{},"sendEvent"," builds this payload:",[211,311,315],{"className":312,"code":313,"language":314,"meta":216,"style":216},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"event\": \"myAddon::event\",\n \"data\": {}\n}\n","json",[159,316,317,323,350,364],{"__ignoreMap":216},[220,318,319],{"class":222,"line":223},[220,320,322],{"class":321},"sMK4o","{\n",[220,324,325,328,332,335,338,341,345,347],{"class":222,"line":229},[220,326,327],{"class":321}," \"",[220,329,331],{"class":330},"spNyl","event",[220,333,334],{"class":321},"\"",[220,336,337],{"class":321},":",[220,339,340],{"class":321}," \"",[220,342,344],{"class":343},"sfazB","myAddon::event",[220,346,334],{"class":321},[220,348,349],{"class":321},",\n",[220,351,352,354,357,359,361],{"class":222,"line":253},[220,353,327],{"class":321},[220,355,356],{"class":330},"data",[220,358,334],{"class":321},[220,360,337],{"class":321},[220,362,363],{"class":321}," {}\n",[220,365,366],{"class":222,"line":259},[220,367,368],{"class":321},"}\n",[155,370,371,372,375],{},"If the browser control is missing or not ready, the payload is queued on the\nscreen object. When the screen marks ready, ",[159,373,374],{},"flushPendingEvents"," delivers the\nqueue.",[164,377,379],{"id":378},"screen-lifecycle","Screen Lifecycle",[155,381,382],{},"The shared screen object tracks:",[384,385,386,398],"table",{},[387,388,389],"thead",{},[390,391,392,396],"tr",{},[393,394,395],"th",{},"Field",[393,397,167],{},[399,400,401,412,422],"tbody",{},[390,402,403,409],{},[404,405,406],"td",{},[159,407,408],{},"control",[404,410,411],{},"Active browser control.",[390,413,414,419],{},[404,415,416],{},[159,417,418],{},"readyState",[404,420,421],{},"Whether the browser app has sent its ready event.",[390,423,424,429],{},[404,425,426],{},[159,427,428],{},"pendingEvents",[404,430,431],{},"Outbound events waiting for a ready browser.",[155,433,434,435,438,439,442],{},"Call ",[159,436,437],{},"handleClose"," or ",[159,440,441],{},"dispose"," when a display closes so stale controls and\nqueued events are cleared.",[164,444,446],{"id":445},"current-consumers","Current Consumers",[155,448,449],{},"The common bridge pattern is used by the newer bank, CAD, garage, and\norganization client bridges. Store currently keeps its own bridge object and\nbrowser bridge function names.",[164,451,453],{"id":452},"usage-rules","Usage Rules",[176,455,456,459,465,471,477],{},[179,457,458],{},"Keep bridge inheritance in feature addons thin and explicit.",[179,460,461,462,464],{},"Keep shared code generic; do not add bank, CAD, org, or store-specific logic\nto ",[159,463,161],{},".",[179,466,467,468,464],{},"Prefer namespaced events such as ",[159,469,470],{},"garage::sync",[179,472,473,474,464],{},"Send hash maps or arrays that can be safely serialized with ",[159,475,476],{},"toJSON",[179,478,479],{},"Avoid direct extension calls from the client bridge; send CBA server events.",[164,481,483],{"id":482},"related-guides","Related Guides",[176,485,486,491,495,499,503],{},[179,487,488],{},[489,490,99],"a",{"href":95},[179,492,493],{},[489,494,121],{"href":122},[179,496,497],{},[489,498,125],{"href":126},[179,500,501],{},[489,502,129],{"href":130},[179,504,505],{},[489,506,141],{"href":142},[508,509,510],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":216,"searchDepth":229,"depth":229,"links":512},[513,514,515,516,517,518,519],{"id":166,"depth":229,"text":167},{"id":205,"depth":229,"text":206},{"id":302,"depth":229,"text":303},{"id":378,"depth":229,"text":379},{"id":445,"depth":229,"text":446},{"id":452,"depth":229,"text":453},{"id":482,"depth":229,"text":483},"The client common addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.","md",null,{},{"title":113,"description":520},"y19oU7ALKU_ma2WFUqXb_vdzt_Y7Yt4fw-1V7_galCk",[527,529],{"title":109,"path":110,"stem":111,"description":528,"children":-1},"The client store addon provides the storefront browser UI for catalog browsing,\ncategory hydration, payment source display, cart handling, and checkout\nrequests.",{"title":117,"path":118,"stem":119,"description":530,"children":-1},"The client actor addon owns the player interaction menu and client-side actor\nrepository. It is the main launcher for nearby player actions and other Forge\nclient UIs.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/garage.html b/docus/dist/client-addons/garage.html index 3fd96e3..582e0a0 100644 --- a/docus/dist/client-addons/garage.html +++ b/docus/dist/client-addons/garage.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Garage Usage Guide - forge-docusRelated Guides
    Copyright © 2026
    \ No newline at end of file +container behavior, and virtual arsenal unlock state.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/client-addons/garage/_payload.json b/docus/dist/client-addons/garage/_payload.json index c13eee1..527852e 100644 --- a/docus/dist/client-addons/garage/_payload.json +++ b/docus/dist/client-addons/garage/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":558},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-garage":145,"-client-addons-garage-surround":553},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":129,"body":147,"description":157,"extension":547,"links":548,"meta":549,"navigation":550,"path":130,"seo":551,"stem":131,"__hash__":552},"docs\u002F4.client-addons\u002F6.garage.md",{"type":148,"value":149,"toc":536},"minimark",[150,154,158,163,180,195,199,208,215,219,309,313,403,407,457,460,464,467,478,482,485,501,504,508,511,515,532],[151,152,129],"h1",{"id":153},"client-garage-usage-guide",[155,156,157],"p",{},"The client garage addon provides player vehicle storage UI, vehicle\nstore\u002Fretrieve actions, selected nearby vehicle service requests, vehicle\ncontext building, and the virtual garage view.",[159,160,162],"h2",{"id":161},"open-garage-ui","Open Garage UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_garage_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The garage UI opens ",[171,184,185],{},"RscGarage",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes\nbrowser events through ",[171,192,193],{},"forge_client_garage_fnc_handleUIEvents",".",[159,196,198],{"id":197},"open-virtual-garage","Open Virtual Garage",[164,200,202],{"className":166,"code":201,"language":168,"meta":169,"style":169},"call forge_client_garage_fnc_openVG;\n",[171,203,204],{"__ignoreMap":169},[174,205,206],{"class":176,"line":177},[174,207,201],{},[155,209,210,211,214],{},"The virtual garage uses mission-configured ",[171,212,213],{},"FORGE_CfgGarages"," locations to set\nthe spawn\u002Fpreview position, opens the BIS garage interface, and restricts the\navailable vehicle lists from the virtual garage repository.",[159,216,218],{"id":217},"client-services","Client Services",[220,221,222,235],"table",{},[223,224,225],"thead",{},[226,227,228,232],"tr",{},[229,230,231],"th",{},"Service",[229,233,234],{},"Purpose",[236,237,238,249,259,269,279,289,299],"tbody",{},[226,239,240,246],{},[241,242,243],"td",{},[171,244,245],{},"GarageRepository",[241,247,248],{},"Player garage view state.",[226,250,251,256],{},[241,252,253],{},[171,254,255],{},"VGRepository",[241,257,258],{},"Virtual garage unlock view state.",[226,260,261,266],{},[241,262,263],{},[171,264,265],{},"GarageHelperService",[241,267,268],{},"Vehicle names, hit points, and payload helpers.",[226,270,271,276],{},[241,272,273],{},[171,274,275],{},"GarageContextService",[241,277,278],{},"Nearby\u002Fcurrent vehicle context.",[226,280,281,286],{},[241,282,283],{},[171,284,285],{},"GaragePayloadService",[241,287,288],{},"Browser hydrate payload construction.",[226,290,291,296],{},[241,292,293],{},[171,294,295],{},"GarageActionService",[241,297,298],{},"Store\u002Fretrieve request handling and selected nearby vehicle refuel\u002Frepair request forwarding.",[226,300,301,306],{},[241,302,303],{},[171,304,305],{},"GarageUIBridge",[241,307,308],{},"Browser ready, hydrate, and sync delivery.",[159,310,312],{"id":311},"browser-events","Browser Events",[220,314,315,325],{},[223,316,317],{},[226,318,319,322],{},[229,320,321],{},"Event",[229,323,324],{},"Client behavior",[236,326,327,340,353,363,373,383,393],{},[226,328,329,334],{},[241,330,331],{},[171,332,333],{},"garage::ready",[241,335,336,337,194],{},"Mark browser ready and send ",[171,338,339],{},"garage::hydrate",[226,341,342,347],{},[241,343,344],{},[171,345,346],{},"garage::refresh",[241,348,349,350,194],{},"Send current garage payload as ",[171,351,352],{},"garage::sync",[226,354,355,360],{},[241,356,357],{},[171,358,359],{},"garage::vehicle::retrieve::request",[241,361,362],{},"Forward retrieve request through the action service.",[226,364,365,370],{},[241,366,367],{},[171,368,369],{},"garage::vehicle::store::request",[241,371,372],{},"Forward store request through the action service.",[226,374,375,380],{},[241,376,377],{},[171,378,379],{},"garage::vehicle::refuel::request",[241,381,382],{},"Forward selected nearby vehicle refuel request to the server economy service.",[226,384,385,390],{},[241,386,387],{},[171,388,389],{},"garage::vehicle::repair::request",[241,391,392],{},"Forward selected nearby vehicle repair request to the server economy service.",[226,394,395,400],{},[241,396,397],{},[171,398,399],{},"garage::close",[241,401,402],{},"Dispose bridge screen state and close the display.",[159,404,406],{"id":405},"browser-response-events","Browser Response Events",[220,408,409,417],{},[223,410,411],{},[226,412,413,415],{},[229,414,321],{},[229,416,234],{},[236,418,419,428,437,447],{},[226,420,421,425],{},[241,422,423],{},[171,424,339],{},[241,426,427],{},"Initial vehicle and session payload.",[226,429,430,434],{},[241,431,432],{},[171,433,352],{},[241,435,436],{},"Refreshed vehicle payload.",[226,438,439,444],{},[241,440,441],{},[171,442,443],{},"garage::service::success",[241,445,446],{},"Browser notice for accepted refuel\u002Frepair requests.",[226,448,449,454],{},[241,450,451],{},[171,452,453],{},"garage::service::failure",[241,455,456],{},"Browser notice for rejected refuel\u002Frepair requests.",[155,458,459],{},"Server action responses are handled by the action service and notification\nflow.",[159,461,463],{"id":462},"vehicle-service","Vehicle Service",[155,465,466],{},"The selected vehicle detail panel includes refuel and repair actions for nearby\nworld vehicles. Stored records must be retrieved first because server economy\nservices operate on live vehicle objects, not stored garage records.",[155,468,469,470,473,474,477],{},"Refuel requests use the server economy ",[171,471,472],{},"RefuelService"," event. Repair requests\nuse the server economy ",[171,475,476],{},"RepairService"," event. Both services are billed by the\nserver economy addon through organization funds.",[159,479,481],{"id":480},"mission-setup","Mission Setup",[155,483,484],{},"Garage interactions are normally surfaced through the actor menu when nearby\nobjects have garage variables such as:",[164,486,488],{"className":166,"code":487,"language":168,"meta":169,"style":169},"_object setVariable [\"isGarage\", true, true];\n_object setVariable [\"garageType\", \"cars\", true];\n",[171,489,490,495],{"__ignoreMap":169},[174,491,492],{"class":176,"line":177},[174,493,494],{},"_object setVariable [\"isGarage\", true, true];\n",[174,496,498],{"class":176,"line":497},2,[174,499,500],{},"_object setVariable [\"garageType\", \"cars\", true];\n",[155,502,503],{},"Virtual garage access also requires configured garage locations in mission\nconfig so the preview\u002Fspawn position can be resolved.",[159,505,507],{"id":506},"authoritative-state","Authoritative State",[155,509,510],{},"The client gathers vehicle context and sends store\u002Fretrieve requests. Stored\nvehicle state, validation, spawning, removal, and persistence are owned by the\nserver garage addon and extension.",[159,512,514],{"id":513},"related-guides","Related Guides",[516,517,518,524,528],"ul",{},[519,520,521],"li",{},[522,523,73],"a",{"href":74},[519,525,526],{},[522,527,117],{"href":118},[519,529,530],{},[522,531,137],{"href":138},[533,534,535],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":497,"depth":497,"links":537},[538,539,540,541,542,543,544,545,546],{"id":161,"depth":497,"text":162},{"id":197,"depth":497,"text":198},{"id":217,"depth":497,"text":218},{"id":311,"depth":497,"text":312},{"id":405,"depth":497,"text":406},{"id":462,"depth":497,"text":463},{"id":480,"depth":497,"text":481},{"id":506,"depth":497,"text":507},{"id":513,"depth":497,"text":514},"md",null,{},true,{"title":129,"description":157},"FjY4rI8r7pbcqenAYzqgitXP9qYdvwrTtKlyd4O8aw8",[554,556],{"title":125,"path":126,"stem":127,"description":555,"children":-1},"The client CAD addon provides the map and dispatch UI for groups, active\ntasks, task assignment, dispatch orders, support requests, and task\nacknowledge\u002Fdecline workflows.",{"title":133,"path":134,"stem":135,"description":557,"children":-1},"The client locker addon manages personal locker display state, local locker\ncontainer behavior, and virtual arsenal unlock state.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":558},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-garage":145,"-client-addons-garage-surround":553},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":129,"body":147,"description":157,"extension":547,"links":548,"meta":549,"navigation":550,"path":130,"seo":551,"stem":131,"__hash__":552},"docs\u002F4.client-addons\u002F6.garage.md",{"type":148,"value":149,"toc":536},"minimark",[150,154,158,163,180,195,199,208,215,219,309,313,403,407,457,460,464,467,478,482,485,501,504,508,511,515,532],[151,152,129],"h1",{"id":153},"client-garage-usage-guide",[155,156,157],"p",{},"The client garage addon provides player vehicle storage UI, vehicle\nstore\u002Fretrieve actions, selected nearby vehicle service requests, vehicle\ncontext building, and the virtual garage view.",[159,160,162],"h2",{"id":161},"open-garage-ui","Open Garage UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_garage_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The garage UI opens ",[171,184,185],{},"RscGarage",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes\nbrowser events through ",[171,192,193],{},"forge_client_garage_fnc_handleUIEvents",".",[159,196,198],{"id":197},"open-virtual-garage","Open Virtual Garage",[164,200,202],{"className":166,"code":201,"language":168,"meta":169,"style":169},"call forge_client_garage_fnc_openVG;\n",[171,203,204],{"__ignoreMap":169},[174,205,206],{"class":176,"line":177},[174,207,201],{},[155,209,210,211,214],{},"The virtual garage uses mission-configured ",[171,212,213],{},"FORGE_CfgGarages"," locations to set\nthe spawn\u002Fpreview position, opens the BIS garage interface, and restricts the\navailable vehicle lists from the virtual garage repository.",[159,216,218],{"id":217},"client-services","Client Services",[220,221,222,235],"table",{},[223,224,225],"thead",{},[226,227,228,232],"tr",{},[229,230,231],"th",{},"Service",[229,233,234],{},"Purpose",[236,237,238,249,259,269,279,289,299],"tbody",{},[226,239,240,246],{},[241,242,243],"td",{},[171,244,245],{},"GarageRepository",[241,247,248],{},"Player garage view state.",[226,250,251,256],{},[241,252,253],{},[171,254,255],{},"VGRepository",[241,257,258],{},"Virtual garage unlock view state.",[226,260,261,266],{},[241,262,263],{},[171,264,265],{},"GarageHelperService",[241,267,268],{},"Vehicle names, hit points, and payload helpers.",[226,270,271,276],{},[241,272,273],{},[171,274,275],{},"GarageContextService",[241,277,278],{},"Nearby\u002Fcurrent vehicle context.",[226,280,281,286],{},[241,282,283],{},[171,284,285],{},"GaragePayloadService",[241,287,288],{},"Browser hydrate payload construction.",[226,290,291,296],{},[241,292,293],{},[171,294,295],{},"GarageActionService",[241,297,298],{},"Store\u002Fretrieve request handling and selected nearby vehicle refuel\u002Frepair request forwarding.",[226,300,301,306],{},[241,302,303],{},[171,304,305],{},"GarageUIBridge",[241,307,308],{},"Browser ready, hydrate, and sync delivery.",[159,310,312],{"id":311},"browser-events","Browser Events",[220,314,315,325],{},[223,316,317],{},[226,318,319,322],{},[229,320,321],{},"Event",[229,323,324],{},"Client behavior",[236,326,327,340,353,363,373,383,393],{},[226,328,329,334],{},[241,330,331],{},[171,332,333],{},"garage::ready",[241,335,336,337,194],{},"Mark browser ready and send ",[171,338,339],{},"garage::hydrate",[226,341,342,347],{},[241,343,344],{},[171,345,346],{},"garage::refresh",[241,348,349,350,194],{},"Send current garage payload as ",[171,351,352],{},"garage::sync",[226,354,355,360],{},[241,356,357],{},[171,358,359],{},"garage::vehicle::retrieve::request",[241,361,362],{},"Forward retrieve request through the action service.",[226,364,365,370],{},[241,366,367],{},[171,368,369],{},"garage::vehicle::store::request",[241,371,372],{},"Forward store request through the action service.",[226,374,375,380],{},[241,376,377],{},[171,378,379],{},"garage::vehicle::refuel::request",[241,381,382],{},"Forward selected nearby vehicle refuel request to the server economy service.",[226,384,385,390],{},[241,386,387],{},[171,388,389],{},"garage::vehicle::repair::request",[241,391,392],{},"Forward selected nearby vehicle repair request to the server economy service.",[226,394,395,400],{},[241,396,397],{},[171,398,399],{},"garage::close",[241,401,402],{},"Dispose bridge screen state and close the display.",[159,404,406],{"id":405},"browser-response-events","Browser Response Events",[220,408,409,417],{},[223,410,411],{},[226,412,413,415],{},[229,414,321],{},[229,416,234],{},[236,418,419,428,437,447],{},[226,420,421,425],{},[241,422,423],{},[171,424,339],{},[241,426,427],{},"Initial vehicle and session payload.",[226,429,430,434],{},[241,431,432],{},[171,433,352],{},[241,435,436],{},"Refreshed vehicle payload.",[226,438,439,444],{},[241,440,441],{},[171,442,443],{},"garage::service::success",[241,445,446],{},"Browser notice for accepted refuel\u002Frepair requests.",[226,448,449,454],{},[241,450,451],{},[171,452,453],{},"garage::service::failure",[241,455,456],{},"Browser notice for rejected refuel\u002Frepair requests.",[155,458,459],{},"Server action responses are handled by the action service and notification\nflow.",[159,461,463],{"id":462},"vehicle-service","Vehicle Service",[155,465,466],{},"The selected vehicle detail panel includes refuel and repair actions for nearby\nworld vehicles. Stored records must be retrieved first because server economy\nservices operate on live vehicle objects, not stored garage records.",[155,468,469,470,473,474,477],{},"Refuel requests use the server economy ",[171,471,472],{},"RefuelService"," event. Repair requests\nuse the server economy ",[171,475,476],{},"RepairService"," event. Both services are billed by the\nserver economy addon through organization funds.",[159,479,481],{"id":480},"mission-setup","Mission Setup",[155,483,484],{},"Garage interactions are normally surfaced through the actor menu when nearby\nobjects have garage variables such as:",[164,486,488],{"className":166,"code":487,"language":168,"meta":169,"style":169},"_object setVariable [\"isGarage\", true, true];\n_object setVariable [\"garageType\", \"cars\", true];\n",[171,489,490,495],{"__ignoreMap":169},[174,491,492],{"class":176,"line":177},[174,493,494],{},"_object setVariable [\"isGarage\", true, true];\n",[174,496,498],{"class":176,"line":497},2,[174,499,500],{},"_object setVariable [\"garageType\", \"cars\", true];\n",[155,502,503],{},"Virtual garage access also requires configured garage locations in mission\nconfig so the preview\u002Fspawn position can be resolved.",[159,505,507],{"id":506},"authoritative-state","Authoritative State",[155,509,510],{},"The client gathers vehicle context and sends store\u002Fretrieve requests. Stored\nvehicle state, validation, spawning, removal, and persistence are owned by the\nserver garage addon and extension.",[159,512,514],{"id":513},"related-guides","Related Guides",[516,517,518,524,528],"ul",{},[519,520,521],"li",{},[522,523,73],"a",{"href":74},[519,525,526],{},[522,527,117],{"href":118},[519,529,530],{},[522,531,137],{"href":138},[533,534,535],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":497,"depth":497,"links":537},[538,539,540,541,542,543,544,545,546],{"id":161,"depth":497,"text":162},{"id":197,"depth":497,"text":198},{"id":217,"depth":497,"text":218},{"id":311,"depth":497,"text":312},{"id":405,"depth":497,"text":406},{"id":462,"depth":497,"text":463},{"id":480,"depth":497,"text":481},{"id":506,"depth":497,"text":507},{"id":513,"depth":497,"text":514},"md",null,{},true,{"title":129,"description":157},"FjY4rI8r7pbcqenAYzqgitXP9qYdvwrTtKlyd4O8aw8",[554,556],{"title":125,"path":126,"stem":127,"description":555,"children":-1},"The client CAD addon provides the map and dispatch UI for groups, active\ntasks, task assignment, dispatch orders, support requests, and task\nacknowledge\u002Fdecline workflows.",{"title":133,"path":134,"stem":135,"description":557,"children":-1},"The client locker addon manages personal locker display state, local locker\ncontainer behavior, and virtual arsenal unlock state.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/locker.html b/docus/dist/client-addons/locker.html index aa21ce7..9a25a5f 100644 --- a/docus/dist/client-addons/locker.html +++ b/docus/dist/client-addons/locker.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Locker Usage Guide - forge-docus
    Client Addons

    Client Locker Usage Guide

    The client locker addon manages personal locker display state, local locker container behavior, and virtual arsenal unlock state.

    Client Locker Usage Guide

    The client locker addon manages personal locker display state, local locker @@ -112,4 +112,4 @@ those authoritative mission objects.

    Related Guides

    Copyright © 2026
    \ No newline at end of file +and local notification service used by Forge client and server modules.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/client-addons/locker/_payload.json b/docus/dist/client-addons/locker/_payload.json index b6a661a..2e42412 100644 --- a/docus/dist/client-addons/locker/_payload.json +++ b/docus/dist/client-addons/locker/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":434},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-locker":145,"-client-addons-locker-surround":429},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":133,"body":147,"description":157,"extension":423,"links":424,"meta":425,"navigation":426,"path":134,"seo":427,"stem":135,"__hash__":428},"docs\u002F4.client-addons\u002F7.locker.md",{"type":148,"value":149,"toc":415},"minimark",[150,154,158,163,174,182,185,208,212,223,226,239,242,253,257,264,267,327,330,339,343,346,363,366,370,380,383,392,396,411],[151,152,133],"h1",{"id":153},"client-locker-usage-guide",[155,156,157],"p",{},"The client locker addon manages personal locker display state, local locker\ncontainer behavior, and virtual arsenal unlock state.",[159,160,162],"h2",{"id":161},"repositories","Repositories",[155,164,165,169,170,173],{},[166,167,168],"code",{},"forge_client_locker_fnc_initRepository"," creates ",[166,171,172],{},"GVAR(LockerRepository)",".",[155,175,176,169,179,173],{},[166,177,178],{},"forge_client_locker_fnc_initVARepository",[166,180,181],{},"GVAR(VARepository)",[155,183,184],{},"Initialize locker state:",[186,187,192],"pre",{"className":188,"code":189,"language":190,"meta":191,"style":191},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GVAR(LockerRepository) call [\"init\", []];\nGVAR(VARepository) call [\"init\", []];\n","sqf","",[166,193,194,202],{"__ignoreMap":191},[195,196,199],"span",{"class":197,"line":198},"line",1,[195,200,201],{},"GVAR(LockerRepository) call [\"init\", []];\n",[195,203,205],{"class":197,"line":204},2,[195,206,207],{},"GVAR(VARepository) call [\"init\", []];\n",[159,209,211],{"id":210},"locker-container-flow","Locker Container Flow",[155,213,214,215,218,219,222],{},"The repository searches mission namespace variables whose names contain\n",[166,216,217],{},"locker"," and refer to objects. For each server\u002Fmission locker object, it creates\na local ",[166,220,221],{},"Box_NATO_Equip_F"," at the same position and attaches container event\nhandlers.",[155,224,225],{},"On container open:",[227,228,229,233,236],"ul",{},[230,231,232],"li",{},"the local container is cleared",[230,234,235],{},"cached locker items are inserted into the container",[230,237,238],{},"over-capacity warnings are emitted when the item count is above 25",[155,240,241],{},"On container close:",[227,243,244,247,250],{},[230,245,246],{},"cargo, nested container items, and weapon attachments are read back",[230,248,249],{},"the new locker map is sent to the server with the override request",[230,251,252],{},"the local repository cache is updated",[159,254,256],{"id":255},"virtual-arsenal-flow","Virtual Arsenal Flow",[155,258,259,260,263],{},"The virtual arsenal repository creates a local ",[166,261,262],{},"FORGE_Locker_Box"," and requests\nvirtual arsenal unlocks from the server.",[155,265,266],{},"As sync data arrives, it applies unlocks through ACE Arsenal:",[268,269,270,283],"table",{},[271,272,273],"thead",{},[274,275,276,280],"tr",{},[277,278,279],"th",{},"Data key",[277,281,282],{},"Client behavior",[284,285,286,297,307,317],"tbody",{},[274,287,288,294],{},[289,290,291],"td",{},[166,292,293],{},"items",[289,295,296],{},"Add virtual items.",[274,298,299,304],{},[289,300,301],{},[166,302,303],{},"weapons",[289,305,306],{},"Add virtual weapons.",[274,308,309,314],{},[289,310,311],{},[166,312,313],{},"magazines",[289,315,316],{},"Add virtual magazines.",[274,318,319,324],{},[289,320,321],{},[166,322,323],{},"backpacks",[289,325,326],{},"Add virtual backpacks.",[155,328,329],{},"The actor menu opens the virtual locker with:",[186,331,333],{"className":188,"code":332,"language":190,"meta":191,"style":191},"[FORGE_Locker_Box, player, false] spawn ace_arsenal_fnc_openBox;\n",[166,334,335],{"__ignoreMap":191},[195,336,337],{"class":197,"line":198},[195,338,332],{},[159,340,342],{"id":341},"server-events","Server Events",[155,344,345],{},"The client repository sends requests for:",[227,347,348,351,354,357,360],{},[230,349,350],{},"locker initialization",[230,352,353],{},"locker save",[230,355,356],{},"locker override after container close",[230,358,359],{},"virtual arsenal initialization",[230,361,362],{},"virtual arsenal save",[155,364,365],{},"The server locker addon and extension own the saved locker and virtual arsenal\nstate.",[159,367,369],{"id":368},"mission-setup","Mission Setup",[155,371,372,373,376,377,379],{},"Mission locker objects must be placed into ",[166,374,375],{},"missionNamespace"," with a variable\nname containing ",[166,378,217],{},". The client creates local interactive containers from\nthose authoritative mission objects.",[155,381,382],{},"Example:",[186,384,386],{"className":188,"code":385,"language":190,"meta":191,"style":191},"missionNamespace setVariable [\"forge_locker_alpha\", _lockerObject, true];\n",[166,387,388],{"__ignoreMap":191},[195,389,390],{"class":197,"line":198},[195,391,385],{},[159,393,395],{"id":394},"related-guides","Related Guides",[227,397,398,403,407],{},[230,399,400],{},[401,402,77],"a",{"href":78},[230,404,405],{},[401,406,85],{"href":86},[230,408,409],{},[401,410,117],{"href":118},[412,413,414],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":191,"searchDepth":204,"depth":204,"links":416},[417,418,419,420,421,422],{"id":161,"depth":204,"text":162},{"id":210,"depth":204,"text":211},{"id":255,"depth":204,"text":256},{"id":341,"depth":204,"text":342},{"id":368,"depth":204,"text":369},{"id":394,"depth":204,"text":395},"md",null,{},true,{"title":133,"description":157},"Xg6JIHaku-KiLc15y67lo3EujW_Zj6YTuSIMClw5vsM",[430,432],{"title":129,"path":130,"stem":131,"description":431,"children":-1},"The client garage addon provides player vehicle storage UI, vehicle\nstore\u002Fretrieve actions, selected nearby vehicle service requests, vehicle\ncontext building, and the virtual garage view.",{"title":137,"path":138,"stem":139,"description":433,"children":-1},"The client notifications addon owns the notification HUD, notification sound,\nand local notification service used by Forge client and server modules.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":434},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-locker":145,"-client-addons-locker-surround":429},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":133,"body":147,"description":157,"extension":423,"links":424,"meta":425,"navigation":426,"path":134,"seo":427,"stem":135,"__hash__":428},"docs\u002F4.client-addons\u002F7.locker.md",{"type":148,"value":149,"toc":415},"minimark",[150,154,158,163,174,182,185,208,212,223,226,239,242,253,257,264,267,327,330,339,343,346,363,366,370,380,383,392,396,411],[151,152,133],"h1",{"id":153},"client-locker-usage-guide",[155,156,157],"p",{},"The client locker addon manages personal locker display state, local locker\ncontainer behavior, and virtual arsenal unlock state.",[159,160,162],"h2",{"id":161},"repositories","Repositories",[155,164,165,169,170,173],{},[166,167,168],"code",{},"forge_client_locker_fnc_initRepository"," creates ",[166,171,172],{},"GVAR(LockerRepository)",".",[155,175,176,169,179,173],{},[166,177,178],{},"forge_client_locker_fnc_initVARepository",[166,180,181],{},"GVAR(VARepository)",[155,183,184],{},"Initialize locker state:",[186,187,192],"pre",{"className":188,"code":189,"language":190,"meta":191,"style":191},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GVAR(LockerRepository) call [\"init\", []];\nGVAR(VARepository) call [\"init\", []];\n","sqf","",[166,193,194,202],{"__ignoreMap":191},[195,196,199],"span",{"class":197,"line":198},"line",1,[195,200,201],{},"GVAR(LockerRepository) call [\"init\", []];\n",[195,203,205],{"class":197,"line":204},2,[195,206,207],{},"GVAR(VARepository) call [\"init\", []];\n",[159,209,211],{"id":210},"locker-container-flow","Locker Container Flow",[155,213,214,215,218,219,222],{},"The repository searches mission namespace variables whose names contain\n",[166,216,217],{},"locker"," and refer to objects. For each server\u002Fmission locker object, it creates\na local ",[166,220,221],{},"Box_NATO_Equip_F"," at the same position and attaches container event\nhandlers.",[155,224,225],{},"On container open:",[227,228,229,233,236],"ul",{},[230,231,232],"li",{},"the local container is cleared",[230,234,235],{},"cached locker items are inserted into the container",[230,237,238],{},"over-capacity warnings are emitted when the item count is above 25",[155,240,241],{},"On container close:",[227,243,244,247,250],{},[230,245,246],{},"cargo, nested container items, and weapon attachments are read back",[230,248,249],{},"the new locker map is sent to the server with the override request",[230,251,252],{},"the local repository cache is updated",[159,254,256],{"id":255},"virtual-arsenal-flow","Virtual Arsenal Flow",[155,258,259,260,263],{},"The virtual arsenal repository creates a local ",[166,261,262],{},"FORGE_Locker_Box"," and requests\nvirtual arsenal unlocks from the server.",[155,265,266],{},"As sync data arrives, it applies unlocks through ACE Arsenal:",[268,269,270,283],"table",{},[271,272,273],"thead",{},[274,275,276,280],"tr",{},[277,278,279],"th",{},"Data key",[277,281,282],{},"Client behavior",[284,285,286,297,307,317],"tbody",{},[274,287,288,294],{},[289,290,291],"td",{},[166,292,293],{},"items",[289,295,296],{},"Add virtual items.",[274,298,299,304],{},[289,300,301],{},[166,302,303],{},"weapons",[289,305,306],{},"Add virtual weapons.",[274,308,309,314],{},[289,310,311],{},[166,312,313],{},"magazines",[289,315,316],{},"Add virtual magazines.",[274,318,319,324],{},[289,320,321],{},[166,322,323],{},"backpacks",[289,325,326],{},"Add virtual backpacks.",[155,328,329],{},"The actor menu opens the virtual locker with:",[186,331,333],{"className":188,"code":332,"language":190,"meta":191,"style":191},"[FORGE_Locker_Box, player, false] spawn ace_arsenal_fnc_openBox;\n",[166,334,335],{"__ignoreMap":191},[195,336,337],{"class":197,"line":198},[195,338,332],{},[159,340,342],{"id":341},"server-events","Server Events",[155,344,345],{},"The client repository sends requests for:",[227,347,348,351,354,357,360],{},[230,349,350],{},"locker initialization",[230,352,353],{},"locker save",[230,355,356],{},"locker override after container close",[230,358,359],{},"virtual arsenal initialization",[230,361,362],{},"virtual arsenal save",[155,364,365],{},"The server locker addon and extension own the saved locker and virtual arsenal\nstate.",[159,367,369],{"id":368},"mission-setup","Mission Setup",[155,371,372,373,376,377,379],{},"Mission locker objects must be placed into ",[166,374,375],{},"missionNamespace"," with a variable\nname containing ",[166,378,217],{},". The client creates local interactive containers from\nthose authoritative mission objects.",[155,381,382],{},"Example:",[186,384,386],{"className":188,"code":385,"language":190,"meta":191,"style":191},"missionNamespace setVariable [\"forge_locker_alpha\", _lockerObject, true];\n",[166,387,388],{"__ignoreMap":191},[195,389,390],{"class":197,"line":198},[195,391,385],{},[159,393,395],{"id":394},"related-guides","Related Guides",[227,397,398,403,407],{},[230,399,400],{},[401,402,77],"a",{"href":78},[230,404,405],{},[401,406,85],{"href":86},[230,408,409],{},[401,410,117],{"href":118},[412,413,414],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":191,"searchDepth":204,"depth":204,"links":416},[417,418,419,420,421,422],{"id":161,"depth":204,"text":162},{"id":210,"depth":204,"text":211},{"id":255,"depth":204,"text":256},{"id":341,"depth":204,"text":342},{"id":368,"depth":204,"text":369},{"id":394,"depth":204,"text":395},"md",null,{},true,{"title":133,"description":157},"Xg6JIHaku-KiLc15y67lo3EujW_Zj6YTuSIMClw5vsM",[430,432],{"title":129,"path":130,"stem":131,"description":431,"children":-1},"The client garage addon provides player vehicle storage UI, vehicle\nstore\u002Fretrieve actions, selected nearby vehicle service requests, vehicle\ncontext building, and the virtual garage view.",{"title":137,"path":138,"stem":139,"description":433,"children":-1},"The client notifications addon owns the notification HUD, notification sound,\nand local notification service used by Forge client and server modules.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/main.html b/docus/dist/client-addons/main.html index f9d2f6e..b530044 100644 --- a/docus/dist/client-addons/main.html +++ b/docus/dist/client-addons/main.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Main Usage Guide - forge-docus
    Client Addons

    Client Main Usage Guide

    The client main addon provides the shared mod identity, version metadata, CBA settings, and macro foundation used by the Forge client addons.

    Client Main Usage Guide

    The client main addon provides the shared mod identity, version metadata, @@ -110,4 +110,4 @@ whole or to a client feature toggle.

    Copyright © 2026
    \ No newline at end of file +clocks, and alarms.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/client-addons/main/_payload.json b/docus/dist/client-addons/main/_payload.json index 0bc3e0b..ad778af 100644 --- a/docus/dist/client-addons/main/_payload.json +++ b/docus/dist/client-addons/main/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":379},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-main":145,"-client-addons-main-surround":374},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":101,"body":147,"description":367,"extension":368,"links":369,"meta":370,"navigation":371,"path":102,"seo":372,"stem":103,"__hash__":373},"docs\u002F4.client-addons\u002F1.main.md",{"type":148,"value":149,"toc":360},"minimark",[150,154,163,168,175,181,185,254,258,267,308,312,337,341,356],[151,152,101],"h1",{"id":153},"client-main-usage-guide",[155,156,157,158,162],"p",{},"The client ",[159,160,161],"code",{},"main"," addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.",[164,165,167],"h2",{"id":166},"purpose","Purpose",[155,169,170,171,174],{},"Use ",[159,172,173],{},"forge_client_main"," as the foundation dependency for client addons that\nneed Forge macros, function naming, settings, or mod-level configuration.",[155,176,177,178,180],{},"Feature logic should stay in the owning addon. ",[159,179,161],{}," should remain limited to\nshared client configuration and compile infrastructure.",[164,182,184],{"id":183},"key-files","Key Files",[186,187,188,200],"table",{},[189,190,191],"thead",{},[192,193,194,198],"tr",{},[195,196,197],"th",{},"File",[195,199,167],{},[201,202,203,214,224,234,244],"tbody",{},[192,204,205,211],{},[206,207,208],"td",{},[159,209,210],{},"script_mod.hpp",[206,212,213],{},"Client mod identity.",[192,215,216,221],{},[206,217,218],{},[159,219,220],{},"script_version.hpp",[206,222,223],{},"Client mod version values.",[192,225,226,231],{},[206,227,228],{},[159,229,230],{},"script_macros.hpp",[206,232,233],{},"Shared client macros.",[192,235,236,241],{},[206,237,238],{},[159,239,240],{},"CfgSettings.hpp",[206,242,243],{},"Client CBA settings.",[192,245,246,251],{},[206,247,248],{},[159,249,250],{},"config.cpp",[206,252,253],{},"Addon config and mod wiring.",[164,255,257],{"id":256},"dependency-pattern","Dependency Pattern",[155,259,260,261,263,264,266],{},"Feature addons normally depend on ",[159,262,173],{}," in their ",[159,265,250],{},".",[268,269,274],"pre",{"className":270,"code":271,"language":272,"meta":273,"style":273},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class forge_client_example {\n requiredAddons[] = {\n \"forge_client_main\"\n };\n};\n","cpp","",[159,275,276,284,290,296,302],{"__ignoreMap":273},[277,278,281],"span",{"class":279,"line":280},"line",1,[277,282,283],{},"class forge_client_example {\n",[277,285,287],{"class":279,"line":286},2,[277,288,289],{}," requiredAddons[] = {\n",[277,291,293],{"class":279,"line":292},3,[277,294,295],{}," \"forge_client_main\"\n",[277,297,299],{"class":279,"line":298},4,[277,300,301],{}," };\n",[277,303,305],{"class":279,"line":304},5,[277,306,307],{},"};\n",[164,309,311],{"id":310},"usage-notes","Usage Notes",[313,314,315,319,325,331],"ul",{},[316,317,318],"li",{},"Put domain UI, repositories, and event handling in feature addons.",[316,320,321,322,266],{},"Put reusable browser bridge behavior in ",[159,323,324],{},"forge_client_common",[316,326,327,328,266],{},"Put server-only behavior in ",[159,329,330],{},"arma\u002Fserver\u002Faddons",[316,332,333,334,336],{},"Keep settings in ",[159,335,240],{}," when they apply to the client mod as a\nwhole or to a client feature toggle.",[164,338,340],{"id":339},"related-guides","Related Guides",[313,342,343,348,352],{},[316,344,345],{},[346,347,99],"a",{"href":95},[316,349,350],{},[346,351,113],{"href":114},[316,353,354],{},[346,355,19],{"href":20},[357,358,359],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":273,"searchDepth":286,"depth":286,"links":361},[362,363,364,365,366],{"id":166,"depth":286,"text":167},{"id":183,"depth":286,"text":184},{"id":256,"depth":286,"text":257},{"id":310,"depth":286,"text":311},{"id":339,"depth":286,"text":340},"The client main addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.","md",null,{},true,{"title":101,"description":367},"Th6geljS-Lc2R7P9vy5TF75LdSxHFKrOUt7Rwds7sgM",[375,377],{"title":99,"path":95,"stem":96,"description":376,"children":-1},"Forge Client contains the Arma client-side addons that open player interfaces,\nhandle browser events, cache client-visible state, and forward authoritative\nrequests to the server addons.",{"title":105,"path":106,"stem":107,"description":378,"children":-1},"The client phone addon provides the in-game phone UI for contacts, SMS\nmessages, email, and local utility apps such as notes, calendar events, world\nclocks, and alarms.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":379},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-main":145,"-client-addons-main-surround":374},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":101,"body":147,"description":367,"extension":368,"links":369,"meta":370,"navigation":371,"path":102,"seo":372,"stem":103,"__hash__":373},"docs\u002F4.client-addons\u002F1.main.md",{"type":148,"value":149,"toc":360},"minimark",[150,154,163,168,175,181,185,254,258,267,308,312,337,341,356],[151,152,101],"h1",{"id":153},"client-main-usage-guide",[155,156,157,158,162],"p",{},"The client ",[159,160,161],"code",{},"main"," addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.",[164,165,167],"h2",{"id":166},"purpose","Purpose",[155,169,170,171,174],{},"Use ",[159,172,173],{},"forge_client_main"," as the foundation dependency for client addons that\nneed Forge macros, function naming, settings, or mod-level configuration.",[155,176,177,178,180],{},"Feature logic should stay in the owning addon. ",[159,179,161],{}," should remain limited to\nshared client configuration and compile infrastructure.",[164,182,184],{"id":183},"key-files","Key Files",[186,187,188,200],"table",{},[189,190,191],"thead",{},[192,193,194,198],"tr",{},[195,196,197],"th",{},"File",[195,199,167],{},[201,202,203,214,224,234,244],"tbody",{},[192,204,205,211],{},[206,207,208],"td",{},[159,209,210],{},"script_mod.hpp",[206,212,213],{},"Client mod identity.",[192,215,216,221],{},[206,217,218],{},[159,219,220],{},"script_version.hpp",[206,222,223],{},"Client mod version values.",[192,225,226,231],{},[206,227,228],{},[159,229,230],{},"script_macros.hpp",[206,232,233],{},"Shared client macros.",[192,235,236,241],{},[206,237,238],{},[159,239,240],{},"CfgSettings.hpp",[206,242,243],{},"Client CBA settings.",[192,245,246,251],{},[206,247,248],{},[159,249,250],{},"config.cpp",[206,252,253],{},"Addon config and mod wiring.",[164,255,257],{"id":256},"dependency-pattern","Dependency Pattern",[155,259,260,261,263,264,266],{},"Feature addons normally depend on ",[159,262,173],{}," in their ",[159,265,250],{},".",[268,269,274],"pre",{"className":270,"code":271,"language":272,"meta":273,"style":273},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class forge_client_example {\n requiredAddons[] = {\n \"forge_client_main\"\n };\n};\n","cpp","",[159,275,276,284,290,296,302],{"__ignoreMap":273},[277,278,281],"span",{"class":279,"line":280},"line",1,[277,282,283],{},"class forge_client_example {\n",[277,285,287],{"class":279,"line":286},2,[277,288,289],{}," requiredAddons[] = {\n",[277,291,293],{"class":279,"line":292},3,[277,294,295],{}," \"forge_client_main\"\n",[277,297,299],{"class":279,"line":298},4,[277,300,301],{}," };\n",[277,303,305],{"class":279,"line":304},5,[277,306,307],{},"};\n",[164,309,311],{"id":310},"usage-notes","Usage Notes",[313,314,315,319,325,331],"ul",{},[316,317,318],"li",{},"Put domain UI, repositories, and event handling in feature addons.",[316,320,321,322,266],{},"Put reusable browser bridge behavior in ",[159,323,324],{},"forge_client_common",[316,326,327,328,266],{},"Put server-only behavior in ",[159,329,330],{},"arma\u002Fserver\u002Faddons",[316,332,333,334,336],{},"Keep settings in ",[159,335,240],{}," when they apply to the client mod as a\nwhole or to a client feature toggle.",[164,338,340],{"id":339},"related-guides","Related Guides",[313,342,343,348,352],{},[316,344,345],{},[346,347,99],"a",{"href":95},[316,349,350],{},[346,351,113],{"href":114},[316,353,354],{},[346,355,19],{"href":20},[357,358,359],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":273,"searchDepth":286,"depth":286,"links":361},[362,363,364,365,366],{"id":166,"depth":286,"text":167},{"id":183,"depth":286,"text":184},{"id":256,"depth":286,"text":257},{"id":310,"depth":286,"text":311},{"id":339,"depth":286,"text":340},"The client main addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.","md",null,{},true,{"title":101,"description":367},"Th6geljS-Lc2R7P9vy5TF75LdSxHFKrOUt7Rwds7sgM",[375,377],{"title":99,"path":95,"stem":96,"description":376,"children":-1},"Forge Client contains the Arma client-side addons that open player interfaces,\nhandle browser events, cache client-visible state, and forward authoritative\nrequests to the server addons.",{"title":105,"path":106,"stem":107,"description":378,"children":-1},"The client phone addon provides the in-game phone UI for contacts, SMS\nmessages, email, and local utility apps such as notes, calendar events, world\nclocks, and alarms.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/notifications.html b/docus/dist/client-addons/notifications.html index 9739294..29d2790 100644 --- a/docus/dist/client-addons/notifications.html +++ b/docus/dist/client-addons/notifications.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Notifications Usage Guide - forge-docus
    Client Addons

    Client Notifications Usage Guide

    The client notifications addon owns the notification HUD, notification sound, and local notification service used by Forge client and server modules.

    Client Notifications Usage Guide

    The client notifications addon owns the notification HUD, notification sound, @@ -118,4 +118,4 @@ startup notification.

    Keep server-driven player feedback short and actionable.
  • Treat notification state as transient client UI state.
  • Do not use notifications as the only record of durable domain changes.
  • Copyright © 2026
    \ No newline at end of file +disband flows, assets, fleet, and treasury display.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/client-addons/notifications/_payload.json b/docus/dist/client-addons/notifications/_payload.json index 7b55327..7d41ccb 100644 --- a/docus/dist/client-addons/notifications/_payload.json +++ b/docus/dist/client-addons/notifications/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":440},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-notifications":145,"-client-addons-notifications-surround":435},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":137,"body":147,"description":157,"extension":429,"links":430,"meta":431,"navigation":432,"path":138,"seo":433,"stem":139,"__hash__":434},"docs\u002F4.client-addons\u002F8.notifications.md",{"type":148,"value":149,"toc":422},"minimark",[150,154,158,163,166,177,184,188,191,236,239,314,321,325,328,363,366,375,379,395,399,418],[151,152,137],"h1",{"id":153},"client-notifications-usage-guide",[155,156,157],"p",{},"The client notifications addon owns the notification HUD, notification sound,\nand local notification service used by Forge client and server modules.",[159,160,162],"h2",{"id":161},"runtime-behavior","Runtime Behavior",[155,164,165],{},"The notification display is created during client initialization. The browser\nHUD sends:",[167,168,174],"pre",{"className":169,"code":171,"language":172,"meta":173},[170],"language-text","notifications::ready\n","text","",[175,176,171],"code",{"__ignoreMap":173},[155,178,179,180,183],{},"When that event is received, ",[175,181,182],{},"NotificationService"," initializes and sends a\nstartup notification.",[159,185,187],{"id":186},"create-a-notification","Create a Notification",[155,189,190],{},"Use the notification service when available:",[167,192,196],{"className":193,"code":194,"language":195,"meta":173,"style":173},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GVAR(NotificationService) call [\"create\", [\n \"success\",\n \"Title\",\n \"Notification text.\",\n 4000\n]];\n","sqf",[175,197,198,206,212,218,224,230],{"__ignoreMap":173},[199,200,203],"span",{"class":201,"line":202},"line",1,[199,204,205],{},"GVAR(NotificationService) call [\"create\", [\n",[199,207,209],{"class":201,"line":208},2,[199,210,211],{}," \"success\",\n",[199,213,215],{"class":201,"line":214},3,[199,216,217],{}," \"Title\",\n",[199,219,221],{"class":201,"line":220},4,[199,222,223],{}," \"Notification text.\",\n",[199,225,227],{"class":201,"line":226},5,[199,228,229],{}," 4000\n",[199,231,233],{"class":201,"line":232},6,[199,234,235],{},"]];\n",[155,237,238],{},"Arguments:",[240,241,242,255],"table",{},[243,244,245],"thead",{},[246,247,248,252],"tr",{},[249,250,251],"th",{},"Argument",[249,253,254],{},"Purpose",[256,257,258,284,294,304],"tbody",{},[246,259,260,266],{},[261,262,263],"td",{},[175,264,265],{},"_type",[261,267,268,269,272,273,272,276,279,280,283],{},"Notification type, such as ",[175,270,271],{},"success",", ",[175,274,275],{},"info",[175,277,278],{},"warning",", or ",[175,281,282],{},"error",".",[246,285,286,291],{},[261,287,288],{},[175,289,290],{},"_title",[261,292,293],{},"Notification title.",[246,295,296,301],{},[261,297,298],{},[175,299,300],{},"_content",[261,302,303],{},"Notification body text.",[246,305,306,311],{},[261,307,308],{},[175,309,310],{},"_duration",[261,312,313],{},"Display duration in milliseconds.",[155,315,316,317,320],{},"The service dispatches a browser ",[175,318,319],{},"forge:notify"," custom event.",[159,322,324],{"id":323},"cba-event-surface","CBA Event Surface",[155,326,327],{},"Other addons can use the client notification event:",[167,329,331],{"className":193,"code":330,"language":195,"meta":173,"style":173},"[\"forge_client_notifications_recieveNotification\", [\n \"warning\",\n \"Garage\",\n \"Vehicle spawn position is blocked.\",\n 3000\n]] call CBA_fnc_localEvent;\n",[175,332,333,338,343,348,353,358],{"__ignoreMap":173},[199,334,335],{"class":201,"line":202},[199,336,337],{},"[\"forge_client_notifications_recieveNotification\", [\n",[199,339,340],{"class":201,"line":208},[199,341,342],{}," \"warning\",\n",[199,344,345],{"class":201,"line":214},[199,346,347],{}," \"Garage\",\n",[199,349,350],{"class":201,"line":220},[199,351,352],{}," \"Vehicle spawn position is blocked.\",\n",[199,354,355],{"class":201,"line":226},[199,356,357],{}," 3000\n",[199,359,360],{"class":201,"line":232},[199,361,362],{},"]] call CBA_fnc_localEvent;\n",[155,364,365],{},"The event payload is:",[167,367,369],{"className":193,"code":368,"language":195,"meta":173,"style":173},"[_type, _title, _content, _duration]\n",[175,370,371],{"__ignoreMap":173},[199,372,373],{"class":201,"line":202},[199,374,368],{},[159,376,378],{"id":377},"usage-rules","Usage Rules",[380,381,382,386,389,392],"ul",{},[383,384,385],"li",{},"Use the shared notification service instead of opening separate transient\nbrowser UIs.",[383,387,388],{},"Keep server-driven player feedback short and actionable.",[383,390,391],{},"Treat notification state as transient client UI state.",[383,393,394],{},"Do not use notifications as the only record of durable domain changes.",[159,396,398],{"id":397},"related-guides","Related Guides",[380,400,401,406,410,414],{},[383,402,403],{},[404,405,99],"a",{"href":95},[383,407,408],{},[404,409,129],{"href":130},[383,411,412],{},[404,413,121],{"href":122},[383,415,416],{},[404,417,109],{"href":110},[419,420,421],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":173,"searchDepth":208,"depth":208,"links":423},[424,425,426,427,428],{"id":161,"depth":208,"text":162},{"id":186,"depth":208,"text":187},{"id":323,"depth":208,"text":324},{"id":377,"depth":208,"text":378},{"id":397,"depth":208,"text":398},"md",null,{},true,{"title":137,"description":157},"P5hLsZEtZ07GJaZAEGp85RqGAXcXTLDP_pi2pwHR08o",[436,438],{"title":133,"path":134,"stem":135,"description":437,"children":-1},"The client locker addon manages personal locker display state, local locker\ncontainer behavior, and virtual arsenal unlock state.",{"title":141,"path":142,"stem":143,"description":439,"children":-1},"The client organization addon provides the organization portal UI and browser\nbridge for login, registration, membership, invites, credit lines, leave and\ndisband flows, assets, fleet, and treasury display.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":440},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-notifications":145,"-client-addons-notifications-surround":435},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":137,"body":147,"description":157,"extension":429,"links":430,"meta":431,"navigation":432,"path":138,"seo":433,"stem":139,"__hash__":434},"docs\u002F4.client-addons\u002F8.notifications.md",{"type":148,"value":149,"toc":422},"minimark",[150,154,158,163,166,177,184,188,191,236,239,314,321,325,328,363,366,375,379,395,399,418],[151,152,137],"h1",{"id":153},"client-notifications-usage-guide",[155,156,157],"p",{},"The client notifications addon owns the notification HUD, notification sound,\nand local notification service used by Forge client and server modules.",[159,160,162],"h2",{"id":161},"runtime-behavior","Runtime Behavior",[155,164,165],{},"The notification display is created during client initialization. The browser\nHUD sends:",[167,168,174],"pre",{"className":169,"code":171,"language":172,"meta":173},[170],"language-text","notifications::ready\n","text","",[175,176,171],"code",{"__ignoreMap":173},[155,178,179,180,183],{},"When that event is received, ",[175,181,182],{},"NotificationService"," initializes and sends a\nstartup notification.",[159,185,187],{"id":186},"create-a-notification","Create a Notification",[155,189,190],{},"Use the notification service when available:",[167,192,196],{"className":193,"code":194,"language":195,"meta":173,"style":173},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GVAR(NotificationService) call [\"create\", [\n \"success\",\n \"Title\",\n \"Notification text.\",\n 4000\n]];\n","sqf",[175,197,198,206,212,218,224,230],{"__ignoreMap":173},[199,200,203],"span",{"class":201,"line":202},"line",1,[199,204,205],{},"GVAR(NotificationService) call [\"create\", [\n",[199,207,209],{"class":201,"line":208},2,[199,210,211],{}," \"success\",\n",[199,213,215],{"class":201,"line":214},3,[199,216,217],{}," \"Title\",\n",[199,219,221],{"class":201,"line":220},4,[199,222,223],{}," \"Notification text.\",\n",[199,225,227],{"class":201,"line":226},5,[199,228,229],{}," 4000\n",[199,231,233],{"class":201,"line":232},6,[199,234,235],{},"]];\n",[155,237,238],{},"Arguments:",[240,241,242,255],"table",{},[243,244,245],"thead",{},[246,247,248,252],"tr",{},[249,250,251],"th",{},"Argument",[249,253,254],{},"Purpose",[256,257,258,284,294,304],"tbody",{},[246,259,260,266],{},[261,262,263],"td",{},[175,264,265],{},"_type",[261,267,268,269,272,273,272,276,279,280,283],{},"Notification type, such as ",[175,270,271],{},"success",", ",[175,274,275],{},"info",[175,277,278],{},"warning",", or ",[175,281,282],{},"error",".",[246,285,286,291],{},[261,287,288],{},[175,289,290],{},"_title",[261,292,293],{},"Notification title.",[246,295,296,301],{},[261,297,298],{},[175,299,300],{},"_content",[261,302,303],{},"Notification body text.",[246,305,306,311],{},[261,307,308],{},[175,309,310],{},"_duration",[261,312,313],{},"Display duration in milliseconds.",[155,315,316,317,320],{},"The service dispatches a browser ",[175,318,319],{},"forge:notify"," custom event.",[159,322,324],{"id":323},"cba-event-surface","CBA Event Surface",[155,326,327],{},"Other addons can use the client notification event:",[167,329,331],{"className":193,"code":330,"language":195,"meta":173,"style":173},"[\"forge_client_notifications_recieveNotification\", [\n \"warning\",\n \"Garage\",\n \"Vehicle spawn position is blocked.\",\n 3000\n]] call CBA_fnc_localEvent;\n",[175,332,333,338,343,348,353,358],{"__ignoreMap":173},[199,334,335],{"class":201,"line":202},[199,336,337],{},"[\"forge_client_notifications_recieveNotification\", [\n",[199,339,340],{"class":201,"line":208},[199,341,342],{}," \"warning\",\n",[199,344,345],{"class":201,"line":214},[199,346,347],{}," \"Garage\",\n",[199,349,350],{"class":201,"line":220},[199,351,352],{}," \"Vehicle spawn position is blocked.\",\n",[199,354,355],{"class":201,"line":226},[199,356,357],{}," 3000\n",[199,359,360],{"class":201,"line":232},[199,361,362],{},"]] call CBA_fnc_localEvent;\n",[155,364,365],{},"The event payload is:",[167,367,369],{"className":193,"code":368,"language":195,"meta":173,"style":173},"[_type, _title, _content, _duration]\n",[175,370,371],{"__ignoreMap":173},[199,372,373],{"class":201,"line":202},[199,374,368],{},[159,376,378],{"id":377},"usage-rules","Usage Rules",[380,381,382,386,389,392],"ul",{},[383,384,385],"li",{},"Use the shared notification service instead of opening separate transient\nbrowser UIs.",[383,387,388],{},"Keep server-driven player feedback short and actionable.",[383,390,391],{},"Treat notification state as transient client UI state.",[383,393,394],{},"Do not use notifications as the only record of durable domain changes.",[159,396,398],{"id":397},"related-guides","Related Guides",[380,400,401,406,410,414],{},[383,402,403],{},[404,405,99],"a",{"href":95},[383,407,408],{},[404,409,129],{"href":130},[383,411,412],{},[404,413,121],{"href":122},[383,415,416],{},[404,417,109],{"href":110},[419,420,421],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":173,"searchDepth":208,"depth":208,"links":423},[424,425,426,427,428],{"id":161,"depth":208,"text":162},{"id":186,"depth":208,"text":187},{"id":323,"depth":208,"text":324},{"id":377,"depth":208,"text":378},{"id":397,"depth":208,"text":398},"md",null,{},true,{"title":137,"description":157},"P5hLsZEtZ07GJaZAEGp85RqGAXcXTLDP_pi2pwHR08o",[436,438],{"title":133,"path":134,"stem":135,"description":437,"children":-1},"The client locker addon manages personal locker display state, local locker\ncontainer behavior, and virtual arsenal unlock state.",{"title":141,"path":142,"stem":143,"description":439,"children":-1},"The client organization addon provides the organization portal UI and browser\nbridge for login, registration, membership, invites, credit lines, leave and\ndisband flows, assets, fleet, and treasury display.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/organization.html b/docus/dist/client-addons/organization.html index fd30ec0..0eb7724 100644 --- a/docus/dist/client-addons/organization.html +++ b/docus/dist/client-addons/organization.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Organization Usage Guide - forge-docus

    Authoritative State

    Organization funds, reputation, membership, invites, credit lines, assets, fleet, and persistence are server-owned. The client portal only displays and requests changes.

    Client Notifications Usage Guide

    The client notifications addon owns the notification HUD, notification sound, -and local notification service used by Forge client and server modules.

    \ No newline at end of file +and local notification service used by Forge client and server modules.

    \ No newline at end of file diff --git a/docus/dist/client-addons/organization/_payload.json b/docus/dist/client-addons/organization/_payload.json index 7f62f20..d98a673 100644 --- a/docus/dist/client-addons/organization/_payload.json +++ b/docus/dist/client-addons/organization/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":771},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-organization":145,"-client-addons-organization-surround":768},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":141,"body":147,"description":157,"extension":762,"links":763,"meta":764,"navigation":765,"path":142,"seo":766,"stem":143,"__hash__":767},"docs\u002F4.client-addons\u002F9.organization.md",{"type":148,"value":149,"toc":753},"minimark",[150,154,158,163,180,195,199,205,211,236,240,366,370,541,545,548,593,596,667,670,719,723,726,730,749],[151,152,141],"h1",{"id":153},"client-organization-usage-guide",[155,156,157],"p",{},"The client organization addon provides the organization portal UI and browser\nbridge for login, registration, membership, invites, credit lines, leave and\ndisband flows, assets, fleet, and treasury display.",[159,160,162],"h2",{"id":161},"open-organization-ui","Open Organization UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_org_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The UI opens ",[171,184,185],{},"RscOrg",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes browser alerts\nthrough ",[171,192,193],{},"forge_client_org_fnc_handleUIEvents",".",[159,196,198],{"id":197},"repository-and-bridge","Repository and Bridge",[155,200,201,204],{},[171,202,203],{},"forge_client_org_fnc_initRepository"," caches organization portal state.",[155,206,207,210],{},[171,208,209],{},"forge_client_org_fnc_initUIBridge"," owns:",[212,213,214,218,221,224,227,230,233],"ul",{},[215,216,217],"li",{},"active browser control tracking",[215,219,220],{},"portal hydrate requests",[215,222,223],{},"create\u002Flogin response routing",[215,225,226],{},"leave and disband requests",[215,228,229],{},"credit-line assignment requests",[215,231,232],{},"invite, accept invite, and decline invite requests",[215,234,235],{},"targeted browser response events",[159,237,239],{"id":238},"browser-events","Browser Events",[241,242,243,256],"table",{},[244,245,246],"thead",{},[247,248,249,253],"tr",{},[250,251,252],"th",{},"Event",[250,254,255],{},"Client behavior",[257,258,259,273,286,296,306,316,326,336,346,356],"tbody",{},[247,260,261,267],{},[262,263,264],"td",{},[171,265,266],{},"org::ready",[262,268,269,270,194],{},"Mark browser ready and request ",[171,271,272],{},"org::sync",[247,274,275,280],{},[262,276,277],{},[171,278,279],{},"org::login::request",[262,281,282,283,194],{},"Request portal hydrate as ",[171,284,285],{},"org::login::success",[247,287,288,293],{},[262,289,290],{},[171,291,292],{},"org::create::request",[262,294,295],{},"Validate org name and request creation on server.",[247,297,298,303],{},[262,299,300],{},[171,301,302],{},"org::disband::request",[262,304,305],{},"Request disband on server.",[247,307,308,313],{},[262,309,310],{},[171,311,312],{},"org::leave::request",[262,314,315],{},"Request leave on server.",[247,317,318,323],{},[262,319,320],{},[171,321,322],{},"org::credit::request",[262,324,325],{},"Request credit-line assignment.",[247,327,328,333],{},[262,329,330],{},[171,331,332],{},"org::invite::request",[262,334,335],{},"Request member invite.",[247,337,338,343],{},[262,339,340],{},[171,341,342],{},"org::invite::accept",[262,344,345],{},"Accept invite by org ID.",[247,347,348,353],{},[262,349,350],{},[171,351,352],{},"org::invite::decline",[262,354,355],{},"Decline invite by org ID.",[247,357,358,363],{},[262,359,360],{},[171,361,362],{},"org::close",[262,364,365],{},"Close the display.",[159,367,369],{"id":368},"browser-response-events","Browser Response Events",[241,371,372,381],{},[244,373,374],{},[247,375,376,378],{},[250,377,252],{},[250,379,380],{},"Purpose",[257,382,383,392,401,411,421,431,441,451,461,471,481,491,501,511,521,531],{},[247,384,385,389],{},[262,386,387],{},[171,388,272],{},[262,390,391],{},"Full portal sync payload.",[247,393,394,398],{},[262,395,396],{},[171,397,285],{},[262,399,400],{},"Login hydrate payload.",[247,402,403,408],{},[262,404,405],{},[171,406,407],{},"org::create::success",[262,409,410],{},"Creation hydrate payload.",[247,412,413,418],{},[262,414,415],{},[171,416,417],{},"org::create::failure",[262,419,420],{},"Creation validation or server failure.",[247,422,423,428],{},[262,424,425],{},[171,426,427],{},"org::disband::success",[262,429,430],{},"Requester disband success.",[247,432,433,438],{},[262,434,435],{},[171,436,437],{},"org::disband::failure",[262,439,440],{},"Disband failure.",[247,442,443,448],{},[262,444,445],{},[171,446,447],{},"org::portal::revoked",[262,449,450],{},"Portal state revoked by someone else's disband action.",[247,452,453,458],{},[262,454,455],{},[171,456,457],{},"org::leave::success",[262,459,460],{},"Leave success.",[247,462,463,468],{},[262,464,465],{},[171,466,467],{},"org::leave::failure",[262,469,470],{},"Leave failure.",[247,472,473,478],{},[262,474,475],{},[171,476,477],{},"org::credit::success",[262,479,480],{},"Credit-line request success.",[247,482,483,488],{},[262,484,485],{},[171,486,487],{},"org::credit::failure",[262,489,490],{},"Credit-line request failure.",[247,492,493,498],{},[262,494,495],{},[171,496,497],{},"org::member::creditUpdated",[262,499,500],{},"Targeted member credit-line patch.",[247,502,503,508],{},[262,504,505],{},[171,506,507],{},"org::invite::success",[262,509,510],{},"Invite success.",[247,512,513,518],{},[262,514,515],{},[171,516,517],{},"org::invite::failure",[262,519,520],{},"Invite failure.",[247,522,523,528],{},[262,524,525],{},[171,526,527],{},"org::invite::decision::success",[262,529,530],{},"Invite accept\u002Fdecline success.",[247,532,533,538],{},[262,534,535],{},[171,536,537],{},"org::invite::decision::failure",[262,539,540],{},"Invite accept\u002Fdecline failure.",[159,542,544],{"id":543},"request-examples","Request Examples",[155,546,547],{},"Create organization request payload:",[164,549,553],{"className":550,"code":551,"language":552,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"orgName\": \"Example Logistics\"\n}\n","json",[171,554,555,561,587],{"__ignoreMap":169},[174,556,557],{"class":176,"line":177},[174,558,560],{"class":559},"sMK4o","{\n",[174,562,564,567,571,574,577,580,584],{"class":176,"line":563},2,[174,565,566],{"class":559}," \"",[174,568,570],{"class":569},"spNyl","orgName",[174,572,573],{"class":559},"\"",[174,575,576],{"class":559},":",[174,578,579],{"class":559}," \"",[174,581,583],{"class":582},"sfazB","Example Logistics",[174,585,586],{"class":559},"\"\n",[174,588,590],{"class":176,"line":589},3,[174,591,592],{"class":559},"}\n",[155,594,595],{},"Credit-line request payload:",[164,597,599],{"className":550,"code":598,"language":552,"meta":169,"style":169},"{\n \"memberUid\": \"76561198000000000\",\n \"memberName\": \"Player Name\",\n \"amount\": 2500\n}\n",[171,600,601,605,626,646,662],{"__ignoreMap":169},[174,602,603],{"class":176,"line":177},[174,604,560],{"class":559},[174,606,607,609,612,614,616,618,621,623],{"class":176,"line":563},[174,608,566],{"class":559},[174,610,611],{"class":569},"memberUid",[174,613,573],{"class":559},[174,615,576],{"class":559},[174,617,579],{"class":559},[174,619,620],{"class":582},"76561198000000000",[174,622,573],{"class":559},[174,624,625],{"class":559},",\n",[174,627,628,630,633,635,637,639,642,644],{"class":176,"line":589},[174,629,566],{"class":559},[174,631,632],{"class":569},"memberName",[174,634,573],{"class":559},[174,636,576],{"class":559},[174,638,579],{"class":559},[174,640,641],{"class":582},"Player Name",[174,643,573],{"class":559},[174,645,625],{"class":559},[174,647,649,651,654,656,658],{"class":176,"line":648},4,[174,650,566],{"class":559},[174,652,653],{"class":569},"amount",[174,655,573],{"class":559},[174,657,576],{"class":559},[174,659,661],{"class":660},"sbssI"," 2500\n",[174,663,665],{"class":176,"line":664},5,[174,666,592],{"class":559},[155,668,669],{},"Invite request payload:",[164,671,673],{"className":550,"code":672,"language":552,"meta":169,"style":169},"{\n \"targetUid\": \"76561198000000000\",\n \"targetName\": \"Player Name\"\n}\n",[171,674,675,679,698,715],{"__ignoreMap":169},[174,676,677],{"class":176,"line":177},[174,678,560],{"class":559},[174,680,681,683,686,688,690,692,694,696],{"class":176,"line":563},[174,682,566],{"class":559},[174,684,685],{"class":569},"targetUid",[174,687,573],{"class":559},[174,689,576],{"class":559},[174,691,579],{"class":559},[174,693,620],{"class":582},[174,695,573],{"class":559},[174,697,625],{"class":559},[174,699,700,702,705,707,709,711,713],{"class":176,"line":589},[174,701,566],{"class":559},[174,703,704],{"class":569},"targetName",[174,706,573],{"class":559},[174,708,576],{"class":559},[174,710,579],{"class":559},[174,712,641],{"class":582},[174,714,586],{"class":559},[174,716,717],{"class":176,"line":648},[174,718,592],{"class":559},[159,720,722],{"id":721},"authoritative-state","Authoritative State",[155,724,725],{},"Organization funds, reputation, membership, invites, credit lines, assets,\nfleet, and persistence are server-owned. The client portal only displays and\nrequests changes.",[159,727,729],{"id":728},"related-guides","Related Guides",[212,731,732,737,741,745],{},[215,733,734],{},[735,736,81],"a",{"href":82},[215,738,739],{},[735,740,113],{"href":114},[215,742,743],{},[735,744,121],{"href":122},[215,746,747],{},[735,748,109],{"href":110},[750,751,752],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":169,"searchDepth":563,"depth":563,"links":754},[755,756,757,758,759,760,761],{"id":161,"depth":563,"text":162},{"id":197,"depth":563,"text":198},{"id":238,"depth":563,"text":239},{"id":368,"depth":563,"text":369},{"id":543,"depth":563,"text":544},{"id":721,"depth":563,"text":722},{"id":728,"depth":563,"text":729},"md",null,{},true,{"title":141,"description":157},"55er24PBmMaI2LQjtirzxJhMPRLdoX0WEvJjQx-Ptgc",[769,763],{"title":137,"path":138,"stem":139,"description":770,"children":-1},"The client notifications addon owns the notification HUD, notification sound,\nand local notification service used by Forge client and server modules.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":771},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-organization":145,"-client-addons-organization-surround":768},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":141,"body":147,"description":157,"extension":762,"links":763,"meta":764,"navigation":765,"path":142,"seo":766,"stem":143,"__hash__":767},"docs\u002F4.client-addons\u002F9.organization.md",{"type":148,"value":149,"toc":753},"minimark",[150,154,158,163,180,195,199,205,211,236,240,366,370,541,545,548,593,596,667,670,719,723,726,730,749],[151,152,141],"h1",{"id":153},"client-organization-usage-guide",[155,156,157],"p",{},"The client organization addon provides the organization portal UI and browser\nbridge for login, registration, membership, invites, credit lines, leave and\ndisband flows, assets, fleet, and treasury display.",[159,160,162],"h2",{"id":161},"open-organization-ui","Open Organization UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_org_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The UI opens ",[171,184,185],{},"RscOrg",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes browser alerts\nthrough ",[171,192,193],{},"forge_client_org_fnc_handleUIEvents",".",[159,196,198],{"id":197},"repository-and-bridge","Repository and Bridge",[155,200,201,204],{},[171,202,203],{},"forge_client_org_fnc_initRepository"," caches organization portal state.",[155,206,207,210],{},[171,208,209],{},"forge_client_org_fnc_initUIBridge"," owns:",[212,213,214,218,221,224,227,230,233],"ul",{},[215,216,217],"li",{},"active browser control tracking",[215,219,220],{},"portal hydrate requests",[215,222,223],{},"create\u002Flogin response routing",[215,225,226],{},"leave and disband requests",[215,228,229],{},"credit-line assignment requests",[215,231,232],{},"invite, accept invite, and decline invite requests",[215,234,235],{},"targeted browser response events",[159,237,239],{"id":238},"browser-events","Browser Events",[241,242,243,256],"table",{},[244,245,246],"thead",{},[247,248,249,253],"tr",{},[250,251,252],"th",{},"Event",[250,254,255],{},"Client behavior",[257,258,259,273,286,296,306,316,326,336,346,356],"tbody",{},[247,260,261,267],{},[262,263,264],"td",{},[171,265,266],{},"org::ready",[262,268,269,270,194],{},"Mark browser ready and request ",[171,271,272],{},"org::sync",[247,274,275,280],{},[262,276,277],{},[171,278,279],{},"org::login::request",[262,281,282,283,194],{},"Request portal hydrate as ",[171,284,285],{},"org::login::success",[247,287,288,293],{},[262,289,290],{},[171,291,292],{},"org::create::request",[262,294,295],{},"Validate org name and request creation on server.",[247,297,298,303],{},[262,299,300],{},[171,301,302],{},"org::disband::request",[262,304,305],{},"Request disband on server.",[247,307,308,313],{},[262,309,310],{},[171,311,312],{},"org::leave::request",[262,314,315],{},"Request leave on server.",[247,317,318,323],{},[262,319,320],{},[171,321,322],{},"org::credit::request",[262,324,325],{},"Request credit-line assignment.",[247,327,328,333],{},[262,329,330],{},[171,331,332],{},"org::invite::request",[262,334,335],{},"Request member invite.",[247,337,338,343],{},[262,339,340],{},[171,341,342],{},"org::invite::accept",[262,344,345],{},"Accept invite by org ID.",[247,347,348,353],{},[262,349,350],{},[171,351,352],{},"org::invite::decline",[262,354,355],{},"Decline invite by org ID.",[247,357,358,363],{},[262,359,360],{},[171,361,362],{},"org::close",[262,364,365],{},"Close the display.",[159,367,369],{"id":368},"browser-response-events","Browser Response Events",[241,371,372,381],{},[244,373,374],{},[247,375,376,378],{},[250,377,252],{},[250,379,380],{},"Purpose",[257,382,383,392,401,411,421,431,441,451,461,471,481,491,501,511,521,531],{},[247,384,385,389],{},[262,386,387],{},[171,388,272],{},[262,390,391],{},"Full portal sync payload.",[247,393,394,398],{},[262,395,396],{},[171,397,285],{},[262,399,400],{},"Login hydrate payload.",[247,402,403,408],{},[262,404,405],{},[171,406,407],{},"org::create::success",[262,409,410],{},"Creation hydrate payload.",[247,412,413,418],{},[262,414,415],{},[171,416,417],{},"org::create::failure",[262,419,420],{},"Creation validation or server failure.",[247,422,423,428],{},[262,424,425],{},[171,426,427],{},"org::disband::success",[262,429,430],{},"Requester disband success.",[247,432,433,438],{},[262,434,435],{},[171,436,437],{},"org::disband::failure",[262,439,440],{},"Disband failure.",[247,442,443,448],{},[262,444,445],{},[171,446,447],{},"org::portal::revoked",[262,449,450],{},"Portal state revoked by someone else's disband action.",[247,452,453,458],{},[262,454,455],{},[171,456,457],{},"org::leave::success",[262,459,460],{},"Leave success.",[247,462,463,468],{},[262,464,465],{},[171,466,467],{},"org::leave::failure",[262,469,470],{},"Leave failure.",[247,472,473,478],{},[262,474,475],{},[171,476,477],{},"org::credit::success",[262,479,480],{},"Credit-line request success.",[247,482,483,488],{},[262,484,485],{},[171,486,487],{},"org::credit::failure",[262,489,490],{},"Credit-line request failure.",[247,492,493,498],{},[262,494,495],{},[171,496,497],{},"org::member::creditUpdated",[262,499,500],{},"Targeted member credit-line patch.",[247,502,503,508],{},[262,504,505],{},[171,506,507],{},"org::invite::success",[262,509,510],{},"Invite success.",[247,512,513,518],{},[262,514,515],{},[171,516,517],{},"org::invite::failure",[262,519,520],{},"Invite failure.",[247,522,523,528],{},[262,524,525],{},[171,526,527],{},"org::invite::decision::success",[262,529,530],{},"Invite accept\u002Fdecline success.",[247,532,533,538],{},[262,534,535],{},[171,536,537],{},"org::invite::decision::failure",[262,539,540],{},"Invite accept\u002Fdecline failure.",[159,542,544],{"id":543},"request-examples","Request Examples",[155,546,547],{},"Create organization request payload:",[164,549,553],{"className":550,"code":551,"language":552,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"orgName\": \"Example Logistics\"\n}\n","json",[171,554,555,561,587],{"__ignoreMap":169},[174,556,557],{"class":176,"line":177},[174,558,560],{"class":559},"sMK4o","{\n",[174,562,564,567,571,574,577,580,584],{"class":176,"line":563},2,[174,565,566],{"class":559}," \"",[174,568,570],{"class":569},"spNyl","orgName",[174,572,573],{"class":559},"\"",[174,575,576],{"class":559},":",[174,578,579],{"class":559}," \"",[174,581,583],{"class":582},"sfazB","Example Logistics",[174,585,586],{"class":559},"\"\n",[174,588,590],{"class":176,"line":589},3,[174,591,592],{"class":559},"}\n",[155,594,595],{},"Credit-line request payload:",[164,597,599],{"className":550,"code":598,"language":552,"meta":169,"style":169},"{\n \"memberUid\": \"76561198000000000\",\n \"memberName\": \"Player Name\",\n \"amount\": 2500\n}\n",[171,600,601,605,626,646,662],{"__ignoreMap":169},[174,602,603],{"class":176,"line":177},[174,604,560],{"class":559},[174,606,607,609,612,614,616,618,621,623],{"class":176,"line":563},[174,608,566],{"class":559},[174,610,611],{"class":569},"memberUid",[174,613,573],{"class":559},[174,615,576],{"class":559},[174,617,579],{"class":559},[174,619,620],{"class":582},"76561198000000000",[174,622,573],{"class":559},[174,624,625],{"class":559},",\n",[174,627,628,630,633,635,637,639,642,644],{"class":176,"line":589},[174,629,566],{"class":559},[174,631,632],{"class":569},"memberName",[174,634,573],{"class":559},[174,636,576],{"class":559},[174,638,579],{"class":559},[174,640,641],{"class":582},"Player Name",[174,643,573],{"class":559},[174,645,625],{"class":559},[174,647,649,651,654,656,658],{"class":176,"line":648},4,[174,650,566],{"class":559},[174,652,653],{"class":569},"amount",[174,655,573],{"class":559},[174,657,576],{"class":559},[174,659,661],{"class":660},"sbssI"," 2500\n",[174,663,665],{"class":176,"line":664},5,[174,666,592],{"class":559},[155,668,669],{},"Invite request payload:",[164,671,673],{"className":550,"code":672,"language":552,"meta":169,"style":169},"{\n \"targetUid\": \"76561198000000000\",\n \"targetName\": \"Player Name\"\n}\n",[171,674,675,679,698,715],{"__ignoreMap":169},[174,676,677],{"class":176,"line":177},[174,678,560],{"class":559},[174,680,681,683,686,688,690,692,694,696],{"class":176,"line":563},[174,682,566],{"class":559},[174,684,685],{"class":569},"targetUid",[174,687,573],{"class":559},[174,689,576],{"class":559},[174,691,579],{"class":559},[174,693,620],{"class":582},[174,695,573],{"class":559},[174,697,625],{"class":559},[174,699,700,702,705,707,709,711,713],{"class":176,"line":589},[174,701,566],{"class":559},[174,703,704],{"class":569},"targetName",[174,706,573],{"class":559},[174,708,576],{"class":559},[174,710,579],{"class":559},[174,712,641],{"class":582},[174,714,586],{"class":559},[174,716,717],{"class":176,"line":648},[174,718,592],{"class":559},[159,720,722],{"id":721},"authoritative-state","Authoritative State",[155,724,725],{},"Organization funds, reputation, membership, invites, credit lines, assets,\nfleet, and persistence are server-owned. The client portal only displays and\nrequests changes.",[159,727,729],{"id":728},"related-guides","Related Guides",[212,731,732,737,741,745],{},[215,733,734],{},[735,736,81],"a",{"href":82},[215,738,739],{},[735,740,113],{"href":114},[215,742,743],{},[735,744,121],{"href":122},[215,746,747],{},[735,748,109],{"href":110},[750,751,752],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":169,"searchDepth":563,"depth":563,"links":754},[755,756,757,758,759,760,761],{"id":161,"depth":563,"text":162},{"id":197,"depth":563,"text":198},{"id":238,"depth":563,"text":239},{"id":368,"depth":563,"text":369},{"id":543,"depth":563,"text":544},{"id":721,"depth":563,"text":722},{"id":728,"depth":563,"text":729},"md",null,{},true,{"title":141,"description":157},"55er24PBmMaI2LQjtirzxJhMPRLdoX0WEvJjQx-Ptgc",[769,763],{"title":137,"path":138,"stem":139,"description":770,"children":-1},"The client notifications addon owns the notification HUD, notification sound,\nand local notification service used by Forge client and server modules.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/phone.html b/docus/dist/client-addons/phone.html index 0b71d5f..cdfe2c8 100644 --- a/docus/dist/client-addons/phone.html +++ b/docus/dist/client-addons/phone.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Phone Usage Guide - forge-docus

    Client Main Usage Guide

    The client main addon provides the shared mod identity, version metadata, CBA settings, and macro foundation used by the Forge client addons.

    Client Store Usage Guide

    The client store addon provides the storefront browser UI for catalog browsing, category hydration, payment source display, cart handling, and checkout -requests.

    \ No newline at end of file +requests.

    \ No newline at end of file diff --git a/docus/dist/client-addons/phone/_payload.json b/docus/dist/client-addons/phone/_payload.json index 66a137f..eb674c2 100644 --- a/docus/dist/client-addons/phone/_payload.json +++ b/docus/dist/client-addons/phone/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":718},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-phone":145,"-client-addons-phone-surround":713},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":105,"body":147,"description":157,"extension":707,"links":708,"meta":709,"navigation":710,"path":106,"seo":711,"stem":107,"__hash__":712},"docs\u002F4.client-addons\u002F10.phone.md",{"type":148,"value":149,"toc":691},"minimark",[150,154,158,163,180,195,199,202,209,228,232,241,244,248,253,308,312,383,387,449,453,505,509,651,655,672,676,687],[151,152,105],"h1",{"id":153},"client-phone-usage-guide",[155,156,157],"p",{},"The client phone addon provides the in-game phone UI for contacts, SMS\nmessages, email, and local utility apps such as notes, calendar events, world\nclocks, and alarms.",[159,160,162],"h2",{"id":161},"open-phone-ui","Open Phone UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_phone_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The phone UI creates ",[171,184,185],{},"RscPhone",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes\nbrowser alerts through ",[171,192,193],{},"forge_client_phone_fnc_handleUIEvents",".",[159,196,198],{"id":197},"state-ownership","State Ownership",[155,200,201],{},"Contacts, messages, and emails are server-owned and requested through the\nserver phone addon.",[155,203,204,205,208],{},"Local utility app state is stored in ",[171,206,207],{},"profileNamespace",":",[210,211,212,216,219,222,225],"ul",{},[213,214,215],"li",{},"notes",[213,217,218],{},"calendar events",[213,220,221],{},"world clocks",[213,223,224],{},"alarms",[213,226,227],{},"theme\u002Fpreferences",[159,229,231],{"id":230},"phone-class","Phone Class",[155,233,234,237,238,194],{},[171,235,236],{},"forge_client_phone_fnc_initClass"," creates ",[171,239,240],{},"GVAR(PhoneClass)",[155,242,243],{},"The phone class currently owns local notes, events, and settings helpers.\nContacts, messages, and emails continue to use server-backed request\u002Fresponse\nevents.",[159,245,247],{"id":246},"browser-events","Browser Events",[249,250,252],"h3",{"id":251},"session-and-preferences","Session and Preferences",[254,255,256,269],"table",{},[257,258,259],"thead",{},[260,261,262,266],"tr",{},[263,264,265],"th",{},"Event",[263,267,268],{},"Client behavior",[270,271,272,286,296],"tbody",{},[260,273,274,280],{},[275,276,277],"td",{},[171,278,279],{},"phone::get::player",[275,281,282,283,194],{},"Send player UID to browser with ",[171,284,285],{},"setPlayerUid",[260,287,288,293],{},[275,289,290],{},[171,291,292],{},"phone::get::theme",[275,294,295],{},"Send saved light\u002Fdark theme to browser.",[260,297,298,303],{},[275,299,300],{},[171,301,302],{},"phone::set::theme",[275,304,305,306,194],{},"Save theme preference to ",[171,307,207],{},[249,309,311],{"id":310},"contacts","Contacts",[254,313,314,322],{},[257,315,316],{},[260,317,318,320],{},[263,319,265],{},[263,321,268],{},[270,323,324,334,344,354,363,373],{},[260,325,326,331],{},[275,327,328],{},[171,329,330],{},"phone::get::contacts",[275,332,333],{},"Load cached contacts and request server refresh.",[260,335,336,341],{},[275,337,338],{},[171,339,340],{},"phone::refresh::contacts",[275,342,343],{},"Request contacts from server.",[260,345,346,351],{},[275,347,348],{},[171,349,350],{},"phone::add::contact",[275,352,353],{},"Add contact by phone number.",[260,355,356,361],{},[275,357,358],{},[171,359,360],{},"phone::add::contact::by::phone",[275,362,353],{},[260,364,365,370],{},[275,366,367],{},[171,368,369],{},"phone::add::contact::by::email",[275,371,372],{},"Add contact by email.",[260,374,375,380],{},[275,376,377],{},[171,378,379],{},"phone::remove::contact",[275,381,382],{},"Remove contact by UID.",[249,384,386],{"id":385},"messages","Messages",[254,388,389,397],{},[257,390,391],{},[260,392,393,395],{},[263,394,265],{},[263,396,268],{},[270,398,399,409,419,429,439],{},[260,400,401,406],{},[275,402,403],{},[171,404,405],{},"phone::get::messages",[275,407,408],{},"Request messages from server.",[260,410,411,416],{},[275,412,413],{},[171,414,415],{},"phone::get::message::thread",[275,417,418],{},"Request thread with another UID.",[260,420,421,426],{},[275,422,423],{},[171,424,425],{},"phone::send::message",[275,427,428],{},"Send SMS through server.",[260,430,431,436],{},[275,432,433],{},[171,434,435],{},"phone::mark::message::read",[275,437,438],{},"Mark message read on server.",[260,440,441,446],{},[275,442,443],{},[171,444,445],{},"phone::delete::message",[275,447,448],{},"Delete message on server.",[249,450,452],{"id":451},"email","Email",[254,454,455,463],{},[257,456,457],{},[260,458,459,461],{},[263,460,265],{},[263,462,268],{},[270,464,465,475,485,495],{},[260,466,467,472],{},[275,468,469],{},[171,470,471],{},"phone::get::emails",[275,473,474],{},"Request emails from server.",[260,476,477,482],{},[275,478,479],{},[171,480,481],{},"phone::send::email",[275,483,484],{},"Send email through server.",[260,486,487,492],{},[275,488,489],{},[171,490,491],{},"phone::mark::email::read",[275,493,494],{},"Mark email read on server.",[260,496,497,502],{},[275,498,499],{},[171,500,501],{},"phone::delete::email",[275,503,504],{},"Delete email on server.",[249,506,508],{"id":507},"local-utility-apps","Local Utility Apps",[254,510,511,519],{},[257,512,513],{},[260,514,515,517],{},[263,516,265],{},[263,518,268],{},[270,520,521,531,541,551,561,571,581,591,601,611,621,631,641],{},[260,522,523,528],{},[275,524,525],{},[171,526,527],{},"phone::get::notes",[275,529,530],{},"Load local notes.",[260,532,533,538],{},[275,534,535],{},[171,536,537],{},"phone::save::note",[275,539,540],{},"Save local note.",[260,542,543,548],{},[275,544,545],{},[171,546,547],{},"phone::delete::note",[275,549,550],{},"Delete local note.",[260,552,553,558],{},[275,554,555],{},[171,556,557],{},"phone::get::events",[275,559,560],{},"Load local calendar events.",[260,562,563,568],{},[275,564,565],{},[171,566,567],{},"phone::save::event",[275,569,570],{},"Save local calendar event.",[260,572,573,578],{},[275,574,575],{},[171,576,577],{},"phone::delete::event",[275,579,580],{},"Delete local calendar event.",[260,582,583,588],{},[275,584,585],{},[171,586,587],{},"phone::get::clocks",[275,589,590],{},"Load local world clocks.",[260,592,593,598],{},[275,594,595],{},[171,596,597],{},"phone::save::clock",[275,599,600],{},"Save local world clock.",[260,602,603,608],{},[275,604,605],{},[171,606,607],{},"phone::delete::clock",[275,609,610],{},"Delete local world clock.",[260,612,613,618],{},[275,614,615],{},[171,616,617],{},"phone::get::alarms",[275,619,620],{},"Load local alarms.",[260,622,623,628],{},[275,624,625],{},[171,626,627],{},"phone::save::alarm",[275,629,630],{},"Save local alarm.",[260,632,633,638],{},[275,634,635],{},[171,636,637],{},"phone::delete::alarm",[275,639,640],{},"Delete local alarm.",[260,642,643,648],{},[275,644,645],{},[171,646,647],{},"phone::toggle::alarm",[275,649,650],{},"Toggle local alarm enabled state.",[159,652,654],{"id":653},"usage-rules","Usage Rules",[210,656,657,660,666,669],{},[213,658,659],{},"Send contact, message, and email mutations to the server phone addon.",[213,661,662,663,665],{},"Keep local-only utility apps in ",[171,664,207],{}," until they are migrated to\nserver-backed storage.",[213,667,668],{},"Do not treat local phone utility state as shared multiplayer state.",[213,670,671],{},"Validate required UID, phone, email, subject, and message fields before\nsending server requests.",[159,673,675],{"id":674},"related-guides","Related Guides",[210,677,678,683],{},[213,679,680],{},[681,682,89],"a",{"href":90},[213,684,685],{},[681,686,137],{"href":138},[688,689,690],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":692,"depth":692,"links":693},2,[694,695,696,697,705,706],{"id":161,"depth":692,"text":162},{"id":197,"depth":692,"text":198},{"id":230,"depth":692,"text":231},{"id":246,"depth":692,"text":247,"children":698},[699,701,702,703,704],{"id":251,"depth":700,"text":252},3,{"id":310,"depth":700,"text":311},{"id":385,"depth":700,"text":386},{"id":451,"depth":700,"text":452},{"id":507,"depth":700,"text":508},{"id":653,"depth":692,"text":654},{"id":674,"depth":692,"text":675},"md",null,{},true,{"title":105,"description":157},"0NTtS9Y0Ou2ZP0DjQSKm3TT1mcZwqsRjnA5q7p__qdo",[714,716],{"title":101,"path":102,"stem":103,"description":715,"children":-1},"The client main addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.",{"title":109,"path":110,"stem":111,"description":717,"children":-1},"The client store addon provides the storefront browser UI for catalog browsing,\ncategory hydration, payment source display, cart handling, and checkout\nrequests.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":718},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-phone":145,"-client-addons-phone-surround":713},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":105,"body":147,"description":157,"extension":707,"links":708,"meta":709,"navigation":710,"path":106,"seo":711,"stem":107,"__hash__":712},"docs\u002F4.client-addons\u002F10.phone.md",{"type":148,"value":149,"toc":691},"minimark",[150,154,158,163,180,195,199,202,209,228,232,241,244,248,253,308,312,383,387,449,453,505,509,651,655,672,676,687],[151,152,105],"h1",{"id":153},"client-phone-usage-guide",[155,156,157],"p",{},"The client phone addon provides the in-game phone UI for contacts, SMS\nmessages, email, and local utility apps such as notes, calendar events, world\nclocks, and alarms.",[159,160,162],"h2",{"id":161},"open-phone-ui","Open Phone UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_phone_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The phone UI creates ",[171,184,185],{},"RscPhone",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes\nbrowser alerts through ",[171,192,193],{},"forge_client_phone_fnc_handleUIEvents",".",[159,196,198],{"id":197},"state-ownership","State Ownership",[155,200,201],{},"Contacts, messages, and emails are server-owned and requested through the\nserver phone addon.",[155,203,204,205,208],{},"Local utility app state is stored in ",[171,206,207],{},"profileNamespace",":",[210,211,212,216,219,222,225],"ul",{},[213,214,215],"li",{},"notes",[213,217,218],{},"calendar events",[213,220,221],{},"world clocks",[213,223,224],{},"alarms",[213,226,227],{},"theme\u002Fpreferences",[159,229,231],{"id":230},"phone-class","Phone Class",[155,233,234,237,238,194],{},[171,235,236],{},"forge_client_phone_fnc_initClass"," creates ",[171,239,240],{},"GVAR(PhoneClass)",[155,242,243],{},"The phone class currently owns local notes, events, and settings helpers.\nContacts, messages, and emails continue to use server-backed request\u002Fresponse\nevents.",[159,245,247],{"id":246},"browser-events","Browser Events",[249,250,252],"h3",{"id":251},"session-and-preferences","Session and Preferences",[254,255,256,269],"table",{},[257,258,259],"thead",{},[260,261,262,266],"tr",{},[263,264,265],"th",{},"Event",[263,267,268],{},"Client behavior",[270,271,272,286,296],"tbody",{},[260,273,274,280],{},[275,276,277],"td",{},[171,278,279],{},"phone::get::player",[275,281,282,283,194],{},"Send player UID to browser with ",[171,284,285],{},"setPlayerUid",[260,287,288,293],{},[275,289,290],{},[171,291,292],{},"phone::get::theme",[275,294,295],{},"Send saved light\u002Fdark theme to browser.",[260,297,298,303],{},[275,299,300],{},[171,301,302],{},"phone::set::theme",[275,304,305,306,194],{},"Save theme preference to ",[171,307,207],{},[249,309,311],{"id":310},"contacts","Contacts",[254,313,314,322],{},[257,315,316],{},[260,317,318,320],{},[263,319,265],{},[263,321,268],{},[270,323,324,334,344,354,363,373],{},[260,325,326,331],{},[275,327,328],{},[171,329,330],{},"phone::get::contacts",[275,332,333],{},"Load cached contacts and request server refresh.",[260,335,336,341],{},[275,337,338],{},[171,339,340],{},"phone::refresh::contacts",[275,342,343],{},"Request contacts from server.",[260,345,346,351],{},[275,347,348],{},[171,349,350],{},"phone::add::contact",[275,352,353],{},"Add contact by phone number.",[260,355,356,361],{},[275,357,358],{},[171,359,360],{},"phone::add::contact::by::phone",[275,362,353],{},[260,364,365,370],{},[275,366,367],{},[171,368,369],{},"phone::add::contact::by::email",[275,371,372],{},"Add contact by email.",[260,374,375,380],{},[275,376,377],{},[171,378,379],{},"phone::remove::contact",[275,381,382],{},"Remove contact by UID.",[249,384,386],{"id":385},"messages","Messages",[254,388,389,397],{},[257,390,391],{},[260,392,393,395],{},[263,394,265],{},[263,396,268],{},[270,398,399,409,419,429,439],{},[260,400,401,406],{},[275,402,403],{},[171,404,405],{},"phone::get::messages",[275,407,408],{},"Request messages from server.",[260,410,411,416],{},[275,412,413],{},[171,414,415],{},"phone::get::message::thread",[275,417,418],{},"Request thread with another UID.",[260,420,421,426],{},[275,422,423],{},[171,424,425],{},"phone::send::message",[275,427,428],{},"Send SMS through server.",[260,430,431,436],{},[275,432,433],{},[171,434,435],{},"phone::mark::message::read",[275,437,438],{},"Mark message read on server.",[260,440,441,446],{},[275,442,443],{},[171,444,445],{},"phone::delete::message",[275,447,448],{},"Delete message on server.",[249,450,452],{"id":451},"email","Email",[254,454,455,463],{},[257,456,457],{},[260,458,459,461],{},[263,460,265],{},[263,462,268],{},[270,464,465,475,485,495],{},[260,466,467,472],{},[275,468,469],{},[171,470,471],{},"phone::get::emails",[275,473,474],{},"Request emails from server.",[260,476,477,482],{},[275,478,479],{},[171,480,481],{},"phone::send::email",[275,483,484],{},"Send email through server.",[260,486,487,492],{},[275,488,489],{},[171,490,491],{},"phone::mark::email::read",[275,493,494],{},"Mark email read on server.",[260,496,497,502],{},[275,498,499],{},[171,500,501],{},"phone::delete::email",[275,503,504],{},"Delete email on server.",[249,506,508],{"id":507},"local-utility-apps","Local Utility Apps",[254,510,511,519],{},[257,512,513],{},[260,514,515,517],{},[263,516,265],{},[263,518,268],{},[270,520,521,531,541,551,561,571,581,591,601,611,621,631,641],{},[260,522,523,528],{},[275,524,525],{},[171,526,527],{},"phone::get::notes",[275,529,530],{},"Load local notes.",[260,532,533,538],{},[275,534,535],{},[171,536,537],{},"phone::save::note",[275,539,540],{},"Save local note.",[260,542,543,548],{},[275,544,545],{},[171,546,547],{},"phone::delete::note",[275,549,550],{},"Delete local note.",[260,552,553,558],{},[275,554,555],{},[171,556,557],{},"phone::get::events",[275,559,560],{},"Load local calendar events.",[260,562,563,568],{},[275,564,565],{},[171,566,567],{},"phone::save::event",[275,569,570],{},"Save local calendar event.",[260,572,573,578],{},[275,574,575],{},[171,576,577],{},"phone::delete::event",[275,579,580],{},"Delete local calendar event.",[260,582,583,588],{},[275,584,585],{},[171,586,587],{},"phone::get::clocks",[275,589,590],{},"Load local world clocks.",[260,592,593,598],{},[275,594,595],{},[171,596,597],{},"phone::save::clock",[275,599,600],{},"Save local world clock.",[260,602,603,608],{},[275,604,605],{},[171,606,607],{},"phone::delete::clock",[275,609,610],{},"Delete local world clock.",[260,612,613,618],{},[275,614,615],{},[171,616,617],{},"phone::get::alarms",[275,619,620],{},"Load local alarms.",[260,622,623,628],{},[275,624,625],{},[171,626,627],{},"phone::save::alarm",[275,629,630],{},"Save local alarm.",[260,632,633,638],{},[275,634,635],{},[171,636,637],{},"phone::delete::alarm",[275,639,640],{},"Delete local alarm.",[260,642,643,648],{},[275,644,645],{},[171,646,647],{},"phone::toggle::alarm",[275,649,650],{},"Toggle local alarm enabled state.",[159,652,654],{"id":653},"usage-rules","Usage Rules",[210,656,657,660,666,669],{},[213,658,659],{},"Send contact, message, and email mutations to the server phone addon.",[213,661,662,663,665],{},"Keep local-only utility apps in ",[171,664,207],{}," until they are migrated to\nserver-backed storage.",[213,667,668],{},"Do not treat local phone utility state as shared multiplayer state.",[213,670,671],{},"Validate required UID, phone, email, subject, and message fields before\nsending server requests.",[159,673,675],{"id":674},"related-guides","Related Guides",[210,677,678,683],{},[213,679,680],{},[681,682,89],"a",{"href":90},[213,684,685],{},[681,686,137],{"href":138},[688,689,690],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":692,"depth":692,"links":693},2,[694,695,696,697,705,706],{"id":161,"depth":692,"text":162},{"id":197,"depth":692,"text":198},{"id":230,"depth":692,"text":231},{"id":246,"depth":692,"text":247,"children":698},[699,701,702,703,704],{"id":251,"depth":700,"text":252},3,{"id":310,"depth":700,"text":311},{"id":385,"depth":700,"text":386},{"id":451,"depth":700,"text":452},{"id":507,"depth":700,"text":508},{"id":653,"depth":692,"text":654},{"id":674,"depth":692,"text":675},"md",null,{},true,{"title":105,"description":157},"0NTtS9Y0Ou2ZP0DjQSKm3TT1mcZwqsRjnA5q7p__qdo",[714,716],{"title":101,"path":102,"stem":103,"description":715,"children":-1},"The client main addon provides the shared mod identity, version metadata,\nCBA settings, and macro foundation used by the Forge client addons.",{"title":109,"path":110,"stem":111,"description":717,"children":-1},"The client store addon provides the storefront browser UI for catalog browsing,\ncategory hydration, payment source display, cart handling, and checkout\nrequests.",1776806627742] \ No newline at end of file diff --git a/docus/dist/client-addons/store.html b/docus/dist/client-addons/store.html index f751f5b..93ca4a5 100644 --- a/docus/dist/client-addons/store.html +++ b/docus/dist/client-addons/store.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Client Store Usage Guide - forge-docusRelated Guides

    Client Phone Usage Guide

    The client phone addon provides the in-game phone UI for contacts, SMS messages, email, and local utility apps such as notes, calendar events, world clocks, and alarms.

    Client Common Usage Guide

    The client common addon contains shared browser UI bridge declarations and -common client-side browser integration patterns.

    \ No newline at end of file +common client-side browser integration patterns.

    \ No newline at end of file diff --git a/docus/dist/client-addons/store/_payload.json b/docus/dist/client-addons/store/_payload.json index c91ef0a..0f447f5 100644 --- a/docus/dist/client-addons/store/_payload.json +++ b/docus/dist/client-addons/store/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":571},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-store":145,"-client-addons-store-surround":566},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":109,"body":147,"description":157,"extension":560,"links":561,"meta":562,"navigation":563,"path":110,"seo":564,"stem":111,"__hash__":565},"docs\u002F4.client-addons\u002F11.store.md",{"type":148,"value":149,"toc":550},"minimark",[150,154,158,163,180,195,199,205,230,241,245,305,309,382,386,389,434,437,441,444,506,509,512,516,519,523,546],[151,152,109],"h1",{"id":153},"client-store-usage-guide",[155,156,157],"p",{},"The client store addon provides the storefront browser UI for catalog browsing,\ncategory hydration, payment source display, cart handling, and checkout\nrequests.",[159,160,162],"h2",{"id":161},"open-store-ui","Open Store UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_store_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The UI opens ",[171,184,185],{},"RscStore",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes browser alerts\nthrough ",[171,192,193],{},"forge_client_store_fnc_handleUIEvents",".",[159,196,198],{"id":197},"bridge","Bridge",[155,200,201,204],{},[171,202,203],{},"forge_client_store_fnc_initUIBridge"," owns:",[206,207,208,212,215,218,221,224,227],"ul",{},[209,210,211],"li",{},"browser control lookup",[209,213,214],{},"store hydrate requests",[209,216,217],{},"category requests",[209,219,220],{},"checkout requests",[209,222,223],{},"category hydrate\u002Ffailure responses",[209,225,226],{},"checkout success\u002Ffailure responses",[209,228,229],{},"store config refresh after successful checkout",[155,231,232,233,236,237,240],{},"Store currently uses its own ",[171,234,235],{},"StoreUIBridge.receive(...)"," browser bridge rather\nthan the shared ",[171,238,239],{},"ForgeBridge.receive(...)"," delivery used by newer bridges.",[159,242,244],{"id":243},"browser-events","Browser Events",[246,247,248,261],"table",{},[249,250,251],"thead",{},[252,253,254,258],"tr",{},[255,256,257],"th",{},"Event",[255,259,260],{},"Client behavior",[262,263,264,275,285,295],"tbody",{},[252,265,266,272],{},[267,268,269],"td",{},[171,270,271],{},"store::ready",[267,273,274],{},"Request store hydrate from the server.",[252,276,277,282],{},[267,278,279],{},[171,280,281],{},"store::category::request",[267,283,284],{},"Request catalog items for a category.",[252,286,287,292],{},[267,288,289],{},[171,290,291],{},"store::checkout::request",[267,293,294],{},"Forward checkout JSON to the server.",[252,296,297,302],{},[267,298,299],{},[171,300,301],{},"store::close",[267,303,304],{},"Close the display.",[159,306,308],{"id":307},"browser-response-events","Browser Response Events",[246,310,311,320],{},[249,312,313],{},[252,314,315,317],{},[255,316,257],{},[255,318,319],{},"Purpose",[262,321,322,332,342,352,362,372],{},[252,323,324,329],{},[267,325,326],{},[171,327,328],{},"store::hydrate",[267,330,331],{},"Initial storefront\u002Fsession\u002Fconfig payload.",[252,333,334,339],{},[267,335,336],{},[171,337,338],{},"store::config::hydrate",[267,340,341],{},"Refreshed payment\u002Fsource config.",[252,343,344,349],{},[267,345,346],{},[171,347,348],{},"store::category::hydrate",[267,350,351],{},"Category catalog payload.",[252,353,354,359],{},[267,355,356],{},[171,357,358],{},"store::category::failure",[267,360,361],{},"Category request failure.",[252,363,364,369],{},[267,365,366],{},[171,367,368],{},"store::checkout::success",[267,370,371],{},"Checkout success payload.",[252,373,374,379],{},[267,375,376],{},[171,377,378],{},"store::checkout::failure",[267,380,381],{},"Checkout failure payload.",[159,383,385],{"id":384},"category-requests","Category Requests",[155,387,388],{},"Category requests require a non-empty category value.",[164,390,394],{"className":391,"code":392,"language":393,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"category\": \"weapons\"\n}\n","json",[171,395,396,402,428],{"__ignoreMap":169},[174,397,398],{"class":176,"line":177},[174,399,401],{"class":400},"sMK4o","{\n",[174,403,405,408,412,415,418,421,425],{"class":176,"line":404},2,[174,406,407],{"class":400}," \"",[174,409,411],{"class":410},"spNyl","category",[174,413,414],{"class":400},"\"",[174,416,417],{"class":400},":",[174,419,420],{"class":400}," \"",[174,422,424],{"class":423},"sfazB","weapons",[174,426,427],{"class":400},"\"\n",[174,429,431],{"class":176,"line":430},3,[174,432,433],{"class":400},"}\n",[155,435,436],{},"The client lowercases the category before forwarding it to the server store\naddon.",[159,438,440],{"id":439},"checkout-requests","Checkout Requests",[155,442,443],{},"Checkout requests send a serialized checkout payload:",[164,445,447],{"className":391,"code":446,"language":393,"meta":169,"style":169},"{\n \"checkoutJson\": \"{\\\"items\\\":[],\\\"paymentSource\\\":\\\"cash\\\"}\"\n}\n",[171,448,449,453,502],{"__ignoreMap":169},[174,450,451],{"class":176,"line":177},[174,452,401],{"class":400},[174,454,455,457,460,462,464,466,469,473,476,478,481,483,486,488,490,492,495,497,500],{"class":176,"line":404},[174,456,407],{"class":400},[174,458,459],{"class":410},"checkoutJson",[174,461,414],{"class":400},[174,463,417],{"class":400},[174,465,420],{"class":400},[174,467,468],{"class":423},"{",[174,470,472],{"class":471},"sTEyZ","\\\"",[174,474,475],{"class":423},"items",[174,477,472],{"class":471},[174,479,480],{"class":423},":[],",[174,482,472],{"class":471},[174,484,485],{"class":423},"paymentSource",[174,487,472],{"class":471},[174,489,417],{"class":423},[174,491,472],{"class":471},[174,493,494],{"class":423},"cash",[174,496,472],{"class":471},[174,498,499],{"class":423},"}",[174,501,427],{"class":400},[174,503,504],{"class":176,"line":430},[174,505,433],{"class":400},[155,507,508],{},"The client only forwards the checkout data. The server store addon and\nextension validate prices, inventory grants, payment source authorization, and\nintegration with bank, organization, locker, and garage state.",[155,510,511],{},"After a successful checkout, the client asks the server for a fresh store config\npayload so payment-source balances and permissions stay current.",[159,513,515],{"id":514},"authoritative-state","Authoritative State",[155,517,518],{},"Catalog data, prices, checkout validation, money movement, organization funds,\ncredit lines, locker grants, garage grants, and persistence are server-owned.",[159,520,522],{"id":521},"related-guides","Related Guides",[206,524,525,530,534,538,542],{},[209,526,527],{},[528,529,53],"a",{"href":54},[209,531,532],{},[528,533,121],{"href":122},[209,535,536],{},[528,537,141],{"href":142},[209,539,540],{},[528,541,133],{"href":134},[209,543,544],{},[528,545,129],{"href":130},[547,548,549],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":169,"searchDepth":404,"depth":404,"links":551},[552,553,554,555,556,557,558,559],{"id":161,"depth":404,"text":162},{"id":197,"depth":404,"text":198},{"id":243,"depth":404,"text":244},{"id":307,"depth":404,"text":308},{"id":384,"depth":404,"text":385},{"id":439,"depth":404,"text":440},{"id":514,"depth":404,"text":515},{"id":521,"depth":404,"text":522},"md",null,{},true,{"title":109,"description":157},"_8o4h6aY-FR4MYNv4DJEbZDm0AHB3KRAnI2hPi2cCII",[567,569],{"title":105,"path":106,"stem":107,"description":568,"children":-1},"The client phone addon provides the in-game phone UI for contacts, SMS\nmessages, email, and local utility apps such as notes, calendar events, world\nclocks, and alarms.",{"title":113,"path":114,"stem":115,"description":570,"children":-1},"The client common addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":571},["ShallowReactive",2],{"navigation_docs":3,"-client-addons-store":145,"-client-addons-store-surround":566},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":109,"body":147,"description":157,"extension":560,"links":561,"meta":562,"navigation":563,"path":110,"seo":564,"stem":111,"__hash__":565},"docs\u002F4.client-addons\u002F11.store.md",{"type":148,"value":149,"toc":550},"minimark",[150,154,158,163,180,195,199,205,230,241,245,305,309,382,386,389,434,437,441,444,506,509,512,516,519,523,546],[151,152,109],"h1",{"id":153},"client-store-usage-guide",[155,156,157],"p",{},"The client store addon provides the storefront browser UI for catalog browsing,\ncategory hydration, payment source display, cart handling, and checkout\nrequests.",[159,160,162],"h2",{"id":161},"open-store-ui","Open Store UI",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","call forge_client_store_fnc_openUI;\n","sqf","",[171,172,173],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,167],{},[155,181,182,183,186,187,190,191,194],{},"The UI opens ",[171,184,185],{},"RscStore",", loads ",[171,188,189],{},"ui\u002F_site\u002Findex.html",", and routes browser alerts\nthrough ",[171,192,193],{},"forge_client_store_fnc_handleUIEvents",".",[159,196,198],{"id":197},"bridge","Bridge",[155,200,201,204],{},[171,202,203],{},"forge_client_store_fnc_initUIBridge"," owns:",[206,207,208,212,215,218,221,224,227],"ul",{},[209,210,211],"li",{},"browser control lookup",[209,213,214],{},"store hydrate requests",[209,216,217],{},"category requests",[209,219,220],{},"checkout requests",[209,222,223],{},"category hydrate\u002Ffailure responses",[209,225,226],{},"checkout success\u002Ffailure responses",[209,228,229],{},"store config refresh after successful checkout",[155,231,232,233,236,237,240],{},"Store currently uses its own ",[171,234,235],{},"StoreUIBridge.receive(...)"," browser bridge rather\nthan the shared ",[171,238,239],{},"ForgeBridge.receive(...)"," delivery used by newer bridges.",[159,242,244],{"id":243},"browser-events","Browser Events",[246,247,248,261],"table",{},[249,250,251],"thead",{},[252,253,254,258],"tr",{},[255,256,257],"th",{},"Event",[255,259,260],{},"Client behavior",[262,263,264,275,285,295],"tbody",{},[252,265,266,272],{},[267,268,269],"td",{},[171,270,271],{},"store::ready",[267,273,274],{},"Request store hydrate from the server.",[252,276,277,282],{},[267,278,279],{},[171,280,281],{},"store::category::request",[267,283,284],{},"Request catalog items for a category.",[252,286,287,292],{},[267,288,289],{},[171,290,291],{},"store::checkout::request",[267,293,294],{},"Forward checkout JSON to the server.",[252,296,297,302],{},[267,298,299],{},[171,300,301],{},"store::close",[267,303,304],{},"Close the display.",[159,306,308],{"id":307},"browser-response-events","Browser Response Events",[246,310,311,320],{},[249,312,313],{},[252,314,315,317],{},[255,316,257],{},[255,318,319],{},"Purpose",[262,321,322,332,342,352,362,372],{},[252,323,324,329],{},[267,325,326],{},[171,327,328],{},"store::hydrate",[267,330,331],{},"Initial storefront\u002Fsession\u002Fconfig payload.",[252,333,334,339],{},[267,335,336],{},[171,337,338],{},"store::config::hydrate",[267,340,341],{},"Refreshed payment\u002Fsource config.",[252,343,344,349],{},[267,345,346],{},[171,347,348],{},"store::category::hydrate",[267,350,351],{},"Category catalog payload.",[252,353,354,359],{},[267,355,356],{},[171,357,358],{},"store::category::failure",[267,360,361],{},"Category request failure.",[252,363,364,369],{},[267,365,366],{},[171,367,368],{},"store::checkout::success",[267,370,371],{},"Checkout success payload.",[252,373,374,379],{},[267,375,376],{},[171,377,378],{},"store::checkout::failure",[267,380,381],{},"Checkout failure payload.",[159,383,385],{"id":384},"category-requests","Category Requests",[155,387,388],{},"Category requests require a non-empty category value.",[164,390,394],{"className":391,"code":392,"language":393,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"category\": \"weapons\"\n}\n","json",[171,395,396,402,428],{"__ignoreMap":169},[174,397,398],{"class":176,"line":177},[174,399,401],{"class":400},"sMK4o","{\n",[174,403,405,408,412,415,418,421,425],{"class":176,"line":404},2,[174,406,407],{"class":400}," \"",[174,409,411],{"class":410},"spNyl","category",[174,413,414],{"class":400},"\"",[174,416,417],{"class":400},":",[174,419,420],{"class":400}," \"",[174,422,424],{"class":423},"sfazB","weapons",[174,426,427],{"class":400},"\"\n",[174,429,431],{"class":176,"line":430},3,[174,432,433],{"class":400},"}\n",[155,435,436],{},"The client lowercases the category before forwarding it to the server store\naddon.",[159,438,440],{"id":439},"checkout-requests","Checkout Requests",[155,442,443],{},"Checkout requests send a serialized checkout payload:",[164,445,447],{"className":391,"code":446,"language":393,"meta":169,"style":169},"{\n \"checkoutJson\": \"{\\\"items\\\":[],\\\"paymentSource\\\":\\\"cash\\\"}\"\n}\n",[171,448,449,453,502],{"__ignoreMap":169},[174,450,451],{"class":176,"line":177},[174,452,401],{"class":400},[174,454,455,457,460,462,464,466,469,473,476,478,481,483,486,488,490,492,495,497,500],{"class":176,"line":404},[174,456,407],{"class":400},[174,458,459],{"class":410},"checkoutJson",[174,461,414],{"class":400},[174,463,417],{"class":400},[174,465,420],{"class":400},[174,467,468],{"class":423},"{",[174,470,472],{"class":471},"sTEyZ","\\\"",[174,474,475],{"class":423},"items",[174,477,472],{"class":471},[174,479,480],{"class":423},":[],",[174,482,472],{"class":471},[174,484,485],{"class":423},"paymentSource",[174,487,472],{"class":471},[174,489,417],{"class":423},[174,491,472],{"class":471},[174,493,494],{"class":423},"cash",[174,496,472],{"class":471},[174,498,499],{"class":423},"}",[174,501,427],{"class":400},[174,503,504],{"class":176,"line":430},[174,505,433],{"class":400},[155,507,508],{},"The client only forwards the checkout data. The server store addon and\nextension validate prices, inventory grants, payment source authorization, and\nintegration with bank, organization, locker, and garage state.",[155,510,511],{},"After a successful checkout, the client asks the server for a fresh store config\npayload so payment-source balances and permissions stay current.",[159,513,515],{"id":514},"authoritative-state","Authoritative State",[155,517,518],{},"Catalog data, prices, checkout validation, money movement, organization funds,\ncredit lines, locker grants, garage grants, and persistence are server-owned.",[159,520,522],{"id":521},"related-guides","Related Guides",[206,524,525,530,534,538,542],{},[209,526,527],{},[528,529,53],"a",{"href":54},[209,531,532],{},[528,533,121],{"href":122},[209,535,536],{},[528,537,141],{"href":142},[209,539,540],{},[528,541,133],{"href":134},[209,543,544],{},[528,545,129],{"href":130},[547,548,549],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":169,"searchDepth":404,"depth":404,"links":551},[552,553,554,555,556,557,558,559],{"id":161,"depth":404,"text":162},{"id":197,"depth":404,"text":198},{"id":243,"depth":404,"text":244},{"id":307,"depth":404,"text":308},{"id":384,"depth":404,"text":385},{"id":439,"depth":404,"text":440},{"id":514,"depth":404,"text":515},{"id":521,"depth":404,"text":522},"md",null,{},true,{"title":109,"description":157},"_8o4h6aY-FR4MYNv4DJEbZDm0AHB3KRAnI2hPi2cCII",[567,569],{"title":105,"path":106,"stem":107,"description":568,"children":-1},"The client phone addon provides the in-game phone UI for contacts, SMS\nmessages, email, and local utility apps such as notes, calendar events, world\nclocks, and alarms.",{"title":113,"path":114,"stem":115,"description":570,"children":-1},"The client common addon contains shared browser UI bridge declarations and\ncommon client-side browser integration patterns.",1776806627742] \ No newline at end of file diff --git a/docus/dist/getting-started.html b/docus/dist/getting-started.html index 4df4b19..6ca6042 100644 --- a/docus/dist/getting-started.html +++ b/docus/dist/getting-started.html @@ -94,11 +94,11 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Getting Started - forge-docus
    Getting Started

    Getting Started

    Use this section as the main entry point for the Forge framework.

    Getting Started

    Use this section as the main entry point for the Forge framework.

    Forge combines:

    • Arma 3 client addons for UX and browser-hosted interfaces
    • Arma 3 server addons for mission integration and authoritative flow control
    • a Rust server extension for command routing and persistence
    • shared Rust crates for models, repositories, and services
    • SurrealDB for durable storage

    Common Commands

    cargo test
    +}Getting Started - forge-docus
    Getting Started

    Getting Started

    Use this section as the main entry point for the Forge framework.

    Getting Started

    Use this section as the main entry point for the Forge framework.

    Forge combines:

    • Arma 3 client addons for UX and browser-hosted interfaces
    • Arma 3 server addons for mission integration and authoritative flow control
    • a Rust server extension for command routing and persistence
    • shared Rust crates for models, repositories, and services
    • SurrealDB for durable storage

    Common Commands

    cargo test
     npm run build:webui
     .\build-arma.ps1
     

    Start Here

    Architecture
    Understand how SQF, Rust services, SurrealDB, and browser UIs fit together.
    Module Reference
    Review gameplay domains, infrastructure modules, and extension command groups.
    Development Guide
    See the rules for adding modules and changing boundaries without regressions.
    SurrealDB Setup
    Install SurrealDB, match Forge config values, and choose the right setup path for developers or admin-facing roles.
    Server Extension
    Follow the extension architecture, API surface, and SQF usage examples.
    Server Modules
    Dive into the actor, bank, CAD, garage, locker, organization, phone, store, task, and owned-storage guides.
    Client Addons
    Explore the client bridge model and addon-specific browser integration rules.
    Copyright © 2026
    \ No newline at end of file +handlers, and optional browser UI.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/getting-started/_payload.json b/docus/dist/getting-started/_payload.json index 5d097c9..a472a5c 100644 --- a/docus/dist/getting-started/_payload.json +++ b/docus/dist/getting-started/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":268},["ShallowReactive",2],{"navigation_docs":3,"-getting-started":145,"-getting-started-surround":265},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":5,"body":147,"description":157,"extension":259,"links":260,"meta":261,"navigation":262,"path":6,"seo":263,"stem":7,"__hash__":264},"docs\u002F1.getting-started\u002F0.index.md",{"type":148,"value":149,"toc":255},"minimark",[150,154,158,161,180,185,215,219,251],[151,152,5],"h1",{"id":153},"getting-started",[155,156,157],"p",{},"Use this section as the main entry point for the Forge framework.",[155,159,160],{},"Forge combines:",[162,163,164,168,171,174,177],"ul",{},[165,166,167],"li",{},"Arma 3 client addons for UX and browser-hosted interfaces",[165,169,170],{},"Arma 3 server addons for mission integration and authoritative flow control",[165,172,173],{},"a Rust server extension for command routing and persistence",[165,175,176],{},"shared Rust crates for models, repositories, and services",[165,178,179],{},"SurrealDB for durable storage",[181,182,184],"h2",{"id":183},"common-commands","Common Commands",[186,187,192],"pre",{"className":188,"code":189,"language":190,"meta":191,"style":191},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cargo test\nnpm run build:webui\n.\\build-arma.ps1\n","powershell","",[193,194,195,203,209],"code",{"__ignoreMap":191},[196,197,200],"span",{"class":198,"line":199},"line",1,[196,201,202],{},"cargo test\n",[196,204,206],{"class":198,"line":205},2,[196,207,208],{},"npm run build:webui\n",[196,210,212],{"class":198,"line":211},3,[196,213,214],{},".\\build-arma.ps1\n",[181,216,218],{"id":217},"start-here","Start Here",[220,221,222,228,232,236,240,245,248],"u-page-grid",{},[223,224,227],"u-page-card",{"icon":225,"title":226,"to":12},"i-lucide-network","Architecture","Understand how SQF, Rust services, SurrealDB, and browser UIs fit together.",[223,229,231],{"icon":230,"title":15,"to":16},"i-lucide-boxes","Review gameplay domains, infrastructure modules, and extension command groups.",[223,233,235],{"icon":234,"title":19,"to":20},"i-lucide-wrench","See the rules for adding modules and changing boundaries without regressions.",[223,237,239],{"icon":238,"title":23,"to":24},"i-lucide-database","Install SurrealDB, match Forge config values, and choose the right setup path\nfor developers or admin-facing roles.",[223,241,244],{"icon":242,"title":243,"to":29},"i-lucide-server-cog","Server Extension","Follow the extension architecture, API surface, and SQF usage examples.",[223,246,247],{"icon":92,"title":42,"to":43},"Dive into the actor, bank, CAD, garage, locker, organization, phone, store,\ntask, and owned-storage guides.",[223,249,250],{"icon":144,"title":94,"to":95},"Explore the client bridge model and addon-specific browser integration rules.",[252,253,254],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":191,"searchDepth":205,"depth":205,"links":256},[257,258],{"id":183,"depth":205,"text":184},{"id":217,"depth":205,"text":218},"md",null,{},true,{"title":5,"description":157},"S3Xe9nM8bUIoSC2wMWB6DiA3AF4Pcfw7DxQNTkDDSbc",[260,266],{"title":11,"path":12,"stem":13,"description":267,"children":-1},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",1776805514039] \ No newline at end of file +[{"data":1,"prerenderedAt":268},["ShallowReactive",2],{"navigation_docs":3,"-getting-started":145,"-getting-started-surround":265},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":5,"body":147,"description":157,"extension":259,"links":260,"meta":261,"navigation":262,"path":6,"seo":263,"stem":7,"__hash__":264},"docs\u002F1.getting-started\u002F0.index.md",{"type":148,"value":149,"toc":255},"minimark",[150,154,158,161,180,185,215,219,251],[151,152,5],"h1",{"id":153},"getting-started",[155,156,157],"p",{},"Use this section as the main entry point for the Forge framework.",[155,159,160],{},"Forge combines:",[162,163,164,168,171,174,177],"ul",{},[165,166,167],"li",{},"Arma 3 client addons for UX and browser-hosted interfaces",[165,169,170],{},"Arma 3 server addons for mission integration and authoritative flow control",[165,172,173],{},"a Rust server extension for command routing and persistence",[165,175,176],{},"shared Rust crates for models, repositories, and services",[165,178,179],{},"SurrealDB for durable storage",[181,182,184],"h2",{"id":183},"common-commands","Common Commands",[186,187,192],"pre",{"className":188,"code":189,"language":190,"meta":191,"style":191},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cargo test\nnpm run build:webui\n.\\build-arma.ps1\n","powershell","",[193,194,195,203,209],"code",{"__ignoreMap":191},[196,197,200],"span",{"class":198,"line":199},"line",1,[196,201,202],{},"cargo test\n",[196,204,206],{"class":198,"line":205},2,[196,207,208],{},"npm run build:webui\n",[196,210,212],{"class":198,"line":211},3,[196,213,214],{},".\\build-arma.ps1\n",[181,216,218],{"id":217},"start-here","Start Here",[220,221,222,228,232,236,240,245,248],"u-page-grid",{},[223,224,227],"u-page-card",{"icon":225,"title":226,"to":12},"i-lucide-network","Architecture","Understand how SQF, Rust services, SurrealDB, and browser UIs fit together.",[223,229,231],{"icon":230,"title":15,"to":16},"i-lucide-boxes","Review gameplay domains, infrastructure modules, and extension command groups.",[223,233,235],{"icon":234,"title":19,"to":20},"i-lucide-wrench","See the rules for adding modules and changing boundaries without regressions.",[223,237,239],{"icon":238,"title":23,"to":24},"i-lucide-database","Install SurrealDB, match Forge config values, and choose the right setup path\nfor developers or admin-facing roles.",[223,241,244],{"icon":242,"title":243,"to":29},"i-lucide-server-cog","Server Extension","Follow the extension architecture, API surface, and SQF usage examples.",[223,246,247],{"icon":92,"title":42,"to":43},"Dive into the actor, bank, CAD, garage, locker, organization, phone, store,\ntask, and owned-storage guides.",[223,249,250],{"icon":144,"title":94,"to":95},"Explore the client bridge model and addon-specific browser integration rules.",[252,253,254],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":191,"searchDepth":205,"depth":205,"links":256},[257,258],{"id":183,"depth":205,"text":184},{"id":217,"depth":205,"text":218},"md",null,{},true,{"title":5,"description":157},"S3Xe9nM8bUIoSC2wMWB6DiA3AF4Pcfw7DxQNTkDDSbc",[260,266],{"title":11,"path":12,"stem":13,"description":267,"children":-1},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",1776806627034] \ No newline at end of file diff --git a/docus/dist/getting-started/architecture.html b/docus/dist/getting-started/architecture.html index d214b30..136a2ba 100644 --- a/docus/dist/getting-started/architecture.html +++ b/docus/dist/getting-started/architecture.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Framework Architecture - forge-docus

    For install links and role-based setup guidance, see SurrealDB Setup.

    Check persistence readiness before issuing commands that require storage:

    "forge_server" callExtension ["status", []];
     "forge_server" callExtension ["surreal:status", []];
    -

    Getting Started

    Use this section as the main entry point for the Forge framework.

    Module Reference

    This reference lists the main Forge modules and where each layer lives.

    \ No newline at end of file +

    Getting Started

    Use this section as the main entry point for the Forge framework.

    Module Reference

    This reference lists the main Forge modules and where each layer lives.

    \ No newline at end of file diff --git a/docus/dist/getting-started/architecture/_payload.json b/docus/dist/getting-started/architecture/_payload.json index a3593eb..84d64c4 100644 --- a/docus/dist/getting-started/architecture/_payload.json +++ b/docus/dist/getting-started/architecture/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":477},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-architecture":145,"-getting-started-architecture-surround":472},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":11,"body":147,"description":157,"extension":466,"links":467,"meta":468,"navigation":469,"path":12,"seo":470,"stem":13,"__hash__":471},"docs\u002F1.getting-started\u002F1.architecture.md",{"type":148,"value":149,"toc":453},"minimark",[150,154,158,163,174,185,189,193,200,204,219,223,233,236,252,256,263,289,293,304,311,315,322,325,331,334,338,341,344,358,361,367,371,378,426,432,435,449],[151,152,11],"h1",{"id":153},"framework-architecture",[155,156,157],"p",{},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",[159,160,162],"h2",{"id":161},"runtime-flow","Runtime Flow",[164,165,171],"pre",{"className":166,"code":168,"language":169,"meta":170},[167],"language-text","Arma client UI or SQF action\n -> client addon bridge\n -> server addon function\n -> forge_server callExtension command\n -> extension command group\n -> forge-services domain service\n -> forge-repositories trait\n -> SurrealDB repository implementation\n -> SurrealDB\n","text","",[172,173,168],"code",{"__ignoreMap":170},[155,175,176,177,180,181,184],{},"For small payloads, server SQF calls ",[172,178,179],{},"forge_server"," directly through the\nextension bridge. For large payloads, ",[172,182,183],{},"arma\u002Fserver\u002Faddons\u002Fextension"," stages\nrequest and response chunks through the extension transport module.",[159,186,188],{"id":187},"main-layers","Main Layers",[190,191,94],"h3",{"id":192},"client-addons",[155,194,195,196,199],{},"Client addons live under ",[172,197,198],{},"arma\u002Fclient\u002Faddons",". They own local player UX,\nkeybinds, browser UI dialogs, and UI-to-SQF event handling. When a client needs\ndurable or authoritative state, it routes work to the matching server addon\ninstead of touching persistence directly.",[190,201,203],{"id":202},"server-addons","Server Addons",[155,205,206,207,210,211,214,215,218],{},"Server addons live under ",[172,208,209],{},"arma\u002Fserver\u002Faddons",". They own server-side SQF\ninitialization, game-object integration, validation near the Arma runtime, and\ncalls into the Rust extension. The ",[172,212,213],{},"extension"," addon is the shared bridge for\n",[172,216,217],{},"callExtension"," and transport handling.",[190,220,222],{"id":221},"rust-extension","Rust Extension",[155,224,225,226,229,230,232],{},"The server extension lives under ",[172,227,228],{},"arma\u002Fserver\u002Fextension",". It registers the\n",[172,231,179],{}," command groups, loads configuration, initializes SurrealDB, and\nmaps SQF command inputs into service calls.",[155,234,235],{},"The extension should stay thin:",[237,238,239,243,246,249],"ul",{},[240,241,242],"li",{},"Parse and validate command arguments that arrive from SQF.",[240,244,245],{},"Resolve Arma-specific context such as player UID when required.",[240,247,248],{},"Call the matching service.",[240,250,251],{},"Serialize the service result back to JSON or a simple string.",[190,253,255],{"id":254},"shared-rust-crates","Shared Rust Crates",[155,257,258,259,262],{},"The ",[172,260,261],{},"lib"," workspace contains reusable Rust crates:",[237,264,265,271,277,283],{},[240,266,267,270],{},[172,268,269],{},"forge-models",": shared domain structs and serialization rules.",[240,272,273,276],{},[172,274,275],{},"forge-repositories",": storage-agnostic repository traits and in-memory\nimplementations used by tests and hot-state services.",[240,278,279,282],{},[172,280,281],{},"forge-services",": domain behavior, validation, and mutation workflows.",[240,284,285,288],{},[172,286,287],{},"forge-shared",": cross-crate helpers.",[190,290,292],{"id":291},"persistence","Persistence",[155,294,295,296,299,300,303],{},"Durable storage is SurrealDB. Schema modules live under\n",[172,297,298],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fschema",", and concrete SurrealDB repository\nimplementations live under ",[172,301,302],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fstorage",".",[155,305,306,307,310],{},"Repository traits stay in ",[172,308,309],{},"lib\u002Frepositories"," so service logic remains testable\nwithout a database.",[159,312,314],{"id":313},"hot-state","Hot State",[155,316,317,318,321],{},"Several domains have ",[172,319,320],{},"hot"," command groups. Hot state keeps a runtime copy of\nfrequently accessed data in memory, then saves it back to durable storage when\nrequested. This is useful for player state that changes often during a session.",[155,323,324],{},"Typical hot-state flow:",[164,326,329],{"className":327,"code":328,"language":169,"meta":170},[167],"actor:hot:init\nactor:hot:get\nactor:hot:override\nactor:hot:save\nactor:hot:remove\n",[172,330,328],{"__ignoreMap":170},[155,332,333],{},"Use hot state for session workflows. Use normal domain commands for direct\ndurable CRUD operations.",[159,335,337],{"id":336},"transport-layer","Transport Layer",[155,339,340],{},"The transport layer exists because Arma extension calls have practical payload\nsize limits. It provides chunked request and response handling while still\nrouting to the same domain command groups.",[155,342,343],{},"Common direct command:",[164,345,349],{"className":346,"code":347,"language":348,"meta":170,"style":170},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"status\", []];\n","sqf",[172,350,351],{"__ignoreMap":170},[352,353,356],"span",{"class":354,"line":355},"line",1,[352,357,347],{},[155,359,360],{},"Common transport path:",[164,362,365],{"className":363,"code":364,"language":169,"meta":170},[167],"server addon fnc_extCall\n -> transport:request:append\n -> transport:invoke_stored\n -> transport:response:get\n",[172,366,364],{"__ignoreMap":170},[159,368,370],{"id":369},"configuration","Configuration",[155,372,373,374,377],{},"The server extension reads ",[172,375,376],{},"config.toml"," next to the extension DLL. The current\npersistence section is:",[164,379,383],{"className":380,"code":381,"language":382,"meta":170,"style":170},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[surreal]\nendpoint = \"127.0.0.1:8000\"\nnamespace = \"forge\"\ndatabase = \"main\"\nusername = \"root\"\npassword = \"root\"\nconnect_timeout_ms = 5000\n","toml",[172,384,385,390,396,402,408,414,420],{"__ignoreMap":170},[352,386,387],{"class":354,"line":355},[352,388,389],{},"[surreal]\n",[352,391,393],{"class":354,"line":392},2,[352,394,395],{},"endpoint = \"127.0.0.1:8000\"\n",[352,397,399],{"class":354,"line":398},3,[352,400,401],{},"namespace = \"forge\"\n",[352,403,405],{"class":354,"line":404},4,[352,406,407],{},"database = \"main\"\n",[352,409,411],{"class":354,"line":410},5,[352,412,413],{},"username = \"root\"\n",[352,415,417],{"class":354,"line":416},6,[352,418,419],{},"password = \"root\"\n",[352,421,423],{"class":354,"line":422},7,[352,424,425],{},"connect_timeout_ms = 5000\n",[155,427,428,429,303],{},"For install links and role-based setup guidance, see\n",[430,431,23],"a",{"href":24},[155,433,434],{},"Check persistence readiness before issuing commands that require storage:",[164,436,438],{"className":346,"code":437,"language":348,"meta":170,"style":170},"\"forge_server\" callExtension [\"status\", []];\n\"forge_server\" callExtension [\"surreal:status\", []];\n",[172,439,440,444],{"__ignoreMap":170},[352,441,442],{"class":354,"line":355},[352,443,347],{},[352,445,446],{"class":354,"line":392},[352,447,448],{},"\"forge_server\" callExtension [\"surreal:status\", []];\n",[450,451,452],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":170,"searchDepth":392,"depth":392,"links":454},[455,456,463,464,465],{"id":161,"depth":392,"text":162},{"id":187,"depth":392,"text":188,"children":457},[458,459,460,461,462],{"id":192,"depth":398,"text":94},{"id":202,"depth":398,"text":203},{"id":221,"depth":398,"text":222},{"id":254,"depth":398,"text":255},{"id":291,"depth":398,"text":292},{"id":313,"depth":392,"text":314},{"id":336,"depth":392,"text":337},{"id":369,"depth":392,"text":370},"md",null,{},true,{"title":11,"description":157},"iMv3ZlJLneWaY-rT4sboHwZgTUNknan2htKsPAMBaw0",[473,475],{"title":5,"path":6,"stem":7,"description":474,"children":-1},"Use this section as the main entry point for the Forge framework.",{"title":15,"path":16,"stem":17,"description":476,"children":-1},"This reference lists the main Forge modules and where each layer lives.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":477},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-architecture":145,"-getting-started-architecture-surround":472},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":11,"body":147,"description":157,"extension":466,"links":467,"meta":468,"navigation":469,"path":12,"seo":470,"stem":13,"__hash__":471},"docs\u002F1.getting-started\u002F1.architecture.md",{"type":148,"value":149,"toc":453},"minimark",[150,154,158,163,174,185,189,193,200,204,219,223,233,236,252,256,263,289,293,304,311,315,322,325,331,334,338,341,344,358,361,367,371,378,426,432,435,449],[151,152,11],"h1",{"id":153},"framework-architecture",[155,156,157],"p",{},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",[159,160,162],"h2",{"id":161},"runtime-flow","Runtime Flow",[164,165,171],"pre",{"className":166,"code":168,"language":169,"meta":170},[167],"language-text","Arma client UI or SQF action\n -> client addon bridge\n -> server addon function\n -> forge_server callExtension command\n -> extension command group\n -> forge-services domain service\n -> forge-repositories trait\n -> SurrealDB repository implementation\n -> SurrealDB\n","text","",[172,173,168],"code",{"__ignoreMap":170},[155,175,176,177,180,181,184],{},"For small payloads, server SQF calls ",[172,178,179],{},"forge_server"," directly through the\nextension bridge. For large payloads, ",[172,182,183],{},"arma\u002Fserver\u002Faddons\u002Fextension"," stages\nrequest and response chunks through the extension transport module.",[159,186,188],{"id":187},"main-layers","Main Layers",[190,191,94],"h3",{"id":192},"client-addons",[155,194,195,196,199],{},"Client addons live under ",[172,197,198],{},"arma\u002Fclient\u002Faddons",". They own local player UX,\nkeybinds, browser UI dialogs, and UI-to-SQF event handling. When a client needs\ndurable or authoritative state, it routes work to the matching server addon\ninstead of touching persistence directly.",[190,201,203],{"id":202},"server-addons","Server Addons",[155,205,206,207,210,211,214,215,218],{},"Server addons live under ",[172,208,209],{},"arma\u002Fserver\u002Faddons",". They own server-side SQF\ninitialization, game-object integration, validation near the Arma runtime, and\ncalls into the Rust extension. The ",[172,212,213],{},"extension"," addon is the shared bridge for\n",[172,216,217],{},"callExtension"," and transport handling.",[190,220,222],{"id":221},"rust-extension","Rust Extension",[155,224,225,226,229,230,232],{},"The server extension lives under ",[172,227,228],{},"arma\u002Fserver\u002Fextension",". It registers the\n",[172,231,179],{}," command groups, loads configuration, initializes SurrealDB, and\nmaps SQF command inputs into service calls.",[155,234,235],{},"The extension should stay thin:",[237,238,239,243,246,249],"ul",{},[240,241,242],"li",{},"Parse and validate command arguments that arrive from SQF.",[240,244,245],{},"Resolve Arma-specific context such as player UID when required.",[240,247,248],{},"Call the matching service.",[240,250,251],{},"Serialize the service result back to JSON or a simple string.",[190,253,255],{"id":254},"shared-rust-crates","Shared Rust Crates",[155,257,258,259,262],{},"The ",[172,260,261],{},"lib"," workspace contains reusable Rust crates:",[237,264,265,271,277,283],{},[240,266,267,270],{},[172,268,269],{},"forge-models",": shared domain structs and serialization rules.",[240,272,273,276],{},[172,274,275],{},"forge-repositories",": storage-agnostic repository traits and in-memory\nimplementations used by tests and hot-state services.",[240,278,279,282],{},[172,280,281],{},"forge-services",": domain behavior, validation, and mutation workflows.",[240,284,285,288],{},[172,286,287],{},"forge-shared",": cross-crate helpers.",[190,290,292],{"id":291},"persistence","Persistence",[155,294,295,296,299,300,303],{},"Durable storage is SurrealDB. Schema modules live under\n",[172,297,298],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fschema",", and concrete SurrealDB repository\nimplementations live under ",[172,301,302],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fstorage",".",[155,305,306,307,310],{},"Repository traits stay in ",[172,308,309],{},"lib\u002Frepositories"," so service logic remains testable\nwithout a database.",[159,312,314],{"id":313},"hot-state","Hot State",[155,316,317,318,321],{},"Several domains have ",[172,319,320],{},"hot"," command groups. Hot state keeps a runtime copy of\nfrequently accessed data in memory, then saves it back to durable storage when\nrequested. This is useful for player state that changes often during a session.",[155,323,324],{},"Typical hot-state flow:",[164,326,329],{"className":327,"code":328,"language":169,"meta":170},[167],"actor:hot:init\nactor:hot:get\nactor:hot:override\nactor:hot:save\nactor:hot:remove\n",[172,330,328],{"__ignoreMap":170},[155,332,333],{},"Use hot state for session workflows. Use normal domain commands for direct\ndurable CRUD operations.",[159,335,337],{"id":336},"transport-layer","Transport Layer",[155,339,340],{},"The transport layer exists because Arma extension calls have practical payload\nsize limits. It provides chunked request and response handling while still\nrouting to the same domain command groups.",[155,342,343],{},"Common direct command:",[164,345,349],{"className":346,"code":347,"language":348,"meta":170,"style":170},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"status\", []];\n","sqf",[172,350,351],{"__ignoreMap":170},[352,353,356],"span",{"class":354,"line":355},"line",1,[352,357,347],{},[155,359,360],{},"Common transport path:",[164,362,365],{"className":363,"code":364,"language":169,"meta":170},[167],"server addon fnc_extCall\n -> transport:request:append\n -> transport:invoke_stored\n -> transport:response:get\n",[172,366,364],{"__ignoreMap":170},[159,368,370],{"id":369},"configuration","Configuration",[155,372,373,374,377],{},"The server extension reads ",[172,375,376],{},"config.toml"," next to the extension DLL. The current\npersistence section is:",[164,379,383],{"className":380,"code":381,"language":382,"meta":170,"style":170},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[surreal]\nendpoint = \"127.0.0.1:8000\"\nnamespace = \"forge\"\ndatabase = \"main\"\nusername = \"root\"\npassword = \"root\"\nconnect_timeout_ms = 5000\n","toml",[172,384,385,390,396,402,408,414,420],{"__ignoreMap":170},[352,386,387],{"class":354,"line":355},[352,388,389],{},"[surreal]\n",[352,391,393],{"class":354,"line":392},2,[352,394,395],{},"endpoint = \"127.0.0.1:8000\"\n",[352,397,399],{"class":354,"line":398},3,[352,400,401],{},"namespace = \"forge\"\n",[352,403,405],{"class":354,"line":404},4,[352,406,407],{},"database = \"main\"\n",[352,409,411],{"class":354,"line":410},5,[352,412,413],{},"username = \"root\"\n",[352,415,417],{"class":354,"line":416},6,[352,418,419],{},"password = \"root\"\n",[352,421,423],{"class":354,"line":422},7,[352,424,425],{},"connect_timeout_ms = 5000\n",[155,427,428,429,303],{},"For install links and role-based setup guidance, see\n",[430,431,23],"a",{"href":24},[155,433,434],{},"Check persistence readiness before issuing commands that require storage:",[164,436,438],{"className":346,"code":437,"language":348,"meta":170,"style":170},"\"forge_server\" callExtension [\"status\", []];\n\"forge_server\" callExtension [\"surreal:status\", []];\n",[172,439,440,444],{"__ignoreMap":170},[352,441,442],{"class":354,"line":355},[352,443,347],{},[352,445,446],{"class":354,"line":392},[352,447,448],{},"\"forge_server\" callExtension [\"surreal:status\", []];\n",[450,451,452],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":170,"searchDepth":392,"depth":392,"links":454},[455,456,463,464,465],{"id":161,"depth":392,"text":162},{"id":187,"depth":392,"text":188,"children":457},[458,459,460,461,462],{"id":192,"depth":398,"text":94},{"id":202,"depth":398,"text":203},{"id":221,"depth":398,"text":222},{"id":254,"depth":398,"text":255},{"id":291,"depth":398,"text":292},{"id":313,"depth":392,"text":314},{"id":336,"depth":392,"text":337},{"id":369,"depth":392,"text":370},"md",null,{},true,{"title":11,"description":157},"iMv3ZlJLneWaY-rT4sboHwZgTUNknan2htKsPAMBaw0",[473,475],{"title":5,"path":6,"stem":7,"description":474,"children":-1},"Use this section as the main entry point for the Forge framework.",{"title":15,"path":16,"stem":17,"description":476,"children":-1},"This reference lists the main Forge modules and where each layer lives.",1776806627742] \ No newline at end of file diff --git a/docus/dist/getting-started/development.html b/docus/dist/getting-started/development.html index 2e5fc96..823c73f 100644 --- a/docus/dist/getting-started/development.html +++ b/docus/dist/getting-started/development.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Development Guide - forge-docus
    Getting Started

    Development Guide

    This guide covers the usual path for adding or changing a Forge module.

    Development Guide

    This guide covers the usual path for adding or changing a Forge module.

    Local Checks

    Before running storage-backed workflows locally, complete +}Development Guide - forge-docus

    Getting Started

    Development Guide

    This guide covers the usual path for adding or changing a Forge module.

    Development Guide

    This guide covers the usual path for adding or changing a Forge module.

    Local Checks

    Before running storage-backed workflows locally, complete SurrealDB Setup.

    Run these before pushing Rust or extension changes:

    cargo fmt --check
     cargo check
     cargo test
    @@ -120,4 +120,4 @@ under that addon's Documentation Checklist

    When adding or changing a module, update:

    • docs/MODULE_REFERENCE.md for framework-level inventory.
    • A module-specific README in the addon directory when SQF or UI usage changes.
    • arma/server/docs/api-reference.md when extension commands change.
    • Existing usage guides when payload shapes or workflows change.
    Copyright © 2026
    \ No newline at end of file +comes down to running a reachable database and matching the Forge config.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/getting-started/development/_payload.json b/docus/dist/getting-started/development/_payload.json index eeddba8..0a230b2 100644 --- a/docus/dist/getting-started/development/_payload.json +++ b/docus/dist/getting-started/development/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":688},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-development":145,"-getting-started-development-surround":683},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":19,"body":147,"description":157,"extension":678,"links":679,"meta":680,"navigation":517,"path":20,"seo":681,"stem":21,"__hash__":682},"docs\u002F1.getting-started\u002F3.development.md",{"type":148,"value":149,"toc":668},"minimark",[150,154,158,163,170,173,215,218,227,230,239,243,246,350,354,451,455,458,486,493,496,546,550,553,556,574,578,581,613,619,623,630,637,641,644,664],[151,152,19],"h1",{"id":153},"development-guide",[155,156,157],"p",{},"This guide covers the usual path for adding or changing a Forge module.",[159,160,162],"h2",{"id":161},"local-checks","Local Checks",[155,164,165,166,169],{},"Before running storage-backed workflows locally, complete\n",[167,168,23],"a",{"href":24},".",[155,171,172],{},"Run these before pushing Rust or extension changes:",[174,175,180],"pre",{"className":176,"code":177,"language":178,"meta":179,"style":179},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cargo fmt --check\ncargo check\ncargo test\ncargo build\ncargo clippy --all-targets --all-features -- -D warnings\n","powershell","",[181,182,183,191,197,203,209],"code",{"__ignoreMap":179},[184,185,188],"span",{"class":186,"line":187},"line",1,[184,189,190],{},"cargo fmt --check\n",[184,192,194],{"class":186,"line":193},2,[184,195,196],{},"cargo check\n",[184,198,200],{"class":186,"line":199},3,[184,201,202],{},"cargo test\n",[184,204,206],{"class":186,"line":205},4,[184,207,208],{},"cargo build\n",[184,210,212],{"class":186,"line":211},5,[184,213,214],{},"cargo clippy --all-targets --all-features -- -D warnings\n",[155,216,217],{},"Run this after changing browser UI sources:",[174,219,221],{"className":176,"code":220,"language":178,"meta":179,"style":179},"npm run build:webui\n",[181,222,223],{"__ignoreMap":179},[184,224,225],{"class":186,"line":187},[184,226,220],{},[155,228,229],{},"Build Arma packages with:",[174,231,233],{"className":176,"code":232,"language":178,"meta":179,"style":179},".\\build-arma.ps1\n",[181,234,235],{"__ignoreMap":179},[184,236,237],{"class":186,"line":187},[184,238,232],{},[159,240,242],{"id":241},"module-boundaries","Module Boundaries",[155,244,245],{},"Keep each layer responsible for one kind of work:",[247,248,249,265],"table",{},[250,251,252],"thead",{},[253,254,255,259,262],"tr",{},[256,257,258],"th",{},"Layer",[256,260,261],{},"Owns",[256,263,264],{},"Avoid",[266,267,268,282,295,308,321,337],"tbody",{},[253,269,270,276,279],{},[271,272,273],"td",{},[181,274,275],{},"lib\u002Fmodels",[271,277,278],{},"Data structures, serde defaults, validation helpers.",[271,280,281],{},"Database calls, SQF-specific context.",[253,283,284,289,292],{},[271,285,286],{},[181,287,288],{},"lib\u002Frepositories",[271,290,291],{},"Repository traits and in-memory stores.",[271,293,294],{},"SurrealDB-specific code.",[253,296,297,302,305],{},[271,298,299],{},[181,300,301],{},"lib\u002Fservices",[271,303,304],{},"Business rules, workflow orchestration, structured results.",[271,306,307],{},"Arma engine calls, extension transport details.",[253,309,310,315,318],{},[271,311,312],{},[181,313,314],{},"arma\u002Fserver\u002Fextension",[271,316,317],{},"Command parsing, context resolution, SurrealDB implementations, serialization to SQF.",[271,319,320],{},"Business rules that belong in services.",[253,322,323,328,334],{},[271,324,325],{},[181,326,327],{},"arma\u002Fserver\u002Faddons",[271,329,330,331,169],{},"Server SQF lifecycle, game-object integration, calls into ",[181,332,333],{},"forge_server",[271,335,336],{},"Direct database logic.",[253,338,339,344,347],{},[271,340,341],{},[181,342,343],{},"arma\u002Fclient\u002Faddons",[271,345,346],{},"Client UI, keybinds, local UI events.",[271,348,349],{},"Authoritative persistence.",[159,351,353],{"id":352},"adding-a-domain-module","Adding a Domain Module",[355,356,357,364,370,376,379,385,391,394,400,406,412,418,424,430,437,444],"ol",{},[358,359,360,361,169],"li",{},"Add the model in ",[181,362,363],{},"lib\u002Fmodels\u002Fsrc\u002F\u003Cmodule>.rs",[358,365,366,367,169],{},"Export the model from ",[181,368,369],{},"lib\u002Fmodels\u002Fsrc\u002Flib.rs",[358,371,372,373,169],{},"Add repository traits in ",[181,374,375],{},"lib\u002Frepositories\u002Fsrc\u002F\u003Cmodule>.rs",[358,377,378],{},"Add in-memory repository support if the service needs tests or hot state.",[358,380,381,382,169],{},"Export the traits from ",[181,383,384],{},"lib\u002Frepositories\u002Fsrc\u002Flib.rs",[358,386,387,388,169],{},"Add service logic in ",[181,389,390],{},"lib\u002Fservices\u002Fsrc\u002F\u003Cmodule>.rs",[358,392,393],{},"Add focused unit tests for service behavior.",[358,395,396,397,169],{},"Export the service from ",[181,398,399],{},"lib\u002Fservices\u002Fsrc\u002Flib.rs",[358,401,402,403,169],{},"Add a SurrealDB schema module under ",[181,404,405],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fschema",[358,407,408,409,169],{},"Add the concrete storage adapter under ",[181,410,411],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fstorage",[358,413,414,415,169],{},"Register the storage adapter in ",[181,416,417],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fstorage.rs",[358,419,420,421,169],{},"Add an extension command group under ",[181,422,423],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002F\u003Cmodule>.rs",[358,425,426,427,169],{},"Register the command group in ",[181,428,429],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Flib.rs",[358,431,432,433,436],{},"Add server addon functions under ",[181,434,435],{},"arma\u002Fserver\u002Faddons\u002F\u003Cmodule>"," if SQF needs a module-level API.",[358,438,439,440,443],{},"Add client addon or browser UI files under ",[181,441,442],{},"arma\u002Fclient\u002Faddons\u002F\u003Cmodule>"," if the module has player-facing UI.",[358,445,446,447,450],{},"Add documentation in ",[181,448,449],{},"docs\u002F"," and module-level READMEs.",[159,452,454],{"id":453},"extension-command-rules","Extension Command Rules",[155,456,457],{},"Commands should return one of these forms:",[459,460,461,464,474,480],"ul",{},[358,462,463],{},"JSON string for structured results.",[358,465,466,469,470,473],{},[181,467,468],{},"\"true\""," or ",[181,471,472],{},"\"false\""," for simple existence and boolean operations.",[358,475,476,479],{},[181,477,478],{},"\"OK\""," for successful destructive operations with no response body.",[358,481,482,485],{},[181,483,484],{},"\"Error: \u003Cmessage>\""," for failures.",[155,487,488,489,492],{},"Prefer stable JSON shapes over ad hoc strings. SQF callers should always check\nfor the ",[181,490,491],{},"\"Error:\""," prefix before parsing JSON.",[155,494,495],{},"Example:",[174,497,501],{"className":498,"code":499,"language":500,"meta":179,"style":179},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Actor request failed: %1\", _payload];\n};\n\nprivate _actor = fromJSON _payload;\n","sqf",[181,502,503,508,513,519,524,529,535,540],{"__ignoreMap":179},[184,504,505],{"class":186,"line":187},[184,506,507],{},"private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\n",[184,509,510],{"class":186,"line":193},[184,511,512],{},"private _payload = _result select 0;\n",[184,514,515],{"class":186,"line":199},[184,516,518],{"emptyLinePlaceholder":517},true,"\n",[184,520,521],{"class":186,"line":205},[184,522,523],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[184,525,526],{"class":186,"line":211},[184,527,528],{}," systemChat format [\"Actor request failed: %1\", _payload];\n",[184,530,532],{"class":186,"line":531},6,[184,533,534],{},"};\n",[184,536,538],{"class":186,"line":537},7,[184,539,518],{"emptyLinePlaceholder":517},[184,541,543],{"class":186,"line":542},8,[184,544,545],{},"private _actor = fromJSON _payload;\n",[159,547,549],{"id":548},"persistence-rules","Persistence Rules",[155,551,552],{},"SurrealDB is the durable store. Keep database-specific mapping in the extension\nstorage adapters, not in services or repository traits.",[155,554,555],{},"When changing persisted data:",[459,557,558,565,568,571],{},[358,559,560,561,564],{},"Update or add the matching ",[181,562,563],{},".surql"," schema module.",[358,566,567],{},"Update the concrete storage adapter.",[358,569,570],{},"Preserve existing records when possible through serde defaults or migration\nlogic.",[358,572,573],{},"Add tests at the service level for behavior, and add storage tests only when\ndatabase mapping is the risk.",[159,575,577],{"id":576},"hot-state-rules","Hot-State Rules",[155,579,580],{},"Use hot state for data that is read or mutated frequently during a player\nsession. Hot-state modules usually provide:",[459,582,583,589,595,601,607],{},[358,584,585,588],{},[181,586,587],{},"init"," to load durable state into memory.",[358,590,591,594],{},[181,592,593],{},"get"," to read the runtime copy.",[358,596,597,600],{},[181,598,599],{},"override"," or focused mutation commands to update the runtime copy.",[358,602,603,606],{},[181,604,605],{},"save"," to write the runtime copy back to SurrealDB.",[358,608,609,612],{},[181,610,611],{},"remove"," to evict the runtime copy.",[155,614,615,616,618],{},"Do not assume hot state is durable until ",[181,617,605],{}," succeeds.",[159,620,622],{"id":621},"web-ui-rules","Web UI Rules",[155,624,625,626,629],{},"Browser UI source files live under each client addon. Built assets usually land\nunder that addon's ",[181,627,628],{},"ui\u002F_site"," directory.",[155,631,632,633,636],{},"Use the existing common bridge in ",[181,634,635],{},"arma\u002Fclient\u002Faddons\u002Fcommon"," when a UI needs\nto send events back to SQF. Keep UI state and rendering in JavaScript, and keep\nserver-authoritative decisions in server SQF or Rust services.",[159,638,640],{"id":639},"documentation-checklist","Documentation Checklist",[155,642,643],{},"When adding or changing a module, update:",[459,645,646,652,655,661],{},[358,647,648,651],{},[181,649,650],{},"docs\u002FMODULE_REFERENCE.md"," for framework-level inventory.",[358,653,654],{},"A module-specific README in the addon directory when SQF or UI usage changes.",[358,656,657,660],{},[181,658,659],{},"arma\u002Fserver\u002Fdocs\u002Fapi-reference.md"," when extension commands change.",[358,662,663],{},"Existing usage guides when payload shapes or workflows change.",[665,666,667],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":179,"searchDepth":193,"depth":193,"links":669},[670,671,672,673,674,675,676,677],{"id":161,"depth":193,"text":162},{"id":241,"depth":193,"text":242},{"id":352,"depth":193,"text":353},{"id":453,"depth":193,"text":454},{"id":548,"depth":193,"text":549},{"id":576,"depth":193,"text":577},{"id":621,"depth":193,"text":622},{"id":639,"depth":193,"text":640},"md",null,{},{"title":19,"description":157},"SACXFQxkQonJpusqYCXgr0NFhrv1Imz0UFQfb7-7iGg",[684,686],{"title":15,"path":16,"stem":17,"description":685,"children":-1},"This reference lists the main Forge modules and where each layer lives.",{"title":23,"path":24,"stem":25,"description":687,"children":-1},"Forge uses SurrealDB for durable storage. The Rust server extension connects to\nSurrealDB on startup and applies Forge schema modules automatically, so setup\ncomes down to running a reachable database and matching the Forge config.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":688},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-development":145,"-getting-started-development-surround":683},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":19,"body":147,"description":157,"extension":678,"links":679,"meta":680,"navigation":517,"path":20,"seo":681,"stem":21,"__hash__":682},"docs\u002F1.getting-started\u002F3.development.md",{"type":148,"value":149,"toc":668},"minimark",[150,154,158,163,170,173,215,218,227,230,239,243,246,350,354,451,455,458,486,493,496,546,550,553,556,574,578,581,613,619,623,630,637,641,644,664],[151,152,19],"h1",{"id":153},"development-guide",[155,156,157],"p",{},"This guide covers the usual path for adding or changing a Forge module.",[159,160,162],"h2",{"id":161},"local-checks","Local Checks",[155,164,165,166,169],{},"Before running storage-backed workflows locally, complete\n",[167,168,23],"a",{"href":24},".",[155,171,172],{},"Run these before pushing Rust or extension changes:",[174,175,180],"pre",{"className":176,"code":177,"language":178,"meta":179,"style":179},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cargo fmt --check\ncargo check\ncargo test\ncargo build\ncargo clippy --all-targets --all-features -- -D warnings\n","powershell","",[181,182,183,191,197,203,209],"code",{"__ignoreMap":179},[184,185,188],"span",{"class":186,"line":187},"line",1,[184,189,190],{},"cargo fmt --check\n",[184,192,194],{"class":186,"line":193},2,[184,195,196],{},"cargo check\n",[184,198,200],{"class":186,"line":199},3,[184,201,202],{},"cargo test\n",[184,204,206],{"class":186,"line":205},4,[184,207,208],{},"cargo build\n",[184,210,212],{"class":186,"line":211},5,[184,213,214],{},"cargo clippy --all-targets --all-features -- -D warnings\n",[155,216,217],{},"Run this after changing browser UI sources:",[174,219,221],{"className":176,"code":220,"language":178,"meta":179,"style":179},"npm run build:webui\n",[181,222,223],{"__ignoreMap":179},[184,224,225],{"class":186,"line":187},[184,226,220],{},[155,228,229],{},"Build Arma packages with:",[174,231,233],{"className":176,"code":232,"language":178,"meta":179,"style":179},".\\build-arma.ps1\n",[181,234,235],{"__ignoreMap":179},[184,236,237],{"class":186,"line":187},[184,238,232],{},[159,240,242],{"id":241},"module-boundaries","Module Boundaries",[155,244,245],{},"Keep each layer responsible for one kind of work:",[247,248,249,265],"table",{},[250,251,252],"thead",{},[253,254,255,259,262],"tr",{},[256,257,258],"th",{},"Layer",[256,260,261],{},"Owns",[256,263,264],{},"Avoid",[266,267,268,282,295,308,321,337],"tbody",{},[253,269,270,276,279],{},[271,272,273],"td",{},[181,274,275],{},"lib\u002Fmodels",[271,277,278],{},"Data structures, serde defaults, validation helpers.",[271,280,281],{},"Database calls, SQF-specific context.",[253,283,284,289,292],{},[271,285,286],{},[181,287,288],{},"lib\u002Frepositories",[271,290,291],{},"Repository traits and in-memory stores.",[271,293,294],{},"SurrealDB-specific code.",[253,296,297,302,305],{},[271,298,299],{},[181,300,301],{},"lib\u002Fservices",[271,303,304],{},"Business rules, workflow orchestration, structured results.",[271,306,307],{},"Arma engine calls, extension transport details.",[253,309,310,315,318],{},[271,311,312],{},[181,313,314],{},"arma\u002Fserver\u002Fextension",[271,316,317],{},"Command parsing, context resolution, SurrealDB implementations, serialization to SQF.",[271,319,320],{},"Business rules that belong in services.",[253,322,323,328,334],{},[271,324,325],{},[181,326,327],{},"arma\u002Fserver\u002Faddons",[271,329,330,331,169],{},"Server SQF lifecycle, game-object integration, calls into ",[181,332,333],{},"forge_server",[271,335,336],{},"Direct database logic.",[253,338,339,344,347],{},[271,340,341],{},[181,342,343],{},"arma\u002Fclient\u002Faddons",[271,345,346],{},"Client UI, keybinds, local UI events.",[271,348,349],{},"Authoritative persistence.",[159,351,353],{"id":352},"adding-a-domain-module","Adding a Domain Module",[355,356,357,364,370,376,379,385,391,394,400,406,412,418,424,430,437,444],"ol",{},[358,359,360,361,169],"li",{},"Add the model in ",[181,362,363],{},"lib\u002Fmodels\u002Fsrc\u002F\u003Cmodule>.rs",[358,365,366,367,169],{},"Export the model from ",[181,368,369],{},"lib\u002Fmodels\u002Fsrc\u002Flib.rs",[358,371,372,373,169],{},"Add repository traits in ",[181,374,375],{},"lib\u002Frepositories\u002Fsrc\u002F\u003Cmodule>.rs",[358,377,378],{},"Add in-memory repository support if the service needs tests or hot state.",[358,380,381,382,169],{},"Export the traits from ",[181,383,384],{},"lib\u002Frepositories\u002Fsrc\u002Flib.rs",[358,386,387,388,169],{},"Add service logic in ",[181,389,390],{},"lib\u002Fservices\u002Fsrc\u002F\u003Cmodule>.rs",[358,392,393],{},"Add focused unit tests for service behavior.",[358,395,396,397,169],{},"Export the service from ",[181,398,399],{},"lib\u002Fservices\u002Fsrc\u002Flib.rs",[358,401,402,403,169],{},"Add a SurrealDB schema module under ",[181,404,405],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fschema",[358,407,408,409,169],{},"Add the concrete storage adapter under ",[181,410,411],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fstorage",[358,413,414,415,169],{},"Register the storage adapter in ",[181,416,417],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fstorage.rs",[358,419,420,421,169],{},"Add an extension command group under ",[181,422,423],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002F\u003Cmodule>.rs",[358,425,426,427,169],{},"Register the command group in ",[181,428,429],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Flib.rs",[358,431,432,433,436],{},"Add server addon functions under ",[181,434,435],{},"arma\u002Fserver\u002Faddons\u002F\u003Cmodule>"," if SQF needs a module-level API.",[358,438,439,440,443],{},"Add client addon or browser UI files under ",[181,441,442],{},"arma\u002Fclient\u002Faddons\u002F\u003Cmodule>"," if the module has player-facing UI.",[358,445,446,447,450],{},"Add documentation in ",[181,448,449],{},"docs\u002F"," and module-level READMEs.",[159,452,454],{"id":453},"extension-command-rules","Extension Command Rules",[155,456,457],{},"Commands should return one of these forms:",[459,460,461,464,474,480],"ul",{},[358,462,463],{},"JSON string for structured results.",[358,465,466,469,470,473],{},[181,467,468],{},"\"true\""," or ",[181,471,472],{},"\"false\""," for simple existence and boolean operations.",[358,475,476,479],{},[181,477,478],{},"\"OK\""," for successful destructive operations with no response body.",[358,481,482,485],{},[181,483,484],{},"\"Error: \u003Cmessage>\""," for failures.",[155,487,488,489,492],{},"Prefer stable JSON shapes over ad hoc strings. SQF callers should always check\nfor the ",[181,490,491],{},"\"Error:\""," prefix before parsing JSON.",[155,494,495],{},"Example:",[174,497,501],{"className":498,"code":499,"language":500,"meta":179,"style":179},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Actor request failed: %1\", _payload];\n};\n\nprivate _actor = fromJSON _payload;\n","sqf",[181,502,503,508,513,519,524,529,535,540],{"__ignoreMap":179},[184,504,505],{"class":186,"line":187},[184,506,507],{},"private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\n",[184,509,510],{"class":186,"line":193},[184,511,512],{},"private _payload = _result select 0;\n",[184,514,515],{"class":186,"line":199},[184,516,518],{"emptyLinePlaceholder":517},true,"\n",[184,520,521],{"class":186,"line":205},[184,522,523],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[184,525,526],{"class":186,"line":211},[184,527,528],{}," systemChat format [\"Actor request failed: %1\", _payload];\n",[184,530,532],{"class":186,"line":531},6,[184,533,534],{},"};\n",[184,536,538],{"class":186,"line":537},7,[184,539,518],{"emptyLinePlaceholder":517},[184,541,543],{"class":186,"line":542},8,[184,544,545],{},"private _actor = fromJSON _payload;\n",[159,547,549],{"id":548},"persistence-rules","Persistence Rules",[155,551,552],{},"SurrealDB is the durable store. Keep database-specific mapping in the extension\nstorage adapters, not in services or repository traits.",[155,554,555],{},"When changing persisted data:",[459,557,558,565,568,571],{},[358,559,560,561,564],{},"Update or add the matching ",[181,562,563],{},".surql"," schema module.",[358,566,567],{},"Update the concrete storage adapter.",[358,569,570],{},"Preserve existing records when possible through serde defaults or migration\nlogic.",[358,572,573],{},"Add tests at the service level for behavior, and add storage tests only when\ndatabase mapping is the risk.",[159,575,577],{"id":576},"hot-state-rules","Hot-State Rules",[155,579,580],{},"Use hot state for data that is read or mutated frequently during a player\nsession. Hot-state modules usually provide:",[459,582,583,589,595,601,607],{},[358,584,585,588],{},[181,586,587],{},"init"," to load durable state into memory.",[358,590,591,594],{},[181,592,593],{},"get"," to read the runtime copy.",[358,596,597,600],{},[181,598,599],{},"override"," or focused mutation commands to update the runtime copy.",[358,602,603,606],{},[181,604,605],{},"save"," to write the runtime copy back to SurrealDB.",[358,608,609,612],{},[181,610,611],{},"remove"," to evict the runtime copy.",[155,614,615,616,618],{},"Do not assume hot state is durable until ",[181,617,605],{}," succeeds.",[159,620,622],{"id":621},"web-ui-rules","Web UI Rules",[155,624,625,626,629],{},"Browser UI source files live under each client addon. Built assets usually land\nunder that addon's ",[181,627,628],{},"ui\u002F_site"," directory.",[155,631,632,633,636],{},"Use the existing common bridge in ",[181,634,635],{},"arma\u002Fclient\u002Faddons\u002Fcommon"," when a UI needs\nto send events back to SQF. Keep UI state and rendering in JavaScript, and keep\nserver-authoritative decisions in server SQF or Rust services.",[159,638,640],{"id":639},"documentation-checklist","Documentation Checklist",[155,642,643],{},"When adding or changing a module, update:",[459,645,646,652,655,661],{},[358,647,648,651],{},[181,649,650],{},"docs\u002FMODULE_REFERENCE.md"," for framework-level inventory.",[358,653,654],{},"A module-specific README in the addon directory when SQF or UI usage changes.",[358,656,657,660],{},[181,658,659],{},"arma\u002Fserver\u002Fdocs\u002Fapi-reference.md"," when extension commands change.",[358,662,663],{},"Existing usage guides when payload shapes or workflows change.",[665,666,667],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":179,"searchDepth":193,"depth":193,"links":669},[670,671,672,673,674,675,676,677],{"id":161,"depth":193,"text":162},{"id":241,"depth":193,"text":242},{"id":352,"depth":193,"text":353},{"id":453,"depth":193,"text":454},{"id":548,"depth":193,"text":549},{"id":576,"depth":193,"text":577},{"id":621,"depth":193,"text":622},{"id":639,"depth":193,"text":640},"md",null,{},{"title":19,"description":157},"SACXFQxkQonJpusqYCXgr0NFhrv1Imz0UFQfb7-7iGg",[684,686],{"title":15,"path":16,"stem":17,"description":685,"children":-1},"This reference lists the main Forge modules and where each layer lives.",{"title":23,"path":24,"stem":25,"description":687,"children":-1},"Forge uses SurrealDB for durable storage. The Rust server extension connects to\nSurrealDB on startup and applies Forge schema modules automatically, so setup\ncomes down to running a reachable database and matching the Forge config.",1776806627742] \ No newline at end of file diff --git a/docus/dist/getting-started/module-reference.html b/docus/dist/getting-started/module-reference.html index b7573fe..962ede0 100644 --- a/docus/dist/getting-started/module-reference.html +++ b/docus/dist/getting-started/module-reference.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Module Reference - forge-docus
    Getting Started

    Module Reference

    This reference lists the main Forge modules and where each layer lives.

    Module Reference

    This reference lists the main Forge modules and where each layer lives.

    Directory Map

    arma/client/addons/      Client-side Arma addons and browser UIs
    +}Module Reference - forge-docus
    Getting Started

    Module Reference

    This reference lists the main Forge modules and where each layer lives.

    Module Reference

    This reference lists the main Forge modules and where each layer lives.

    Directory Map

    arma/client/addons/      Client-side Arma addons and browser UIs
     arma/server/addons/      Server-side Arma addons and extension bridge
     arma/server/extension/   Rust arma-rs extension and SurrealDB adapters
     bin/icom/                Interprocess communication helper
    @@ -131,4 +131,4 @@ docs/                    Framework-level documentation
     

    Nested groups use additional : separators, for example bank:hot:deposit.

    Core

    CommandPurpose
    versionReturn the extension version string.
    statusReturn SurrealDB connection state.
    surreal:statusReturn SurrealDB connection state directly from the Surreal module.

    Actor

    CommandPurpose
    actor:getFetch actor data for a resolved player UID.
    actor:createCreate actor data from JSON.
    actor:updateApply actor JSON updates.
    actor:existsReturn true or false.
    actor:deleteDelete actor data.
    actor:hot:init, actor:hot:get, actor:hot:keys, actor:hot:override, actor:hot:save, actor:hot:removeManage actor hot state.

    See Actor Usage Guide for examples.

    Bank

    CommandPurpose
    bank:get, bank:create, bank:update, bank:exists, bank:deleteDurable bank CRUD.
    bank:hot:init, bank:hot:get, bank:hot:override, bank:hot:patch, bank:hot:save, bank:hot:removeManage bank hot state.
    bank:hot:deposit, bank:hot:withdraw, bank:hot:deposit_earnings, bank:hot:transferMutate hot bank balances with operation context.
    bank:hot:charge_checkoutCharge a checkout against hot bank state.
    bank:hot:validate_pinValidate a PIN for bank operations.

    See Bank Usage Guide for examples.

    Garage

    CommandPurpose
    garage:create, garage:get, garage:add, garage:update, garage:patch, garage:remove, garage:delete, garage:existsDurable player garage operations.
    garage:hot:init, garage:hot:get, garage:hot:override, garage:hot:add, garage:hot:remove_vehicle, garage:hot:save, garage:hot:removeManage player garage hot state.

    See Garage Usage Guide for examples.

    Locker

    CommandPurpose
    locker:create, locker:get, locker:add, locker:update, locker:patch, locker:remove, locker:delete, locker:existsDurable player locker operations.
    locker:hot:init, locker:hot:get, locker:hot:override, locker:hot:save, locker:hot:removeManage player locker hot state.

    See Locker Usage Guide for examples.

    Organization

    CommandPurpose
    org:get, org:create, org:update, org:exists, org:deleteDurable organization CRUD.
    org:assets:get, org:assets:updateManage organization assets.
    org:fleet:get, org:fleet:updateManage organization fleet entries.
    org:members:get, org:members:add, org:members:removeManage organization membership.
    org:hot:*Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove.

    See Org Usage Guide for examples.

    Phone

    CommandPurpose
    phone:initInitialize phone state for a UID.
    phone:contacts:list, phone:contacts:add, phone:contacts:removeManage contacts.
    phone:messages:list, phone:messages:thread, phone:messages:send, phone:messages:mark_read, phone:messages:deleteManage messages.
    phone:emails:list, phone:emails:send, phone:emails:mark_read, phone:emails:deleteManage emails.
    phone:removeRemove phone state for a UID.

    See Phone Usage Guide for examples.

    CAD

    Command GroupPurpose
    cad:activity:append, cad:activity:recentAppend and read recent activity.
    cad:assignments:list, cad:assignments:assign, cad:assignments:acknowledge, cad:assignments:decline, cad:assignments:upsert, cad:assignments:deleteManage dispatch assignments.
    cad:orders:list, cad:orders:create, cad:orders:create_from_context, cad:orders:close, cad:orders:upsert, cad:orders:deleteManage orders.
    cad:requests:list, cad:requests:submit, cad:requests:submit_from_context, cad:requests:close, cad:requests:upsert, cad:requests:deleteManage requests.
    cad:profiles:list, cad:profiles:update_from_context, cad:profiles:upsert, cad:profiles:deleteManage profiles.
    cad:groups:buildBuild grouped CAD state.
    cad:view:hydrateBuild the dispatcher view model.

    See CAD Usage Guide for examples.

    Task

    Command GroupPurpose
    task:resetReset task state.
    task:catalog:active, task:catalog:get, task:catalog:upsert, task:catalog:deleteManage task catalog entries.
    task:ownership:bind, task:ownership:release, task:ownership:accept, task:ownership:reward_contextManage task ownership and rewards.
    task:status:set, task:status:get, task:status:clearManage task status.
    task:defuse:increment, task:defuse:getManage defuse counters.
    task:clearClear task state.

    See Task Usage Guide for examples.

    Owned Storage

    Command GroupPurpose
    owned:garage:create, owned:garage:fetch, owned:garage:get, owned:garage:add, owned:garage:remove, owned:garage:delete, owned:garage:existsOwner-scoped vehicle storage.
    owned:garage:hot:*Owner-scoped vehicle hot state.
    owned:locker:create, owned:locker:fetch, owned:locker:get, owned:locker:add, owned:locker:remove, owned:locker:delete, owned:locker:existsOwner-scoped item storage.
    owned:locker:hot:*Owner-scoped item hot state.

    See Owned Storage Usage Guide for examples.

    Other Extension Groups

    Command GroupPurpose
    store:checkoutRun store checkout behavior.
    icom:connect, icom:broadcast, icom:send_eventICom connection and event forwarding.
    terrain:exportSVGExport terrain data as SVG.
    transport:invoke, transport:invoke_storedInvoke commands through transport.
    transport:request:append, transport:request:clearManage stored request chunks.
    transport:response:get, transport:response:clearManage stored response chunks.

    Rust Crates

    CrateRole
    forge-modelsDomain models and validation. Keep these serializable and free of persistence details.
    forge-repositoriesRepository traits and in-memory implementations. Keep these storage-agnostic.
    forge-servicesBusiness rules and workflows. Depend on repository traits, not concrete databases.
    forge-sharedCross-crate helpers. Keep dependencies light.
    forge-serverArma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters.
    forge-icomICom helper binary and client library.
    Copyright © 2026
    \ No newline at end of file +handlers, and optional browser UI.

    Development Guide

    This guide covers the usual path for adding or changing a Forge module.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/getting-started/module-reference/_payload.json b/docus/dist/getting-started/module-reference/_payload.json index f8344ec..841478a 100644 --- a/docus/dist/getting-started/module-reference/_payload.json +++ b/docus/dist/getting-started/module-reference/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1959},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-module-reference":145,"-getting-started-module-reference-surround":1954},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":15,"body":147,"description":157,"extension":1948,"links":1949,"meta":1950,"navigation":1951,"path":16,"seo":1952,"stem":17,"__hash__":1953},"docs\u002F1.getting-started\u002F2.module-reference.md",{"type":148,"value":149,"toc":1927},"minimark",[150,154,158,163,174,178,553,583,614,618,782,786,789,803,813,818,861,864,958,964,967,1064,1068,1071,1142,1146,1149,1214,1218,1221,1306,1311,1314,1403,1407,1410,1550,1554,1557,1656,1660,1663,1751,1755,1759,1845,1849,1923],[151,152,15],"h1",{"id":153},"module-reference",[155,156,157],"p",{},"This reference lists the main Forge modules and where each layer lives.",[159,160,162],"h2",{"id":161},"directory-map","Directory Map",[164,165,171],"pre",{"className":166,"code":168,"language":169,"meta":170},[167],"language-text","arma\u002Fclient\u002Faddons\u002F Client-side Arma addons and browser UIs\narma\u002Fserver\u002Faddons\u002F Server-side Arma addons and extension bridge\narma\u002Fserver\u002Fextension\u002F Rust arma-rs extension and SurrealDB adapters\nbin\u002Ficom\u002F Interprocess communication helper\nlib\u002Fmodels\u002F Shared domain data models\nlib\u002Frepositories\u002F Repository traits and in-memory stores\nlib\u002Fservices\u002F Domain services and workflow logic\nlib\u002Fshared\u002F Cross-crate helpers\ntools\u002F Web UI build tooling\ndocs\u002F Framework-level documentation\n","text","",[172,173,168],"code",{"__ignoreMap":170},[159,175,177],{"id":176},"gameplay-domains","Gameplay Domains",[179,180,181,206],"table",{},[182,183,184],"thead",{},[185,186,187,191,194,197,200,203],"tr",{},[188,189,190],"th",{},"Domain",[188,192,193],{},"Purpose",[188,195,196],{},"Client addon",[188,198,199],{},"Server addon",[188,201,202],{},"Service\u002Fmodel layer",[188,204,205],{},"Extension group",[207,208,209,242,276,307,341,375,409,440,471,500,527],"tbody",{},[185,210,211,215,218,223,228,237],{},[212,213,214],"td",{},"Actor",[212,216,217],{},"Player identity, loadout, position, status, contact identifiers, and persistent character data.",[212,219,220],{},[172,221,222],{},"arma\u002Fclient\u002Faddons\u002Factor",[212,224,225],{},[172,226,227],{},"arma\u002Fserver\u002Faddons\u002Factor",[212,229,230,233,234],{},[172,231,232],{},"lib\u002Fmodels\u002Fsrc\u002Factor.rs",", ",[172,235,236],{},"lib\u002Fservices\u002Fsrc\u002Factor.rs",[212,238,239],{},[172,240,241],{},"actor:*",[185,243,244,247,250,255,260,268],{},[212,245,246],{},"Bank",[212,248,249],{},"Player accounts, cash\u002Fbank balances, PIN validation, transfers, checkout charging, and transaction context.",[212,251,252],{},[172,253,254],{},"arma\u002Fclient\u002Faddons\u002Fbank",[212,256,257],{},[172,258,259],{},"arma\u002Fserver\u002Faddons\u002Fbank",[212,261,262,233,265],{},[172,263,264],{},"lib\u002Fmodels\u002Fsrc\u002Fbank.rs",[172,266,267],{},"lib\u002Fservices\u002Fsrc\u002Fbank.rs",[212,269,270,233,273],{},[172,271,272],{},"bank:*",[172,274,275],{},"bank:hot:*",[185,277,278,281,284,289,294,302],{},[212,279,280],{},"CAD",[212,282,283],{},"Dispatch requests, assignments, orders, activity stream, profiles, groups, and hydrated dispatcher views.",[212,285,286],{},[172,287,288],{},"arma\u002Fclient\u002Faddons\u002Fcad",[212,290,291],{},[172,292,293],{},"arma\u002Fserver\u002Faddons\u002Fcad",[212,295,296,233,299],{},[172,297,298],{},"lib\u002Fmodels\u002Fsrc\u002Fcad.rs",[172,300,301],{},"lib\u002Fservices\u002Fsrc\u002Fcad.rs",[212,303,304],{},[172,305,306],{},"cad:*",[185,308,309,312,315,320,325,333],{},[212,310,311],{},"Garage",[212,313,314],{},"Player vehicle storage with plate IDs, fuel, damage, and hit point state.",[212,316,317],{},[172,318,319],{},"arma\u002Fclient\u002Faddons\u002Fgarage",[212,321,322],{},[172,323,324],{},"arma\u002Fserver\u002Faddons\u002Fgarage",[212,326,327,233,330],{},[172,328,329],{},"lib\u002Fmodels\u002Fsrc\u002Fgarage.rs",[172,331,332],{},"lib\u002Fservices\u002Fsrc\u002Fgarage.rs",[212,334,335,233,338],{},[172,336,337],{},"garage:*",[172,339,340],{},"garage:hot:*",[185,342,343,346,349,354,359,367],{},[212,344,345],{},"Locker",[212,347,348],{},"Player item storage keyed by classname with category and amount.",[212,350,351],{},[172,352,353],{},"arma\u002Fclient\u002Faddons\u002Flocker",[212,355,356],{},[172,357,358],{},"arma\u002Fserver\u002Faddons\u002Flocker",[212,360,361,233,364],{},[172,362,363],{},"lib\u002Fmodels\u002Fsrc\u002Flocker.rs",[172,365,366],{},"lib\u002Fservices\u002Fsrc\u002Flocker.rs",[212,368,369,233,372],{},[172,370,371],{},"locker:*",[172,373,374],{},"locker:hot:*",[185,376,377,380,383,388,393,401],{},[212,378,379],{},"Organization",[212,381,382],{},"Player organizations, membership, treasury, credit lines, shared assets, and fleet data.",[212,384,385],{},[172,386,387],{},"arma\u002Fclient\u002Faddons\u002Forg",[212,389,390],{},[172,391,392],{},"arma\u002Fserver\u002Faddons\u002Forg",[212,394,395,233,398],{},[172,396,397],{},"lib\u002Fmodels\u002Fsrc\u002Forg.rs",[172,399,400],{},"lib\u002Fservices\u002Fsrc\u002Forg.rs",[212,402,403,233,406],{},[172,404,405],{},"org:*",[172,407,408],{},"org:hot:*",[185,410,411,414,417,422,427,435],{},[212,412,413],{},"Phone",[212,415,416],{},"Contacts, messages, and email state.",[212,418,419],{},[172,420,421],{},"arma\u002Fclient\u002Faddons\u002Fphone",[212,423,424],{},[172,425,426],{},"arma\u002Fserver\u002Faddons\u002Fphone",[212,428,429,233,432],{},[172,430,431],{},"lib\u002Fmodels\u002Fsrc\u002Fphone.rs",[172,433,434],{},"lib\u002Fservices\u002Fsrc\u002Fphone.rs",[212,436,437],{},[172,438,439],{},"phone:*",[185,441,442,445,448,453,458,466],{},[212,443,444],{},"Store",[212,446,447],{},"Storefront entity setup, catalog hydration, checkout workflows, and checkout charging integration.",[212,449,450],{},[172,451,452],{},"arma\u002Fclient\u002Faddons\u002Fstore",[212,454,455],{},[172,456,457],{},"arma\u002Fserver\u002Faddons\u002Fstore",[212,459,460,233,463],{},[172,461,462],{},"lib\u002Fmodels\u002Fsrc\u002Fstore.rs",[172,464,465],{},"lib\u002Fservices\u002Fsrc\u002Fstore.rs",[212,467,468],{},[172,469,470],{},"store:checkout",[185,472,473,476,479,482,487,495],{},[212,474,475],{},"Task",[212,477,478],{},"Server-owned mission\u002Ftask flows, catalog, ownership, status, participant tracking, rewards, and defuse counters.",[212,480,481],{},"none",[212,483,484],{},[172,485,486],{},"arma\u002Fserver\u002Faddons\u002Ftask",[212,488,489,233,492],{},[172,490,491],{},"lib\u002Fmodels\u002Fsrc\u002Ftask.rs",[172,493,494],{},"lib\u002Fservices\u002Fsrc\u002Ftask.rs",[212,496,497],{},[172,498,499],{},"task:*",[185,501,502,505,508,511,514,522],{},[212,503,504],{},"Owned Garage",[212,506,507],{},"Organization or owner-scoped vehicle unlock storage.",[212,509,510],{},"via garage\u002Forg UI",[212,512,513],{},"server extension only",[212,515,516,233,519],{},[172,517,518],{},"lib\u002Fmodels\u002Fsrc\u002Fv_garage.rs",[172,520,521],{},"lib\u002Fservices\u002Fsrc\u002Fv_garage.rs",[212,523,524],{},[172,525,526],{},"owned:garage:*",[185,528,529,532,535,538,540,548],{},[212,530,531],{},"Owned Locker",[212,533,534],{},"Organization or owner-scoped arsenal unlock storage.",[212,536,537],{},"via locker\u002Forg UI",[212,539,513],{},[212,541,542,233,545],{},[172,543,544],{},"lib\u002Fmodels\u002Fsrc\u002Fv_locker.rs",[172,546,547],{},"lib\u002Fservices\u002Fsrc\u002Fv_locker.rs",[212,549,550],{},[172,551,552],{},"owned:locker:*",[155,554,555,556,559,560,559,562,559,564,559,567,559,569,559,571,559,573,559,576,559,578,559,580,582],{},"Server and extension guides:\n",[557,558,214],"a",{"href":50},",\n",[557,561,246],{"href":62},[557,563,280],{"href":66},[557,565,566],{"href":70},"Economy",[557,568,311],{"href":74},[557,570,345],{"href":78},[557,572,379],{"href":82},[557,574,575],{"href":86},"Owned Storage",[557,577,413],{"href":90},[557,579,444],{"href":54},[557,581,475],{"href":58},".",[155,584,585,586,559,589,559,592,559,595,559,597,559,599,559,601,559,603,559,605,559,608,559,610,559,612,582],{},"Client guides:\n",[557,587,588],{"href":95},"Client Overview",[557,590,591],{"href":102},"Main",[557,593,594],{"href":114},"Common",[557,596,214],{"href":118},[557,598,246],{"href":122},[557,600,280],{"href":126},[557,602,311],{"href":130},[557,604,345],{"href":134},[557,606,607],{"href":138},"Notifications",[557,609,379],{"href":142},[557,611,413],{"href":106},[557,613,444],{"href":110},[159,615,617],{"id":616},"infrastructure-modules","Infrastructure Modules",[179,619,620,632],{},[182,621,622],{},[185,623,624,627,629],{},[188,625,626],{},"Module",[188,628,193],{},[188,630,631],{},"Location",[207,633,634,652,671,689,704,719,737,752,767],{},[185,635,636,641,644],{},[212,637,638],{},[172,639,640],{},"common",[212,642,643],{},"Shared SQF helpers, base stores, utility functions, and shared UI bridge pieces.",[212,645,646,233,649],{},[172,647,648],{},"arma\u002Fclient\u002Faddons\u002Fcommon",[172,650,651],{},"arma\u002Fserver\u002Faddons\u002Fcommon",[185,653,654,659,666],{},[212,655,656],{},[172,657,658],{},"extension",[212,660,661,662,665],{},"Server SQF bridge around ",[172,663,664],{},"forge_server"," extension calls and chunked transport.",[212,667,668],{},[172,669,670],{},"arma\u002Fserver\u002Faddons\u002Fextension",[185,672,673,678,681],{},[212,674,675],{},[172,676,677],{},"main",[212,679,680],{},"Mod-level configuration, pre-init wiring, and server\u002Fclient startup glue.",[212,682,683,233,686],{},[172,684,685],{},"arma\u002Fclient\u002Faddons\u002Fmain",[172,687,688],{},"arma\u002Fserver\u002Faddons\u002Fmain",[185,690,691,696,699],{},[212,692,693],{},[172,694,695],{},"economy",[212,697,698],{},"Server-side fuel, medical, and service economy helpers. Fuel and repair charge organization hot state; medical charges player bank\u002Fcash first, then organization funds with repayable member debt when personal funds cannot cover the bill.",[212,700,701],{},[172,702,703],{},"arma\u002Fserver\u002Faddons\u002Feconomy",[185,705,706,711,714],{},[212,707,708],{},[172,709,710],{},"notifications",[212,712,713],{},"Client notification UI, sounds, and UI event handling.",[212,715,716],{},[172,717,718],{},"arma\u002Fclient\u002Faddons\u002Fnotifications",[185,720,721,726,729],{},[212,722,723],{},[172,724,725],{},"icom",[212,727,728],{},"Rust helper for interprocess communication and event broadcasting.",[212,730,731,233,734],{},[172,732,733],{},"bin\u002Ficom",[172,735,736],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Ficom.rs",[185,738,739,744,747],{},[212,740,741],{},[172,742,743],{},"terrain",[212,745,746],{},"Extension-side terrain export helper.",[212,748,749],{},[172,750,751],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fterrain.rs",[185,753,754,759,762],{},[212,755,756],{},[172,757,758],{},"transport",[212,760,761],{},"Chunked request\u002Fresponse handling for large extension payloads.",[212,763,764],{},[172,765,766],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Ftransport.rs",[185,768,769,774,777],{},[212,770,771],{},[172,772,773],{},"surreal",[212,775,776],{},"SurrealDB connection lifecycle and status reporting.",[212,778,779],{},[172,780,781],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fsurreal.rs",[159,783,785],{"id":784},"extension-command-groups","Extension Command Groups",[155,787,788],{},"Commands are invoked with:",[164,790,794],{"className":791,"code":792,"language":793,"meta":170,"style":170},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"group:command\", [_arg1, _arg2]];\n","sqf",[172,795,796],{"__ignoreMap":170},[797,798,801],"span",{"class":799,"line":800},"line",1,[797,802,792],{},[155,804,805,806,809,810,582],{},"Nested groups use additional ",[172,807,808],{},":"," separators, for example\n",[172,811,812],{},"bank:hot:deposit",[814,815,817],"h3",{"id":816},"core","Core",[179,819,820,829],{},[182,821,822],{},[185,823,824,827],{},[188,825,826],{},"Command",[188,828,193],{},[207,830,831,841,851],{},[185,832,833,838],{},[212,834,835],{},[172,836,837],{},"version",[212,839,840],{},"Return the extension version string.",[185,842,843,848],{},[212,844,845],{},[172,846,847],{},"status",[212,849,850],{},"Return SurrealDB connection state.",[185,852,853,858],{},[212,854,855],{},[172,856,857],{},"surreal:status",[212,859,860],{},"Return SurrealDB connection state directly from the Surreal module.",[814,862,214],{"id":863},"actor",[179,865,866,874],{},[182,867,868],{},[185,869,870,872],{},[188,871,826],{},[188,873,193],{},[207,875,876,886,896,906,923,933],{},[185,877,878,883],{},[212,879,880],{},[172,881,882],{},"actor:get",[212,884,885],{},"Fetch actor data for a resolved player UID.",[185,887,888,893],{},[212,889,890],{},[172,891,892],{},"actor:create",[212,894,895],{},"Create actor data from JSON.",[185,897,898,903],{},[212,899,900],{},[172,901,902],{},"actor:update",[212,904,905],{},"Apply actor JSON updates.",[185,907,908,913],{},[212,909,910],{},[172,911,912],{},"actor:exists",[212,914,915,916,919,920,582],{},"Return ",[172,917,918],{},"true"," or ",[172,921,922],{},"false",[185,924,925,930],{},[212,926,927],{},[172,928,929],{},"actor:delete",[212,931,932],{},"Delete actor data.",[185,934,935,955],{},[212,936,937,233,940,233,943,233,946,233,949,233,952],{},[172,938,939],{},"actor:hot:init",[172,941,942],{},"actor:hot:get",[172,944,945],{},"actor:hot:keys",[172,947,948],{},"actor:hot:override",[172,950,951],{},"actor:hot:save",[172,953,954],{},"actor:hot:remove",[212,956,957],{},"Manage actor hot state.",[155,959,960,961,963],{},"See ",[557,962,49],{"href":50}," for examples.",[814,965,246],{"id":966},"bank",[179,968,969,977],{},[182,970,971],{},[185,972,973,975],{},[188,974,826],{},[188,976,193],{},[207,978,979,1001,1026,1044,1054],{},[185,980,981,998],{},[212,982,983,233,986,233,989,233,992,233,995],{},[172,984,985],{},"bank:get",[172,987,988],{},"bank:create",[172,990,991],{},"bank:update",[172,993,994],{},"bank:exists",[172,996,997],{},"bank:delete",[212,999,1000],{},"Durable bank CRUD.",[185,1002,1003,1023],{},[212,1004,1005,233,1008,233,1011,233,1014,233,1017,233,1020],{},[172,1006,1007],{},"bank:hot:init",[172,1009,1010],{},"bank:hot:get",[172,1012,1013],{},"bank:hot:override",[172,1015,1016],{},"bank:hot:patch",[172,1018,1019],{},"bank:hot:save",[172,1021,1022],{},"bank:hot:remove",[212,1024,1025],{},"Manage bank hot state.",[185,1027,1028,1041],{},[212,1029,1030,233,1032,233,1035,233,1038],{},[172,1031,812],{},[172,1033,1034],{},"bank:hot:withdraw",[172,1036,1037],{},"bank:hot:deposit_earnings",[172,1039,1040],{},"bank:hot:transfer",[212,1042,1043],{},"Mutate hot bank balances with operation context.",[185,1045,1046,1051],{},[212,1047,1048],{},[172,1049,1050],{},"bank:hot:charge_checkout",[212,1052,1053],{},"Charge a checkout against hot bank state.",[185,1055,1056,1061],{},[212,1057,1058],{},[172,1059,1060],{},"bank:hot:validate_pin",[212,1062,1063],{},"Validate a PIN for bank operations.",[155,1065,960,1066,963],{},[557,1067,61],{"href":62},[814,1069,311],{"id":1070},"garage",[179,1072,1073,1081],{},[182,1074,1075],{},[185,1076,1077,1079],{},[188,1078,826],{},[188,1080,193],{},[207,1082,1083,1114],{},[185,1084,1085,1111],{},[212,1086,1087,233,1090,233,1093,233,1096,233,1099,233,1102,233,1105,233,1108],{},[172,1088,1089],{},"garage:create",[172,1091,1092],{},"garage:get",[172,1094,1095],{},"garage:add",[172,1097,1098],{},"garage:update",[172,1100,1101],{},"garage:patch",[172,1103,1104],{},"garage:remove",[172,1106,1107],{},"garage:delete",[172,1109,1110],{},"garage:exists",[212,1112,1113],{},"Durable player garage operations.",[185,1115,1116,1139],{},[212,1117,1118,233,1121,233,1124,233,1127,233,1130,233,1133,233,1136],{},[172,1119,1120],{},"garage:hot:init",[172,1122,1123],{},"garage:hot:get",[172,1125,1126],{},"garage:hot:override",[172,1128,1129],{},"garage:hot:add",[172,1131,1132],{},"garage:hot:remove_vehicle",[172,1134,1135],{},"garage:hot:save",[172,1137,1138],{},"garage:hot:remove",[212,1140,1141],{},"Manage player garage hot state.",[155,1143,960,1144,963],{},[557,1145,73],{"href":74},[814,1147,345],{"id":1148},"locker",[179,1150,1151,1159],{},[182,1152,1153],{},[185,1154,1155,1157],{},[188,1156,826],{},[188,1158,193],{},[207,1160,1161,1192],{},[185,1162,1163,1189],{},[212,1164,1165,233,1168,233,1171,233,1174,233,1177,233,1180,233,1183,233,1186],{},[172,1166,1167],{},"locker:create",[172,1169,1170],{},"locker:get",[172,1172,1173],{},"locker:add",[172,1175,1176],{},"locker:update",[172,1178,1179],{},"locker:patch",[172,1181,1182],{},"locker:remove",[172,1184,1185],{},"locker:delete",[172,1187,1188],{},"locker:exists",[212,1190,1191],{},"Durable player locker operations.",[185,1193,1194,1211],{},[212,1195,1196,233,1199,233,1202,233,1205,233,1208],{},[172,1197,1198],{},"locker:hot:init",[172,1200,1201],{},"locker:hot:get",[172,1203,1204],{},"locker:hot:override",[172,1206,1207],{},"locker:hot:save",[172,1209,1210],{},"locker:hot:remove",[212,1212,1213],{},"Manage player locker hot state.",[155,1215,960,1216,963],{},[557,1217,77],{"href":78},[814,1219,379],{"id":1220},"organization",[179,1222,1223,1231],{},[182,1224,1225],{},[185,1226,1227,1229],{},[188,1228,826],{},[188,1230,193],{},[207,1232,1233,1255,1268,1281,1297],{},[185,1234,1235,1252],{},[212,1236,1237,233,1240,233,1243,233,1246,233,1249],{},[172,1238,1239],{},"org:get",[172,1241,1242],{},"org:create",[172,1244,1245],{},"org:update",[172,1247,1248],{},"org:exists",[172,1250,1251],{},"org:delete",[212,1253,1254],{},"Durable organization CRUD.",[185,1256,1257,1265],{},[212,1258,1259,233,1262],{},[172,1260,1261],{},"org:assets:get",[172,1263,1264],{},"org:assets:update",[212,1266,1267],{},"Manage organization assets.",[185,1269,1270,1278],{},[212,1271,1272,233,1275],{},[172,1273,1274],{},"org:fleet:get",[172,1276,1277],{},"org:fleet:update",[212,1279,1280],{},"Manage organization fleet entries.",[185,1282,1283,1294],{},[212,1284,1285,233,1288,233,1291],{},[172,1286,1287],{},"org:members:get",[172,1289,1290],{},"org:members:add",[172,1292,1293],{},"org:members:remove",[212,1295,1296],{},"Manage organization membership.",[185,1298,1299,1303],{},[212,1300,1301],{},[172,1302,408],{},[212,1304,1305],{},"Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove.",[155,1307,960,1308,963],{},[557,1309,1310],{"href":82},"Org Usage Guide",[814,1312,413],{"id":1313},"phone",[179,1315,1316,1324],{},[182,1317,1318],{},[185,1319,1320,1322],{},[188,1321,826],{},[188,1323,193],{},[207,1325,1326,1336,1352,1374,1393],{},[185,1327,1328,1333],{},[212,1329,1330],{},[172,1331,1332],{},"phone:init",[212,1334,1335],{},"Initialize phone state for a UID.",[185,1337,1338,1349],{},[212,1339,1340,233,1343,233,1346],{},[172,1341,1342],{},"phone:contacts:list",[172,1344,1345],{},"phone:contacts:add",[172,1347,1348],{},"phone:contacts:remove",[212,1350,1351],{},"Manage contacts.",[185,1353,1354,1371],{},[212,1355,1356,233,1359,233,1362,233,1365,233,1368],{},[172,1357,1358],{},"phone:messages:list",[172,1360,1361],{},"phone:messages:thread",[172,1363,1364],{},"phone:messages:send",[172,1366,1367],{},"phone:messages:mark_read",[172,1369,1370],{},"phone:messages:delete",[212,1372,1373],{},"Manage messages.",[185,1375,1376,1390],{},[212,1377,1378,233,1381,233,1384,233,1387],{},[172,1379,1380],{},"phone:emails:list",[172,1382,1383],{},"phone:emails:send",[172,1385,1386],{},"phone:emails:mark_read",[172,1388,1389],{},"phone:emails:delete",[212,1391,1392],{},"Manage emails.",[185,1394,1395,1400],{},[212,1396,1397],{},[172,1398,1399],{},"phone:remove",[212,1401,1402],{},"Remove phone state for a UID.",[155,1404,960,1405,963],{},[557,1406,89],{"href":90},[814,1408,280],{"id":1409},"cad",[179,1411,1412,1421],{},[182,1413,1414],{},[185,1415,1416,1419],{},[188,1417,1418],{},"Command Group",[188,1420,193],{},[207,1422,1423,1436,1461,1486,1511,1530,1540],{},[185,1424,1425,1433],{},[212,1426,1427,233,1430],{},[172,1428,1429],{},"cad:activity:append",[172,1431,1432],{},"cad:activity:recent",[212,1434,1435],{},"Append and read recent activity.",[185,1437,1438,1458],{},[212,1439,1440,233,1443,233,1446,233,1449,233,1452,233,1455],{},[172,1441,1442],{},"cad:assignments:list",[172,1444,1445],{},"cad:assignments:assign",[172,1447,1448],{},"cad:assignments:acknowledge",[172,1450,1451],{},"cad:assignments:decline",[172,1453,1454],{},"cad:assignments:upsert",[172,1456,1457],{},"cad:assignments:delete",[212,1459,1460],{},"Manage dispatch assignments.",[185,1462,1463,1483],{},[212,1464,1465,233,1468,233,1471,233,1474,233,1477,233,1480],{},[172,1466,1467],{},"cad:orders:list",[172,1469,1470],{},"cad:orders:create",[172,1472,1473],{},"cad:orders:create_from_context",[172,1475,1476],{},"cad:orders:close",[172,1478,1479],{},"cad:orders:upsert",[172,1481,1482],{},"cad:orders:delete",[212,1484,1485],{},"Manage orders.",[185,1487,1488,1508],{},[212,1489,1490,233,1493,233,1496,233,1499,233,1502,233,1505],{},[172,1491,1492],{},"cad:requests:list",[172,1494,1495],{},"cad:requests:submit",[172,1497,1498],{},"cad:requests:submit_from_context",[172,1500,1501],{},"cad:requests:close",[172,1503,1504],{},"cad:requests:upsert",[172,1506,1507],{},"cad:requests:delete",[212,1509,1510],{},"Manage requests.",[185,1512,1513,1527],{},[212,1514,1515,233,1518,233,1521,233,1524],{},[172,1516,1517],{},"cad:profiles:list",[172,1519,1520],{},"cad:profiles:update_from_context",[172,1522,1523],{},"cad:profiles:upsert",[172,1525,1526],{},"cad:profiles:delete",[212,1528,1529],{},"Manage profiles.",[185,1531,1532,1537],{},[212,1533,1534],{},[172,1535,1536],{},"cad:groups:build",[212,1538,1539],{},"Build grouped CAD state.",[185,1541,1542,1547],{},[212,1543,1544],{},[172,1545,1546],{},"cad:view:hydrate",[212,1548,1549],{},"Build the dispatcher view model.",[155,1551,960,1552,963],{},[557,1553,65],{"href":66},[814,1555,475],{"id":1556},"task",[179,1558,1559,1567],{},[182,1560,1561],{},[185,1562,1563,1565],{},[188,1564,1418],{},[188,1566,193],{},[207,1568,1569,1579,1598,1617,1633,1646],{},[185,1570,1571,1576],{},[212,1572,1573],{},[172,1574,1575],{},"task:reset",[212,1577,1578],{},"Reset task state.",[185,1580,1581,1595],{},[212,1582,1583,233,1586,233,1589,233,1592],{},[172,1584,1585],{},"task:catalog:active",[172,1587,1588],{},"task:catalog:get",[172,1590,1591],{},"task:catalog:upsert",[172,1593,1594],{},"task:catalog:delete",[212,1596,1597],{},"Manage task catalog entries.",[185,1599,1600,1614],{},[212,1601,1602,233,1605,233,1608,233,1611],{},[172,1603,1604],{},"task:ownership:bind",[172,1606,1607],{},"task:ownership:release",[172,1609,1610],{},"task:ownership:accept",[172,1612,1613],{},"task:ownership:reward_context",[212,1615,1616],{},"Manage task ownership and rewards.",[185,1618,1619,1630],{},[212,1620,1621,233,1624,233,1627],{},[172,1622,1623],{},"task:status:set",[172,1625,1626],{},"task:status:get",[172,1628,1629],{},"task:status:clear",[212,1631,1632],{},"Manage task status.",[185,1634,1635,1643],{},[212,1636,1637,233,1640],{},[172,1638,1639],{},"task:defuse:increment",[172,1641,1642],{},"task:defuse:get",[212,1644,1645],{},"Manage defuse counters.",[185,1647,1648,1653],{},[212,1649,1650],{},[172,1651,1652],{},"task:clear",[212,1654,1655],{},"Clear task state.",[155,1657,960,1658,963],{},[557,1659,57],{"href":58},[814,1661,575],{"id":1662},"owned-storage",[179,1664,1665,1673],{},[182,1666,1667],{},[185,1668,1669,1671],{},[188,1670,1418],{},[188,1672,193],{},[207,1674,1675,1703,1713,1741],{},[185,1676,1677,1700],{},[212,1678,1679,233,1682,233,1685,233,1688,233,1691,233,1694,233,1697],{},[172,1680,1681],{},"owned:garage:create",[172,1683,1684],{},"owned:garage:fetch",[172,1686,1687],{},"owned:garage:get",[172,1689,1690],{},"owned:garage:add",[172,1692,1693],{},"owned:garage:remove",[172,1695,1696],{},"owned:garage:delete",[172,1698,1699],{},"owned:garage:exists",[212,1701,1702],{},"Owner-scoped vehicle storage.",[185,1704,1705,1710],{},[212,1706,1707],{},[172,1708,1709],{},"owned:garage:hot:*",[212,1711,1712],{},"Owner-scoped vehicle hot state.",[185,1714,1715,1738],{},[212,1716,1717,233,1720,233,1723,233,1726,233,1729,233,1732,233,1735],{},[172,1718,1719],{},"owned:locker:create",[172,1721,1722],{},"owned:locker:fetch",[172,1724,1725],{},"owned:locker:get",[172,1727,1728],{},"owned:locker:add",[172,1730,1731],{},"owned:locker:remove",[172,1733,1734],{},"owned:locker:delete",[172,1736,1737],{},"owned:locker:exists",[212,1739,1740],{},"Owner-scoped item storage.",[185,1742,1743,1748],{},[212,1744,1745],{},[172,1746,1747],{},"owned:locker:hot:*",[212,1749,1750],{},"Owner-scoped item hot state.",[155,1752,960,1753,963],{},[557,1754,85],{"href":86},[814,1756,1758],{"id":1757},"other-extension-groups","Other Extension Groups",[179,1760,1761,1769],{},[182,1762,1763],{},[185,1764,1765,1767],{},[188,1766,1418],{},[188,1768,193],{},[207,1770,1771,1780,1796,1806,1819,1832],{},[185,1772,1773,1777],{},[212,1774,1775],{},[172,1776,470],{},[212,1778,1779],{},"Run store checkout behavior.",[185,1781,1782,1793],{},[212,1783,1784,233,1787,233,1790],{},[172,1785,1786],{},"icom:connect",[172,1788,1789],{},"icom:broadcast",[172,1791,1792],{},"icom:send_event",[212,1794,1795],{},"ICom connection and event forwarding.",[185,1797,1798,1803],{},[212,1799,1800],{},[172,1801,1802],{},"terrain:exportSVG",[212,1804,1805],{},"Export terrain data as SVG.",[185,1807,1808,1816],{},[212,1809,1810,233,1813],{},[172,1811,1812],{},"transport:invoke",[172,1814,1815],{},"transport:invoke_stored",[212,1817,1818],{},"Invoke commands through transport.",[185,1820,1821,1829],{},[212,1822,1823,233,1826],{},[172,1824,1825],{},"transport:request:append",[172,1827,1828],{},"transport:request:clear",[212,1830,1831],{},"Manage stored request chunks.",[185,1833,1834,1842],{},[212,1835,1836,233,1839],{},[172,1837,1838],{},"transport:response:get",[172,1840,1841],{},"transport:response:clear",[212,1843,1844],{},"Manage stored response chunks.",[159,1846,1848],{"id":1847},"rust-crates","Rust Crates",[179,1850,1851,1861],{},[182,1852,1853],{},[185,1854,1855,1858],{},[188,1856,1857],{},"Crate",[188,1859,1860],{},"Role",[207,1862,1863,1873,1883,1893,1903,1913],{},[185,1864,1865,1870],{},[212,1866,1867],{},[172,1868,1869],{},"forge-models",[212,1871,1872],{},"Domain models and validation. Keep these serializable and free of persistence details.",[185,1874,1875,1880],{},[212,1876,1877],{},[172,1878,1879],{},"forge-repositories",[212,1881,1882],{},"Repository traits and in-memory implementations. Keep these storage-agnostic.",[185,1884,1885,1890],{},[212,1886,1887],{},[172,1888,1889],{},"forge-services",[212,1891,1892],{},"Business rules and workflows. Depend on repository traits, not concrete databases.",[185,1894,1895,1900],{},[212,1896,1897],{},[172,1898,1899],{},"forge-shared",[212,1901,1902],{},"Cross-crate helpers. Keep dependencies light.",[185,1904,1905,1910],{},[212,1906,1907],{},[172,1908,1909],{},"forge-server",[212,1911,1912],{},"Arma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters.",[185,1914,1915,1920],{},[212,1916,1917],{},[172,1918,1919],{},"forge-icom",[212,1921,1922],{},"ICom helper binary and client library.",[1924,1925,1926],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":170,"searchDepth":1928,"depth":1928,"links":1929},2,[1930,1931,1932,1933,1947],{"id":161,"depth":1928,"text":162},{"id":176,"depth":1928,"text":177},{"id":616,"depth":1928,"text":617},{"id":784,"depth":1928,"text":785,"children":1934},[1935,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946],{"id":816,"depth":1936,"text":817},3,{"id":863,"depth":1936,"text":214},{"id":966,"depth":1936,"text":246},{"id":1070,"depth":1936,"text":311},{"id":1148,"depth":1936,"text":345},{"id":1220,"depth":1936,"text":379},{"id":1313,"depth":1936,"text":413},{"id":1409,"depth":1936,"text":280},{"id":1556,"depth":1936,"text":475},{"id":1662,"depth":1936,"text":575},{"id":1757,"depth":1936,"text":1758},{"id":1847,"depth":1928,"text":1848},"md",null,{},true,{"title":15,"description":157},"DvQwc2rM4FqseD3QHUyCecRoLIjQmfZuZK0p1V8hxZw",[1955,1957],{"title":11,"path":12,"stem":13,"description":1956,"children":-1},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",{"title":19,"path":20,"stem":21,"description":1958,"children":-1},"This guide covers the usual path for adding or changing a Forge module.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1959},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-module-reference":145,"-getting-started-module-reference-surround":1954},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":15,"body":147,"description":157,"extension":1948,"links":1949,"meta":1950,"navigation":1951,"path":16,"seo":1952,"stem":17,"__hash__":1953},"docs\u002F1.getting-started\u002F2.module-reference.md",{"type":148,"value":149,"toc":1927},"minimark",[150,154,158,163,174,178,553,583,614,618,782,786,789,803,813,818,861,864,958,964,967,1064,1068,1071,1142,1146,1149,1214,1218,1221,1306,1311,1314,1403,1407,1410,1550,1554,1557,1656,1660,1663,1751,1755,1759,1845,1849,1923],[151,152,15],"h1",{"id":153},"module-reference",[155,156,157],"p",{},"This reference lists the main Forge modules and where each layer lives.",[159,160,162],"h2",{"id":161},"directory-map","Directory Map",[164,165,171],"pre",{"className":166,"code":168,"language":169,"meta":170},[167],"language-text","arma\u002Fclient\u002Faddons\u002F Client-side Arma addons and browser UIs\narma\u002Fserver\u002Faddons\u002F Server-side Arma addons and extension bridge\narma\u002Fserver\u002Fextension\u002F Rust arma-rs extension and SurrealDB adapters\nbin\u002Ficom\u002F Interprocess communication helper\nlib\u002Fmodels\u002F Shared domain data models\nlib\u002Frepositories\u002F Repository traits and in-memory stores\nlib\u002Fservices\u002F Domain services and workflow logic\nlib\u002Fshared\u002F Cross-crate helpers\ntools\u002F Web UI build tooling\ndocs\u002F Framework-level documentation\n","text","",[172,173,168],"code",{"__ignoreMap":170},[159,175,177],{"id":176},"gameplay-domains","Gameplay Domains",[179,180,181,206],"table",{},[182,183,184],"thead",{},[185,186,187,191,194,197,200,203],"tr",{},[188,189,190],"th",{},"Domain",[188,192,193],{},"Purpose",[188,195,196],{},"Client addon",[188,198,199],{},"Server addon",[188,201,202],{},"Service\u002Fmodel layer",[188,204,205],{},"Extension group",[207,208,209,242,276,307,341,375,409,440,471,500,527],"tbody",{},[185,210,211,215,218,223,228,237],{},[212,213,214],"td",{},"Actor",[212,216,217],{},"Player identity, loadout, position, status, contact identifiers, and persistent character data.",[212,219,220],{},[172,221,222],{},"arma\u002Fclient\u002Faddons\u002Factor",[212,224,225],{},[172,226,227],{},"arma\u002Fserver\u002Faddons\u002Factor",[212,229,230,233,234],{},[172,231,232],{},"lib\u002Fmodels\u002Fsrc\u002Factor.rs",", ",[172,235,236],{},"lib\u002Fservices\u002Fsrc\u002Factor.rs",[212,238,239],{},[172,240,241],{},"actor:*",[185,243,244,247,250,255,260,268],{},[212,245,246],{},"Bank",[212,248,249],{},"Player accounts, cash\u002Fbank balances, PIN validation, transfers, checkout charging, and transaction context.",[212,251,252],{},[172,253,254],{},"arma\u002Fclient\u002Faddons\u002Fbank",[212,256,257],{},[172,258,259],{},"arma\u002Fserver\u002Faddons\u002Fbank",[212,261,262,233,265],{},[172,263,264],{},"lib\u002Fmodels\u002Fsrc\u002Fbank.rs",[172,266,267],{},"lib\u002Fservices\u002Fsrc\u002Fbank.rs",[212,269,270,233,273],{},[172,271,272],{},"bank:*",[172,274,275],{},"bank:hot:*",[185,277,278,281,284,289,294,302],{},[212,279,280],{},"CAD",[212,282,283],{},"Dispatch requests, assignments, orders, activity stream, profiles, groups, and hydrated dispatcher views.",[212,285,286],{},[172,287,288],{},"arma\u002Fclient\u002Faddons\u002Fcad",[212,290,291],{},[172,292,293],{},"arma\u002Fserver\u002Faddons\u002Fcad",[212,295,296,233,299],{},[172,297,298],{},"lib\u002Fmodels\u002Fsrc\u002Fcad.rs",[172,300,301],{},"lib\u002Fservices\u002Fsrc\u002Fcad.rs",[212,303,304],{},[172,305,306],{},"cad:*",[185,308,309,312,315,320,325,333],{},[212,310,311],{},"Garage",[212,313,314],{},"Player vehicle storage with plate IDs, fuel, damage, and hit point state.",[212,316,317],{},[172,318,319],{},"arma\u002Fclient\u002Faddons\u002Fgarage",[212,321,322],{},[172,323,324],{},"arma\u002Fserver\u002Faddons\u002Fgarage",[212,326,327,233,330],{},[172,328,329],{},"lib\u002Fmodels\u002Fsrc\u002Fgarage.rs",[172,331,332],{},"lib\u002Fservices\u002Fsrc\u002Fgarage.rs",[212,334,335,233,338],{},[172,336,337],{},"garage:*",[172,339,340],{},"garage:hot:*",[185,342,343,346,349,354,359,367],{},[212,344,345],{},"Locker",[212,347,348],{},"Player item storage keyed by classname with category and amount.",[212,350,351],{},[172,352,353],{},"arma\u002Fclient\u002Faddons\u002Flocker",[212,355,356],{},[172,357,358],{},"arma\u002Fserver\u002Faddons\u002Flocker",[212,360,361,233,364],{},[172,362,363],{},"lib\u002Fmodels\u002Fsrc\u002Flocker.rs",[172,365,366],{},"lib\u002Fservices\u002Fsrc\u002Flocker.rs",[212,368,369,233,372],{},[172,370,371],{},"locker:*",[172,373,374],{},"locker:hot:*",[185,376,377,380,383,388,393,401],{},[212,378,379],{},"Organization",[212,381,382],{},"Player organizations, membership, treasury, credit lines, shared assets, and fleet data.",[212,384,385],{},[172,386,387],{},"arma\u002Fclient\u002Faddons\u002Forg",[212,389,390],{},[172,391,392],{},"arma\u002Fserver\u002Faddons\u002Forg",[212,394,395,233,398],{},[172,396,397],{},"lib\u002Fmodels\u002Fsrc\u002Forg.rs",[172,399,400],{},"lib\u002Fservices\u002Fsrc\u002Forg.rs",[212,402,403,233,406],{},[172,404,405],{},"org:*",[172,407,408],{},"org:hot:*",[185,410,411,414,417,422,427,435],{},[212,412,413],{},"Phone",[212,415,416],{},"Contacts, messages, and email state.",[212,418,419],{},[172,420,421],{},"arma\u002Fclient\u002Faddons\u002Fphone",[212,423,424],{},[172,425,426],{},"arma\u002Fserver\u002Faddons\u002Fphone",[212,428,429,233,432],{},[172,430,431],{},"lib\u002Fmodels\u002Fsrc\u002Fphone.rs",[172,433,434],{},"lib\u002Fservices\u002Fsrc\u002Fphone.rs",[212,436,437],{},[172,438,439],{},"phone:*",[185,441,442,445,448,453,458,466],{},[212,443,444],{},"Store",[212,446,447],{},"Storefront entity setup, catalog hydration, checkout workflows, and checkout charging integration.",[212,449,450],{},[172,451,452],{},"arma\u002Fclient\u002Faddons\u002Fstore",[212,454,455],{},[172,456,457],{},"arma\u002Fserver\u002Faddons\u002Fstore",[212,459,460,233,463],{},[172,461,462],{},"lib\u002Fmodels\u002Fsrc\u002Fstore.rs",[172,464,465],{},"lib\u002Fservices\u002Fsrc\u002Fstore.rs",[212,467,468],{},[172,469,470],{},"store:checkout",[185,472,473,476,479,482,487,495],{},[212,474,475],{},"Task",[212,477,478],{},"Server-owned mission\u002Ftask flows, catalog, ownership, status, participant tracking, rewards, and defuse counters.",[212,480,481],{},"none",[212,483,484],{},[172,485,486],{},"arma\u002Fserver\u002Faddons\u002Ftask",[212,488,489,233,492],{},[172,490,491],{},"lib\u002Fmodels\u002Fsrc\u002Ftask.rs",[172,493,494],{},"lib\u002Fservices\u002Fsrc\u002Ftask.rs",[212,496,497],{},[172,498,499],{},"task:*",[185,501,502,505,508,511,514,522],{},[212,503,504],{},"Owned Garage",[212,506,507],{},"Organization or owner-scoped vehicle unlock storage.",[212,509,510],{},"via garage\u002Forg UI",[212,512,513],{},"server extension only",[212,515,516,233,519],{},[172,517,518],{},"lib\u002Fmodels\u002Fsrc\u002Fv_garage.rs",[172,520,521],{},"lib\u002Fservices\u002Fsrc\u002Fv_garage.rs",[212,523,524],{},[172,525,526],{},"owned:garage:*",[185,528,529,532,535,538,540,548],{},[212,530,531],{},"Owned Locker",[212,533,534],{},"Organization or owner-scoped arsenal unlock storage.",[212,536,537],{},"via locker\u002Forg UI",[212,539,513],{},[212,541,542,233,545],{},[172,543,544],{},"lib\u002Fmodels\u002Fsrc\u002Fv_locker.rs",[172,546,547],{},"lib\u002Fservices\u002Fsrc\u002Fv_locker.rs",[212,549,550],{},[172,551,552],{},"owned:locker:*",[155,554,555,556,559,560,559,562,559,564,559,567,559,569,559,571,559,573,559,576,559,578,559,580,582],{},"Server and extension guides:\n",[557,558,214],"a",{"href":50},",\n",[557,561,246],{"href":62},[557,563,280],{"href":66},[557,565,566],{"href":70},"Economy",[557,568,311],{"href":74},[557,570,345],{"href":78},[557,572,379],{"href":82},[557,574,575],{"href":86},"Owned Storage",[557,577,413],{"href":90},[557,579,444],{"href":54},[557,581,475],{"href":58},".",[155,584,585,586,559,589,559,592,559,595,559,597,559,599,559,601,559,603,559,605,559,608,559,610,559,612,582],{},"Client guides:\n",[557,587,588],{"href":95},"Client Overview",[557,590,591],{"href":102},"Main",[557,593,594],{"href":114},"Common",[557,596,214],{"href":118},[557,598,246],{"href":122},[557,600,280],{"href":126},[557,602,311],{"href":130},[557,604,345],{"href":134},[557,606,607],{"href":138},"Notifications",[557,609,379],{"href":142},[557,611,413],{"href":106},[557,613,444],{"href":110},[159,615,617],{"id":616},"infrastructure-modules","Infrastructure Modules",[179,619,620,632],{},[182,621,622],{},[185,623,624,627,629],{},[188,625,626],{},"Module",[188,628,193],{},[188,630,631],{},"Location",[207,633,634,652,671,689,704,719,737,752,767],{},[185,635,636,641,644],{},[212,637,638],{},[172,639,640],{},"common",[212,642,643],{},"Shared SQF helpers, base stores, utility functions, and shared UI bridge pieces.",[212,645,646,233,649],{},[172,647,648],{},"arma\u002Fclient\u002Faddons\u002Fcommon",[172,650,651],{},"arma\u002Fserver\u002Faddons\u002Fcommon",[185,653,654,659,666],{},[212,655,656],{},[172,657,658],{},"extension",[212,660,661,662,665],{},"Server SQF bridge around ",[172,663,664],{},"forge_server"," extension calls and chunked transport.",[212,667,668],{},[172,669,670],{},"arma\u002Fserver\u002Faddons\u002Fextension",[185,672,673,678,681],{},[212,674,675],{},[172,676,677],{},"main",[212,679,680],{},"Mod-level configuration, pre-init wiring, and server\u002Fclient startup glue.",[212,682,683,233,686],{},[172,684,685],{},"arma\u002Fclient\u002Faddons\u002Fmain",[172,687,688],{},"arma\u002Fserver\u002Faddons\u002Fmain",[185,690,691,696,699],{},[212,692,693],{},[172,694,695],{},"economy",[212,697,698],{},"Server-side fuel, medical, and service economy helpers. Fuel and repair charge organization hot state; medical charges player bank\u002Fcash first, then organization funds with repayable member debt when personal funds cannot cover the bill.",[212,700,701],{},[172,702,703],{},"arma\u002Fserver\u002Faddons\u002Feconomy",[185,705,706,711,714],{},[212,707,708],{},[172,709,710],{},"notifications",[212,712,713],{},"Client notification UI, sounds, and UI event handling.",[212,715,716],{},[172,717,718],{},"arma\u002Fclient\u002Faddons\u002Fnotifications",[185,720,721,726,729],{},[212,722,723],{},[172,724,725],{},"icom",[212,727,728],{},"Rust helper for interprocess communication and event broadcasting.",[212,730,731,233,734],{},[172,732,733],{},"bin\u002Ficom",[172,735,736],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Ficom.rs",[185,738,739,744,747],{},[212,740,741],{},[172,742,743],{},"terrain",[212,745,746],{},"Extension-side terrain export helper.",[212,748,749],{},[172,750,751],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fterrain.rs",[185,753,754,759,762],{},[212,755,756],{},[172,757,758],{},"transport",[212,760,761],{},"Chunked request\u002Fresponse handling for large extension payloads.",[212,763,764],{},[172,765,766],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Ftransport.rs",[185,768,769,774,777],{},[212,770,771],{},[172,772,773],{},"surreal",[212,775,776],{},"SurrealDB connection lifecycle and status reporting.",[212,778,779],{},[172,780,781],{},"arma\u002Fserver\u002Fextension\u002Fsrc\u002Fsurreal.rs",[159,783,785],{"id":784},"extension-command-groups","Extension Command Groups",[155,787,788],{},"Commands are invoked with:",[164,790,794],{"className":791,"code":792,"language":793,"meta":170,"style":170},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"group:command\", [_arg1, _arg2]];\n","sqf",[172,795,796],{"__ignoreMap":170},[797,798,801],"span",{"class":799,"line":800},"line",1,[797,802,792],{},[155,804,805,806,809,810,582],{},"Nested groups use additional ",[172,807,808],{},":"," separators, for example\n",[172,811,812],{},"bank:hot:deposit",[814,815,817],"h3",{"id":816},"core","Core",[179,819,820,829],{},[182,821,822],{},[185,823,824,827],{},[188,825,826],{},"Command",[188,828,193],{},[207,830,831,841,851],{},[185,832,833,838],{},[212,834,835],{},[172,836,837],{},"version",[212,839,840],{},"Return the extension version string.",[185,842,843,848],{},[212,844,845],{},[172,846,847],{},"status",[212,849,850],{},"Return SurrealDB connection state.",[185,852,853,858],{},[212,854,855],{},[172,856,857],{},"surreal:status",[212,859,860],{},"Return SurrealDB connection state directly from the Surreal module.",[814,862,214],{"id":863},"actor",[179,865,866,874],{},[182,867,868],{},[185,869,870,872],{},[188,871,826],{},[188,873,193],{},[207,875,876,886,896,906,923,933],{},[185,877,878,883],{},[212,879,880],{},[172,881,882],{},"actor:get",[212,884,885],{},"Fetch actor data for a resolved player UID.",[185,887,888,893],{},[212,889,890],{},[172,891,892],{},"actor:create",[212,894,895],{},"Create actor data from JSON.",[185,897,898,903],{},[212,899,900],{},[172,901,902],{},"actor:update",[212,904,905],{},"Apply actor JSON updates.",[185,907,908,913],{},[212,909,910],{},[172,911,912],{},"actor:exists",[212,914,915,916,919,920,582],{},"Return ",[172,917,918],{},"true"," or ",[172,921,922],{},"false",[185,924,925,930],{},[212,926,927],{},[172,928,929],{},"actor:delete",[212,931,932],{},"Delete actor data.",[185,934,935,955],{},[212,936,937,233,940,233,943,233,946,233,949,233,952],{},[172,938,939],{},"actor:hot:init",[172,941,942],{},"actor:hot:get",[172,944,945],{},"actor:hot:keys",[172,947,948],{},"actor:hot:override",[172,950,951],{},"actor:hot:save",[172,953,954],{},"actor:hot:remove",[212,956,957],{},"Manage actor hot state.",[155,959,960,961,963],{},"See ",[557,962,49],{"href":50}," for examples.",[814,965,246],{"id":966},"bank",[179,968,969,977],{},[182,970,971],{},[185,972,973,975],{},[188,974,826],{},[188,976,193],{},[207,978,979,1001,1026,1044,1054],{},[185,980,981,998],{},[212,982,983,233,986,233,989,233,992,233,995],{},[172,984,985],{},"bank:get",[172,987,988],{},"bank:create",[172,990,991],{},"bank:update",[172,993,994],{},"bank:exists",[172,996,997],{},"bank:delete",[212,999,1000],{},"Durable bank CRUD.",[185,1002,1003,1023],{},[212,1004,1005,233,1008,233,1011,233,1014,233,1017,233,1020],{},[172,1006,1007],{},"bank:hot:init",[172,1009,1010],{},"bank:hot:get",[172,1012,1013],{},"bank:hot:override",[172,1015,1016],{},"bank:hot:patch",[172,1018,1019],{},"bank:hot:save",[172,1021,1022],{},"bank:hot:remove",[212,1024,1025],{},"Manage bank hot state.",[185,1027,1028,1041],{},[212,1029,1030,233,1032,233,1035,233,1038],{},[172,1031,812],{},[172,1033,1034],{},"bank:hot:withdraw",[172,1036,1037],{},"bank:hot:deposit_earnings",[172,1039,1040],{},"bank:hot:transfer",[212,1042,1043],{},"Mutate hot bank balances with operation context.",[185,1045,1046,1051],{},[212,1047,1048],{},[172,1049,1050],{},"bank:hot:charge_checkout",[212,1052,1053],{},"Charge a checkout against hot bank state.",[185,1055,1056,1061],{},[212,1057,1058],{},[172,1059,1060],{},"bank:hot:validate_pin",[212,1062,1063],{},"Validate a PIN for bank operations.",[155,1065,960,1066,963],{},[557,1067,61],{"href":62},[814,1069,311],{"id":1070},"garage",[179,1072,1073,1081],{},[182,1074,1075],{},[185,1076,1077,1079],{},[188,1078,826],{},[188,1080,193],{},[207,1082,1083,1114],{},[185,1084,1085,1111],{},[212,1086,1087,233,1090,233,1093,233,1096,233,1099,233,1102,233,1105,233,1108],{},[172,1088,1089],{},"garage:create",[172,1091,1092],{},"garage:get",[172,1094,1095],{},"garage:add",[172,1097,1098],{},"garage:update",[172,1100,1101],{},"garage:patch",[172,1103,1104],{},"garage:remove",[172,1106,1107],{},"garage:delete",[172,1109,1110],{},"garage:exists",[212,1112,1113],{},"Durable player garage operations.",[185,1115,1116,1139],{},[212,1117,1118,233,1121,233,1124,233,1127,233,1130,233,1133,233,1136],{},[172,1119,1120],{},"garage:hot:init",[172,1122,1123],{},"garage:hot:get",[172,1125,1126],{},"garage:hot:override",[172,1128,1129],{},"garage:hot:add",[172,1131,1132],{},"garage:hot:remove_vehicle",[172,1134,1135],{},"garage:hot:save",[172,1137,1138],{},"garage:hot:remove",[212,1140,1141],{},"Manage player garage hot state.",[155,1143,960,1144,963],{},[557,1145,73],{"href":74},[814,1147,345],{"id":1148},"locker",[179,1150,1151,1159],{},[182,1152,1153],{},[185,1154,1155,1157],{},[188,1156,826],{},[188,1158,193],{},[207,1160,1161,1192],{},[185,1162,1163,1189],{},[212,1164,1165,233,1168,233,1171,233,1174,233,1177,233,1180,233,1183,233,1186],{},[172,1166,1167],{},"locker:create",[172,1169,1170],{},"locker:get",[172,1172,1173],{},"locker:add",[172,1175,1176],{},"locker:update",[172,1178,1179],{},"locker:patch",[172,1181,1182],{},"locker:remove",[172,1184,1185],{},"locker:delete",[172,1187,1188],{},"locker:exists",[212,1190,1191],{},"Durable player locker operations.",[185,1193,1194,1211],{},[212,1195,1196,233,1199,233,1202,233,1205,233,1208],{},[172,1197,1198],{},"locker:hot:init",[172,1200,1201],{},"locker:hot:get",[172,1203,1204],{},"locker:hot:override",[172,1206,1207],{},"locker:hot:save",[172,1209,1210],{},"locker:hot:remove",[212,1212,1213],{},"Manage player locker hot state.",[155,1215,960,1216,963],{},[557,1217,77],{"href":78},[814,1219,379],{"id":1220},"organization",[179,1222,1223,1231],{},[182,1224,1225],{},[185,1226,1227,1229],{},[188,1228,826],{},[188,1230,193],{},[207,1232,1233,1255,1268,1281,1297],{},[185,1234,1235,1252],{},[212,1236,1237,233,1240,233,1243,233,1246,233,1249],{},[172,1238,1239],{},"org:get",[172,1241,1242],{},"org:create",[172,1244,1245],{},"org:update",[172,1247,1248],{},"org:exists",[172,1250,1251],{},"org:delete",[212,1253,1254],{},"Durable organization CRUD.",[185,1256,1257,1265],{},[212,1258,1259,233,1262],{},[172,1260,1261],{},"org:assets:get",[172,1263,1264],{},"org:assets:update",[212,1266,1267],{},"Manage organization assets.",[185,1269,1270,1278],{},[212,1271,1272,233,1275],{},[172,1273,1274],{},"org:fleet:get",[172,1276,1277],{},"org:fleet:update",[212,1279,1280],{},"Manage organization fleet entries.",[185,1282,1283,1294],{},[212,1284,1285,233,1288,233,1291],{},[172,1286,1287],{},"org:members:get",[172,1289,1290],{},"org:members:add",[172,1292,1293],{},"org:members:remove",[212,1295,1296],{},"Manage organization membership.",[185,1298,1299,1303],{},[212,1300,1301],{},[172,1302,408],{},[212,1304,1305],{},"Runtime organization workflows including registration, invites, credit lines, checkout charging, assets, fleet, leave, disband, save, and remove.",[155,1307,960,1308,963],{},[557,1309,1310],{"href":82},"Org Usage Guide",[814,1312,413],{"id":1313},"phone",[179,1315,1316,1324],{},[182,1317,1318],{},[185,1319,1320,1322],{},[188,1321,826],{},[188,1323,193],{},[207,1325,1326,1336,1352,1374,1393],{},[185,1327,1328,1333],{},[212,1329,1330],{},[172,1331,1332],{},"phone:init",[212,1334,1335],{},"Initialize phone state for a UID.",[185,1337,1338,1349],{},[212,1339,1340,233,1343,233,1346],{},[172,1341,1342],{},"phone:contacts:list",[172,1344,1345],{},"phone:contacts:add",[172,1347,1348],{},"phone:contacts:remove",[212,1350,1351],{},"Manage contacts.",[185,1353,1354,1371],{},[212,1355,1356,233,1359,233,1362,233,1365,233,1368],{},[172,1357,1358],{},"phone:messages:list",[172,1360,1361],{},"phone:messages:thread",[172,1363,1364],{},"phone:messages:send",[172,1366,1367],{},"phone:messages:mark_read",[172,1369,1370],{},"phone:messages:delete",[212,1372,1373],{},"Manage messages.",[185,1375,1376,1390],{},[212,1377,1378,233,1381,233,1384,233,1387],{},[172,1379,1380],{},"phone:emails:list",[172,1382,1383],{},"phone:emails:send",[172,1385,1386],{},"phone:emails:mark_read",[172,1388,1389],{},"phone:emails:delete",[212,1391,1392],{},"Manage emails.",[185,1394,1395,1400],{},[212,1396,1397],{},[172,1398,1399],{},"phone:remove",[212,1401,1402],{},"Remove phone state for a UID.",[155,1404,960,1405,963],{},[557,1406,89],{"href":90},[814,1408,280],{"id":1409},"cad",[179,1411,1412,1421],{},[182,1413,1414],{},[185,1415,1416,1419],{},[188,1417,1418],{},"Command Group",[188,1420,193],{},[207,1422,1423,1436,1461,1486,1511,1530,1540],{},[185,1424,1425,1433],{},[212,1426,1427,233,1430],{},[172,1428,1429],{},"cad:activity:append",[172,1431,1432],{},"cad:activity:recent",[212,1434,1435],{},"Append and read recent activity.",[185,1437,1438,1458],{},[212,1439,1440,233,1443,233,1446,233,1449,233,1452,233,1455],{},[172,1441,1442],{},"cad:assignments:list",[172,1444,1445],{},"cad:assignments:assign",[172,1447,1448],{},"cad:assignments:acknowledge",[172,1450,1451],{},"cad:assignments:decline",[172,1453,1454],{},"cad:assignments:upsert",[172,1456,1457],{},"cad:assignments:delete",[212,1459,1460],{},"Manage dispatch assignments.",[185,1462,1463,1483],{},[212,1464,1465,233,1468,233,1471,233,1474,233,1477,233,1480],{},[172,1466,1467],{},"cad:orders:list",[172,1469,1470],{},"cad:orders:create",[172,1472,1473],{},"cad:orders:create_from_context",[172,1475,1476],{},"cad:orders:close",[172,1478,1479],{},"cad:orders:upsert",[172,1481,1482],{},"cad:orders:delete",[212,1484,1485],{},"Manage orders.",[185,1487,1488,1508],{},[212,1489,1490,233,1493,233,1496,233,1499,233,1502,233,1505],{},[172,1491,1492],{},"cad:requests:list",[172,1494,1495],{},"cad:requests:submit",[172,1497,1498],{},"cad:requests:submit_from_context",[172,1500,1501],{},"cad:requests:close",[172,1503,1504],{},"cad:requests:upsert",[172,1506,1507],{},"cad:requests:delete",[212,1509,1510],{},"Manage requests.",[185,1512,1513,1527],{},[212,1514,1515,233,1518,233,1521,233,1524],{},[172,1516,1517],{},"cad:profiles:list",[172,1519,1520],{},"cad:profiles:update_from_context",[172,1522,1523],{},"cad:profiles:upsert",[172,1525,1526],{},"cad:profiles:delete",[212,1528,1529],{},"Manage profiles.",[185,1531,1532,1537],{},[212,1533,1534],{},[172,1535,1536],{},"cad:groups:build",[212,1538,1539],{},"Build grouped CAD state.",[185,1541,1542,1547],{},[212,1543,1544],{},[172,1545,1546],{},"cad:view:hydrate",[212,1548,1549],{},"Build the dispatcher view model.",[155,1551,960,1552,963],{},[557,1553,65],{"href":66},[814,1555,475],{"id":1556},"task",[179,1558,1559,1567],{},[182,1560,1561],{},[185,1562,1563,1565],{},[188,1564,1418],{},[188,1566,193],{},[207,1568,1569,1579,1598,1617,1633,1646],{},[185,1570,1571,1576],{},[212,1572,1573],{},[172,1574,1575],{},"task:reset",[212,1577,1578],{},"Reset task state.",[185,1580,1581,1595],{},[212,1582,1583,233,1586,233,1589,233,1592],{},[172,1584,1585],{},"task:catalog:active",[172,1587,1588],{},"task:catalog:get",[172,1590,1591],{},"task:catalog:upsert",[172,1593,1594],{},"task:catalog:delete",[212,1596,1597],{},"Manage task catalog entries.",[185,1599,1600,1614],{},[212,1601,1602,233,1605,233,1608,233,1611],{},[172,1603,1604],{},"task:ownership:bind",[172,1606,1607],{},"task:ownership:release",[172,1609,1610],{},"task:ownership:accept",[172,1612,1613],{},"task:ownership:reward_context",[212,1615,1616],{},"Manage task ownership and rewards.",[185,1618,1619,1630],{},[212,1620,1621,233,1624,233,1627],{},[172,1622,1623],{},"task:status:set",[172,1625,1626],{},"task:status:get",[172,1628,1629],{},"task:status:clear",[212,1631,1632],{},"Manage task status.",[185,1634,1635,1643],{},[212,1636,1637,233,1640],{},[172,1638,1639],{},"task:defuse:increment",[172,1641,1642],{},"task:defuse:get",[212,1644,1645],{},"Manage defuse counters.",[185,1647,1648,1653],{},[212,1649,1650],{},[172,1651,1652],{},"task:clear",[212,1654,1655],{},"Clear task state.",[155,1657,960,1658,963],{},[557,1659,57],{"href":58},[814,1661,575],{"id":1662},"owned-storage",[179,1664,1665,1673],{},[182,1666,1667],{},[185,1668,1669,1671],{},[188,1670,1418],{},[188,1672,193],{},[207,1674,1675,1703,1713,1741],{},[185,1676,1677,1700],{},[212,1678,1679,233,1682,233,1685,233,1688,233,1691,233,1694,233,1697],{},[172,1680,1681],{},"owned:garage:create",[172,1683,1684],{},"owned:garage:fetch",[172,1686,1687],{},"owned:garage:get",[172,1689,1690],{},"owned:garage:add",[172,1692,1693],{},"owned:garage:remove",[172,1695,1696],{},"owned:garage:delete",[172,1698,1699],{},"owned:garage:exists",[212,1701,1702],{},"Owner-scoped vehicle storage.",[185,1704,1705,1710],{},[212,1706,1707],{},[172,1708,1709],{},"owned:garage:hot:*",[212,1711,1712],{},"Owner-scoped vehicle hot state.",[185,1714,1715,1738],{},[212,1716,1717,233,1720,233,1723,233,1726,233,1729,233,1732,233,1735],{},[172,1718,1719],{},"owned:locker:create",[172,1721,1722],{},"owned:locker:fetch",[172,1724,1725],{},"owned:locker:get",[172,1727,1728],{},"owned:locker:add",[172,1730,1731],{},"owned:locker:remove",[172,1733,1734],{},"owned:locker:delete",[172,1736,1737],{},"owned:locker:exists",[212,1739,1740],{},"Owner-scoped item storage.",[185,1742,1743,1748],{},[212,1744,1745],{},[172,1746,1747],{},"owned:locker:hot:*",[212,1749,1750],{},"Owner-scoped item hot state.",[155,1752,960,1753,963],{},[557,1754,85],{"href":86},[814,1756,1758],{"id":1757},"other-extension-groups","Other Extension Groups",[179,1760,1761,1769],{},[182,1762,1763],{},[185,1764,1765,1767],{},[188,1766,1418],{},[188,1768,193],{},[207,1770,1771,1780,1796,1806,1819,1832],{},[185,1772,1773,1777],{},[212,1774,1775],{},[172,1776,470],{},[212,1778,1779],{},"Run store checkout behavior.",[185,1781,1782,1793],{},[212,1783,1784,233,1787,233,1790],{},[172,1785,1786],{},"icom:connect",[172,1788,1789],{},"icom:broadcast",[172,1791,1792],{},"icom:send_event",[212,1794,1795],{},"ICom connection and event forwarding.",[185,1797,1798,1803],{},[212,1799,1800],{},[172,1801,1802],{},"terrain:exportSVG",[212,1804,1805],{},"Export terrain data as SVG.",[185,1807,1808,1816],{},[212,1809,1810,233,1813],{},[172,1811,1812],{},"transport:invoke",[172,1814,1815],{},"transport:invoke_stored",[212,1817,1818],{},"Invoke commands through transport.",[185,1820,1821,1829],{},[212,1822,1823,233,1826],{},[172,1824,1825],{},"transport:request:append",[172,1827,1828],{},"transport:request:clear",[212,1830,1831],{},"Manage stored request chunks.",[185,1833,1834,1842],{},[212,1835,1836,233,1839],{},[172,1837,1838],{},"transport:response:get",[172,1840,1841],{},"transport:response:clear",[212,1843,1844],{},"Manage stored response chunks.",[159,1846,1848],{"id":1847},"rust-crates","Rust Crates",[179,1850,1851,1861],{},[182,1852,1853],{},[185,1854,1855,1858],{},[188,1856,1857],{},"Crate",[188,1859,1860],{},"Role",[207,1862,1863,1873,1883,1893,1903,1913],{},[185,1864,1865,1870],{},[212,1866,1867],{},[172,1868,1869],{},"forge-models",[212,1871,1872],{},"Domain models and validation. Keep these serializable and free of persistence details.",[185,1874,1875,1880],{},[212,1876,1877],{},[172,1878,1879],{},"forge-repositories",[212,1881,1882],{},"Repository traits and in-memory implementations. Keep these storage-agnostic.",[185,1884,1885,1890],{},[212,1886,1887],{},[172,1888,1889],{},"forge-services",[212,1891,1892],{},"Business rules and workflows. Depend on repository traits, not concrete databases.",[185,1894,1895,1900],{},[212,1896,1897],{},[172,1898,1899],{},"forge-shared",[212,1901,1902],{},"Cross-crate helpers. Keep dependencies light.",[185,1904,1905,1910],{},[212,1906,1907],{},[172,1908,1909],{},"forge-server",[212,1911,1912],{},"Arma extension crate. Owns command registration, SurrealDB runtime wiring, and concrete storage adapters.",[185,1914,1915,1920],{},[212,1916,1917],{},[172,1918,1919],{},"forge-icom",[212,1921,1922],{},"ICom helper binary and client library.",[1924,1925,1926],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":170,"searchDepth":1928,"depth":1928,"links":1929},2,[1930,1931,1932,1933,1947],{"id":161,"depth":1928,"text":162},{"id":176,"depth":1928,"text":177},{"id":616,"depth":1928,"text":617},{"id":784,"depth":1928,"text":785,"children":1934},[1935,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946],{"id":816,"depth":1936,"text":817},3,{"id":863,"depth":1936,"text":214},{"id":966,"depth":1936,"text":246},{"id":1070,"depth":1936,"text":311},{"id":1148,"depth":1936,"text":345},{"id":1220,"depth":1936,"text":379},{"id":1313,"depth":1936,"text":413},{"id":1409,"depth":1936,"text":280},{"id":1556,"depth":1936,"text":475},{"id":1662,"depth":1936,"text":575},{"id":1757,"depth":1936,"text":1758},{"id":1847,"depth":1928,"text":1848},"md",null,{},true,{"title":15,"description":157},"DvQwc2rM4FqseD3QHUyCecRoLIjQmfZuZK0p1V8hxZw",[1955,1957],{"title":11,"path":12,"stem":13,"description":1956,"children":-1},"Forge is organized around domain modules. A domain usually has SQF addon\nentry points, Rust models, repository traits, service logic, extension command\nhandlers, and optional browser UI.",{"title":19,"path":20,"stem":21,"description":1958,"children":-1},"This guide covers the usual path for adding or changing a Forge module.",1776806627742] \ No newline at end of file diff --git a/docus/dist/getting-started/surrealdb-setup.html b/docus/dist/getting-started/surrealdb-setup.html index dd90e34..dd2195a 100644 --- a/docus/dist/getting-started/surrealdb-setup.html +++ b/docus/dist/getting-started/surrealdb-setup.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}SurrealDB Setup - forge-docussurreal executable is installed and available on your PATH.

    Copyright © 2026
    \ No newline at end of file +SurrealDB.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/getting-started/surrealdb-setup/_payload.json b/docus/dist/getting-started/surrealdb-setup/_payload.json index bce3c69..d5bdb3b 100644 --- a/docus/dist/getting-started/surrealdb-setup/_payload.json +++ b/docus/dist/getting-started/surrealdb-setup/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":488},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-surrealdb-setup":145,"-getting-started-surrealdb-setup-surround":483},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":23,"body":147,"description":157,"extension":477,"links":478,"meta":479,"navigation":480,"path":24,"seo":481,"stem":25,"__hash__":482},"docs\u002F1.getting-started\u002F4.surrealdb-setup.md",{"type":148,"value":149,"toc":471},"minimark",[150,154,158,163,168,171,174,199,202,225,251,279,282,291,306,353,356,368,385,391,395,398,400,423,426,449,457,467],[151,152,23],"h1",{"id":153},"surrealdb-setup",[155,156,157],"p",{},"Forge uses SurrealDB for durable storage. The Rust server extension connects to\nSurrealDB on startup and applies Forge schema modules automatically, so setup\ncomes down to running a reachable database and matching the Forge config.",[159,160,162],"h2",{"id":161},"choose-the-right-path","Choose the Right Path",[164,165,167],"h3",{"id":166},"developer-or-server-operator","Developer or Server Operator",[155,169,170],{},"Use this path if you are building Forge, running a local test server, or\nhosting the live Arma server.",[155,172,173],{},"Official SurrealDB resources:",[175,176,177,187],"ul",{},[178,179,180],"li",{},[181,182,186],"a",{"href":183,"rel":184},"https:\u002F\u002Fsurrealdb.com\u002Finstall",[185],"nofollow","SurrealDB install page",[178,188,189],{},[181,190,193,194,198],{"href":191,"rel":192},"https:\u002F\u002Fsurrealdb.com\u002Fdocs\u002Freference\u002Fcli\u002Fsurrealdb-cli\u002Fcommands\u002Fstart",[185],"SurrealDB CLI ",[195,196,197],"code",{},"start"," reference",[155,200,201],{},"Install SurrealDB with the official method for your platform:",[203,204,209],"pre",{"className":205,"code":206,"language":207,"meta":208,"style":208},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Windows\niwr https:\u002F\u002Fwindows.surrealdb.com -useb | iex\n","powershell","",[195,210,211,219],{"__ignoreMap":208},[212,213,216],"span",{"class":214,"line":215},"line",1,[212,217,218],{},"# Windows\n",[212,220,222],{"class":214,"line":221},2,[212,223,224],{},"iwr https:\u002F\u002Fwindows.surrealdb.com -useb | iex\n",[203,226,230],{"className":227,"code":228,"language":229,"meta":208,"style":208},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# macOS\nbrew install surrealdb\u002Ftap\u002Fsurreal\n","bash",[195,231,232,238],{"__ignoreMap":208},[212,233,234],{"class":214,"line":215},[212,235,237],{"class":236},"sHwdD","# macOS\n",[212,239,240,244,248],{"class":214,"line":221},[212,241,243],{"class":242},"sBMFI","brew",[212,245,247],{"class":246},"sfazB"," install",[212,249,250],{"class":246}," surrealdb\u002Ftap\u002Fsurreal\n",[203,252,254],{"className":227,"code":253,"language":229,"meta":208,"style":208},"# Linux\ncurl -sSf https:\u002F\u002Finstall.surrealdb.com | sh\n",[195,255,256,261],{"__ignoreMap":208},[212,257,258],{"class":214,"line":215},[212,259,260],{"class":236},"# Linux\n",[212,262,263,266,269,272,276],{"class":214,"line":221},[212,264,265],{"class":242},"curl",[212,267,268],{"class":246}," -sSf",[212,270,271],{"class":246}," https:\u002F\u002Finstall.surrealdb.com",[212,273,275],{"class":274},"sMK4o"," |",[212,277,278],{"class":242}," sh\n",[155,280,281],{},"For Forge, start a persistent local database instead of the default in-memory\nmode:",[203,283,285],{"className":205,"code":284,"language":207,"meta":208,"style":208},"surreal start surrealkv:\u002F\u002Fforge.db --bind 127.0.0.1:8000 --user root --pass root\n",[195,286,287],{"__ignoreMap":208},[212,288,289],{"class":214,"line":215},[212,290,284],{},[155,292,293,294,297,298,301,302,305],{},"Then copy ",[195,295,296],{},"arma\u002Fserver\u002Fextension\u002Fconfig.example.toml"," to ",[195,299,300],{},"config.toml"," next to\n",[195,303,304],{},"forge_server_x64.dll"," and keep the values aligned with the database you\nstarted:",[203,307,311],{"className":308,"code":309,"language":310,"meta":208,"style":208},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[surreal]\nendpoint = \"127.0.0.1:8000\"\nnamespace = \"forge\"\ndatabase = \"main\"\nusername = \"root\"\npassword = \"root\"\nconnect_timeout_ms = 5000\n","toml",[195,312,313,318,323,329,335,341,347],{"__ignoreMap":208},[212,314,315],{"class":214,"line":215},[212,316,317],{},"[surreal]\n",[212,319,320],{"class":214,"line":221},[212,321,322],{},"endpoint = \"127.0.0.1:8000\"\n",[212,324,326],{"class":214,"line":325},3,[212,327,328],{},"namespace = \"forge\"\n",[212,330,332],{"class":214,"line":331},4,[212,333,334],{},"database = \"main\"\n",[212,336,338],{"class":214,"line":337},5,[212,339,340],{},"username = \"root\"\n",[212,342,344],{"class":214,"line":343},6,[212,345,346],{},"password = \"root\"\n",[212,348,350],{"class":214,"line":349},7,[212,351,352],{},"connect_timeout_ms = 5000\n",[155,354,355],{},"After that:",[357,358,359,362,365],"ol",{},[178,360,361],{},"Start the Arma server with the Forge extension enabled.",[178,363,364],{},"Let the extension connect and apply the Forge schema modules.",[178,366,367],{},"Verify the connection state:",[203,369,373],{"className":370,"code":371,"language":372,"meta":208,"style":208},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"status\", []];\n\"forge_server\" callExtension [\"surreal:status\", []];\n","sqf",[195,374,375,380],{"__ignoreMap":208},[212,376,377],{"class":214,"line":215},[212,378,379],{},"\"forge_server\" callExtension [\"status\", []];\n",[212,381,382],{"class":214,"line":221},[212,383,384],{},"\"forge_server\" callExtension [\"surreal:status\", []];\n",[155,386,387,388,390],{},"If you change the endpoint, namespace, database, username, or password in\nSurrealDB, change the same values in Forge's ",[195,389,300],{},".",[164,392,394],{"id":393},"mission-designer-or-community-managerleader","Mission Designer or Community Manager\u002FLeader",[155,396,397],{},"Use this path if you mostly need to inspect, query, or adjust data for a test\nor live server and you are not changing Forge source code.",[155,399,173],{},[175,401,402,409,416],{},[178,403,404],{},[181,405,408],{"href":406,"rel":407},"https:\u002F\u002Fsurrealdb.com\u002Fdocs\u002Fexplore\u002Fsurrealist\u002Finstallation",[185],"Surrealist installation",[178,410,411],{},[181,412,415],{"href":413,"rel":414},"https:\u002F\u002Fapp.surrealdb.com",[185],"Surrealist web app",[178,417,418],{},[181,419,422],{"href":420,"rel":421},"https:\u002F\u002Fsurrealdb.com\u002Fdocs\u002Fexplore\u002Fsurrealist\u002Fconcepts\u002Flocal-database-serving",[185],"Surrealist local database serving",[155,424,425],{},"Recommended approach:",[357,427,428,440,443],{},[178,429,430,431,435,436,439],{},"Install ",[432,433,434],"strong",{},"Surrealist Desktop",". It is the better fit for Forge because the\nofficial docs note that the web app can be limited when connecting to\n",[195,437,438],{},"localhost"," or non-HTTPS endpoints.",[178,441,442],{},"Connect Surrealist to the same database Forge uses.",[178,444,445,446,448],{},"Use the values from the server's ",[195,447,300],{},":",[203,450,455],{"className":451,"code":453,"language":454,"meta":208},[452],"language-text","Endpoint: http:\u002F\u002F127.0.0.1:8000\nNamespace: forge\nDatabase: main\nUsername: root\nPassword: root\n","text",[195,456,453],{"__ignoreMap":208},[155,458,459,460,463,464,390],{},"If you need your own local sandbox instead of connecting to an existing Forge\nserver, install SurrealDB first and follow the developer\u002Fserver-operator path\nabove. Surrealist Desktop can also launch a local database for you after the\n",[195,461,462],{},"surreal"," executable is installed and available on your ",[195,465,466],{},"PATH",[468,469,470],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":208,"searchDepth":221,"depth":221,"links":472},[473],{"id":161,"depth":221,"text":162,"children":474},[475,476],{"id":166,"depth":325,"text":167},{"id":393,"depth":325,"text":394},"md",null,{},true,{"title":23,"description":157},"Mzg_hZr3MJToQo6L-0UrTXsAtDW3i2aJ-CYUHBu0nB8",[484,486],{"title":19,"path":20,"stem":21,"description":485,"children":-1},"This guide covers the usual path for adding or changing a Forge module.",{"title":28,"path":29,"stem":30,"description":487,"children":-1},"Forge Server is an arma-rs extension for Arma 3 server-side persistence and\ndomain services. It exposes game-facing commands and stores durable state in\nSurrealDB.",1776805514937] \ No newline at end of file +[{"data":1,"prerenderedAt":488},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-surrealdb-setup":145,"-getting-started-surrealdb-setup-surround":483},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":23,"body":147,"description":157,"extension":477,"links":478,"meta":479,"navigation":480,"path":24,"seo":481,"stem":25,"__hash__":482},"docs\u002F1.getting-started\u002F4.surrealdb-setup.md",{"type":148,"value":149,"toc":471},"minimark",[150,154,158,163,168,171,174,199,202,225,251,279,282,291,306,353,356,368,385,391,395,398,400,423,426,449,457,467],[151,152,23],"h1",{"id":153},"surrealdb-setup",[155,156,157],"p",{},"Forge uses SurrealDB for durable storage. The Rust server extension connects to\nSurrealDB on startup and applies Forge schema modules automatically, so setup\ncomes down to running a reachable database and matching the Forge config.",[159,160,162],"h2",{"id":161},"choose-the-right-path","Choose the Right Path",[164,165,167],"h3",{"id":166},"developer-or-server-operator","Developer or Server Operator",[155,169,170],{},"Use this path if you are building Forge, running a local test server, or\nhosting the live Arma server.",[155,172,173],{},"Official SurrealDB resources:",[175,176,177,187],"ul",{},[178,179,180],"li",{},[181,182,186],"a",{"href":183,"rel":184},"https:\u002F\u002Fsurrealdb.com\u002Finstall",[185],"nofollow","SurrealDB install page",[178,188,189],{},[181,190,193,194,198],{"href":191,"rel":192},"https:\u002F\u002Fsurrealdb.com\u002Fdocs\u002Freference\u002Fcli\u002Fsurrealdb-cli\u002Fcommands\u002Fstart",[185],"SurrealDB CLI ",[195,196,197],"code",{},"start"," reference",[155,200,201],{},"Install SurrealDB with the official method for your platform:",[203,204,209],"pre",{"className":205,"code":206,"language":207,"meta":208,"style":208},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Windows\niwr https:\u002F\u002Fwindows.surrealdb.com -useb | iex\n","powershell","",[195,210,211,219],{"__ignoreMap":208},[212,213,216],"span",{"class":214,"line":215},"line",1,[212,217,218],{},"# Windows\n",[212,220,222],{"class":214,"line":221},2,[212,223,224],{},"iwr https:\u002F\u002Fwindows.surrealdb.com -useb | iex\n",[203,226,230],{"className":227,"code":228,"language":229,"meta":208,"style":208},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# macOS\nbrew install surrealdb\u002Ftap\u002Fsurreal\n","bash",[195,231,232,238],{"__ignoreMap":208},[212,233,234],{"class":214,"line":215},[212,235,237],{"class":236},"sHwdD","# macOS\n",[212,239,240,244,248],{"class":214,"line":221},[212,241,243],{"class":242},"sBMFI","brew",[212,245,247],{"class":246},"sfazB"," install",[212,249,250],{"class":246}," surrealdb\u002Ftap\u002Fsurreal\n",[203,252,254],{"className":227,"code":253,"language":229,"meta":208,"style":208},"# Linux\ncurl -sSf https:\u002F\u002Finstall.surrealdb.com | sh\n",[195,255,256,261],{"__ignoreMap":208},[212,257,258],{"class":214,"line":215},[212,259,260],{"class":236},"# Linux\n",[212,262,263,266,269,272,276],{"class":214,"line":221},[212,264,265],{"class":242},"curl",[212,267,268],{"class":246}," -sSf",[212,270,271],{"class":246}," https:\u002F\u002Finstall.surrealdb.com",[212,273,275],{"class":274},"sMK4o"," |",[212,277,278],{"class":242}," sh\n",[155,280,281],{},"For Forge, start a persistent local database instead of the default in-memory\nmode:",[203,283,285],{"className":205,"code":284,"language":207,"meta":208,"style":208},"surreal start surrealkv:\u002F\u002Fforge.db --bind 127.0.0.1:8000 --user root --pass root\n",[195,286,287],{"__ignoreMap":208},[212,288,289],{"class":214,"line":215},[212,290,284],{},[155,292,293,294,297,298,301,302,305],{},"Then copy ",[195,295,296],{},"arma\u002Fserver\u002Fextension\u002Fconfig.example.toml"," to ",[195,299,300],{},"config.toml"," next to\n",[195,303,304],{},"forge_server_x64.dll"," and keep the values aligned with the database you\nstarted:",[203,307,311],{"className":308,"code":309,"language":310,"meta":208,"style":208},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[surreal]\nendpoint = \"127.0.0.1:8000\"\nnamespace = \"forge\"\ndatabase = \"main\"\nusername = \"root\"\npassword = \"root\"\nconnect_timeout_ms = 5000\n","toml",[195,312,313,318,323,329,335,341,347],{"__ignoreMap":208},[212,314,315],{"class":214,"line":215},[212,316,317],{},"[surreal]\n",[212,319,320],{"class":214,"line":221},[212,321,322],{},"endpoint = \"127.0.0.1:8000\"\n",[212,324,326],{"class":214,"line":325},3,[212,327,328],{},"namespace = \"forge\"\n",[212,330,332],{"class":214,"line":331},4,[212,333,334],{},"database = \"main\"\n",[212,336,338],{"class":214,"line":337},5,[212,339,340],{},"username = \"root\"\n",[212,342,344],{"class":214,"line":343},6,[212,345,346],{},"password = \"root\"\n",[212,348,350],{"class":214,"line":349},7,[212,351,352],{},"connect_timeout_ms = 5000\n",[155,354,355],{},"After that:",[357,358,359,362,365],"ol",{},[178,360,361],{},"Start the Arma server with the Forge extension enabled.",[178,363,364],{},"Let the extension connect and apply the Forge schema modules.",[178,366,367],{},"Verify the connection state:",[203,369,373],{"className":370,"code":371,"language":372,"meta":208,"style":208},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"status\", []];\n\"forge_server\" callExtension [\"surreal:status\", []];\n","sqf",[195,374,375,380],{"__ignoreMap":208},[212,376,377],{"class":214,"line":215},[212,378,379],{},"\"forge_server\" callExtension [\"status\", []];\n",[212,381,382],{"class":214,"line":221},[212,383,384],{},"\"forge_server\" callExtension [\"surreal:status\", []];\n",[155,386,387,388,390],{},"If you change the endpoint, namespace, database, username, or password in\nSurrealDB, change the same values in Forge's ",[195,389,300],{},".",[164,392,394],{"id":393},"mission-designer-or-community-managerleader","Mission Designer or Community Manager\u002FLeader",[155,396,397],{},"Use this path if you mostly need to inspect, query, or adjust data for a test\nor live server and you are not changing Forge source code.",[155,399,173],{},[175,401,402,409,416],{},[178,403,404],{},[181,405,408],{"href":406,"rel":407},"https:\u002F\u002Fsurrealdb.com\u002Fdocs\u002Fexplore\u002Fsurrealist\u002Finstallation",[185],"Surrealist installation",[178,410,411],{},[181,412,415],{"href":413,"rel":414},"https:\u002F\u002Fapp.surrealdb.com",[185],"Surrealist web app",[178,417,418],{},[181,419,422],{"href":420,"rel":421},"https:\u002F\u002Fsurrealdb.com\u002Fdocs\u002Fexplore\u002Fsurrealist\u002Fconcepts\u002Flocal-database-serving",[185],"Surrealist local database serving",[155,424,425],{},"Recommended approach:",[357,427,428,440,443],{},[178,429,430,431,435,436,439],{},"Install ",[432,433,434],"strong",{},"Surrealist Desktop",". It is the better fit for Forge because the\nofficial docs note that the web app can be limited when connecting to\n",[195,437,438],{},"localhost"," or non-HTTPS endpoints.",[178,441,442],{},"Connect Surrealist to the same database Forge uses.",[178,444,445,446,448],{},"Use the values from the server's ",[195,447,300],{},":",[203,450,455],{"className":451,"code":453,"language":454,"meta":208},[452],"language-text","Endpoint: http:\u002F\u002F127.0.0.1:8000\nNamespace: forge\nDatabase: main\nUsername: root\nPassword: root\n","text",[195,456,453],{"__ignoreMap":208},[155,458,459,460,463,464,390],{},"If you need your own local sandbox instead of connecting to an existing Forge\nserver, install SurrealDB first and follow the developer\u002Fserver-operator path\nabove. Surrealist Desktop can also launch a local database for you after the\n",[195,461,462],{},"surreal"," executable is installed and available on your ",[195,465,466],{},"PATH",[468,469,470],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":208,"searchDepth":221,"depth":221,"links":472},[473],{"id":161,"depth":221,"text":162,"children":474},[475,476],{"id":166,"depth":325,"text":167},{"id":393,"depth":325,"text":394},"md",null,{},true,{"title":23,"description":157},"Mzg_hZr3MJToQo6L-0UrTXsAtDW3i2aJ-CYUHBu0nB8",[484,486],{"title":19,"path":20,"stem":21,"description":485,"children":-1},"This guide covers the usual path for adding or changing a Forge module.",{"title":28,"path":29,"stem":30,"description":487,"children":-1},"Forge Server is an arma-rs extension for Arma 3 server-side persistence and\ndomain services. It exposes game-facing commands and stores durable state in\nSurrealDB.",1776806627742] \ No newline at end of file diff --git a/docus/dist/index.html b/docus/dist/index.html index 7fd779e..fd4ff5c 100644 --- a/docus/dist/index.html +++ b/docus/dist/index.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Forge Framework Documentation - forge-docus

    Forge Framework Documentation

    Forge is a persistent Arma 3 framework that combines SQF addons, a Rust +}Forge Framework Documentation - forge-docus

    Forge Framework Documentation

    Forge is a persistent Arma 3 framework that combines SQF addons, a Rust arma-rs extension, SurrealDB persistence, shared domain crates, and browser-backed player interfaces.

    Use these docs to understand the runtime architecture, extension API surface, server gameplay modules, and client addon integration patterns.

    What Forge Covers

      Domain Modules
      Actor, bank, CAD, garage, locker, organization, phone, store, task, and @@ -103,4 +103,4 @@ services, and persists durable state through SurrealDB.
    Browser UIs
    Client addons host web-based interfaces inside Arma displays and synchronize state through namespaced browser bridge events.
    Transport Layer
    Large payloads move through chunked request and response transport while smaller commands still use direct callExtension paths.
    Development Workflow
    The docs cover module boundaries, local validation checks, and where new -domain logic belongs across Rust, SQF, and web UI layers.

    Documentation Areas

      Getting Started
      Framework overview, architecture, module reference, and development rules.
      Server Extension
      Extension architecture, command surface, and SQF usage examples.
      Server Modules
      Gameplay-domain usage guides for persistence, hot state, and command flows.
      Client Addons
      Browser bridge, client UX entry points, and addon-specific event contracts.
    Copyright © 2026
    \ No newline at end of file +domain logic belongs across Rust, SQF, and web UI layers.

    Documentation Areas

      Getting Started
      Framework overview, architecture, module reference, and development rules.
      Server Extension
      Extension architecture, command surface, and SQF usage examples.
      Server Modules
      Gameplay-domain usage guides for persistence, hot state, and command flows.
      Client Addons
      Browser bridge, client UX entry points, and addon-specific event contracts.
    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/server-extension.html b/docus/dist/server-extension.html index ce02332..5090d1a 100644 --- a/docus/dist/server-extension.html +++ b/docus/dist/server-extension.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Forge Server Extension - forge-docus

    Forge Server API Reference

    The Forge server extension exposes domain-oriented commands through callExtension. Persistent data is stored through the configured SurrealDB -connection and schema modules.

    Copyright © 2026
    \ No newline at end of file +connection and schema modules.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/server-extension/_payload.json b/docus/dist/server-extension/_payload.json index a1b6a7a..96e5c31 100644 --- a/docus/dist/server-extension/_payload.json +++ b/docus/dist/server-extension/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":305},["ShallowReactive",2],{"navigation_docs":3,"-server-extension":145,"-server-extension-surround":300},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":28,"body":147,"description":157,"extension":294,"links":295,"meta":296,"navigation":297,"path":29,"seo":298,"stem":30,"__hash__":299},"docs\u002F2.server-extension\u002F0.index.md",{"type":148,"value":149,"toc":289},"minimark",[150,154,158,163,179,189,193,204,255,262,266,285],[151,152,28],"h1",{"id":153},"forge-server-extension",[155,156,157],"p",{},"Forge Server is an arma-rs extension for Arma 3 server-side persistence and\ndomain services. It exposes game-facing commands and stores durable state in\nSurrealDB.",[159,160,162],"h2",{"id":161},"architecture","Architecture",[155,164,165,166,170,171,174,175,178],{},"SQF modules call ",[167,168,169],"code",{},"forge_server"," through ",[167,172,173],{},"fnc_extCall",". Small requests use the\ndirect ",[167,176,177],{},"callExtension"," path, while large payloads are staged through the\ntransport layer.",[180,181,187],"pre",{"className":182,"code":184,"language":185,"meta":186},[183],"language-text","SQF module\n -> extension bridge\n -> domain command\n -> service layer\n -> repository\n -> SurrealDB\n","text","",[167,188,184],{"__ignoreMap":186},[159,190,192],{"id":191},"configuration","Configuration",[155,194,195,196,199,200,203],{},"Copy ",[167,197,198],{},"config.example.toml"," to ",[167,201,202],{},"config.toml"," next to the extension DLL.",[180,205,209],{"className":206,"code":207,"language":208,"meta":186,"style":186},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[surreal]\nendpoint = \"127.0.0.1:8000\"\nnamespace = \"forge\"\ndatabase = \"main\"\nusername = \"root\"\npassword = \"root\"\nconnect_timeout_ms = 5000\n","toml",[167,210,211,219,225,231,237,243,249],{"__ignoreMap":186},[212,213,216],"span",{"class":214,"line":215},"line",1,[212,217,218],{},"[surreal]\n",[212,220,222],{"class":214,"line":221},2,[212,223,224],{},"endpoint = \"127.0.0.1:8000\"\n",[212,226,228],{"class":214,"line":227},3,[212,229,230],{},"namespace = \"forge\"\n",[212,232,234],{"class":214,"line":233},4,[212,235,236],{},"database = \"main\"\n",[212,238,240],{"class":214,"line":239},5,[212,241,242],{},"username = \"root\"\n",[212,244,246],{"class":214,"line":245},6,[212,247,248],{},"password = \"root\"\n",[212,250,252],{"class":214,"line":251},7,[212,253,254],{},"connect_timeout_ms = 5000\n",[155,256,257,258,261],{},"For install links and Forge-specific setup steps, see\n",[259,260,23],"a",{"href":24},".",[159,263,265],{"id":264},"references","References",[267,268,269,275,280],"ul",{},[270,271,272],"li",{},[259,273,274],{"href":35},"API Reference",[270,276,277],{},[259,278,279],{"href":39},"Usage Examples",[270,281,282],{},[259,283,284],{"href":6},"Framework Module Guides",[286,287,288],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":186,"searchDepth":221,"depth":221,"links":290},[291,292,293],{"id":161,"depth":221,"text":162},{"id":191,"depth":221,"text":192},{"id":264,"depth":221,"text":265},"md",null,{},true,{"title":28,"description":157},"SU6vHrINTwEWo9oGCzI4XL2aIeAMs6_cQbRNoeKCsys",[301,303],{"title":23,"path":24,"stem":25,"description":302,"children":-1},"Forge uses SurrealDB for durable storage. The Rust server extension connects to\nSurrealDB on startup and applies Forge schema modules automatically, so setup\ncomes down to running a reachable database and matching the Forge config.",{"title":34,"path":35,"stem":36,"description":304,"children":-1},"The Forge server extension exposes domain-oriented commands through\ncallExtension. Persistent data is stored through the configured SurrealDB\nconnection and schema modules.",1776805514039] \ No newline at end of file +[{"data":1,"prerenderedAt":305},["ShallowReactive",2],{"navigation_docs":3,"-server-extension":145,"-server-extension-surround":300},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":28,"body":147,"description":157,"extension":294,"links":295,"meta":296,"navigation":297,"path":29,"seo":298,"stem":30,"__hash__":299},"docs\u002F2.server-extension\u002F0.index.md",{"type":148,"value":149,"toc":289},"minimark",[150,154,158,163,179,189,193,204,255,262,266,285],[151,152,28],"h1",{"id":153},"forge-server-extension",[155,156,157],"p",{},"Forge Server is an arma-rs extension for Arma 3 server-side persistence and\ndomain services. It exposes game-facing commands and stores durable state in\nSurrealDB.",[159,160,162],"h2",{"id":161},"architecture","Architecture",[155,164,165,166,170,171,174,175,178],{},"SQF modules call ",[167,168,169],"code",{},"forge_server"," through ",[167,172,173],{},"fnc_extCall",". Small requests use the\ndirect ",[167,176,177],{},"callExtension"," path, while large payloads are staged through the\ntransport layer.",[180,181,187],"pre",{"className":182,"code":184,"language":185,"meta":186},[183],"language-text","SQF module\n -> extension bridge\n -> domain command\n -> service layer\n -> repository\n -> SurrealDB\n","text","",[167,188,184],{"__ignoreMap":186},[159,190,192],{"id":191},"configuration","Configuration",[155,194,195,196,199,200,203],{},"Copy ",[167,197,198],{},"config.example.toml"," to ",[167,201,202],{},"config.toml"," next to the extension DLL.",[180,205,209],{"className":206,"code":207,"language":208,"meta":186,"style":186},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[surreal]\nendpoint = \"127.0.0.1:8000\"\nnamespace = \"forge\"\ndatabase = \"main\"\nusername = \"root\"\npassword = \"root\"\nconnect_timeout_ms = 5000\n","toml",[167,210,211,219,225,231,237,243,249],{"__ignoreMap":186},[212,213,216],"span",{"class":214,"line":215},"line",1,[212,217,218],{},"[surreal]\n",[212,220,222],{"class":214,"line":221},2,[212,223,224],{},"endpoint = \"127.0.0.1:8000\"\n",[212,226,228],{"class":214,"line":227},3,[212,229,230],{},"namespace = \"forge\"\n",[212,232,234],{"class":214,"line":233},4,[212,235,236],{},"database = \"main\"\n",[212,238,240],{"class":214,"line":239},5,[212,241,242],{},"username = \"root\"\n",[212,244,246],{"class":214,"line":245},6,[212,247,248],{},"password = \"root\"\n",[212,250,252],{"class":214,"line":251},7,[212,253,254],{},"connect_timeout_ms = 5000\n",[155,256,257,258,261],{},"For install links and Forge-specific setup steps, see\n",[259,260,23],"a",{"href":24},".",[159,263,265],{"id":264},"references","References",[267,268,269,275,280],"ul",{},[270,271,272],"li",{},[259,273,274],{"href":35},"API Reference",[270,276,277],{},[259,278,279],{"href":39},"Usage Examples",[270,281,282],{},[259,283,284],{"href":6},"Framework Module Guides",[286,287,288],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":186,"searchDepth":221,"depth":221,"links":290},[291,292,293],{"id":161,"depth":221,"text":162},{"id":191,"depth":221,"text":192},{"id":264,"depth":221,"text":265},"md",null,{},true,{"title":28,"description":157},"SU6vHrINTwEWo9oGCzI4XL2aIeAMs6_cQbRNoeKCsys",[301,303],{"title":23,"path":24,"stem":25,"description":302,"children":-1},"Forge uses SurrealDB for durable storage. The Rust server extension connects to\nSurrealDB on startup and applies Forge schema modules automatically, so setup\ncomes down to running a reachable database and matching the Forge config.",{"title":34,"path":35,"stem":36,"description":304,"children":-1},"The Forge server extension exposes domain-oriented commands through\ncallExtension. Persistent data is stored through the configured SurrealDB\nconnection and schema modules.",1776806627034] \ No newline at end of file diff --git a/docus/dist/server-extension/api-reference.html b/docus/dist/server-extension/api-reference.html index f03a7a8..b72f125 100644 --- a/docus/dist/server-extension/api-reference.html +++ b/docus/dist/server-extension/api-reference.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Forge Server API Reference - forge-docusforge_server_addons_extension_fnc_extCall
    .

    Module Guides

    Copyright © 2026
    \ No newline at end of file +Persistence is handled by the server through SurrealDB.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/server-extension/api-reference/_payload.json b/docus/dist/server-extension/api-reference/_payload.json index 96e3db6..c0b1b03 100644 --- a/docus/dist/server-extension/api-reference/_payload.json +++ b/docus/dist/server-extension/api-reference/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":374},["ShallowReactive",2],{"navigation_docs":3,"-server-extension-api-reference":145,"-server-extension-api-reference-surround":369},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":34,"body":147,"description":362,"extension":363,"links":364,"meta":365,"navigation":366,"path":35,"seo":367,"stem":36,"__hash__":368},"docs\u002F2.server-extension\u002F1.api-reference.md",{"type":148,"value":149,"toc":357},"minimark",[150,154,163,168,197,219,223,226,290,296,300,353],[151,152,34],"h1",{"id":153},"forge-server-api-reference",[155,156,157,158,162],"p",{},"The Forge server extension exposes domain-oriented commands through\n",[159,160,161],"code",{},"callExtension",". Persistent data is stored through the configured SurrealDB\nconnection and schema modules.",[164,165,167],"h2",{"id":166},"core-commands","Core Commands",[169,170,175],"pre",{"className":171,"code":172,"language":173,"meta":174,"style":174},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"version\", []];\n\"forge_server\" callExtension [\"status\", []];\n\"forge_server\" callExtension [\"surreal:status\", []];\n","sqf","",[159,176,177,185,191],{"__ignoreMap":174},[178,179,182],"span",{"class":180,"line":181},"line",1,[178,183,184],{},"\"forge_server\" callExtension [\"version\", []];\n",[178,186,188],{"class":180,"line":187},2,[178,189,190],{},"\"forge_server\" callExtension [\"status\", []];\n",[178,192,194],{"class":180,"line":193},3,[178,195,196],{},"\"forge_server\" callExtension [\"surreal:status\", []];\n",[155,198,199,202,203,206,207,210,211,214,215,218],{},[159,200,201],{},"status"," and ",[159,204,205],{},"surreal:status"," return ",[159,208,209],{},"initializing",", ",[159,212,213],{},"connected",", or ",[159,216,217],{},"failed",".",[164,220,222],{"id":221},"domain-commands","Domain Commands",[155,224,225],{},"Game systems should call the domain APIs instead of raw database operations:",[227,228,229,235,240,245,250,255,260,265,270,275,280,285],"ul",{},[230,231,232],"li",{},[159,233,234],{},"actor:*",[230,236,237],{},[159,238,239],{},"bank:*",[230,241,242],{},[159,243,244],{},"garage:*",[230,246,247],{},[159,248,249],{},"locker:*",[230,251,252],{},[159,253,254],{},"org:*",[230,256,257],{},[159,258,259],{},"phone:*",[230,261,262],{},[159,263,264],{},"store:*",[230,266,267],{},[159,268,269],{},"task:*",[230,271,272],{},[159,273,274],{},"cad:*",[230,276,277],{},[159,278,279],{},"owned:garage:*",[230,281,282],{},[159,283,284],{},"owned:locker:*",[230,286,287],{},[159,288,289],{},"transport:*",[155,291,292,293,218],{},"Large request and response payloads are routed through the transport layer when\nneeded by ",[159,294,295],{},"forge_server_addons_extension_fnc_extCall",[164,297,299],{"id":298},"module-guides","Module Guides",[227,301,302,308,313,318,323,328,333,338,343,348],{},[230,303,304],{},[305,306,307],"a",{"href":50},"Actor",[230,309,310],{},[305,311,312],{"href":62},"Bank",[230,314,315],{},[305,316,317],{"href":66},"CAD",[230,319,320],{},[305,321,322],{"href":74},"Garage",[230,324,325],{},[305,326,327],{"href":78},"Locker",[230,329,330],{},[305,331,332],{"href":82},"Organization",[230,334,335],{},[305,336,337],{"href":86},"Owned Storage",[230,339,340],{},[305,341,342],{"href":90},"Phone",[230,344,345],{},[305,346,347],{"href":54},"Store",[230,349,350],{},[305,351,352],{"href":58},"Task",[354,355,356],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":174,"searchDepth":187,"depth":187,"links":358},[359,360,361],{"id":166,"depth":187,"text":167},{"id":221,"depth":187,"text":222},{"id":298,"depth":187,"text":299},"The Forge server extension exposes domain-oriented commands through\ncallExtension. Persistent data is stored through the configured SurrealDB\nconnection and schema modules.","md",null,{},true,{"title":34,"description":362},"j66Yivw9bhQFaFdk5v93_NuOAXUf0pyKZ7fE_8PMmcQ",[370,372],{"title":28,"path":29,"stem":30,"description":371,"children":-1},"Forge Server is an arma-rs extension for Arma 3 server-side persistence and\ndomain services. It exposes game-facing commands and stores durable state in\nSurrealDB.",{"title":38,"path":39,"stem":40,"description":373,"children":-1},"These examples use the domain command surface exposed by the extension.\nPersistence is handled by the server through SurrealDB.",1776805514937] \ No newline at end of file +[{"data":1,"prerenderedAt":374},["ShallowReactive",2],{"navigation_docs":3,"-server-extension-api-reference":145,"-server-extension-api-reference-surround":369},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":34,"body":147,"description":362,"extension":363,"links":364,"meta":365,"navigation":366,"path":35,"seo":367,"stem":36,"__hash__":368},"docs\u002F2.server-extension\u002F1.api-reference.md",{"type":148,"value":149,"toc":357},"minimark",[150,154,163,168,197,219,223,226,290,296,300,353],[151,152,34],"h1",{"id":153},"forge-server-api-reference",[155,156,157,158,162],"p",{},"The Forge server extension exposes domain-oriented commands through\n",[159,160,161],"code",{},"callExtension",". Persistent data is stored through the configured SurrealDB\nconnection and schema modules.",[164,165,167],"h2",{"id":166},"core-commands","Core Commands",[169,170,175],"pre",{"className":171,"code":172,"language":173,"meta":174,"style":174},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"forge_server\" callExtension [\"version\", []];\n\"forge_server\" callExtension [\"status\", []];\n\"forge_server\" callExtension [\"surreal:status\", []];\n","sqf","",[159,176,177,185,191],{"__ignoreMap":174},[178,179,182],"span",{"class":180,"line":181},"line",1,[178,183,184],{},"\"forge_server\" callExtension [\"version\", []];\n",[178,186,188],{"class":180,"line":187},2,[178,189,190],{},"\"forge_server\" callExtension [\"status\", []];\n",[178,192,194],{"class":180,"line":193},3,[178,195,196],{},"\"forge_server\" callExtension [\"surreal:status\", []];\n",[155,198,199,202,203,206,207,210,211,214,215,218],{},[159,200,201],{},"status"," and ",[159,204,205],{},"surreal:status"," return ",[159,208,209],{},"initializing",", ",[159,212,213],{},"connected",", or ",[159,216,217],{},"failed",".",[164,220,222],{"id":221},"domain-commands","Domain Commands",[155,224,225],{},"Game systems should call the domain APIs instead of raw database operations:",[227,228,229,235,240,245,250,255,260,265,270,275,280,285],"ul",{},[230,231,232],"li",{},[159,233,234],{},"actor:*",[230,236,237],{},[159,238,239],{},"bank:*",[230,241,242],{},[159,243,244],{},"garage:*",[230,246,247],{},[159,248,249],{},"locker:*",[230,251,252],{},[159,253,254],{},"org:*",[230,256,257],{},[159,258,259],{},"phone:*",[230,261,262],{},[159,263,264],{},"store:*",[230,266,267],{},[159,268,269],{},"task:*",[230,271,272],{},[159,273,274],{},"cad:*",[230,276,277],{},[159,278,279],{},"owned:garage:*",[230,281,282],{},[159,283,284],{},"owned:locker:*",[230,286,287],{},[159,288,289],{},"transport:*",[155,291,292,293,218],{},"Large request and response payloads are routed through the transport layer when\nneeded by ",[159,294,295],{},"forge_server_addons_extension_fnc_extCall",[164,297,299],{"id":298},"module-guides","Module Guides",[227,301,302,308,313,318,323,328,333,338,343,348],{},[230,303,304],{},[305,306,307],"a",{"href":50},"Actor",[230,309,310],{},[305,311,312],{"href":62},"Bank",[230,314,315],{},[305,316,317],{"href":66},"CAD",[230,319,320],{},[305,321,322],{"href":74},"Garage",[230,324,325],{},[305,326,327],{"href":78},"Locker",[230,329,330],{},[305,331,332],{"href":82},"Organization",[230,334,335],{},[305,336,337],{"href":86},"Owned Storage",[230,339,340],{},[305,341,342],{"href":90},"Phone",[230,344,345],{},[305,346,347],{"href":54},"Store",[230,349,350],{},[305,351,352],{"href":58},"Task",[354,355,356],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":174,"searchDepth":187,"depth":187,"links":358},[359,360,361],{"id":166,"depth":187,"text":167},{"id":221,"depth":187,"text":222},{"id":298,"depth":187,"text":299},"The Forge server extension exposes domain-oriented commands through\ncallExtension. Persistent data is stored through the configured SurrealDB\nconnection and schema modules.","md",null,{},true,{"title":34,"description":362},"j66Yivw9bhQFaFdk5v93_NuOAXUf0pyKZ7fE_8PMmcQ",[370,372],{"title":28,"path":29,"stem":30,"description":371,"children":-1},"Forge Server is an arma-rs extension for Arma 3 server-side persistence and\ndomain services. It exposes game-facing commands and stores durable state in\nSurrealDB.",{"title":38,"path":39,"stem":40,"description":373,"children":-1},"These examples use the domain command surface exposed by the extension.\nPersistence is handled by the server through SurrealDB.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-extension/usage-examples.html b/docus/dist/server-extension/usage-examples.html index 9ca054e..10fda26 100644 --- a/docus/dist/server-extension/usage-examples.html +++ b/docus/dist/server-extension/usage-examples.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Forge Server Usage Examples - forge-docus
    Forge Server Extension

    Forge Server Usage Examples

    These examples use the domain command surface exposed by the extension. Persistence is handled by the server through SurrealDB.

    Forge Server Usage Examples

    These examples use the domain command surface exposed by the extension. @@ -128,4 +128,4 @@ Persistence is handled by the server through SurrealDB.

    ["store:checkout", [toJSON _checkout]] call forge_server_extension_fnc_extCall;

    Copyright © 2026
    \ No newline at end of file +connection and schema modules.

    Server Module Guides

    These pages document the authoritative server-side workflows in Forge.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/server-extension/usage-examples/_payload.json b/docus/dist/server-extension/usage-examples/_payload.json index 153acef..605a29a 100644 --- a/docus/dist/server-extension/usage-examples/_payload.json +++ b/docus/dist/server-extension/usage-examples/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":370},["ShallowReactive",2],{"navigation_docs":3,"-server-extension-usage-examples":145,"-server-extension-usage-examples-surround":365},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":38,"body":147,"description":157,"extension":360,"links":361,"meta":362,"navigation":343,"path":39,"seo":363,"stem":40,"__hash__":364},"docs\u002F2.server-extension\u002F2.usage-examples.md",{"type":148,"value":149,"toc":355},"minimark",[150,154,158,163,199,203,239,243,351],[151,152,38],"h1",{"id":153},"forge-server-usage-examples",[155,156,157],"p",{},"These examples use the domain command surface exposed by the extension.\nPersistence is handled by the server through SurrealDB.",[159,160,162],"h2",{"id":161},"status-check","Status Check",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[\"status\", []] call forge_server_extension_fnc_extCall params [\"_status\", \"_ok\"];\nif (_ok && {_status isEqualTo \"connected\"}) then {\n systemChat \"Forge persistence is online.\";\n};\n","sqf","",[171,172,173,181,187,193],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,180],{},"[\"status\", []] call forge_server_extension_fnc_extCall params [\"_status\", \"_ok\"];\n",[174,182,184],{"class":176,"line":183},2,[174,185,186],{},"if (_ok && {_status isEqualTo \"connected\"}) then {\n",[174,188,190],{"class":176,"line":189},3,[174,191,192],{}," systemChat \"Forge persistence is online.\";\n",[174,194,196],{"class":176,"line":195},4,[174,197,198],{},"};\n",[159,200,202],{"id":201},"actor-fetch","Actor Fetch",[164,204,206],{"className":166,"code":205,"language":168,"meta":169,"style":169},"private _uid = getPlayerUID player;\n[\"actor:get\", [_uid]] call forge_server_extension_fnc_extCall params [\"_payload\", \"_ok\"];\nif (_ok) then {\n private _actor = fromJSON _payload;\n systemChat format [\"Loaded actor %1\", _actor getOrDefault [\"uid\", _uid]];\n};\n",[171,207,208,213,218,223,228,234],{"__ignoreMap":169},[174,209,210],{"class":176,"line":177},[174,211,212],{},"private _uid = getPlayerUID player;\n",[174,214,215],{"class":176,"line":183},[174,216,217],{},"[\"actor:get\", [_uid]] call forge_server_extension_fnc_extCall params [\"_payload\", \"_ok\"];\n",[174,219,220],{"class":176,"line":189},[174,221,222],{},"if (_ok) then {\n",[174,224,225],{"class":176,"line":195},[174,226,227],{}," private _actor = fromJSON _payload;\n",[174,229,231],{"class":176,"line":230},5,[174,232,233],{}," systemChat format [\"Loaded actor %1\", _actor getOrDefault [\"uid\", _uid]];\n",[174,235,237],{"class":176,"line":236},6,[174,238,198],{},[159,240,242],{"id":241},"store-checkout","Store Checkout",[164,244,246],{"className":166,"code":245,"language":168,"meta":169,"style":169},"private _checkout = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", \"default\"],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"paymentMethod\", \"bank\"],\n [\"items\", [\n createHashMapFromArray [\n [\"classname\", \"FirstAidKit\"],\n [\"category\", \"item\"],\n [\"priceValue\", 50],\n [\"quantity\", 2]\n ]\n ]],\n [\"vehicles\", []]\n];\n\n[\"store:checkout\", [toJSON _checkout]] call forge_server_extension_fnc_extCall;\n",[171,247,248,253,258,263,268,273,278,284,290,296,302,308,314,320,326,332,338,345],{"__ignoreMap":169},[174,249,250],{"class":176,"line":177},[174,251,252],{},"private _checkout = createHashMapFromArray [\n",[174,254,255],{"class":176,"line":183},[174,256,257],{}," [\"requesterUid\", getPlayerUID player],\n",[174,259,260],{"class":176,"line":189},[174,261,262],{}," [\"requesterName\", name player],\n",[174,264,265],{"class":176,"line":195},[174,266,267],{}," [\"orgId\", \"default\"],\n",[174,269,270],{"class":176,"line":230},[174,271,272],{}," [\"requesterIsDefaultOrgCeo\", false],\n",[174,274,275],{"class":176,"line":236},[174,276,277],{}," [\"paymentMethod\", \"bank\"],\n",[174,279,281],{"class":176,"line":280},7,[174,282,283],{}," [\"items\", [\n",[174,285,287],{"class":176,"line":286},8,[174,288,289],{}," createHashMapFromArray [\n",[174,291,293],{"class":176,"line":292},9,[174,294,295],{}," [\"classname\", \"FirstAidKit\"],\n",[174,297,299],{"class":176,"line":298},10,[174,300,301],{}," [\"category\", \"item\"],\n",[174,303,305],{"class":176,"line":304},11,[174,306,307],{}," [\"priceValue\", 50],\n",[174,309,311],{"class":176,"line":310},12,[174,312,313],{}," [\"quantity\", 2]\n",[174,315,317],{"class":176,"line":316},13,[174,318,319],{}," ]\n",[174,321,323],{"class":176,"line":322},14,[174,324,325],{}," ]],\n",[174,327,329],{"class":176,"line":328},15,[174,330,331],{}," [\"vehicles\", []]\n",[174,333,335],{"class":176,"line":334},16,[174,336,337],{},"];\n",[174,339,341],{"class":176,"line":340},17,[174,342,344],{"emptyLinePlaceholder":343},true,"\n",[174,346,348],{"class":176,"line":347},18,[174,349,350],{},"[\"store:checkout\", [toJSON _checkout]] call forge_server_extension_fnc_extCall;\n",[352,353,354],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":183,"depth":183,"links":356},[357,358,359],{"id":161,"depth":183,"text":162},{"id":201,"depth":183,"text":202},{"id":241,"depth":183,"text":242},"md",null,{},{"title":38,"description":157},"O2TDcTyKl2_BCCIWxjtCzQoYYhkNwSnA_sZaeMXSjNw",[366,368],{"title":34,"path":35,"stem":36,"description":367,"children":-1},"The Forge server extension exposes domain-oriented commands through\ncallExtension. Persistent data is stored through the configured SurrealDB\nconnection and schema modules.",{"title":47,"path":43,"stem":44,"description":369,"children":-1},"These pages document the authoritative server-side workflows in Forge.",1776805514937] \ No newline at end of file +[{"data":1,"prerenderedAt":370},["ShallowReactive",2],{"navigation_docs":3,"-server-extension-usage-examples":145,"-server-extension-usage-examples-surround":365},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":38,"body":147,"description":157,"extension":360,"links":361,"meta":362,"navigation":343,"path":39,"seo":363,"stem":40,"__hash__":364},"docs\u002F2.server-extension\u002F2.usage-examples.md",{"type":148,"value":149,"toc":355},"minimark",[150,154,158,163,199,203,239,243,351],[151,152,38],"h1",{"id":153},"forge-server-usage-examples",[155,156,157],"p",{},"These examples use the domain command surface exposed by the extension.\nPersistence is handled by the server through SurrealDB.",[159,160,162],"h2",{"id":161},"status-check","Status Check",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[\"status\", []] call forge_server_extension_fnc_extCall params [\"_status\", \"_ok\"];\nif (_ok && {_status isEqualTo \"connected\"}) then {\n systemChat \"Forge persistence is online.\";\n};\n","sqf","",[171,172,173,181,187,193],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,180],{},"[\"status\", []] call forge_server_extension_fnc_extCall params [\"_status\", \"_ok\"];\n",[174,182,184],{"class":176,"line":183},2,[174,185,186],{},"if (_ok && {_status isEqualTo \"connected\"}) then {\n",[174,188,190],{"class":176,"line":189},3,[174,191,192],{}," systemChat \"Forge persistence is online.\";\n",[174,194,196],{"class":176,"line":195},4,[174,197,198],{},"};\n",[159,200,202],{"id":201},"actor-fetch","Actor Fetch",[164,204,206],{"className":166,"code":205,"language":168,"meta":169,"style":169},"private _uid = getPlayerUID player;\n[\"actor:get\", [_uid]] call forge_server_extension_fnc_extCall params [\"_payload\", \"_ok\"];\nif (_ok) then {\n private _actor = fromJSON _payload;\n systemChat format [\"Loaded actor %1\", _actor getOrDefault [\"uid\", _uid]];\n};\n",[171,207,208,213,218,223,228,234],{"__ignoreMap":169},[174,209,210],{"class":176,"line":177},[174,211,212],{},"private _uid = getPlayerUID player;\n",[174,214,215],{"class":176,"line":183},[174,216,217],{},"[\"actor:get\", [_uid]] call forge_server_extension_fnc_extCall params [\"_payload\", \"_ok\"];\n",[174,219,220],{"class":176,"line":189},[174,221,222],{},"if (_ok) then {\n",[174,224,225],{"class":176,"line":195},[174,226,227],{}," private _actor = fromJSON _payload;\n",[174,229,231],{"class":176,"line":230},5,[174,232,233],{}," systemChat format [\"Loaded actor %1\", _actor getOrDefault [\"uid\", _uid]];\n",[174,235,237],{"class":176,"line":236},6,[174,238,198],{},[159,240,242],{"id":241},"store-checkout","Store Checkout",[164,244,246],{"className":166,"code":245,"language":168,"meta":169,"style":169},"private _checkout = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", \"default\"],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"paymentMethod\", \"bank\"],\n [\"items\", [\n createHashMapFromArray [\n [\"classname\", \"FirstAidKit\"],\n [\"category\", \"item\"],\n [\"priceValue\", 50],\n [\"quantity\", 2]\n ]\n ]],\n [\"vehicles\", []]\n];\n\n[\"store:checkout\", [toJSON _checkout]] call forge_server_extension_fnc_extCall;\n",[171,247,248,253,258,263,268,273,278,284,290,296,302,308,314,320,326,332,338,345],{"__ignoreMap":169},[174,249,250],{"class":176,"line":177},[174,251,252],{},"private _checkout = createHashMapFromArray [\n",[174,254,255],{"class":176,"line":183},[174,256,257],{}," [\"requesterUid\", getPlayerUID player],\n",[174,259,260],{"class":176,"line":189},[174,261,262],{}," [\"requesterName\", name player],\n",[174,264,265],{"class":176,"line":195},[174,266,267],{}," [\"orgId\", \"default\"],\n",[174,269,270],{"class":176,"line":230},[174,271,272],{}," [\"requesterIsDefaultOrgCeo\", false],\n",[174,274,275],{"class":176,"line":236},[174,276,277],{}," [\"paymentMethod\", \"bank\"],\n",[174,279,281],{"class":176,"line":280},7,[174,282,283],{}," [\"items\", [\n",[174,285,287],{"class":176,"line":286},8,[174,288,289],{}," createHashMapFromArray [\n",[174,291,293],{"class":176,"line":292},9,[174,294,295],{}," [\"classname\", \"FirstAidKit\"],\n",[174,297,299],{"class":176,"line":298},10,[174,300,301],{}," [\"category\", \"item\"],\n",[174,303,305],{"class":176,"line":304},11,[174,306,307],{}," [\"priceValue\", 50],\n",[174,309,311],{"class":176,"line":310},12,[174,312,313],{}," [\"quantity\", 2]\n",[174,315,317],{"class":176,"line":316},13,[174,318,319],{}," ]\n",[174,321,323],{"class":176,"line":322},14,[174,324,325],{}," ]],\n",[174,327,329],{"class":176,"line":328},15,[174,330,331],{}," [\"vehicles\", []]\n",[174,333,335],{"class":176,"line":334},16,[174,336,337],{},"];\n",[174,339,341],{"class":176,"line":340},17,[174,342,344],{"emptyLinePlaceholder":343},true,"\n",[174,346,348],{"class":176,"line":347},18,[174,349,350],{},"[\"store:checkout\", [toJSON _checkout]] call forge_server_extension_fnc_extCall;\n",[352,353,354],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":183,"depth":183,"links":356},[357,358,359],{"id":161,"depth":183,"text":162},{"id":201,"depth":183,"text":202},{"id":241,"depth":183,"text":242},"md",null,{},{"title":38,"description":157},"O2TDcTyKl2_BCCIWxjtCzQoYYhkNwSnA_sZaeMXSjNw",[366,368],{"title":34,"path":35,"stem":36,"description":367,"children":-1},"The Forge server extension exposes domain-oriented commands through\ncallExtension. Persistent data is stored through the configured SurrealDB\nconnection and schema modules.",{"title":47,"path":43,"stem":44,"description":369,"children":-1},"These pages document the authoritative server-side workflows in Forge.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules.html b/docus/dist/server-modules.html index 4f4202d..f22f735 100644 --- a/docus/dist/server-modules.html +++ b/docus/dist/server-modules.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Server Module Guides - forge-docus
    Server Modules

    Server Module Guides

    These pages document the authoritative server-side workflows in Forge.

    Server Module Guides

    These pages document the authoritative server-side workflows in Forge.

    Most modules follow the same shape:

    1. Server SQF gathers game context and validates mission/runtime assumptions.
    2. The forge_server extension routes the request into the matching command group.
    3. Services apply business rules through storage-agnostic repository traits.
    4. The extension persists durable state through SurrealDB adapters when needed.

    Gameplay Domains

    Actor
    Persistent player identity, position, loadout, contact fields, and hot state.
    Bank
    Player funds, transfers, PIN validation, checkout charging, and bank hot state.
    CAD
    Dispatch requests, assignments, profiles, grouped state, and hydrated views.
    Economy
    Fuel, service, and medical charging rules across player and organization funds.
    Garage
    Vehicle storage, hot-state updates, and persistence of vehicle condition.
    Locker
    Player inventory storage, unique item limits, and locker hot-state behavior.
    Organization
    Membership, treasury, shared assets, fleet, and organization hot workflows.
    Owned Storage
    Owner-scoped locker and vehicle unlock storage used by org-linked features.
    Phone
    Contacts, message threads, and email state for in-game phone workflows.
    Store
    Checkout orchestration across pricing, grants, payment sources, and rollback.
    Task
    Task catalog, ownership, status transitions, defuse counters, and rewards.

    Forge Server Usage Examples

    These examples use the domain command surface exposed by the extension. +}Server Module Guides - forge-docus

    Server Modules

    Server Module Guides

    These pages document the authoritative server-side workflows in Forge.

    Server Module Guides

    These pages document the authoritative server-side workflows in Forge.

    Most modules follow the same shape:

    1. Server SQF gathers game context and validates mission/runtime assumptions.
    2. The forge_server extension routes the request into the matching command group.
    3. Services apply business rules through storage-agnostic repository traits.
    4. The extension persists durable state through SurrealDB adapters when needed.

    Gameplay Domains

    Actor
    Persistent player identity, position, loadout, contact fields, and hot state.
    Bank
    Player funds, transfers, PIN validation, checkout charging, and bank hot state.
    CAD
    Dispatch requests, assignments, profiles, grouped state, and hydrated views.
    Economy
    Fuel, service, and medical charging rules across player and organization funds.
    Garage
    Vehicle storage, hot-state updates, and persistence of vehicle condition.
    Locker
    Player inventory storage, unique item limits, and locker hot-state behavior.
    Organization
    Membership, treasury, shared assets, fleet, and organization hot workflows.
    Owned Storage
    Owner-scoped locker and vehicle unlock storage used by org-linked features.
    Phone
    Contacts, message threads, and email state for in-game phone workflows.
    Store
    Checkout orchestration across pricing, grants, payment sources, and rollback.
    Task
    Task catalog, ownership, status transitions, defuse counters, and rewards.
    Copyright © 2026
    \ No newline at end of file +organization.

    Copyright © 2026
    \ No newline at end of file diff --git a/docus/dist/server-modules/_payload.json b/docus/dist/server-modules/_payload.json index 1b98698..22def03 100644 --- a/docus/dist/server-modules/_payload.json +++ b/docus/dist/server-modules/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":262},["ShallowReactive",2],{"navigation_docs":3,"-server-modules":145,"-server-modules-surround":257},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":47,"body":147,"description":157,"extension":251,"links":252,"meta":253,"navigation":254,"path":43,"seo":255,"stem":44,"__hash__":256},"docs\u002F3.server-modules\u002F0.index.md",{"type":148,"value":149,"toc":246},"minimark",[150,154,158,161,182,187],[151,152,47],"h1",{"id":153},"server-module-guides",[155,156,157],"p",{},"These pages document the authoritative server-side workflows in Forge.",[155,159,160],{},"Most modules follow the same shape:",[162,163,164,168,176,179],"ol",{},[165,166,167],"li",{},"Server SQF gathers game context and validates mission\u002Fruntime assumptions.",[165,169,170,171,175],{},"The ",[172,173,174],"code",{},"forge_server"," extension routes the request into the matching command group.",[165,177,178],{},"Services apply business rules through storage-agnostic repository traits.",[165,180,181],{},"The extension persists durable state through SurrealDB adapters when needed.",[183,184,186],"h2",{"id":185},"gameplay-domains","Gameplay Domains",[188,189,190,196,201,206,211,216,221,226,231,236,241],"u-page-grid",{},[191,192,195],"u-page-card",{"icon":193,"title":194,"to":50},"i-lucide-user-round","Actor","Persistent player identity, position, loadout, contact fields, and hot state.",[191,197,200],{"icon":198,"title":199,"to":62},"i-lucide-wallet","Bank","Player funds, transfers, PIN validation, checkout charging, and bank hot state.",[191,202,205],{"icon":203,"title":204,"to":66},"i-lucide-map","CAD","Dispatch requests, assignments, profiles, grouped state, and hydrated views.",[191,207,210],{"icon":208,"title":209,"to":70},"i-lucide-ambulance","Economy","Fuel, service, and medical charging rules across player and organization funds.",[191,212,215],{"icon":213,"title":214,"to":74},"i-lucide-car-front","Garage","Vehicle storage, hot-state updates, and persistence of vehicle condition.",[191,217,220],{"icon":218,"title":219,"to":78},"i-lucide-package","Locker","Player inventory storage, unique item limits, and locker hot-state behavior.",[191,222,225],{"icon":223,"title":224,"to":82},"i-lucide-building-2","Organization","Membership, treasury, shared assets, fleet, and organization hot workflows.",[191,227,230],{"icon":228,"title":229,"to":86},"i-lucide-key-round","Owned Storage","Owner-scoped locker and vehicle unlock storage used by org-linked features.",[191,232,235],{"icon":233,"title":234,"to":90},"i-lucide-smartphone","Phone","Contacts, message threads, and email state for in-game phone workflows.",[191,237,240],{"icon":238,"title":239,"to":54},"i-lucide-shopping-cart","Store","Checkout orchestration across pricing, grants, payment sources, and rollback.",[191,242,245],{"icon":243,"title":244,"to":58},"i-lucide-flag","Task","Task catalog, ownership, status transitions, defuse counters, and rewards.",{"title":247,"searchDepth":248,"depth":248,"links":249},"",2,[250],{"id":185,"depth":248,"text":186},"md",null,{},true,{"title":47,"description":157},"6TeKjF0JW1R_YnkuNXMM5vx2uv1q0ZlB9jRteQjAnto",[258,260],{"title":38,"path":39,"stem":40,"description":259,"children":-1},"These examples use the domain command surface exposed by the extension.\nPersistence is handled by the server through SurrealDB.",{"title":49,"path":50,"stem":51,"description":261,"children":-1},"The actor module stores persistent player character data: identity, loadout,\nposition, direction, stance, contact fields, state, holster status, rank, and\norganization.",1776805514039] \ No newline at end of file +[{"data":1,"prerenderedAt":262},["ShallowReactive",2],{"navigation_docs":3,"-server-modules":145,"-server-modules-surround":257},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":47,"body":147,"description":157,"extension":251,"links":252,"meta":253,"navigation":254,"path":43,"seo":255,"stem":44,"__hash__":256},"docs\u002F3.server-modules\u002F0.index.md",{"type":148,"value":149,"toc":246},"minimark",[150,154,158,161,182,187],[151,152,47],"h1",{"id":153},"server-module-guides",[155,156,157],"p",{},"These pages document the authoritative server-side workflows in Forge.",[155,159,160],{},"Most modules follow the same shape:",[162,163,164,168,176,179],"ol",{},[165,166,167],"li",{},"Server SQF gathers game context and validates mission\u002Fruntime assumptions.",[165,169,170,171,175],{},"The ",[172,173,174],"code",{},"forge_server"," extension routes the request into the matching command group.",[165,177,178],{},"Services apply business rules through storage-agnostic repository traits.",[165,180,181],{},"The extension persists durable state through SurrealDB adapters when needed.",[183,184,186],"h2",{"id":185},"gameplay-domains","Gameplay Domains",[188,189,190,196,201,206,211,216,221,226,231,236,241],"u-page-grid",{},[191,192,195],"u-page-card",{"icon":193,"title":194,"to":50},"i-lucide-user-round","Actor","Persistent player identity, position, loadout, contact fields, and hot state.",[191,197,200],{"icon":198,"title":199,"to":62},"i-lucide-wallet","Bank","Player funds, transfers, PIN validation, checkout charging, and bank hot state.",[191,202,205],{"icon":203,"title":204,"to":66},"i-lucide-map","CAD","Dispatch requests, assignments, profiles, grouped state, and hydrated views.",[191,207,210],{"icon":208,"title":209,"to":70},"i-lucide-ambulance","Economy","Fuel, service, and medical charging rules across player and organization funds.",[191,212,215],{"icon":213,"title":214,"to":74},"i-lucide-car-front","Garage","Vehicle storage, hot-state updates, and persistence of vehicle condition.",[191,217,220],{"icon":218,"title":219,"to":78},"i-lucide-package","Locker","Player inventory storage, unique item limits, and locker hot-state behavior.",[191,222,225],{"icon":223,"title":224,"to":82},"i-lucide-building-2","Organization","Membership, treasury, shared assets, fleet, and organization hot workflows.",[191,227,230],{"icon":228,"title":229,"to":86},"i-lucide-key-round","Owned Storage","Owner-scoped locker and vehicle unlock storage used by org-linked features.",[191,232,235],{"icon":233,"title":234,"to":90},"i-lucide-smartphone","Phone","Contacts, message threads, and email state for in-game phone workflows.",[191,237,240],{"icon":238,"title":239,"to":54},"i-lucide-shopping-cart","Store","Checkout orchestration across pricing, grants, payment sources, and rollback.",[191,242,245],{"icon":243,"title":244,"to":58},"i-lucide-flag","Task","Task catalog, ownership, status transitions, defuse counters, and rewards.",{"title":247,"searchDepth":248,"depth":248,"links":249},"",2,[250],{"id":185,"depth":248,"text":186},"md",null,{},true,{"title":47,"description":157},"6TeKjF0JW1R_YnkuNXMM5vx2uv1q0ZlB9jRteQjAnto",[258,260],{"title":38,"path":39,"stem":40,"description":259,"children":-1},"These examples use the domain command surface exposed by the extension.\nPersistence is handled by the server through SurrealDB.",{"title":49,"path":50,"stem":51,"description":261,"children":-1},"The actor module stores persistent player character data: identity, loadout,\nposition, direction, stance, contact fields, state, holster status, rank, and\norganization.",1776806627034] \ No newline at end of file diff --git a/docus/dist/server-modules/actor.html b/docus/dist/server-modules/actor.html index 7fc9b60..5d803ea 100644 --- a/docus/dist/server-modules/actor.html +++ b/docus/dist/server-modules/actor.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Actor Usage Guide - forge-docusprivate _actor = fromJSON _payload;

    Server Module Guides

    These pages document the authoritative server-side workflows in Forge.

    Store Usage Guide

    The store module processes checkout requests. It charges a payment source and grants purchased items to the player locker, virtual arsenal locker, and -virtual garage unlocks.

    \ No newline at end of file +virtual garage unlocks.

    \ No newline at end of file diff --git a/docus/dist/server-modules/actor/_payload.json b/docus/dist/server-modules/actor/_payload.json index c66d921..c598302 100644 --- a/docus/dist/server-modules/actor/_payload.json +++ b/docus/dist/server-modules/actor/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1011},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-actor":145,"-server-modules-actor-surround":1006},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":49,"body":147,"description":157,"extension":1001,"links":1002,"meta":1003,"navigation":709,"path":50,"seo":1004,"stem":51,"__hash__":1005},"docs\u002F3.server-modules\u002F1.actor.md",{"type":148,"value":149,"toc":993},"minimark",[150,154,158,163,166,439,442,504,508,515,623,627,633,735,739,744,797,827,831,841,939,942,946,989],[151,152,49],"h1",{"id":153},"actor-usage-guide",[155,156,157],"p",{},"The actor module stores persistent player character data: identity, loadout,\nposition, direction, stance, contact fields, state, holster status, rank, and\norganization.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Actor data is persisted through SurrealDB by the server extension.",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"uid\": \"76561198000000000\",\n \"name\": \"Player Name\",\n \"loadout\": {},\n \"position\": [1234.5, 6789.0, 0.0],\n \"direction\": 90.0,\n \"stance\": \"STAND\",\n \"email\": \"0160000000@spearnet.mil\",\n \"phone_number\": \"0160000000\",\n \"state\": \"HEALTHY\",\n \"holster\": true,\n \"rank\": null,\n \"organization\": \"default\"\n}\n","json","",[174,175,176,185,213,234,249,282,299,320,341,362,383,398,413,433],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201,204,208,210],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","uid",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," \"",[177,205,207],{"class":206},"sfazB","76561198000000000",[177,209,197],{"class":183},[177,211,212],{"class":183},",\n",[177,214,216,218,221,223,225,227,230,232],{"class":179,"line":215},3,[177,217,190],{"class":183},[177,219,220],{"class":193},"name",[177,222,197],{"class":183},[177,224,200],{"class":183},[177,226,203],{"class":183},[177,228,229],{"class":206},"Player Name",[177,231,197],{"class":183},[177,233,212],{"class":183},[177,235,237,239,242,244,246],{"class":179,"line":236},4,[177,238,190],{"class":183},[177,240,241],{"class":193},"loadout",[177,243,197],{"class":183},[177,245,200],{"class":183},[177,247,248],{"class":183}," {},\n",[177,250,252,254,257,259,261,264,268,271,274,276,279],{"class":179,"line":251},5,[177,253,190],{"class":183},[177,255,256],{"class":193},"position",[177,258,197],{"class":183},[177,260,200],{"class":183},[177,262,263],{"class":183}," [",[177,265,267],{"class":266},"sbssI","1234.5",[177,269,270],{"class":183},",",[177,272,273],{"class":266}," 6789.0",[177,275,270],{"class":183},[177,277,278],{"class":266}," 0.0",[177,280,281],{"class":183},"],\n",[177,283,285,287,290,292,294,297],{"class":179,"line":284},6,[177,286,190],{"class":183},[177,288,289],{"class":193},"direction",[177,291,197],{"class":183},[177,293,200],{"class":183},[177,295,296],{"class":266}," 90.0",[177,298,212],{"class":183},[177,300,302,304,307,309,311,313,316,318],{"class":179,"line":301},7,[177,303,190],{"class":183},[177,305,306],{"class":193},"stance",[177,308,197],{"class":183},[177,310,200],{"class":183},[177,312,203],{"class":183},[177,314,315],{"class":206},"STAND",[177,317,197],{"class":183},[177,319,212],{"class":183},[177,321,323,325,328,330,332,334,337,339],{"class":179,"line":322},8,[177,324,190],{"class":183},[177,326,327],{"class":193},"email",[177,329,197],{"class":183},[177,331,200],{"class":183},[177,333,203],{"class":183},[177,335,336],{"class":206},"0160000000@spearnet.mil",[177,338,197],{"class":183},[177,340,212],{"class":183},[177,342,344,346,349,351,353,355,358,360],{"class":179,"line":343},9,[177,345,190],{"class":183},[177,347,348],{"class":193},"phone_number",[177,350,197],{"class":183},[177,352,200],{"class":183},[177,354,203],{"class":183},[177,356,357],{"class":206},"0160000000",[177,359,197],{"class":183},[177,361,212],{"class":183},[177,363,365,367,370,372,374,376,379,381],{"class":179,"line":364},10,[177,366,190],{"class":183},[177,368,369],{"class":193},"state",[177,371,197],{"class":183},[177,373,200],{"class":183},[177,375,203],{"class":183},[177,377,378],{"class":206},"HEALTHY",[177,380,197],{"class":183},[177,382,212],{"class":183},[177,384,386,388,391,393,395],{"class":179,"line":385},11,[177,387,190],{"class":183},[177,389,390],{"class":193},"holster",[177,392,197],{"class":183},[177,394,200],{"class":183},[177,396,397],{"class":183}," true,\n",[177,399,401,403,406,408,410],{"class":179,"line":400},12,[177,402,190],{"class":183},[177,404,405],{"class":193},"rank",[177,407,197],{"class":183},[177,409,200],{"class":183},[177,411,412],{"class":183}," null,\n",[177,414,416,418,421,423,425,427,430],{"class":179,"line":415},13,[177,417,190],{"class":183},[177,419,420],{"class":193},"organization",[177,422,197],{"class":183},[177,424,200],{"class":183},[177,426,203],{"class":183},[177,428,429],{"class":206},"default",[177,431,432],{"class":183},"\"\n",[177,434,436],{"class":179,"line":435},14,[177,437,438],{"class":183},"}\n",[155,440,441],{},"Rules validated by the Rust service:",[443,444,445,451,456,461,470,483,492],"ul",{},[446,447,448,450],"li",{},[174,449,194],{}," is authoritative from the command argument and must be a 17-digit Steam\nUID.",[446,452,453,455],{},[174,454,220],{}," is optional, but cannot be empty when set and cannot exceed 50\ncharacters.",[446,457,458,460],{},[174,459,256],{}," must be three finite numbers when set.",[446,462,463,465,466,469],{},[174,464,289],{}," must be in the ",[174,467,468],{},"0.0 \u003C= direction \u003C 360.0"," range.",[446,471,472,474,475,478,479,482],{},[174,473,327],{}," must contain ",[174,476,477],{},"@"," and end with ",[174,480,481],{},".mil"," when set.",[446,484,485,487,488,491],{},[174,486,348],{}," must start with ",[174,489,490],{},"0160"," and be 10 digits when set.",[446,493,494,495,497,498,500,501,503],{},"Empty ",[174,496,348],{},", ",[174,499,327],{},", or ",[174,502,420],{}," fields are filled on create.",[159,505,507],{"id":506},"commands","Commands",[155,509,510,511,514],{},"All commands are called on the ",[174,512,513],{},"actor"," group.",[516,517,518,534],"table",{},[519,520,521],"thead",{},[522,523,524,528,531],"tr",{},[525,526,527],"th",{},"Command",[525,529,530],{},"Arguments",[525,532,533],{},"Returns",[535,536,537,552,569,586,607],"tbody",{},[522,538,539,545,549],{},[540,541,542],"td",{},[174,543,544],{},"actor:get",[540,546,547],{},[174,548,194],{},[540,550,551],{},"Actor JSON. If no actor exists, returns a default actor but does not persist it.",[522,553,554,559,566],{},[540,555,556],{},[174,557,558],{},"actor:create",[540,560,561,497,563],{},[174,562,194],{},[174,564,565],{},"actor_json",[540,567,568],{},"Persisted actor JSON.",[522,570,571,576,583],{},[540,572,573],{},[174,574,575],{},"actor:update",[540,577,578,497,580],{},[174,579,194],{},[174,581,582],{},"patch_json",[540,584,585],{},"Updated actor JSON.",[522,587,588,593,597],{},[540,589,590],{},[174,591,592],{},"actor:exists",[540,594,595],{},[174,596,194],{},[540,598,599,602,603,606],{},[174,600,601],{},"true"," or ",[174,604,605],{},"false",".",[522,608,609,614,618],{},[540,610,611],{},[174,612,613],{},"actor:delete",[540,615,616],{},[174,617,194],{},[540,619,620,606],{},[174,621,622],{},"OK",[159,624,626],{"id":625},"create-an-actor","Create an Actor",[155,628,629,630,632],{},"The ",[174,631,194],{}," field in the JSON is overwritten with the command UID.",[167,634,638],{"className":635,"code":636,"language":637,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _actor = createHashMapFromArray [\n [\"uid\", getPlayerUID player],\n [\"name\", name player],\n [\"loadout\", getUnitLoadout player],\n [\"position\", getPosATL player],\n [\"direction\", getDir player],\n [\"stance\", stance player],\n [\"email\", \"\"],\n [\"phone_number\", \"\"],\n [\"state\", \"HEALTHY\"],\n [\"holster\", true],\n [\"organization\", \"default\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"actor:create\", [\n getPlayerUID player,\n toJSON _actor\n]];\n","sqf",[174,639,640,645,650,655,660,665,670,675,680,685,690,695,700,705,711,717,723,729],{"__ignoreMap":172},[177,641,642],{"class":179,"line":180},[177,643,644],{},"private _actor = createHashMapFromArray [\n",[177,646,647],{"class":179,"line":187},[177,648,649],{}," [\"uid\", getPlayerUID player],\n",[177,651,652],{"class":179,"line":215},[177,653,654],{}," [\"name\", name player],\n",[177,656,657],{"class":179,"line":236},[177,658,659],{}," [\"loadout\", getUnitLoadout player],\n",[177,661,662],{"class":179,"line":251},[177,663,664],{}," [\"position\", getPosATL player],\n",[177,666,667],{"class":179,"line":284},[177,668,669],{}," [\"direction\", getDir player],\n",[177,671,672],{"class":179,"line":301},[177,673,674],{}," [\"stance\", stance player],\n",[177,676,677],{"class":179,"line":322},[177,678,679],{}," [\"email\", \"\"],\n",[177,681,682],{"class":179,"line":343},[177,683,684],{}," [\"phone_number\", \"\"],\n",[177,686,687],{"class":179,"line":364},[177,688,689],{}," [\"state\", \"HEALTHY\"],\n",[177,691,692],{"class":179,"line":385},[177,693,694],{}," [\"holster\", true],\n",[177,696,697],{"class":179,"line":400},[177,698,699],{}," [\"organization\", \"default\"]\n",[177,701,702],{"class":179,"line":415},[177,703,704],{},"];\n",[177,706,707],{"class":179,"line":435},[177,708,710],{"emptyLinePlaceholder":709},true,"\n",[177,712,714],{"class":179,"line":713},15,[177,715,716],{},"private _result = \"forge_server\" callExtension [\"actor:create\", [\n",[177,718,720],{"class":179,"line":719},16,[177,721,722],{}," getPlayerUID player,\n",[177,724,726],{"class":179,"line":725},17,[177,727,728],{}," toJSON _actor\n",[177,730,732],{"class":179,"line":731},18,[177,733,734],{},"]];\n",[159,736,738],{"id":737},"update-an-actor","Update an Actor",[155,740,741,743],{},[174,742,575],{}," accepts a JSON object containing only fields to change.",[167,745,747],{"className":635,"code":746,"language":637,"meta":172,"style":172},"private _patch = createHashMapFromArray [\n [\"position\", getPosATL player],\n [\"direction\", getDir player],\n [\"stance\", stance player],\n [\"loadout\", getUnitLoadout player]\n];\n\nprivate _result = \"forge_server\" callExtension [\"actor:update\", [\n getPlayerUID player,\n toJSON _patch\n]];\n",[174,748,749,754,758,762,766,771,775,779,784,788,793],{"__ignoreMap":172},[177,750,751],{"class":179,"line":180},[177,752,753],{},"private _patch = createHashMapFromArray [\n",[177,755,756],{"class":179,"line":187},[177,757,664],{},[177,759,760],{"class":179,"line":215},[177,761,669],{},[177,763,764],{"class":179,"line":236},[177,765,674],{},[177,767,768],{"class":179,"line":251},[177,769,770],{}," [\"loadout\", getUnitLoadout player]\n",[177,772,773],{"class":179,"line":284},[177,774,704],{},[177,776,777],{"class":179,"line":301},[177,778,710],{"emptyLinePlaceholder":709},[177,780,781],{"class":179,"line":322},[177,782,783],{},"private _result = \"forge_server\" callExtension [\"actor:update\", [\n",[177,785,786],{"class":179,"line":343},[177,787,722],{},[177,789,790],{"class":179,"line":364},[177,791,792],{}," toJSON _patch\n",[177,794,795],{"class":179,"line":385},[177,796,734],{},[155,798,799,800,497,802,497,804,497,806,497,808,212,810,497,812,497,814,497,816,497,818,820,821,823,824,826],{},"Supported patch fields are ",[174,801,220],{},[174,803,256],{},[174,805,289],{},[174,807,306],{},[174,809,327],{},[174,811,348],{},[174,813,369],{},[174,815,390],{},[174,817,405],{},[174,819,420],{},", and ",[174,822,241],{},".\n",[174,825,194],{}," is ignored.",[159,828,830],{"id":829},"hot-state","Hot State",[155,832,629,833,836,837,840],{},[174,834,835],{},"actor:hot:*"," commands keep a runtime copy of actor data and write it back\nonly when ",[174,838,839],{},"actor:hot:save"," runs.",[516,842,843,853],{},[519,844,845],{},[522,846,847,849,851],{},[525,848,527],{},[525,850,530],{},[525,852,533],{},[535,854,855,869,883,896,911,924],{},[522,856,857,862,866],{},[540,858,859],{},[174,860,861],{},"actor:hot:init",[540,863,864],{},[174,865,194],{},[540,867,868],{},"Actor JSON from durable storage.",[522,870,871,876,880],{},[540,872,873],{},[174,874,875],{},"actor:hot:get",[540,877,878],{},[174,879,194],{},[540,881,882],{},"Actor JSON.",[522,884,885,890,893],{},[540,886,887],{},[174,888,889],{},"actor:hot:keys",[540,891,892],{},"none",[540,894,895],{},"JSON array of hot actor UIDs.",[522,897,898,903,909],{},[540,899,900],{},[174,901,902],{},"actor:hot:override",[540,904,905,497,907],{},[174,906,194],{},[174,908,565],{},[540,910,882],{},[522,912,913,917,921],{},[540,914,915],{},[174,916,839],{},[540,918,919],{},[174,920,194],{},[540,922,923],{},"Current hot actor JSON and async durable save.",[522,925,926,931,935],{},[540,927,928],{},[174,929,930],{},"actor:hot:remove",[540,932,933],{},[174,934,194],{},[540,936,937,606],{},[174,938,622],{},[155,940,941],{},"Use hot state for frequently updated session data such as position and loadout.\nUse durable commands for account creation and administrative changes.",[159,943,945],{"id":944},"error-handling","Error Handling",[167,947,949],{"className":635,"code":948,"language":637,"meta":172,"style":172},"private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Actor error: %1\", _payload];\n};\n\nprivate _actor = fromJSON _payload;\n",[174,950,951,956,961,965,970,975,980,984],{"__ignoreMap":172},[177,952,953],{"class":179,"line":180},[177,954,955],{},"private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\n",[177,957,958],{"class":179,"line":187},[177,959,960],{},"private _payload = _result select 0;\n",[177,962,963],{"class":179,"line":215},[177,964,710],{"emptyLinePlaceholder":709},[177,966,967],{"class":179,"line":236},[177,968,969],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,971,972],{"class":179,"line":251},[177,973,974],{}," systemChat format [\"Actor error: %1\", _payload];\n",[177,976,977],{"class":179,"line":284},[177,978,979],{},"};\n",[177,981,982],{"class":179,"line":301},[177,983,710],{"emptyLinePlaceholder":709},[177,985,986],{"class":179,"line":322},[177,987,988],{},"private _actor = fromJSON _payload;\n",[990,991,992],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":994},[995,996,997,998,999,1000],{"id":161,"depth":187,"text":162},{"id":506,"depth":187,"text":507},{"id":625,"depth":187,"text":626},{"id":737,"depth":187,"text":738},{"id":829,"depth":187,"text":830},{"id":944,"depth":187,"text":945},"md",null,{},{"title":49,"description":157},"lOr0hGaOrJo611Lgdf6VCoSehV0NudH7u2_V75BKoZ0",[1007,1009],{"title":47,"path":43,"stem":44,"description":1008,"children":-1},"These pages document the authoritative server-side workflows in Forge.",{"title":53,"path":54,"stem":55,"description":1010,"children":-1},"The store module processes checkout requests. It charges a payment source and\ngrants purchased items to the player locker, virtual arsenal locker, and\nvirtual garage unlocks.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1011},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-actor":145,"-server-modules-actor-surround":1006},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":49,"body":147,"description":157,"extension":1001,"links":1002,"meta":1003,"navigation":709,"path":50,"seo":1004,"stem":51,"__hash__":1005},"docs\u002F3.server-modules\u002F1.actor.md",{"type":148,"value":149,"toc":993},"minimark",[150,154,158,163,166,439,442,504,508,515,623,627,633,735,739,744,797,827,831,841,939,942,946,989],[151,152,49],"h1",{"id":153},"actor-usage-guide",[155,156,157],"p",{},"The actor module stores persistent player character data: identity, loadout,\nposition, direction, stance, contact fields, state, holster status, rank, and\norganization.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Actor data is persisted through SurrealDB by the server extension.",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"uid\": \"76561198000000000\",\n \"name\": \"Player Name\",\n \"loadout\": {},\n \"position\": [1234.5, 6789.0, 0.0],\n \"direction\": 90.0,\n \"stance\": \"STAND\",\n \"email\": \"0160000000@spearnet.mil\",\n \"phone_number\": \"0160000000\",\n \"state\": \"HEALTHY\",\n \"holster\": true,\n \"rank\": null,\n \"organization\": \"default\"\n}\n","json","",[174,175,176,185,213,234,249,282,299,320,341,362,383,398,413,433],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201,204,208,210],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","uid",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," \"",[177,205,207],{"class":206},"sfazB","76561198000000000",[177,209,197],{"class":183},[177,211,212],{"class":183},",\n",[177,214,216,218,221,223,225,227,230,232],{"class":179,"line":215},3,[177,217,190],{"class":183},[177,219,220],{"class":193},"name",[177,222,197],{"class":183},[177,224,200],{"class":183},[177,226,203],{"class":183},[177,228,229],{"class":206},"Player Name",[177,231,197],{"class":183},[177,233,212],{"class":183},[177,235,237,239,242,244,246],{"class":179,"line":236},4,[177,238,190],{"class":183},[177,240,241],{"class":193},"loadout",[177,243,197],{"class":183},[177,245,200],{"class":183},[177,247,248],{"class":183}," {},\n",[177,250,252,254,257,259,261,264,268,271,274,276,279],{"class":179,"line":251},5,[177,253,190],{"class":183},[177,255,256],{"class":193},"position",[177,258,197],{"class":183},[177,260,200],{"class":183},[177,262,263],{"class":183}," [",[177,265,267],{"class":266},"sbssI","1234.5",[177,269,270],{"class":183},",",[177,272,273],{"class":266}," 6789.0",[177,275,270],{"class":183},[177,277,278],{"class":266}," 0.0",[177,280,281],{"class":183},"],\n",[177,283,285,287,290,292,294,297],{"class":179,"line":284},6,[177,286,190],{"class":183},[177,288,289],{"class":193},"direction",[177,291,197],{"class":183},[177,293,200],{"class":183},[177,295,296],{"class":266}," 90.0",[177,298,212],{"class":183},[177,300,302,304,307,309,311,313,316,318],{"class":179,"line":301},7,[177,303,190],{"class":183},[177,305,306],{"class":193},"stance",[177,308,197],{"class":183},[177,310,200],{"class":183},[177,312,203],{"class":183},[177,314,315],{"class":206},"STAND",[177,317,197],{"class":183},[177,319,212],{"class":183},[177,321,323,325,328,330,332,334,337,339],{"class":179,"line":322},8,[177,324,190],{"class":183},[177,326,327],{"class":193},"email",[177,329,197],{"class":183},[177,331,200],{"class":183},[177,333,203],{"class":183},[177,335,336],{"class":206},"0160000000@spearnet.mil",[177,338,197],{"class":183},[177,340,212],{"class":183},[177,342,344,346,349,351,353,355,358,360],{"class":179,"line":343},9,[177,345,190],{"class":183},[177,347,348],{"class":193},"phone_number",[177,350,197],{"class":183},[177,352,200],{"class":183},[177,354,203],{"class":183},[177,356,357],{"class":206},"0160000000",[177,359,197],{"class":183},[177,361,212],{"class":183},[177,363,365,367,370,372,374,376,379,381],{"class":179,"line":364},10,[177,366,190],{"class":183},[177,368,369],{"class":193},"state",[177,371,197],{"class":183},[177,373,200],{"class":183},[177,375,203],{"class":183},[177,377,378],{"class":206},"HEALTHY",[177,380,197],{"class":183},[177,382,212],{"class":183},[177,384,386,388,391,393,395],{"class":179,"line":385},11,[177,387,190],{"class":183},[177,389,390],{"class":193},"holster",[177,392,197],{"class":183},[177,394,200],{"class":183},[177,396,397],{"class":183}," true,\n",[177,399,401,403,406,408,410],{"class":179,"line":400},12,[177,402,190],{"class":183},[177,404,405],{"class":193},"rank",[177,407,197],{"class":183},[177,409,200],{"class":183},[177,411,412],{"class":183}," null,\n",[177,414,416,418,421,423,425,427,430],{"class":179,"line":415},13,[177,417,190],{"class":183},[177,419,420],{"class":193},"organization",[177,422,197],{"class":183},[177,424,200],{"class":183},[177,426,203],{"class":183},[177,428,429],{"class":206},"default",[177,431,432],{"class":183},"\"\n",[177,434,436],{"class":179,"line":435},14,[177,437,438],{"class":183},"}\n",[155,440,441],{},"Rules validated by the Rust service:",[443,444,445,451,456,461,470,483,492],"ul",{},[446,447,448,450],"li",{},[174,449,194],{}," is authoritative from the command argument and must be a 17-digit Steam\nUID.",[446,452,453,455],{},[174,454,220],{}," is optional, but cannot be empty when set and cannot exceed 50\ncharacters.",[446,457,458,460],{},[174,459,256],{}," must be three finite numbers when set.",[446,462,463,465,466,469],{},[174,464,289],{}," must be in the ",[174,467,468],{},"0.0 \u003C= direction \u003C 360.0"," range.",[446,471,472,474,475,478,479,482],{},[174,473,327],{}," must contain ",[174,476,477],{},"@"," and end with ",[174,480,481],{},".mil"," when set.",[446,484,485,487,488,491],{},[174,486,348],{}," must start with ",[174,489,490],{},"0160"," and be 10 digits when set.",[446,493,494,495,497,498,500,501,503],{},"Empty ",[174,496,348],{},", ",[174,499,327],{},", or ",[174,502,420],{}," fields are filled on create.",[159,505,507],{"id":506},"commands","Commands",[155,509,510,511,514],{},"All commands are called on the ",[174,512,513],{},"actor"," group.",[516,517,518,534],"table",{},[519,520,521],"thead",{},[522,523,524,528,531],"tr",{},[525,526,527],"th",{},"Command",[525,529,530],{},"Arguments",[525,532,533],{},"Returns",[535,536,537,552,569,586,607],"tbody",{},[522,538,539,545,549],{},[540,541,542],"td",{},[174,543,544],{},"actor:get",[540,546,547],{},[174,548,194],{},[540,550,551],{},"Actor JSON. If no actor exists, returns a default actor but does not persist it.",[522,553,554,559,566],{},[540,555,556],{},[174,557,558],{},"actor:create",[540,560,561,497,563],{},[174,562,194],{},[174,564,565],{},"actor_json",[540,567,568],{},"Persisted actor JSON.",[522,570,571,576,583],{},[540,572,573],{},[174,574,575],{},"actor:update",[540,577,578,497,580],{},[174,579,194],{},[174,581,582],{},"patch_json",[540,584,585],{},"Updated actor JSON.",[522,587,588,593,597],{},[540,589,590],{},[174,591,592],{},"actor:exists",[540,594,595],{},[174,596,194],{},[540,598,599,602,603,606],{},[174,600,601],{},"true"," or ",[174,604,605],{},"false",".",[522,608,609,614,618],{},[540,610,611],{},[174,612,613],{},"actor:delete",[540,615,616],{},[174,617,194],{},[540,619,620,606],{},[174,621,622],{},"OK",[159,624,626],{"id":625},"create-an-actor","Create an Actor",[155,628,629,630,632],{},"The ",[174,631,194],{}," field in the JSON is overwritten with the command UID.",[167,634,638],{"className":635,"code":636,"language":637,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _actor = createHashMapFromArray [\n [\"uid\", getPlayerUID player],\n [\"name\", name player],\n [\"loadout\", getUnitLoadout player],\n [\"position\", getPosATL player],\n [\"direction\", getDir player],\n [\"stance\", stance player],\n [\"email\", \"\"],\n [\"phone_number\", \"\"],\n [\"state\", \"HEALTHY\"],\n [\"holster\", true],\n [\"organization\", \"default\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"actor:create\", [\n getPlayerUID player,\n toJSON _actor\n]];\n","sqf",[174,639,640,645,650,655,660,665,670,675,680,685,690,695,700,705,711,717,723,729],{"__ignoreMap":172},[177,641,642],{"class":179,"line":180},[177,643,644],{},"private _actor = createHashMapFromArray [\n",[177,646,647],{"class":179,"line":187},[177,648,649],{}," [\"uid\", getPlayerUID player],\n",[177,651,652],{"class":179,"line":215},[177,653,654],{}," [\"name\", name player],\n",[177,656,657],{"class":179,"line":236},[177,658,659],{}," [\"loadout\", getUnitLoadout player],\n",[177,661,662],{"class":179,"line":251},[177,663,664],{}," [\"position\", getPosATL player],\n",[177,666,667],{"class":179,"line":284},[177,668,669],{}," [\"direction\", getDir player],\n",[177,671,672],{"class":179,"line":301},[177,673,674],{}," [\"stance\", stance player],\n",[177,676,677],{"class":179,"line":322},[177,678,679],{}," [\"email\", \"\"],\n",[177,681,682],{"class":179,"line":343},[177,683,684],{}," [\"phone_number\", \"\"],\n",[177,686,687],{"class":179,"line":364},[177,688,689],{}," [\"state\", \"HEALTHY\"],\n",[177,691,692],{"class":179,"line":385},[177,693,694],{}," [\"holster\", true],\n",[177,696,697],{"class":179,"line":400},[177,698,699],{}," [\"organization\", \"default\"]\n",[177,701,702],{"class":179,"line":415},[177,703,704],{},"];\n",[177,706,707],{"class":179,"line":435},[177,708,710],{"emptyLinePlaceholder":709},true,"\n",[177,712,714],{"class":179,"line":713},15,[177,715,716],{},"private _result = \"forge_server\" callExtension [\"actor:create\", [\n",[177,718,720],{"class":179,"line":719},16,[177,721,722],{}," getPlayerUID player,\n",[177,724,726],{"class":179,"line":725},17,[177,727,728],{}," toJSON _actor\n",[177,730,732],{"class":179,"line":731},18,[177,733,734],{},"]];\n",[159,736,738],{"id":737},"update-an-actor","Update an Actor",[155,740,741,743],{},[174,742,575],{}," accepts a JSON object containing only fields to change.",[167,745,747],{"className":635,"code":746,"language":637,"meta":172,"style":172},"private _patch = createHashMapFromArray [\n [\"position\", getPosATL player],\n [\"direction\", getDir player],\n [\"stance\", stance player],\n [\"loadout\", getUnitLoadout player]\n];\n\nprivate _result = \"forge_server\" callExtension [\"actor:update\", [\n getPlayerUID player,\n toJSON _patch\n]];\n",[174,748,749,754,758,762,766,771,775,779,784,788,793],{"__ignoreMap":172},[177,750,751],{"class":179,"line":180},[177,752,753],{},"private _patch = createHashMapFromArray [\n",[177,755,756],{"class":179,"line":187},[177,757,664],{},[177,759,760],{"class":179,"line":215},[177,761,669],{},[177,763,764],{"class":179,"line":236},[177,765,674],{},[177,767,768],{"class":179,"line":251},[177,769,770],{}," [\"loadout\", getUnitLoadout player]\n",[177,772,773],{"class":179,"line":284},[177,774,704],{},[177,776,777],{"class":179,"line":301},[177,778,710],{"emptyLinePlaceholder":709},[177,780,781],{"class":179,"line":322},[177,782,783],{},"private _result = \"forge_server\" callExtension [\"actor:update\", [\n",[177,785,786],{"class":179,"line":343},[177,787,722],{},[177,789,790],{"class":179,"line":364},[177,791,792],{}," toJSON _patch\n",[177,794,795],{"class":179,"line":385},[177,796,734],{},[155,798,799,800,497,802,497,804,497,806,497,808,212,810,497,812,497,814,497,816,497,818,820,821,823,824,826],{},"Supported patch fields are ",[174,801,220],{},[174,803,256],{},[174,805,289],{},[174,807,306],{},[174,809,327],{},[174,811,348],{},[174,813,369],{},[174,815,390],{},[174,817,405],{},[174,819,420],{},", and ",[174,822,241],{},".\n",[174,825,194],{}," is ignored.",[159,828,830],{"id":829},"hot-state","Hot State",[155,832,629,833,836,837,840],{},[174,834,835],{},"actor:hot:*"," commands keep a runtime copy of actor data and write it back\nonly when ",[174,838,839],{},"actor:hot:save"," runs.",[516,842,843,853],{},[519,844,845],{},[522,846,847,849,851],{},[525,848,527],{},[525,850,530],{},[525,852,533],{},[535,854,855,869,883,896,911,924],{},[522,856,857,862,866],{},[540,858,859],{},[174,860,861],{},"actor:hot:init",[540,863,864],{},[174,865,194],{},[540,867,868],{},"Actor JSON from durable storage.",[522,870,871,876,880],{},[540,872,873],{},[174,874,875],{},"actor:hot:get",[540,877,878],{},[174,879,194],{},[540,881,882],{},"Actor JSON.",[522,884,885,890,893],{},[540,886,887],{},[174,888,889],{},"actor:hot:keys",[540,891,892],{},"none",[540,894,895],{},"JSON array of hot actor UIDs.",[522,897,898,903,909],{},[540,899,900],{},[174,901,902],{},"actor:hot:override",[540,904,905,497,907],{},[174,906,194],{},[174,908,565],{},[540,910,882],{},[522,912,913,917,921],{},[540,914,915],{},[174,916,839],{},[540,918,919],{},[174,920,194],{},[540,922,923],{},"Current hot actor JSON and async durable save.",[522,925,926,931,935],{},[540,927,928],{},[174,929,930],{},"actor:hot:remove",[540,932,933],{},[174,934,194],{},[540,936,937,606],{},[174,938,622],{},[155,940,941],{},"Use hot state for frequently updated session data such as position and loadout.\nUse durable commands for account creation and administrative changes.",[159,943,945],{"id":944},"error-handling","Error Handling",[167,947,949],{"className":635,"code":948,"language":637,"meta":172,"style":172},"private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Actor error: %1\", _payload];\n};\n\nprivate _actor = fromJSON _payload;\n",[174,950,951,956,961,965,970,975,980,984],{"__ignoreMap":172},[177,952,953],{"class":179,"line":180},[177,954,955],{},"private _result = \"forge_server\" callExtension [\"actor:get\", [getPlayerUID player]];\n",[177,957,958],{"class":179,"line":187},[177,959,960],{},"private _payload = _result select 0;\n",[177,962,963],{"class":179,"line":215},[177,964,710],{"emptyLinePlaceholder":709},[177,966,967],{"class":179,"line":236},[177,968,969],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,971,972],{"class":179,"line":251},[177,973,974],{}," systemChat format [\"Actor error: %1\", _payload];\n",[177,976,977],{"class":179,"line":284},[177,978,979],{},"};\n",[177,981,982],{"class":179,"line":301},[177,983,710],{"emptyLinePlaceholder":709},[177,985,986],{"class":179,"line":322},[177,987,988],{},"private _actor = fromJSON _payload;\n",[990,991,992],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":994},[995,996,997,998,999,1000],{"id":161,"depth":187,"text":162},{"id":506,"depth":187,"text":507},{"id":625,"depth":187,"text":626},{"id":737,"depth":187,"text":738},{"id":829,"depth":187,"text":830},{"id":944,"depth":187,"text":945},"md",null,{},{"title":49,"description":157},"lOr0hGaOrJo611Lgdf6VCoSehV0NudH7u2_V75BKoZ0",[1007,1009],{"title":47,"path":43,"stem":44,"description":1008,"children":-1},"These pages document the authoritative server-side workflows in Forge.",{"title":53,"path":54,"stem":55,"description":1010,"children":-1},"The store module processes checkout requests. It charges a payment source and\ngrants purchased items to the player locker, virtual arsenal locker, and\nvirtual garage unlocks.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/bank.html b/docus/dist/server-modules/bank.html index 542196a..cd96e91 100644 --- a/docus/dist/server-modules/bank.html +++ b/docus/dist/server-modules/bank.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Bank Usage Guide - forge-docus

    CAD Usage Guide

    The CAD module stores transient operational state for dispatch activity, assignments, dispatch orders, support requests, group profiles, grouped views, and hydrated UI payloads. CAD state is in-memory and follows the active server -or mission lifecycle.

    \ No newline at end of file +or mission lifecycle.

    \ No newline at end of file diff --git a/docus/dist/server-modules/bank/_payload.json b/docus/dist/server-modules/bank/_payload.json index f78b98e..2c301c0 100644 --- a/docus/dist/server-modules/bank/_payload.json +++ b/docus/dist/server-modules/bank/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1149},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-bank":145,"-server-modules-bank-surround":1144},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":61,"body":147,"description":157,"extension":1139,"links":1140,"meta":1141,"navigation":540,"path":62,"seo":1142,"stem":63,"__hash__":1143},"docs\u002F3.server-modules\u002F2.bank.md",{"type":148,"value":149,"toc":1128},"minimark",[150,154,158,163,166,324,327,361,365,473,477,483,566,570,794,797,801,811,890,894,905,964,968,985,1034,1038,1041,1077,1081,1124],[151,152,61],"h1",{"id":153},"bank-usage-guide",[155,156,157],"p",{},"The bank module stores player account balances, earnings, PINs, and transaction\nstrings. The hot-state API also owns the active banking workflows used by the\nUI: deposit, withdraw, transfer, checkout charge, and PIN validation.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Bank data is persisted through SurrealDB by the server extension.",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"uid\": \"76561198000000000\",\n \"name\": \"Player Name\",\n \"bank\": 1000.0,\n \"cash\": 250.0,\n \"earnings\": 0.0,\n \"pin\": 1234,\n \"transactions\": []\n}\n","json","",[174,175,176,185,213,234,252,269,286,303,318],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201,204,208,210],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","uid",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," \"",[177,205,207],{"class":206},"sfazB","76561198000000000",[177,209,197],{"class":183},[177,211,212],{"class":183},",\n",[177,214,216,218,221,223,225,227,230,232],{"class":179,"line":215},3,[177,217,190],{"class":183},[177,219,220],{"class":193},"name",[177,222,197],{"class":183},[177,224,200],{"class":183},[177,226,203],{"class":183},[177,228,229],{"class":206},"Player Name",[177,231,197],{"class":183},[177,233,212],{"class":183},[177,235,237,239,242,244,246,250],{"class":179,"line":236},4,[177,238,190],{"class":183},[177,240,241],{"class":193},"bank",[177,243,197],{"class":183},[177,245,200],{"class":183},[177,247,249],{"class":248},"sbssI"," 1000.0",[177,251,212],{"class":183},[177,253,255,257,260,262,264,267],{"class":179,"line":254},5,[177,256,190],{"class":183},[177,258,259],{"class":193},"cash",[177,261,197],{"class":183},[177,263,200],{"class":183},[177,265,266],{"class":248}," 250.0",[177,268,212],{"class":183},[177,270,272,274,277,279,281,284],{"class":179,"line":271},6,[177,273,190],{"class":183},[177,275,276],{"class":193},"earnings",[177,278,197],{"class":183},[177,280,200],{"class":183},[177,282,283],{"class":248}," 0.0",[177,285,212],{"class":183},[177,287,289,291,294,296,298,301],{"class":179,"line":288},7,[177,290,190],{"class":183},[177,292,293],{"class":193},"pin",[177,295,197],{"class":183},[177,297,200],{"class":183},[177,299,300],{"class":248}," 1234",[177,302,212],{"class":183},[177,304,306,308,311,313,315],{"class":179,"line":305},8,[177,307,190],{"class":183},[177,309,310],{"class":193},"transactions",[177,312,197],{"class":183},[177,314,200],{"class":183},[177,316,317],{"class":183}," []\n",[177,319,321],{"class":179,"line":320},9,[177,322,323],{"class":183},"}\n",[155,325,326],{},"Rules validated by the Rust service:",[328,329,330,336,341,349,354],"ul",{},[331,332,333,335],"li",{},[174,334,194],{}," is authoritative from the command argument.",[331,337,338,340],{},[174,339,220],{}," cannot be empty.",[331,342,343,345,346,348],{},[174,344,241],{}," and ",[174,347,259],{}," cannot be negative.",[331,350,351,353],{},[174,352,293],{}," must be a four-digit number.",[331,355,356,357,360],{},"Durable ",[174,358,359],{},"bank:get"," requires an existing bank account.",[159,362,364],{"id":363},"durable-commands","Durable Commands",[366,367,368,384],"table",{},[369,370,371],"thead",{},[372,373,374,378,381],"tr",{},[375,376,377],"th",{},"Command",[375,379,380],{},"Arguments",[375,382,383],{},"Returns",[385,386,387,406,419,436,457],"tbody",{},[372,388,389,395,403],{},[390,391,392],"td",{},[174,393,394],{},"bank:create",[390,396,397,399,400],{},[174,398,194],{},", ",[174,401,402],{},"bank_json",[390,404,405],{},"Persisted bank JSON.",[372,407,408,412,416],{},[390,409,410],{},[174,411,359],{},[390,413,414],{},[174,415,194],{},[390,417,418],{},"Bank JSON.",[372,420,421,426,433],{},[390,422,423],{},[174,424,425],{},"bank:update",[390,427,428,399,430],{},[174,429,194],{},[174,431,432],{},"patch_json",[390,434,435],{},"Updated bank JSON.",[372,437,438,443,447],{},[390,439,440],{},[174,441,442],{},"bank:exists",[390,444,445],{},[174,446,194],{},[390,448,449,452,453,456],{},[174,450,451],{},"true"," or ",[174,454,455],{},"false",".",[372,458,459,464,468],{},[390,460,461],{},[174,462,463],{},"bank:delete",[390,465,466],{},[174,467,194],{},[390,469,470,456],{},[174,471,472],{},"OK",[159,474,476],{"id":475},"create-an-account","Create an Account",[155,478,479,480,482],{},"The ",[174,481,194],{}," field in the JSON is overwritten with the command UID.",[167,484,488],{"className":485,"code":486,"language":487,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _account = createHashMapFromArray [\n [\"uid\", getPlayerUID player],\n [\"name\", name player],\n [\"bank\", 0],\n [\"cash\", 0],\n [\"earnings\", 0],\n [\"pin\", 1234],\n [\"transactions\", []]\n];\n\nprivate _result = \"forge_server\" callExtension [\"bank:create\", [\n getPlayerUID player,\n toJSON _account\n]];\n","sqf",[174,489,490,495,500,505,510,515,520,525,530,535,542,548,554,560],{"__ignoreMap":172},[177,491,492],{"class":179,"line":180},[177,493,494],{},"private _account = createHashMapFromArray [\n",[177,496,497],{"class":179,"line":187},[177,498,499],{}," [\"uid\", getPlayerUID player],\n",[177,501,502],{"class":179,"line":215},[177,503,504],{}," [\"name\", name player],\n",[177,506,507],{"class":179,"line":236},[177,508,509],{}," [\"bank\", 0],\n",[177,511,512],{"class":179,"line":254},[177,513,514],{}," [\"cash\", 0],\n",[177,516,517],{"class":179,"line":271},[177,518,519],{}," [\"earnings\", 0],\n",[177,521,522],{"class":179,"line":288},[177,523,524],{}," [\"pin\", 1234],\n",[177,526,527],{"class":179,"line":305},[177,528,529],{}," [\"transactions\", []]\n",[177,531,532],{"class":179,"line":320},[177,533,534],{},"];\n",[177,536,538],{"class":179,"line":537},10,[177,539,541],{"emptyLinePlaceholder":540},true,"\n",[177,543,545],{"class":179,"line":544},11,[177,546,547],{},"private _result = \"forge_server\" callExtension [\"bank:create\", [\n",[177,549,551],{"class":179,"line":550},12,[177,552,553],{}," getPlayerUID player,\n",[177,555,557],{"class":179,"line":556},13,[177,558,559],{}," toJSON _account\n",[177,561,563],{"class":179,"line":562},14,[177,564,565],{},"]];\n",[159,567,569],{"id":568},"hot-state-commands","Hot-State Commands",[366,571,572,582],{},[369,573,574],{},[372,575,576,578,580],{},[375,577,377],{},[375,579,380],{},[375,581,383],{},[385,583,584,598,611,626,644,665,684,703,725,744,765,779],{},[372,585,586,591,595],{},[390,587,588],{},[174,589,590],{},"bank:hot:init",[390,592,593],{},[174,594,194],{},[390,596,597],{},"Bank JSON loaded into hot state.",[372,599,600,605,609],{},[390,601,602],{},[174,603,604],{},"bank:hot:get",[390,606,607],{},[174,608,194],{},[390,610,418],{},[372,612,613,618,624],{},[390,614,615],{},[174,616,617],{},"bank:hot:override",[390,619,620,399,622],{},[174,621,194],{},[174,623,402],{},[390,625,418],{},[372,627,628,633,639],{},[390,629,630],{},[174,631,632],{},"bank:hot:patch",[390,634,635,399,637],{},[174,636,194],{},[174,638,432],{},[390,640,641,456],{},[174,642,643],{},"{ account, patch }",[372,645,646,651,661],{},[390,647,648],{},[174,649,650],{},"bank:hot:deposit",[390,652,653,399,655,399,658],{},[174,654,194],{},[174,656,657],{},"amount",[174,659,660],{},"context_json",[390,662,663,456],{},[174,664,643],{},[372,666,667,672,680],{},[390,668,669],{},[174,670,671],{},"bank:hot:withdraw",[390,673,674,399,676,399,678],{},[174,675,194],{},[174,677,657],{},[174,679,660],{},[390,681,682,456],{},[174,683,643],{},[372,685,686,691,699],{},[390,687,688],{},[174,689,690],{},"bank:hot:deposit_earnings",[390,692,693,399,695,399,697],{},[174,694,194],{},[174,696,657],{},[174,698,660],{},[390,700,701,456],{},[174,702,643],{},[372,704,705,710,722],{},[390,706,707],{},[174,708,709],{},"bank:hot:transfer",[390,711,712,399,715,399,718,399,720],{},[174,713,714],{},"source_uid",[174,716,717],{},"target_uid",[174,719,657],{},[174,721,660],{},[390,723,724],{},"Transfer result JSON.",[372,726,727,732,740],{},[390,728,729],{},[174,730,731],{},"bank:hot:charge_checkout",[390,733,734,399,736,399,738],{},[174,735,194],{},[174,737,657],{},[174,739,660],{},[390,741,742,456],{},[174,743,643],{},[372,745,746,751,759],{},[390,747,748],{},[174,749,750],{},"bank:hot:validate_pin",[390,752,753,399,755,399,757],{},[174,754,194],{},[174,756,293],{},[174,758,660],{},[390,760,761,764],{},[174,762,763],{},"{}"," on success.",[372,766,767,772,776],{},[390,768,769],{},[174,770,771],{},"bank:hot:save",[390,773,774],{},[174,775,194],{},[390,777,778],{},"Current hot bank JSON and async durable save.",[372,780,781,786,790],{},[390,782,783],{},[174,784,785],{},"bank:hot:remove",[390,787,788],{},[174,789,194],{},[390,791,792,456],{},[174,793,472],{},[155,795,796],{},"Use hot-state commands for UI workflows. They return patch objects so the UI can\nupdate only changed fields.",[159,798,800],{"id":799},"deposit-and-withdraw","Deposit and Withdraw",[155,802,803,804,807,808,456],{},"ATM sessions require ",[174,805,806],{},"atmAuthorized: true",". Full bank sessions can set\n",[174,809,810],{},"mode: \"bank\"",[167,812,814],{"className":485,"code":813,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"mode\", \"atm\"],\n [\"atmAuthorized\", true]\n];\n\nprivate _deposit = \"forge_server\" callExtension [\"bank:hot:deposit\", [\n getPlayerUID player,\n \"100\",\n toJSON _context\n]];\n\nprivate _withdraw = \"forge_server\" callExtension [\"bank:hot:withdraw\", [\n getPlayerUID player,\n \"50\",\n toJSON _context\n]];\n",[174,815,816,821,826,831,835,839,844,848,853,858,862,866,871,875,880,885],{"__ignoreMap":172},[177,817,818],{"class":179,"line":180},[177,819,820],{},"private _context = createHashMapFromArray [\n",[177,822,823],{"class":179,"line":187},[177,824,825],{}," [\"mode\", \"atm\"],\n",[177,827,828],{"class":179,"line":215},[177,829,830],{}," [\"atmAuthorized\", true]\n",[177,832,833],{"class":179,"line":236},[177,834,534],{},[177,836,837],{"class":179,"line":254},[177,838,541],{"emptyLinePlaceholder":540},[177,840,841],{"class":179,"line":271},[177,842,843],{},"private _deposit = \"forge_server\" callExtension [\"bank:hot:deposit\", [\n",[177,845,846],{"class":179,"line":288},[177,847,553],{},[177,849,850],{"class":179,"line":305},[177,851,852],{}," \"100\",\n",[177,854,855],{"class":179,"line":320},[177,856,857],{}," toJSON _context\n",[177,859,860],{"class":179,"line":537},[177,861,565],{},[177,863,864],{"class":179,"line":544},[177,865,541],{"emptyLinePlaceholder":540},[177,867,868],{"class":179,"line":550},[177,869,870],{},"private _withdraw = \"forge_server\" callExtension [\"bank:hot:withdraw\", [\n",[177,872,873],{"class":179,"line":556},[177,874,553],{},[177,876,877],{"class":179,"line":562},[177,878,879],{}," \"50\",\n",[177,881,883],{"class":179,"line":882},15,[177,884,857],{},[177,886,888],{"class":179,"line":887},16,[177,889,565],{},[159,891,893],{"id":892},"transfer","Transfer",[155,895,896,897,900,901,452,903,456],{},"Transfers are only available from the full bank interface. ",[174,898,899],{},"fromField"," can be\n",[174,902,241],{},[174,904,259],{},[167,906,908],{"className":485,"code":907,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"mode\", \"bank\"],\n [\"atmAuthorized\", false],\n [\"fromField\", \"bank\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"bank:hot:transfer\", [\n getPlayerUID player,\n _targetUid,\n \"250\",\n toJSON _context\n]];\n",[174,909,910,914,919,924,929,933,937,942,946,951,956,960],{"__ignoreMap":172},[177,911,912],{"class":179,"line":180},[177,913,820],{},[177,915,916],{"class":179,"line":187},[177,917,918],{}," [\"mode\", \"bank\"],\n",[177,920,921],{"class":179,"line":215},[177,922,923],{}," [\"atmAuthorized\", false],\n",[177,925,926],{"class":179,"line":236},[177,927,928],{}," [\"fromField\", \"bank\"]\n",[177,930,931],{"class":179,"line":254},[177,932,534],{},[177,934,935],{"class":179,"line":271},[177,936,541],{"emptyLinePlaceholder":540},[177,938,939],{"class":179,"line":288},[177,940,941],{},"private _result = \"forge_server\" callExtension [\"bank:hot:transfer\", [\n",[177,943,944],{"class":179,"line":305},[177,945,553],{},[177,947,948],{"class":179,"line":320},[177,949,950],{}," _targetUid,\n",[177,952,953],{"class":179,"line":537},[177,954,955],{}," \"250\",\n",[177,957,958],{"class":179,"line":544},[177,959,857],{},[177,961,962],{"class":179,"line":550},[177,963,565],{},[159,965,967],{"id":966},"checkout-charge","Checkout Charge",[155,969,970,971,452,974,977,978,981,982,984],{},"Checkout charging supports ",[174,972,973],{},"sourceField: \"cash\"",[174,975,976],{},"sourceField: \"bank\"",".\nSet ",[174,979,980],{},"commit"," to ",[174,983,455],{}," to preview the patch without saving.",[167,986,988],{"className":485,"code":987,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"sourceField\", \"bank\"],\n [\"commit\", true]\n];\n\nprivate _result = \"forge_server\" callExtension [\"bank:hot:charge_checkout\", [\n getPlayerUID player,\n \"125\",\n toJSON _context\n]];\n",[174,989,990,994,999,1004,1008,1012,1017,1021,1026,1030],{"__ignoreMap":172},[177,991,992],{"class":179,"line":180},[177,993,820],{},[177,995,996],{"class":179,"line":187},[177,997,998],{}," [\"sourceField\", \"bank\"],\n",[177,1000,1001],{"class":179,"line":215},[177,1002,1003],{}," [\"commit\", true]\n",[177,1005,1006],{"class":179,"line":236},[177,1007,534],{},[177,1009,1010],{"class":179,"line":254},[177,1011,541],{"emptyLinePlaceholder":540},[177,1013,1014],{"class":179,"line":271},[177,1015,1016],{},"private _result = \"forge_server\" callExtension [\"bank:hot:charge_checkout\", [\n",[177,1018,1019],{"class":179,"line":288},[177,1020,553],{},[177,1022,1023],{"class":179,"line":305},[177,1024,1025],{}," \"125\",\n",[177,1027,1028],{"class":179,"line":320},[177,1029,857],{},[177,1031,1032],{"class":179,"line":537},[177,1033,565],{},[159,1035,1037],{"id":1036},"pin-validation","PIN Validation",[155,1039,1040],{},"PIN entry is only valid in ATM mode.",[167,1042,1044],{"className":485,"code":1043,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [[\"mode\", \"atm\"]];\n\nprivate _result = \"forge_server\" callExtension [\"bank:hot:validate_pin\", [\n getPlayerUID player,\n \"1234\",\n toJSON _context\n]];\n",[174,1045,1046,1051,1055,1060,1064,1069,1073],{"__ignoreMap":172},[177,1047,1048],{"class":179,"line":180},[177,1049,1050],{},"private _context = createHashMapFromArray [[\"mode\", \"atm\"]];\n",[177,1052,1053],{"class":179,"line":187},[177,1054,541],{"emptyLinePlaceholder":540},[177,1056,1057],{"class":179,"line":215},[177,1058,1059],{},"private _result = \"forge_server\" callExtension [\"bank:hot:validate_pin\", [\n",[177,1061,1062],{"class":179,"line":236},[177,1063,553],{},[177,1065,1066],{"class":179,"line":254},[177,1067,1068],{}," \"1234\",\n",[177,1070,1071],{"class":179,"line":271},[177,1072,857],{},[177,1074,1075],{"class":179,"line":288},[177,1076,565],{},[159,1078,1080],{"id":1079},"error-handling","Error Handling",[167,1082,1084],{"className":485,"code":1083,"language":487,"meta":172,"style":172},"private _result = \"forge_server\" callExtension [\"bank:hot:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Bank error: %1\", _payload];\n};\n\nprivate _bank = fromJSON _payload;\n",[174,1085,1086,1091,1096,1100,1105,1110,1115,1119],{"__ignoreMap":172},[177,1087,1088],{"class":179,"line":180},[177,1089,1090],{},"private _result = \"forge_server\" callExtension [\"bank:hot:get\", [getPlayerUID player]];\n",[177,1092,1093],{"class":179,"line":187},[177,1094,1095],{},"private _payload = _result select 0;\n",[177,1097,1098],{"class":179,"line":215},[177,1099,541],{"emptyLinePlaceholder":540},[177,1101,1102],{"class":179,"line":236},[177,1103,1104],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,1106,1107],{"class":179,"line":254},[177,1108,1109],{}," systemChat format [\"Bank error: %1\", _payload];\n",[177,1111,1112],{"class":179,"line":271},[177,1113,1114],{},"};\n",[177,1116,1117],{"class":179,"line":288},[177,1118,541],{"emptyLinePlaceholder":540},[177,1120,1121],{"class":179,"line":305},[177,1122,1123],{},"private _bank = fromJSON _payload;\n",[1125,1126,1127],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":1129},[1130,1131,1132,1133,1134,1135,1136,1137,1138],{"id":161,"depth":187,"text":162},{"id":363,"depth":187,"text":364},{"id":475,"depth":187,"text":476},{"id":568,"depth":187,"text":569},{"id":799,"depth":187,"text":800},{"id":892,"depth":187,"text":893},{"id":966,"depth":187,"text":967},{"id":1036,"depth":187,"text":1037},{"id":1079,"depth":187,"text":1080},"md",null,{},{"title":61,"description":157},"sIOXEyzlGQFhd8qUZozTWTtuL76YtpRKFT959rOS7FM",[1145,1147],{"title":57,"path":58,"stem":59,"description":1146,"children":-1},"The task module stores transient mission task metadata for active server or\nmission lifecycle workflows. SQF still owns Arma-only runtime state such as\nobjects and participants.",{"title":65,"path":66,"stem":67,"description":1148,"children":-1},"The CAD module stores transient operational state for dispatch activity,\nassignments, dispatch orders, support requests, group profiles, grouped views,\nand hydrated UI payloads. CAD state is in-memory and follows the active server\nor mission lifecycle.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1149},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-bank":145,"-server-modules-bank-surround":1144},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":61,"body":147,"description":157,"extension":1139,"links":1140,"meta":1141,"navigation":540,"path":62,"seo":1142,"stem":63,"__hash__":1143},"docs\u002F3.server-modules\u002F2.bank.md",{"type":148,"value":149,"toc":1128},"minimark",[150,154,158,163,166,324,327,361,365,473,477,483,566,570,794,797,801,811,890,894,905,964,968,985,1034,1038,1041,1077,1081,1124],[151,152,61],"h1",{"id":153},"bank-usage-guide",[155,156,157],"p",{},"The bank module stores player account balances, earnings, PINs, and transaction\nstrings. The hot-state API also owns the active banking workflows used by the\nUI: deposit, withdraw, transfer, checkout charge, and PIN validation.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Bank data is persisted through SurrealDB by the server extension.",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"uid\": \"76561198000000000\",\n \"name\": \"Player Name\",\n \"bank\": 1000.0,\n \"cash\": 250.0,\n \"earnings\": 0.0,\n \"pin\": 1234,\n \"transactions\": []\n}\n","json","",[174,175,176,185,213,234,252,269,286,303,318],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201,204,208,210],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","uid",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," \"",[177,205,207],{"class":206},"sfazB","76561198000000000",[177,209,197],{"class":183},[177,211,212],{"class":183},",\n",[177,214,216,218,221,223,225,227,230,232],{"class":179,"line":215},3,[177,217,190],{"class":183},[177,219,220],{"class":193},"name",[177,222,197],{"class":183},[177,224,200],{"class":183},[177,226,203],{"class":183},[177,228,229],{"class":206},"Player Name",[177,231,197],{"class":183},[177,233,212],{"class":183},[177,235,237,239,242,244,246,250],{"class":179,"line":236},4,[177,238,190],{"class":183},[177,240,241],{"class":193},"bank",[177,243,197],{"class":183},[177,245,200],{"class":183},[177,247,249],{"class":248},"sbssI"," 1000.0",[177,251,212],{"class":183},[177,253,255,257,260,262,264,267],{"class":179,"line":254},5,[177,256,190],{"class":183},[177,258,259],{"class":193},"cash",[177,261,197],{"class":183},[177,263,200],{"class":183},[177,265,266],{"class":248}," 250.0",[177,268,212],{"class":183},[177,270,272,274,277,279,281,284],{"class":179,"line":271},6,[177,273,190],{"class":183},[177,275,276],{"class":193},"earnings",[177,278,197],{"class":183},[177,280,200],{"class":183},[177,282,283],{"class":248}," 0.0",[177,285,212],{"class":183},[177,287,289,291,294,296,298,301],{"class":179,"line":288},7,[177,290,190],{"class":183},[177,292,293],{"class":193},"pin",[177,295,197],{"class":183},[177,297,200],{"class":183},[177,299,300],{"class":248}," 1234",[177,302,212],{"class":183},[177,304,306,308,311,313,315],{"class":179,"line":305},8,[177,307,190],{"class":183},[177,309,310],{"class":193},"transactions",[177,312,197],{"class":183},[177,314,200],{"class":183},[177,316,317],{"class":183}," []\n",[177,319,321],{"class":179,"line":320},9,[177,322,323],{"class":183},"}\n",[155,325,326],{},"Rules validated by the Rust service:",[328,329,330,336,341,349,354],"ul",{},[331,332,333,335],"li",{},[174,334,194],{}," is authoritative from the command argument.",[331,337,338,340],{},[174,339,220],{}," cannot be empty.",[331,342,343,345,346,348],{},[174,344,241],{}," and ",[174,347,259],{}," cannot be negative.",[331,350,351,353],{},[174,352,293],{}," must be a four-digit number.",[331,355,356,357,360],{},"Durable ",[174,358,359],{},"bank:get"," requires an existing bank account.",[159,362,364],{"id":363},"durable-commands","Durable Commands",[366,367,368,384],"table",{},[369,370,371],"thead",{},[372,373,374,378,381],"tr",{},[375,376,377],"th",{},"Command",[375,379,380],{},"Arguments",[375,382,383],{},"Returns",[385,386,387,406,419,436,457],"tbody",{},[372,388,389,395,403],{},[390,391,392],"td",{},[174,393,394],{},"bank:create",[390,396,397,399,400],{},[174,398,194],{},", ",[174,401,402],{},"bank_json",[390,404,405],{},"Persisted bank JSON.",[372,407,408,412,416],{},[390,409,410],{},[174,411,359],{},[390,413,414],{},[174,415,194],{},[390,417,418],{},"Bank JSON.",[372,420,421,426,433],{},[390,422,423],{},[174,424,425],{},"bank:update",[390,427,428,399,430],{},[174,429,194],{},[174,431,432],{},"patch_json",[390,434,435],{},"Updated bank JSON.",[372,437,438,443,447],{},[390,439,440],{},[174,441,442],{},"bank:exists",[390,444,445],{},[174,446,194],{},[390,448,449,452,453,456],{},[174,450,451],{},"true"," or ",[174,454,455],{},"false",".",[372,458,459,464,468],{},[390,460,461],{},[174,462,463],{},"bank:delete",[390,465,466],{},[174,467,194],{},[390,469,470,456],{},[174,471,472],{},"OK",[159,474,476],{"id":475},"create-an-account","Create an Account",[155,478,479,480,482],{},"The ",[174,481,194],{}," field in the JSON is overwritten with the command UID.",[167,484,488],{"className":485,"code":486,"language":487,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _account = createHashMapFromArray [\n [\"uid\", getPlayerUID player],\n [\"name\", name player],\n [\"bank\", 0],\n [\"cash\", 0],\n [\"earnings\", 0],\n [\"pin\", 1234],\n [\"transactions\", []]\n];\n\nprivate _result = \"forge_server\" callExtension [\"bank:create\", [\n getPlayerUID player,\n toJSON _account\n]];\n","sqf",[174,489,490,495,500,505,510,515,520,525,530,535,542,548,554,560],{"__ignoreMap":172},[177,491,492],{"class":179,"line":180},[177,493,494],{},"private _account = createHashMapFromArray [\n",[177,496,497],{"class":179,"line":187},[177,498,499],{}," [\"uid\", getPlayerUID player],\n",[177,501,502],{"class":179,"line":215},[177,503,504],{}," [\"name\", name player],\n",[177,506,507],{"class":179,"line":236},[177,508,509],{}," [\"bank\", 0],\n",[177,511,512],{"class":179,"line":254},[177,513,514],{}," [\"cash\", 0],\n",[177,516,517],{"class":179,"line":271},[177,518,519],{}," [\"earnings\", 0],\n",[177,521,522],{"class":179,"line":288},[177,523,524],{}," [\"pin\", 1234],\n",[177,526,527],{"class":179,"line":305},[177,528,529],{}," [\"transactions\", []]\n",[177,531,532],{"class":179,"line":320},[177,533,534],{},"];\n",[177,536,538],{"class":179,"line":537},10,[177,539,541],{"emptyLinePlaceholder":540},true,"\n",[177,543,545],{"class":179,"line":544},11,[177,546,547],{},"private _result = \"forge_server\" callExtension [\"bank:create\", [\n",[177,549,551],{"class":179,"line":550},12,[177,552,553],{}," getPlayerUID player,\n",[177,555,557],{"class":179,"line":556},13,[177,558,559],{}," toJSON _account\n",[177,561,563],{"class":179,"line":562},14,[177,564,565],{},"]];\n",[159,567,569],{"id":568},"hot-state-commands","Hot-State Commands",[366,571,572,582],{},[369,573,574],{},[372,575,576,578,580],{},[375,577,377],{},[375,579,380],{},[375,581,383],{},[385,583,584,598,611,626,644,665,684,703,725,744,765,779],{},[372,585,586,591,595],{},[390,587,588],{},[174,589,590],{},"bank:hot:init",[390,592,593],{},[174,594,194],{},[390,596,597],{},"Bank JSON loaded into hot state.",[372,599,600,605,609],{},[390,601,602],{},[174,603,604],{},"bank:hot:get",[390,606,607],{},[174,608,194],{},[390,610,418],{},[372,612,613,618,624],{},[390,614,615],{},[174,616,617],{},"bank:hot:override",[390,619,620,399,622],{},[174,621,194],{},[174,623,402],{},[390,625,418],{},[372,627,628,633,639],{},[390,629,630],{},[174,631,632],{},"bank:hot:patch",[390,634,635,399,637],{},[174,636,194],{},[174,638,432],{},[390,640,641,456],{},[174,642,643],{},"{ account, patch }",[372,645,646,651,661],{},[390,647,648],{},[174,649,650],{},"bank:hot:deposit",[390,652,653,399,655,399,658],{},[174,654,194],{},[174,656,657],{},"amount",[174,659,660],{},"context_json",[390,662,663,456],{},[174,664,643],{},[372,666,667,672,680],{},[390,668,669],{},[174,670,671],{},"bank:hot:withdraw",[390,673,674,399,676,399,678],{},[174,675,194],{},[174,677,657],{},[174,679,660],{},[390,681,682,456],{},[174,683,643],{},[372,685,686,691,699],{},[390,687,688],{},[174,689,690],{},"bank:hot:deposit_earnings",[390,692,693,399,695,399,697],{},[174,694,194],{},[174,696,657],{},[174,698,660],{},[390,700,701,456],{},[174,702,643],{},[372,704,705,710,722],{},[390,706,707],{},[174,708,709],{},"bank:hot:transfer",[390,711,712,399,715,399,718,399,720],{},[174,713,714],{},"source_uid",[174,716,717],{},"target_uid",[174,719,657],{},[174,721,660],{},[390,723,724],{},"Transfer result JSON.",[372,726,727,732,740],{},[390,728,729],{},[174,730,731],{},"bank:hot:charge_checkout",[390,733,734,399,736,399,738],{},[174,735,194],{},[174,737,657],{},[174,739,660],{},[390,741,742,456],{},[174,743,643],{},[372,745,746,751,759],{},[390,747,748],{},[174,749,750],{},"bank:hot:validate_pin",[390,752,753,399,755,399,757],{},[174,754,194],{},[174,756,293],{},[174,758,660],{},[390,760,761,764],{},[174,762,763],{},"{}"," on success.",[372,766,767,772,776],{},[390,768,769],{},[174,770,771],{},"bank:hot:save",[390,773,774],{},[174,775,194],{},[390,777,778],{},"Current hot bank JSON and async durable save.",[372,780,781,786,790],{},[390,782,783],{},[174,784,785],{},"bank:hot:remove",[390,787,788],{},[174,789,194],{},[390,791,792,456],{},[174,793,472],{},[155,795,796],{},"Use hot-state commands for UI workflows. They return patch objects so the UI can\nupdate only changed fields.",[159,798,800],{"id":799},"deposit-and-withdraw","Deposit and Withdraw",[155,802,803,804,807,808,456],{},"ATM sessions require ",[174,805,806],{},"atmAuthorized: true",". Full bank sessions can set\n",[174,809,810],{},"mode: \"bank\"",[167,812,814],{"className":485,"code":813,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"mode\", \"atm\"],\n [\"atmAuthorized\", true]\n];\n\nprivate _deposit = \"forge_server\" callExtension [\"bank:hot:deposit\", [\n getPlayerUID player,\n \"100\",\n toJSON _context\n]];\n\nprivate _withdraw = \"forge_server\" callExtension [\"bank:hot:withdraw\", [\n getPlayerUID player,\n \"50\",\n toJSON _context\n]];\n",[174,815,816,821,826,831,835,839,844,848,853,858,862,866,871,875,880,885],{"__ignoreMap":172},[177,817,818],{"class":179,"line":180},[177,819,820],{},"private _context = createHashMapFromArray [\n",[177,822,823],{"class":179,"line":187},[177,824,825],{}," [\"mode\", \"atm\"],\n",[177,827,828],{"class":179,"line":215},[177,829,830],{}," [\"atmAuthorized\", true]\n",[177,832,833],{"class":179,"line":236},[177,834,534],{},[177,836,837],{"class":179,"line":254},[177,838,541],{"emptyLinePlaceholder":540},[177,840,841],{"class":179,"line":271},[177,842,843],{},"private _deposit = \"forge_server\" callExtension [\"bank:hot:deposit\", [\n",[177,845,846],{"class":179,"line":288},[177,847,553],{},[177,849,850],{"class":179,"line":305},[177,851,852],{}," \"100\",\n",[177,854,855],{"class":179,"line":320},[177,856,857],{}," toJSON _context\n",[177,859,860],{"class":179,"line":537},[177,861,565],{},[177,863,864],{"class":179,"line":544},[177,865,541],{"emptyLinePlaceholder":540},[177,867,868],{"class":179,"line":550},[177,869,870],{},"private _withdraw = \"forge_server\" callExtension [\"bank:hot:withdraw\", [\n",[177,872,873],{"class":179,"line":556},[177,874,553],{},[177,876,877],{"class":179,"line":562},[177,878,879],{}," \"50\",\n",[177,881,883],{"class":179,"line":882},15,[177,884,857],{},[177,886,888],{"class":179,"line":887},16,[177,889,565],{},[159,891,893],{"id":892},"transfer","Transfer",[155,895,896,897,900,901,452,903,456],{},"Transfers are only available from the full bank interface. ",[174,898,899],{},"fromField"," can be\n",[174,902,241],{},[174,904,259],{},[167,906,908],{"className":485,"code":907,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"mode\", \"bank\"],\n [\"atmAuthorized\", false],\n [\"fromField\", \"bank\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"bank:hot:transfer\", [\n getPlayerUID player,\n _targetUid,\n \"250\",\n toJSON _context\n]];\n",[174,909,910,914,919,924,929,933,937,942,946,951,956,960],{"__ignoreMap":172},[177,911,912],{"class":179,"line":180},[177,913,820],{},[177,915,916],{"class":179,"line":187},[177,917,918],{}," [\"mode\", \"bank\"],\n",[177,920,921],{"class":179,"line":215},[177,922,923],{}," [\"atmAuthorized\", false],\n",[177,925,926],{"class":179,"line":236},[177,927,928],{}," [\"fromField\", \"bank\"]\n",[177,930,931],{"class":179,"line":254},[177,932,534],{},[177,934,935],{"class":179,"line":271},[177,936,541],{"emptyLinePlaceholder":540},[177,938,939],{"class":179,"line":288},[177,940,941],{},"private _result = \"forge_server\" callExtension [\"bank:hot:transfer\", [\n",[177,943,944],{"class":179,"line":305},[177,945,553],{},[177,947,948],{"class":179,"line":320},[177,949,950],{}," _targetUid,\n",[177,952,953],{"class":179,"line":537},[177,954,955],{}," \"250\",\n",[177,957,958],{"class":179,"line":544},[177,959,857],{},[177,961,962],{"class":179,"line":550},[177,963,565],{},[159,965,967],{"id":966},"checkout-charge","Checkout Charge",[155,969,970,971,452,974,977,978,981,982,984],{},"Checkout charging supports ",[174,972,973],{},"sourceField: \"cash\"",[174,975,976],{},"sourceField: \"bank\"",".\nSet ",[174,979,980],{},"commit"," to ",[174,983,455],{}," to preview the patch without saving.",[167,986,988],{"className":485,"code":987,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"sourceField\", \"bank\"],\n [\"commit\", true]\n];\n\nprivate _result = \"forge_server\" callExtension [\"bank:hot:charge_checkout\", [\n getPlayerUID player,\n \"125\",\n toJSON _context\n]];\n",[174,989,990,994,999,1004,1008,1012,1017,1021,1026,1030],{"__ignoreMap":172},[177,991,992],{"class":179,"line":180},[177,993,820],{},[177,995,996],{"class":179,"line":187},[177,997,998],{}," [\"sourceField\", \"bank\"],\n",[177,1000,1001],{"class":179,"line":215},[177,1002,1003],{}," [\"commit\", true]\n",[177,1005,1006],{"class":179,"line":236},[177,1007,534],{},[177,1009,1010],{"class":179,"line":254},[177,1011,541],{"emptyLinePlaceholder":540},[177,1013,1014],{"class":179,"line":271},[177,1015,1016],{},"private _result = \"forge_server\" callExtension [\"bank:hot:charge_checkout\", [\n",[177,1018,1019],{"class":179,"line":288},[177,1020,553],{},[177,1022,1023],{"class":179,"line":305},[177,1024,1025],{}," \"125\",\n",[177,1027,1028],{"class":179,"line":320},[177,1029,857],{},[177,1031,1032],{"class":179,"line":537},[177,1033,565],{},[159,1035,1037],{"id":1036},"pin-validation","PIN Validation",[155,1039,1040],{},"PIN entry is only valid in ATM mode.",[167,1042,1044],{"className":485,"code":1043,"language":487,"meta":172,"style":172},"private _context = createHashMapFromArray [[\"mode\", \"atm\"]];\n\nprivate _result = \"forge_server\" callExtension [\"bank:hot:validate_pin\", [\n getPlayerUID player,\n \"1234\",\n toJSON _context\n]];\n",[174,1045,1046,1051,1055,1060,1064,1069,1073],{"__ignoreMap":172},[177,1047,1048],{"class":179,"line":180},[177,1049,1050],{},"private _context = createHashMapFromArray [[\"mode\", \"atm\"]];\n",[177,1052,1053],{"class":179,"line":187},[177,1054,541],{"emptyLinePlaceholder":540},[177,1056,1057],{"class":179,"line":215},[177,1058,1059],{},"private _result = \"forge_server\" callExtension [\"bank:hot:validate_pin\", [\n",[177,1061,1062],{"class":179,"line":236},[177,1063,553],{},[177,1065,1066],{"class":179,"line":254},[177,1067,1068],{}," \"1234\",\n",[177,1070,1071],{"class":179,"line":271},[177,1072,857],{},[177,1074,1075],{"class":179,"line":288},[177,1076,565],{},[159,1078,1080],{"id":1079},"error-handling","Error Handling",[167,1082,1084],{"className":485,"code":1083,"language":487,"meta":172,"style":172},"private _result = \"forge_server\" callExtension [\"bank:hot:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Bank error: %1\", _payload];\n};\n\nprivate _bank = fromJSON _payload;\n",[174,1085,1086,1091,1096,1100,1105,1110,1115,1119],{"__ignoreMap":172},[177,1087,1088],{"class":179,"line":180},[177,1089,1090],{},"private _result = \"forge_server\" callExtension [\"bank:hot:get\", [getPlayerUID player]];\n",[177,1092,1093],{"class":179,"line":187},[177,1094,1095],{},"private _payload = _result select 0;\n",[177,1097,1098],{"class":179,"line":215},[177,1099,541],{"emptyLinePlaceholder":540},[177,1101,1102],{"class":179,"line":236},[177,1103,1104],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,1106,1107],{"class":179,"line":254},[177,1108,1109],{}," systemChat format [\"Bank error: %1\", _payload];\n",[177,1111,1112],{"class":179,"line":271},[177,1113,1114],{},"};\n",[177,1116,1117],{"class":179,"line":288},[177,1118,541],{"emptyLinePlaceholder":540},[177,1120,1121],{"class":179,"line":305},[177,1122,1123],{},"private _bank = fromJSON _payload;\n",[1125,1126,1127],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":1129},[1130,1131,1132,1133,1134,1135,1136,1137,1138],{"id":161,"depth":187,"text":162},{"id":363,"depth":187,"text":364},{"id":475,"depth":187,"text":476},{"id":568,"depth":187,"text":569},{"id":799,"depth":187,"text":800},{"id":892,"depth":187,"text":893},{"id":966,"depth":187,"text":967},{"id":1036,"depth":187,"text":1037},{"id":1079,"depth":187,"text":1080},"md",null,{},{"title":61,"description":157},"sIOXEyzlGQFhd8qUZozTWTtuL76YtpRKFT959rOS7FM",[1145,1147],{"title":57,"path":58,"stem":59,"description":1146,"children":-1},"The task module stores transient mission task metadata for active server or\nmission lifecycle workflows. SQF still owns Arma-only runtime state such as\nobjects and participants.",{"title":65,"path":66,"stem":67,"description":1148,"children":-1},"The CAD module stores transient operational state for dispatch activity,\nassignments, dispatch orders, support requests, group profiles, grouped views,\nand hydrated UI payloads. CAD state is in-memory and follows the active server\nor mission lifecycle.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/cad.html b/docus/dist/server-modules/cad.html index 3c54ed1..2b1fbdc 100644 --- a/docus/dist/server-modules/cad.html +++ b/docus/dist/server-modules/cad.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}CAD Usage Guide - forge-docus

    Economy Usage Guide

    The economy server addon owns Arma-world service behavior for fuel, medical, and repair interactions. It does not own money state. Money mutations go through extension-backed bank and organization hot state before the world -effect is applied.

    \ No newline at end of file +effect is applied.

    \ No newline at end of file diff --git a/docus/dist/server-modules/cad/_payload.json b/docus/dist/server-modules/cad/_payload.json index eea9ce0..74c9de0 100644 --- a/docus/dist/server-modules/cad/_payload.json +++ b/docus/dist/server-modules/cad/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1209},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-cad":145,"-server-modules-cad-surround":1204},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":65,"body":147,"description":157,"extension":1199,"links":1200,"meta":1201,"navigation":735,"path":66,"seo":1202,"stem":67,"__hash__":1203},"docs\u002F3.server-modules\u002F3.cad.md",{"type":148,"value":149,"toc":1184},"minimark",[150,154,158,163,166,169,189,193,198,254,258,368,372,474,478,578,582,685,689,825,841,845,949,953,1072,1076,1151,1155,1180],[151,152,65],"h1",{"id":153},"cad-usage-guide",[155,156,157],"p",{},"The CAD module stores transient operational state for dispatch activity,\nassignments, dispatch orders, support requests, group profiles, grouped views,\nand hydrated UI payloads. CAD state is in-memory and follows the active server\nor mission lifecycle.",[159,160,162],"h2",{"id":161},"data-model","Data Model",[155,164,165],{},"Most CAD records are flexible JSON objects. The service normalizes important\nIDs and returns structured mutation results for higher-level workflows.",[155,167,168],{},"Common generated IDs:",[170,171,172,180,186],"ul",{},[173,174,175,176],"li",{},"Orders: ",[177,178,179],"code",{},"cad-order:\u003Csequence>",[173,181,182,183],{},"Requests: ",[177,184,185],{},"cad-request:\u003Csequence>",[173,187,188],{},"Assignments usually share a task ID or order ID.",[159,190,192],{"id":191},"commands","Commands",[194,195,197],"h3",{"id":196},"activity","Activity",[199,200,201,217],"table",{},[202,203,204],"thead",{},[205,206,207,211,214],"tr",{},[208,209,210],"th",{},"Command",[208,212,213],{},"Arguments",[208,215,216],{},"Returns",[218,219,220,239],"tbody",{},[205,221,222,228,233],{},[223,224,225],"td",{},[177,226,227],{},"cad:activity:append",[223,229,230],{},[177,231,232],{},"activity_json",[223,234,235,238],{},[177,236,237],{},"OK",".",[205,240,241,246,251],{},[223,242,243],{},[177,244,245],{},"cad:activity:recent",[223,247,248],{},[177,249,250],{},"limit",[223,252,253],{},"Recent activity array JSON.",[194,255,257],{"id":256},"assignments","Assignments",[199,259,260,270],{},[202,261,262],{},[205,263,264,266,268],{},[208,265,210],{},[208,267,213],{},[208,269,216],{},[218,271,272,285,304,320,336,353],{},[205,273,274,279,282],{},[223,275,276],{},[177,277,278],{},"cad:assignments:list",[223,280,281],{},"none",[223,283,284],{},"Assignment array JSON.",[205,286,287,292,301],{},[223,288,289],{},[177,290,291],{},"cad:assignments:assign",[223,293,294,297,298],{},[177,295,296],{},"entry_id",", ",[177,299,300],{},"assignment_json",[223,302,303],{},"Assignment mutation result JSON.",[205,305,306,311,318],{},[223,307,308],{},[177,309,310],{},"cad:assignments:acknowledge",[223,312,313,297,315],{},[177,314,296],{},[177,316,317],{},"patch_json",[223,319,303],{},[205,321,322,327,333],{},[223,323,324],{},[177,325,326],{},"cad:assignments:decline",[223,328,329,297,331],{},[177,330,296],{},[177,332,317],{},[223,334,335],{},"Assignment mutation result JSON and removes assignment.",[205,337,338,343,349],{},[223,339,340],{},[177,341,342],{},"cad:assignments:upsert",[223,344,345,297,347],{},[177,346,296],{},[177,348,300],{},[223,350,351,238],{},[177,352,237],{},[205,354,355,360,364],{},[223,356,357],{},[177,358,359],{},"cad:assignments:delete",[223,361,362],{},[177,363,296],{},[223,365,366,238],{},[177,367,237],{},[194,369,371],{"id":370},"orders","Orders",[199,373,374,384],{},[202,375,376],{},[205,377,378,380,382],{},[208,379,210],{},[208,381,213],{},[208,383,216],{},[218,385,386,398,413,427,441,459],{},[205,387,388,393,395],{},[223,389,390],{},[177,391,392],{},"cad:orders:list",[223,394,281],{},[223,396,397],{},"Order array JSON.",[205,399,400,405,410],{},[223,401,402],{},[177,403,404],{},"cad:orders:create",[223,406,407],{},[177,408,409],{},"order_seed_json",[223,411,412],{},"Dispatch order mutation result JSON.",[205,414,415,420,425],{},[223,416,417],{},[177,418,419],{},"cad:orders:create_from_context",[223,421,422],{},[177,423,424],{},"context_json",[223,426,412],{},[205,428,429,434,438],{},[223,430,431],{},[177,432,433],{},"cad:orders:close",[223,435,436],{},[177,437,296],{},[223,439,440],{},"Dispatch order mutation result JSON and removes order\u002Fassignment.",[205,442,443,448,455],{},[223,444,445],{},[177,446,447],{},"cad:orders:upsert",[223,449,450,297,452],{},[177,451,296],{},[177,453,454],{},"order_json",[223,456,457,238],{},[177,458,237],{},[205,460,461,466,470],{},[223,462,463],{},[177,464,465],{},"cad:orders:delete",[223,467,468],{},[177,469,296],{},[223,471,472,238],{},[177,473,237],{},[194,475,477],{"id":476},"requests","Requests",[199,479,480,490],{},[202,481,482],{},[205,483,484,486,488],{},[208,485,210],{},[208,487,213],{},[208,489,216],{},[218,491,492,504,519,532,546,563],{},[205,493,494,499,501],{},[223,495,496],{},[177,497,498],{},"cad:requests:list",[223,500,281],{},[223,502,503],{},"Request array JSON.",[205,505,506,511,516],{},[223,507,508],{},[177,509,510],{},"cad:requests:submit",[223,512,513],{},[177,514,515],{},"request_json",[223,517,518],{},"Request mutation result JSON.",[205,520,521,526,530],{},[223,522,523],{},[177,524,525],{},"cad:requests:submit_from_context",[223,527,528],{},[177,529,424],{},[223,531,518],{},[205,533,534,539,543],{},[223,535,536],{},[177,537,538],{},"cad:requests:close",[223,540,541],{},[177,542,296],{},[223,544,545],{},"Request mutation result JSON and removes request.",[205,547,548,553,559],{},[223,549,550],{},[177,551,552],{},"cad:requests:upsert",[223,554,555,297,557],{},[177,556,296],{},[177,558,515],{},[223,560,561,238],{},[177,562,237],{},[205,564,565,570,574],{},[223,566,567],{},[177,568,569],{},"cad:requests:delete",[223,571,572],{},[177,573,296],{},[223,575,576,238],{},[177,577,237],{},[194,579,581],{"id":580},"profiles-and-views","Profiles and Views",[199,583,584,594],{},[202,585,586],{},[205,587,588,590,592],{},[208,589,210],{},[208,591,213],{},[208,593,216],{},[218,595,596,608,622,640,655,670],{},[205,597,598,603,605],{},[223,599,600],{},[177,601,602],{},"cad:profiles:list",[223,604,281],{},[223,606,607],{},"Profile array JSON.",[205,609,610,615,619],{},[223,611,612],{},[177,613,614],{},"cad:profiles:update_from_context",[223,616,617],{},[177,618,424],{},[223,620,621],{},"Profile mutation result JSON.",[205,623,624,629,636],{},[223,625,626],{},[177,627,628],{},"cad:profiles:upsert",[223,630,631,297,633],{},[177,632,296],{},[177,634,635],{},"profile_json",[223,637,638,238],{},[177,639,237],{},[205,641,642,647,651],{},[223,643,644],{},[177,645,646],{},"cad:profiles:delete",[223,648,649],{},[177,650,296],{},[223,652,653,238],{},[177,654,237],{},[205,656,657,662,667],{},[223,658,659],{},[177,660,661],{},"cad:groups:build",[223,663,664],{},[177,665,666],{},"groups_seed_json",[223,668,669],{},"Group array JSON.",[205,671,672,677,682],{},[223,673,674],{},[177,675,676],{},"cad:view:hydrate",[223,678,679],{},[177,680,681],{},"hydrate_seed_json",[223,683,684],{},"Hydrated CAD payload JSON.",[159,686,688],{"id":687},"submit-a-support-request","Submit a Support Request",[690,691,696],"pre",{"className":692,"code":693,"language":694,"meta":695,"style":695},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _fields = createHashMapFromArray [\n [\"pickup_location\", \"Grid 123456\"],\n [\"precedence\", \"urgent\"],\n [\"security\", \"secure\"]\n];\n\nprivate _context = createHashMapFromArray [\n [\"type\", \"medevac_9line\"],\n [\"fields\", _fields],\n [\"groupId\", \"alpha\"],\n [\"groupCallsign\", \"Alpha 1-1\"],\n [\"submittedByUid\", getPlayerUID player],\n [\"submittedByName\", name player],\n [\"priority\", \"emergency\"],\n [\"position\", getPosATL player],\n [\"createdAt\", diag_tickTime]\n];\n\nprivate _result = \"forge_server\" callExtension [\"cad:requests:submit_from_context\", [\n toJSON _context\n]];\n","sqf","",[177,697,698,706,712,718,724,730,737,743,749,755,761,767,773,779,785,791,797,802,807,813,819],{"__ignoreMap":695},[699,700,703],"span",{"class":701,"line":702},"line",1,[699,704,705],{},"private _fields = createHashMapFromArray [\n",[699,707,709],{"class":701,"line":708},2,[699,710,711],{}," [\"pickup_location\", \"Grid 123456\"],\n",[699,713,715],{"class":701,"line":714},3,[699,716,717],{}," [\"precedence\", \"urgent\"],\n",[699,719,721],{"class":701,"line":720},4,[699,722,723],{}," [\"security\", \"secure\"]\n",[699,725,727],{"class":701,"line":726},5,[699,728,729],{},"];\n",[699,731,733],{"class":701,"line":732},6,[699,734,736],{"emptyLinePlaceholder":735},true,"\n",[699,738,740],{"class":701,"line":739},7,[699,741,742],{},"private _context = createHashMapFromArray [\n",[699,744,746],{"class":701,"line":745},8,[699,747,748],{}," [\"type\", \"medevac_9line\"],\n",[699,750,752],{"class":701,"line":751},9,[699,753,754],{}," [\"fields\", _fields],\n",[699,756,758],{"class":701,"line":757},10,[699,759,760],{}," [\"groupId\", \"alpha\"],\n",[699,762,764],{"class":701,"line":763},11,[699,765,766],{}," [\"groupCallsign\", \"Alpha 1-1\"],\n",[699,768,770],{"class":701,"line":769},12,[699,771,772],{}," [\"submittedByUid\", getPlayerUID player],\n",[699,774,776],{"class":701,"line":775},13,[699,777,778],{}," [\"submittedByName\", name player],\n",[699,780,782],{"class":701,"line":781},14,[699,783,784],{}," [\"priority\", \"emergency\"],\n",[699,786,788],{"class":701,"line":787},15,[699,789,790],{}," [\"position\", getPosATL player],\n",[699,792,794],{"class":701,"line":793},16,[699,795,796],{}," [\"createdAt\", diag_tickTime]\n",[699,798,800],{"class":701,"line":799},17,[699,801,729],{},[699,803,805],{"class":701,"line":804},18,[699,806,736],{"emptyLinePlaceholder":735},[699,808,810],{"class":701,"line":809},19,[699,811,812],{},"private _result = \"forge_server\" callExtension [\"cad:requests:submit_from_context\", [\n",[699,814,816],{"class":701,"line":815},20,[699,817,818],{}," toJSON _context\n",[699,820,822],{"class":701,"line":821},21,[699,823,824],{},"]];\n",[155,826,827,828,297,831,834,835,838,839,238],{},"Supported priority values are ",[177,829,830],{},"routine",[177,832,833],{},"priority",", and ",[177,836,837],{},"emergency",". Unknown\nvalues normalize to ",[177,840,833],{},[159,842,844],{"id":843},"create-a-dispatch-order","Create a Dispatch Order",[690,846,848],{"className":692,"code":847,"language":694,"meta":695,"style":695},"private _context = createHashMapFromArray [\n [\"assigneeGroupId\", \"bravo\"],\n [\"assigneeGroupCallsign\", \"Bravo 1-1\"],\n [\"targetGroupId\", \"alpha\"],\n [\"targetGroupCallsign\", \"Alpha 1-1\"],\n [\"targetPosition\", getPosATL player],\n [\"createdByUid\", getPlayerUID player],\n [\"createdByName\", name player],\n [\"requestId\", \"cad-request:1\"],\n [\"requestType\", \"logreq\"],\n [\"requestTitle\", \"LOGREQ | Alpha 1-1\"],\n [\"requestSummary\", \"Ammo resupply requested\"],\n [\"requestFields\", createHashMap],\n [\"note\", \"Support Alpha 1-1 at current position.\"],\n [\"priority\", \"priority\"],\n [\"createdAt\", diag_tickTime]\n];\n\nprivate _result = \"forge_server\" callExtension [\"cad:orders:create_from_context\", [\n toJSON _context\n]];\n",[177,849,850,854,859,864,869,874,879,884,889,894,899,904,909,914,919,924,928,932,936,941,945],{"__ignoreMap":695},[699,851,852],{"class":701,"line":702},[699,853,742],{},[699,855,856],{"class":701,"line":708},[699,857,858],{}," [\"assigneeGroupId\", \"bravo\"],\n",[699,860,861],{"class":701,"line":714},[699,862,863],{}," [\"assigneeGroupCallsign\", \"Bravo 1-1\"],\n",[699,865,866],{"class":701,"line":720},[699,867,868],{}," [\"targetGroupId\", \"alpha\"],\n",[699,870,871],{"class":701,"line":726},[699,872,873],{}," [\"targetGroupCallsign\", \"Alpha 1-1\"],\n",[699,875,876],{"class":701,"line":732},[699,877,878],{}," [\"targetPosition\", getPosATL player],\n",[699,880,881],{"class":701,"line":739},[699,882,883],{}," [\"createdByUid\", getPlayerUID player],\n",[699,885,886],{"class":701,"line":745},[699,887,888],{}," [\"createdByName\", name player],\n",[699,890,891],{"class":701,"line":751},[699,892,893],{}," [\"requestId\", \"cad-request:1\"],\n",[699,895,896],{"class":701,"line":757},[699,897,898],{}," [\"requestType\", \"logreq\"],\n",[699,900,901],{"class":701,"line":763},[699,902,903],{}," [\"requestTitle\", \"LOGREQ | Alpha 1-1\"],\n",[699,905,906],{"class":701,"line":769},[699,907,908],{}," [\"requestSummary\", \"Ammo resupply requested\"],\n",[699,910,911],{"class":701,"line":775},[699,912,913],{}," [\"requestFields\", createHashMap],\n",[699,915,916],{"class":701,"line":781},[699,917,918],{}," [\"note\", \"Support Alpha 1-1 at current position.\"],\n",[699,920,921],{"class":701,"line":787},[699,922,923],{}," [\"priority\", \"priority\"],\n",[699,925,926],{"class":701,"line":793},[699,927,796],{},[699,929,930],{"class":701,"line":799},[699,931,729],{},[699,933,934],{"class":701,"line":804},[699,935,736],{"emptyLinePlaceholder":735},[699,937,938],{"class":701,"line":809},[699,939,940],{},"private _result = \"forge_server\" callExtension [\"cad:orders:create_from_context\", [\n",[699,942,943],{"class":701,"line":815},[699,944,818],{},[699,946,947],{"class":701,"line":821},[699,948,824],{},[159,950,952],{"id":951},"assignment-workflow","Assignment Workflow",[690,954,956],{"className":692,"code":955,"language":694,"meta":695,"style":695},"private _assignment = createHashMapFromArray [\n [\"groupId\", \"bravo\"],\n [\"assigneeGroupCallsign\", \"Bravo 1-1\"],\n [\"assignedByUid\", getPlayerUID player],\n [\"assignedByName\", name player],\n [\"assignedAt\", diag_tickTime],\n [\"state\", \"assigned\"]\n];\n\n\"forge_server\" callExtension [\"cad:assignments:assign\", [\n \"task-123\",\n toJSON _assignment\n]];\n\nprivate _ack = createHashMapFromArray [\n [\"state\", \"acknowledged\"],\n [\"acknowledgedByUid\", getPlayerUID player],\n [\"acknowledgedAt\", diag_tickTime]\n];\n\n\"forge_server\" callExtension [\"cad:assignments:acknowledge\", [\n \"task-123\",\n toJSON _ack\n]];\n",[177,957,958,963,968,972,977,982,987,992,996,1000,1005,1010,1015,1019,1023,1028,1033,1038,1043,1047,1051,1056,1061,1067],{"__ignoreMap":695},[699,959,960],{"class":701,"line":702},[699,961,962],{},"private _assignment = createHashMapFromArray [\n",[699,964,965],{"class":701,"line":708},[699,966,967],{}," [\"groupId\", \"bravo\"],\n",[699,969,970],{"class":701,"line":714},[699,971,863],{},[699,973,974],{"class":701,"line":720},[699,975,976],{}," [\"assignedByUid\", getPlayerUID player],\n",[699,978,979],{"class":701,"line":726},[699,980,981],{}," [\"assignedByName\", name player],\n",[699,983,984],{"class":701,"line":732},[699,985,986],{}," [\"assignedAt\", diag_tickTime],\n",[699,988,989],{"class":701,"line":739},[699,990,991],{}," [\"state\", \"assigned\"]\n",[699,993,994],{"class":701,"line":745},[699,995,729],{},[699,997,998],{"class":701,"line":751},[699,999,736],{"emptyLinePlaceholder":735},[699,1001,1002],{"class":701,"line":757},[699,1003,1004],{},"\"forge_server\" callExtension [\"cad:assignments:assign\", [\n",[699,1006,1007],{"class":701,"line":763},[699,1008,1009],{}," \"task-123\",\n",[699,1011,1012],{"class":701,"line":769},[699,1013,1014],{}," toJSON _assignment\n",[699,1016,1017],{"class":701,"line":775},[699,1018,824],{},[699,1020,1021],{"class":701,"line":781},[699,1022,736],{"emptyLinePlaceholder":735},[699,1024,1025],{"class":701,"line":787},[699,1026,1027],{},"private _ack = createHashMapFromArray [\n",[699,1029,1030],{"class":701,"line":793},[699,1031,1032],{}," [\"state\", \"acknowledged\"],\n",[699,1034,1035],{"class":701,"line":799},[699,1036,1037],{}," [\"acknowledgedByUid\", getPlayerUID player],\n",[699,1039,1040],{"class":701,"line":804},[699,1041,1042],{}," [\"acknowledgedAt\", diag_tickTime]\n",[699,1044,1045],{"class":701,"line":809},[699,1046,729],{},[699,1048,1049],{"class":701,"line":815},[699,1050,736],{"emptyLinePlaceholder":735},[699,1052,1053],{"class":701,"line":821},[699,1054,1055],{},"\"forge_server\" callExtension [\"cad:assignments:acknowledge\", [\n",[699,1057,1059],{"class":701,"line":1058},22,[699,1060,1009],{},[699,1062,1064],{"class":701,"line":1063},23,[699,1065,1066],{}," toJSON _ack\n",[699,1068,1070],{"class":701,"line":1069},24,[699,1071,824],{},[159,1073,1075],{"id":1074},"hydrate-the-cad-ui","Hydrate the CAD UI",[690,1077,1079],{"className":692,"code":1078,"language":694,"meta":695,"style":695},"private _session = createHashMapFromArray [\n [\"uid\", getPlayerUID player],\n [\"orgId\", \"default\"],\n [\"isDispatcher\", true],\n [\"groupId\", \"alpha\"],\n [\"isLeader\", true]\n];\n\nprivate _seed = createHashMapFromArray [\n [\"groups\", _liveGroups],\n [\"activeTasks\", _activeTasks],\n [\"session\", _session]\n];\n\nprivate _result = \"forge_server\" callExtension [\"cad:view:hydrate\", [toJSON _seed]];\n",[177,1080,1081,1086,1091,1096,1101,1105,1110,1114,1118,1123,1128,1133,1138,1142,1146],{"__ignoreMap":695},[699,1082,1083],{"class":701,"line":702},[699,1084,1085],{},"private _session = createHashMapFromArray [\n",[699,1087,1088],{"class":701,"line":708},[699,1089,1090],{}," [\"uid\", getPlayerUID player],\n",[699,1092,1093],{"class":701,"line":714},[699,1094,1095],{}," [\"orgId\", \"default\"],\n",[699,1097,1098],{"class":701,"line":720},[699,1099,1100],{}," [\"isDispatcher\", true],\n",[699,1102,1103],{"class":701,"line":726},[699,1104,760],{},[699,1106,1107],{"class":701,"line":732},[699,1108,1109],{}," [\"isLeader\", true]\n",[699,1111,1112],{"class":701,"line":739},[699,1113,729],{},[699,1115,1116],{"class":701,"line":745},[699,1117,736],{"emptyLinePlaceholder":735},[699,1119,1120],{"class":701,"line":751},[699,1121,1122],{},"private _seed = createHashMapFromArray [\n",[699,1124,1125],{"class":701,"line":757},[699,1126,1127],{}," [\"groups\", _liveGroups],\n",[699,1129,1130],{"class":701,"line":763},[699,1131,1132],{}," [\"activeTasks\", _activeTasks],\n",[699,1134,1135],{"class":701,"line":769},[699,1136,1137],{}," [\"session\", _session]\n",[699,1139,1140],{"class":701,"line":775},[699,1141,729],{},[699,1143,1144],{"class":701,"line":781},[699,1145,736],{"emptyLinePlaceholder":735},[699,1147,1148],{"class":701,"line":787},[699,1149,1150],{},"private _result = \"forge_server\" callExtension [\"cad:view:hydrate\", [toJSON _seed]];\n",[159,1152,1154],{"id":1153},"error-handling","Error Handling",[690,1156,1158],{"className":692,"code":1157,"language":694,"meta":695,"style":695},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"CAD error: %1\", _payload];\n};\n",[177,1159,1160,1165,1170,1175],{"__ignoreMap":695},[699,1161,1162],{"class":701,"line":702},[699,1163,1164],{},"private _payload = _result select 0;\n",[699,1166,1167],{"class":701,"line":708},[699,1168,1169],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[699,1171,1172],{"class":701,"line":714},[699,1173,1174],{}," systemChat format [\"CAD error: %1\", _payload];\n",[699,1176,1177],{"class":701,"line":720},[699,1178,1179],{},"};\n",[1181,1182,1183],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":695,"searchDepth":708,"depth":708,"links":1185},[1186,1187,1194,1195,1196,1197,1198],{"id":161,"depth":708,"text":162},{"id":191,"depth":708,"text":192,"children":1188},[1189,1190,1191,1192,1193],{"id":196,"depth":714,"text":197},{"id":256,"depth":714,"text":257},{"id":370,"depth":714,"text":371},{"id":476,"depth":714,"text":477},{"id":580,"depth":714,"text":581},{"id":687,"depth":708,"text":688},{"id":843,"depth":708,"text":844},{"id":951,"depth":708,"text":952},{"id":1074,"depth":708,"text":1075},{"id":1153,"depth":708,"text":1154},"md",null,{},{"title":65,"description":157},"VANsWEF49OB4tZwmlVZ0NzEGZIfaS-nx6IfKliEbIFw",[1205,1207],{"title":61,"path":62,"stem":63,"description":1206,"children":-1},"The bank module stores player account balances, earnings, PINs, and transaction\nstrings. The hot-state API also owns the active banking workflows used by the\nUI: deposit, withdraw, transfer, checkout charge, and PIN validation.",{"title":69,"path":70,"stem":71,"description":1208,"children":-1},"The economy server addon owns Arma-world service behavior for fuel, medical,\nand repair interactions. It does not own money state. Money mutations go\nthrough extension-backed bank and organization hot state before the world\neffect is applied.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1209},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-cad":145,"-server-modules-cad-surround":1204},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":65,"body":147,"description":157,"extension":1199,"links":1200,"meta":1201,"navigation":735,"path":66,"seo":1202,"stem":67,"__hash__":1203},"docs\u002F3.server-modules\u002F3.cad.md",{"type":148,"value":149,"toc":1184},"minimark",[150,154,158,163,166,169,189,193,198,254,258,368,372,474,478,578,582,685,689,825,841,845,949,953,1072,1076,1151,1155,1180],[151,152,65],"h1",{"id":153},"cad-usage-guide",[155,156,157],"p",{},"The CAD module stores transient operational state for dispatch activity,\nassignments, dispatch orders, support requests, group profiles, grouped views,\nand hydrated UI payloads. CAD state is in-memory and follows the active server\nor mission lifecycle.",[159,160,162],"h2",{"id":161},"data-model","Data Model",[155,164,165],{},"Most CAD records are flexible JSON objects. The service normalizes important\nIDs and returns structured mutation results for higher-level workflows.",[155,167,168],{},"Common generated IDs:",[170,171,172,180,186],"ul",{},[173,174,175,176],"li",{},"Orders: ",[177,178,179],"code",{},"cad-order:\u003Csequence>",[173,181,182,183],{},"Requests: ",[177,184,185],{},"cad-request:\u003Csequence>",[173,187,188],{},"Assignments usually share a task ID or order ID.",[159,190,192],{"id":191},"commands","Commands",[194,195,197],"h3",{"id":196},"activity","Activity",[199,200,201,217],"table",{},[202,203,204],"thead",{},[205,206,207,211,214],"tr",{},[208,209,210],"th",{},"Command",[208,212,213],{},"Arguments",[208,215,216],{},"Returns",[218,219,220,239],"tbody",{},[205,221,222,228,233],{},[223,224,225],"td",{},[177,226,227],{},"cad:activity:append",[223,229,230],{},[177,231,232],{},"activity_json",[223,234,235,238],{},[177,236,237],{},"OK",".",[205,240,241,246,251],{},[223,242,243],{},[177,244,245],{},"cad:activity:recent",[223,247,248],{},[177,249,250],{},"limit",[223,252,253],{},"Recent activity array JSON.",[194,255,257],{"id":256},"assignments","Assignments",[199,259,260,270],{},[202,261,262],{},[205,263,264,266,268],{},[208,265,210],{},[208,267,213],{},[208,269,216],{},[218,271,272,285,304,320,336,353],{},[205,273,274,279,282],{},[223,275,276],{},[177,277,278],{},"cad:assignments:list",[223,280,281],{},"none",[223,283,284],{},"Assignment array JSON.",[205,286,287,292,301],{},[223,288,289],{},[177,290,291],{},"cad:assignments:assign",[223,293,294,297,298],{},[177,295,296],{},"entry_id",", ",[177,299,300],{},"assignment_json",[223,302,303],{},"Assignment mutation result JSON.",[205,305,306,311,318],{},[223,307,308],{},[177,309,310],{},"cad:assignments:acknowledge",[223,312,313,297,315],{},[177,314,296],{},[177,316,317],{},"patch_json",[223,319,303],{},[205,321,322,327,333],{},[223,323,324],{},[177,325,326],{},"cad:assignments:decline",[223,328,329,297,331],{},[177,330,296],{},[177,332,317],{},[223,334,335],{},"Assignment mutation result JSON and removes assignment.",[205,337,338,343,349],{},[223,339,340],{},[177,341,342],{},"cad:assignments:upsert",[223,344,345,297,347],{},[177,346,296],{},[177,348,300],{},[223,350,351,238],{},[177,352,237],{},[205,354,355,360,364],{},[223,356,357],{},[177,358,359],{},"cad:assignments:delete",[223,361,362],{},[177,363,296],{},[223,365,366,238],{},[177,367,237],{},[194,369,371],{"id":370},"orders","Orders",[199,373,374,384],{},[202,375,376],{},[205,377,378,380,382],{},[208,379,210],{},[208,381,213],{},[208,383,216],{},[218,385,386,398,413,427,441,459],{},[205,387,388,393,395],{},[223,389,390],{},[177,391,392],{},"cad:orders:list",[223,394,281],{},[223,396,397],{},"Order array JSON.",[205,399,400,405,410],{},[223,401,402],{},[177,403,404],{},"cad:orders:create",[223,406,407],{},[177,408,409],{},"order_seed_json",[223,411,412],{},"Dispatch order mutation result JSON.",[205,414,415,420,425],{},[223,416,417],{},[177,418,419],{},"cad:orders:create_from_context",[223,421,422],{},[177,423,424],{},"context_json",[223,426,412],{},[205,428,429,434,438],{},[223,430,431],{},[177,432,433],{},"cad:orders:close",[223,435,436],{},[177,437,296],{},[223,439,440],{},"Dispatch order mutation result JSON and removes order\u002Fassignment.",[205,442,443,448,455],{},[223,444,445],{},[177,446,447],{},"cad:orders:upsert",[223,449,450,297,452],{},[177,451,296],{},[177,453,454],{},"order_json",[223,456,457,238],{},[177,458,237],{},[205,460,461,466,470],{},[223,462,463],{},[177,464,465],{},"cad:orders:delete",[223,467,468],{},[177,469,296],{},[223,471,472,238],{},[177,473,237],{},[194,475,477],{"id":476},"requests","Requests",[199,479,480,490],{},[202,481,482],{},[205,483,484,486,488],{},[208,485,210],{},[208,487,213],{},[208,489,216],{},[218,491,492,504,519,532,546,563],{},[205,493,494,499,501],{},[223,495,496],{},[177,497,498],{},"cad:requests:list",[223,500,281],{},[223,502,503],{},"Request array JSON.",[205,505,506,511,516],{},[223,507,508],{},[177,509,510],{},"cad:requests:submit",[223,512,513],{},[177,514,515],{},"request_json",[223,517,518],{},"Request mutation result JSON.",[205,520,521,526,530],{},[223,522,523],{},[177,524,525],{},"cad:requests:submit_from_context",[223,527,528],{},[177,529,424],{},[223,531,518],{},[205,533,534,539,543],{},[223,535,536],{},[177,537,538],{},"cad:requests:close",[223,540,541],{},[177,542,296],{},[223,544,545],{},"Request mutation result JSON and removes request.",[205,547,548,553,559],{},[223,549,550],{},[177,551,552],{},"cad:requests:upsert",[223,554,555,297,557],{},[177,556,296],{},[177,558,515],{},[223,560,561,238],{},[177,562,237],{},[205,564,565,570,574],{},[223,566,567],{},[177,568,569],{},"cad:requests:delete",[223,571,572],{},[177,573,296],{},[223,575,576,238],{},[177,577,237],{},[194,579,581],{"id":580},"profiles-and-views","Profiles and Views",[199,583,584,594],{},[202,585,586],{},[205,587,588,590,592],{},[208,589,210],{},[208,591,213],{},[208,593,216],{},[218,595,596,608,622,640,655,670],{},[205,597,598,603,605],{},[223,599,600],{},[177,601,602],{},"cad:profiles:list",[223,604,281],{},[223,606,607],{},"Profile array JSON.",[205,609,610,615,619],{},[223,611,612],{},[177,613,614],{},"cad:profiles:update_from_context",[223,616,617],{},[177,618,424],{},[223,620,621],{},"Profile mutation result JSON.",[205,623,624,629,636],{},[223,625,626],{},[177,627,628],{},"cad:profiles:upsert",[223,630,631,297,633],{},[177,632,296],{},[177,634,635],{},"profile_json",[223,637,638,238],{},[177,639,237],{},[205,641,642,647,651],{},[223,643,644],{},[177,645,646],{},"cad:profiles:delete",[223,648,649],{},[177,650,296],{},[223,652,653,238],{},[177,654,237],{},[205,656,657,662,667],{},[223,658,659],{},[177,660,661],{},"cad:groups:build",[223,663,664],{},[177,665,666],{},"groups_seed_json",[223,668,669],{},"Group array JSON.",[205,671,672,677,682],{},[223,673,674],{},[177,675,676],{},"cad:view:hydrate",[223,678,679],{},[177,680,681],{},"hydrate_seed_json",[223,683,684],{},"Hydrated CAD payload JSON.",[159,686,688],{"id":687},"submit-a-support-request","Submit a Support Request",[690,691,696],"pre",{"className":692,"code":693,"language":694,"meta":695,"style":695},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _fields = createHashMapFromArray [\n [\"pickup_location\", \"Grid 123456\"],\n [\"precedence\", \"urgent\"],\n [\"security\", \"secure\"]\n];\n\nprivate _context = createHashMapFromArray [\n [\"type\", \"medevac_9line\"],\n [\"fields\", _fields],\n [\"groupId\", \"alpha\"],\n [\"groupCallsign\", \"Alpha 1-1\"],\n [\"submittedByUid\", getPlayerUID player],\n [\"submittedByName\", name player],\n [\"priority\", \"emergency\"],\n [\"position\", getPosATL player],\n [\"createdAt\", diag_tickTime]\n];\n\nprivate _result = \"forge_server\" callExtension [\"cad:requests:submit_from_context\", [\n toJSON _context\n]];\n","sqf","",[177,697,698,706,712,718,724,730,737,743,749,755,761,767,773,779,785,791,797,802,807,813,819],{"__ignoreMap":695},[699,700,703],"span",{"class":701,"line":702},"line",1,[699,704,705],{},"private _fields = createHashMapFromArray [\n",[699,707,709],{"class":701,"line":708},2,[699,710,711],{}," [\"pickup_location\", \"Grid 123456\"],\n",[699,713,715],{"class":701,"line":714},3,[699,716,717],{}," [\"precedence\", \"urgent\"],\n",[699,719,721],{"class":701,"line":720},4,[699,722,723],{}," [\"security\", \"secure\"]\n",[699,725,727],{"class":701,"line":726},5,[699,728,729],{},"];\n",[699,731,733],{"class":701,"line":732},6,[699,734,736],{"emptyLinePlaceholder":735},true,"\n",[699,738,740],{"class":701,"line":739},7,[699,741,742],{},"private _context = createHashMapFromArray [\n",[699,744,746],{"class":701,"line":745},8,[699,747,748],{}," [\"type\", \"medevac_9line\"],\n",[699,750,752],{"class":701,"line":751},9,[699,753,754],{}," [\"fields\", _fields],\n",[699,756,758],{"class":701,"line":757},10,[699,759,760],{}," [\"groupId\", \"alpha\"],\n",[699,762,764],{"class":701,"line":763},11,[699,765,766],{}," [\"groupCallsign\", \"Alpha 1-1\"],\n",[699,768,770],{"class":701,"line":769},12,[699,771,772],{}," [\"submittedByUid\", getPlayerUID player],\n",[699,774,776],{"class":701,"line":775},13,[699,777,778],{}," [\"submittedByName\", name player],\n",[699,780,782],{"class":701,"line":781},14,[699,783,784],{}," [\"priority\", \"emergency\"],\n",[699,786,788],{"class":701,"line":787},15,[699,789,790],{}," [\"position\", getPosATL player],\n",[699,792,794],{"class":701,"line":793},16,[699,795,796],{}," [\"createdAt\", diag_tickTime]\n",[699,798,800],{"class":701,"line":799},17,[699,801,729],{},[699,803,805],{"class":701,"line":804},18,[699,806,736],{"emptyLinePlaceholder":735},[699,808,810],{"class":701,"line":809},19,[699,811,812],{},"private _result = \"forge_server\" callExtension [\"cad:requests:submit_from_context\", [\n",[699,814,816],{"class":701,"line":815},20,[699,817,818],{}," toJSON _context\n",[699,820,822],{"class":701,"line":821},21,[699,823,824],{},"]];\n",[155,826,827,828,297,831,834,835,838,839,238],{},"Supported priority values are ",[177,829,830],{},"routine",[177,832,833],{},"priority",", and ",[177,836,837],{},"emergency",". Unknown\nvalues normalize to ",[177,840,833],{},[159,842,844],{"id":843},"create-a-dispatch-order","Create a Dispatch Order",[690,846,848],{"className":692,"code":847,"language":694,"meta":695,"style":695},"private _context = createHashMapFromArray [\n [\"assigneeGroupId\", \"bravo\"],\n [\"assigneeGroupCallsign\", \"Bravo 1-1\"],\n [\"targetGroupId\", \"alpha\"],\n [\"targetGroupCallsign\", \"Alpha 1-1\"],\n [\"targetPosition\", getPosATL player],\n [\"createdByUid\", getPlayerUID player],\n [\"createdByName\", name player],\n [\"requestId\", \"cad-request:1\"],\n [\"requestType\", \"logreq\"],\n [\"requestTitle\", \"LOGREQ | Alpha 1-1\"],\n [\"requestSummary\", \"Ammo resupply requested\"],\n [\"requestFields\", createHashMap],\n [\"note\", \"Support Alpha 1-1 at current position.\"],\n [\"priority\", \"priority\"],\n [\"createdAt\", diag_tickTime]\n];\n\nprivate _result = \"forge_server\" callExtension [\"cad:orders:create_from_context\", [\n toJSON _context\n]];\n",[177,849,850,854,859,864,869,874,879,884,889,894,899,904,909,914,919,924,928,932,936,941,945],{"__ignoreMap":695},[699,851,852],{"class":701,"line":702},[699,853,742],{},[699,855,856],{"class":701,"line":708},[699,857,858],{}," [\"assigneeGroupId\", \"bravo\"],\n",[699,860,861],{"class":701,"line":714},[699,862,863],{}," [\"assigneeGroupCallsign\", \"Bravo 1-1\"],\n",[699,865,866],{"class":701,"line":720},[699,867,868],{}," [\"targetGroupId\", \"alpha\"],\n",[699,870,871],{"class":701,"line":726},[699,872,873],{}," [\"targetGroupCallsign\", \"Alpha 1-1\"],\n",[699,875,876],{"class":701,"line":732},[699,877,878],{}," [\"targetPosition\", getPosATL player],\n",[699,880,881],{"class":701,"line":739},[699,882,883],{}," [\"createdByUid\", getPlayerUID player],\n",[699,885,886],{"class":701,"line":745},[699,887,888],{}," [\"createdByName\", name player],\n",[699,890,891],{"class":701,"line":751},[699,892,893],{}," [\"requestId\", \"cad-request:1\"],\n",[699,895,896],{"class":701,"line":757},[699,897,898],{}," [\"requestType\", \"logreq\"],\n",[699,900,901],{"class":701,"line":763},[699,902,903],{}," [\"requestTitle\", \"LOGREQ | Alpha 1-1\"],\n",[699,905,906],{"class":701,"line":769},[699,907,908],{}," [\"requestSummary\", \"Ammo resupply requested\"],\n",[699,910,911],{"class":701,"line":775},[699,912,913],{}," [\"requestFields\", createHashMap],\n",[699,915,916],{"class":701,"line":781},[699,917,918],{}," [\"note\", \"Support Alpha 1-1 at current position.\"],\n",[699,920,921],{"class":701,"line":787},[699,922,923],{}," [\"priority\", \"priority\"],\n",[699,925,926],{"class":701,"line":793},[699,927,796],{},[699,929,930],{"class":701,"line":799},[699,931,729],{},[699,933,934],{"class":701,"line":804},[699,935,736],{"emptyLinePlaceholder":735},[699,937,938],{"class":701,"line":809},[699,939,940],{},"private _result = \"forge_server\" callExtension [\"cad:orders:create_from_context\", [\n",[699,942,943],{"class":701,"line":815},[699,944,818],{},[699,946,947],{"class":701,"line":821},[699,948,824],{},[159,950,952],{"id":951},"assignment-workflow","Assignment Workflow",[690,954,956],{"className":692,"code":955,"language":694,"meta":695,"style":695},"private _assignment = createHashMapFromArray [\n [\"groupId\", \"bravo\"],\n [\"assigneeGroupCallsign\", \"Bravo 1-1\"],\n [\"assignedByUid\", getPlayerUID player],\n [\"assignedByName\", name player],\n [\"assignedAt\", diag_tickTime],\n [\"state\", \"assigned\"]\n];\n\n\"forge_server\" callExtension [\"cad:assignments:assign\", [\n \"task-123\",\n toJSON _assignment\n]];\n\nprivate _ack = createHashMapFromArray [\n [\"state\", \"acknowledged\"],\n [\"acknowledgedByUid\", getPlayerUID player],\n [\"acknowledgedAt\", diag_tickTime]\n];\n\n\"forge_server\" callExtension [\"cad:assignments:acknowledge\", [\n \"task-123\",\n toJSON _ack\n]];\n",[177,957,958,963,968,972,977,982,987,992,996,1000,1005,1010,1015,1019,1023,1028,1033,1038,1043,1047,1051,1056,1061,1067],{"__ignoreMap":695},[699,959,960],{"class":701,"line":702},[699,961,962],{},"private _assignment = createHashMapFromArray [\n",[699,964,965],{"class":701,"line":708},[699,966,967],{}," [\"groupId\", \"bravo\"],\n",[699,969,970],{"class":701,"line":714},[699,971,863],{},[699,973,974],{"class":701,"line":720},[699,975,976],{}," [\"assignedByUid\", getPlayerUID player],\n",[699,978,979],{"class":701,"line":726},[699,980,981],{}," [\"assignedByName\", name player],\n",[699,983,984],{"class":701,"line":732},[699,985,986],{}," [\"assignedAt\", diag_tickTime],\n",[699,988,989],{"class":701,"line":739},[699,990,991],{}," [\"state\", \"assigned\"]\n",[699,993,994],{"class":701,"line":745},[699,995,729],{},[699,997,998],{"class":701,"line":751},[699,999,736],{"emptyLinePlaceholder":735},[699,1001,1002],{"class":701,"line":757},[699,1003,1004],{},"\"forge_server\" callExtension [\"cad:assignments:assign\", [\n",[699,1006,1007],{"class":701,"line":763},[699,1008,1009],{}," \"task-123\",\n",[699,1011,1012],{"class":701,"line":769},[699,1013,1014],{}," toJSON _assignment\n",[699,1016,1017],{"class":701,"line":775},[699,1018,824],{},[699,1020,1021],{"class":701,"line":781},[699,1022,736],{"emptyLinePlaceholder":735},[699,1024,1025],{"class":701,"line":787},[699,1026,1027],{},"private _ack = createHashMapFromArray [\n",[699,1029,1030],{"class":701,"line":793},[699,1031,1032],{}," [\"state\", \"acknowledged\"],\n",[699,1034,1035],{"class":701,"line":799},[699,1036,1037],{}," [\"acknowledgedByUid\", getPlayerUID player],\n",[699,1039,1040],{"class":701,"line":804},[699,1041,1042],{}," [\"acknowledgedAt\", diag_tickTime]\n",[699,1044,1045],{"class":701,"line":809},[699,1046,729],{},[699,1048,1049],{"class":701,"line":815},[699,1050,736],{"emptyLinePlaceholder":735},[699,1052,1053],{"class":701,"line":821},[699,1054,1055],{},"\"forge_server\" callExtension [\"cad:assignments:acknowledge\", [\n",[699,1057,1059],{"class":701,"line":1058},22,[699,1060,1009],{},[699,1062,1064],{"class":701,"line":1063},23,[699,1065,1066],{}," toJSON _ack\n",[699,1068,1070],{"class":701,"line":1069},24,[699,1071,824],{},[159,1073,1075],{"id":1074},"hydrate-the-cad-ui","Hydrate the CAD UI",[690,1077,1079],{"className":692,"code":1078,"language":694,"meta":695,"style":695},"private _session = createHashMapFromArray [\n [\"uid\", getPlayerUID player],\n [\"orgId\", \"default\"],\n [\"isDispatcher\", true],\n [\"groupId\", \"alpha\"],\n [\"isLeader\", true]\n];\n\nprivate _seed = createHashMapFromArray [\n [\"groups\", _liveGroups],\n [\"activeTasks\", _activeTasks],\n [\"session\", _session]\n];\n\nprivate _result = \"forge_server\" callExtension [\"cad:view:hydrate\", [toJSON _seed]];\n",[177,1080,1081,1086,1091,1096,1101,1105,1110,1114,1118,1123,1128,1133,1138,1142,1146],{"__ignoreMap":695},[699,1082,1083],{"class":701,"line":702},[699,1084,1085],{},"private _session = createHashMapFromArray [\n",[699,1087,1088],{"class":701,"line":708},[699,1089,1090],{}," [\"uid\", getPlayerUID player],\n",[699,1092,1093],{"class":701,"line":714},[699,1094,1095],{}," [\"orgId\", \"default\"],\n",[699,1097,1098],{"class":701,"line":720},[699,1099,1100],{}," [\"isDispatcher\", true],\n",[699,1102,1103],{"class":701,"line":726},[699,1104,760],{},[699,1106,1107],{"class":701,"line":732},[699,1108,1109],{}," [\"isLeader\", true]\n",[699,1111,1112],{"class":701,"line":739},[699,1113,729],{},[699,1115,1116],{"class":701,"line":745},[699,1117,736],{"emptyLinePlaceholder":735},[699,1119,1120],{"class":701,"line":751},[699,1121,1122],{},"private _seed = createHashMapFromArray [\n",[699,1124,1125],{"class":701,"line":757},[699,1126,1127],{}," [\"groups\", _liveGroups],\n",[699,1129,1130],{"class":701,"line":763},[699,1131,1132],{}," [\"activeTasks\", _activeTasks],\n",[699,1134,1135],{"class":701,"line":769},[699,1136,1137],{}," [\"session\", _session]\n",[699,1139,1140],{"class":701,"line":775},[699,1141,729],{},[699,1143,1144],{"class":701,"line":781},[699,1145,736],{"emptyLinePlaceholder":735},[699,1147,1148],{"class":701,"line":787},[699,1149,1150],{},"private _result = \"forge_server\" callExtension [\"cad:view:hydrate\", [toJSON _seed]];\n",[159,1152,1154],{"id":1153},"error-handling","Error Handling",[690,1156,1158],{"className":692,"code":1157,"language":694,"meta":695,"style":695},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"CAD error: %1\", _payload];\n};\n",[177,1159,1160,1165,1170,1175],{"__ignoreMap":695},[699,1161,1162],{"class":701,"line":702},[699,1163,1164],{},"private _payload = _result select 0;\n",[699,1166,1167],{"class":701,"line":708},[699,1168,1169],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[699,1171,1172],{"class":701,"line":714},[699,1173,1174],{}," systemChat format [\"CAD error: %1\", _payload];\n",[699,1176,1177],{"class":701,"line":720},[699,1178,1179],{},"};\n",[1181,1182,1183],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":695,"searchDepth":708,"depth":708,"links":1185},[1186,1187,1194,1195,1196,1197,1198],{"id":161,"depth":708,"text":162},{"id":191,"depth":708,"text":192,"children":1188},[1189,1190,1191,1192,1193],{"id":196,"depth":714,"text":197},{"id":256,"depth":714,"text":257},{"id":370,"depth":714,"text":371},{"id":476,"depth":714,"text":477},{"id":580,"depth":714,"text":581},{"id":687,"depth":708,"text":688},{"id":843,"depth":708,"text":844},{"id":951,"depth":708,"text":952},{"id":1074,"depth":708,"text":1075},{"id":1153,"depth":708,"text":1154},"md",null,{},{"title":65,"description":157},"VANsWEF49OB4tZwmlVZ0NzEGZIfaS-nx6IfKliEbIFw",[1205,1207],{"title":61,"path":62,"stem":63,"description":1206,"children":-1},"The bank module stores player account balances, earnings, PINs, and transaction\nstrings. The hot-state API also owns the active banking workflows used by the\nUI: deposit, withdraw, transfer, checkout charge, and PIN validation.",{"title":69,"path":70,"stem":71,"description":1208,"children":-1},"The economy server addon owns Arma-world service behavior for fuel, medical,\nand repair interactions. It does not own money state. Money mutations go\nthrough extension-backed bank and organization hot state before the world\neffect is applied.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/economy.html b/docus/dist/server-modules/economy.html index 3c32ae6..33fd521 100644 --- a/docus/dist/server-modules/economy.html +++ b/docus/dist/server-modules/economy.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Economy Usage Guide - forge-docus

    Garage Usage Guide

    The garage module stores physical player vehicles. Each record keeps the vehicle classname, generated plate UUID, fuel, overall damage, and detailed hit -point damage.

    \ No newline at end of file +point damage.

    \ No newline at end of file diff --git a/docus/dist/server-modules/economy/_payload.json b/docus/dist/server-modules/economy/_payload.json index b611822..1eeaa0d 100644 --- a/docus/dist/server-modules/economy/_payload.json +++ b/docus/dist/server-modules/economy/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":338},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-economy":145,"-server-modules-economy-surround":333},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":69,"body":147,"description":157,"extension":327,"links":328,"meta":329,"navigation":330,"path":70,"seo":331,"stem":71,"__hash__":332},"docs\u002F3.server-modules\u002F4.economy.md",{"type":148,"value":149,"toc":318},"minimark",[150,154,158,163,196,200,203,214,225,229,232,235,251,261,264,268,271,278,293,296,300,307,311,314],[151,152,69],"h1",{"id":153},"economy-usage-guide",[155,156,157],"p",{},"The economy server addon owns Arma-world service behavior for fuel, medical,\nand repair interactions. It does not own money state. Money mutations go\nthrough extension-backed bank and organization hot state before the world\neffect is applied.",[159,160,162],"h2",{"id":161},"dependencies","Dependencies",[164,165,166,174,180,186],"ul",{},[167,168,169,173],"li",{},[170,171,172],"code",{},"forge_server_common"," for logging, formatting, and player lookup.",[167,175,176,179],{},[170,177,178],{},"forge_server_bank"," for personal medical billing.",[167,181,182,185],{},[170,183,184],{},"forge_server_org"," for organization-funded services and medical fallback\ndebt.",[167,187,188,191,192,195],{},[170,189,190],{},"forge_client_actor"," and ",[170,193,194],{},"forge_client_notifications"," for targeted client\nresponses.",[159,197,199],{"id":198},"fuel","Fuel",[155,201,202],{},"Fuel is organization-funded.",[155,204,205,206,209,210,213],{},"When refueling stops, ",[170,207,208],{},"fnc_initFEconomyStore.sqf"," calculates the fuel delta and\ncost, charges the player's organization through ",[170,211,212],{},"OrgStore chargeCheckout",", and\nsyncs the organization patch to online members. If organization funds cannot\ncover the refuel, the vehicle is rolled back to the fuel level it had when the\nsession started.",[155,215,216,217,220,221,224],{},"Garage UI refuel requests use the server ",[170,218,219],{},"RefuelService"," event. The fuel store\ncalculates missing fuel from the vehicle config ",[170,222,223],{},"fuelCapacity",", charges the\nplayer's organization, and fills the vehicle only after the organization charge\nsucceeds.",[159,226,228],{"id":227},"repair","Repair",[155,230,231],{},"Repair is organization-funded.",[155,233,234],{},"Use the repair service event:",[236,237,242],"pre",{"className":238,"code":239,"language":240,"meta":241,"style":241},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[QEGVAR(economy,RepairService), [_target, _unit, _cost]] call CBA_fnc_serverEvent;\n","sqf","",[170,243,244],{"__ignoreMap":241},[245,246,249],"span",{"class":247,"line":248},"line",1,[245,250,239],{},[155,252,253,256,257,260],{},[170,254,255],{},"_cost"," is optional. Passing ",[170,258,259],{},"-1"," uses the configured service repair cost.\nThe target is only repaired after the organization charge succeeds.",[155,262,263],{},"The client garage UI forwards selected nearby vehicle repair requests through\nthe same event.",[159,265,267],{"id":266},"medical","Medical",[155,269,270],{},"Medical is player-funded first.",[155,272,273,274,277],{},"When a heal is requested, ",[170,275,276],{},"fnc_initMEconomyStore.sqf"," uses this billing order:",[279,280,281,284,287,290],"ol",{},[167,282,283],{},"Charge the player's bank balance when it can cover the medical fee.",[167,285,286],{},"Otherwise charge the player's cash when it can cover the fee.",[167,288,289],{},"If neither personal balance can cover the fee, charge organization funds.",[167,291,292],{},"When organization funds cover the fallback charge, record the same amount as\ndebt on the player's organization credit line.",[155,294,295],{},"The heal only completes after one of those charges succeeds. If personal\nbilling is unavailable, the heal does not fall back to organization funds\nbecause the server cannot verify that the player is unable to cover the fee.",[159,297,299],{"id":298},"medical-debt-repayment","Medical Debt Repayment",[155,301,302,303,306],{},"Medical fallback debt uses the existing organization credit-line repayment\nflow. The organization treasury is reduced when the service is rendered, and\nthe player's credit-line ",[170,304,305],{},"amount_due"," increases by the medical fee. When the\nplayer repays through the bank credit-line repayment action, player bank funds\nare moved back into the organization treasury.",[159,308,310],{"id":309},"hot-cache-boundary","Hot-Cache Boundary",[155,312,313],{},"The economy addon should stay server-authoritative for world effects such as\nvehicle fuel, vehicle repair, healing, respawn placement, and death inventory\nmovement. Bank and organization balances should continue to mutate through the\nextension-backed hot-cache services.",[315,316,317],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":241,"searchDepth":319,"depth":319,"links":320},2,[321,322,323,324,325,326],{"id":161,"depth":319,"text":162},{"id":198,"depth":319,"text":199},{"id":227,"depth":319,"text":228},{"id":266,"depth":319,"text":267},{"id":298,"depth":319,"text":299},{"id":309,"depth":319,"text":310},"md",null,{},true,{"title":69,"description":157},"lJi1fhh3OVngURwg54r03VgJ7l-YhNr9VR2saYNlGOE",[334,336],{"title":65,"path":66,"stem":67,"description":335,"children":-1},"The CAD module stores transient operational state for dispatch activity,\nassignments, dispatch orders, support requests, group profiles, grouped views,\nand hydrated UI payloads. CAD state is in-memory and follows the active server\nor mission lifecycle.",{"title":73,"path":74,"stem":75,"description":337,"children":-1},"The garage module stores physical player vehicles. Each record keeps the\nvehicle classname, generated plate UUID, fuel, overall damage, and detailed hit\npoint damage.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":338},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-economy":145,"-server-modules-economy-surround":333},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":69,"body":147,"description":157,"extension":327,"links":328,"meta":329,"navigation":330,"path":70,"seo":331,"stem":71,"__hash__":332},"docs\u002F3.server-modules\u002F4.economy.md",{"type":148,"value":149,"toc":318},"minimark",[150,154,158,163,196,200,203,214,225,229,232,235,251,261,264,268,271,278,293,296,300,307,311,314],[151,152,69],"h1",{"id":153},"economy-usage-guide",[155,156,157],"p",{},"The economy server addon owns Arma-world service behavior for fuel, medical,\nand repair interactions. It does not own money state. Money mutations go\nthrough extension-backed bank and organization hot state before the world\neffect is applied.",[159,160,162],"h2",{"id":161},"dependencies","Dependencies",[164,165,166,174,180,186],"ul",{},[167,168,169,173],"li",{},[170,171,172],"code",{},"forge_server_common"," for logging, formatting, and player lookup.",[167,175,176,179],{},[170,177,178],{},"forge_server_bank"," for personal medical billing.",[167,181,182,185],{},[170,183,184],{},"forge_server_org"," for organization-funded services and medical fallback\ndebt.",[167,187,188,191,192,195],{},[170,189,190],{},"forge_client_actor"," and ",[170,193,194],{},"forge_client_notifications"," for targeted client\nresponses.",[159,197,199],{"id":198},"fuel","Fuel",[155,201,202],{},"Fuel is organization-funded.",[155,204,205,206,209,210,213],{},"When refueling stops, ",[170,207,208],{},"fnc_initFEconomyStore.sqf"," calculates the fuel delta and\ncost, charges the player's organization through ",[170,211,212],{},"OrgStore chargeCheckout",", and\nsyncs the organization patch to online members. If organization funds cannot\ncover the refuel, the vehicle is rolled back to the fuel level it had when the\nsession started.",[155,215,216,217,220,221,224],{},"Garage UI refuel requests use the server ",[170,218,219],{},"RefuelService"," event. The fuel store\ncalculates missing fuel from the vehicle config ",[170,222,223],{},"fuelCapacity",", charges the\nplayer's organization, and fills the vehicle only after the organization charge\nsucceeds.",[159,226,228],{"id":227},"repair","Repair",[155,230,231],{},"Repair is organization-funded.",[155,233,234],{},"Use the repair service event:",[236,237,242],"pre",{"className":238,"code":239,"language":240,"meta":241,"style":241},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[QEGVAR(economy,RepairService), [_target, _unit, _cost]] call CBA_fnc_serverEvent;\n","sqf","",[170,243,244],{"__ignoreMap":241},[245,246,249],"span",{"class":247,"line":248},"line",1,[245,250,239],{},[155,252,253,256,257,260],{},[170,254,255],{},"_cost"," is optional. Passing ",[170,258,259],{},"-1"," uses the configured service repair cost.\nThe target is only repaired after the organization charge succeeds.",[155,262,263],{},"The client garage UI forwards selected nearby vehicle repair requests through\nthe same event.",[159,265,267],{"id":266},"medical","Medical",[155,269,270],{},"Medical is player-funded first.",[155,272,273,274,277],{},"When a heal is requested, ",[170,275,276],{},"fnc_initMEconomyStore.sqf"," uses this billing order:",[279,280,281,284,287,290],"ol",{},[167,282,283],{},"Charge the player's bank balance when it can cover the medical fee.",[167,285,286],{},"Otherwise charge the player's cash when it can cover the fee.",[167,288,289],{},"If neither personal balance can cover the fee, charge organization funds.",[167,291,292],{},"When organization funds cover the fallback charge, record the same amount as\ndebt on the player's organization credit line.",[155,294,295],{},"The heal only completes after one of those charges succeeds. If personal\nbilling is unavailable, the heal does not fall back to organization funds\nbecause the server cannot verify that the player is unable to cover the fee.",[159,297,299],{"id":298},"medical-debt-repayment","Medical Debt Repayment",[155,301,302,303,306],{},"Medical fallback debt uses the existing organization credit-line repayment\nflow. The organization treasury is reduced when the service is rendered, and\nthe player's credit-line ",[170,304,305],{},"amount_due"," increases by the medical fee. When the\nplayer repays through the bank credit-line repayment action, player bank funds\nare moved back into the organization treasury.",[159,308,310],{"id":309},"hot-cache-boundary","Hot-Cache Boundary",[155,312,313],{},"The economy addon should stay server-authoritative for world effects such as\nvehicle fuel, vehicle repair, healing, respawn placement, and death inventory\nmovement. Bank and organization balances should continue to mutate through the\nextension-backed hot-cache services.",[315,316,317],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":241,"searchDepth":319,"depth":319,"links":320},2,[321,322,323,324,325,326],{"id":161,"depth":319,"text":162},{"id":198,"depth":319,"text":199},{"id":227,"depth":319,"text":228},{"id":266,"depth":319,"text":267},{"id":298,"depth":319,"text":299},{"id":309,"depth":319,"text":310},"md",null,{},true,{"title":69,"description":157},"lJi1fhh3OVngURwg54r03VgJ7l-YhNr9VR2saYNlGOE",[334,336],{"title":65,"path":66,"stem":67,"description":335,"children":-1},"The CAD module stores transient operational state for dispatch activity,\nassignments, dispatch orders, support requests, group profiles, grouped views,\nand hydrated UI payloads. CAD state is in-memory and follows the active server\nor mission lifecycle.",{"title":73,"path":74,"stem":75,"description":337,"children":-1},"The garage module stores physical player vehicles. Each record keeps the\nvehicle classname, generated plate UUID, fuel, overall damage, and detailed hit\npoint damage.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/garage.html b/docus/dist/server-modules/garage.html index ba4521a..4fce907 100644 --- a/docus/dist/server-modules/garage.html +++ b/docus/dist/server-modules/garage.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Garage Usage Guide - forge-docus

    Locker Usage Guide

    The locker module stores physical player inventory items by classname. It is separate from the virtual arsenal unlock module documented in -Owned Storage Usage Guide.

    \ No newline at end of file +Owned Storage Usage Guide.

    \ No newline at end of file diff --git a/docus/dist/server-modules/garage/_payload.json b/docus/dist/server-modules/garage/_payload.json index 06dce27..2b12cbc 100644 --- a/docus/dist/server-modules/garage/_payload.json +++ b/docus/dist/server-modules/garage/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1356},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-garage":145,"-server-modules-garage-surround":1351},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":73,"body":147,"description":157,"extension":1346,"links":1347,"meta":1348,"navigation":640,"path":74,"seo":1349,"stem":75,"__hash__":1350},"docs\u002F3.server-modules\u002F5.garage.md",{"type":148,"value":149,"toc":1335},"minimark",[150,154,158,163,166,386,389,447,451,458,608,612,619,666,670,683,816,819,858,862,877,927,931,939,980,984,1168,1172,1183,1296,1299,1303,1331],[151,152,73],"h1",{"id":153},"garage-usage-guide",[155,156,157],"p",{},"The garage module stores physical player vehicles. Each record keeps the\nvehicle classname, generated plate UUID, fuel, overall damage, and detailed hit\npoint damage.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Garage data is persisted through SurrealDB by the server extension.",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"plate-uuid\": {\n \"plate\": \"plate-uuid\",\n \"classname\": \"B_Quadbike_01_F\",\n \"fuel\": 1.0,\n \"damage\": 0.0,\n \"hit_points\": {\n \"names\": [\"hitengine\"],\n \"selections\": [\"engine_hitpoint\"],\n \"values\": [0.0]\n }\n }\n}\n","json","",[174,175,176,185,204,229,250,268,285,299,325,348,368,374,380],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","plate-uuid",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," {\n",[177,205,207,210,214,216,218,221,224,226],{"class":179,"line":206},3,[177,208,209],{"class":183}," \"",[177,211,213],{"class":212},"sBMFI","plate",[177,215,197],{"class":183},[177,217,200],{"class":183},[177,219,220],{"class":183}," \"",[177,222,194],{"class":223},"sfazB",[177,225,197],{"class":183},[177,227,228],{"class":183},",\n",[177,230,232,234,237,239,241,243,246,248],{"class":179,"line":231},4,[177,233,209],{"class":183},[177,235,236],{"class":212},"classname",[177,238,197],{"class":183},[177,240,200],{"class":183},[177,242,220],{"class":183},[177,244,245],{"class":223},"B_Quadbike_01_F",[177,247,197],{"class":183},[177,249,228],{"class":183},[177,251,253,255,258,260,262,266],{"class":179,"line":252},5,[177,254,209],{"class":183},[177,256,257],{"class":212},"fuel",[177,259,197],{"class":183},[177,261,200],{"class":183},[177,263,265],{"class":264},"sbssI"," 1.0",[177,267,228],{"class":183},[177,269,271,273,276,278,280,283],{"class":179,"line":270},6,[177,272,209],{"class":183},[177,274,275],{"class":212},"damage",[177,277,197],{"class":183},[177,279,200],{"class":183},[177,281,282],{"class":264}," 0.0",[177,284,228],{"class":183},[177,286,288,290,293,295,297],{"class":179,"line":287},7,[177,289,209],{"class":183},[177,291,292],{"class":212},"hit_points",[177,294,197],{"class":183},[177,296,200],{"class":183},[177,298,203],{"class":183},[177,300,302,305,308,310,312,315,317,320,322],{"class":179,"line":301},8,[177,303,304],{"class":183}," \"",[177,306,307],{"class":264},"names",[177,309,197],{"class":183},[177,311,200],{"class":183},[177,313,314],{"class":183}," [",[177,316,197],{"class":183},[177,318,319],{"class":223},"hitengine",[177,321,197],{"class":183},[177,323,324],{"class":183},"],\n",[177,326,328,330,333,335,337,339,341,344,346],{"class":179,"line":327},9,[177,329,304],{"class":183},[177,331,332],{"class":264},"selections",[177,334,197],{"class":183},[177,336,200],{"class":183},[177,338,314],{"class":183},[177,340,197],{"class":183},[177,342,343],{"class":223},"engine_hitpoint",[177,345,197],{"class":183},[177,347,324],{"class":183},[177,349,351,353,356,358,360,362,365],{"class":179,"line":350},10,[177,352,304],{"class":183},[177,354,355],{"class":264},"values",[177,357,197],{"class":183},[177,359,200],{"class":183},[177,361,314],{"class":183},[177,363,364],{"class":264},"0.0",[177,366,367],{"class":183},"]\n",[177,369,371],{"class":179,"line":370},11,[177,372,373],{"class":183}," }\n",[177,375,377],{"class":179,"line":376},12,[177,378,379],{"class":183}," }\n",[177,381,383],{"class":179,"line":382},13,[177,384,385],{"class":183},"}\n",[155,387,388],{},"Rules validated by the Rust service:",[390,391,392,396,402,417,430,442],"ul",{},[393,394,395],"li",{},"A player garage can contain up to 5 vehicles.",[393,397,398,401],{},[174,399,400],{},"garage:add"," generates a UUID plate automatically.",[393,403,404,406,407,409,410,412,413,416],{},[174,405,257],{},", ",[174,408,275],{},", and every hit point value must be between ",[174,411,364],{}," and ",[174,414,415],{},"1.0",".",[393,418,419,406,422,425,426,429],{},[174,420,421],{},"hit_points.names",[174,423,424],{},"hit_points.selections",", and ",[174,427,428],{},"hit_points.values"," must have\nthe same length.",[393,431,432,406,435,425,438,441],{},[174,433,434],{},"garage:get",[174,436,437],{},"garage:patch",[174,439,440],{},"garage:remove"," require an existing garage.",[393,443,444,446],{},[174,445,400],{}," creates an empty garage automatically when one does not exist.",[159,448,450],{"id":449},"commands","Commands",[155,452,453,454,457],{},"All commands are called on the ",[174,455,456],{},"garage"," group.",[459,460,461,477],"table",{},[462,463,464],"thead",{},[465,466,467,471,474],"tr",{},[468,469,470],"th",{},"Command",[468,472,473],{},"Arguments",[468,475,476],{},"Returns",[478,479,480,496,509,525,542,557,572,588],"tbody",{},[465,481,482,488,493],{},[483,484,485],"td",{},[174,486,487],{},"garage:create",[483,489,490],{},[174,491,492],{},"uid",[483,494,495],{},"Empty vehicle map as JSON.",[465,497,498,502,506],{},[483,499,500],{},[174,501,434],{},[483,503,504],{},[174,505,492],{},[483,507,508],{},"Vehicle map as JSON.",[465,510,511,515,522],{},[483,512,513],{},[174,514,400],{},[483,516,517,406,519],{},[174,518,492],{},[174,520,521],{},"vehicle_json",[483,523,524],{},"Updated vehicle map as JSON.",[465,526,527,532,539],{},[483,528,529],{},[174,530,531],{},"garage:update",[483,533,534,406,536],{},[174,535,492],{},[174,537,538],{},"vehicles_json",[483,540,541],{},"Replaced vehicle map as JSON.",[465,543,544,548,555],{},[483,545,546],{},[174,547,437],{},[483,549,550,406,552],{},[174,551,492],{},[174,553,554],{},"patch_json",[483,556,524],{},[465,558,559,563,570],{},[483,560,561],{},[174,562,440],{},[483,564,565,406,567],{},[174,566,492],{},[174,568,569],{},"remove_json",[483,571,524],{},[465,573,574,579,583],{},[483,575,576],{},[174,577,578],{},"garage:delete",[483,580,581],{},[174,582,492],{},[483,584,585,416],{},[174,586,587],{},"OK",[465,589,590,595,599],{},[483,591,592],{},[174,593,594],{},"garage:exists",[483,596,597],{},[174,598,492],{},[483,600,601,604,605,416],{},[174,602,603],{},"true"," or ",[174,606,607],{},"false",[159,609,611],{"id":610},"error-handling","Error Handling",[155,613,614,615,618],{},"Every command returns a string payload. Always check for the ",[174,616,617],{},"Error:"," prefix\nbefore parsing JSON.",[167,620,624],{"className":621,"code":622,"language":623,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Garage error: %1\", _payload];\n};\n\nprivate _garage = fromJSON _payload;\n","sqf",[174,625,626,631,636,642,647,652,657,661],{"__ignoreMap":172},[177,627,628],{"class":179,"line":180},[177,629,630],{},"private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\n",[177,632,633],{"class":179,"line":187},[177,634,635],{},"private _payload = _result select 0;\n",[177,637,638],{"class":179,"line":206},[177,639,641],{"emptyLinePlaceholder":640},true,"\n",[177,643,644],{"class":179,"line":231},[177,645,646],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,648,649],{"class":179,"line":252},[177,650,651],{}," systemChat format [\"Garage error: %1\", _payload];\n",[177,653,654],{"class":179,"line":270},[177,655,656],{},"};\n",[177,658,659],{"class":179,"line":287},[177,660,641],{"emptyLinePlaceholder":640},[177,662,663],{"class":179,"line":301},[177,664,665],{},"private _garage = fromJSON _payload;\n",[159,667,669],{"id":668},"add-a-vehicle","Add a Vehicle",[155,671,672,674,675,406,677,406,679,425,681,416],{},[174,673,400],{}," requires ",[174,676,236],{},[174,678,257],{},[174,680,275],{},[174,682,292],{},[167,684,686],{"className":621,"code":685,"language":623,"meta":172,"style":172},"private _hitPointData = getAllHitPointsDamage _vehicle;\nprivate _hitPoints = createHashMapFromArray [\n [\"names\", _hitPointData select 0],\n [\"selections\", _hitPointData select 1],\n [\"values\", _hitPointData select 2]\n];\n\nprivate _vehicleData = createHashMapFromArray [\n [\"classname\", typeOf _vehicle],\n [\"fuel\", fuel _vehicle],\n [\"damage\", damage _vehicle],\n [\"hit_points\", _hitPoints]\n];\n\nprivate _result = \"forge_server\" callExtension [\"garage:add\", [\n getPlayerUID player,\n toJSON _vehicleData\n]];\n\nprivate _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to store vehicle: %1\", _payload];\n};\n\nprivate _garage = fromJSON _payload;\n",[174,687,688,693,698,703,708,713,718,722,727,732,737,742,747,751,756,762,768,774,780,785,790,795,801,806,811],{"__ignoreMap":172},[177,689,690],{"class":179,"line":180},[177,691,692],{},"private _hitPointData = getAllHitPointsDamage _vehicle;\n",[177,694,695],{"class":179,"line":187},[177,696,697],{},"private _hitPoints = createHashMapFromArray [\n",[177,699,700],{"class":179,"line":206},[177,701,702],{}," [\"names\", _hitPointData select 0],\n",[177,704,705],{"class":179,"line":231},[177,706,707],{}," [\"selections\", _hitPointData select 1],\n",[177,709,710],{"class":179,"line":252},[177,711,712],{}," [\"values\", _hitPointData select 2]\n",[177,714,715],{"class":179,"line":270},[177,716,717],{},"];\n",[177,719,720],{"class":179,"line":287},[177,721,641],{"emptyLinePlaceholder":640},[177,723,724],{"class":179,"line":301},[177,725,726],{},"private _vehicleData = createHashMapFromArray [\n",[177,728,729],{"class":179,"line":327},[177,730,731],{}," [\"classname\", typeOf _vehicle],\n",[177,733,734],{"class":179,"line":350},[177,735,736],{}," [\"fuel\", fuel _vehicle],\n",[177,738,739],{"class":179,"line":370},[177,740,741],{}," [\"damage\", damage _vehicle],\n",[177,743,744],{"class":179,"line":376},[177,745,746],{}," [\"hit_points\", _hitPoints]\n",[177,748,749],{"class":179,"line":382},[177,750,717],{},[177,752,754],{"class":179,"line":753},14,[177,755,641],{"emptyLinePlaceholder":640},[177,757,759],{"class":179,"line":758},15,[177,760,761],{},"private _result = \"forge_server\" callExtension [\"garage:add\", [\n",[177,763,765],{"class":179,"line":764},16,[177,766,767],{}," getPlayerUID player,\n",[177,769,771],{"class":179,"line":770},17,[177,772,773],{}," toJSON _vehicleData\n",[177,775,777],{"class":179,"line":776},18,[177,778,779],{},"]];\n",[177,781,783],{"class":179,"line":782},19,[177,784,641],{"emptyLinePlaceholder":640},[177,786,788],{"class":179,"line":787},20,[177,789,635],{},[177,791,793],{"class":179,"line":792},21,[177,794,646],{},[177,796,798],{"class":179,"line":797},22,[177,799,800],{}," hint format [\"Failed to store vehicle: %1\", _payload];\n",[177,802,804],{"class":179,"line":803},23,[177,805,656],{},[177,807,809],{"class":179,"line":808},24,[177,810,641],{"emptyLinePlaceholder":640},[177,812,814],{"class":179,"line":813},25,[177,815,665],{},[155,817,818],{},"The returned value is a hash map keyed by generated plate. To find the newly\nstored vehicle, compare returned keys before and after the add, or search by\nclassname if your workflow guarantees a unique pending vehicle.",[167,820,822],{"className":621,"code":821,"language":623,"meta":172,"style":172},"private _storedPlate = \"\";\n{\n private _vehicleRecord = _garage get _x;\n if ((_vehicleRecord get \"classname\") == typeOf _vehicle) then {\n _storedPlate = _x;\n };\n} forEach keys _garage;\n",[174,823,824,829,833,838,843,848,853],{"__ignoreMap":172},[177,825,826],{"class":179,"line":180},[177,827,828],{},"private _storedPlate = \"\";\n",[177,830,831],{"class":179,"line":187},[177,832,184],{},[177,834,835],{"class":179,"line":206},[177,836,837],{}," private _vehicleRecord = _garage get _x;\n",[177,839,840],{"class":179,"line":231},[177,841,842],{}," if ((_vehicleRecord get \"classname\") == typeOf _vehicle) then {\n",[177,844,845],{"class":179,"line":252},[177,846,847],{}," _storedPlate = _x;\n",[177,849,850],{"class":179,"line":270},[177,851,852],{}," };\n",[177,854,855],{"class":179,"line":287},[177,856,857],{},"} forEach keys _garage;\n",[159,859,861],{"id":860},"patch-a-vehicle","Patch a Vehicle",[155,863,864,866,867,869,870,406,872,425,874,876],{},[174,865,437],{}," updates selected fields for one plate. The ",[174,868,213],{}," field is\nrequired. ",[174,871,257],{},[174,873,275],{},[174,875,292],{}," are optional.",[167,878,880],{"className":621,"code":879,"language":623,"meta":172,"style":172},"private _patch = createHashMapFromArray [\n [\"plate\", _vehicle getVariable [\"forge_garage_plate\", \"\"]],\n [\"fuel\", fuel _vehicle],\n [\"damage\", damage _vehicle]\n];\n\nprivate _result = \"forge_server\" callExtension [\"garage:patch\", [\n getPlayerUID player,\n toJSON _patch\n]];\n",[174,881,882,887,892,896,901,905,909,914,918,923],{"__ignoreMap":172},[177,883,884],{"class":179,"line":180},[177,885,886],{},"private _patch = createHashMapFromArray [\n",[177,888,889],{"class":179,"line":187},[177,890,891],{}," [\"plate\", _vehicle getVariable [\"forge_garage_plate\", \"\"]],\n",[177,893,894],{"class":179,"line":206},[177,895,736],{},[177,897,898],{"class":179,"line":231},[177,899,900],{}," [\"damage\", damage _vehicle]\n",[177,902,903],{"class":179,"line":252},[177,904,717],{},[177,906,907],{"class":179,"line":270},[177,908,641],{"emptyLinePlaceholder":640},[177,910,911],{"class":179,"line":287},[177,912,913],{},"private _result = \"forge_server\" callExtension [\"garage:patch\", [\n",[177,915,916],{"class":179,"line":301},[177,917,767],{},[177,919,920],{"class":179,"line":327},[177,921,922],{}," toJSON _patch\n",[177,924,925],{"class":179,"line":350},[177,926,779],{},[159,928,930],{"id":929},"remove-a-vehicle","Remove a Vehicle",[155,932,933,935,936,938],{},[174,934,440],{}," expects JSON with a ",[174,937,213],{}," field.",[167,940,942],{"className":621,"code":941,"language":623,"meta":172,"style":172},"private _remove = createHashMapFromArray [\n [\"plate\", _plate]\n];\n\nprivate _result = \"forge_server\" callExtension [\"garage:remove\", [\n getPlayerUID player,\n toJSON _remove\n]];\n",[174,943,944,949,954,958,962,967,971,976],{"__ignoreMap":172},[177,945,946],{"class":179,"line":180},[177,947,948],{},"private _remove = createHashMapFromArray [\n",[177,950,951],{"class":179,"line":187},[177,952,953],{}," [\"plate\", _plate]\n",[177,955,956],{"class":179,"line":206},[177,957,717],{},[177,959,960],{"class":179,"line":231},[177,961,641],{"emptyLinePlaceholder":640},[177,963,964],{"class":179,"line":252},[177,965,966],{},"private _result = \"forge_server\" callExtension [\"garage:remove\", [\n",[177,968,969],{"class":179,"line":270},[177,970,767],{},[177,972,973],{"class":179,"line":287},[177,974,975],{}," toJSON _remove\n",[177,977,978],{"class":179,"line":301},[177,979,779],{},[159,981,983],{"id":982},"spawn-a-stored-vehicle","Spawn a Stored Vehicle",[167,985,987],{"className":621,"code":986,"language":623,"meta":172,"style":172},"fnc_spawnGarageVehicle = {\n params [\"_plate\"];\n\n private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\n private _payload = _result select 0;\n\n if (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to load garage: %1\", _payload];\n objNull\n };\n\n private _garage = fromJSON _payload;\n private _vehicleData = _garage getOrDefault [_plate, createHashMap];\n if (_vehicleData isEqualTo createHashMap) exitWith {\n hint \"Vehicle plate was not found in your garage.\";\n objNull\n };\n\n private _vehicle = (_vehicleData get \"classname\") createVehicle (player getPos [10, getDir player]);\n _vehicle setFuel (_vehicleData getOrDefault [\"fuel\", 1]);\n _vehicle setDamage (_vehicleData getOrDefault [\"damage\", 0]);\n _vehicle setVariable [\"forge_garage_plate\", _plate, true];\n\n private _hitPoints = _vehicleData getOrDefault [\"hit_points\", createHashMap];\n private _names = _hitPoints getOrDefault [\"names\", []];\n private _values = _hitPoints getOrDefault [\"values\", []];\n\n {\n _vehicle setHitPointDamage [_x, _values select _forEachIndex];\n } forEach _names;\n\n private _remove = createHashMapFromArray [[\"plate\", _plate]];\n \"forge_server\" callExtension [\"garage:remove\", [getPlayerUID player, toJSON _remove]];\n\n _vehicle\n};\n",[174,988,989,994,999,1003,1008,1013,1017,1022,1027,1032,1036,1040,1045,1050,1055,1060,1064,1068,1072,1077,1082,1087,1092,1096,1101,1106,1112,1117,1123,1129,1135,1140,1146,1152,1157,1163],{"__ignoreMap":172},[177,990,991],{"class":179,"line":180},[177,992,993],{},"fnc_spawnGarageVehicle = {\n",[177,995,996],{"class":179,"line":187},[177,997,998],{}," params [\"_plate\"];\n",[177,1000,1001],{"class":179,"line":206},[177,1002,641],{"emptyLinePlaceholder":640},[177,1004,1005],{"class":179,"line":231},[177,1006,1007],{}," private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\n",[177,1009,1010],{"class":179,"line":252},[177,1011,1012],{}," private _payload = _result select 0;\n",[177,1014,1015],{"class":179,"line":270},[177,1016,641],{"emptyLinePlaceholder":640},[177,1018,1019],{"class":179,"line":287},[177,1020,1021],{}," if (_payload find \"Error:\" == 0) exitWith {\n",[177,1023,1024],{"class":179,"line":301},[177,1025,1026],{}," hint format [\"Failed to load garage: %1\", _payload];\n",[177,1028,1029],{"class":179,"line":327},[177,1030,1031],{}," objNull\n",[177,1033,1034],{"class":179,"line":350},[177,1035,852],{},[177,1037,1038],{"class":179,"line":370},[177,1039,641],{"emptyLinePlaceholder":640},[177,1041,1042],{"class":179,"line":376},[177,1043,1044],{}," private _garage = fromJSON _payload;\n",[177,1046,1047],{"class":179,"line":382},[177,1048,1049],{}," private _vehicleData = _garage getOrDefault [_plate, createHashMap];\n",[177,1051,1052],{"class":179,"line":753},[177,1053,1054],{}," if (_vehicleData isEqualTo createHashMap) exitWith {\n",[177,1056,1057],{"class":179,"line":758},[177,1058,1059],{}," hint \"Vehicle plate was not found in your garage.\";\n",[177,1061,1062],{"class":179,"line":764},[177,1063,1031],{},[177,1065,1066],{"class":179,"line":770},[177,1067,852],{},[177,1069,1070],{"class":179,"line":776},[177,1071,641],{"emptyLinePlaceholder":640},[177,1073,1074],{"class":179,"line":782},[177,1075,1076],{}," private _vehicle = (_vehicleData get \"classname\") createVehicle (player getPos [10, getDir player]);\n",[177,1078,1079],{"class":179,"line":787},[177,1080,1081],{}," _vehicle setFuel (_vehicleData getOrDefault [\"fuel\", 1]);\n",[177,1083,1084],{"class":179,"line":792},[177,1085,1086],{}," _vehicle setDamage (_vehicleData getOrDefault [\"damage\", 0]);\n",[177,1088,1089],{"class":179,"line":797},[177,1090,1091],{}," _vehicle setVariable [\"forge_garage_plate\", _plate, true];\n",[177,1093,1094],{"class":179,"line":803},[177,1095,641],{"emptyLinePlaceholder":640},[177,1097,1098],{"class":179,"line":808},[177,1099,1100],{}," private _hitPoints = _vehicleData getOrDefault [\"hit_points\", createHashMap];\n",[177,1102,1103],{"class":179,"line":813},[177,1104,1105],{}," private _names = _hitPoints getOrDefault [\"names\", []];\n",[177,1107,1109],{"class":179,"line":1108},26,[177,1110,1111],{}," private _values = _hitPoints getOrDefault [\"values\", []];\n",[177,1113,1115],{"class":179,"line":1114},27,[177,1116,641],{"emptyLinePlaceholder":640},[177,1118,1120],{"class":179,"line":1119},28,[177,1121,1122],{}," {\n",[177,1124,1126],{"class":179,"line":1125},29,[177,1127,1128],{}," _vehicle setHitPointDamage [_x, _values select _forEachIndex];\n",[177,1130,1132],{"class":179,"line":1131},30,[177,1133,1134],{}," } forEach _names;\n",[177,1136,1138],{"class":179,"line":1137},31,[177,1139,641],{"emptyLinePlaceholder":640},[177,1141,1143],{"class":179,"line":1142},32,[177,1144,1145],{}," private _remove = createHashMapFromArray [[\"plate\", _plate]];\n",[177,1147,1149],{"class":179,"line":1148},33,[177,1150,1151],{}," \"forge_server\" callExtension [\"garage:remove\", [getPlayerUID player, toJSON _remove]];\n",[177,1153,1155],{"class":179,"line":1154},34,[177,1156,641],{"emptyLinePlaceholder":640},[177,1158,1160],{"class":179,"line":1159},35,[177,1161,1162],{}," _vehicle\n",[177,1164,1166],{"class":179,"line":1165},36,[177,1167,656],{},[159,1169,1171],{"id":1170},"hot-state","Hot State",[155,1173,1174,1175,1178,1179,1182],{},"The ",[174,1176,1177],{},"garage:hot:*"," commands keep a runtime copy of a player's garage and write\nit back only when ",[174,1180,1181],{},"garage:hot:save"," runs.",[459,1184,1185,1195],{},[462,1186,1187],{},[465,1188,1189,1191,1193],{},[468,1190,470],{},[468,1192,473],{},[468,1194,476],{},[478,1196,1197,1210,1223,1238,1253,1268,1281],{},[465,1198,1199,1204,1208],{},[483,1200,1201],{},[174,1202,1203],{},"garage:hot:init",[483,1205,1206],{},[174,1207,492],{},[483,1209,508],{},[465,1211,1212,1217,1221],{},[483,1213,1214],{},[174,1215,1216],{},"garage:hot:get",[483,1218,1219],{},[174,1220,492],{},[483,1222,508],{},[465,1224,1225,1230,1236],{},[483,1226,1227],{},[174,1228,1229],{},"garage:hot:override",[483,1231,1232,406,1234],{},[174,1233,492],{},[174,1235,538],{},[483,1237,508],{},[465,1239,1240,1245,1251],{},[483,1241,1242],{},[174,1243,1244],{},"garage:hot:add",[483,1246,1247,406,1249],{},[174,1248,492],{},[174,1250,521],{},[483,1252,508],{},[465,1254,1255,1260,1266],{},[483,1256,1257],{},[174,1258,1259],{},"garage:hot:remove_vehicle",[483,1261,1262,406,1264],{},[174,1263,492],{},[174,1265,569],{},[483,1267,508],{},[465,1269,1270,1274,1278],{},[483,1271,1272],{},[174,1273,1181],{},[483,1275,1276],{},[174,1277,492],{},[483,1279,1280],{},"Current hot vehicle map as JSON.",[465,1282,1283,1288,1292],{},[483,1284,1285],{},[174,1286,1287],{},"garage:hot:remove",[483,1289,1290],{},[174,1291,492],{},[483,1293,1294,416],{},[174,1295,587],{},[155,1297,1298],{},"Use hot state for session-heavy vehicle workflows. Use the durable commands for\nsimple store\u002Fretrieve operations.",[159,1300,1302],{"id":1301},"best-practices","Best Practices",[390,1304,1305,1311,1317,1322,1328],{},[393,1306,1307,1308,416],{},"Store the generated plate on spawned vehicles with ",[174,1309,1310],{},"setVariable",[393,1312,1313,1314,1316],{},"Use ",[174,1315,437],{}," for frequent fuel and damage syncs.",[393,1318,1313,1319,1321],{},[174,1320,531],{}," only when replacing the whole vehicle map intentionally.",[393,1323,1324,1325,1327],{},"Do not delete the world vehicle until ",[174,1326,400],{}," succeeds.",[393,1329,1330],{},"Treat vehicle maps as hash maps keyed by plate, not arrays.",[1332,1333,1334],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":1336},[1337,1338,1339,1340,1341,1342,1343,1344,1345],{"id":161,"depth":187,"text":162},{"id":449,"depth":187,"text":450},{"id":610,"depth":187,"text":611},{"id":668,"depth":187,"text":669},{"id":860,"depth":187,"text":861},{"id":929,"depth":187,"text":930},{"id":982,"depth":187,"text":983},{"id":1170,"depth":187,"text":1171},{"id":1301,"depth":187,"text":1302},"md",null,{},{"title":73,"description":157},"EH_wB2YH4wCw-T1stsEVmDq0ztTnbpLjX9816UfP4Vk",[1352,1354],{"title":69,"path":70,"stem":71,"description":1353,"children":-1},"The economy server addon owns Arma-world service behavior for fuel, medical,\nand repair interactions. It does not own money state. Money mutations go\nthrough extension-backed bank and organization hot state before the world\neffect is applied.",{"title":77,"path":78,"stem":79,"description":1355,"children":-1},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\nOwned Storage Usage Guide.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1356},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-garage":145,"-server-modules-garage-surround":1351},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":73,"body":147,"description":157,"extension":1346,"links":1347,"meta":1348,"navigation":640,"path":74,"seo":1349,"stem":75,"__hash__":1350},"docs\u002F3.server-modules\u002F5.garage.md",{"type":148,"value":149,"toc":1335},"minimark",[150,154,158,163,166,386,389,447,451,458,608,612,619,666,670,683,816,819,858,862,877,927,931,939,980,984,1168,1172,1183,1296,1299,1303,1331],[151,152,73],"h1",{"id":153},"garage-usage-guide",[155,156,157],"p",{},"The garage module stores physical player vehicles. Each record keeps the\nvehicle classname, generated plate UUID, fuel, overall damage, and detailed hit\npoint damage.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Garage data is persisted through SurrealDB by the server extension.",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"plate-uuid\": {\n \"plate\": \"plate-uuid\",\n \"classname\": \"B_Quadbike_01_F\",\n \"fuel\": 1.0,\n \"damage\": 0.0,\n \"hit_points\": {\n \"names\": [\"hitengine\"],\n \"selections\": [\"engine_hitpoint\"],\n \"values\": [0.0]\n }\n }\n}\n","json","",[174,175,176,185,204,229,250,268,285,299,325,348,368,374,380],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","plate-uuid",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," {\n",[177,205,207,210,214,216,218,221,224,226],{"class":179,"line":206},3,[177,208,209],{"class":183}," \"",[177,211,213],{"class":212},"sBMFI","plate",[177,215,197],{"class":183},[177,217,200],{"class":183},[177,219,220],{"class":183}," \"",[177,222,194],{"class":223},"sfazB",[177,225,197],{"class":183},[177,227,228],{"class":183},",\n",[177,230,232,234,237,239,241,243,246,248],{"class":179,"line":231},4,[177,233,209],{"class":183},[177,235,236],{"class":212},"classname",[177,238,197],{"class":183},[177,240,200],{"class":183},[177,242,220],{"class":183},[177,244,245],{"class":223},"B_Quadbike_01_F",[177,247,197],{"class":183},[177,249,228],{"class":183},[177,251,253,255,258,260,262,266],{"class":179,"line":252},5,[177,254,209],{"class":183},[177,256,257],{"class":212},"fuel",[177,259,197],{"class":183},[177,261,200],{"class":183},[177,263,265],{"class":264},"sbssI"," 1.0",[177,267,228],{"class":183},[177,269,271,273,276,278,280,283],{"class":179,"line":270},6,[177,272,209],{"class":183},[177,274,275],{"class":212},"damage",[177,277,197],{"class":183},[177,279,200],{"class":183},[177,281,282],{"class":264}," 0.0",[177,284,228],{"class":183},[177,286,288,290,293,295,297],{"class":179,"line":287},7,[177,289,209],{"class":183},[177,291,292],{"class":212},"hit_points",[177,294,197],{"class":183},[177,296,200],{"class":183},[177,298,203],{"class":183},[177,300,302,305,308,310,312,315,317,320,322],{"class":179,"line":301},8,[177,303,304],{"class":183}," \"",[177,306,307],{"class":264},"names",[177,309,197],{"class":183},[177,311,200],{"class":183},[177,313,314],{"class":183}," [",[177,316,197],{"class":183},[177,318,319],{"class":223},"hitengine",[177,321,197],{"class":183},[177,323,324],{"class":183},"],\n",[177,326,328,330,333,335,337,339,341,344,346],{"class":179,"line":327},9,[177,329,304],{"class":183},[177,331,332],{"class":264},"selections",[177,334,197],{"class":183},[177,336,200],{"class":183},[177,338,314],{"class":183},[177,340,197],{"class":183},[177,342,343],{"class":223},"engine_hitpoint",[177,345,197],{"class":183},[177,347,324],{"class":183},[177,349,351,353,356,358,360,362,365],{"class":179,"line":350},10,[177,352,304],{"class":183},[177,354,355],{"class":264},"values",[177,357,197],{"class":183},[177,359,200],{"class":183},[177,361,314],{"class":183},[177,363,364],{"class":264},"0.0",[177,366,367],{"class":183},"]\n",[177,369,371],{"class":179,"line":370},11,[177,372,373],{"class":183}," }\n",[177,375,377],{"class":179,"line":376},12,[177,378,379],{"class":183}," }\n",[177,381,383],{"class":179,"line":382},13,[177,384,385],{"class":183},"}\n",[155,387,388],{},"Rules validated by the Rust service:",[390,391,392,396,402,417,430,442],"ul",{},[393,394,395],"li",{},"A player garage can contain up to 5 vehicles.",[393,397,398,401],{},[174,399,400],{},"garage:add"," generates a UUID plate automatically.",[393,403,404,406,407,409,410,412,413,416],{},[174,405,257],{},", ",[174,408,275],{},", and every hit point value must be between ",[174,411,364],{}," and ",[174,414,415],{},"1.0",".",[393,418,419,406,422,425,426,429],{},[174,420,421],{},"hit_points.names",[174,423,424],{},"hit_points.selections",", and ",[174,427,428],{},"hit_points.values"," must have\nthe same length.",[393,431,432,406,435,425,438,441],{},[174,433,434],{},"garage:get",[174,436,437],{},"garage:patch",[174,439,440],{},"garage:remove"," require an existing garage.",[393,443,444,446],{},[174,445,400],{}," creates an empty garage automatically when one does not exist.",[159,448,450],{"id":449},"commands","Commands",[155,452,453,454,457],{},"All commands are called on the ",[174,455,456],{},"garage"," group.",[459,460,461,477],"table",{},[462,463,464],"thead",{},[465,466,467,471,474],"tr",{},[468,469,470],"th",{},"Command",[468,472,473],{},"Arguments",[468,475,476],{},"Returns",[478,479,480,496,509,525,542,557,572,588],"tbody",{},[465,481,482,488,493],{},[483,484,485],"td",{},[174,486,487],{},"garage:create",[483,489,490],{},[174,491,492],{},"uid",[483,494,495],{},"Empty vehicle map as JSON.",[465,497,498,502,506],{},[483,499,500],{},[174,501,434],{},[483,503,504],{},[174,505,492],{},[483,507,508],{},"Vehicle map as JSON.",[465,510,511,515,522],{},[483,512,513],{},[174,514,400],{},[483,516,517,406,519],{},[174,518,492],{},[174,520,521],{},"vehicle_json",[483,523,524],{},"Updated vehicle map as JSON.",[465,526,527,532,539],{},[483,528,529],{},[174,530,531],{},"garage:update",[483,533,534,406,536],{},[174,535,492],{},[174,537,538],{},"vehicles_json",[483,540,541],{},"Replaced vehicle map as JSON.",[465,543,544,548,555],{},[483,545,546],{},[174,547,437],{},[483,549,550,406,552],{},[174,551,492],{},[174,553,554],{},"patch_json",[483,556,524],{},[465,558,559,563,570],{},[483,560,561],{},[174,562,440],{},[483,564,565,406,567],{},[174,566,492],{},[174,568,569],{},"remove_json",[483,571,524],{},[465,573,574,579,583],{},[483,575,576],{},[174,577,578],{},"garage:delete",[483,580,581],{},[174,582,492],{},[483,584,585,416],{},[174,586,587],{},"OK",[465,589,590,595,599],{},[483,591,592],{},[174,593,594],{},"garage:exists",[483,596,597],{},[174,598,492],{},[483,600,601,604,605,416],{},[174,602,603],{},"true"," or ",[174,606,607],{},"false",[159,609,611],{"id":610},"error-handling","Error Handling",[155,613,614,615,618],{},"Every command returns a string payload. Always check for the ",[174,616,617],{},"Error:"," prefix\nbefore parsing JSON.",[167,620,624],{"className":621,"code":622,"language":623,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Garage error: %1\", _payload];\n};\n\nprivate _garage = fromJSON _payload;\n","sqf",[174,625,626,631,636,642,647,652,657,661],{"__ignoreMap":172},[177,627,628],{"class":179,"line":180},[177,629,630],{},"private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\n",[177,632,633],{"class":179,"line":187},[177,634,635],{},"private _payload = _result select 0;\n",[177,637,638],{"class":179,"line":206},[177,639,641],{"emptyLinePlaceholder":640},true,"\n",[177,643,644],{"class":179,"line":231},[177,645,646],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,648,649],{"class":179,"line":252},[177,650,651],{}," systemChat format [\"Garage error: %1\", _payload];\n",[177,653,654],{"class":179,"line":270},[177,655,656],{},"};\n",[177,658,659],{"class":179,"line":287},[177,660,641],{"emptyLinePlaceholder":640},[177,662,663],{"class":179,"line":301},[177,664,665],{},"private _garage = fromJSON _payload;\n",[159,667,669],{"id":668},"add-a-vehicle","Add a Vehicle",[155,671,672,674,675,406,677,406,679,425,681,416],{},[174,673,400],{}," requires ",[174,676,236],{},[174,678,257],{},[174,680,275],{},[174,682,292],{},[167,684,686],{"className":621,"code":685,"language":623,"meta":172,"style":172},"private _hitPointData = getAllHitPointsDamage _vehicle;\nprivate _hitPoints = createHashMapFromArray [\n [\"names\", _hitPointData select 0],\n [\"selections\", _hitPointData select 1],\n [\"values\", _hitPointData select 2]\n];\n\nprivate _vehicleData = createHashMapFromArray [\n [\"classname\", typeOf _vehicle],\n [\"fuel\", fuel _vehicle],\n [\"damage\", damage _vehicle],\n [\"hit_points\", _hitPoints]\n];\n\nprivate _result = \"forge_server\" callExtension [\"garage:add\", [\n getPlayerUID player,\n toJSON _vehicleData\n]];\n\nprivate _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to store vehicle: %1\", _payload];\n};\n\nprivate _garage = fromJSON _payload;\n",[174,687,688,693,698,703,708,713,718,722,727,732,737,742,747,751,756,762,768,774,780,785,790,795,801,806,811],{"__ignoreMap":172},[177,689,690],{"class":179,"line":180},[177,691,692],{},"private _hitPointData = getAllHitPointsDamage _vehicle;\n",[177,694,695],{"class":179,"line":187},[177,696,697],{},"private _hitPoints = createHashMapFromArray [\n",[177,699,700],{"class":179,"line":206},[177,701,702],{}," [\"names\", _hitPointData select 0],\n",[177,704,705],{"class":179,"line":231},[177,706,707],{}," [\"selections\", _hitPointData select 1],\n",[177,709,710],{"class":179,"line":252},[177,711,712],{}," [\"values\", _hitPointData select 2]\n",[177,714,715],{"class":179,"line":270},[177,716,717],{},"];\n",[177,719,720],{"class":179,"line":287},[177,721,641],{"emptyLinePlaceholder":640},[177,723,724],{"class":179,"line":301},[177,725,726],{},"private _vehicleData = createHashMapFromArray [\n",[177,728,729],{"class":179,"line":327},[177,730,731],{}," [\"classname\", typeOf _vehicle],\n",[177,733,734],{"class":179,"line":350},[177,735,736],{}," [\"fuel\", fuel _vehicle],\n",[177,738,739],{"class":179,"line":370},[177,740,741],{}," [\"damage\", damage _vehicle],\n",[177,743,744],{"class":179,"line":376},[177,745,746],{}," [\"hit_points\", _hitPoints]\n",[177,748,749],{"class":179,"line":382},[177,750,717],{},[177,752,754],{"class":179,"line":753},14,[177,755,641],{"emptyLinePlaceholder":640},[177,757,759],{"class":179,"line":758},15,[177,760,761],{},"private _result = \"forge_server\" callExtension [\"garage:add\", [\n",[177,763,765],{"class":179,"line":764},16,[177,766,767],{}," getPlayerUID player,\n",[177,769,771],{"class":179,"line":770},17,[177,772,773],{}," toJSON _vehicleData\n",[177,775,777],{"class":179,"line":776},18,[177,778,779],{},"]];\n",[177,781,783],{"class":179,"line":782},19,[177,784,641],{"emptyLinePlaceholder":640},[177,786,788],{"class":179,"line":787},20,[177,789,635],{},[177,791,793],{"class":179,"line":792},21,[177,794,646],{},[177,796,798],{"class":179,"line":797},22,[177,799,800],{}," hint format [\"Failed to store vehicle: %1\", _payload];\n",[177,802,804],{"class":179,"line":803},23,[177,805,656],{},[177,807,809],{"class":179,"line":808},24,[177,810,641],{"emptyLinePlaceholder":640},[177,812,814],{"class":179,"line":813},25,[177,815,665],{},[155,817,818],{},"The returned value is a hash map keyed by generated plate. To find the newly\nstored vehicle, compare returned keys before and after the add, or search by\nclassname if your workflow guarantees a unique pending vehicle.",[167,820,822],{"className":621,"code":821,"language":623,"meta":172,"style":172},"private _storedPlate = \"\";\n{\n private _vehicleRecord = _garage get _x;\n if ((_vehicleRecord get \"classname\") == typeOf _vehicle) then {\n _storedPlate = _x;\n };\n} forEach keys _garage;\n",[174,823,824,829,833,838,843,848,853],{"__ignoreMap":172},[177,825,826],{"class":179,"line":180},[177,827,828],{},"private _storedPlate = \"\";\n",[177,830,831],{"class":179,"line":187},[177,832,184],{},[177,834,835],{"class":179,"line":206},[177,836,837],{}," private _vehicleRecord = _garage get _x;\n",[177,839,840],{"class":179,"line":231},[177,841,842],{}," if ((_vehicleRecord get \"classname\") == typeOf _vehicle) then {\n",[177,844,845],{"class":179,"line":252},[177,846,847],{}," _storedPlate = _x;\n",[177,849,850],{"class":179,"line":270},[177,851,852],{}," };\n",[177,854,855],{"class":179,"line":287},[177,856,857],{},"} forEach keys _garage;\n",[159,859,861],{"id":860},"patch-a-vehicle","Patch a Vehicle",[155,863,864,866,867,869,870,406,872,425,874,876],{},[174,865,437],{}," updates selected fields for one plate. The ",[174,868,213],{}," field is\nrequired. ",[174,871,257],{},[174,873,275],{},[174,875,292],{}," are optional.",[167,878,880],{"className":621,"code":879,"language":623,"meta":172,"style":172},"private _patch = createHashMapFromArray [\n [\"plate\", _vehicle getVariable [\"forge_garage_plate\", \"\"]],\n [\"fuel\", fuel _vehicle],\n [\"damage\", damage _vehicle]\n];\n\nprivate _result = \"forge_server\" callExtension [\"garage:patch\", [\n getPlayerUID player,\n toJSON _patch\n]];\n",[174,881,882,887,892,896,901,905,909,914,918,923],{"__ignoreMap":172},[177,883,884],{"class":179,"line":180},[177,885,886],{},"private _patch = createHashMapFromArray [\n",[177,888,889],{"class":179,"line":187},[177,890,891],{}," [\"plate\", _vehicle getVariable [\"forge_garage_plate\", \"\"]],\n",[177,893,894],{"class":179,"line":206},[177,895,736],{},[177,897,898],{"class":179,"line":231},[177,899,900],{}," [\"damage\", damage _vehicle]\n",[177,902,903],{"class":179,"line":252},[177,904,717],{},[177,906,907],{"class":179,"line":270},[177,908,641],{"emptyLinePlaceholder":640},[177,910,911],{"class":179,"line":287},[177,912,913],{},"private _result = \"forge_server\" callExtension [\"garage:patch\", [\n",[177,915,916],{"class":179,"line":301},[177,917,767],{},[177,919,920],{"class":179,"line":327},[177,921,922],{}," toJSON _patch\n",[177,924,925],{"class":179,"line":350},[177,926,779],{},[159,928,930],{"id":929},"remove-a-vehicle","Remove a Vehicle",[155,932,933,935,936,938],{},[174,934,440],{}," expects JSON with a ",[174,937,213],{}," field.",[167,940,942],{"className":621,"code":941,"language":623,"meta":172,"style":172},"private _remove = createHashMapFromArray [\n [\"plate\", _plate]\n];\n\nprivate _result = \"forge_server\" callExtension [\"garage:remove\", [\n getPlayerUID player,\n toJSON _remove\n]];\n",[174,943,944,949,954,958,962,967,971,976],{"__ignoreMap":172},[177,945,946],{"class":179,"line":180},[177,947,948],{},"private _remove = createHashMapFromArray [\n",[177,950,951],{"class":179,"line":187},[177,952,953],{}," [\"plate\", _plate]\n",[177,955,956],{"class":179,"line":206},[177,957,717],{},[177,959,960],{"class":179,"line":231},[177,961,641],{"emptyLinePlaceholder":640},[177,963,964],{"class":179,"line":252},[177,965,966],{},"private _result = \"forge_server\" callExtension [\"garage:remove\", [\n",[177,968,969],{"class":179,"line":270},[177,970,767],{},[177,972,973],{"class":179,"line":287},[177,974,975],{}," toJSON _remove\n",[177,977,978],{"class":179,"line":301},[177,979,779],{},[159,981,983],{"id":982},"spawn-a-stored-vehicle","Spawn a Stored Vehicle",[167,985,987],{"className":621,"code":986,"language":623,"meta":172,"style":172},"fnc_spawnGarageVehicle = {\n params [\"_plate\"];\n\n private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\n private _payload = _result select 0;\n\n if (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to load garage: %1\", _payload];\n objNull\n };\n\n private _garage = fromJSON _payload;\n private _vehicleData = _garage getOrDefault [_plate, createHashMap];\n if (_vehicleData isEqualTo createHashMap) exitWith {\n hint \"Vehicle plate was not found in your garage.\";\n objNull\n };\n\n private _vehicle = (_vehicleData get \"classname\") createVehicle (player getPos [10, getDir player]);\n _vehicle setFuel (_vehicleData getOrDefault [\"fuel\", 1]);\n _vehicle setDamage (_vehicleData getOrDefault [\"damage\", 0]);\n _vehicle setVariable [\"forge_garage_plate\", _plate, true];\n\n private _hitPoints = _vehicleData getOrDefault [\"hit_points\", createHashMap];\n private _names = _hitPoints getOrDefault [\"names\", []];\n private _values = _hitPoints getOrDefault [\"values\", []];\n\n {\n _vehicle setHitPointDamage [_x, _values select _forEachIndex];\n } forEach _names;\n\n private _remove = createHashMapFromArray [[\"plate\", _plate]];\n \"forge_server\" callExtension [\"garage:remove\", [getPlayerUID player, toJSON _remove]];\n\n _vehicle\n};\n",[174,988,989,994,999,1003,1008,1013,1017,1022,1027,1032,1036,1040,1045,1050,1055,1060,1064,1068,1072,1077,1082,1087,1092,1096,1101,1106,1112,1117,1123,1129,1135,1140,1146,1152,1157,1163],{"__ignoreMap":172},[177,990,991],{"class":179,"line":180},[177,992,993],{},"fnc_spawnGarageVehicle = {\n",[177,995,996],{"class":179,"line":187},[177,997,998],{}," params [\"_plate\"];\n",[177,1000,1001],{"class":179,"line":206},[177,1002,641],{"emptyLinePlaceholder":640},[177,1004,1005],{"class":179,"line":231},[177,1006,1007],{}," private _result = \"forge_server\" callExtension [\"garage:get\", [getPlayerUID player]];\n",[177,1009,1010],{"class":179,"line":252},[177,1011,1012],{}," private _payload = _result select 0;\n",[177,1014,1015],{"class":179,"line":270},[177,1016,641],{"emptyLinePlaceholder":640},[177,1018,1019],{"class":179,"line":287},[177,1020,1021],{}," if (_payload find \"Error:\" == 0) exitWith {\n",[177,1023,1024],{"class":179,"line":301},[177,1025,1026],{}," hint format [\"Failed to load garage: %1\", _payload];\n",[177,1028,1029],{"class":179,"line":327},[177,1030,1031],{}," objNull\n",[177,1033,1034],{"class":179,"line":350},[177,1035,852],{},[177,1037,1038],{"class":179,"line":370},[177,1039,641],{"emptyLinePlaceholder":640},[177,1041,1042],{"class":179,"line":376},[177,1043,1044],{}," private _garage = fromJSON _payload;\n",[177,1046,1047],{"class":179,"line":382},[177,1048,1049],{}," private _vehicleData = _garage getOrDefault [_plate, createHashMap];\n",[177,1051,1052],{"class":179,"line":753},[177,1053,1054],{}," if (_vehicleData isEqualTo createHashMap) exitWith {\n",[177,1056,1057],{"class":179,"line":758},[177,1058,1059],{}," hint \"Vehicle plate was not found in your garage.\";\n",[177,1061,1062],{"class":179,"line":764},[177,1063,1031],{},[177,1065,1066],{"class":179,"line":770},[177,1067,852],{},[177,1069,1070],{"class":179,"line":776},[177,1071,641],{"emptyLinePlaceholder":640},[177,1073,1074],{"class":179,"line":782},[177,1075,1076],{}," private _vehicle = (_vehicleData get \"classname\") createVehicle (player getPos [10, getDir player]);\n",[177,1078,1079],{"class":179,"line":787},[177,1080,1081],{}," _vehicle setFuel (_vehicleData getOrDefault [\"fuel\", 1]);\n",[177,1083,1084],{"class":179,"line":792},[177,1085,1086],{}," _vehicle setDamage (_vehicleData getOrDefault [\"damage\", 0]);\n",[177,1088,1089],{"class":179,"line":797},[177,1090,1091],{}," _vehicle setVariable [\"forge_garage_plate\", _plate, true];\n",[177,1093,1094],{"class":179,"line":803},[177,1095,641],{"emptyLinePlaceholder":640},[177,1097,1098],{"class":179,"line":808},[177,1099,1100],{}," private _hitPoints = _vehicleData getOrDefault [\"hit_points\", createHashMap];\n",[177,1102,1103],{"class":179,"line":813},[177,1104,1105],{}," private _names = _hitPoints getOrDefault [\"names\", []];\n",[177,1107,1109],{"class":179,"line":1108},26,[177,1110,1111],{}," private _values = _hitPoints getOrDefault [\"values\", []];\n",[177,1113,1115],{"class":179,"line":1114},27,[177,1116,641],{"emptyLinePlaceholder":640},[177,1118,1120],{"class":179,"line":1119},28,[177,1121,1122],{}," {\n",[177,1124,1126],{"class":179,"line":1125},29,[177,1127,1128],{}," _vehicle setHitPointDamage [_x, _values select _forEachIndex];\n",[177,1130,1132],{"class":179,"line":1131},30,[177,1133,1134],{}," } forEach _names;\n",[177,1136,1138],{"class":179,"line":1137},31,[177,1139,641],{"emptyLinePlaceholder":640},[177,1141,1143],{"class":179,"line":1142},32,[177,1144,1145],{}," private _remove = createHashMapFromArray [[\"plate\", _plate]];\n",[177,1147,1149],{"class":179,"line":1148},33,[177,1150,1151],{}," \"forge_server\" callExtension [\"garage:remove\", [getPlayerUID player, toJSON _remove]];\n",[177,1153,1155],{"class":179,"line":1154},34,[177,1156,641],{"emptyLinePlaceholder":640},[177,1158,1160],{"class":179,"line":1159},35,[177,1161,1162],{}," _vehicle\n",[177,1164,1166],{"class":179,"line":1165},36,[177,1167,656],{},[159,1169,1171],{"id":1170},"hot-state","Hot State",[155,1173,1174,1175,1178,1179,1182],{},"The ",[174,1176,1177],{},"garage:hot:*"," commands keep a runtime copy of a player's garage and write\nit back only when ",[174,1180,1181],{},"garage:hot:save"," runs.",[459,1184,1185,1195],{},[462,1186,1187],{},[465,1188,1189,1191,1193],{},[468,1190,470],{},[468,1192,473],{},[468,1194,476],{},[478,1196,1197,1210,1223,1238,1253,1268,1281],{},[465,1198,1199,1204,1208],{},[483,1200,1201],{},[174,1202,1203],{},"garage:hot:init",[483,1205,1206],{},[174,1207,492],{},[483,1209,508],{},[465,1211,1212,1217,1221],{},[483,1213,1214],{},[174,1215,1216],{},"garage:hot:get",[483,1218,1219],{},[174,1220,492],{},[483,1222,508],{},[465,1224,1225,1230,1236],{},[483,1226,1227],{},[174,1228,1229],{},"garage:hot:override",[483,1231,1232,406,1234],{},[174,1233,492],{},[174,1235,538],{},[483,1237,508],{},[465,1239,1240,1245,1251],{},[483,1241,1242],{},[174,1243,1244],{},"garage:hot:add",[483,1246,1247,406,1249],{},[174,1248,492],{},[174,1250,521],{},[483,1252,508],{},[465,1254,1255,1260,1266],{},[483,1256,1257],{},[174,1258,1259],{},"garage:hot:remove_vehicle",[483,1261,1262,406,1264],{},[174,1263,492],{},[174,1265,569],{},[483,1267,508],{},[465,1269,1270,1274,1278],{},[483,1271,1272],{},[174,1273,1181],{},[483,1275,1276],{},[174,1277,492],{},[483,1279,1280],{},"Current hot vehicle map as JSON.",[465,1282,1283,1288,1292],{},[483,1284,1285],{},[174,1286,1287],{},"garage:hot:remove",[483,1289,1290],{},[174,1291,492],{},[483,1293,1294,416],{},[174,1295,587],{},[155,1297,1298],{},"Use hot state for session-heavy vehicle workflows. Use the durable commands for\nsimple store\u002Fretrieve operations.",[159,1300,1302],{"id":1301},"best-practices","Best Practices",[390,1304,1305,1311,1317,1322,1328],{},[393,1306,1307,1308,416],{},"Store the generated plate on spawned vehicles with ",[174,1309,1310],{},"setVariable",[393,1312,1313,1314,1316],{},"Use ",[174,1315,437],{}," for frequent fuel and damage syncs.",[393,1318,1313,1319,1321],{},[174,1320,531],{}," only when replacing the whole vehicle map intentionally.",[393,1323,1324,1325,1327],{},"Do not delete the world vehicle until ",[174,1326,400],{}," succeeds.",[393,1329,1330],{},"Treat vehicle maps as hash maps keyed by plate, not arrays.",[1332,1333,1334],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":1336},[1337,1338,1339,1340,1341,1342,1343,1344,1345],{"id":161,"depth":187,"text":162},{"id":449,"depth":187,"text":450},{"id":610,"depth":187,"text":611},{"id":668,"depth":187,"text":669},{"id":860,"depth":187,"text":861},{"id":929,"depth":187,"text":930},{"id":982,"depth":187,"text":983},{"id":1170,"depth":187,"text":1171},{"id":1301,"depth":187,"text":1302},"md",null,{},{"title":73,"description":157},"EH_wB2YH4wCw-T1stsEVmDq0ztTnbpLjX9816UfP4Vk",[1352,1354],{"title":69,"path":70,"stem":71,"description":1353,"children":-1},"The economy server addon owns Arma-world service behavior for fuel, medical,\nand repair interactions. It does not own money state. Money mutations go\nthrough extension-backed bank and organization hot state before the world\neffect is applied.",{"title":77,"path":78,"stem":79,"description":1355,"children":-1},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\nOwned Storage Usage Guide.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/locker.html b/docus/dist/server-modules/locker.html index 0ba5232..a18bc22 100644 --- a/docus/dist/server-modules/locker.html +++ b/docus/dist/server-modules/locker.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Locker Usage Guide - forge-docus

    Organization Usage Guide

    The organization module stores organization records, members, assets, fleet entries, and credit lines. Durable commands manage persisted records directly. -Hot-state commands support the active organization UI workflows.

    \ No newline at end of file +Hot-state commands support the active organization UI workflows.

    \ No newline at end of file diff --git a/docus/dist/server-modules/locker/_payload.json b/docus/dist/server-modules/locker/_payload.json index 7f56c40..26ae8fb 100644 --- a/docus/dist/server-modules/locker/_payload.json +++ b/docus/dist/server-modules/locker/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1212},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-locker":145,"-server-modules-locker-surround":1207},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":77,"body":147,"description":1201,"extension":1202,"links":1203,"meta":1204,"navigation":525,"path":78,"seo":1205,"stem":79,"__hash__":1206},"docs\u002F3.server-modules\u002F6.locker.md",{"type":148,"value":149,"toc":1189},"minimark",[150,154,162,167,170,282,285,333,337,344,493,497,504,552,556,561,653,657,665,710,714,719,742,746,976,980,985,1046,1050,1061,1144,1147,1151,1185],[151,152,77],"h1",{"id":153},"locker-usage-guide",[155,156,157,158,161],"p",{},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\n",[159,160,85],"a",{"href":86},".",[163,164,166],"h2",{"id":165},"storage-model","Storage Model",[155,168,169],{},"Locker data is persisted through SurrealDB by the server extension.",[171,172,177],"pre",{"className":173,"code":174,"language":175,"meta":176,"style":176},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"arifle_MX_F\": {\n \"category\": \"weapon\",\n \"classname\": \"arifle_MX_F\",\n \"amount\": 1\n }\n}\n","json","",[178,179,180,189,208,234,254,270,276],"code",{"__ignoreMap":176},[181,182,185],"span",{"class":183,"line":184},"line",1,[181,186,188],{"class":187},"sMK4o","{\n",[181,190,192,195,199,202,205],{"class":183,"line":191},2,[181,193,194],{"class":187}," \"",[181,196,198],{"class":197},"spNyl","arifle_MX_F",[181,200,201],{"class":187},"\"",[181,203,204],{"class":187},":",[181,206,207],{"class":187}," {\n",[181,209,211,214,218,220,222,225,229,231],{"class":183,"line":210},3,[181,212,213],{"class":187}," \"",[181,215,217],{"class":216},"sBMFI","category",[181,219,201],{"class":187},[181,221,204],{"class":187},[181,223,224],{"class":187}," \"",[181,226,228],{"class":227},"sfazB","weapon",[181,230,201],{"class":187},[181,232,233],{"class":187},",\n",[181,235,237,239,242,244,246,248,250,252],{"class":183,"line":236},4,[181,238,213],{"class":187},[181,240,241],{"class":216},"classname",[181,243,201],{"class":187},[181,245,204],{"class":187},[181,247,224],{"class":187},[181,249,198],{"class":227},[181,251,201],{"class":187},[181,253,233],{"class":187},[181,255,257,259,262,264,266],{"class":183,"line":256},5,[181,258,213],{"class":187},[181,260,261],{"class":216},"amount",[181,263,201],{"class":187},[181,265,204],{"class":187},[181,267,269],{"class":268},"sbssI"," 1\n",[181,271,273],{"class":183,"line":272},6,[181,274,275],{"class":187}," }\n",[181,277,279],{"class":183,"line":278},7,[181,280,281],{"class":187},"}\n",[155,283,284],{},"Rules validated by the Rust service:",[286,287,288,292,300,308,314,328],"ul",{},[289,290,291],"li",{},"A locker can contain up to 25 unique classnames.",[289,293,294,296,297,299],{},[178,295,217],{}," and ",[178,298,241],{}," cannot be empty.",[289,301,302,304,305,161],{},[178,303,261],{}," must be greater than ",[178,306,307],{},"0",[289,309,310,313],{},[178,311,312],{},"locker:add"," creates an empty locker automatically when one does not exist.",[289,315,316,319,320,323,324,327],{},[178,317,318],{},"locker:get",", ",[178,321,322],{},"locker:patch",", and ",[178,325,326],{},"locker:remove"," require an existing locker.",[289,329,330,332],{},[178,331,326],{}," takes the classname directly, not a JSON object.",[163,334,336],{"id":335},"commands","Commands",[155,338,339,340,343],{},"All commands are called on the ",[178,341,342],{},"locker"," group.",[345,346,347,363],"table",{},[348,349,350],"thead",{},[351,352,353,357,360],"tr",{},[354,355,356],"th",{},"Command",[354,358,359],{},"Arguments",[354,361,362],{},"Returns",[364,365,366,382,395,411,428,443,457,473],"tbody",{},[351,367,368,374,379],{},[369,370,371],"td",{},[178,372,373],{},"locker:create",[369,375,376],{},[178,377,378],{},"uid",[369,380,381],{},"Empty item map as JSON.",[351,383,384,388,392],{},[369,385,386],{},[178,387,318],{},[369,389,390],{},[178,391,378],{},[369,393,394],{},"Item map as JSON.",[351,396,397,401,408],{},[369,398,399],{},[178,400,312],{},[369,402,403,319,405],{},[178,404,378],{},[178,406,407],{},"item_json",[369,409,410],{},"Updated item map as JSON.",[351,412,413,418,425],{},[369,414,415],{},[178,416,417],{},"locker:update",[369,419,420,319,422],{},[178,421,378],{},[178,423,424],{},"items_json",[369,426,427],{},"Replaced item map as JSON.",[351,429,430,434,441],{},[369,431,432],{},[178,433,322],{},[369,435,436,319,438],{},[178,437,378],{},[178,439,440],{},"patch_json",[369,442,410],{},[351,444,445,449,455],{},[369,446,447],{},[178,448,326],{},[369,450,451,319,453],{},[178,452,378],{},[178,454,241],{},[369,456,410],{},[351,458,459,464,468],{},[369,460,461],{},[178,462,463],{},"locker:delete",[369,465,466],{},[178,467,378],{},[369,469,470,161],{},[178,471,472],{},"OK",[351,474,475,480,484],{},[369,476,477],{},[178,478,479],{},"locker:exists",[369,481,482],{},[178,483,378],{},[369,485,486,489,490,161],{},[178,487,488],{},"true"," or ",[178,491,492],{},"false",[163,494,496],{"id":495},"error-handling","Error Handling",[155,498,499,500,503],{},"Every command returns a string payload. Always check for the ",[178,501,502],{},"Error:"," prefix\nbefore parsing JSON.",[171,505,509],{"className":506,"code":507,"language":508,"meta":176,"style":176},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Locker error: %1\", _payload];\n};\n\nprivate _locker = fromJSON _payload;\n","sqf",[178,510,511,516,521,527,532,537,542,546],{"__ignoreMap":176},[181,512,513],{"class":183,"line":184},[181,514,515],{},"private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\n",[181,517,518],{"class":183,"line":191},[181,519,520],{},"private _payload = _result select 0;\n",[181,522,523],{"class":183,"line":210},[181,524,526],{"emptyLinePlaceholder":525},true,"\n",[181,528,529],{"class":183,"line":236},[181,530,531],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[181,533,534],{"class":183,"line":256},[181,535,536],{}," systemChat format [\"Locker error: %1\", _payload];\n",[181,538,539],{"class":183,"line":272},[181,540,541],{},"};\n",[181,543,544],{"class":183,"line":278},[181,545,526],{"emptyLinePlaceholder":525},[181,547,549],{"class":183,"line":548},8,[181,550,551],{},"private _locker = fromJSON _payload;\n",[163,553,555],{"id":554},"add-an-item","Add an Item",[155,557,558,560],{},[178,559,312],{}," creates or overwrites one classname entry.",[171,562,564],{"className":506,"code":563,"language":508,"meta":176,"style":176},"private _item = createHashMapFromArray [\n [\"category\", \"weapon\"],\n [\"classname\", \"arifle_MX_F\"],\n [\"amount\", 1]\n];\n\nprivate _result = \"forge_server\" callExtension [\"locker:add\", [\n getPlayerUID player,\n toJSON _item\n]];\n\nprivate _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to store item: %1\", _payload];\n};\n\nprivate _locker = fromJSON _payload;\n",[178,565,566,571,576,581,586,591,595,600,605,611,617,622,627,632,638,643,648],{"__ignoreMap":176},[181,567,568],{"class":183,"line":184},[181,569,570],{},"private _item = createHashMapFromArray [\n",[181,572,573],{"class":183,"line":191},[181,574,575],{}," [\"category\", \"weapon\"],\n",[181,577,578],{"class":183,"line":210},[181,579,580],{}," [\"classname\", \"arifle_MX_F\"],\n",[181,582,583],{"class":183,"line":236},[181,584,585],{}," [\"amount\", 1]\n",[181,587,588],{"class":183,"line":256},[181,589,590],{},"];\n",[181,592,593],{"class":183,"line":272},[181,594,526],{"emptyLinePlaceholder":525},[181,596,597],{"class":183,"line":278},[181,598,599],{},"private _result = \"forge_server\" callExtension [\"locker:add\", [\n",[181,601,602],{"class":183,"line":548},[181,603,604],{}," getPlayerUID player,\n",[181,606,608],{"class":183,"line":607},9,[181,609,610],{}," toJSON _item\n",[181,612,614],{"class":183,"line":613},10,[181,615,616],{},"]];\n",[181,618,620],{"class":183,"line":619},11,[181,621,526],{"emptyLinePlaceholder":525},[181,623,625],{"class":183,"line":624},12,[181,626,520],{},[181,628,630],{"class":183,"line":629},13,[181,631,531],{},[181,633,635],{"class":183,"line":634},14,[181,636,637],{}," hint format [\"Failed to store item: %1\", _payload];\n",[181,639,641],{"class":183,"line":640},15,[181,642,541],{},[181,644,646],{"class":183,"line":645},16,[181,647,526],{"emptyLinePlaceholder":525},[181,649,651],{"class":183,"line":650},17,[181,652,551],{},[163,654,656],{"id":655},"patch-an-amount","Patch an Amount",[155,658,659,661,662,664],{},[178,660,322],{}," currently patches the ",[178,663,261],{}," field for an existing classname.",[171,666,668],{"className":506,"code":667,"language":508,"meta":176,"style":176},"private _patch = createHashMapFromArray [\n [\"classname\", \"arifle_MX_F\"],\n [\"amount\", 5]\n];\n\nprivate _result = \"forge_server\" callExtension [\"locker:patch\", [\n getPlayerUID player,\n toJSON _patch\n]];\n",[178,669,670,675,679,684,688,692,697,701,706],{"__ignoreMap":176},[181,671,672],{"class":183,"line":184},[181,673,674],{},"private _patch = createHashMapFromArray [\n",[181,676,677],{"class":183,"line":191},[181,678,580],{},[181,680,681],{"class":183,"line":210},[181,682,683],{}," [\"amount\", 5]\n",[181,685,686],{"class":183,"line":236},[181,687,590],{},[181,689,690],{"class":183,"line":256},[181,691,526],{"emptyLinePlaceholder":525},[181,693,694],{"class":183,"line":272},[181,695,696],{},"private _result = \"forge_server\" callExtension [\"locker:patch\", [\n",[181,698,699],{"class":183,"line":278},[181,700,604],{},[181,702,703],{"class":183,"line":548},[181,704,705],{}," toJSON _patch\n",[181,707,708],{"class":183,"line":607},[181,709,616],{},[163,711,713],{"id":712},"remove-an-item","Remove an Item",[155,715,716,718],{},[178,717,326],{}," takes the classname as the second argument.",[171,720,722],{"className":506,"code":721,"language":508,"meta":176,"style":176},"private _result = \"forge_server\" callExtension [\"locker:remove\", [\n getPlayerUID player,\n \"arifle_MX_F\"\n]];\n",[178,723,724,729,733,738],{"__ignoreMap":176},[181,725,726],{"class":183,"line":184},[181,727,728],{},"private _result = \"forge_server\" callExtension [\"locker:remove\", [\n",[181,730,731],{"class":183,"line":191},[181,732,604],{},[181,734,735],{"class":183,"line":210},[181,736,737],{}," \"arifle_MX_F\"\n",[181,739,740],{"class":183,"line":236},[181,741,616],{},[163,743,745],{"id":744},"retrieve-an-item","Retrieve an Item",[171,747,749],{"className":506,"code":748,"language":508,"meta":176,"style":176},"fnc_retrieveLockerItem = {\n params [\"_classname\"];\n\n private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\n private _payload = _result select 0;\n\n if (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to load locker: %1\", _payload];\n false\n };\n\n private _locker = fromJSON _payload;\n private _item = _locker getOrDefault [_classname, createHashMap];\n if (_item isEqualTo createHashMap) exitWith {\n hint \"Item was not found in your locker.\";\n false\n };\n\n private _amount = _item getOrDefault [\"amount\", 0];\n if (_amount \u003C= 0) exitWith {\n hint \"Item is out of stock.\";\n false\n };\n\n if !(player canAdd _classname) exitWith {\n hint \"Not enough inventory space.\";\n false\n };\n\n player addItem _classname;\n\n if (_amount > 1) then {\n private _patch = createHashMapFromArray [\n [\"classname\", _classname],\n [\"amount\", _amount - 1]\n ];\n \"forge_server\" callExtension [\"locker:patch\", [getPlayerUID player, toJSON _patch]];\n } else {\n \"forge_server\" callExtension [\"locker:remove\", [getPlayerUID player, _classname]];\n };\n\n true\n};\n",[178,750,751,756,761,765,770,775,779,784,789,794,799,803,808,813,818,823,827,831,836,842,848,854,859,864,869,875,881,886,891,896,902,907,913,919,925,931,937,943,949,955,960,965,971],{"__ignoreMap":176},[181,752,753],{"class":183,"line":184},[181,754,755],{},"fnc_retrieveLockerItem = {\n",[181,757,758],{"class":183,"line":191},[181,759,760],{}," params [\"_classname\"];\n",[181,762,763],{"class":183,"line":210},[181,764,526],{"emptyLinePlaceholder":525},[181,766,767],{"class":183,"line":236},[181,768,769],{}," private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\n",[181,771,772],{"class":183,"line":256},[181,773,774],{}," private _payload = _result select 0;\n",[181,776,777],{"class":183,"line":272},[181,778,526],{"emptyLinePlaceholder":525},[181,780,781],{"class":183,"line":278},[181,782,783],{}," if (_payload find \"Error:\" == 0) exitWith {\n",[181,785,786],{"class":183,"line":548},[181,787,788],{}," hint format [\"Failed to load locker: %1\", _payload];\n",[181,790,791],{"class":183,"line":607},[181,792,793],{}," false\n",[181,795,796],{"class":183,"line":613},[181,797,798],{}," };\n",[181,800,801],{"class":183,"line":619},[181,802,526],{"emptyLinePlaceholder":525},[181,804,805],{"class":183,"line":624},[181,806,807],{}," private _locker = fromJSON _payload;\n",[181,809,810],{"class":183,"line":629},[181,811,812],{}," private _item = _locker getOrDefault [_classname, createHashMap];\n",[181,814,815],{"class":183,"line":634},[181,816,817],{}," if (_item isEqualTo createHashMap) exitWith {\n",[181,819,820],{"class":183,"line":640},[181,821,822],{}," hint \"Item was not found in your locker.\";\n",[181,824,825],{"class":183,"line":645},[181,826,793],{},[181,828,829],{"class":183,"line":650},[181,830,798],{},[181,832,834],{"class":183,"line":833},18,[181,835,526],{"emptyLinePlaceholder":525},[181,837,839],{"class":183,"line":838},19,[181,840,841],{}," private _amount = _item getOrDefault [\"amount\", 0];\n",[181,843,845],{"class":183,"line":844},20,[181,846,847],{}," if (_amount \u003C= 0) exitWith {\n",[181,849,851],{"class":183,"line":850},21,[181,852,853],{}," hint \"Item is out of stock.\";\n",[181,855,857],{"class":183,"line":856},22,[181,858,793],{},[181,860,862],{"class":183,"line":861},23,[181,863,798],{},[181,865,867],{"class":183,"line":866},24,[181,868,526],{"emptyLinePlaceholder":525},[181,870,872],{"class":183,"line":871},25,[181,873,874],{}," if !(player canAdd _classname) exitWith {\n",[181,876,878],{"class":183,"line":877},26,[181,879,880],{}," hint \"Not enough inventory space.\";\n",[181,882,884],{"class":183,"line":883},27,[181,885,793],{},[181,887,889],{"class":183,"line":888},28,[181,890,798],{},[181,892,894],{"class":183,"line":893},29,[181,895,526],{"emptyLinePlaceholder":525},[181,897,899],{"class":183,"line":898},30,[181,900,901],{}," player addItem _classname;\n",[181,903,905],{"class":183,"line":904},31,[181,906,526],{"emptyLinePlaceholder":525},[181,908,910],{"class":183,"line":909},32,[181,911,912],{}," if (_amount > 1) then {\n",[181,914,916],{"class":183,"line":915},33,[181,917,918],{}," private _patch = createHashMapFromArray [\n",[181,920,922],{"class":183,"line":921},34,[181,923,924],{}," [\"classname\", _classname],\n",[181,926,928],{"class":183,"line":927},35,[181,929,930],{}," [\"amount\", _amount - 1]\n",[181,932,934],{"class":183,"line":933},36,[181,935,936],{}," ];\n",[181,938,940],{"class":183,"line":939},37,[181,941,942],{}," \"forge_server\" callExtension [\"locker:patch\", [getPlayerUID player, toJSON _patch]];\n",[181,944,946],{"class":183,"line":945},38,[181,947,948],{}," } else {\n",[181,950,952],{"class":183,"line":951},39,[181,953,954],{}," \"forge_server\" callExtension [\"locker:remove\", [getPlayerUID player, _classname]];\n",[181,956,958],{"class":183,"line":957},40,[181,959,798],{},[181,961,963],{"class":183,"line":962},41,[181,964,526],{"emptyLinePlaceholder":525},[181,966,968],{"class":183,"line":967},42,[181,969,970],{}," true\n",[181,972,974],{"class":183,"line":973},43,[181,975,541],{},[163,977,979],{"id":978},"replace-the-whole-locker","Replace the Whole Locker",[155,981,982,984],{},[178,983,417],{}," replaces the whole item map. Use it for explicit bulk syncs,\nnot single-item changes.",[171,986,988],{"className":506,"code":987,"language":508,"meta":176,"style":176},"private _items = createHashMapFromArray [\n [\"arifle_MX_F\", createHashMapFromArray [\n [\"category\", \"weapon\"],\n [\"classname\", \"arifle_MX_F\"],\n [\"amount\", 1]\n ]]\n];\n\nprivate _result = \"forge_server\" callExtension [\"locker:update\", [\n getPlayerUID player,\n toJSON _items\n]];\n",[178,989,990,995,1000,1005,1010,1015,1020,1024,1028,1033,1037,1042],{"__ignoreMap":176},[181,991,992],{"class":183,"line":184},[181,993,994],{},"private _items = createHashMapFromArray [\n",[181,996,997],{"class":183,"line":191},[181,998,999],{}," [\"arifle_MX_F\", createHashMapFromArray [\n",[181,1001,1002],{"class":183,"line":210},[181,1003,1004],{}," [\"category\", \"weapon\"],\n",[181,1006,1007],{"class":183,"line":236},[181,1008,1009],{}," [\"classname\", \"arifle_MX_F\"],\n",[181,1011,1012],{"class":183,"line":256},[181,1013,1014],{}," [\"amount\", 1]\n",[181,1016,1017],{"class":183,"line":272},[181,1018,1019],{}," ]]\n",[181,1021,1022],{"class":183,"line":278},[181,1023,590],{},[181,1025,1026],{"class":183,"line":548},[181,1027,526],{"emptyLinePlaceholder":525},[181,1029,1030],{"class":183,"line":607},[181,1031,1032],{},"private _result = \"forge_server\" callExtension [\"locker:update\", [\n",[181,1034,1035],{"class":183,"line":613},[181,1036,604],{},[181,1038,1039],{"class":183,"line":619},[181,1040,1041],{}," toJSON _items\n",[181,1043,1044],{"class":183,"line":624},[181,1045,616],{},[163,1047,1049],{"id":1048},"hot-state","Hot State",[155,1051,1052,1053,1056,1057,1060],{},"The ",[178,1054,1055],{},"locker:hot:*"," commands keep a runtime copy of a player's locker and write\nit back only when ",[178,1058,1059],{},"locker:hot:save"," runs.",[345,1062,1063,1073],{},[348,1064,1065],{},[351,1066,1067,1069,1071],{},[354,1068,356],{},[354,1070,359],{},[354,1072,362],{},[364,1074,1075,1088,1101,1116,1129],{},[351,1076,1077,1082,1086],{},[369,1078,1079],{},[178,1080,1081],{},"locker:hot:init",[369,1083,1084],{},[178,1085,378],{},[369,1087,394],{},[351,1089,1090,1095,1099],{},[369,1091,1092],{},[178,1093,1094],{},"locker:hot:get",[369,1096,1097],{},[178,1098,378],{},[369,1100,394],{},[351,1102,1103,1108,1114],{},[369,1104,1105],{},[178,1106,1107],{},"locker:hot:override",[369,1109,1110,319,1112],{},[178,1111,378],{},[178,1113,424],{},[369,1115,394],{},[351,1117,1118,1122,1126],{},[369,1119,1120],{},[178,1121,1059],{},[369,1123,1124],{},[178,1125,378],{},[369,1127,1128],{},"Current hot item map as JSON.",[351,1130,1131,1136,1140],{},[369,1132,1133],{},[178,1134,1135],{},"locker:hot:remove",[369,1137,1138],{},[178,1139,378],{},[369,1141,1142,161],{},[178,1143,472],{},[155,1145,1146],{},"Use hot state for session-heavy locker workflows. Use the durable commands for\nsimple item deposits and withdrawals.",[163,1148,1150],{"id":1149},"best-practices","Best Practices",[286,1152,1153,1168,1174,1179,1182],{},[289,1154,1155,1156,319,1158,319,1161,1164,1165,161],{},"Keep categories normalized, for example ",[178,1157,228],{},[178,1159,1160],{},"magazine",[178,1162,1163],{},"item",", or\n",[178,1166,1167],{},"backpack",[289,1169,1170,1171,1173],{},"Use ",[178,1172,322],{}," for quantity changes.",[289,1175,1170,1176,1178],{},[178,1177,326],{}," when quantity reaches zero.",[289,1180,1181],{},"Treat the locker response as a hash map keyed by classname.",[289,1183,1184],{},"Check capacity before bulk operations that may exceed 25 unique items.",[1186,1187,1188],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":176,"searchDepth":191,"depth":191,"links":1190},[1191,1192,1193,1194,1195,1196,1197,1198,1199,1200],{"id":165,"depth":191,"text":166},{"id":335,"depth":191,"text":336},{"id":495,"depth":191,"text":496},{"id":554,"depth":191,"text":555},{"id":655,"depth":191,"text":656},{"id":712,"depth":191,"text":713},{"id":744,"depth":191,"text":745},{"id":978,"depth":191,"text":979},{"id":1048,"depth":191,"text":1049},{"id":1149,"depth":191,"text":1150},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\nOwned Storage Usage Guide.","md",null,{},{"title":77,"description":1201},"yRC1-bz2AkCaQBkRxr04sEYnq81grmtAwyDVDqAvkaM",[1208,1210],{"title":73,"path":74,"stem":75,"description":1209,"children":-1},"The garage module stores physical player vehicles. Each record keeps the\nvehicle classname, generated plate UUID, fuel, overall damage, and detailed hit\npoint damage.",{"title":81,"path":82,"stem":83,"description":1211,"children":-1},"The organization module stores organization records, members, assets, fleet\nentries, and credit lines. Durable commands manage persisted records directly.\nHot-state commands support the active organization UI workflows.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1212},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-locker":145,"-server-modules-locker-surround":1207},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":77,"body":147,"description":1201,"extension":1202,"links":1203,"meta":1204,"navigation":525,"path":78,"seo":1205,"stem":79,"__hash__":1206},"docs\u002F3.server-modules\u002F6.locker.md",{"type":148,"value":149,"toc":1189},"minimark",[150,154,162,167,170,282,285,333,337,344,493,497,504,552,556,561,653,657,665,710,714,719,742,746,976,980,985,1046,1050,1061,1144,1147,1151,1185],[151,152,77],"h1",{"id":153},"locker-usage-guide",[155,156,157,158,161],"p",{},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\n",[159,160,85],"a",{"href":86},".",[163,164,166],"h2",{"id":165},"storage-model","Storage Model",[155,168,169],{},"Locker data is persisted through SurrealDB by the server extension.",[171,172,177],"pre",{"className":173,"code":174,"language":175,"meta":176,"style":176},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"arifle_MX_F\": {\n \"category\": \"weapon\",\n \"classname\": \"arifle_MX_F\",\n \"amount\": 1\n }\n}\n","json","",[178,179,180,189,208,234,254,270,276],"code",{"__ignoreMap":176},[181,182,185],"span",{"class":183,"line":184},"line",1,[181,186,188],{"class":187},"sMK4o","{\n",[181,190,192,195,199,202,205],{"class":183,"line":191},2,[181,193,194],{"class":187}," \"",[181,196,198],{"class":197},"spNyl","arifle_MX_F",[181,200,201],{"class":187},"\"",[181,203,204],{"class":187},":",[181,206,207],{"class":187}," {\n",[181,209,211,214,218,220,222,225,229,231],{"class":183,"line":210},3,[181,212,213],{"class":187}," \"",[181,215,217],{"class":216},"sBMFI","category",[181,219,201],{"class":187},[181,221,204],{"class":187},[181,223,224],{"class":187}," \"",[181,226,228],{"class":227},"sfazB","weapon",[181,230,201],{"class":187},[181,232,233],{"class":187},",\n",[181,235,237,239,242,244,246,248,250,252],{"class":183,"line":236},4,[181,238,213],{"class":187},[181,240,241],{"class":216},"classname",[181,243,201],{"class":187},[181,245,204],{"class":187},[181,247,224],{"class":187},[181,249,198],{"class":227},[181,251,201],{"class":187},[181,253,233],{"class":187},[181,255,257,259,262,264,266],{"class":183,"line":256},5,[181,258,213],{"class":187},[181,260,261],{"class":216},"amount",[181,263,201],{"class":187},[181,265,204],{"class":187},[181,267,269],{"class":268},"sbssI"," 1\n",[181,271,273],{"class":183,"line":272},6,[181,274,275],{"class":187}," }\n",[181,277,279],{"class":183,"line":278},7,[181,280,281],{"class":187},"}\n",[155,283,284],{},"Rules validated by the Rust service:",[286,287,288,292,300,308,314,328],"ul",{},[289,290,291],"li",{},"A locker can contain up to 25 unique classnames.",[289,293,294,296,297,299],{},[178,295,217],{}," and ",[178,298,241],{}," cannot be empty.",[289,301,302,304,305,161],{},[178,303,261],{}," must be greater than ",[178,306,307],{},"0",[289,309,310,313],{},[178,311,312],{},"locker:add"," creates an empty locker automatically when one does not exist.",[289,315,316,319,320,323,324,327],{},[178,317,318],{},"locker:get",", ",[178,321,322],{},"locker:patch",", and ",[178,325,326],{},"locker:remove"," require an existing locker.",[289,329,330,332],{},[178,331,326],{}," takes the classname directly, not a JSON object.",[163,334,336],{"id":335},"commands","Commands",[155,338,339,340,343],{},"All commands are called on the ",[178,341,342],{},"locker"," group.",[345,346,347,363],"table",{},[348,349,350],"thead",{},[351,352,353,357,360],"tr",{},[354,355,356],"th",{},"Command",[354,358,359],{},"Arguments",[354,361,362],{},"Returns",[364,365,366,382,395,411,428,443,457,473],"tbody",{},[351,367,368,374,379],{},[369,370,371],"td",{},[178,372,373],{},"locker:create",[369,375,376],{},[178,377,378],{},"uid",[369,380,381],{},"Empty item map as JSON.",[351,383,384,388,392],{},[369,385,386],{},[178,387,318],{},[369,389,390],{},[178,391,378],{},[369,393,394],{},"Item map as JSON.",[351,396,397,401,408],{},[369,398,399],{},[178,400,312],{},[369,402,403,319,405],{},[178,404,378],{},[178,406,407],{},"item_json",[369,409,410],{},"Updated item map as JSON.",[351,412,413,418,425],{},[369,414,415],{},[178,416,417],{},"locker:update",[369,419,420,319,422],{},[178,421,378],{},[178,423,424],{},"items_json",[369,426,427],{},"Replaced item map as JSON.",[351,429,430,434,441],{},[369,431,432],{},[178,433,322],{},[369,435,436,319,438],{},[178,437,378],{},[178,439,440],{},"patch_json",[369,442,410],{},[351,444,445,449,455],{},[369,446,447],{},[178,448,326],{},[369,450,451,319,453],{},[178,452,378],{},[178,454,241],{},[369,456,410],{},[351,458,459,464,468],{},[369,460,461],{},[178,462,463],{},"locker:delete",[369,465,466],{},[178,467,378],{},[369,469,470,161],{},[178,471,472],{},"OK",[351,474,475,480,484],{},[369,476,477],{},[178,478,479],{},"locker:exists",[369,481,482],{},[178,483,378],{},[369,485,486,489,490,161],{},[178,487,488],{},"true"," or ",[178,491,492],{},"false",[163,494,496],{"id":495},"error-handling","Error Handling",[155,498,499,500,503],{},"Every command returns a string payload. Always check for the ",[178,501,502],{},"Error:"," prefix\nbefore parsing JSON.",[171,505,509],{"className":506,"code":507,"language":508,"meta":176,"style":176},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Locker error: %1\", _payload];\n};\n\nprivate _locker = fromJSON _payload;\n","sqf",[178,510,511,516,521,527,532,537,542,546],{"__ignoreMap":176},[181,512,513],{"class":183,"line":184},[181,514,515],{},"private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\n",[181,517,518],{"class":183,"line":191},[181,519,520],{},"private _payload = _result select 0;\n",[181,522,523],{"class":183,"line":210},[181,524,526],{"emptyLinePlaceholder":525},true,"\n",[181,528,529],{"class":183,"line":236},[181,530,531],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[181,533,534],{"class":183,"line":256},[181,535,536],{}," systemChat format [\"Locker error: %1\", _payload];\n",[181,538,539],{"class":183,"line":272},[181,540,541],{},"};\n",[181,543,544],{"class":183,"line":278},[181,545,526],{"emptyLinePlaceholder":525},[181,547,549],{"class":183,"line":548},8,[181,550,551],{},"private _locker = fromJSON _payload;\n",[163,553,555],{"id":554},"add-an-item","Add an Item",[155,557,558,560],{},[178,559,312],{}," creates or overwrites one classname entry.",[171,562,564],{"className":506,"code":563,"language":508,"meta":176,"style":176},"private _item = createHashMapFromArray [\n [\"category\", \"weapon\"],\n [\"classname\", \"arifle_MX_F\"],\n [\"amount\", 1]\n];\n\nprivate _result = \"forge_server\" callExtension [\"locker:add\", [\n getPlayerUID player,\n toJSON _item\n]];\n\nprivate _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to store item: %1\", _payload];\n};\n\nprivate _locker = fromJSON _payload;\n",[178,565,566,571,576,581,586,591,595,600,605,611,617,622,627,632,638,643,648],{"__ignoreMap":176},[181,567,568],{"class":183,"line":184},[181,569,570],{},"private _item = createHashMapFromArray [\n",[181,572,573],{"class":183,"line":191},[181,574,575],{}," [\"category\", \"weapon\"],\n",[181,577,578],{"class":183,"line":210},[181,579,580],{}," [\"classname\", \"arifle_MX_F\"],\n",[181,582,583],{"class":183,"line":236},[181,584,585],{}," [\"amount\", 1]\n",[181,587,588],{"class":183,"line":256},[181,589,590],{},"];\n",[181,592,593],{"class":183,"line":272},[181,594,526],{"emptyLinePlaceholder":525},[181,596,597],{"class":183,"line":278},[181,598,599],{},"private _result = \"forge_server\" callExtension [\"locker:add\", [\n",[181,601,602],{"class":183,"line":548},[181,603,604],{}," getPlayerUID player,\n",[181,606,608],{"class":183,"line":607},9,[181,609,610],{}," toJSON _item\n",[181,612,614],{"class":183,"line":613},10,[181,615,616],{},"]];\n",[181,618,620],{"class":183,"line":619},11,[181,621,526],{"emptyLinePlaceholder":525},[181,623,625],{"class":183,"line":624},12,[181,626,520],{},[181,628,630],{"class":183,"line":629},13,[181,631,531],{},[181,633,635],{"class":183,"line":634},14,[181,636,637],{}," hint format [\"Failed to store item: %1\", _payload];\n",[181,639,641],{"class":183,"line":640},15,[181,642,541],{},[181,644,646],{"class":183,"line":645},16,[181,647,526],{"emptyLinePlaceholder":525},[181,649,651],{"class":183,"line":650},17,[181,652,551],{},[163,654,656],{"id":655},"patch-an-amount","Patch an Amount",[155,658,659,661,662,664],{},[178,660,322],{}," currently patches the ",[178,663,261],{}," field for an existing classname.",[171,666,668],{"className":506,"code":667,"language":508,"meta":176,"style":176},"private _patch = createHashMapFromArray [\n [\"classname\", \"arifle_MX_F\"],\n [\"amount\", 5]\n];\n\nprivate _result = \"forge_server\" callExtension [\"locker:patch\", [\n getPlayerUID player,\n toJSON _patch\n]];\n",[178,669,670,675,679,684,688,692,697,701,706],{"__ignoreMap":176},[181,671,672],{"class":183,"line":184},[181,673,674],{},"private _patch = createHashMapFromArray [\n",[181,676,677],{"class":183,"line":191},[181,678,580],{},[181,680,681],{"class":183,"line":210},[181,682,683],{}," [\"amount\", 5]\n",[181,685,686],{"class":183,"line":236},[181,687,590],{},[181,689,690],{"class":183,"line":256},[181,691,526],{"emptyLinePlaceholder":525},[181,693,694],{"class":183,"line":272},[181,695,696],{},"private _result = \"forge_server\" callExtension [\"locker:patch\", [\n",[181,698,699],{"class":183,"line":278},[181,700,604],{},[181,702,703],{"class":183,"line":548},[181,704,705],{}," toJSON _patch\n",[181,707,708],{"class":183,"line":607},[181,709,616],{},[163,711,713],{"id":712},"remove-an-item","Remove an Item",[155,715,716,718],{},[178,717,326],{}," takes the classname as the second argument.",[171,720,722],{"className":506,"code":721,"language":508,"meta":176,"style":176},"private _result = \"forge_server\" callExtension [\"locker:remove\", [\n getPlayerUID player,\n \"arifle_MX_F\"\n]];\n",[178,723,724,729,733,738],{"__ignoreMap":176},[181,725,726],{"class":183,"line":184},[181,727,728],{},"private _result = \"forge_server\" callExtension [\"locker:remove\", [\n",[181,730,731],{"class":183,"line":191},[181,732,604],{},[181,734,735],{"class":183,"line":210},[181,736,737],{}," \"arifle_MX_F\"\n",[181,739,740],{"class":183,"line":236},[181,741,616],{},[163,743,745],{"id":744},"retrieve-an-item","Retrieve an Item",[171,747,749],{"className":506,"code":748,"language":508,"meta":176,"style":176},"fnc_retrieveLockerItem = {\n params [\"_classname\"];\n\n private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\n private _payload = _result select 0;\n\n if (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Failed to load locker: %1\", _payload];\n false\n };\n\n private _locker = fromJSON _payload;\n private _item = _locker getOrDefault [_classname, createHashMap];\n if (_item isEqualTo createHashMap) exitWith {\n hint \"Item was not found in your locker.\";\n false\n };\n\n private _amount = _item getOrDefault [\"amount\", 0];\n if (_amount \u003C= 0) exitWith {\n hint \"Item is out of stock.\";\n false\n };\n\n if !(player canAdd _classname) exitWith {\n hint \"Not enough inventory space.\";\n false\n };\n\n player addItem _classname;\n\n if (_amount > 1) then {\n private _patch = createHashMapFromArray [\n [\"classname\", _classname],\n [\"amount\", _amount - 1]\n ];\n \"forge_server\" callExtension [\"locker:patch\", [getPlayerUID player, toJSON _patch]];\n } else {\n \"forge_server\" callExtension [\"locker:remove\", [getPlayerUID player, _classname]];\n };\n\n true\n};\n",[178,750,751,756,761,765,770,775,779,784,789,794,799,803,808,813,818,823,827,831,836,842,848,854,859,864,869,875,881,886,891,896,902,907,913,919,925,931,937,943,949,955,960,965,971],{"__ignoreMap":176},[181,752,753],{"class":183,"line":184},[181,754,755],{},"fnc_retrieveLockerItem = {\n",[181,757,758],{"class":183,"line":191},[181,759,760],{}," params [\"_classname\"];\n",[181,762,763],{"class":183,"line":210},[181,764,526],{"emptyLinePlaceholder":525},[181,766,767],{"class":183,"line":236},[181,768,769],{}," private _result = \"forge_server\" callExtension [\"locker:get\", [getPlayerUID player]];\n",[181,771,772],{"class":183,"line":256},[181,773,774],{}," private _payload = _result select 0;\n",[181,776,777],{"class":183,"line":272},[181,778,526],{"emptyLinePlaceholder":525},[181,780,781],{"class":183,"line":278},[181,782,783],{}," if (_payload find \"Error:\" == 0) exitWith {\n",[181,785,786],{"class":183,"line":548},[181,787,788],{}," hint format [\"Failed to load locker: %1\", _payload];\n",[181,790,791],{"class":183,"line":607},[181,792,793],{}," false\n",[181,795,796],{"class":183,"line":613},[181,797,798],{}," };\n",[181,800,801],{"class":183,"line":619},[181,802,526],{"emptyLinePlaceholder":525},[181,804,805],{"class":183,"line":624},[181,806,807],{}," private _locker = fromJSON _payload;\n",[181,809,810],{"class":183,"line":629},[181,811,812],{}," private _item = _locker getOrDefault [_classname, createHashMap];\n",[181,814,815],{"class":183,"line":634},[181,816,817],{}," if (_item isEqualTo createHashMap) exitWith {\n",[181,819,820],{"class":183,"line":640},[181,821,822],{}," hint \"Item was not found in your locker.\";\n",[181,824,825],{"class":183,"line":645},[181,826,793],{},[181,828,829],{"class":183,"line":650},[181,830,798],{},[181,832,834],{"class":183,"line":833},18,[181,835,526],{"emptyLinePlaceholder":525},[181,837,839],{"class":183,"line":838},19,[181,840,841],{}," private _amount = _item getOrDefault [\"amount\", 0];\n",[181,843,845],{"class":183,"line":844},20,[181,846,847],{}," if (_amount \u003C= 0) exitWith {\n",[181,849,851],{"class":183,"line":850},21,[181,852,853],{}," hint \"Item is out of stock.\";\n",[181,855,857],{"class":183,"line":856},22,[181,858,793],{},[181,860,862],{"class":183,"line":861},23,[181,863,798],{},[181,865,867],{"class":183,"line":866},24,[181,868,526],{"emptyLinePlaceholder":525},[181,870,872],{"class":183,"line":871},25,[181,873,874],{}," if !(player canAdd _classname) exitWith {\n",[181,876,878],{"class":183,"line":877},26,[181,879,880],{}," hint \"Not enough inventory space.\";\n",[181,882,884],{"class":183,"line":883},27,[181,885,793],{},[181,887,889],{"class":183,"line":888},28,[181,890,798],{},[181,892,894],{"class":183,"line":893},29,[181,895,526],{"emptyLinePlaceholder":525},[181,897,899],{"class":183,"line":898},30,[181,900,901],{}," player addItem _classname;\n",[181,903,905],{"class":183,"line":904},31,[181,906,526],{"emptyLinePlaceholder":525},[181,908,910],{"class":183,"line":909},32,[181,911,912],{}," if (_amount > 1) then {\n",[181,914,916],{"class":183,"line":915},33,[181,917,918],{}," private _patch = createHashMapFromArray [\n",[181,920,922],{"class":183,"line":921},34,[181,923,924],{}," [\"classname\", _classname],\n",[181,926,928],{"class":183,"line":927},35,[181,929,930],{}," [\"amount\", _amount - 1]\n",[181,932,934],{"class":183,"line":933},36,[181,935,936],{}," ];\n",[181,938,940],{"class":183,"line":939},37,[181,941,942],{}," \"forge_server\" callExtension [\"locker:patch\", [getPlayerUID player, toJSON _patch]];\n",[181,944,946],{"class":183,"line":945},38,[181,947,948],{}," } else {\n",[181,950,952],{"class":183,"line":951},39,[181,953,954],{}," \"forge_server\" callExtension [\"locker:remove\", [getPlayerUID player, _classname]];\n",[181,956,958],{"class":183,"line":957},40,[181,959,798],{},[181,961,963],{"class":183,"line":962},41,[181,964,526],{"emptyLinePlaceholder":525},[181,966,968],{"class":183,"line":967},42,[181,969,970],{}," true\n",[181,972,974],{"class":183,"line":973},43,[181,975,541],{},[163,977,979],{"id":978},"replace-the-whole-locker","Replace the Whole Locker",[155,981,982,984],{},[178,983,417],{}," replaces the whole item map. Use it for explicit bulk syncs,\nnot single-item changes.",[171,986,988],{"className":506,"code":987,"language":508,"meta":176,"style":176},"private _items = createHashMapFromArray [\n [\"arifle_MX_F\", createHashMapFromArray [\n [\"category\", \"weapon\"],\n [\"classname\", \"arifle_MX_F\"],\n [\"amount\", 1]\n ]]\n];\n\nprivate _result = \"forge_server\" callExtension [\"locker:update\", [\n getPlayerUID player,\n toJSON _items\n]];\n",[178,989,990,995,1000,1005,1010,1015,1020,1024,1028,1033,1037,1042],{"__ignoreMap":176},[181,991,992],{"class":183,"line":184},[181,993,994],{},"private _items = createHashMapFromArray [\n",[181,996,997],{"class":183,"line":191},[181,998,999],{}," [\"arifle_MX_F\", createHashMapFromArray [\n",[181,1001,1002],{"class":183,"line":210},[181,1003,1004],{}," [\"category\", \"weapon\"],\n",[181,1006,1007],{"class":183,"line":236},[181,1008,1009],{}," [\"classname\", \"arifle_MX_F\"],\n",[181,1011,1012],{"class":183,"line":256},[181,1013,1014],{}," [\"amount\", 1]\n",[181,1016,1017],{"class":183,"line":272},[181,1018,1019],{}," ]]\n",[181,1021,1022],{"class":183,"line":278},[181,1023,590],{},[181,1025,1026],{"class":183,"line":548},[181,1027,526],{"emptyLinePlaceholder":525},[181,1029,1030],{"class":183,"line":607},[181,1031,1032],{},"private _result = \"forge_server\" callExtension [\"locker:update\", [\n",[181,1034,1035],{"class":183,"line":613},[181,1036,604],{},[181,1038,1039],{"class":183,"line":619},[181,1040,1041],{}," toJSON _items\n",[181,1043,1044],{"class":183,"line":624},[181,1045,616],{},[163,1047,1049],{"id":1048},"hot-state","Hot State",[155,1051,1052,1053,1056,1057,1060],{},"The ",[178,1054,1055],{},"locker:hot:*"," commands keep a runtime copy of a player's locker and write\nit back only when ",[178,1058,1059],{},"locker:hot:save"," runs.",[345,1062,1063,1073],{},[348,1064,1065],{},[351,1066,1067,1069,1071],{},[354,1068,356],{},[354,1070,359],{},[354,1072,362],{},[364,1074,1075,1088,1101,1116,1129],{},[351,1076,1077,1082,1086],{},[369,1078,1079],{},[178,1080,1081],{},"locker:hot:init",[369,1083,1084],{},[178,1085,378],{},[369,1087,394],{},[351,1089,1090,1095,1099],{},[369,1091,1092],{},[178,1093,1094],{},"locker:hot:get",[369,1096,1097],{},[178,1098,378],{},[369,1100,394],{},[351,1102,1103,1108,1114],{},[369,1104,1105],{},[178,1106,1107],{},"locker:hot:override",[369,1109,1110,319,1112],{},[178,1111,378],{},[178,1113,424],{},[369,1115,394],{},[351,1117,1118,1122,1126],{},[369,1119,1120],{},[178,1121,1059],{},[369,1123,1124],{},[178,1125,378],{},[369,1127,1128],{},"Current hot item map as JSON.",[351,1130,1131,1136,1140],{},[369,1132,1133],{},[178,1134,1135],{},"locker:hot:remove",[369,1137,1138],{},[178,1139,378],{},[369,1141,1142,161],{},[178,1143,472],{},[155,1145,1146],{},"Use hot state for session-heavy locker workflows. Use the durable commands for\nsimple item deposits and withdrawals.",[163,1148,1150],{"id":1149},"best-practices","Best Practices",[286,1152,1153,1168,1174,1179,1182],{},[289,1154,1155,1156,319,1158,319,1161,1164,1165,161],{},"Keep categories normalized, for example ",[178,1157,228],{},[178,1159,1160],{},"magazine",[178,1162,1163],{},"item",", or\n",[178,1166,1167],{},"backpack",[289,1169,1170,1171,1173],{},"Use ",[178,1172,322],{}," for quantity changes.",[289,1175,1170,1176,1178],{},[178,1177,326],{}," when quantity reaches zero.",[289,1180,1181],{},"Treat the locker response as a hash map keyed by classname.",[289,1183,1184],{},"Check capacity before bulk operations that may exceed 25 unique items.",[1186,1187,1188],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":176,"searchDepth":191,"depth":191,"links":1190},[1191,1192,1193,1194,1195,1196,1197,1198,1199,1200],{"id":165,"depth":191,"text":166},{"id":335,"depth":191,"text":336},{"id":495,"depth":191,"text":496},{"id":554,"depth":191,"text":555},{"id":655,"depth":191,"text":656},{"id":712,"depth":191,"text":713},{"id":744,"depth":191,"text":745},{"id":978,"depth":191,"text":979},{"id":1048,"depth":191,"text":1049},{"id":1149,"depth":191,"text":1150},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\nOwned Storage Usage Guide.","md",null,{},{"title":77,"description":1201},"yRC1-bz2AkCaQBkRxr04sEYnq81grmtAwyDVDqAvkaM",[1208,1210],{"title":73,"path":74,"stem":75,"description":1209,"children":-1},"The garage module stores physical player vehicles. Each record keeps the\nvehicle classname, generated plate UUID, fuel, overall damage, and detailed hit\npoint damage.",{"title":81,"path":82,"stem":83,"description":1211,"children":-1},"The organization module stores organization records, members, assets, fleet\nentries, and credit lines. Durable commands manage persisted records directly.\nHot-state commands support the active organization UI workflows.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/organization.html b/docus/dist/server-modules/organization.html index fe18b0f..95fe49f 100644 --- a/docus/dist/server-modules/organization.html +++ b/docus/dist/server-modules/organization.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Organization Usage Guide - forge-docus

    Owned Storage Usage Guide

    Owned storage covers the owned:locker and owned:garage extension command groups. These modules store unlock lists rather than physical item or vehicle -instances.

    \ No newline at end of file +instances.

    \ No newline at end of file diff --git a/docus/dist/server-modules/organization/_payload.json b/docus/dist/server-modules/organization/_payload.json index d583f2e..5289186 100644 --- a/docus/dist/server-modules/organization/_payload.json +++ b/docus/dist/server-modules/organization/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1602},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-organization":145,"-server-modules-organization-surround":1597},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":81,"body":147,"description":157,"extension":1592,"links":1593,"meta":1594,"navigation":798,"path":82,"seo":1595,"stem":83,"__hash__":1596},"docs\u002F3.server-modules\u002F7.organization.md",{"type":148,"value":149,"toc":1580},"minimark",[150,154,158,163,166,311,314,478,481,515,519,738,742,747,821,825,871,887,891,894,952,955,1012,1016,1284,1288,1336,1340,1442,1446,1547,1551,1576],[151,152,81],"h1",{"id":153},"organization-usage-guide",[155,156,157],"p",{},"The organization module stores organization records, members, assets, fleet\nentries, and credit lines. Durable commands manage persisted records directly.\nHot-state commands support the active organization UI workflows.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Core organization:",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"id\": \"default\",\n \"owner\": \"server\",\n \"name\": \"Default Organization\",\n \"funds\": 0.0,\n \"reputation\": 0,\n \"credit_lines\": {}\n}\n","json","",[174,175,176,185,213,234,255,273,290,305],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201,204,208,210],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","id",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," \"",[177,205,207],{"class":206},"sfazB","default",[177,209,197],{"class":183},[177,211,212],{"class":183},",\n",[177,214,216,218,221,223,225,227,230,232],{"class":179,"line":215},3,[177,217,190],{"class":183},[177,219,220],{"class":193},"owner",[177,222,197],{"class":183},[177,224,200],{"class":183},[177,226,203],{"class":183},[177,228,229],{"class":206},"server",[177,231,197],{"class":183},[177,233,212],{"class":183},[177,235,237,239,242,244,246,248,251,253],{"class":179,"line":236},4,[177,238,190],{"class":183},[177,240,241],{"class":193},"name",[177,243,197],{"class":183},[177,245,200],{"class":183},[177,247,203],{"class":183},[177,249,250],{"class":206},"Default Organization",[177,252,197],{"class":183},[177,254,212],{"class":183},[177,256,258,260,263,265,267,271],{"class":179,"line":257},5,[177,259,190],{"class":183},[177,261,262],{"class":193},"funds",[177,264,197],{"class":183},[177,266,200],{"class":183},[177,268,270],{"class":269},"sbssI"," 0.0",[177,272,212],{"class":183},[177,274,276,278,281,283,285,288],{"class":179,"line":275},6,[177,277,190],{"class":183},[177,279,280],{"class":193},"reputation",[177,282,197],{"class":183},[177,284,200],{"class":183},[177,286,287],{"class":269}," 0",[177,289,212],{"class":183},[177,291,293,295,298,300,302],{"class":179,"line":292},7,[177,294,190],{"class":183},[177,296,297],{"class":193},"credit_lines",[177,299,197],{"class":183},[177,301,200],{"class":183},[177,303,304],{"class":183}," {}\n",[177,306,308],{"class":179,"line":307},8,[177,309,310],{"class":183},"}\n",[155,312,313],{},"Hot organization:",[167,315,317],{"className":169,"code":316,"language":171,"meta":172,"style":172},"{\n \"id\": \"default\",\n \"owner\": \"server\",\n \"name\": \"Default Organization\",\n \"funds\": 0.0,\n \"reputation\": 0,\n \"credit_lines\": {},\n \"assets\": {},\n \"fleet\": {},\n \"members\": {},\n \"pending_invites\": {}\n}\n",[174,318,319,323,341,359,377,391,405,418,431,445,459,473],{"__ignoreMap":172},[177,320,321],{"class":179,"line":180},[177,322,184],{"class":183},[177,324,325,327,329,331,333,335,337,339],{"class":179,"line":187},[177,326,190],{"class":183},[177,328,194],{"class":193},[177,330,197],{"class":183},[177,332,200],{"class":183},[177,334,203],{"class":183},[177,336,207],{"class":206},[177,338,197],{"class":183},[177,340,212],{"class":183},[177,342,343,345,347,349,351,353,355,357],{"class":179,"line":215},[177,344,190],{"class":183},[177,346,220],{"class":193},[177,348,197],{"class":183},[177,350,200],{"class":183},[177,352,203],{"class":183},[177,354,229],{"class":206},[177,356,197],{"class":183},[177,358,212],{"class":183},[177,360,361,363,365,367,369,371,373,375],{"class":179,"line":236},[177,362,190],{"class":183},[177,364,241],{"class":193},[177,366,197],{"class":183},[177,368,200],{"class":183},[177,370,203],{"class":183},[177,372,250],{"class":206},[177,374,197],{"class":183},[177,376,212],{"class":183},[177,378,379,381,383,385,387,389],{"class":179,"line":257},[177,380,190],{"class":183},[177,382,262],{"class":193},[177,384,197],{"class":183},[177,386,200],{"class":183},[177,388,270],{"class":269},[177,390,212],{"class":183},[177,392,393,395,397,399,401,403],{"class":179,"line":275},[177,394,190],{"class":183},[177,396,280],{"class":193},[177,398,197],{"class":183},[177,400,200],{"class":183},[177,402,287],{"class":269},[177,404,212],{"class":183},[177,406,407,409,411,413,415],{"class":179,"line":292},[177,408,190],{"class":183},[177,410,297],{"class":193},[177,412,197],{"class":183},[177,414,200],{"class":183},[177,416,417],{"class":183}," {},\n",[177,419,420,422,425,427,429],{"class":179,"line":307},[177,421,190],{"class":183},[177,423,424],{"class":193},"assets",[177,426,197],{"class":183},[177,428,200],{"class":183},[177,430,417],{"class":183},[177,432,434,436,439,441,443],{"class":179,"line":433},9,[177,435,190],{"class":183},[177,437,438],{"class":193},"fleet",[177,440,197],{"class":183},[177,442,200],{"class":183},[177,444,417],{"class":183},[177,446,448,450,453,455,457],{"class":179,"line":447},10,[177,449,190],{"class":183},[177,451,452],{"class":193},"members",[177,454,197],{"class":183},[177,456,200],{"class":183},[177,458,417],{"class":183},[177,460,462,464,467,469,471],{"class":179,"line":461},11,[177,463,190],{"class":183},[177,465,466],{"class":193},"pending_invites",[177,468,197],{"class":183},[177,470,200],{"class":183},[177,472,304],{"class":183},[177,474,476],{"class":179,"line":475},12,[177,477,310],{"class":183},[155,479,480],{},"Rules validated by the Rust service:",[482,483,484,494,502,507,512],"ul",{},[485,486,487,489,490,493],"li",{},[174,488,194],{}," must be non-empty and contain only alphanumeric characters or ",[174,491,492],{},"_",".",[485,495,496,498,499,501],{},[174,497,220],{}," must be ",[174,500,229],{}," or a 17-digit Steam UID.",[485,503,504,506],{},[174,505,241],{}," cannot be empty, cannot exceed 100 characters, and cannot contain\ncontrol characters.",[485,508,509,511],{},[174,510,262],{},", reputation, and credit line amounts cannot be negative.",[485,513,514],{},"Player registration is rejected when the player already belongs to a\nnon-default organization.",[159,516,518],{"id":517},"durable-commands","Durable Commands",[520,521,522,538],"table",{},[523,524,525],"thead",{},[526,527,528,532,535],"tr",{},[529,530,531],"th",{},"Command",[529,533,534],{},"Arguments",[529,536,537],{},"Returns",[539,540,541,561,574,591,611,627,641,658,672,689,703,721],"tbody",{},[526,542,543,549,558],{},[544,545,546],"td",{},[174,547,548],{},"org:create",[544,550,551,554,555],{},[174,552,553],{},"org_id",", ",[174,556,557],{},"org_json",[544,559,560],{},"Organization JSON.",[526,562,563,568,572],{},[544,564,565],{},[174,566,567],{},"org:get",[544,569,570],{},[174,571,553],{},[544,573,560],{},[526,575,576,581,588],{},[544,577,578],{},[174,579,580],{},"org:update",[544,582,583,554,585],{},[174,584,553],{},[174,586,587],{},"patch_json",[544,589,590],{},"Updated organization JSON.",[526,592,593,598,602],{},[544,594,595],{},[174,596,597],{},"org:exists",[544,599,600],{},[174,601,553],{},[544,603,604,607,608,493],{},[174,605,606],{},"true"," or ",[174,609,610],{},"false",[526,612,613,618,622],{},[544,614,615],{},[174,616,617],{},"org:delete",[544,619,620],{},[174,621,553],{},[544,623,624,493],{},[174,625,626],{},"OK",[526,628,629,634,638],{},[544,630,631],{},[174,632,633],{},"org:assets:get",[544,635,636],{},[174,637,553],{},[544,639,640],{},"Asset map JSON.",[526,642,643,648,655],{},[544,644,645],{},[174,646,647],{},"org:assets:update",[544,649,650,554,652],{},[174,651,553],{},[174,653,654],{},"assets_json",[544,656,657],{},"Updated asset map JSON.",[526,659,660,665,669],{},[544,661,662],{},[174,663,664],{},"org:fleet:get",[544,666,667],{},[174,668,553],{},[544,670,671],{},"Fleet map JSON.",[526,673,674,679,686],{},[544,675,676],{},[174,677,678],{},"org:fleet:update",[544,680,681,554,683],{},[174,682,553],{},[174,684,685],{},"fleet_json",[544,687,688],{},"Updated fleet map JSON.",[526,690,691,696,700],{},[544,692,693],{},[174,694,695],{},"org:members:get",[544,697,698],{},[174,699,553],{},[544,701,702],{},"Member array JSON.",[526,704,705,710,717],{},[544,706,707],{},[174,708,709],{},"org:members:add",[544,711,712,554,714],{},[174,713,553],{},[174,715,716],{},"member_uid",[544,718,719,493],{},[174,720,626],{},[526,722,723,728,734],{},[544,724,725],{},[174,726,727],{},"org:members:remove",[544,729,730,554,732],{},[174,731,553],{},[174,733,716],{},[544,735,736,493],{},[174,737,626],{},[159,739,741],{"id":740},"create-an-organization","Create an Organization",[155,743,744,745,493],{},"The command key is authoritative for ",[174,746,194],{},[167,748,752],{"className":749,"code":750,"language":751,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _org = createHashMapFromArray [\n [\"id\", _orgId],\n [\"owner\", getPlayerUID player],\n [\"name\", \"Spearnet Logistics\"],\n [\"funds\", 0],\n [\"reputation\", 0],\n [\"credit_lines\", createHashMap]\n];\n\nprivate _result = \"forge_server\" callExtension [\"org:create\", [\n _orgId,\n toJSON _org\n]];\n","sqf",[174,753,754,759,764,769,774,779,784,789,794,800,805,810,815],{"__ignoreMap":172},[177,755,756],{"class":179,"line":180},[177,757,758],{},"private _org = createHashMapFromArray [\n",[177,760,761],{"class":179,"line":187},[177,762,763],{}," [\"id\", _orgId],\n",[177,765,766],{"class":179,"line":215},[177,767,768],{}," [\"owner\", getPlayerUID player],\n",[177,770,771],{"class":179,"line":236},[177,772,773],{}," [\"name\", \"Spearnet Logistics\"],\n",[177,775,776],{"class":179,"line":257},[177,777,778],{}," [\"funds\", 0],\n",[177,780,781],{"class":179,"line":275},[177,782,783],{}," [\"reputation\", 0],\n",[177,785,786],{"class":179,"line":292},[177,787,788],{}," [\"credit_lines\", createHashMap]\n",[177,790,791],{"class":179,"line":307},[177,792,793],{},"];\n",[177,795,796],{"class":179,"line":433},[177,797,799],{"emptyLinePlaceholder":798},true,"\n",[177,801,802],{"class":179,"line":447},[177,803,804],{},"private _result = \"forge_server\" callExtension [\"org:create\", [\n",[177,806,807],{"class":179,"line":461},[177,808,809],{}," _orgId,\n",[177,811,812],{"class":179,"line":475},[177,813,814],{}," toJSON _org\n",[177,816,818],{"class":179,"line":817},13,[177,819,820],{},"]];\n",[159,822,824],{"id":823},"update-organization-funds","Update Organization Funds",[167,826,828],{"className":749,"code":827,"language":751,"meta":172,"style":172},"private _patch = createHashMapFromArray [\n [\"funds\", 5000],\n [\"reputation\", 10]\n];\n\nprivate _result = \"forge_server\" callExtension [\"org:update\", [\n _orgId,\n toJSON _patch\n]];\n",[174,829,830,835,840,845,849,853,858,862,867],{"__ignoreMap":172},[177,831,832],{"class":179,"line":180},[177,833,834],{},"private _patch = createHashMapFromArray [\n",[177,836,837],{"class":179,"line":187},[177,838,839],{}," [\"funds\", 5000],\n",[177,841,842],{"class":179,"line":215},[177,843,844],{}," [\"reputation\", 10]\n",[177,846,847],{"class":179,"line":236},[177,848,793],{},[177,850,851],{"class":179,"line":257},[177,852,799],{"emptyLinePlaceholder":798},[177,854,855],{"class":179,"line":275},[177,856,857],{},"private _result = \"forge_server\" callExtension [\"org:update\", [\n",[177,859,860],{"class":179,"line":292},[177,861,809],{},[177,863,864],{"class":179,"line":307},[177,865,866],{}," toJSON _patch\n",[177,868,869],{"class":179,"line":433},[177,870,820],{},[155,872,873,874,554,876,554,878,554,880,212,882,884,885,493],{},"Supported durable patch fields are ",[174,875,194],{},[174,877,220],{},[174,879,241],{},[174,881,262],{},[174,883,280],{},", and ",[174,886,297],{},[159,888,890],{"id":889},"assets-and-fleet","Assets and Fleet",[155,892,893],{},"Assets are grouped by category, then classname.",[167,895,897],{"className":749,"code":896,"language":751,"meta":172,"style":172},"private _assets = createHashMapFromArray [\n [\"ammo\", createHashMapFromArray [\n [\"ACE_30Rnd_65x39_caseless_mag\", createHashMapFromArray [\n [\"classname\", \"ACE_30Rnd_65x39_caseless_mag\"],\n [\"type\", \"ammo\"],\n [\"quantity\", 20]\n ]]\n ]]\n];\n\n\"forge_server\" callExtension [\"org:assets:update\", [_orgId, toJSON _assets]];\n",[174,898,899,904,909,914,919,924,929,934,939,943,947],{"__ignoreMap":172},[177,900,901],{"class":179,"line":180},[177,902,903],{},"private _assets = createHashMapFromArray [\n",[177,905,906],{"class":179,"line":187},[177,907,908],{}," [\"ammo\", createHashMapFromArray [\n",[177,910,911],{"class":179,"line":215},[177,912,913],{}," [\"ACE_30Rnd_65x39_caseless_mag\", createHashMapFromArray [\n",[177,915,916],{"class":179,"line":236},[177,917,918],{}," [\"classname\", \"ACE_30Rnd_65x39_caseless_mag\"],\n",[177,920,921],{"class":179,"line":257},[177,922,923],{}," [\"type\", \"ammo\"],\n",[177,925,926],{"class":179,"line":275},[177,927,928],{}," [\"quantity\", 20]\n",[177,930,931],{"class":179,"line":292},[177,932,933],{}," ]]\n",[177,935,936],{"class":179,"line":307},[177,937,938],{}," ]]\n",[177,940,941],{"class":179,"line":433},[177,942,793],{},[177,944,945],{"class":179,"line":447},[177,946,799],{"emptyLinePlaceholder":798},[177,948,949],{"class":179,"line":461},[177,950,951],{},"\"forge_server\" callExtension [\"org:assets:update\", [_orgId, toJSON _assets]];\n",[155,953,954],{},"Fleet is keyed by an internal fleet entry ID.",[167,956,958],{"className":749,"code":957,"language":751,"meta":172,"style":172},"private _fleet = createHashMapFromArray [\n [\"B_Truck_01_transport_F_0\", createHashMapFromArray [\n [\"classname\", \"B_Truck_01_transport_F\"],\n [\"name\", \"Transport Truck\"],\n [\"type\", \"cars\"],\n [\"status\", \"Ready\"],\n [\"damage\", \"0%\"]\n ]]\n];\n\n\"forge_server\" callExtension [\"org:fleet:update\", [_orgId, toJSON _fleet]];\n",[174,959,960,965,970,975,980,985,990,995,999,1003,1007],{"__ignoreMap":172},[177,961,962],{"class":179,"line":180},[177,963,964],{},"private _fleet = createHashMapFromArray [\n",[177,966,967],{"class":179,"line":187},[177,968,969],{}," [\"B_Truck_01_transport_F_0\", createHashMapFromArray [\n",[177,971,972],{"class":179,"line":215},[177,973,974],{}," [\"classname\", \"B_Truck_01_transport_F\"],\n",[177,976,977],{"class":179,"line":236},[177,978,979],{}," [\"name\", \"Transport Truck\"],\n",[177,981,982],{"class":179,"line":257},[177,983,984],{}," [\"type\", \"cars\"],\n",[177,986,987],{"class":179,"line":275},[177,988,989],{}," [\"status\", \"Ready\"],\n",[177,991,992],{"class":179,"line":292},[177,993,994],{}," [\"damage\", \"0%\"]\n",[177,996,997],{"class":179,"line":307},[177,998,938],{},[177,1000,1001],{"class":179,"line":433},[177,1002,793],{},[177,1004,1005],{"class":179,"line":447},[177,1006,799],{"emptyLinePlaceholder":798},[177,1008,1009],{"class":179,"line":461},[177,1010,1011],{},"\"forge_server\" callExtension [\"org:fleet:update\", [_orgId, toJSON _fleet]];\n",[159,1013,1015],{"id":1014},"hot-state-commands","Hot-State Commands",[520,1017,1018,1028],{},[523,1019,1020],{},[526,1021,1022,1024,1026],{},[529,1023,531],{},[529,1025,534],{},[529,1027,537],{},[539,1029,1030,1044,1057,1073,1087,1101,1115,1129,1143,1156,1170,1184,1197,1212,1227,1241,1255,1269],{},[526,1031,1032,1037,1041],{},[544,1033,1034],{},[174,1035,1036],{},"org:hot:init",[544,1038,1039],{},[174,1040,553],{},[544,1042,1043],{},"Hot organization JSON.",[526,1045,1046,1051,1055],{},[544,1047,1048],{},[174,1049,1050],{},"org:hot:get",[544,1052,1053],{},[174,1054,553],{},[544,1056,1043],{},[526,1058,1059,1064,1071],{},[544,1060,1061],{},[174,1062,1063],{},"org:hot:override",[544,1065,1066,554,1068],{},[174,1067,553],{},[174,1069,1070],{},"hot_org_json",[544,1072,1043],{},[526,1074,1075,1080,1085],{},[544,1076,1077],{},[174,1078,1079],{},"org:hot:ensure_member",[544,1081,1082],{},[174,1083,1084],{},"context_json",[544,1086,1043],{},[526,1088,1089,1094,1098],{},[544,1090,1091],{},[174,1092,1093],{},"org:hot:member_invites",[544,1095,1096],{},[174,1097,716],{},[544,1099,1100],{},"Invite array JSON.",[526,1102,1103,1108,1112],{},[544,1104,1105],{},[174,1106,1107],{},"org:hot:register",[544,1109,1110],{},[174,1111,1084],{},[544,1113,1114],{},"Register result JSON.",[526,1116,1117,1122,1126],{},[544,1118,1119],{},[174,1120,1121],{},"org:hot:invite_member",[544,1123,1124],{},[174,1125,1084],{},[544,1127,1128],{},"Invite result JSON.",[526,1130,1131,1136,1140],{},[544,1132,1133],{},[174,1134,1135],{},"org:hot:accept_invite",[544,1137,1138],{},[174,1139,1084],{},[544,1141,1142],{},"Invite decision result JSON.",[526,1144,1145,1150,1154],{},[544,1146,1147],{},[174,1148,1149],{},"org:hot:decline_invite",[544,1151,1152],{},[174,1153,1084],{},[544,1155,1142],{},[526,1157,1158,1163,1167],{},[544,1159,1160],{},[174,1161,1162],{},"org:hot:assign_credit_line",[544,1164,1165],{},[174,1166,1084],{},[544,1168,1169],{},"Mutation result JSON.",[526,1171,1172,1177,1181],{},[544,1173,1174],{},[174,1175,1176],{},"org:hot:repay_credit_line",[544,1178,1179],{},[174,1180,1084],{},[544,1182,1183],{},"Repayment result JSON.",[526,1185,1186,1191,1195],{},[544,1187,1188],{},[174,1189,1190],{},"org:hot:charge_checkout",[544,1192,1193],{},[174,1194,1084],{},[544,1196,1169],{},[526,1198,1199,1204,1210],{},[544,1200,1201],{},[174,1202,1203],{},"org:hot:add_assets",[544,1205,1206,554,1208],{},[174,1207,1084],{},[174,1209,654],{},[544,1211,1169],{},[526,1213,1214,1219,1225],{},[544,1215,1216],{},[174,1217,1218],{},"org:hot:add_fleet",[544,1220,1221,554,1223],{},[174,1222,1084],{},[174,1224,685],{},[544,1226,1169],{},[526,1228,1229,1234,1238],{},[544,1230,1231],{},[174,1232,1233],{},"org:hot:leave",[544,1235,1236],{},[174,1237,1084],{},[544,1239,1240],{},"Leave result JSON.",[526,1242,1243,1248,1252],{},[544,1244,1245],{},[174,1246,1247],{},"org:hot:disband",[544,1249,1250],{},[174,1251,1084],{},[544,1253,1254],{},"Disband result JSON.",[526,1256,1257,1262,1266],{},[544,1258,1259],{},[174,1260,1261],{},"org:hot:save",[544,1263,1264],{},[174,1265,553],{},[544,1267,1268],{},"Current hot organization JSON and async durable save.",[526,1270,1271,1276,1280],{},[544,1272,1273],{},[174,1274,1275],{},"org:hot:remove",[544,1277,1278],{},[174,1279,553],{},[544,1281,1282,493],{},[174,1283,626],{},[159,1285,1287],{"id":1286},"register-from-ui-context","Register from UI Context",[167,1289,1291],{"className":749,"code":1290,"language":751,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", _orgId],\n [\"orgName\", \"Spearnet Logistics\"],\n [\"existingOrgId\", \"default\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"org:hot:register\", [toJSON _context]];\n",[174,1292,1293,1298,1303,1308,1313,1318,1323,1327,1331],{"__ignoreMap":172},[177,1294,1295],{"class":179,"line":180},[177,1296,1297],{},"private _context = createHashMapFromArray [\n",[177,1299,1300],{"class":179,"line":187},[177,1301,1302],{}," [\"requesterUid\", getPlayerUID player],\n",[177,1304,1305],{"class":179,"line":215},[177,1306,1307],{}," [\"requesterName\", name player],\n",[177,1309,1310],{"class":179,"line":236},[177,1311,1312],{}," [\"orgId\", _orgId],\n",[177,1314,1315],{"class":179,"line":257},[177,1316,1317],{}," [\"orgName\", \"Spearnet Logistics\"],\n",[177,1319,1320],{"class":179,"line":275},[177,1321,1322],{}," [\"existingOrgId\", \"default\"]\n",[177,1324,1325],{"class":179,"line":292},[177,1326,793],{},[177,1328,1329],{"class":179,"line":307},[177,1330,799],{"emptyLinePlaceholder":798},[177,1332,1333],{"class":179,"line":433},[177,1334,1335],{},"private _result = \"forge_server\" callExtension [\"org:hot:register\", [toJSON _context]];\n",[159,1337,1339],{"id":1338},"invite-and-accept","Invite and Accept",[167,1341,1343],{"className":749,"code":1342,"language":751,"meta":172,"style":172},"private _invite = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"targetUid\", _targetUid],\n [\"targetName\", _targetName],\n [\"targetOrgId\", \"default\"]\n];\n\n\"forge_server\" callExtension [\"org:hot:invite_member\", [toJSON _invite]];\n\nprivate _decision = createHashMapFromArray [\n [\"requesterUid\", _targetUid],\n [\"requesterName\", _targetName],\n [\"orgId\", _orgId],\n [\"existingOrgId\", \"default\"]\n];\n\n\"forge_server\" callExtension [\"org:hot:accept_invite\", [toJSON _decision]];\n",[174,1344,1345,1350,1354,1358,1362,1367,1372,1377,1382,1386,1390,1395,1399,1404,1410,1416,1421,1426,1431,1436],{"__ignoreMap":172},[177,1346,1347],{"class":179,"line":180},[177,1348,1349],{},"private _invite = createHashMapFromArray [\n",[177,1351,1352],{"class":179,"line":187},[177,1353,1302],{},[177,1355,1356],{"class":179,"line":215},[177,1357,1307],{},[177,1359,1360],{"class":179,"line":236},[177,1361,1312],{},[177,1363,1364],{"class":179,"line":257},[177,1365,1366],{}," [\"requesterIsDefaultOrgCeo\", false],\n",[177,1368,1369],{"class":179,"line":275},[177,1370,1371],{}," [\"targetUid\", _targetUid],\n",[177,1373,1374],{"class":179,"line":292},[177,1375,1376],{}," [\"targetName\", _targetName],\n",[177,1378,1379],{"class":179,"line":307},[177,1380,1381],{}," [\"targetOrgId\", \"default\"]\n",[177,1383,1384],{"class":179,"line":433},[177,1385,793],{},[177,1387,1388],{"class":179,"line":447},[177,1389,799],{"emptyLinePlaceholder":798},[177,1391,1392],{"class":179,"line":461},[177,1393,1394],{},"\"forge_server\" callExtension [\"org:hot:invite_member\", [toJSON _invite]];\n",[177,1396,1397],{"class":179,"line":475},[177,1398,799],{"emptyLinePlaceholder":798},[177,1400,1401],{"class":179,"line":817},[177,1402,1403],{},"private _decision = createHashMapFromArray [\n",[177,1405,1407],{"class":179,"line":1406},14,[177,1408,1409],{}," [\"requesterUid\", _targetUid],\n",[177,1411,1413],{"class":179,"line":1412},15,[177,1414,1415],{}," [\"requesterName\", _targetName],\n",[177,1417,1419],{"class":179,"line":1418},16,[177,1420,1312],{},[177,1422,1424],{"class":179,"line":1423},17,[177,1425,1322],{},[177,1427,1429],{"class":179,"line":1428},18,[177,1430,793],{},[177,1432,1434],{"class":179,"line":1433},19,[177,1435,799],{"emptyLinePlaceholder":798},[177,1437,1439],{"class":179,"line":1438},20,[177,1440,1441],{},"\"forge_server\" callExtension [\"org:hot:accept_invite\", [toJSON _decision]];\n",[159,1443,1445],{"id":1444},"credit-line-checkout","Credit Line Checkout",[167,1447,1449],{"className":749,"code":1448,"language":751,"meta":172,"style":172},"private _credit = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"memberUid\", _memberUid],\n [\"memberName\", _memberName],\n [\"amount\", 1000]\n];\n\n\"forge_server\" callExtension [\"org:hot:assign_credit_line\", [toJSON _credit]];\n\nprivate _charge = createHashMapFromArray [\n [\"requesterUid\", _memberUid],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"source\", \"credit_line\"],\n [\"amount\", 250],\n [\"commit\", true]\n];\n\n\"forge_server\" callExtension [\"org:hot:charge_checkout\", [toJSON _charge]];\n",[174,1450,1451,1456,1460,1464,1468,1473,1478,1483,1487,1491,1496,1500,1505,1510,1514,1518,1523,1528,1533,1537,1541],{"__ignoreMap":172},[177,1452,1453],{"class":179,"line":180},[177,1454,1455],{},"private _credit = createHashMapFromArray [\n",[177,1457,1458],{"class":179,"line":187},[177,1459,1302],{},[177,1461,1462],{"class":179,"line":215},[177,1463,1312],{},[177,1465,1466],{"class":179,"line":236},[177,1467,1366],{},[177,1469,1470],{"class":179,"line":257},[177,1471,1472],{}," [\"memberUid\", _memberUid],\n",[177,1474,1475],{"class":179,"line":275},[177,1476,1477],{}," [\"memberName\", _memberName],\n",[177,1479,1480],{"class":179,"line":292},[177,1481,1482],{}," [\"amount\", 1000]\n",[177,1484,1485],{"class":179,"line":307},[177,1486,793],{},[177,1488,1489],{"class":179,"line":433},[177,1490,799],{"emptyLinePlaceholder":798},[177,1492,1493],{"class":179,"line":447},[177,1494,1495],{},"\"forge_server\" callExtension [\"org:hot:assign_credit_line\", [toJSON _credit]];\n",[177,1497,1498],{"class":179,"line":461},[177,1499,799],{"emptyLinePlaceholder":798},[177,1501,1502],{"class":179,"line":475},[177,1503,1504],{},"private _charge = createHashMapFromArray [\n",[177,1506,1507],{"class":179,"line":817},[177,1508,1509],{}," [\"requesterUid\", _memberUid],\n",[177,1511,1512],{"class":179,"line":1406},[177,1513,1312],{},[177,1515,1516],{"class":179,"line":1412},[177,1517,1366],{},[177,1519,1520],{"class":179,"line":1418},[177,1521,1522],{}," [\"source\", \"credit_line\"],\n",[177,1524,1525],{"class":179,"line":1423},[177,1526,1527],{}," [\"amount\", 250],\n",[177,1529,1530],{"class":179,"line":1428},[177,1531,1532],{}," [\"commit\", true]\n",[177,1534,1535],{"class":179,"line":1433},[177,1536,793],{},[177,1538,1539],{"class":179,"line":1438},[177,1540,799],{"emptyLinePlaceholder":798},[177,1542,1544],{"class":179,"line":1543},21,[177,1545,1546],{},"\"forge_server\" callExtension [\"org:hot:charge_checkout\", [toJSON _charge]];\n",[159,1548,1550],{"id":1549},"error-handling","Error Handling",[167,1552,1554],{"className":749,"code":1553,"language":751,"meta":172,"style":172},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Organization error: %1\", _payload];\n};\n",[174,1555,1556,1561,1566,1571],{"__ignoreMap":172},[177,1557,1558],{"class":179,"line":180},[177,1559,1560],{},"private _payload = _result select 0;\n",[177,1562,1563],{"class":179,"line":187},[177,1564,1565],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,1567,1568],{"class":179,"line":215},[177,1569,1570],{}," systemChat format [\"Organization error: %1\", _payload];\n",[177,1572,1573],{"class":179,"line":236},[177,1574,1575],{},"};\n",[1577,1578,1579],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":1581},[1582,1583,1584,1585,1586,1587,1588,1589,1590,1591],{"id":161,"depth":187,"text":162},{"id":517,"depth":187,"text":518},{"id":740,"depth":187,"text":741},{"id":823,"depth":187,"text":824},{"id":889,"depth":187,"text":890},{"id":1014,"depth":187,"text":1015},{"id":1286,"depth":187,"text":1287},{"id":1338,"depth":187,"text":1339},{"id":1444,"depth":187,"text":1445},{"id":1549,"depth":187,"text":1550},"md",null,{},{"title":81,"description":157},"Y4vjjEPJa4IV64tDJwWSmfGqOhldckNTPDy2PpGmT14",[1598,1600],{"title":77,"path":78,"stem":79,"description":1599,"children":-1},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\nOwned Storage Usage Guide.",{"title":85,"path":86,"stem":87,"description":1601,"children":-1},"Owned storage covers the owned:locker and owned:garage extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1602},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-organization":145,"-server-modules-organization-surround":1597},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":81,"body":147,"description":157,"extension":1592,"links":1593,"meta":1594,"navigation":798,"path":82,"seo":1595,"stem":83,"__hash__":1596},"docs\u002F3.server-modules\u002F7.organization.md",{"type":148,"value":149,"toc":1580},"minimark",[150,154,158,163,166,311,314,478,481,515,519,738,742,747,821,825,871,887,891,894,952,955,1012,1016,1284,1288,1336,1340,1442,1446,1547,1551,1576],[151,152,81],"h1",{"id":153},"organization-usage-guide",[155,156,157],"p",{},"The organization module stores organization records, members, assets, fleet\nentries, and credit lines. Durable commands manage persisted records directly.\nHot-state commands support the active organization UI workflows.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[155,164,165],{},"Core organization:",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"id\": \"default\",\n \"owner\": \"server\",\n \"name\": \"Default Organization\",\n \"funds\": 0.0,\n \"reputation\": 0,\n \"credit_lines\": {}\n}\n","json","",[174,175,176,185,213,234,255,273,290,305],"code",{"__ignoreMap":172},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sMK4o","{\n",[177,186,188,191,195,198,201,204,208,210],{"class":179,"line":187},2,[177,189,190],{"class":183}," \"",[177,192,194],{"class":193},"spNyl","id",[177,196,197],{"class":183},"\"",[177,199,200],{"class":183},":",[177,202,203],{"class":183}," \"",[177,205,207],{"class":206},"sfazB","default",[177,209,197],{"class":183},[177,211,212],{"class":183},",\n",[177,214,216,218,221,223,225,227,230,232],{"class":179,"line":215},3,[177,217,190],{"class":183},[177,219,220],{"class":193},"owner",[177,222,197],{"class":183},[177,224,200],{"class":183},[177,226,203],{"class":183},[177,228,229],{"class":206},"server",[177,231,197],{"class":183},[177,233,212],{"class":183},[177,235,237,239,242,244,246,248,251,253],{"class":179,"line":236},4,[177,238,190],{"class":183},[177,240,241],{"class":193},"name",[177,243,197],{"class":183},[177,245,200],{"class":183},[177,247,203],{"class":183},[177,249,250],{"class":206},"Default Organization",[177,252,197],{"class":183},[177,254,212],{"class":183},[177,256,258,260,263,265,267,271],{"class":179,"line":257},5,[177,259,190],{"class":183},[177,261,262],{"class":193},"funds",[177,264,197],{"class":183},[177,266,200],{"class":183},[177,268,270],{"class":269},"sbssI"," 0.0",[177,272,212],{"class":183},[177,274,276,278,281,283,285,288],{"class":179,"line":275},6,[177,277,190],{"class":183},[177,279,280],{"class":193},"reputation",[177,282,197],{"class":183},[177,284,200],{"class":183},[177,286,287],{"class":269}," 0",[177,289,212],{"class":183},[177,291,293,295,298,300,302],{"class":179,"line":292},7,[177,294,190],{"class":183},[177,296,297],{"class":193},"credit_lines",[177,299,197],{"class":183},[177,301,200],{"class":183},[177,303,304],{"class":183}," {}\n",[177,306,308],{"class":179,"line":307},8,[177,309,310],{"class":183},"}\n",[155,312,313],{},"Hot organization:",[167,315,317],{"className":169,"code":316,"language":171,"meta":172,"style":172},"{\n \"id\": \"default\",\n \"owner\": \"server\",\n \"name\": \"Default Organization\",\n \"funds\": 0.0,\n \"reputation\": 0,\n \"credit_lines\": {},\n \"assets\": {},\n \"fleet\": {},\n \"members\": {},\n \"pending_invites\": {}\n}\n",[174,318,319,323,341,359,377,391,405,418,431,445,459,473],{"__ignoreMap":172},[177,320,321],{"class":179,"line":180},[177,322,184],{"class":183},[177,324,325,327,329,331,333,335,337,339],{"class":179,"line":187},[177,326,190],{"class":183},[177,328,194],{"class":193},[177,330,197],{"class":183},[177,332,200],{"class":183},[177,334,203],{"class":183},[177,336,207],{"class":206},[177,338,197],{"class":183},[177,340,212],{"class":183},[177,342,343,345,347,349,351,353,355,357],{"class":179,"line":215},[177,344,190],{"class":183},[177,346,220],{"class":193},[177,348,197],{"class":183},[177,350,200],{"class":183},[177,352,203],{"class":183},[177,354,229],{"class":206},[177,356,197],{"class":183},[177,358,212],{"class":183},[177,360,361,363,365,367,369,371,373,375],{"class":179,"line":236},[177,362,190],{"class":183},[177,364,241],{"class":193},[177,366,197],{"class":183},[177,368,200],{"class":183},[177,370,203],{"class":183},[177,372,250],{"class":206},[177,374,197],{"class":183},[177,376,212],{"class":183},[177,378,379,381,383,385,387,389],{"class":179,"line":257},[177,380,190],{"class":183},[177,382,262],{"class":193},[177,384,197],{"class":183},[177,386,200],{"class":183},[177,388,270],{"class":269},[177,390,212],{"class":183},[177,392,393,395,397,399,401,403],{"class":179,"line":275},[177,394,190],{"class":183},[177,396,280],{"class":193},[177,398,197],{"class":183},[177,400,200],{"class":183},[177,402,287],{"class":269},[177,404,212],{"class":183},[177,406,407,409,411,413,415],{"class":179,"line":292},[177,408,190],{"class":183},[177,410,297],{"class":193},[177,412,197],{"class":183},[177,414,200],{"class":183},[177,416,417],{"class":183}," {},\n",[177,419,420,422,425,427,429],{"class":179,"line":307},[177,421,190],{"class":183},[177,423,424],{"class":193},"assets",[177,426,197],{"class":183},[177,428,200],{"class":183},[177,430,417],{"class":183},[177,432,434,436,439,441,443],{"class":179,"line":433},9,[177,435,190],{"class":183},[177,437,438],{"class":193},"fleet",[177,440,197],{"class":183},[177,442,200],{"class":183},[177,444,417],{"class":183},[177,446,448,450,453,455,457],{"class":179,"line":447},10,[177,449,190],{"class":183},[177,451,452],{"class":193},"members",[177,454,197],{"class":183},[177,456,200],{"class":183},[177,458,417],{"class":183},[177,460,462,464,467,469,471],{"class":179,"line":461},11,[177,463,190],{"class":183},[177,465,466],{"class":193},"pending_invites",[177,468,197],{"class":183},[177,470,200],{"class":183},[177,472,304],{"class":183},[177,474,476],{"class":179,"line":475},12,[177,477,310],{"class":183},[155,479,480],{},"Rules validated by the Rust service:",[482,483,484,494,502,507,512],"ul",{},[485,486,487,489,490,493],"li",{},[174,488,194],{}," must be non-empty and contain only alphanumeric characters or ",[174,491,492],{},"_",".",[485,495,496,498,499,501],{},[174,497,220],{}," must be ",[174,500,229],{}," or a 17-digit Steam UID.",[485,503,504,506],{},[174,505,241],{}," cannot be empty, cannot exceed 100 characters, and cannot contain\ncontrol characters.",[485,508,509,511],{},[174,510,262],{},", reputation, and credit line amounts cannot be negative.",[485,513,514],{},"Player registration is rejected when the player already belongs to a\nnon-default organization.",[159,516,518],{"id":517},"durable-commands","Durable Commands",[520,521,522,538],"table",{},[523,524,525],"thead",{},[526,527,528,532,535],"tr",{},[529,530,531],"th",{},"Command",[529,533,534],{},"Arguments",[529,536,537],{},"Returns",[539,540,541,561,574,591,611,627,641,658,672,689,703,721],"tbody",{},[526,542,543,549,558],{},[544,545,546],"td",{},[174,547,548],{},"org:create",[544,550,551,554,555],{},[174,552,553],{},"org_id",", ",[174,556,557],{},"org_json",[544,559,560],{},"Organization JSON.",[526,562,563,568,572],{},[544,564,565],{},[174,566,567],{},"org:get",[544,569,570],{},[174,571,553],{},[544,573,560],{},[526,575,576,581,588],{},[544,577,578],{},[174,579,580],{},"org:update",[544,582,583,554,585],{},[174,584,553],{},[174,586,587],{},"patch_json",[544,589,590],{},"Updated organization JSON.",[526,592,593,598,602],{},[544,594,595],{},[174,596,597],{},"org:exists",[544,599,600],{},[174,601,553],{},[544,603,604,607,608,493],{},[174,605,606],{},"true"," or ",[174,609,610],{},"false",[526,612,613,618,622],{},[544,614,615],{},[174,616,617],{},"org:delete",[544,619,620],{},[174,621,553],{},[544,623,624,493],{},[174,625,626],{},"OK",[526,628,629,634,638],{},[544,630,631],{},[174,632,633],{},"org:assets:get",[544,635,636],{},[174,637,553],{},[544,639,640],{},"Asset map JSON.",[526,642,643,648,655],{},[544,644,645],{},[174,646,647],{},"org:assets:update",[544,649,650,554,652],{},[174,651,553],{},[174,653,654],{},"assets_json",[544,656,657],{},"Updated asset map JSON.",[526,659,660,665,669],{},[544,661,662],{},[174,663,664],{},"org:fleet:get",[544,666,667],{},[174,668,553],{},[544,670,671],{},"Fleet map JSON.",[526,673,674,679,686],{},[544,675,676],{},[174,677,678],{},"org:fleet:update",[544,680,681,554,683],{},[174,682,553],{},[174,684,685],{},"fleet_json",[544,687,688],{},"Updated fleet map JSON.",[526,690,691,696,700],{},[544,692,693],{},[174,694,695],{},"org:members:get",[544,697,698],{},[174,699,553],{},[544,701,702],{},"Member array JSON.",[526,704,705,710,717],{},[544,706,707],{},[174,708,709],{},"org:members:add",[544,711,712,554,714],{},[174,713,553],{},[174,715,716],{},"member_uid",[544,718,719,493],{},[174,720,626],{},[526,722,723,728,734],{},[544,724,725],{},[174,726,727],{},"org:members:remove",[544,729,730,554,732],{},[174,731,553],{},[174,733,716],{},[544,735,736,493],{},[174,737,626],{},[159,739,741],{"id":740},"create-an-organization","Create an Organization",[155,743,744,745,493],{},"The command key is authoritative for ",[174,746,194],{},[167,748,752],{"className":749,"code":750,"language":751,"meta":172,"style":172},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _org = createHashMapFromArray [\n [\"id\", _orgId],\n [\"owner\", getPlayerUID player],\n [\"name\", \"Spearnet Logistics\"],\n [\"funds\", 0],\n [\"reputation\", 0],\n [\"credit_lines\", createHashMap]\n];\n\nprivate _result = \"forge_server\" callExtension [\"org:create\", [\n _orgId,\n toJSON _org\n]];\n","sqf",[174,753,754,759,764,769,774,779,784,789,794,800,805,810,815],{"__ignoreMap":172},[177,755,756],{"class":179,"line":180},[177,757,758],{},"private _org = createHashMapFromArray [\n",[177,760,761],{"class":179,"line":187},[177,762,763],{}," [\"id\", _orgId],\n",[177,765,766],{"class":179,"line":215},[177,767,768],{}," [\"owner\", getPlayerUID player],\n",[177,770,771],{"class":179,"line":236},[177,772,773],{}," [\"name\", \"Spearnet Logistics\"],\n",[177,775,776],{"class":179,"line":257},[177,777,778],{}," [\"funds\", 0],\n",[177,780,781],{"class":179,"line":275},[177,782,783],{}," [\"reputation\", 0],\n",[177,785,786],{"class":179,"line":292},[177,787,788],{}," [\"credit_lines\", createHashMap]\n",[177,790,791],{"class":179,"line":307},[177,792,793],{},"];\n",[177,795,796],{"class":179,"line":433},[177,797,799],{"emptyLinePlaceholder":798},true,"\n",[177,801,802],{"class":179,"line":447},[177,803,804],{},"private _result = \"forge_server\" callExtension [\"org:create\", [\n",[177,806,807],{"class":179,"line":461},[177,808,809],{}," _orgId,\n",[177,811,812],{"class":179,"line":475},[177,813,814],{}," toJSON _org\n",[177,816,818],{"class":179,"line":817},13,[177,819,820],{},"]];\n",[159,822,824],{"id":823},"update-organization-funds","Update Organization Funds",[167,826,828],{"className":749,"code":827,"language":751,"meta":172,"style":172},"private _patch = createHashMapFromArray [\n [\"funds\", 5000],\n [\"reputation\", 10]\n];\n\nprivate _result = \"forge_server\" callExtension [\"org:update\", [\n _orgId,\n toJSON _patch\n]];\n",[174,829,830,835,840,845,849,853,858,862,867],{"__ignoreMap":172},[177,831,832],{"class":179,"line":180},[177,833,834],{},"private _patch = createHashMapFromArray [\n",[177,836,837],{"class":179,"line":187},[177,838,839],{}," [\"funds\", 5000],\n",[177,841,842],{"class":179,"line":215},[177,843,844],{}," [\"reputation\", 10]\n",[177,846,847],{"class":179,"line":236},[177,848,793],{},[177,850,851],{"class":179,"line":257},[177,852,799],{"emptyLinePlaceholder":798},[177,854,855],{"class":179,"line":275},[177,856,857],{},"private _result = \"forge_server\" callExtension [\"org:update\", [\n",[177,859,860],{"class":179,"line":292},[177,861,809],{},[177,863,864],{"class":179,"line":307},[177,865,866],{}," toJSON _patch\n",[177,868,869],{"class":179,"line":433},[177,870,820],{},[155,872,873,874,554,876,554,878,554,880,212,882,884,885,493],{},"Supported durable patch fields are ",[174,875,194],{},[174,877,220],{},[174,879,241],{},[174,881,262],{},[174,883,280],{},", and ",[174,886,297],{},[159,888,890],{"id":889},"assets-and-fleet","Assets and Fleet",[155,892,893],{},"Assets are grouped by category, then classname.",[167,895,897],{"className":749,"code":896,"language":751,"meta":172,"style":172},"private _assets = createHashMapFromArray [\n [\"ammo\", createHashMapFromArray [\n [\"ACE_30Rnd_65x39_caseless_mag\", createHashMapFromArray [\n [\"classname\", \"ACE_30Rnd_65x39_caseless_mag\"],\n [\"type\", \"ammo\"],\n [\"quantity\", 20]\n ]]\n ]]\n];\n\n\"forge_server\" callExtension [\"org:assets:update\", [_orgId, toJSON _assets]];\n",[174,898,899,904,909,914,919,924,929,934,939,943,947],{"__ignoreMap":172},[177,900,901],{"class":179,"line":180},[177,902,903],{},"private _assets = createHashMapFromArray [\n",[177,905,906],{"class":179,"line":187},[177,907,908],{}," [\"ammo\", createHashMapFromArray [\n",[177,910,911],{"class":179,"line":215},[177,912,913],{}," [\"ACE_30Rnd_65x39_caseless_mag\", createHashMapFromArray [\n",[177,915,916],{"class":179,"line":236},[177,917,918],{}," [\"classname\", \"ACE_30Rnd_65x39_caseless_mag\"],\n",[177,920,921],{"class":179,"line":257},[177,922,923],{}," [\"type\", \"ammo\"],\n",[177,925,926],{"class":179,"line":275},[177,927,928],{}," [\"quantity\", 20]\n",[177,930,931],{"class":179,"line":292},[177,932,933],{}," ]]\n",[177,935,936],{"class":179,"line":307},[177,937,938],{}," ]]\n",[177,940,941],{"class":179,"line":433},[177,942,793],{},[177,944,945],{"class":179,"line":447},[177,946,799],{"emptyLinePlaceholder":798},[177,948,949],{"class":179,"line":461},[177,950,951],{},"\"forge_server\" callExtension [\"org:assets:update\", [_orgId, toJSON _assets]];\n",[155,953,954],{},"Fleet is keyed by an internal fleet entry ID.",[167,956,958],{"className":749,"code":957,"language":751,"meta":172,"style":172},"private _fleet = createHashMapFromArray [\n [\"B_Truck_01_transport_F_0\", createHashMapFromArray [\n [\"classname\", \"B_Truck_01_transport_F\"],\n [\"name\", \"Transport Truck\"],\n [\"type\", \"cars\"],\n [\"status\", \"Ready\"],\n [\"damage\", \"0%\"]\n ]]\n];\n\n\"forge_server\" callExtension [\"org:fleet:update\", [_orgId, toJSON _fleet]];\n",[174,959,960,965,970,975,980,985,990,995,999,1003,1007],{"__ignoreMap":172},[177,961,962],{"class":179,"line":180},[177,963,964],{},"private _fleet = createHashMapFromArray [\n",[177,966,967],{"class":179,"line":187},[177,968,969],{}," [\"B_Truck_01_transport_F_0\", createHashMapFromArray [\n",[177,971,972],{"class":179,"line":215},[177,973,974],{}," [\"classname\", \"B_Truck_01_transport_F\"],\n",[177,976,977],{"class":179,"line":236},[177,978,979],{}," [\"name\", \"Transport Truck\"],\n",[177,981,982],{"class":179,"line":257},[177,983,984],{}," [\"type\", \"cars\"],\n",[177,986,987],{"class":179,"line":275},[177,988,989],{}," [\"status\", \"Ready\"],\n",[177,991,992],{"class":179,"line":292},[177,993,994],{}," [\"damage\", \"0%\"]\n",[177,996,997],{"class":179,"line":307},[177,998,938],{},[177,1000,1001],{"class":179,"line":433},[177,1002,793],{},[177,1004,1005],{"class":179,"line":447},[177,1006,799],{"emptyLinePlaceholder":798},[177,1008,1009],{"class":179,"line":461},[177,1010,1011],{},"\"forge_server\" callExtension [\"org:fleet:update\", [_orgId, toJSON _fleet]];\n",[159,1013,1015],{"id":1014},"hot-state-commands","Hot-State Commands",[520,1017,1018,1028],{},[523,1019,1020],{},[526,1021,1022,1024,1026],{},[529,1023,531],{},[529,1025,534],{},[529,1027,537],{},[539,1029,1030,1044,1057,1073,1087,1101,1115,1129,1143,1156,1170,1184,1197,1212,1227,1241,1255,1269],{},[526,1031,1032,1037,1041],{},[544,1033,1034],{},[174,1035,1036],{},"org:hot:init",[544,1038,1039],{},[174,1040,553],{},[544,1042,1043],{},"Hot organization JSON.",[526,1045,1046,1051,1055],{},[544,1047,1048],{},[174,1049,1050],{},"org:hot:get",[544,1052,1053],{},[174,1054,553],{},[544,1056,1043],{},[526,1058,1059,1064,1071],{},[544,1060,1061],{},[174,1062,1063],{},"org:hot:override",[544,1065,1066,554,1068],{},[174,1067,553],{},[174,1069,1070],{},"hot_org_json",[544,1072,1043],{},[526,1074,1075,1080,1085],{},[544,1076,1077],{},[174,1078,1079],{},"org:hot:ensure_member",[544,1081,1082],{},[174,1083,1084],{},"context_json",[544,1086,1043],{},[526,1088,1089,1094,1098],{},[544,1090,1091],{},[174,1092,1093],{},"org:hot:member_invites",[544,1095,1096],{},[174,1097,716],{},[544,1099,1100],{},"Invite array JSON.",[526,1102,1103,1108,1112],{},[544,1104,1105],{},[174,1106,1107],{},"org:hot:register",[544,1109,1110],{},[174,1111,1084],{},[544,1113,1114],{},"Register result JSON.",[526,1116,1117,1122,1126],{},[544,1118,1119],{},[174,1120,1121],{},"org:hot:invite_member",[544,1123,1124],{},[174,1125,1084],{},[544,1127,1128],{},"Invite result JSON.",[526,1130,1131,1136,1140],{},[544,1132,1133],{},[174,1134,1135],{},"org:hot:accept_invite",[544,1137,1138],{},[174,1139,1084],{},[544,1141,1142],{},"Invite decision result JSON.",[526,1144,1145,1150,1154],{},[544,1146,1147],{},[174,1148,1149],{},"org:hot:decline_invite",[544,1151,1152],{},[174,1153,1084],{},[544,1155,1142],{},[526,1157,1158,1163,1167],{},[544,1159,1160],{},[174,1161,1162],{},"org:hot:assign_credit_line",[544,1164,1165],{},[174,1166,1084],{},[544,1168,1169],{},"Mutation result JSON.",[526,1171,1172,1177,1181],{},[544,1173,1174],{},[174,1175,1176],{},"org:hot:repay_credit_line",[544,1178,1179],{},[174,1180,1084],{},[544,1182,1183],{},"Repayment result JSON.",[526,1185,1186,1191,1195],{},[544,1187,1188],{},[174,1189,1190],{},"org:hot:charge_checkout",[544,1192,1193],{},[174,1194,1084],{},[544,1196,1169],{},[526,1198,1199,1204,1210],{},[544,1200,1201],{},[174,1202,1203],{},"org:hot:add_assets",[544,1205,1206,554,1208],{},[174,1207,1084],{},[174,1209,654],{},[544,1211,1169],{},[526,1213,1214,1219,1225],{},[544,1215,1216],{},[174,1217,1218],{},"org:hot:add_fleet",[544,1220,1221,554,1223],{},[174,1222,1084],{},[174,1224,685],{},[544,1226,1169],{},[526,1228,1229,1234,1238],{},[544,1230,1231],{},[174,1232,1233],{},"org:hot:leave",[544,1235,1236],{},[174,1237,1084],{},[544,1239,1240],{},"Leave result JSON.",[526,1242,1243,1248,1252],{},[544,1244,1245],{},[174,1246,1247],{},"org:hot:disband",[544,1249,1250],{},[174,1251,1084],{},[544,1253,1254],{},"Disband result JSON.",[526,1256,1257,1262,1266],{},[544,1258,1259],{},[174,1260,1261],{},"org:hot:save",[544,1263,1264],{},[174,1265,553],{},[544,1267,1268],{},"Current hot organization JSON and async durable save.",[526,1270,1271,1276,1280],{},[544,1272,1273],{},[174,1274,1275],{},"org:hot:remove",[544,1277,1278],{},[174,1279,553],{},[544,1281,1282,493],{},[174,1283,626],{},[159,1285,1287],{"id":1286},"register-from-ui-context","Register from UI Context",[167,1289,1291],{"className":749,"code":1290,"language":751,"meta":172,"style":172},"private _context = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", _orgId],\n [\"orgName\", \"Spearnet Logistics\"],\n [\"existingOrgId\", \"default\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"org:hot:register\", [toJSON _context]];\n",[174,1292,1293,1298,1303,1308,1313,1318,1323,1327,1331],{"__ignoreMap":172},[177,1294,1295],{"class":179,"line":180},[177,1296,1297],{},"private _context = createHashMapFromArray [\n",[177,1299,1300],{"class":179,"line":187},[177,1301,1302],{}," [\"requesterUid\", getPlayerUID player],\n",[177,1304,1305],{"class":179,"line":215},[177,1306,1307],{}," [\"requesterName\", name player],\n",[177,1309,1310],{"class":179,"line":236},[177,1311,1312],{}," [\"orgId\", _orgId],\n",[177,1314,1315],{"class":179,"line":257},[177,1316,1317],{}," [\"orgName\", \"Spearnet Logistics\"],\n",[177,1319,1320],{"class":179,"line":275},[177,1321,1322],{}," [\"existingOrgId\", \"default\"]\n",[177,1324,1325],{"class":179,"line":292},[177,1326,793],{},[177,1328,1329],{"class":179,"line":307},[177,1330,799],{"emptyLinePlaceholder":798},[177,1332,1333],{"class":179,"line":433},[177,1334,1335],{},"private _result = \"forge_server\" callExtension [\"org:hot:register\", [toJSON _context]];\n",[159,1337,1339],{"id":1338},"invite-and-accept","Invite and Accept",[167,1341,1343],{"className":749,"code":1342,"language":751,"meta":172,"style":172},"private _invite = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"targetUid\", _targetUid],\n [\"targetName\", _targetName],\n [\"targetOrgId\", \"default\"]\n];\n\n\"forge_server\" callExtension [\"org:hot:invite_member\", [toJSON _invite]];\n\nprivate _decision = createHashMapFromArray [\n [\"requesterUid\", _targetUid],\n [\"requesterName\", _targetName],\n [\"orgId\", _orgId],\n [\"existingOrgId\", \"default\"]\n];\n\n\"forge_server\" callExtension [\"org:hot:accept_invite\", [toJSON _decision]];\n",[174,1344,1345,1350,1354,1358,1362,1367,1372,1377,1382,1386,1390,1395,1399,1404,1410,1416,1421,1426,1431,1436],{"__ignoreMap":172},[177,1346,1347],{"class":179,"line":180},[177,1348,1349],{},"private _invite = createHashMapFromArray [\n",[177,1351,1352],{"class":179,"line":187},[177,1353,1302],{},[177,1355,1356],{"class":179,"line":215},[177,1357,1307],{},[177,1359,1360],{"class":179,"line":236},[177,1361,1312],{},[177,1363,1364],{"class":179,"line":257},[177,1365,1366],{}," [\"requesterIsDefaultOrgCeo\", false],\n",[177,1368,1369],{"class":179,"line":275},[177,1370,1371],{}," [\"targetUid\", _targetUid],\n",[177,1373,1374],{"class":179,"line":292},[177,1375,1376],{}," [\"targetName\", _targetName],\n",[177,1378,1379],{"class":179,"line":307},[177,1380,1381],{}," [\"targetOrgId\", \"default\"]\n",[177,1383,1384],{"class":179,"line":433},[177,1385,793],{},[177,1387,1388],{"class":179,"line":447},[177,1389,799],{"emptyLinePlaceholder":798},[177,1391,1392],{"class":179,"line":461},[177,1393,1394],{},"\"forge_server\" callExtension [\"org:hot:invite_member\", [toJSON _invite]];\n",[177,1396,1397],{"class":179,"line":475},[177,1398,799],{"emptyLinePlaceholder":798},[177,1400,1401],{"class":179,"line":817},[177,1402,1403],{},"private _decision = createHashMapFromArray [\n",[177,1405,1407],{"class":179,"line":1406},14,[177,1408,1409],{}," [\"requesterUid\", _targetUid],\n",[177,1411,1413],{"class":179,"line":1412},15,[177,1414,1415],{}," [\"requesterName\", _targetName],\n",[177,1417,1419],{"class":179,"line":1418},16,[177,1420,1312],{},[177,1422,1424],{"class":179,"line":1423},17,[177,1425,1322],{},[177,1427,1429],{"class":179,"line":1428},18,[177,1430,793],{},[177,1432,1434],{"class":179,"line":1433},19,[177,1435,799],{"emptyLinePlaceholder":798},[177,1437,1439],{"class":179,"line":1438},20,[177,1440,1441],{},"\"forge_server\" callExtension [\"org:hot:accept_invite\", [toJSON _decision]];\n",[159,1443,1445],{"id":1444},"credit-line-checkout","Credit Line Checkout",[167,1447,1449],{"className":749,"code":1448,"language":751,"meta":172,"style":172},"private _credit = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"memberUid\", _memberUid],\n [\"memberName\", _memberName],\n [\"amount\", 1000]\n];\n\n\"forge_server\" callExtension [\"org:hot:assign_credit_line\", [toJSON _credit]];\n\nprivate _charge = createHashMapFromArray [\n [\"requesterUid\", _memberUid],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"source\", \"credit_line\"],\n [\"amount\", 250],\n [\"commit\", true]\n];\n\n\"forge_server\" callExtension [\"org:hot:charge_checkout\", [toJSON _charge]];\n",[174,1450,1451,1456,1460,1464,1468,1473,1478,1483,1487,1491,1496,1500,1505,1510,1514,1518,1523,1528,1533,1537,1541],{"__ignoreMap":172},[177,1452,1453],{"class":179,"line":180},[177,1454,1455],{},"private _credit = createHashMapFromArray [\n",[177,1457,1458],{"class":179,"line":187},[177,1459,1302],{},[177,1461,1462],{"class":179,"line":215},[177,1463,1312],{},[177,1465,1466],{"class":179,"line":236},[177,1467,1366],{},[177,1469,1470],{"class":179,"line":257},[177,1471,1472],{}," [\"memberUid\", _memberUid],\n",[177,1474,1475],{"class":179,"line":275},[177,1476,1477],{}," [\"memberName\", _memberName],\n",[177,1479,1480],{"class":179,"line":292},[177,1481,1482],{}," [\"amount\", 1000]\n",[177,1484,1485],{"class":179,"line":307},[177,1486,793],{},[177,1488,1489],{"class":179,"line":433},[177,1490,799],{"emptyLinePlaceholder":798},[177,1492,1493],{"class":179,"line":447},[177,1494,1495],{},"\"forge_server\" callExtension [\"org:hot:assign_credit_line\", [toJSON _credit]];\n",[177,1497,1498],{"class":179,"line":461},[177,1499,799],{"emptyLinePlaceholder":798},[177,1501,1502],{"class":179,"line":475},[177,1503,1504],{},"private _charge = createHashMapFromArray [\n",[177,1506,1507],{"class":179,"line":817},[177,1508,1509],{}," [\"requesterUid\", _memberUid],\n",[177,1511,1512],{"class":179,"line":1406},[177,1513,1312],{},[177,1515,1516],{"class":179,"line":1412},[177,1517,1366],{},[177,1519,1520],{"class":179,"line":1418},[177,1521,1522],{}," [\"source\", \"credit_line\"],\n",[177,1524,1525],{"class":179,"line":1423},[177,1526,1527],{}," [\"amount\", 250],\n",[177,1529,1530],{"class":179,"line":1428},[177,1531,1532],{}," [\"commit\", true]\n",[177,1534,1535],{"class":179,"line":1433},[177,1536,793],{},[177,1538,1539],{"class":179,"line":1438},[177,1540,799],{"emptyLinePlaceholder":798},[177,1542,1544],{"class":179,"line":1543},21,[177,1545,1546],{},"\"forge_server\" callExtension [\"org:hot:charge_checkout\", [toJSON _charge]];\n",[159,1548,1550],{"id":1549},"error-handling","Error Handling",[167,1552,1554],{"className":749,"code":1553,"language":751,"meta":172,"style":172},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Organization error: %1\", _payload];\n};\n",[174,1555,1556,1561,1566,1571],{"__ignoreMap":172},[177,1557,1558],{"class":179,"line":180},[177,1559,1560],{},"private _payload = _result select 0;\n",[177,1562,1563],{"class":179,"line":187},[177,1564,1565],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[177,1567,1568],{"class":179,"line":215},[177,1569,1570],{}," systemChat format [\"Organization error: %1\", _payload];\n",[177,1572,1573],{"class":179,"line":236},[177,1574,1575],{},"};\n",[1577,1578,1579],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":172,"searchDepth":187,"depth":187,"links":1581},[1582,1583,1584,1585,1586,1587,1588,1589,1590,1591],{"id":161,"depth":187,"text":162},{"id":517,"depth":187,"text":518},{"id":740,"depth":187,"text":741},{"id":823,"depth":187,"text":824},{"id":889,"depth":187,"text":890},{"id":1014,"depth":187,"text":1015},{"id":1286,"depth":187,"text":1287},{"id":1338,"depth":187,"text":1339},{"id":1444,"depth":187,"text":1445},{"id":1549,"depth":187,"text":1550},"md",null,{},{"title":81,"description":157},"Y4vjjEPJa4IV64tDJwWSmfGqOhldckNTPDy2PpGmT14",[1598,1600],{"title":77,"path":78,"stem":79,"description":1599,"children":-1},"The locker module stores physical player inventory items by classname. It is\nseparate from the virtual arsenal unlock module documented in\nOwned Storage Usage Guide.",{"title":85,"path":86,"stem":87,"description":1601,"children":-1},"Owned storage covers the owned:locker and owned:garage extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/owned-storage.html b/docus/dist/server-modules/owned-storage.html index 1c9e479..cf2c5bc 100644 --- a/docus/dist/server-modules/owned-storage.html +++ b/docus/dist/server-modules/owned-storage.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Owned Storage Usage Guide - forge-docus

    Organization Usage Guide

    The organization module stores organization records, members, assets, fleet entries, and credit lines. Durable commands manage persisted records directly. Hot-state commands support the active organization UI workflows.

    Phone Usage Guide

    The phone module stores contacts, messages, and emails for each UID. It is a -server-extension state module backed by SurrealDB.

    \ No newline at end of file +server-extension state module backed by SurrealDB.

    \ No newline at end of file diff --git a/docus/dist/server-modules/owned-storage/_payload.json b/docus/dist/server-modules/owned-storage/_payload.json index 070fa63..f29b8ae 100644 --- a/docus/dist/server-modules/owned-storage/_payload.json +++ b/docus/dist/server-modules/owned-storage/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1207},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-owned-storage":145,"-server-modules-owned-storage-surround":1202},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":85,"body":147,"description":1196,"extension":1197,"links":1198,"meta":1199,"navigation":777,"path":86,"seo":1200,"stem":87,"__hash__":1201},"docs\u002F3.server-modules\u002F8.owned-storage.md",{"type":148,"value":149,"toc":1185},"minimark",[150,154,167,177,182,306,309,329,332,336,440,443,469,483,486,490,632,636,757,761,804,808,844,848,904,908,911,914,1015,1018,1152,1156,1181],[151,152,85],"h1",{"id":153},"owned-storage-usage-guide",[155,156,157,158,162,163,166],"p",{},"Owned storage covers the ",[159,160,161],"code",{},"owned:locker"," and ",[159,164,165],{},"owned:garage"," extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.",[155,168,169,170,173,174,176],{},"Use these modules for virtual arsenal and virtual garage unlocks. Use\n",[171,172,77],"a",{"href":78}," and\n",[171,175,73],{"href":74}," for physical inventory and stored\nvehicle instances.",[178,179,181],"h2",{"id":180},"owned-locker-model","Owned Locker Model",[183,184,189],"pre",{"className":185,"code":186,"language":187,"meta":188,"style":188},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"items\": [\"FirstAidKit\"],\n \"weapons\": [\"arifle_MX_F\"],\n \"magazines\": [\"30Rnd_65x39_caseless_black_mag\"],\n \"backpacks\": [\"B_AssaultPack_rgr\"]\n}\n","json","",[159,190,191,200,230,253,276,300],{"__ignoreMap":188},[192,193,196],"span",{"class":194,"line":195},"line",1,[192,197,199],{"class":198},"sMK4o","{\n",[192,201,203,206,210,213,216,219,221,225,227],{"class":194,"line":202},2,[192,204,205],{"class":198}," \"",[192,207,209],{"class":208},"spNyl","items",[192,211,212],{"class":198},"\"",[192,214,215],{"class":198},":",[192,217,218],{"class":198}," [",[192,220,212],{"class":198},[192,222,224],{"class":223},"sfazB","FirstAidKit",[192,226,212],{"class":198},[192,228,229],{"class":198},"],\n",[192,231,233,235,238,240,242,244,246,249,251],{"class":194,"line":232},3,[192,234,205],{"class":198},[192,236,237],{"class":208},"weapons",[192,239,212],{"class":198},[192,241,215],{"class":198},[192,243,218],{"class":198},[192,245,212],{"class":198},[192,247,248],{"class":223},"arifle_MX_F",[192,250,212],{"class":198},[192,252,229],{"class":198},[192,254,256,258,261,263,265,267,269,272,274],{"class":194,"line":255},4,[192,257,205],{"class":198},[192,259,260],{"class":208},"magazines",[192,262,212],{"class":198},[192,264,215],{"class":198},[192,266,218],{"class":198},[192,268,212],{"class":198},[192,270,271],{"class":223},"30Rnd_65x39_caseless_black_mag",[192,273,212],{"class":198},[192,275,229],{"class":198},[192,277,279,281,284,286,288,290,292,295,297],{"class":194,"line":278},5,[192,280,205],{"class":198},[192,282,283],{"class":208},"backpacks",[192,285,212],{"class":198},[192,287,215],{"class":198},[192,289,218],{"class":198},[192,291,212],{"class":198},[192,293,294],{"class":223},"B_AssaultPack_rgr",[192,296,212],{"class":198},[192,298,299],{"class":198},"]\n",[192,301,303],{"class":194,"line":302},6,[192,304,305],{"class":198},"}\n",[155,307,308],{},"Supported owned locker categories:",[310,311,312,317,321,325],"ul",{},[313,314,315],"li",{},[159,316,209],{},[313,318,319],{},[159,320,237],{},[313,322,323],{},[159,324,260],{},[313,326,327],{},[159,328,283],{},[155,330,331],{},"New owned lockers are created with default unlocks from the Rust model.",[178,333,335],{"id":334},"owned-garage-model","Owned Garage Model",[183,337,339],{"className":185,"code":338,"language":187,"meta":188,"style":188},"{\n \"cars\": [\"B_Quadbike_01_F\"],\n \"armor\": [],\n \"helis\": [],\n \"planes\": [],\n \"naval\": [],\n \"other\": []\n}\n",[159,340,341,345,367,381,394,407,420,435],{"__ignoreMap":188},[192,342,343],{"class":194,"line":195},[192,344,199],{"class":198},[192,346,347,349,352,354,356,358,360,363,365],{"class":194,"line":202},[192,348,205],{"class":198},[192,350,351],{"class":208},"cars",[192,353,212],{"class":198},[192,355,215],{"class":198},[192,357,218],{"class":198},[192,359,212],{"class":198},[192,361,362],{"class":223},"B_Quadbike_01_F",[192,364,212],{"class":198},[192,366,229],{"class":198},[192,368,369,371,374,376,378],{"class":194,"line":232},[192,370,205],{"class":198},[192,372,373],{"class":208},"armor",[192,375,212],{"class":198},[192,377,215],{"class":198},[192,379,380],{"class":198}," [],\n",[192,382,383,385,388,390,392],{"class":194,"line":255},[192,384,205],{"class":198},[192,386,387],{"class":208},"helis",[192,389,212],{"class":198},[192,391,215],{"class":198},[192,393,380],{"class":198},[192,395,396,398,401,403,405],{"class":194,"line":278},[192,397,205],{"class":198},[192,399,400],{"class":208},"planes",[192,402,212],{"class":198},[192,404,215],{"class":198},[192,406,380],{"class":198},[192,408,409,411,414,416,418],{"class":194,"line":302},[192,410,205],{"class":198},[192,412,413],{"class":208},"naval",[192,415,212],{"class":198},[192,417,215],{"class":198},[192,419,380],{"class":198},[192,421,423,425,428,430,432],{"class":194,"line":422},7,[192,424,205],{"class":198},[192,426,427],{"class":208},"other",[192,429,212],{"class":198},[192,431,215],{"class":198},[192,433,434],{"class":198}," []\n",[192,436,438],{"class":194,"line":437},8,[192,439,305],{"class":198},[155,441,442],{},"Supported owned garage categories:",[310,444,445,449,453,457,461,465],{},[313,446,447],{},[159,448,351],{},[313,450,451],{},[159,452,373],{},[313,454,455],{},[159,456,387],{},[313,458,459],{},[159,460,400],{},[313,462,463],{},[159,464,413],{},[313,466,467],{},[159,468,427],{},[155,470,471,472,475,476,479,480,482],{},"The durable ",[159,473,474],{},"owned:garage:remove"," command currently accepts ",[159,477,478],{},"heli"," for the\nhelicopter category. Add, get, and hot remove accept ",[159,481,387],{},".",[155,484,485],{},"New owned garages are created with default unlocks from the Rust model.",[178,487,489],{"id":488},"owned-locker-commands","Owned Locker Commands",[491,492,493,509],"table",{},[494,495,496],"thead",{},[497,498,499,503,506],"tr",{},[500,501,502],"th",{},"Command",[500,504,505],{},"Arguments",[500,507,508],{},"Returns",[510,511,512,528,541,559,578,596,612],"tbody",{},[497,513,514,520,525],{},[515,516,517],"td",{},[159,518,519],{},"owned:locker:create",[515,521,522],{},[159,523,524],{},"uid",[515,526,527],{},"Full owned locker JSON.",[497,529,530,535,539],{},[515,531,532],{},[159,533,534],{},"owned:locker:fetch",[515,536,537],{},[159,538,524],{},[515,540,527],{},[497,542,543,548,556],{},[515,544,545],{},[159,546,547],{},"owned:locker:get",[515,549,550,552,553],{},[159,551,524],{},", ",[159,554,555],{},"category",[515,557,558],{},"Category classname array JSON.",[497,560,561,566,575],{},[515,562,563],{},[159,564,565],{},"owned:locker:add",[515,567,568,552,570,552,572],{},[159,569,524],{},[159,571,555],{},[159,573,574],{},"classnames_json",[515,576,577],{},"Updated category array JSON.",[497,579,580,585,594],{},[515,581,582],{},[159,583,584],{},"owned:locker:remove",[515,586,587,552,589,552,591],{},[159,588,524],{},[159,590,555],{},[159,592,593],{},"classname",[515,595,577],{},[497,597,598,603,607],{},[515,599,600],{},[159,601,602],{},"owned:locker:delete",[515,604,605],{},[159,606,524],{},[515,608,609,482],{},[159,610,611],{},"OK",[497,613,614,619,623],{},[515,615,616],{},[159,617,618],{},"owned:locker:exists",[515,620,621],{},[159,622,524],{},[515,624,625,628,629,482],{},[159,626,627],{},"true"," or ",[159,630,631],{},"false",[178,633,635],{"id":634},"owned-garage-commands","Owned Garage Commands",[491,637,638,648],{},[494,639,640],{},[497,641,642,644,646],{},[500,643,502],{},[500,645,505],{},[500,647,508],{},[510,649,650,664,677,692,709,725,740],{},[497,651,652,657,661],{},[515,653,654],{},[159,655,656],{},"owned:garage:create",[515,658,659],{},[159,660,524],{},[515,662,663],{},"Full owned garage JSON.",[497,665,666,671,675],{},[515,667,668],{},[159,669,670],{},"owned:garage:fetch",[515,672,673],{},[159,674,524],{},[515,676,663],{},[497,678,679,684,690],{},[515,680,681],{},[159,682,683],{},"owned:garage:get",[515,685,686,552,688],{},[159,687,524],{},[159,689,555],{},[515,691,558],{},[497,693,694,699,707],{},[515,695,696],{},[159,697,698],{},"owned:garage:add",[515,700,701,552,703,552,705],{},[159,702,524],{},[159,704,555],{},[159,706,574],{},[515,708,577],{},[497,710,711,715,723],{},[515,712,713],{},[159,714,474],{},[515,716,717,552,719,552,721],{},[159,718,524],{},[159,720,555],{},[159,722,593],{},[515,724,577],{},[497,726,727,732,736],{},[515,728,729],{},[159,730,731],{},"owned:garage:delete",[515,733,734],{},[159,735,524],{},[515,737,738,482],{},[159,739,611],{},[497,741,742,747,751],{},[515,743,744],{},[159,745,746],{},"owned:garage:exists",[515,748,749],{},[159,750,524],{},[515,752,753,628,755,482],{},[159,754,627],{},[159,756,631],{},[178,758,760],{"id":759},"add-virtual-arsenal-unlocks","Add Virtual Arsenal Unlocks",[183,762,766],{"className":763,"code":764,"language":765,"meta":188,"style":188},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _classes = [\"arifle_MX_F\", \"hgun_P07_F\"];\n\nprivate _result = \"forge_server\" callExtension [\"owned:locker:add\", [\n getPlayerUID player,\n \"weapons\",\n toJSON _classes\n]];\n","sqf",[159,767,768,773,779,784,789,794,799],{"__ignoreMap":188},[192,769,770],{"class":194,"line":195},[192,771,772],{},"private _classes = [\"arifle_MX_F\", \"hgun_P07_F\"];\n",[192,774,775],{"class":194,"line":202},[192,776,778],{"emptyLinePlaceholder":777},true,"\n",[192,780,781],{"class":194,"line":232},[192,782,783],{},"private _result = \"forge_server\" callExtension [\"owned:locker:add\", [\n",[192,785,786],{"class":194,"line":255},[192,787,788],{}," getPlayerUID player,\n",[192,790,791],{"class":194,"line":278},[192,792,793],{}," \"weapons\",\n",[192,795,796],{"class":194,"line":302},[192,797,798],{}," toJSON _classes\n",[192,800,801],{"class":194,"line":422},[192,802,803],{},"]];\n",[178,805,807],{"id":806},"add-virtual-garage-unlocks","Add Virtual Garage Unlocks",[183,809,811],{"className":763,"code":810,"language":765,"meta":188,"style":188},"private _classes = [\"B_Quadbike_01_F\", \"B_MRAP_01_F\"];\n\nprivate _result = \"forge_server\" callExtension [\"owned:garage:add\", [\n getPlayerUID player,\n \"cars\",\n toJSON _classes\n]];\n",[159,812,813,818,822,827,831,836,840],{"__ignoreMap":188},[192,814,815],{"class":194,"line":195},[192,816,817],{},"private _classes = [\"B_Quadbike_01_F\", \"B_MRAP_01_F\"];\n",[192,819,820],{"class":194,"line":202},[192,821,778],{"emptyLinePlaceholder":777},[192,823,824],{"class":194,"line":232},[192,825,826],{},"private _result = \"forge_server\" callExtension [\"owned:garage:add\", [\n",[192,828,829],{"class":194,"line":255},[192,830,788],{},[192,832,833],{"class":194,"line":278},[192,834,835],{}," \"cars\",\n",[192,837,838],{"class":194,"line":302},[192,839,798],{},[192,841,842],{"class":194,"line":422},[192,843,803],{},[178,845,847],{"id":846},"remove-an-unlock","Remove an Unlock",[183,849,851],{"className":763,"code":850,"language":765,"meta":188,"style":188},"\"forge_server\" callExtension [\"owned:locker:remove\", [\n getPlayerUID player,\n \"weapons\",\n \"arifle_MX_F\"\n]];\n\n\"forge_server\" callExtension [\"owned:garage:remove\", [\n getPlayerUID player,\n \"cars\",\n \"B_Quadbike_01_F\"\n]];\n",[159,852,853,858,862,866,871,875,879,884,888,893,899],{"__ignoreMap":188},[192,854,855],{"class":194,"line":195},[192,856,857],{},"\"forge_server\" callExtension [\"owned:locker:remove\", [\n",[192,859,860],{"class":194,"line":202},[192,861,788],{},[192,863,864],{"class":194,"line":232},[192,865,793],{},[192,867,868],{"class":194,"line":255},[192,869,870],{}," \"arifle_MX_F\"\n",[192,872,873],{"class":194,"line":278},[192,874,803],{},[192,876,877],{"class":194,"line":302},[192,878,778],{"emptyLinePlaceholder":777},[192,880,881],{"class":194,"line":422},[192,882,883],{},"\"forge_server\" callExtension [\"owned:garage:remove\", [\n",[192,885,886],{"class":194,"line":437},[192,887,788],{},[192,889,891],{"class":194,"line":890},9,[192,892,835],{},[192,894,896],{"class":194,"line":895},10,[192,897,898],{}," \"B_Quadbike_01_F\"\n",[192,900,902],{"class":194,"line":901},11,[192,903,803],{},[178,905,907],{"id":906},"hot-state-commands","Hot-State Commands",[155,909,910],{},"Both owned storage modules support hot state.",[155,912,913],{},"Owned locker:",[491,915,916,926],{},[494,917,918],{},[497,919,920,922,924],{},[500,921,502],{},[500,923,505],{},[500,925,508],{},[510,927,928,941,954,970,986,1000],{},[497,929,930,935,939],{},[515,931,932],{},[159,933,934],{},"owned:locker:hot:init",[515,936,937],{},[159,938,524],{},[515,940,527],{},[497,942,943,948,952],{},[515,944,945],{},[159,946,947],{},"owned:locker:hot:fetch",[515,949,950],{},[159,951,524],{},[515,953,527],{},[497,955,956,961,967],{},[515,957,958],{},[159,959,960],{},"owned:locker:hot:get",[515,962,963,552,965],{},[159,964,524],{},[159,966,555],{},[515,968,969],{},"Category array JSON.",[497,971,972,977,984],{},[515,973,974],{},[159,975,976],{},"owned:locker:hot:override",[515,978,979,552,981],{},[159,980,524],{},[159,982,983],{},"locker_json",[515,985,527],{},[497,987,988,993,997],{},[515,989,990],{},[159,991,992],{},"owned:locker:hot:save",[515,994,995],{},[159,996,524],{},[515,998,999],{},"Current hot owned locker JSON and async durable save.",[497,1001,1002,1007,1011],{},[515,1003,1004],{},[159,1005,1006],{},"owned:locker:hot:remove",[515,1008,1009],{},[159,1010,524],{},[515,1012,1013,482],{},[159,1014,611],{},[155,1016,1017],{},"Owned garage:",[491,1019,1020,1030],{},[494,1021,1022],{},[497,1023,1024,1026,1028],{},[500,1025,502],{},[500,1027,505],{},[500,1029,508],{},[510,1031,1032,1045,1058,1073,1089,1106,1123,1137],{},[497,1033,1034,1039,1043],{},[515,1035,1036],{},[159,1037,1038],{},"owned:garage:hot:init",[515,1040,1041],{},[159,1042,524],{},[515,1044,663],{},[497,1046,1047,1052,1056],{},[515,1048,1049],{},[159,1050,1051],{},"owned:garage:hot:fetch",[515,1053,1054],{},[159,1055,524],{},[515,1057,663],{},[497,1059,1060,1065,1071],{},[515,1061,1062],{},[159,1063,1064],{},"owned:garage:hot:get",[515,1066,1067,552,1069],{},[159,1068,524],{},[159,1070,555],{},[515,1072,969],{},[497,1074,1075,1080,1087],{},[515,1076,1077],{},[159,1078,1079],{},"owned:garage:hot:override",[515,1081,1082,552,1084],{},[159,1083,524],{},[159,1085,1086],{},"garage_json",[515,1088,663],{},[497,1090,1091,1096,1104],{},[515,1092,1093],{},[159,1094,1095],{},"owned:garage:hot:add",[515,1097,1098,552,1100,552,1102],{},[159,1099,524],{},[159,1101,555],{},[159,1103,574],{},[515,1105,577],{},[497,1107,1108,1113,1121],{},[515,1109,1110],{},[159,1111,1112],{},"owned:garage:hot:remove_item",[515,1114,1115,552,1117,552,1119],{},[159,1116,524],{},[159,1118,555],{},[159,1120,593],{},[515,1122,577],{},[497,1124,1125,1130,1134],{},[515,1126,1127],{},[159,1128,1129],{},"owned:garage:hot:save",[515,1131,1132],{},[159,1133,524],{},[515,1135,1136],{},"Current hot owned garage JSON and async durable save.",[497,1138,1139,1144,1148],{},[515,1140,1141],{},[159,1142,1143],{},"owned:garage:hot:remove",[515,1145,1146],{},[159,1147,524],{},[515,1149,1150,482],{},[159,1151,611],{},[178,1153,1155],{"id":1154},"error-handling","Error Handling",[183,1157,1159],{"className":763,"code":1158,"language":765,"meta":188,"style":188},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Owned storage error: %1\", _payload];\n};\n",[159,1160,1161,1166,1171,1176],{"__ignoreMap":188},[192,1162,1163],{"class":194,"line":195},[192,1164,1165],{},"private _payload = _result select 0;\n",[192,1167,1168],{"class":194,"line":202},[192,1169,1170],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[192,1172,1173],{"class":194,"line":232},[192,1174,1175],{}," systemChat format [\"Owned storage error: %1\", _payload];\n",[192,1177,1178],{"class":194,"line":255},[192,1179,1180],{},"};\n",[1182,1183,1184],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":188,"searchDepth":202,"depth":202,"links":1186},[1187,1188,1189,1190,1191,1192,1193,1194,1195],{"id":180,"depth":202,"text":181},{"id":334,"depth":202,"text":335},{"id":488,"depth":202,"text":489},{"id":634,"depth":202,"text":635},{"id":759,"depth":202,"text":760},{"id":806,"depth":202,"text":807},{"id":846,"depth":202,"text":847},{"id":906,"depth":202,"text":907},{"id":1154,"depth":202,"text":1155},"Owned storage covers the owned:locker and owned:garage extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.","md",null,{},{"title":85,"description":1196},"nP0406Z4TVsnIwUqdf0Vek8hNgWLWl16LRWagO6eMP0",[1203,1205],{"title":81,"path":82,"stem":83,"description":1204,"children":-1},"The organization module stores organization records, members, assets, fleet\nentries, and credit lines. Durable commands manage persisted records directly.\nHot-state commands support the active organization UI workflows.",{"title":89,"path":90,"stem":91,"description":1206,"children":-1},"The phone module stores contacts, messages, and emails for each UID. It is a\nserver-extension state module backed by SurrealDB.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1207},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-owned-storage":145,"-server-modules-owned-storage-surround":1202},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":85,"body":147,"description":1196,"extension":1197,"links":1198,"meta":1199,"navigation":777,"path":86,"seo":1200,"stem":87,"__hash__":1201},"docs\u002F3.server-modules\u002F8.owned-storage.md",{"type":148,"value":149,"toc":1185},"minimark",[150,154,167,177,182,306,309,329,332,336,440,443,469,483,486,490,632,636,757,761,804,808,844,848,904,908,911,914,1015,1018,1152,1156,1181],[151,152,85],"h1",{"id":153},"owned-storage-usage-guide",[155,156,157,158,162,163,166],"p",{},"Owned storage covers the ",[159,160,161],"code",{},"owned:locker"," and ",[159,164,165],{},"owned:garage"," extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.",[155,168,169,170,173,174,176],{},"Use these modules for virtual arsenal and virtual garage unlocks. Use\n",[171,172,77],"a",{"href":78}," and\n",[171,175,73],{"href":74}," for physical inventory and stored\nvehicle instances.",[178,179,181],"h2",{"id":180},"owned-locker-model","Owned Locker Model",[183,184,189],"pre",{"className":185,"code":186,"language":187,"meta":188,"style":188},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"items\": [\"FirstAidKit\"],\n \"weapons\": [\"arifle_MX_F\"],\n \"magazines\": [\"30Rnd_65x39_caseless_black_mag\"],\n \"backpacks\": [\"B_AssaultPack_rgr\"]\n}\n","json","",[159,190,191,200,230,253,276,300],{"__ignoreMap":188},[192,193,196],"span",{"class":194,"line":195},"line",1,[192,197,199],{"class":198},"sMK4o","{\n",[192,201,203,206,210,213,216,219,221,225,227],{"class":194,"line":202},2,[192,204,205],{"class":198}," \"",[192,207,209],{"class":208},"spNyl","items",[192,211,212],{"class":198},"\"",[192,214,215],{"class":198},":",[192,217,218],{"class":198}," [",[192,220,212],{"class":198},[192,222,224],{"class":223},"sfazB","FirstAidKit",[192,226,212],{"class":198},[192,228,229],{"class":198},"],\n",[192,231,233,235,238,240,242,244,246,249,251],{"class":194,"line":232},3,[192,234,205],{"class":198},[192,236,237],{"class":208},"weapons",[192,239,212],{"class":198},[192,241,215],{"class":198},[192,243,218],{"class":198},[192,245,212],{"class":198},[192,247,248],{"class":223},"arifle_MX_F",[192,250,212],{"class":198},[192,252,229],{"class":198},[192,254,256,258,261,263,265,267,269,272,274],{"class":194,"line":255},4,[192,257,205],{"class":198},[192,259,260],{"class":208},"magazines",[192,262,212],{"class":198},[192,264,215],{"class":198},[192,266,218],{"class":198},[192,268,212],{"class":198},[192,270,271],{"class":223},"30Rnd_65x39_caseless_black_mag",[192,273,212],{"class":198},[192,275,229],{"class":198},[192,277,279,281,284,286,288,290,292,295,297],{"class":194,"line":278},5,[192,280,205],{"class":198},[192,282,283],{"class":208},"backpacks",[192,285,212],{"class":198},[192,287,215],{"class":198},[192,289,218],{"class":198},[192,291,212],{"class":198},[192,293,294],{"class":223},"B_AssaultPack_rgr",[192,296,212],{"class":198},[192,298,299],{"class":198},"]\n",[192,301,303],{"class":194,"line":302},6,[192,304,305],{"class":198},"}\n",[155,307,308],{},"Supported owned locker categories:",[310,311,312,317,321,325],"ul",{},[313,314,315],"li",{},[159,316,209],{},[313,318,319],{},[159,320,237],{},[313,322,323],{},[159,324,260],{},[313,326,327],{},[159,328,283],{},[155,330,331],{},"New owned lockers are created with default unlocks from the Rust model.",[178,333,335],{"id":334},"owned-garage-model","Owned Garage Model",[183,337,339],{"className":185,"code":338,"language":187,"meta":188,"style":188},"{\n \"cars\": [\"B_Quadbike_01_F\"],\n \"armor\": [],\n \"helis\": [],\n \"planes\": [],\n \"naval\": [],\n \"other\": []\n}\n",[159,340,341,345,367,381,394,407,420,435],{"__ignoreMap":188},[192,342,343],{"class":194,"line":195},[192,344,199],{"class":198},[192,346,347,349,352,354,356,358,360,363,365],{"class":194,"line":202},[192,348,205],{"class":198},[192,350,351],{"class":208},"cars",[192,353,212],{"class":198},[192,355,215],{"class":198},[192,357,218],{"class":198},[192,359,212],{"class":198},[192,361,362],{"class":223},"B_Quadbike_01_F",[192,364,212],{"class":198},[192,366,229],{"class":198},[192,368,369,371,374,376,378],{"class":194,"line":232},[192,370,205],{"class":198},[192,372,373],{"class":208},"armor",[192,375,212],{"class":198},[192,377,215],{"class":198},[192,379,380],{"class":198}," [],\n",[192,382,383,385,388,390,392],{"class":194,"line":255},[192,384,205],{"class":198},[192,386,387],{"class":208},"helis",[192,389,212],{"class":198},[192,391,215],{"class":198},[192,393,380],{"class":198},[192,395,396,398,401,403,405],{"class":194,"line":278},[192,397,205],{"class":198},[192,399,400],{"class":208},"planes",[192,402,212],{"class":198},[192,404,215],{"class":198},[192,406,380],{"class":198},[192,408,409,411,414,416,418],{"class":194,"line":302},[192,410,205],{"class":198},[192,412,413],{"class":208},"naval",[192,415,212],{"class":198},[192,417,215],{"class":198},[192,419,380],{"class":198},[192,421,423,425,428,430,432],{"class":194,"line":422},7,[192,424,205],{"class":198},[192,426,427],{"class":208},"other",[192,429,212],{"class":198},[192,431,215],{"class":198},[192,433,434],{"class":198}," []\n",[192,436,438],{"class":194,"line":437},8,[192,439,305],{"class":198},[155,441,442],{},"Supported owned garage categories:",[310,444,445,449,453,457,461,465],{},[313,446,447],{},[159,448,351],{},[313,450,451],{},[159,452,373],{},[313,454,455],{},[159,456,387],{},[313,458,459],{},[159,460,400],{},[313,462,463],{},[159,464,413],{},[313,466,467],{},[159,468,427],{},[155,470,471,472,475,476,479,480,482],{},"The durable ",[159,473,474],{},"owned:garage:remove"," command currently accepts ",[159,477,478],{},"heli"," for the\nhelicopter category. Add, get, and hot remove accept ",[159,481,387],{},".",[155,484,485],{},"New owned garages are created with default unlocks from the Rust model.",[178,487,489],{"id":488},"owned-locker-commands","Owned Locker Commands",[491,492,493,509],"table",{},[494,495,496],"thead",{},[497,498,499,503,506],"tr",{},[500,501,502],"th",{},"Command",[500,504,505],{},"Arguments",[500,507,508],{},"Returns",[510,511,512,528,541,559,578,596,612],"tbody",{},[497,513,514,520,525],{},[515,516,517],"td",{},[159,518,519],{},"owned:locker:create",[515,521,522],{},[159,523,524],{},"uid",[515,526,527],{},"Full owned locker JSON.",[497,529,530,535,539],{},[515,531,532],{},[159,533,534],{},"owned:locker:fetch",[515,536,537],{},[159,538,524],{},[515,540,527],{},[497,542,543,548,556],{},[515,544,545],{},[159,546,547],{},"owned:locker:get",[515,549,550,552,553],{},[159,551,524],{},", ",[159,554,555],{},"category",[515,557,558],{},"Category classname array JSON.",[497,560,561,566,575],{},[515,562,563],{},[159,564,565],{},"owned:locker:add",[515,567,568,552,570,552,572],{},[159,569,524],{},[159,571,555],{},[159,573,574],{},"classnames_json",[515,576,577],{},"Updated category array JSON.",[497,579,580,585,594],{},[515,581,582],{},[159,583,584],{},"owned:locker:remove",[515,586,587,552,589,552,591],{},[159,588,524],{},[159,590,555],{},[159,592,593],{},"classname",[515,595,577],{},[497,597,598,603,607],{},[515,599,600],{},[159,601,602],{},"owned:locker:delete",[515,604,605],{},[159,606,524],{},[515,608,609,482],{},[159,610,611],{},"OK",[497,613,614,619,623],{},[515,615,616],{},[159,617,618],{},"owned:locker:exists",[515,620,621],{},[159,622,524],{},[515,624,625,628,629,482],{},[159,626,627],{},"true"," or ",[159,630,631],{},"false",[178,633,635],{"id":634},"owned-garage-commands","Owned Garage Commands",[491,637,638,648],{},[494,639,640],{},[497,641,642,644,646],{},[500,643,502],{},[500,645,505],{},[500,647,508],{},[510,649,650,664,677,692,709,725,740],{},[497,651,652,657,661],{},[515,653,654],{},[159,655,656],{},"owned:garage:create",[515,658,659],{},[159,660,524],{},[515,662,663],{},"Full owned garage JSON.",[497,665,666,671,675],{},[515,667,668],{},[159,669,670],{},"owned:garage:fetch",[515,672,673],{},[159,674,524],{},[515,676,663],{},[497,678,679,684,690],{},[515,680,681],{},[159,682,683],{},"owned:garage:get",[515,685,686,552,688],{},[159,687,524],{},[159,689,555],{},[515,691,558],{},[497,693,694,699,707],{},[515,695,696],{},[159,697,698],{},"owned:garage:add",[515,700,701,552,703,552,705],{},[159,702,524],{},[159,704,555],{},[159,706,574],{},[515,708,577],{},[497,710,711,715,723],{},[515,712,713],{},[159,714,474],{},[515,716,717,552,719,552,721],{},[159,718,524],{},[159,720,555],{},[159,722,593],{},[515,724,577],{},[497,726,727,732,736],{},[515,728,729],{},[159,730,731],{},"owned:garage:delete",[515,733,734],{},[159,735,524],{},[515,737,738,482],{},[159,739,611],{},[497,741,742,747,751],{},[515,743,744],{},[159,745,746],{},"owned:garage:exists",[515,748,749],{},[159,750,524],{},[515,752,753,628,755,482],{},[159,754,627],{},[159,756,631],{},[178,758,760],{"id":759},"add-virtual-arsenal-unlocks","Add Virtual Arsenal Unlocks",[183,762,766],{"className":763,"code":764,"language":765,"meta":188,"style":188},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _classes = [\"arifle_MX_F\", \"hgun_P07_F\"];\n\nprivate _result = \"forge_server\" callExtension [\"owned:locker:add\", [\n getPlayerUID player,\n \"weapons\",\n toJSON _classes\n]];\n","sqf",[159,767,768,773,779,784,789,794,799],{"__ignoreMap":188},[192,769,770],{"class":194,"line":195},[192,771,772],{},"private _classes = [\"arifle_MX_F\", \"hgun_P07_F\"];\n",[192,774,775],{"class":194,"line":202},[192,776,778],{"emptyLinePlaceholder":777},true,"\n",[192,780,781],{"class":194,"line":232},[192,782,783],{},"private _result = \"forge_server\" callExtension [\"owned:locker:add\", [\n",[192,785,786],{"class":194,"line":255},[192,787,788],{}," getPlayerUID player,\n",[192,790,791],{"class":194,"line":278},[192,792,793],{}," \"weapons\",\n",[192,795,796],{"class":194,"line":302},[192,797,798],{}," toJSON _classes\n",[192,800,801],{"class":194,"line":422},[192,802,803],{},"]];\n",[178,805,807],{"id":806},"add-virtual-garage-unlocks","Add Virtual Garage Unlocks",[183,809,811],{"className":763,"code":810,"language":765,"meta":188,"style":188},"private _classes = [\"B_Quadbike_01_F\", \"B_MRAP_01_F\"];\n\nprivate _result = \"forge_server\" callExtension [\"owned:garage:add\", [\n getPlayerUID player,\n \"cars\",\n toJSON _classes\n]];\n",[159,812,813,818,822,827,831,836,840],{"__ignoreMap":188},[192,814,815],{"class":194,"line":195},[192,816,817],{},"private _classes = [\"B_Quadbike_01_F\", \"B_MRAP_01_F\"];\n",[192,819,820],{"class":194,"line":202},[192,821,778],{"emptyLinePlaceholder":777},[192,823,824],{"class":194,"line":232},[192,825,826],{},"private _result = \"forge_server\" callExtension [\"owned:garage:add\", [\n",[192,828,829],{"class":194,"line":255},[192,830,788],{},[192,832,833],{"class":194,"line":278},[192,834,835],{}," \"cars\",\n",[192,837,838],{"class":194,"line":302},[192,839,798],{},[192,841,842],{"class":194,"line":422},[192,843,803],{},[178,845,847],{"id":846},"remove-an-unlock","Remove an Unlock",[183,849,851],{"className":763,"code":850,"language":765,"meta":188,"style":188},"\"forge_server\" callExtension [\"owned:locker:remove\", [\n getPlayerUID player,\n \"weapons\",\n \"arifle_MX_F\"\n]];\n\n\"forge_server\" callExtension [\"owned:garage:remove\", [\n getPlayerUID player,\n \"cars\",\n \"B_Quadbike_01_F\"\n]];\n",[159,852,853,858,862,866,871,875,879,884,888,893,899],{"__ignoreMap":188},[192,854,855],{"class":194,"line":195},[192,856,857],{},"\"forge_server\" callExtension [\"owned:locker:remove\", [\n",[192,859,860],{"class":194,"line":202},[192,861,788],{},[192,863,864],{"class":194,"line":232},[192,865,793],{},[192,867,868],{"class":194,"line":255},[192,869,870],{}," \"arifle_MX_F\"\n",[192,872,873],{"class":194,"line":278},[192,874,803],{},[192,876,877],{"class":194,"line":302},[192,878,778],{"emptyLinePlaceholder":777},[192,880,881],{"class":194,"line":422},[192,882,883],{},"\"forge_server\" callExtension [\"owned:garage:remove\", [\n",[192,885,886],{"class":194,"line":437},[192,887,788],{},[192,889,891],{"class":194,"line":890},9,[192,892,835],{},[192,894,896],{"class":194,"line":895},10,[192,897,898],{}," \"B_Quadbike_01_F\"\n",[192,900,902],{"class":194,"line":901},11,[192,903,803],{},[178,905,907],{"id":906},"hot-state-commands","Hot-State Commands",[155,909,910],{},"Both owned storage modules support hot state.",[155,912,913],{},"Owned locker:",[491,915,916,926],{},[494,917,918],{},[497,919,920,922,924],{},[500,921,502],{},[500,923,505],{},[500,925,508],{},[510,927,928,941,954,970,986,1000],{},[497,929,930,935,939],{},[515,931,932],{},[159,933,934],{},"owned:locker:hot:init",[515,936,937],{},[159,938,524],{},[515,940,527],{},[497,942,943,948,952],{},[515,944,945],{},[159,946,947],{},"owned:locker:hot:fetch",[515,949,950],{},[159,951,524],{},[515,953,527],{},[497,955,956,961,967],{},[515,957,958],{},[159,959,960],{},"owned:locker:hot:get",[515,962,963,552,965],{},[159,964,524],{},[159,966,555],{},[515,968,969],{},"Category array JSON.",[497,971,972,977,984],{},[515,973,974],{},[159,975,976],{},"owned:locker:hot:override",[515,978,979,552,981],{},[159,980,524],{},[159,982,983],{},"locker_json",[515,985,527],{},[497,987,988,993,997],{},[515,989,990],{},[159,991,992],{},"owned:locker:hot:save",[515,994,995],{},[159,996,524],{},[515,998,999],{},"Current hot owned locker JSON and async durable save.",[497,1001,1002,1007,1011],{},[515,1003,1004],{},[159,1005,1006],{},"owned:locker:hot:remove",[515,1008,1009],{},[159,1010,524],{},[515,1012,1013,482],{},[159,1014,611],{},[155,1016,1017],{},"Owned garage:",[491,1019,1020,1030],{},[494,1021,1022],{},[497,1023,1024,1026,1028],{},[500,1025,502],{},[500,1027,505],{},[500,1029,508],{},[510,1031,1032,1045,1058,1073,1089,1106,1123,1137],{},[497,1033,1034,1039,1043],{},[515,1035,1036],{},[159,1037,1038],{},"owned:garage:hot:init",[515,1040,1041],{},[159,1042,524],{},[515,1044,663],{},[497,1046,1047,1052,1056],{},[515,1048,1049],{},[159,1050,1051],{},"owned:garage:hot:fetch",[515,1053,1054],{},[159,1055,524],{},[515,1057,663],{},[497,1059,1060,1065,1071],{},[515,1061,1062],{},[159,1063,1064],{},"owned:garage:hot:get",[515,1066,1067,552,1069],{},[159,1068,524],{},[159,1070,555],{},[515,1072,969],{},[497,1074,1075,1080,1087],{},[515,1076,1077],{},[159,1078,1079],{},"owned:garage:hot:override",[515,1081,1082,552,1084],{},[159,1083,524],{},[159,1085,1086],{},"garage_json",[515,1088,663],{},[497,1090,1091,1096,1104],{},[515,1092,1093],{},[159,1094,1095],{},"owned:garage:hot:add",[515,1097,1098,552,1100,552,1102],{},[159,1099,524],{},[159,1101,555],{},[159,1103,574],{},[515,1105,577],{},[497,1107,1108,1113,1121],{},[515,1109,1110],{},[159,1111,1112],{},"owned:garage:hot:remove_item",[515,1114,1115,552,1117,552,1119],{},[159,1116,524],{},[159,1118,555],{},[159,1120,593],{},[515,1122,577],{},[497,1124,1125,1130,1134],{},[515,1126,1127],{},[159,1128,1129],{},"owned:garage:hot:save",[515,1131,1132],{},[159,1133,524],{},[515,1135,1136],{},"Current hot owned garage JSON and async durable save.",[497,1138,1139,1144,1148],{},[515,1140,1141],{},[159,1142,1143],{},"owned:garage:hot:remove",[515,1145,1146],{},[159,1147,524],{},[515,1149,1150,482],{},[159,1151,611],{},[178,1153,1155],{"id":1154},"error-handling","Error Handling",[183,1157,1159],{"className":763,"code":1158,"language":765,"meta":188,"style":188},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Owned storage error: %1\", _payload];\n};\n",[159,1160,1161,1166,1171,1176],{"__ignoreMap":188},[192,1162,1163],{"class":194,"line":195},[192,1164,1165],{},"private _payload = _result select 0;\n",[192,1167,1168],{"class":194,"line":202},[192,1169,1170],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[192,1172,1173],{"class":194,"line":232},[192,1174,1175],{}," systemChat format [\"Owned storage error: %1\", _payload];\n",[192,1177,1178],{"class":194,"line":255},[192,1179,1180],{},"};\n",[1182,1183,1184],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":188,"searchDepth":202,"depth":202,"links":1186},[1187,1188,1189,1190,1191,1192,1193,1194,1195],{"id":180,"depth":202,"text":181},{"id":334,"depth":202,"text":335},{"id":488,"depth":202,"text":489},{"id":634,"depth":202,"text":635},{"id":759,"depth":202,"text":760},{"id":806,"depth":202,"text":807},{"id":846,"depth":202,"text":847},{"id":906,"depth":202,"text":907},{"id":1154,"depth":202,"text":1155},"Owned storage covers the owned:locker and owned:garage extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.","md",null,{},{"title":85,"description":1196},"nP0406Z4TVsnIwUqdf0Vek8hNgWLWl16LRWagO6eMP0",[1203,1205],{"title":81,"path":82,"stem":83,"description":1204,"children":-1},"The organization module stores organization records, members, assets, fleet\nentries, and credit lines. Durable commands manage persisted records directly.\nHot-state commands support the active organization UI workflows.",{"title":89,"path":90,"stem":91,"description":1206,"children":-1},"The phone module stores contacts, messages, and emails for each UID. It is a\nserver-extension state module backed by SurrealDB.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/phone.html b/docus/dist/server-modules/phone.html index 4a87942..4c1b40e 100644 --- a/docus/dist/server-modules/phone.html +++ b/docus/dist/server-modules/phone.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Phone Usage Guide - forge-docus
    Server Modules

    Phone Usage Guide

    The phone module stores contacts, messages, and emails for each UID. It is a server-extension state module backed by SurrealDB.

    Phone Usage Guide

    The phone module stores contacts, messages, and emails for each UID. It is a @@ -169,4 +169,4 @@ server-extension state module backed by SurrealDB.

    Client Usage Guide

    Forge Client contains the Arma client-side addons that open player interfaces, handle browser events, cache client-visible state, and forward authoritative -requests to the server addons.

    Copyright © 2026
    \ No newline at end of file +requests to the server addons.

    \ No newline at end of file diff --git a/docus/dist/server-modules/phone/_payload.json b/docus/dist/server-modules/phone/_payload.json index 26fe4ed..06cb92f 100644 --- a/docus/dist/server-modules/phone/_payload.json +++ b/docus/dist/server-modules/phone/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1139},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-phone":145,"-server-modules-phone-surround":1134},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":89,"body":147,"description":157,"extension":1129,"links":1130,"meta":1131,"navigation":887,"path":90,"seo":1132,"stem":91,"__hash__":1133},"docs\u002F3.server-modules\u002F9.phone.md",{"type":148,"value":149,"toc":1119},"minimark",[150,154,158,163,540,543,573,577,855,859,866,913,917,961,965,997,1001,1038,1042,1087,1091,1115],[151,152,89],"h1",{"id":153},"phone-usage-guide",[155,156,157],"p",{},"The phone module stores contacts, messages, and emails for each UID. It is a\nserver-extension state module backed by SurrealDB.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"contacts\": [\"76561198000000000\", \"field_commander\"],\n \"messages\": [\n {\n \"id\": \"phone-message:sender:receiver:1\",\n \"from\": \"sender\",\n \"to\": \"receiver\",\n \"message\": \"Text body\",\n \"timestamp\": 123.45,\n \"read\": false\n }\n ],\n \"emails\": [\n {\n \"id\": \"phone-email:sender:receiver:2\",\n \"from\": \"sender\",\n \"to\": \"receiver\",\n \"subject\": \"Subject\",\n \"body\": \"Email body\",\n \"timestamp\": 123.45,\n \"read\": false\n }\n ]\n}\n","json","",[171,172,173,182,223,238,244,268,289,310,331,349,364,370,376,390,395,415,434,453,474,495,510,523,528,534],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,181],{"class":180},"sMK4o","{\n",[174,183,185,188,192,195,198,201,203,207,209,212,215,218,220],{"class":176,"line":184},2,[174,186,187],{"class":180}," \"",[174,189,191],{"class":190},"spNyl","contacts",[174,193,194],{"class":180},"\"",[174,196,197],{"class":180},":",[174,199,200],{"class":180}," [",[174,202,194],{"class":180},[174,204,206],{"class":205},"sfazB","76561198000000000",[174,208,194],{"class":180},[174,210,211],{"class":180},",",[174,213,214],{"class":180}," \"",[174,216,217],{"class":205},"field_commander",[174,219,194],{"class":180},[174,221,222],{"class":180},"],\n",[174,224,226,228,231,233,235],{"class":176,"line":225},3,[174,227,187],{"class":180},[174,229,230],{"class":190},"messages",[174,232,194],{"class":180},[174,234,197],{"class":180},[174,236,237],{"class":180}," [\n",[174,239,241],{"class":176,"line":240},4,[174,242,243],{"class":180}," {\n",[174,245,247,250,254,256,258,260,263,265],{"class":176,"line":246},5,[174,248,249],{"class":180}," \"",[174,251,253],{"class":252},"sBMFI","id",[174,255,194],{"class":180},[174,257,197],{"class":180},[174,259,214],{"class":180},[174,261,262],{"class":205},"phone-message:sender:receiver:1",[174,264,194],{"class":180},[174,266,267],{"class":180},",\n",[174,269,271,273,276,278,280,282,285,287],{"class":176,"line":270},6,[174,272,249],{"class":180},[174,274,275],{"class":252},"from",[174,277,194],{"class":180},[174,279,197],{"class":180},[174,281,214],{"class":180},[174,283,284],{"class":205},"sender",[174,286,194],{"class":180},[174,288,267],{"class":180},[174,290,292,294,297,299,301,303,306,308],{"class":176,"line":291},7,[174,293,249],{"class":180},[174,295,296],{"class":252},"to",[174,298,194],{"class":180},[174,300,197],{"class":180},[174,302,214],{"class":180},[174,304,305],{"class":205},"receiver",[174,307,194],{"class":180},[174,309,267],{"class":180},[174,311,313,315,318,320,322,324,327,329],{"class":176,"line":312},8,[174,314,249],{"class":180},[174,316,317],{"class":252},"message",[174,319,194],{"class":180},[174,321,197],{"class":180},[174,323,214],{"class":180},[174,325,326],{"class":205},"Text body",[174,328,194],{"class":180},[174,330,267],{"class":180},[174,332,334,336,339,341,343,347],{"class":176,"line":333},9,[174,335,249],{"class":180},[174,337,338],{"class":252},"timestamp",[174,340,194],{"class":180},[174,342,197],{"class":180},[174,344,346],{"class":345},"sbssI"," 123.45",[174,348,267],{"class":180},[174,350,352,354,357,359,361],{"class":176,"line":351},10,[174,353,249],{"class":180},[174,355,356],{"class":252},"read",[174,358,194],{"class":180},[174,360,197],{"class":180},[174,362,363],{"class":180}," false\n",[174,365,367],{"class":176,"line":366},11,[174,368,369],{"class":180}," }\n",[174,371,373],{"class":176,"line":372},12,[174,374,375],{"class":180}," ],\n",[174,377,379,381,384,386,388],{"class":176,"line":378},13,[174,380,187],{"class":180},[174,382,383],{"class":190},"emails",[174,385,194],{"class":180},[174,387,197],{"class":180},[174,389,237],{"class":180},[174,391,393],{"class":176,"line":392},14,[174,394,243],{"class":180},[174,396,398,400,402,404,406,408,411,413],{"class":176,"line":397},15,[174,399,249],{"class":180},[174,401,253],{"class":252},[174,403,194],{"class":180},[174,405,197],{"class":180},[174,407,214],{"class":180},[174,409,410],{"class":205},"phone-email:sender:receiver:2",[174,412,194],{"class":180},[174,414,267],{"class":180},[174,416,418,420,422,424,426,428,430,432],{"class":176,"line":417},16,[174,419,249],{"class":180},[174,421,275],{"class":252},[174,423,194],{"class":180},[174,425,197],{"class":180},[174,427,214],{"class":180},[174,429,284],{"class":205},[174,431,194],{"class":180},[174,433,267],{"class":180},[174,435,437,439,441,443,445,447,449,451],{"class":176,"line":436},17,[174,438,249],{"class":180},[174,440,296],{"class":252},[174,442,194],{"class":180},[174,444,197],{"class":180},[174,446,214],{"class":180},[174,448,305],{"class":205},[174,450,194],{"class":180},[174,452,267],{"class":180},[174,454,456,458,461,463,465,467,470,472],{"class":176,"line":455},18,[174,457,249],{"class":180},[174,459,460],{"class":252},"subject",[174,462,194],{"class":180},[174,464,197],{"class":180},[174,466,214],{"class":180},[174,468,469],{"class":205},"Subject",[174,471,194],{"class":180},[174,473,267],{"class":180},[174,475,477,479,482,484,486,488,491,493],{"class":176,"line":476},19,[174,478,249],{"class":180},[174,480,481],{"class":252},"body",[174,483,194],{"class":180},[174,485,197],{"class":180},[174,487,214],{"class":180},[174,489,490],{"class":205},"Email body",[174,492,194],{"class":180},[174,494,267],{"class":180},[174,496,498,500,502,504,506,508],{"class":176,"line":497},20,[174,499,249],{"class":180},[174,501,338],{"class":252},[174,503,194],{"class":180},[174,505,197],{"class":180},[174,507,346],{"class":345},[174,509,267],{"class":180},[174,511,513,515,517,519,521],{"class":176,"line":512},21,[174,514,249],{"class":180},[174,516,356],{"class":252},[174,518,194],{"class":180},[174,520,197],{"class":180},[174,522,363],{"class":180},[174,524,526],{"class":176,"line":525},22,[174,527,369],{"class":180},[174,529,531],{"class":176,"line":530},23,[174,532,533],{"class":180}," ]\n",[174,535,537],{"class":176,"line":536},24,[174,538,539],{"class":180},"}\n",[155,541,542],{},"Rules validated by the Rust service:",[544,545,546,550,553,560,565,570],"ul",{},[547,548,549],"li",{},"UID arguments cannot be empty.",[547,551,552],{},"Message and email bodies cannot be empty.",[547,554,555,556,559],{},"Empty email subjects become ",[171,557,558],{},"No subject",".",[547,561,562,563,559],{},"Player messages and emails cannot target ",[171,564,217],{},[547,566,567,569],{},[171,568,217],{}," can send messages or emails to players.",[547,571,572],{},"Deleting a message or email removes it only from the requesting UID's index.",[159,574,576],{"id":575},"commands","Commands",[578,579,580,596],"table",{},[581,582,583],"thead",{},[584,585,586,590,593],"tr",{},[587,588,589],"th",{},"Command",[587,591,592],{},"Arguments",[587,594,595],{},"Returns",[597,598,599,615,629,653,672,686,703,725,745,764,778,800,820,839],"tbody",{},[584,600,601,607,612],{},[602,603,604],"td",{},[171,605,606],{},"phone:init",[602,608,609],{},[171,610,611],{},"uid",[602,613,614],{},"Full phone payload.",[584,616,617,622,626],{},[602,618,619],{},[171,620,621],{},"phone:contacts:list",[602,623,624],{},[171,625,611],{},[602,627,628],{},"Contact UID array.",[584,630,631,636,644],{},[602,632,633],{},[171,634,635],{},"phone:contacts:add",[602,637,638,640,641],{},[171,639,611],{},", ",[171,642,643],{},"contact_uid",[602,645,646,649,650,559],{},[171,647,648],{},"true"," or ",[171,651,652],{},"false",[584,654,655,660,666],{},[602,656,657],{},[171,658,659],{},"phone:contacts:remove",[602,661,662,640,664],{},[171,663,611],{},[171,665,643],{},[602,667,668,649,670,559],{},[171,669,648],{},[171,671,652],{},[584,673,674,679,683],{},[602,675,676],{},[171,677,678],{},"phone:messages:list",[602,680,681],{},[171,682,611],{},[602,684,685],{},"Message array.",[584,687,688,693,700],{},[602,689,690],{},[171,691,692],{},"phone:messages:thread",[602,694,695,640,697],{},[171,696,611],{},[171,698,699],{},"other_uid",[602,701,702],{},"Message array for both participants.",[584,704,705,710,722],{},[602,706,707],{},[171,708,709],{},"phone:messages:send",[602,711,712,640,715,640,718,640,720],{},[171,713,714],{},"from_uid",[171,716,717],{},"to_uid",[171,719,317],{},[171,721,338],{},[602,723,724],{},"Message JSON.",[584,726,727,732,739],{},[602,728,729],{},[171,730,731],{},"phone:messages:mark_read",[602,733,734,640,736],{},[171,735,611],{},[171,737,738],{},"message_id",[602,740,741,649,743,559],{},[171,742,648],{},[171,744,652],{},[584,746,747,752,758],{},[602,748,749],{},[171,750,751],{},"phone:messages:delete",[602,753,754,640,756],{},[171,755,611],{},[171,757,738],{},[602,759,760,649,762,559],{},[171,761,648],{},[171,763,652],{},[584,765,766,771,775],{},[602,767,768],{},[171,769,770],{},"phone:emails:list",[602,772,773],{},[171,774,611],{},[602,776,777],{},"Email array.",[584,779,780,785,797],{},[602,781,782],{},[171,783,784],{},"phone:emails:send",[602,786,787,640,789,640,791,640,793,640,795],{},[171,788,714],{},[171,790,717],{},[171,792,460],{},[171,794,481],{},[171,796,338],{},[602,798,799],{},"Email JSON.",[584,801,802,807,814],{},[602,803,804],{},[171,805,806],{},"phone:emails:mark_read",[602,808,809,640,811],{},[171,810,611],{},[171,812,813],{},"email_id",[602,815,816,649,818,559],{},[171,817,648],{},[171,819,652],{},[584,821,822,827,833],{},[602,823,824],{},[171,825,826],{},"phone:emails:delete",[602,828,829,640,831],{},[171,830,611],{},[171,832,813],{},[602,834,835,649,837,559],{},[171,836,648],{},[171,838,652],{},[584,840,841,846,850],{},[602,842,843],{},[171,844,845],{},"phone:remove",[602,847,848],{},[171,849,611],{},[602,851,852,559],{},[171,853,854],{},"OK",[159,856,858],{"id":857},"initialize-phone-state","Initialize Phone State",[155,860,861,863,864,559],{},[171,862,606],{}," creates phone state if needed and seeds self-contact plus\n",[171,865,217],{},[164,867,871],{"className":868,"code":869,"language":870,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"phone:init\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Phone init failed: %1\", _payload];\n};\n\nprivate _phone = fromJSON _payload;\n","sqf",[171,872,873,878,883,889,894,899,904,908],{"__ignoreMap":169},[174,874,875],{"class":176,"line":177},[174,876,877],{},"private _result = \"forge_server\" callExtension [\"phone:init\", [getPlayerUID player]];\n",[174,879,880],{"class":176,"line":184},[174,881,882],{},"private _payload = _result select 0;\n",[174,884,885],{"class":176,"line":225},[174,886,888],{"emptyLinePlaceholder":887},true,"\n",[174,890,891],{"class":176,"line":240},[174,892,893],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[174,895,896],{"class":176,"line":246},[174,897,898],{}," systemChat format [\"Phone init failed: %1\", _payload];\n",[174,900,901],{"class":176,"line":270},[174,902,903],{},"};\n",[174,905,906],{"class":176,"line":291},[174,907,888],{"emptyLinePlaceholder":887},[174,909,910],{"class":176,"line":312},[174,911,912],{},"private _phone = fromJSON _payload;\n",[159,914,916],{"id":915},"send-a-message","Send a Message",[164,918,920],{"className":868,"code":919,"language":870,"meta":169,"style":169},"private _timestamp = str diag_tickTime;\n\nprivate _result = \"forge_server\" callExtension [\"phone:messages:send\", [\n getPlayerUID player,\n _targetUid,\n \"Move to checkpoint Alpha.\",\n _timestamp\n]];\n",[171,921,922,927,931,936,941,946,951,956],{"__ignoreMap":169},[174,923,924],{"class":176,"line":177},[174,925,926],{},"private _timestamp = str diag_tickTime;\n",[174,928,929],{"class":176,"line":184},[174,930,888],{"emptyLinePlaceholder":887},[174,932,933],{"class":176,"line":225},[174,934,935],{},"private _result = \"forge_server\" callExtension [\"phone:messages:send\", [\n",[174,937,938],{"class":176,"line":240},[174,939,940],{}," getPlayerUID player,\n",[174,942,943],{"class":176,"line":246},[174,944,945],{}," _targetUid,\n",[174,947,948],{"class":176,"line":270},[174,949,950],{}," \"Move to checkpoint Alpha.\",\n",[174,952,953],{"class":176,"line":291},[174,954,955],{}," _timestamp\n",[174,957,958],{"class":176,"line":312},[174,959,960],{},"]];\n",[159,962,964],{"id":963},"read-a-conversation","Read a Conversation",[164,966,968],{"className":868,"code":967,"language":870,"meta":169,"style":169},"private _result = \"forge_server\" callExtension [\"phone:messages:thread\", [\n getPlayerUID player,\n _otherUid\n]];\n\nprivate _messages = fromJSON (_result select 0);\n",[171,969,970,975,979,984,988,992],{"__ignoreMap":169},[174,971,972],{"class":176,"line":177},[174,973,974],{},"private _result = \"forge_server\" callExtension [\"phone:messages:thread\", [\n",[174,976,977],{"class":176,"line":184},[174,978,940],{},[174,980,981],{"class":176,"line":225},[174,982,983],{}," _otherUid\n",[174,985,986],{"class":176,"line":240},[174,987,960],{},[174,989,990],{"class":176,"line":246},[174,991,888],{"emptyLinePlaceholder":887},[174,993,994],{"class":176,"line":270},[174,995,996],{},"private _messages = fromJSON (_result select 0);\n",[159,998,1000],{"id":999},"send-an-email","Send an Email",[164,1002,1004],{"className":868,"code":1003,"language":870,"meta":169,"style":169},"private _result = \"forge_server\" callExtension [\"phone:emails:send\", [\n getPlayerUID player,\n _targetUid,\n \"Supply Request\",\n \"Requesting resupply at grid 123456.\",\n str diag_tickTime\n]];\n",[171,1005,1006,1011,1015,1019,1024,1029,1034],{"__ignoreMap":169},[174,1007,1008],{"class":176,"line":177},[174,1009,1010],{},"private _result = \"forge_server\" callExtension [\"phone:emails:send\", [\n",[174,1012,1013],{"class":176,"line":184},[174,1014,940],{},[174,1016,1017],{"class":176,"line":225},[174,1018,945],{},[174,1020,1021],{"class":176,"line":240},[174,1022,1023],{}," \"Supply Request\",\n",[174,1025,1026],{"class":176,"line":246},[174,1027,1028],{}," \"Requesting resupply at grid 123456.\",\n",[174,1030,1031],{"class":176,"line":270},[174,1032,1033],{}," str diag_tickTime\n",[174,1035,1036],{"class":176,"line":291},[174,1037,960],{},[159,1039,1041],{"id":1040},"mark-and-delete-records","Mark and Delete Records",[164,1043,1045],{"className":868,"code":1044,"language":870,"meta":169,"style":169},"\"forge_server\" callExtension [\"phone:messages:mark_read\", [\n getPlayerUID player,\n _messageId\n]];\n\n\"forge_server\" callExtension [\"phone:emails:delete\", [\n getPlayerUID player,\n _emailId\n]];\n",[171,1046,1047,1052,1056,1061,1065,1069,1074,1078,1083],{"__ignoreMap":169},[174,1048,1049],{"class":176,"line":177},[174,1050,1051],{},"\"forge_server\" callExtension [\"phone:messages:mark_read\", [\n",[174,1053,1054],{"class":176,"line":184},[174,1055,940],{},[174,1057,1058],{"class":176,"line":225},[174,1059,1060],{}," _messageId\n",[174,1062,1063],{"class":176,"line":240},[174,1064,960],{},[174,1066,1067],{"class":176,"line":246},[174,1068,888],{"emptyLinePlaceholder":887},[174,1070,1071],{"class":176,"line":270},[174,1072,1073],{},"\"forge_server\" callExtension [\"phone:emails:delete\", [\n",[174,1075,1076],{"class":176,"line":291},[174,1077,940],{},[174,1079,1080],{"class":176,"line":312},[174,1081,1082],{}," _emailId\n",[174,1084,1085],{"class":176,"line":333},[174,1086,960],{},[159,1088,1090],{"id":1089},"error-handling","Error Handling",[164,1092,1094],{"className":868,"code":1093,"language":870,"meta":169,"style":169},"private _payload = (_result select 0);\nif (_payload find \"Error:\" == 0) then {\n systemChat format [\"Phone error: %1\", _payload];\n};\n",[171,1095,1096,1101,1106,1111],{"__ignoreMap":169},[174,1097,1098],{"class":176,"line":177},[174,1099,1100],{},"private _payload = (_result select 0);\n",[174,1102,1103],{"class":176,"line":184},[174,1104,1105],{},"if (_payload find \"Error:\" == 0) then {\n",[174,1107,1108],{"class":176,"line":225},[174,1109,1110],{}," systemChat format [\"Phone error: %1\", _payload];\n",[174,1112,1113],{"class":176,"line":240},[174,1114,903],{},[1116,1117,1118],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":184,"depth":184,"links":1120},[1121,1122,1123,1124,1125,1126,1127,1128],{"id":161,"depth":184,"text":162},{"id":575,"depth":184,"text":576},{"id":857,"depth":184,"text":858},{"id":915,"depth":184,"text":916},{"id":963,"depth":184,"text":964},{"id":999,"depth":184,"text":1000},{"id":1040,"depth":184,"text":1041},{"id":1089,"depth":184,"text":1090},"md",null,{},{"title":89,"description":157},"elJIYhe9Y4PRTMP0qH-9WZBe1BS2fDPtsEpKldSRzNI",[1135,1137],{"title":85,"path":86,"stem":87,"description":1136,"children":-1},"Owned storage covers the owned:locker and owned:garage extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.",{"title":99,"path":95,"stem":96,"description":1138,"children":-1},"Forge Client contains the Arma client-side addons that open player interfaces,\nhandle browser events, cache client-visible state, and forward authoritative\nrequests to the server addons.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1139},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-phone":145,"-server-modules-phone-surround":1134},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":89,"body":147,"description":157,"extension":1129,"links":1130,"meta":1131,"navigation":887,"path":90,"seo":1132,"stem":91,"__hash__":1133},"docs\u002F3.server-modules\u002F9.phone.md",{"type":148,"value":149,"toc":1119},"minimark",[150,154,158,163,540,543,573,577,855,859,866,913,917,961,965,997,1001,1038,1042,1087,1091,1115],[151,152,89],"h1",{"id":153},"phone-usage-guide",[155,156,157],"p",{},"The phone module stores contacts, messages, and emails for each UID. It is a\nserver-extension state module backed by SurrealDB.",[159,160,162],"h2",{"id":161},"storage-model","Storage Model",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"contacts\": [\"76561198000000000\", \"field_commander\"],\n \"messages\": [\n {\n \"id\": \"phone-message:sender:receiver:1\",\n \"from\": \"sender\",\n \"to\": \"receiver\",\n \"message\": \"Text body\",\n \"timestamp\": 123.45,\n \"read\": false\n }\n ],\n \"emails\": [\n {\n \"id\": \"phone-email:sender:receiver:2\",\n \"from\": \"sender\",\n \"to\": \"receiver\",\n \"subject\": \"Subject\",\n \"body\": \"Email body\",\n \"timestamp\": 123.45,\n \"read\": false\n }\n ]\n}\n","json","",[171,172,173,182,223,238,244,268,289,310,331,349,364,370,376,390,395,415,434,453,474,495,510,523,528,534],"code",{"__ignoreMap":169},[174,175,178],"span",{"class":176,"line":177},"line",1,[174,179,181],{"class":180},"sMK4o","{\n",[174,183,185,188,192,195,198,201,203,207,209,212,215,218,220],{"class":176,"line":184},2,[174,186,187],{"class":180}," \"",[174,189,191],{"class":190},"spNyl","contacts",[174,193,194],{"class":180},"\"",[174,196,197],{"class":180},":",[174,199,200],{"class":180}," [",[174,202,194],{"class":180},[174,204,206],{"class":205},"sfazB","76561198000000000",[174,208,194],{"class":180},[174,210,211],{"class":180},",",[174,213,214],{"class":180}," \"",[174,216,217],{"class":205},"field_commander",[174,219,194],{"class":180},[174,221,222],{"class":180},"],\n",[174,224,226,228,231,233,235],{"class":176,"line":225},3,[174,227,187],{"class":180},[174,229,230],{"class":190},"messages",[174,232,194],{"class":180},[174,234,197],{"class":180},[174,236,237],{"class":180}," [\n",[174,239,241],{"class":176,"line":240},4,[174,242,243],{"class":180}," {\n",[174,245,247,250,254,256,258,260,263,265],{"class":176,"line":246},5,[174,248,249],{"class":180}," \"",[174,251,253],{"class":252},"sBMFI","id",[174,255,194],{"class":180},[174,257,197],{"class":180},[174,259,214],{"class":180},[174,261,262],{"class":205},"phone-message:sender:receiver:1",[174,264,194],{"class":180},[174,266,267],{"class":180},",\n",[174,269,271,273,276,278,280,282,285,287],{"class":176,"line":270},6,[174,272,249],{"class":180},[174,274,275],{"class":252},"from",[174,277,194],{"class":180},[174,279,197],{"class":180},[174,281,214],{"class":180},[174,283,284],{"class":205},"sender",[174,286,194],{"class":180},[174,288,267],{"class":180},[174,290,292,294,297,299,301,303,306,308],{"class":176,"line":291},7,[174,293,249],{"class":180},[174,295,296],{"class":252},"to",[174,298,194],{"class":180},[174,300,197],{"class":180},[174,302,214],{"class":180},[174,304,305],{"class":205},"receiver",[174,307,194],{"class":180},[174,309,267],{"class":180},[174,311,313,315,318,320,322,324,327,329],{"class":176,"line":312},8,[174,314,249],{"class":180},[174,316,317],{"class":252},"message",[174,319,194],{"class":180},[174,321,197],{"class":180},[174,323,214],{"class":180},[174,325,326],{"class":205},"Text body",[174,328,194],{"class":180},[174,330,267],{"class":180},[174,332,334,336,339,341,343,347],{"class":176,"line":333},9,[174,335,249],{"class":180},[174,337,338],{"class":252},"timestamp",[174,340,194],{"class":180},[174,342,197],{"class":180},[174,344,346],{"class":345},"sbssI"," 123.45",[174,348,267],{"class":180},[174,350,352,354,357,359,361],{"class":176,"line":351},10,[174,353,249],{"class":180},[174,355,356],{"class":252},"read",[174,358,194],{"class":180},[174,360,197],{"class":180},[174,362,363],{"class":180}," false\n",[174,365,367],{"class":176,"line":366},11,[174,368,369],{"class":180}," }\n",[174,371,373],{"class":176,"line":372},12,[174,374,375],{"class":180}," ],\n",[174,377,379,381,384,386,388],{"class":176,"line":378},13,[174,380,187],{"class":180},[174,382,383],{"class":190},"emails",[174,385,194],{"class":180},[174,387,197],{"class":180},[174,389,237],{"class":180},[174,391,393],{"class":176,"line":392},14,[174,394,243],{"class":180},[174,396,398,400,402,404,406,408,411,413],{"class":176,"line":397},15,[174,399,249],{"class":180},[174,401,253],{"class":252},[174,403,194],{"class":180},[174,405,197],{"class":180},[174,407,214],{"class":180},[174,409,410],{"class":205},"phone-email:sender:receiver:2",[174,412,194],{"class":180},[174,414,267],{"class":180},[174,416,418,420,422,424,426,428,430,432],{"class":176,"line":417},16,[174,419,249],{"class":180},[174,421,275],{"class":252},[174,423,194],{"class":180},[174,425,197],{"class":180},[174,427,214],{"class":180},[174,429,284],{"class":205},[174,431,194],{"class":180},[174,433,267],{"class":180},[174,435,437,439,441,443,445,447,449,451],{"class":176,"line":436},17,[174,438,249],{"class":180},[174,440,296],{"class":252},[174,442,194],{"class":180},[174,444,197],{"class":180},[174,446,214],{"class":180},[174,448,305],{"class":205},[174,450,194],{"class":180},[174,452,267],{"class":180},[174,454,456,458,461,463,465,467,470,472],{"class":176,"line":455},18,[174,457,249],{"class":180},[174,459,460],{"class":252},"subject",[174,462,194],{"class":180},[174,464,197],{"class":180},[174,466,214],{"class":180},[174,468,469],{"class":205},"Subject",[174,471,194],{"class":180},[174,473,267],{"class":180},[174,475,477,479,482,484,486,488,491,493],{"class":176,"line":476},19,[174,478,249],{"class":180},[174,480,481],{"class":252},"body",[174,483,194],{"class":180},[174,485,197],{"class":180},[174,487,214],{"class":180},[174,489,490],{"class":205},"Email body",[174,492,194],{"class":180},[174,494,267],{"class":180},[174,496,498,500,502,504,506,508],{"class":176,"line":497},20,[174,499,249],{"class":180},[174,501,338],{"class":252},[174,503,194],{"class":180},[174,505,197],{"class":180},[174,507,346],{"class":345},[174,509,267],{"class":180},[174,511,513,515,517,519,521],{"class":176,"line":512},21,[174,514,249],{"class":180},[174,516,356],{"class":252},[174,518,194],{"class":180},[174,520,197],{"class":180},[174,522,363],{"class":180},[174,524,526],{"class":176,"line":525},22,[174,527,369],{"class":180},[174,529,531],{"class":176,"line":530},23,[174,532,533],{"class":180}," ]\n",[174,535,537],{"class":176,"line":536},24,[174,538,539],{"class":180},"}\n",[155,541,542],{},"Rules validated by the Rust service:",[544,545,546,550,553,560,565,570],"ul",{},[547,548,549],"li",{},"UID arguments cannot be empty.",[547,551,552],{},"Message and email bodies cannot be empty.",[547,554,555,556,559],{},"Empty email subjects become ",[171,557,558],{},"No subject",".",[547,561,562,563,559],{},"Player messages and emails cannot target ",[171,564,217],{},[547,566,567,569],{},[171,568,217],{}," can send messages or emails to players.",[547,571,572],{},"Deleting a message or email removes it only from the requesting UID's index.",[159,574,576],{"id":575},"commands","Commands",[578,579,580,596],"table",{},[581,582,583],"thead",{},[584,585,586,590,593],"tr",{},[587,588,589],"th",{},"Command",[587,591,592],{},"Arguments",[587,594,595],{},"Returns",[597,598,599,615,629,653,672,686,703,725,745,764,778,800,820,839],"tbody",{},[584,600,601,607,612],{},[602,603,604],"td",{},[171,605,606],{},"phone:init",[602,608,609],{},[171,610,611],{},"uid",[602,613,614],{},"Full phone payload.",[584,616,617,622,626],{},[602,618,619],{},[171,620,621],{},"phone:contacts:list",[602,623,624],{},[171,625,611],{},[602,627,628],{},"Contact UID array.",[584,630,631,636,644],{},[602,632,633],{},[171,634,635],{},"phone:contacts:add",[602,637,638,640,641],{},[171,639,611],{},", ",[171,642,643],{},"contact_uid",[602,645,646,649,650,559],{},[171,647,648],{},"true"," or ",[171,651,652],{},"false",[584,654,655,660,666],{},[602,656,657],{},[171,658,659],{},"phone:contacts:remove",[602,661,662,640,664],{},[171,663,611],{},[171,665,643],{},[602,667,668,649,670,559],{},[171,669,648],{},[171,671,652],{},[584,673,674,679,683],{},[602,675,676],{},[171,677,678],{},"phone:messages:list",[602,680,681],{},[171,682,611],{},[602,684,685],{},"Message array.",[584,687,688,693,700],{},[602,689,690],{},[171,691,692],{},"phone:messages:thread",[602,694,695,640,697],{},[171,696,611],{},[171,698,699],{},"other_uid",[602,701,702],{},"Message array for both participants.",[584,704,705,710,722],{},[602,706,707],{},[171,708,709],{},"phone:messages:send",[602,711,712,640,715,640,718,640,720],{},[171,713,714],{},"from_uid",[171,716,717],{},"to_uid",[171,719,317],{},[171,721,338],{},[602,723,724],{},"Message JSON.",[584,726,727,732,739],{},[602,728,729],{},[171,730,731],{},"phone:messages:mark_read",[602,733,734,640,736],{},[171,735,611],{},[171,737,738],{},"message_id",[602,740,741,649,743,559],{},[171,742,648],{},[171,744,652],{},[584,746,747,752,758],{},[602,748,749],{},[171,750,751],{},"phone:messages:delete",[602,753,754,640,756],{},[171,755,611],{},[171,757,738],{},[602,759,760,649,762,559],{},[171,761,648],{},[171,763,652],{},[584,765,766,771,775],{},[602,767,768],{},[171,769,770],{},"phone:emails:list",[602,772,773],{},[171,774,611],{},[602,776,777],{},"Email array.",[584,779,780,785,797],{},[602,781,782],{},[171,783,784],{},"phone:emails:send",[602,786,787,640,789,640,791,640,793,640,795],{},[171,788,714],{},[171,790,717],{},[171,792,460],{},[171,794,481],{},[171,796,338],{},[602,798,799],{},"Email JSON.",[584,801,802,807,814],{},[602,803,804],{},[171,805,806],{},"phone:emails:mark_read",[602,808,809,640,811],{},[171,810,611],{},[171,812,813],{},"email_id",[602,815,816,649,818,559],{},[171,817,648],{},[171,819,652],{},[584,821,822,827,833],{},[602,823,824],{},[171,825,826],{},"phone:emails:delete",[602,828,829,640,831],{},[171,830,611],{},[171,832,813],{},[602,834,835,649,837,559],{},[171,836,648],{},[171,838,652],{},[584,840,841,846,850],{},[602,842,843],{},[171,844,845],{},"phone:remove",[602,847,848],{},[171,849,611],{},[602,851,852,559],{},[171,853,854],{},"OK",[159,856,858],{"id":857},"initialize-phone-state","Initialize Phone State",[155,860,861,863,864,559],{},[171,862,606],{}," creates phone state if needed and seeds self-contact plus\n",[171,865,217],{},[164,867,871],{"className":868,"code":869,"language":870,"meta":169,"style":169},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _result = \"forge_server\" callExtension [\"phone:init\", [getPlayerUID player]];\nprivate _payload = _result select 0;\n\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Phone init failed: %1\", _payload];\n};\n\nprivate _phone = fromJSON _payload;\n","sqf",[171,872,873,878,883,889,894,899,904,908],{"__ignoreMap":169},[174,874,875],{"class":176,"line":177},[174,876,877],{},"private _result = \"forge_server\" callExtension [\"phone:init\", [getPlayerUID player]];\n",[174,879,880],{"class":176,"line":184},[174,881,882],{},"private _payload = _result select 0;\n",[174,884,885],{"class":176,"line":225},[174,886,888],{"emptyLinePlaceholder":887},true,"\n",[174,890,891],{"class":176,"line":240},[174,892,893],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[174,895,896],{"class":176,"line":246},[174,897,898],{}," systemChat format [\"Phone init failed: %1\", _payload];\n",[174,900,901],{"class":176,"line":270},[174,902,903],{},"};\n",[174,905,906],{"class":176,"line":291},[174,907,888],{"emptyLinePlaceholder":887},[174,909,910],{"class":176,"line":312},[174,911,912],{},"private _phone = fromJSON _payload;\n",[159,914,916],{"id":915},"send-a-message","Send a Message",[164,918,920],{"className":868,"code":919,"language":870,"meta":169,"style":169},"private _timestamp = str diag_tickTime;\n\nprivate _result = \"forge_server\" callExtension [\"phone:messages:send\", [\n getPlayerUID player,\n _targetUid,\n \"Move to checkpoint Alpha.\",\n _timestamp\n]];\n",[171,921,922,927,931,936,941,946,951,956],{"__ignoreMap":169},[174,923,924],{"class":176,"line":177},[174,925,926],{},"private _timestamp = str diag_tickTime;\n",[174,928,929],{"class":176,"line":184},[174,930,888],{"emptyLinePlaceholder":887},[174,932,933],{"class":176,"line":225},[174,934,935],{},"private _result = \"forge_server\" callExtension [\"phone:messages:send\", [\n",[174,937,938],{"class":176,"line":240},[174,939,940],{}," getPlayerUID player,\n",[174,942,943],{"class":176,"line":246},[174,944,945],{}," _targetUid,\n",[174,947,948],{"class":176,"line":270},[174,949,950],{}," \"Move to checkpoint Alpha.\",\n",[174,952,953],{"class":176,"line":291},[174,954,955],{}," _timestamp\n",[174,957,958],{"class":176,"line":312},[174,959,960],{},"]];\n",[159,962,964],{"id":963},"read-a-conversation","Read a Conversation",[164,966,968],{"className":868,"code":967,"language":870,"meta":169,"style":169},"private _result = \"forge_server\" callExtension [\"phone:messages:thread\", [\n getPlayerUID player,\n _otherUid\n]];\n\nprivate _messages = fromJSON (_result select 0);\n",[171,969,970,975,979,984,988,992],{"__ignoreMap":169},[174,971,972],{"class":176,"line":177},[174,973,974],{},"private _result = \"forge_server\" callExtension [\"phone:messages:thread\", [\n",[174,976,977],{"class":176,"line":184},[174,978,940],{},[174,980,981],{"class":176,"line":225},[174,982,983],{}," _otherUid\n",[174,985,986],{"class":176,"line":240},[174,987,960],{},[174,989,990],{"class":176,"line":246},[174,991,888],{"emptyLinePlaceholder":887},[174,993,994],{"class":176,"line":270},[174,995,996],{},"private _messages = fromJSON (_result select 0);\n",[159,998,1000],{"id":999},"send-an-email","Send an Email",[164,1002,1004],{"className":868,"code":1003,"language":870,"meta":169,"style":169},"private _result = \"forge_server\" callExtension [\"phone:emails:send\", [\n getPlayerUID player,\n _targetUid,\n \"Supply Request\",\n \"Requesting resupply at grid 123456.\",\n str diag_tickTime\n]];\n",[171,1005,1006,1011,1015,1019,1024,1029,1034],{"__ignoreMap":169},[174,1007,1008],{"class":176,"line":177},[174,1009,1010],{},"private _result = \"forge_server\" callExtension [\"phone:emails:send\", [\n",[174,1012,1013],{"class":176,"line":184},[174,1014,940],{},[174,1016,1017],{"class":176,"line":225},[174,1018,945],{},[174,1020,1021],{"class":176,"line":240},[174,1022,1023],{}," \"Supply Request\",\n",[174,1025,1026],{"class":176,"line":246},[174,1027,1028],{}," \"Requesting resupply at grid 123456.\",\n",[174,1030,1031],{"class":176,"line":270},[174,1032,1033],{}," str diag_tickTime\n",[174,1035,1036],{"class":176,"line":291},[174,1037,960],{},[159,1039,1041],{"id":1040},"mark-and-delete-records","Mark and Delete Records",[164,1043,1045],{"className":868,"code":1044,"language":870,"meta":169,"style":169},"\"forge_server\" callExtension [\"phone:messages:mark_read\", [\n getPlayerUID player,\n _messageId\n]];\n\n\"forge_server\" callExtension [\"phone:emails:delete\", [\n getPlayerUID player,\n _emailId\n]];\n",[171,1046,1047,1052,1056,1061,1065,1069,1074,1078,1083],{"__ignoreMap":169},[174,1048,1049],{"class":176,"line":177},[174,1050,1051],{},"\"forge_server\" callExtension [\"phone:messages:mark_read\", [\n",[174,1053,1054],{"class":176,"line":184},[174,1055,940],{},[174,1057,1058],{"class":176,"line":225},[174,1059,1060],{}," _messageId\n",[174,1062,1063],{"class":176,"line":240},[174,1064,960],{},[174,1066,1067],{"class":176,"line":246},[174,1068,888],{"emptyLinePlaceholder":887},[174,1070,1071],{"class":176,"line":270},[174,1072,1073],{},"\"forge_server\" callExtension [\"phone:emails:delete\", [\n",[174,1075,1076],{"class":176,"line":291},[174,1077,940],{},[174,1079,1080],{"class":176,"line":312},[174,1081,1082],{}," _emailId\n",[174,1084,1085],{"class":176,"line":333},[174,1086,960],{},[159,1088,1090],{"id":1089},"error-handling","Error Handling",[164,1092,1094],{"className":868,"code":1093,"language":870,"meta":169,"style":169},"private _payload = (_result select 0);\nif (_payload find \"Error:\" == 0) then {\n systemChat format [\"Phone error: %1\", _payload];\n};\n",[171,1095,1096,1101,1106,1111],{"__ignoreMap":169},[174,1097,1098],{"class":176,"line":177},[174,1099,1100],{},"private _payload = (_result select 0);\n",[174,1102,1103],{"class":176,"line":184},[174,1104,1105],{},"if (_payload find \"Error:\" == 0) then {\n",[174,1107,1108],{"class":176,"line":225},[174,1109,1110],{}," systemChat format [\"Phone error: %1\", _payload];\n",[174,1112,1113],{"class":176,"line":240},[174,1114,903],{},[1116,1117,1118],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":184,"depth":184,"links":1120},[1121,1122,1123,1124,1125,1126,1127,1128],{"id":161,"depth":184,"text":162},{"id":575,"depth":184,"text":576},{"id":857,"depth":184,"text":858},{"id":915,"depth":184,"text":916},{"id":963,"depth":184,"text":964},{"id":999,"depth":184,"text":1000},{"id":1040,"depth":184,"text":1041},{"id":1089,"depth":184,"text":1090},"md",null,{},{"title":89,"description":157},"elJIYhe9Y4PRTMP0qH-9WZBe1BS2fDPtsEpKldSRzNI",[1135,1137],{"title":85,"path":86,"stem":87,"description":1136,"children":-1},"Owned storage covers the owned:locker and owned:garage extension command\ngroups. These modules store unlock lists rather than physical item or vehicle\ninstances.",{"title":99,"path":95,"stem":96,"description":1138,"children":-1},"Forge Client contains the Arma client-side addons that open player interfaces,\nhandle browser events, cache client-visible state, and forward authoritative\nrequests to the server addons.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/store.html b/docus/dist/server-modules/store.html index 0ce60ed..6561b07 100644 --- a/docus/dist/server-modules/store.html +++ b/docus/dist/server-modules/store.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Store Usage Guide - forge-docus< position, direction, stance, contact fields, state, holster status, rank, and organization.

    Task Usage Guide

    The task module stores transient mission task metadata for active server or mission lifecycle workflows. SQF still owns Arma-only runtime state such as -objects and participants.

    \ No newline at end of file +objects and participants.

    \ No newline at end of file diff --git a/docus/dist/server-modules/store/_payload.json b/docus/dist/server-modules/store/_payload.json index 456e24a..c732bc6 100644 --- a/docus/dist/server-modules/store/_payload.json +++ b/docus/dist/server-modules/store/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1088},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-store":145,"-server-modules-store-surround":1083},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":53,"body":147,"description":157,"extension":1078,"links":1079,"meta":1080,"navigation":878,"path":54,"seo":1081,"stem":55,"__hash__":1082},"docs\u002F3.server-modules\u002F10.store.md",{"type":148,"value":149,"toc":1069},"minimark",[150,154,158,163,166,187,202,206,211,535,538,612,616,652,656,830,833,837,933,937,946,1027,1031,1065],[151,152,53],"h1",{"id":153},"store-usage-guide",[155,156,157],"p",{},"The store module processes checkout requests. It charges a payment source and\ngrants purchased items to the player locker, virtual arsenal locker, and\nvirtual garage unlocks.",[159,160,162],"h2",{"id":161},"server-sqf-module","Server SQF Module",[155,164,165],{},"The server addon uses two long-lived module objects:",[167,168,169,181],"ul",{},[170,171,172,176,177,180],"li",{},[173,174,175],"code",{},"StorefrontStore"," is the storefront workflow facade. It builds hydrate\npayloads, validates checkout requests, calls the Rust ",[173,178,179],{},"store:checkout","\ncommand, syncs UI patches, and asks related module stores to save hot state.",[170,182,183,186],{},[173,184,185],{},"StoreCatalogService"," scans configured item and vehicle categories, builds\ncatalog responses, resolves checkout entries, and calculates authoritative\nprices.",[155,188,189,190,193,194,197,198,201],{},"Editor-placed store entities are initialized by ",[173,191,192],{},"fnc_initStore"," during store\npost-init. The initializer matches non-null mission namespace objects whose\nvariable names contain ",[173,195,196],{},"store"," and sets ",[173,199,200],{},"isStore = true",", following the same\npattern used by garage entities.",[159,203,205],{"id":204},"checkout-model","Checkout Model",[155,207,208,210],{},[173,209,179],{}," accepts one JSON context.",[212,213,218],"pre",{"className":214,"code":215,"language":216,"meta":217,"style":217},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"requesterUid\": \"76561198000000000\",\n \"requesterName\": \"Player Name\",\n \"orgId\": \"default\",\n \"requesterIsDefaultOrgCeo\": false,\n \"paymentMethod\": \"bank\",\n \"items\": [\n {\n \"classname\": \"arifle_MX_F\",\n \"category\": \"weapon\",\n \"priceValue\": 500,\n \"quantity\": 1\n }\n ],\n \"vehicles\": [\n {\n \"classname\": \"B_Quadbike_01_F\",\n \"category\": \"cars\",\n \"priceValue\": 1500\n }\n ]\n}\n","json","",[173,219,220,229,257,278,299,314,335,350,356,379,400,418,433,439,445,459,464,484,504,518,523,529],{"__ignoreMap":217},[221,222,225],"span",{"class":223,"line":224},"line",1,[221,226,228],{"class":227},"sMK4o","{\n",[221,230,232,235,239,242,245,248,252,254],{"class":223,"line":231},2,[221,233,234],{"class":227}," \"",[221,236,238],{"class":237},"spNyl","requesterUid",[221,240,241],{"class":227},"\"",[221,243,244],{"class":227},":",[221,246,247],{"class":227}," \"",[221,249,251],{"class":250},"sfazB","76561198000000000",[221,253,241],{"class":227},[221,255,256],{"class":227},",\n",[221,258,260,262,265,267,269,271,274,276],{"class":223,"line":259},3,[221,261,234],{"class":227},[221,263,264],{"class":237},"requesterName",[221,266,241],{"class":227},[221,268,244],{"class":227},[221,270,247],{"class":227},[221,272,273],{"class":250},"Player Name",[221,275,241],{"class":227},[221,277,256],{"class":227},[221,279,281,283,286,288,290,292,295,297],{"class":223,"line":280},4,[221,282,234],{"class":227},[221,284,285],{"class":237},"orgId",[221,287,241],{"class":227},[221,289,244],{"class":227},[221,291,247],{"class":227},[221,293,294],{"class":250},"default",[221,296,241],{"class":227},[221,298,256],{"class":227},[221,300,302,304,307,309,311],{"class":223,"line":301},5,[221,303,234],{"class":227},[221,305,306],{"class":237},"requesterIsDefaultOrgCeo",[221,308,241],{"class":227},[221,310,244],{"class":227},[221,312,313],{"class":227}," false,\n",[221,315,317,319,322,324,326,328,331,333],{"class":223,"line":316},6,[221,318,234],{"class":227},[221,320,321],{"class":237},"paymentMethod",[221,323,241],{"class":227},[221,325,244],{"class":227},[221,327,247],{"class":227},[221,329,330],{"class":250},"bank",[221,332,241],{"class":227},[221,334,256],{"class":227},[221,336,338,340,343,345,347],{"class":223,"line":337},7,[221,339,234],{"class":227},[221,341,342],{"class":237},"items",[221,344,241],{"class":227},[221,346,244],{"class":227},[221,348,349],{"class":227}," [\n",[221,351,353],{"class":223,"line":352},8,[221,354,355],{"class":227}," {\n",[221,357,359,362,366,368,370,372,375,377],{"class":223,"line":358},9,[221,360,361],{"class":227}," \"",[221,363,365],{"class":364},"sBMFI","classname",[221,367,241],{"class":227},[221,369,244],{"class":227},[221,371,247],{"class":227},[221,373,374],{"class":250},"arifle_MX_F",[221,376,241],{"class":227},[221,378,256],{"class":227},[221,380,382,384,387,389,391,393,396,398],{"class":223,"line":381},10,[221,383,361],{"class":227},[221,385,386],{"class":364},"category",[221,388,241],{"class":227},[221,390,244],{"class":227},[221,392,247],{"class":227},[221,394,395],{"class":250},"weapon",[221,397,241],{"class":227},[221,399,256],{"class":227},[221,401,403,405,408,410,412,416],{"class":223,"line":402},11,[221,404,361],{"class":227},[221,406,407],{"class":364},"priceValue",[221,409,241],{"class":227},[221,411,244],{"class":227},[221,413,415],{"class":414},"sbssI"," 500",[221,417,256],{"class":227},[221,419,421,423,426,428,430],{"class":223,"line":420},12,[221,422,361],{"class":227},[221,424,425],{"class":364},"quantity",[221,427,241],{"class":227},[221,429,244],{"class":227},[221,431,432],{"class":414}," 1\n",[221,434,436],{"class":223,"line":435},13,[221,437,438],{"class":227}," }\n",[221,440,442],{"class":223,"line":441},14,[221,443,444],{"class":227}," ],\n",[221,446,448,450,453,455,457],{"class":223,"line":447},15,[221,449,234],{"class":227},[221,451,452],{"class":237},"vehicles",[221,454,241],{"class":227},[221,456,244],{"class":227},[221,458,349],{"class":227},[221,460,462],{"class":223,"line":461},16,[221,463,355],{"class":227},[221,465,467,469,471,473,475,477,480,482],{"class":223,"line":466},17,[221,468,361],{"class":227},[221,470,365],{"class":364},[221,472,241],{"class":227},[221,474,244],{"class":227},[221,476,247],{"class":227},[221,478,479],{"class":250},"B_Quadbike_01_F",[221,481,241],{"class":227},[221,483,256],{"class":227},[221,485,487,489,491,493,495,497,500,502],{"class":223,"line":486},18,[221,488,361],{"class":227},[221,490,386],{"class":364},[221,492,241],{"class":227},[221,494,244],{"class":227},[221,496,247],{"class":227},[221,498,499],{"class":250},"cars",[221,501,241],{"class":227},[221,503,256],{"class":227},[221,505,507,509,511,513,515],{"class":223,"line":506},19,[221,508,361],{"class":227},[221,510,407],{"class":364},[221,512,241],{"class":227},[221,514,244],{"class":227},[221,516,517],{"class":414}," 1500\n",[221,519,521],{"class":223,"line":520},20,[221,522,438],{"class":227},[221,524,526],{"class":223,"line":525},21,[221,527,528],{"class":227}," ]\n",[221,530,532],{"class":223,"line":531},22,[221,533,534],{"class":227},"}\n",[155,536,537],{},"Rules validated by the Rust service:",[167,539,540,545,548,551,571,591,606,609],{},[170,541,542,544],{},[173,543,238],{}," is required.",[170,546,547],{},"At least one item or vehicle is required.",[170,549,550],{},"The checkout total must be greater than zero.",[170,552,553,554,557,558,557,561,557,563,566,567,570],{},"Item categories must be ",[173,555,556],{},"item",", ",[173,559,560],{},"attachment",[173,562,395],{},[173,564,565],{},"magazine",", or\n",[173,568,569],{},"backpack",".",[170,572,573,574,557,576,557,579,557,582,557,585,566,588,570],{},"Vehicle categories must be ",[173,575,499],{},[173,577,578],{},"armor",[173,580,581],{},"helis",[173,583,584],{},"planes",[173,586,587],{},"naval",[173,589,590],{},"other",[170,592,593,594,557,597,557,599,602,603,570],{},"Payment method must be ",[173,595,596],{},"cash",[173,598,330],{},[173,600,601],{},"org_funds",", or ",[173,604,605],{},"credit_line",[170,607,608],{},"Player locker capacity cannot exceed 25 unique items after checkout.",[170,610,611],{},"Organization funds can only be charged by the org owner or the default org\nCEO flag.",[159,613,615],{"id":614},"command","Command",[617,618,619,634],"table",{},[620,621,622],"thead",{},[623,624,625,628,631],"tr",{},[626,627,615],"th",{},[626,629,630],{},"Arguments",[626,632,633],{},"Returns",[635,636,637],"tbody",{},[623,638,639,644,649],{},[640,641,642],"td",{},[173,643,179],{},[640,645,646],{},[173,647,648],{},"checkout_json",[640,650,651],{},"Checkout result JSON.",[159,653,655],{"id":654},"result-model","Result Model",[212,657,659],{"className":214,"code":658,"language":216,"meta":217,"style":217},"{\n \"chargedTotal\": 2000.0,\n \"paymentMethod\": \"bank\",\n \"message\": \"Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).\",\n \"lockerGranted\": [],\n \"vehicleGranted\": [],\n \"lockerPatch\": {},\n \"vaPatch\": {},\n \"vgaragePatch\": {},\n \"bankPatch\": {},\n \"orgPatch\": {},\n \"orgTargetUids\": []\n}\n",[173,660,661,665,681,699,719,733,746,760,773,786,799,812,826],{"__ignoreMap":217},[221,662,663],{"class":223,"line":224},[221,664,228],{"class":227},[221,666,667,669,672,674,676,679],{"class":223,"line":231},[221,668,234],{"class":227},[221,670,671],{"class":237},"chargedTotal",[221,673,241],{"class":227},[221,675,244],{"class":227},[221,677,678],{"class":414}," 2000.0",[221,680,256],{"class":227},[221,682,683,685,687,689,691,693,695,697],{"class":223,"line":259},[221,684,234],{"class":227},[221,686,321],{"class":237},[221,688,241],{"class":227},[221,690,244],{"class":227},[221,692,247],{"class":227},[221,694,330],{"class":250},[221,696,241],{"class":227},[221,698,256],{"class":227},[221,700,701,703,706,708,710,712,715,717],{"class":223,"line":280},[221,702,234],{"class":227},[221,704,705],{"class":237},"message",[221,707,241],{"class":227},[221,709,244],{"class":227},[221,711,247],{"class":227},[221,713,714],{"class":250},"Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).",[221,716,241],{"class":227},[221,718,256],{"class":227},[221,720,721,723,726,728,730],{"class":223,"line":301},[221,722,234],{"class":227},[221,724,725],{"class":237},"lockerGranted",[221,727,241],{"class":227},[221,729,244],{"class":227},[221,731,732],{"class":227}," [],\n",[221,734,735,737,740,742,744],{"class":223,"line":316},[221,736,234],{"class":227},[221,738,739],{"class":237},"vehicleGranted",[221,741,241],{"class":227},[221,743,244],{"class":227},[221,745,732],{"class":227},[221,747,748,750,753,755,757],{"class":223,"line":337},[221,749,234],{"class":227},[221,751,752],{"class":237},"lockerPatch",[221,754,241],{"class":227},[221,756,244],{"class":227},[221,758,759],{"class":227}," {},\n",[221,761,762,764,767,769,771],{"class":223,"line":352},[221,763,234],{"class":227},[221,765,766],{"class":237},"vaPatch",[221,768,241],{"class":227},[221,770,244],{"class":227},[221,772,759],{"class":227},[221,774,775,777,780,782,784],{"class":223,"line":358},[221,776,234],{"class":227},[221,778,779],{"class":237},"vgaragePatch",[221,781,241],{"class":227},[221,783,244],{"class":227},[221,785,759],{"class":227},[221,787,788,790,793,795,797],{"class":223,"line":381},[221,789,234],{"class":227},[221,791,792],{"class":237},"bankPatch",[221,794,241],{"class":227},[221,796,244],{"class":227},[221,798,759],{"class":227},[221,800,801,803,806,808,810],{"class":223,"line":402},[221,802,234],{"class":227},[221,804,805],{"class":237},"orgPatch",[221,807,241],{"class":227},[221,809,244],{"class":227},[221,811,759],{"class":227},[221,813,814,816,819,821,823],{"class":223,"line":420},[221,815,234],{"class":227},[221,817,818],{"class":237},"orgTargetUids",[221,820,241],{"class":227},[221,822,244],{"class":227},[221,824,825],{"class":227}," []\n",[221,827,828],{"class":223,"line":435},[221,829,534],{"class":227},[155,831,832],{},"Patch fields are intended for UI updates after checkout. The service commits\nall grants and payment changes together, and attempts rollback if a later write\nfails.",[159,834,836],{"id":835},"player-bank-checkout","Player Bank Checkout",[212,838,842],{"className":839,"code":840,"language":841,"meta":217,"style":217},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _item = createHashMapFromArray [\n [\"classname\", \"arifle_MX_F\"],\n [\"category\", \"weapon\"],\n [\"priceValue\", 500],\n [\"quantity\", 1]\n];\n\nprivate _checkout = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", \"default\"],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"paymentMethod\", \"bank\"],\n [\"items\", [_item]],\n [\"vehicles\", []]\n];\n\nprivate _result = \"forge_server\" callExtension [\"store:checkout\", [toJSON _checkout]];\n","sqf",[173,843,844,849,854,859,864,869,874,880,885,890,895,900,905,910,915,920,924,928],{"__ignoreMap":217},[221,845,846],{"class":223,"line":224},[221,847,848],{},"private _item = createHashMapFromArray [\n",[221,850,851],{"class":223,"line":231},[221,852,853],{}," [\"classname\", \"arifle_MX_F\"],\n",[221,855,856],{"class":223,"line":259},[221,857,858],{}," [\"category\", \"weapon\"],\n",[221,860,861],{"class":223,"line":280},[221,862,863],{}," [\"priceValue\", 500],\n",[221,865,866],{"class":223,"line":301},[221,867,868],{}," [\"quantity\", 1]\n",[221,870,871],{"class":223,"line":316},[221,872,873],{},"];\n",[221,875,876],{"class":223,"line":337},[221,877,879],{"emptyLinePlaceholder":878},true,"\n",[221,881,882],{"class":223,"line":352},[221,883,884],{},"private _checkout = createHashMapFromArray [\n",[221,886,887],{"class":223,"line":358},[221,888,889],{}," [\"requesterUid\", getPlayerUID player],\n",[221,891,892],{"class":223,"line":381},[221,893,894],{}," [\"requesterName\", name player],\n",[221,896,897],{"class":223,"line":402},[221,898,899],{}," [\"orgId\", \"default\"],\n",[221,901,902],{"class":223,"line":420},[221,903,904],{}," [\"requesterIsDefaultOrgCeo\", false],\n",[221,906,907],{"class":223,"line":435},[221,908,909],{}," [\"paymentMethod\", \"bank\"],\n",[221,911,912],{"class":223,"line":441},[221,913,914],{}," [\"items\", [_item]],\n",[221,916,917],{"class":223,"line":447},[221,918,919],{}," [\"vehicles\", []]\n",[221,921,922],{"class":223,"line":461},[221,923,873],{},[221,925,926],{"class":223,"line":466},[221,927,879],{"emptyLinePlaceholder":878},[221,929,930],{"class":223,"line":486},[221,931,932],{},"private _result = \"forge_server\" callExtension [\"store:checkout\", [toJSON _checkout]];\n",[159,934,936],{"id":935},"organization-funds-checkout","Organization Funds Checkout",[155,938,939,940,942,943,945],{},"When ",[173,941,321],{}," is ",[173,944,601],{},", vehicles are also added to the\norganization fleet patch.",[212,947,949],{"className":839,"code":948,"language":841,"meta":217,"style":217},"private _vehicle = createHashMapFromArray [\n [\"classname\", \"B_Quadbike_01_F\"],\n [\"category\", \"cars\"],\n [\"priceValue\", 1500]\n];\n\nprivate _checkout = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"paymentMethod\", \"org_funds\"],\n [\"items\", []],\n [\"vehicles\", [_vehicle]]\n];\n\nprivate _result = \"forge_server\" callExtension [\"store:checkout\", [toJSON _checkout]];\n",[173,950,951,956,961,966,971,975,979,983,987,991,996,1000,1005,1010,1015,1019,1023],{"__ignoreMap":217},[221,952,953],{"class":223,"line":224},[221,954,955],{},"private _vehicle = createHashMapFromArray [\n",[221,957,958],{"class":223,"line":231},[221,959,960],{}," [\"classname\", \"B_Quadbike_01_F\"],\n",[221,962,963],{"class":223,"line":259},[221,964,965],{}," [\"category\", \"cars\"],\n",[221,967,968],{"class":223,"line":280},[221,969,970],{}," [\"priceValue\", 1500]\n",[221,972,973],{"class":223,"line":301},[221,974,873],{},[221,976,977],{"class":223,"line":316},[221,978,879],{"emptyLinePlaceholder":878},[221,980,981],{"class":223,"line":337},[221,982,884],{},[221,984,985],{"class":223,"line":352},[221,986,889],{},[221,988,989],{"class":223,"line":358},[221,990,894],{},[221,992,993],{"class":223,"line":381},[221,994,995],{}," [\"orgId\", _orgId],\n",[221,997,998],{"class":223,"line":402},[221,999,904],{},[221,1001,1002],{"class":223,"line":420},[221,1003,1004],{}," [\"paymentMethod\", \"org_funds\"],\n",[221,1006,1007],{"class":223,"line":435},[221,1008,1009],{}," [\"items\", []],\n",[221,1011,1012],{"class":223,"line":441},[221,1013,1014],{}," [\"vehicles\", [_vehicle]]\n",[221,1016,1017],{"class":223,"line":447},[221,1018,873],{},[221,1020,1021],{"class":223,"line":461},[221,1022,879],{"emptyLinePlaceholder":878},[221,1024,1025],{"class":223,"line":466},[221,1026,932],{},[159,1028,1030],{"id":1029},"error-handling","Error Handling",[212,1032,1034],{"className":839,"code":1033,"language":841,"meta":217,"style":217},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Checkout failed: %1\", _payload];\n};\n\nprivate _checkoutResult = fromJSON _payload;\n",[173,1035,1036,1041,1046,1051,1056,1060],{"__ignoreMap":217},[221,1037,1038],{"class":223,"line":224},[221,1039,1040],{},"private _payload = _result select 0;\n",[221,1042,1043],{"class":223,"line":231},[221,1044,1045],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[221,1047,1048],{"class":223,"line":259},[221,1049,1050],{}," hint format [\"Checkout failed: %1\", _payload];\n",[221,1052,1053],{"class":223,"line":280},[221,1054,1055],{},"};\n",[221,1057,1058],{"class":223,"line":301},[221,1059,879],{"emptyLinePlaceholder":878},[221,1061,1062],{"class":223,"line":316},[221,1063,1064],{},"private _checkoutResult = fromJSON _payload;\n",[1066,1067,1068],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":217,"searchDepth":231,"depth":231,"links":1070},[1071,1072,1073,1074,1075,1076,1077],{"id":161,"depth":231,"text":162},{"id":204,"depth":231,"text":205},{"id":614,"depth":231,"text":615},{"id":654,"depth":231,"text":655},{"id":835,"depth":231,"text":836},{"id":935,"depth":231,"text":936},{"id":1029,"depth":231,"text":1030},"md",null,{},{"title":53,"description":157},"PagD8Wx8XDQTlB6cdVUen7XOkIgjt96Gazqirt2_9qw",[1084,1086],{"title":49,"path":50,"stem":51,"description":1085,"children":-1},"The actor module stores persistent player character data: identity, loadout,\nposition, direction, stance, contact fields, state, holster status, rank, and\norganization.",{"title":57,"path":58,"stem":59,"description":1087,"children":-1},"The task module stores transient mission task metadata for active server or\nmission lifecycle workflows. SQF still owns Arma-only runtime state such as\nobjects and participants.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1088},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-store":145,"-server-modules-store-surround":1083},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":53,"body":147,"description":157,"extension":1078,"links":1079,"meta":1080,"navigation":878,"path":54,"seo":1081,"stem":55,"__hash__":1082},"docs\u002F3.server-modules\u002F10.store.md",{"type":148,"value":149,"toc":1069},"minimark",[150,154,158,163,166,187,202,206,211,535,538,612,616,652,656,830,833,837,933,937,946,1027,1031,1065],[151,152,53],"h1",{"id":153},"store-usage-guide",[155,156,157],"p",{},"The store module processes checkout requests. It charges a payment source and\ngrants purchased items to the player locker, virtual arsenal locker, and\nvirtual garage unlocks.",[159,160,162],"h2",{"id":161},"server-sqf-module","Server SQF Module",[155,164,165],{},"The server addon uses two long-lived module objects:",[167,168,169,181],"ul",{},[170,171,172,176,177,180],"li",{},[173,174,175],"code",{},"StorefrontStore"," is the storefront workflow facade. It builds hydrate\npayloads, validates checkout requests, calls the Rust ",[173,178,179],{},"store:checkout","\ncommand, syncs UI patches, and asks related module stores to save hot state.",[170,182,183,186],{},[173,184,185],{},"StoreCatalogService"," scans configured item and vehicle categories, builds\ncatalog responses, resolves checkout entries, and calculates authoritative\nprices.",[155,188,189,190,193,194,197,198,201],{},"Editor-placed store entities are initialized by ",[173,191,192],{},"fnc_initStore"," during store\npost-init. The initializer matches non-null mission namespace objects whose\nvariable names contain ",[173,195,196],{},"store"," and sets ",[173,199,200],{},"isStore = true",", following the same\npattern used by garage entities.",[159,203,205],{"id":204},"checkout-model","Checkout Model",[155,207,208,210],{},[173,209,179],{}," accepts one JSON context.",[212,213,218],"pre",{"className":214,"code":215,"language":216,"meta":217,"style":217},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"requesterUid\": \"76561198000000000\",\n \"requesterName\": \"Player Name\",\n \"orgId\": \"default\",\n \"requesterIsDefaultOrgCeo\": false,\n \"paymentMethod\": \"bank\",\n \"items\": [\n {\n \"classname\": \"arifle_MX_F\",\n \"category\": \"weapon\",\n \"priceValue\": 500,\n \"quantity\": 1\n }\n ],\n \"vehicles\": [\n {\n \"classname\": \"B_Quadbike_01_F\",\n \"category\": \"cars\",\n \"priceValue\": 1500\n }\n ]\n}\n","json","",[173,219,220,229,257,278,299,314,335,350,356,379,400,418,433,439,445,459,464,484,504,518,523,529],{"__ignoreMap":217},[221,222,225],"span",{"class":223,"line":224},"line",1,[221,226,228],{"class":227},"sMK4o","{\n",[221,230,232,235,239,242,245,248,252,254],{"class":223,"line":231},2,[221,233,234],{"class":227}," \"",[221,236,238],{"class":237},"spNyl","requesterUid",[221,240,241],{"class":227},"\"",[221,243,244],{"class":227},":",[221,246,247],{"class":227}," \"",[221,249,251],{"class":250},"sfazB","76561198000000000",[221,253,241],{"class":227},[221,255,256],{"class":227},",\n",[221,258,260,262,265,267,269,271,274,276],{"class":223,"line":259},3,[221,261,234],{"class":227},[221,263,264],{"class":237},"requesterName",[221,266,241],{"class":227},[221,268,244],{"class":227},[221,270,247],{"class":227},[221,272,273],{"class":250},"Player Name",[221,275,241],{"class":227},[221,277,256],{"class":227},[221,279,281,283,286,288,290,292,295,297],{"class":223,"line":280},4,[221,282,234],{"class":227},[221,284,285],{"class":237},"orgId",[221,287,241],{"class":227},[221,289,244],{"class":227},[221,291,247],{"class":227},[221,293,294],{"class":250},"default",[221,296,241],{"class":227},[221,298,256],{"class":227},[221,300,302,304,307,309,311],{"class":223,"line":301},5,[221,303,234],{"class":227},[221,305,306],{"class":237},"requesterIsDefaultOrgCeo",[221,308,241],{"class":227},[221,310,244],{"class":227},[221,312,313],{"class":227}," false,\n",[221,315,317,319,322,324,326,328,331,333],{"class":223,"line":316},6,[221,318,234],{"class":227},[221,320,321],{"class":237},"paymentMethod",[221,323,241],{"class":227},[221,325,244],{"class":227},[221,327,247],{"class":227},[221,329,330],{"class":250},"bank",[221,332,241],{"class":227},[221,334,256],{"class":227},[221,336,338,340,343,345,347],{"class":223,"line":337},7,[221,339,234],{"class":227},[221,341,342],{"class":237},"items",[221,344,241],{"class":227},[221,346,244],{"class":227},[221,348,349],{"class":227}," [\n",[221,351,353],{"class":223,"line":352},8,[221,354,355],{"class":227}," {\n",[221,357,359,362,366,368,370,372,375,377],{"class":223,"line":358},9,[221,360,361],{"class":227}," \"",[221,363,365],{"class":364},"sBMFI","classname",[221,367,241],{"class":227},[221,369,244],{"class":227},[221,371,247],{"class":227},[221,373,374],{"class":250},"arifle_MX_F",[221,376,241],{"class":227},[221,378,256],{"class":227},[221,380,382,384,387,389,391,393,396,398],{"class":223,"line":381},10,[221,383,361],{"class":227},[221,385,386],{"class":364},"category",[221,388,241],{"class":227},[221,390,244],{"class":227},[221,392,247],{"class":227},[221,394,395],{"class":250},"weapon",[221,397,241],{"class":227},[221,399,256],{"class":227},[221,401,403,405,408,410,412,416],{"class":223,"line":402},11,[221,404,361],{"class":227},[221,406,407],{"class":364},"priceValue",[221,409,241],{"class":227},[221,411,244],{"class":227},[221,413,415],{"class":414},"sbssI"," 500",[221,417,256],{"class":227},[221,419,421,423,426,428,430],{"class":223,"line":420},12,[221,422,361],{"class":227},[221,424,425],{"class":364},"quantity",[221,427,241],{"class":227},[221,429,244],{"class":227},[221,431,432],{"class":414}," 1\n",[221,434,436],{"class":223,"line":435},13,[221,437,438],{"class":227}," }\n",[221,440,442],{"class":223,"line":441},14,[221,443,444],{"class":227}," ],\n",[221,446,448,450,453,455,457],{"class":223,"line":447},15,[221,449,234],{"class":227},[221,451,452],{"class":237},"vehicles",[221,454,241],{"class":227},[221,456,244],{"class":227},[221,458,349],{"class":227},[221,460,462],{"class":223,"line":461},16,[221,463,355],{"class":227},[221,465,467,469,471,473,475,477,480,482],{"class":223,"line":466},17,[221,468,361],{"class":227},[221,470,365],{"class":364},[221,472,241],{"class":227},[221,474,244],{"class":227},[221,476,247],{"class":227},[221,478,479],{"class":250},"B_Quadbike_01_F",[221,481,241],{"class":227},[221,483,256],{"class":227},[221,485,487,489,491,493,495,497,500,502],{"class":223,"line":486},18,[221,488,361],{"class":227},[221,490,386],{"class":364},[221,492,241],{"class":227},[221,494,244],{"class":227},[221,496,247],{"class":227},[221,498,499],{"class":250},"cars",[221,501,241],{"class":227},[221,503,256],{"class":227},[221,505,507,509,511,513,515],{"class":223,"line":506},19,[221,508,361],{"class":227},[221,510,407],{"class":364},[221,512,241],{"class":227},[221,514,244],{"class":227},[221,516,517],{"class":414}," 1500\n",[221,519,521],{"class":223,"line":520},20,[221,522,438],{"class":227},[221,524,526],{"class":223,"line":525},21,[221,527,528],{"class":227}," ]\n",[221,530,532],{"class":223,"line":531},22,[221,533,534],{"class":227},"}\n",[155,536,537],{},"Rules validated by the Rust service:",[167,539,540,545,548,551,571,591,606,609],{},[170,541,542,544],{},[173,543,238],{}," is required.",[170,546,547],{},"At least one item or vehicle is required.",[170,549,550],{},"The checkout total must be greater than zero.",[170,552,553,554,557,558,557,561,557,563,566,567,570],{},"Item categories must be ",[173,555,556],{},"item",", ",[173,559,560],{},"attachment",[173,562,395],{},[173,564,565],{},"magazine",", or\n",[173,568,569],{},"backpack",".",[170,572,573,574,557,576,557,579,557,582,557,585,566,588,570],{},"Vehicle categories must be ",[173,575,499],{},[173,577,578],{},"armor",[173,580,581],{},"helis",[173,583,584],{},"planes",[173,586,587],{},"naval",[173,589,590],{},"other",[170,592,593,594,557,597,557,599,602,603,570],{},"Payment method must be ",[173,595,596],{},"cash",[173,598,330],{},[173,600,601],{},"org_funds",", or ",[173,604,605],{},"credit_line",[170,607,608],{},"Player locker capacity cannot exceed 25 unique items after checkout.",[170,610,611],{},"Organization funds can only be charged by the org owner or the default org\nCEO flag.",[159,613,615],{"id":614},"command","Command",[617,618,619,634],"table",{},[620,621,622],"thead",{},[623,624,625,628,631],"tr",{},[626,627,615],"th",{},[626,629,630],{},"Arguments",[626,632,633],{},"Returns",[635,636,637],"tbody",{},[623,638,639,644,649],{},[640,641,642],"td",{},[173,643,179],{},[640,645,646],{},[173,647,648],{},"checkout_json",[640,650,651],{},"Checkout result JSON.",[159,653,655],{"id":654},"result-model","Result Model",[212,657,659],{"className":214,"code":658,"language":216,"meta":217,"style":217},"{\n \"chargedTotal\": 2000.0,\n \"paymentMethod\": \"bank\",\n \"message\": \"Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).\",\n \"lockerGranted\": [],\n \"vehicleGranted\": [],\n \"lockerPatch\": {},\n \"vaPatch\": {},\n \"vgaragePatch\": {},\n \"bankPatch\": {},\n \"orgPatch\": {},\n \"orgTargetUids\": []\n}\n",[173,660,661,665,681,699,719,733,746,760,773,786,799,812,826],{"__ignoreMap":217},[221,662,663],{"class":223,"line":224},[221,664,228],{"class":227},[221,666,667,669,672,674,676,679],{"class":223,"line":231},[221,668,234],{"class":227},[221,670,671],{"class":237},"chargedTotal",[221,673,241],{"class":227},[221,675,244],{"class":227},[221,677,678],{"class":414}," 2000.0",[221,680,256],{"class":227},[221,682,683,685,687,689,691,693,695,697],{"class":223,"line":259},[221,684,234],{"class":227},[221,686,321],{"class":237},[221,688,241],{"class":227},[221,690,244],{"class":227},[221,692,247],{"class":227},[221,694,330],{"class":250},[221,696,241],{"class":227},[221,698,256],{"class":227},[221,700,701,703,706,708,710,712,715,717],{"class":223,"line":280},[221,702,234],{"class":227},[221,704,705],{"class":237},"message",[221,707,241],{"class":227},[221,709,244],{"class":227},[221,711,247],{"class":227},[221,713,714],{"class":250},"Checkout completed. $2,000 charged, 1 locker grant(s), 1 vehicle unlock(s).",[221,716,241],{"class":227},[221,718,256],{"class":227},[221,720,721,723,726,728,730],{"class":223,"line":301},[221,722,234],{"class":227},[221,724,725],{"class":237},"lockerGranted",[221,727,241],{"class":227},[221,729,244],{"class":227},[221,731,732],{"class":227}," [],\n",[221,734,735,737,740,742,744],{"class":223,"line":316},[221,736,234],{"class":227},[221,738,739],{"class":237},"vehicleGranted",[221,741,241],{"class":227},[221,743,244],{"class":227},[221,745,732],{"class":227},[221,747,748,750,753,755,757],{"class":223,"line":337},[221,749,234],{"class":227},[221,751,752],{"class":237},"lockerPatch",[221,754,241],{"class":227},[221,756,244],{"class":227},[221,758,759],{"class":227}," {},\n",[221,761,762,764,767,769,771],{"class":223,"line":352},[221,763,234],{"class":227},[221,765,766],{"class":237},"vaPatch",[221,768,241],{"class":227},[221,770,244],{"class":227},[221,772,759],{"class":227},[221,774,775,777,780,782,784],{"class":223,"line":358},[221,776,234],{"class":227},[221,778,779],{"class":237},"vgaragePatch",[221,781,241],{"class":227},[221,783,244],{"class":227},[221,785,759],{"class":227},[221,787,788,790,793,795,797],{"class":223,"line":381},[221,789,234],{"class":227},[221,791,792],{"class":237},"bankPatch",[221,794,241],{"class":227},[221,796,244],{"class":227},[221,798,759],{"class":227},[221,800,801,803,806,808,810],{"class":223,"line":402},[221,802,234],{"class":227},[221,804,805],{"class":237},"orgPatch",[221,807,241],{"class":227},[221,809,244],{"class":227},[221,811,759],{"class":227},[221,813,814,816,819,821,823],{"class":223,"line":420},[221,815,234],{"class":227},[221,817,818],{"class":237},"orgTargetUids",[221,820,241],{"class":227},[221,822,244],{"class":227},[221,824,825],{"class":227}," []\n",[221,827,828],{"class":223,"line":435},[221,829,534],{"class":227},[155,831,832],{},"Patch fields are intended for UI updates after checkout. The service commits\nall grants and payment changes together, and attempts rollback if a later write\nfails.",[159,834,836],{"id":835},"player-bank-checkout","Player Bank Checkout",[212,838,842],{"className":839,"code":840,"language":841,"meta":217,"style":217},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _item = createHashMapFromArray [\n [\"classname\", \"arifle_MX_F\"],\n [\"category\", \"weapon\"],\n [\"priceValue\", 500],\n [\"quantity\", 1]\n];\n\nprivate _checkout = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", \"default\"],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"paymentMethod\", \"bank\"],\n [\"items\", [_item]],\n [\"vehicles\", []]\n];\n\nprivate _result = \"forge_server\" callExtension [\"store:checkout\", [toJSON _checkout]];\n","sqf",[173,843,844,849,854,859,864,869,874,880,885,890,895,900,905,910,915,920,924,928],{"__ignoreMap":217},[221,845,846],{"class":223,"line":224},[221,847,848],{},"private _item = createHashMapFromArray [\n",[221,850,851],{"class":223,"line":231},[221,852,853],{}," [\"classname\", \"arifle_MX_F\"],\n",[221,855,856],{"class":223,"line":259},[221,857,858],{}," [\"category\", \"weapon\"],\n",[221,860,861],{"class":223,"line":280},[221,862,863],{}," [\"priceValue\", 500],\n",[221,865,866],{"class":223,"line":301},[221,867,868],{}," [\"quantity\", 1]\n",[221,870,871],{"class":223,"line":316},[221,872,873],{},"];\n",[221,875,876],{"class":223,"line":337},[221,877,879],{"emptyLinePlaceholder":878},true,"\n",[221,881,882],{"class":223,"line":352},[221,883,884],{},"private _checkout = createHashMapFromArray [\n",[221,886,887],{"class":223,"line":358},[221,888,889],{}," [\"requesterUid\", getPlayerUID player],\n",[221,891,892],{"class":223,"line":381},[221,893,894],{}," [\"requesterName\", name player],\n",[221,896,897],{"class":223,"line":402},[221,898,899],{}," [\"orgId\", \"default\"],\n",[221,901,902],{"class":223,"line":420},[221,903,904],{}," [\"requesterIsDefaultOrgCeo\", false],\n",[221,906,907],{"class":223,"line":435},[221,908,909],{}," [\"paymentMethod\", \"bank\"],\n",[221,911,912],{"class":223,"line":441},[221,913,914],{}," [\"items\", [_item]],\n",[221,916,917],{"class":223,"line":447},[221,918,919],{}," [\"vehicles\", []]\n",[221,921,922],{"class":223,"line":461},[221,923,873],{},[221,925,926],{"class":223,"line":466},[221,927,879],{"emptyLinePlaceholder":878},[221,929,930],{"class":223,"line":486},[221,931,932],{},"private _result = \"forge_server\" callExtension [\"store:checkout\", [toJSON _checkout]];\n",[159,934,936],{"id":935},"organization-funds-checkout","Organization Funds Checkout",[155,938,939,940,942,943,945],{},"When ",[173,941,321],{}," is ",[173,944,601],{},", vehicles are also added to the\norganization fleet patch.",[212,947,949],{"className":839,"code":948,"language":841,"meta":217,"style":217},"private _vehicle = createHashMapFromArray [\n [\"classname\", \"B_Quadbike_01_F\"],\n [\"category\", \"cars\"],\n [\"priceValue\", 1500]\n];\n\nprivate _checkout = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"requesterName\", name player],\n [\"orgId\", _orgId],\n [\"requesterIsDefaultOrgCeo\", false],\n [\"paymentMethod\", \"org_funds\"],\n [\"items\", []],\n [\"vehicles\", [_vehicle]]\n];\n\nprivate _result = \"forge_server\" callExtension [\"store:checkout\", [toJSON _checkout]];\n",[173,950,951,956,961,966,971,975,979,983,987,991,996,1000,1005,1010,1015,1019,1023],{"__ignoreMap":217},[221,952,953],{"class":223,"line":224},[221,954,955],{},"private _vehicle = createHashMapFromArray [\n",[221,957,958],{"class":223,"line":231},[221,959,960],{}," [\"classname\", \"B_Quadbike_01_F\"],\n",[221,962,963],{"class":223,"line":259},[221,964,965],{}," [\"category\", \"cars\"],\n",[221,967,968],{"class":223,"line":280},[221,969,970],{}," [\"priceValue\", 1500]\n",[221,972,973],{"class":223,"line":301},[221,974,873],{},[221,976,977],{"class":223,"line":316},[221,978,879],{"emptyLinePlaceholder":878},[221,980,981],{"class":223,"line":337},[221,982,884],{},[221,984,985],{"class":223,"line":352},[221,986,889],{},[221,988,989],{"class":223,"line":358},[221,990,894],{},[221,992,993],{"class":223,"line":381},[221,994,995],{}," [\"orgId\", _orgId],\n",[221,997,998],{"class":223,"line":402},[221,999,904],{},[221,1001,1002],{"class":223,"line":420},[221,1003,1004],{}," [\"paymentMethod\", \"org_funds\"],\n",[221,1006,1007],{"class":223,"line":435},[221,1008,1009],{}," [\"items\", []],\n",[221,1011,1012],{"class":223,"line":441},[221,1013,1014],{}," [\"vehicles\", [_vehicle]]\n",[221,1016,1017],{"class":223,"line":447},[221,1018,873],{},[221,1020,1021],{"class":223,"line":461},[221,1022,879],{"emptyLinePlaceholder":878},[221,1024,1025],{"class":223,"line":466},[221,1026,932],{},[159,1028,1030],{"id":1029},"error-handling","Error Handling",[212,1032,1034],{"className":839,"code":1033,"language":841,"meta":217,"style":217},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n hint format [\"Checkout failed: %1\", _payload];\n};\n\nprivate _checkoutResult = fromJSON _payload;\n",[173,1035,1036,1041,1046,1051,1056,1060],{"__ignoreMap":217},[221,1037,1038],{"class":223,"line":224},[221,1039,1040],{},"private _payload = _result select 0;\n",[221,1042,1043],{"class":223,"line":231},[221,1044,1045],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[221,1047,1048],{"class":223,"line":259},[221,1049,1050],{}," hint format [\"Checkout failed: %1\", _payload];\n",[221,1052,1053],{"class":223,"line":280},[221,1054,1055],{},"};\n",[221,1057,1058],{"class":223,"line":301},[221,1059,879],{"emptyLinePlaceholder":878},[221,1061,1062],{"class":223,"line":316},[221,1063,1064],{},"private _checkoutResult = fromJSON _payload;\n",[1066,1067,1068],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":217,"searchDepth":231,"depth":231,"links":1070},[1071,1072,1073,1074,1075,1076,1077],{"id":161,"depth":231,"text":162},{"id":204,"depth":231,"text":205},{"id":614,"depth":231,"text":615},{"id":654,"depth":231,"text":655},{"id":835,"depth":231,"text":836},{"id":935,"depth":231,"text":936},{"id":1029,"depth":231,"text":1030},"md",null,{},{"title":53,"description":157},"PagD8Wx8XDQTlB6cdVUen7XOkIgjt96Gazqirt2_9qw",[1084,1086],{"title":49,"path":50,"stem":51,"description":1085,"children":-1},"The actor module stores persistent player character data: identity, loadout,\nposition, direction, stance, contact fields, state, holster status, rank, and\norganization.",{"title":57,"path":58,"stem":59,"description":1087,"children":-1},"The task module stores transient mission task metadata for active server or\nmission lifecycle workflows. SQF still owns Arma-only runtime state such as\nobjects and participants.",1776806627742] \ No newline at end of file diff --git a/docus/dist/server-modules/task.html b/docus/dist/server-modules/task.html index 16b304e..29633b8 100644 --- a/docus/dist/server-modules/task.html +++ b/docus/dist/server-modules/task.html @@ -94,7 +94,7 @@ --ui-warning: var(--ui-color-warning-400); --ui-error: var(--ui-color-error-400); } -}Task Usage Guide - forge-docus

    Bank Usage Guide

    The bank module stores player account balances, earnings, PINs, and transaction strings. The hot-state API also owns the active banking workflows used by the -UI: deposit, withdraw, transfer, checkout charge, and PIN validation.

    \ No newline at end of file +UI: deposit, withdraw, transfer, checkout charge, and PIN validation.

    \ No newline at end of file diff --git a/docus/dist/server-modules/task/_payload.json b/docus/dist/server-modules/task/_payload.json index 992a5c2..e0500a0 100644 --- a/docus/dist/server-modules/task/_payload.json +++ b/docus/dist/server-modules/task/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1325},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-task":145,"-server-modules-task-surround":1320},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":57,"body":147,"description":157,"extension":1315,"links":1316,"meta":1317,"navigation":609,"path":58,"seo":1318,"stem":59,"__hash__":1319},"docs\u002F3.server-modules\u002F11.task.md",{"type":148,"value":149,"toc":1297},"minimark",[150,154,158,166,169,203,208,211,238,241,312,316,567,571,635,639,671,682,686,732,737,741,769,776,780,783,820,823,846,849,853,860,863,880,883,901,905,914,927,936,940,943,946,1006,1011,1015,1023,1132,1136,1141,1175,1179,1185,1189,1196,1224,1231,1245,1249,1264,1268,1293],[151,152,57],"h1",{"id":153},"task-usage-guide",[155,156,157],"p",{},"The task module stores transient mission task metadata for active server or\nmission lifecycle workflows. SQF still owns Arma-only runtime state such as\nobjects and participants.",[155,159,160,161,165],{},"The server addon at ",[162,163,164],"code",{},"arma\u002Fserver\u002Faddons\u002Ftask"," also owns task execution:\ncreating BIS tasks, registering task entities, tracking participants, binding\ntask ownership, applying player\u002Forg rewards, and clearing task state when a\ntask completes.",[155,167,168],{},"Runtime dependencies:",[170,171,172,178,183,188,193,198],"ul",{},[173,174,175],"li",{},[162,176,177],{},"forge_server_extension",[173,179,180],{},[162,181,182],{},"forge_server_common",[173,184,185],{},[162,186,187],{},"forge_server_actor",[173,189,190],{},[162,191,192],{},"forge_server_bank",[173,194,195],{},[162,196,197],{},"forge_server_org",[173,199,200],{},[162,201,202],{},"forge_client_notifications",[204,205,207],"h2",{"id":206},"data-model","Data Model",[155,209,210],{},"Catalog entries are flexible JSON objects. The service normalizes these fields\nwhen a catalog entry is inserted or ownership changes:",[170,212,213,218,223,228,233],{},[173,214,215],{},[162,216,217],{},"taskId",[173,219,220],{},[162,221,222],{},"taskID",[173,224,225],{},[162,226,227],{},"accepted",[173,229,230],{},[162,231,232],{},"requesterUid",[173,234,235],{},[162,236,237],{},"orgID",[155,239,240],{},"Ownership context:",[242,243,248],"pre",{"className":244,"code":245,"language":246,"meta":247,"style":247},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"requesterUid\": \"76561198000000000\",\n \"orgId\": \"default\"\n}\n","json","",[162,249,250,259,286,306],{"__ignoreMap":247},[251,252,255],"span",{"class":253,"line":254},"line",1,[251,256,258],{"class":257},"sMK4o","{\n",[251,260,262,265,268,271,274,277,281,283],{"class":253,"line":261},2,[251,263,264],{"class":257}," \"",[251,266,232],{"class":267},"spNyl",[251,269,270],{"class":257},"\"",[251,272,273],{"class":257},":",[251,275,276],{"class":257}," \"",[251,278,280],{"class":279},"sfazB","76561198000000000",[251,282,270],{"class":257},[251,284,285],{"class":257},",\n",[251,287,289,291,294,296,298,300,303],{"class":253,"line":288},3,[251,290,264],{"class":257},[251,292,293],{"class":267},"orgId",[251,295,270],{"class":257},[251,297,273],{"class":257},[251,299,276],{"class":257},[251,301,302],{"class":279},"default",[251,304,305],{"class":257},"\"\n",[251,307,309],{"class":253,"line":308},4,[251,310,311],{"class":257},"}\n",[204,313,315],{"id":314},"commands","Commands",[317,318,319,335],"table",{},[320,321,322],"thead",{},[323,324,325,329,332],"tr",{},[326,327,328],"th",{},"Command",[326,330,331],{},"Arguments",[326,333,334],{},"Returns",[336,337,338,355,367,385,403,418,435,448,463,477,495,509,524,538,552],"tbody",{},[323,339,340,346,349],{},[341,342,343],"td",{},[162,344,345],{},"task:reset",[341,347,348],{},"none",[341,350,351,354],{},[162,352,353],{},"true",".",[323,356,357,362,364],{},[341,358,359],{},[162,360,361],{},"task:catalog:active",[341,363,348],{},[341,365,366],{},"Active catalog entry array JSON.",[323,368,369,374,379],{},[341,370,371],{},[162,372,373],{},"task:catalog:get",[341,375,376],{},[162,377,378],{},"task_id",[341,380,381,382,354],{},"Catalog entry JSON or ",[162,383,384],{},"null",[323,386,387,392,400],{},[341,388,389],{},[162,390,391],{},"task:catalog:upsert",[341,393,394,396,397],{},[162,395,378],{},", ",[162,398,399],{},"entry_json",[341,401,402],{},"Stored catalog entry JSON.",[323,404,405,410,414],{},[341,406,407],{},[162,408,409],{},"task:catalog:delete",[341,411,412],{},[162,413,378],{},[341,415,416,354],{},[162,417,353],{},[323,419,420,425,432],{},[341,421,422],{},[162,423,424],{},"task:ownership:bind",[341,426,427,396,429],{},[162,428,378],{},[162,430,431],{},"ownership_json",[341,433,434],{},"Ownership mutation result JSON.",[323,436,437,442,446],{},[341,438,439],{},[162,440,441],{},"task:ownership:release",[341,443,444],{},[162,445,378],{},[341,447,434],{},[323,449,450,455,461],{},[341,451,452],{},[162,453,454],{},"task:ownership:accept",[341,456,457,396,459],{},[162,458,378],{},[162,460,431],{},[341,462,434],{},[323,464,465,470,474],{},[341,466,467],{},[162,468,469],{},"task:ownership:reward_context",[341,471,472],{},[162,473,378],{},[341,475,476],{},"Reward context JSON.",[323,478,479,484,491],{},[341,480,481],{},[162,482,483],{},"task:status:set",[341,485,486,396,488],{},[162,487,378],{},[162,489,490],{},"status",[341,492,493,354],{},[162,494,353],{},[323,496,497,502,506],{},[341,498,499],{},[162,500,501],{},"task:status:get",[341,503,504],{},[162,505,378],{},[341,507,508],{},"Status string JSON.",[323,510,511,516,520],{},[341,512,513],{},[162,514,515],{},"task:status:clear",[341,517,518],{},[162,519,378],{},[341,521,522,354],{},[162,523,353],{},[323,525,526,531,535],{},[341,527,528],{},[162,529,530],{},"task:defuse:increment",[341,532,533],{},[162,534,378],{},[341,536,537],{},"New counter value JSON.",[323,539,540,545,549],{},[341,541,542],{},[162,543,544],{},"task:defuse:get",[341,546,547],{},[162,548,378],{},[341,550,551],{},"Counter value JSON.",[323,553,554,559,563],{},[341,555,556],{},[162,557,558],{},"task:clear",[341,560,561],{},[162,562,378],{},[341,564,565,354],{},[162,566,353],{},[204,568,570],{"id":569},"upsert-a-catalog-entry","Upsert a Catalog Entry",[242,572,576],{"className":573,"code":574,"language":575,"meta":247,"style":247},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _entry = createHashMapFromArray [\n [\"title\", \"Destroy Cache\"],\n [\"description\", \"Destroy the enemy supply cache.\"],\n [\"reward\", 1500]\n];\n\nprivate _result = \"forge_server\" callExtension [\"task:catalog:upsert\", [\n \"task-cache-1\",\n toJSON _entry\n]];\n","sqf",[162,577,578,583,588,593,598,604,611,617,623,629],{"__ignoreMap":247},[251,579,580],{"class":253,"line":254},[251,581,582],{},"private _entry = createHashMapFromArray [\n",[251,584,585],{"class":253,"line":261},[251,586,587],{}," [\"title\", \"Destroy Cache\"],\n",[251,589,590],{"class":253,"line":288},[251,591,592],{}," [\"description\", \"Destroy the enemy supply cache.\"],\n",[251,594,595],{"class":253,"line":308},[251,596,597],{}," [\"reward\", 1500]\n",[251,599,601],{"class":253,"line":600},5,[251,602,603],{},"];\n",[251,605,607],{"class":253,"line":606},6,[251,608,610],{"emptyLinePlaceholder":609},true,"\n",[251,612,614],{"class":253,"line":613},7,[251,615,616],{},"private _result = \"forge_server\" callExtension [\"task:catalog:upsert\", [\n",[251,618,620],{"class":253,"line":619},8,[251,621,622],{}," \"task-cache-1\",\n",[251,624,626],{"class":253,"line":625},9,[251,627,628],{}," toJSON _entry\n",[251,630,632],{"class":253,"line":631},10,[251,633,634],{},"]];\n",[204,636,638],{"id":637},"mark-a-task-active","Mark a Task Active",[242,640,642],{"className":573,"code":641,"language":575,"meta":247,"style":247},"\"forge_server\" callExtension [\"task:status:set\", [\n \"task-cache-1\",\n \"active\"\n]];\n\nprivate _active = \"forge_server\" callExtension [\"task:catalog:active\", []];\n",[162,643,644,649,653,658,662,666],{"__ignoreMap":247},[251,645,646],{"class":253,"line":254},[251,647,648],{},"\"forge_server\" callExtension [\"task:status:set\", [\n",[251,650,651],{"class":253,"line":261},[251,652,622],{},[251,654,655],{"class":253,"line":288},[251,656,657],{}," \"active\"\n",[251,659,660],{"class":253,"line":308},[251,661,634],{},[251,663,664],{"class":253,"line":600},[251,665,610],{"emptyLinePlaceholder":609},[251,667,668],{"class":253,"line":606},[251,669,670],{},"private _active = \"forge_server\" callExtension [\"task:catalog:active\", []];\n",[155,672,673,674,677,678,681],{},"Completed statuses ",[162,675,676],{},"succeeded"," and ",[162,679,680],{},"failed"," are also stored as completed status\nfallbacks. Clearing status removes active and completed state.",[204,683,685],{"id":684},"accept-a-task","Accept a Task",[242,687,689],{"className":573,"code":688,"language":575,"meta":247,"style":247},"private _ownership = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"orgId\", \"default\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"task:ownership:accept\", [\n \"task-cache-1\",\n toJSON _ownership\n]];\n",[162,690,691,696,701,706,710,714,719,723,728],{"__ignoreMap":247},[251,692,693],{"class":253,"line":254},[251,694,695],{},"private _ownership = createHashMapFromArray [\n",[251,697,698],{"class":253,"line":261},[251,699,700],{}," [\"requesterUid\", getPlayerUID player],\n",[251,702,703],{"class":253,"line":288},[251,704,705],{}," [\"orgId\", \"default\"]\n",[251,707,708],{"class":253,"line":308},[251,709,603],{},[251,711,712],{"class":253,"line":600},[251,713,610],{"emptyLinePlaceholder":609},[251,715,716],{"class":253,"line":606},[251,717,718],{},"private _result = \"forge_server\" callExtension [\"task:ownership:accept\", [\n",[251,720,721],{"class":253,"line":613},[251,722,622],{},[251,724,725],{"class":253,"line":619},[251,726,727],{}," toJSON _ownership\n",[251,729,730],{"class":253,"line":625},[251,731,634],{},[155,733,734,736],{},[162,735,454],{}," fails if the task is not active or another requester\nalready accepted it.",[204,738,740],{"id":739},"rewards","Rewards",[242,742,744],{"className":573,"code":743,"language":575,"meta":247,"style":247},"private _result = \"forge_server\" callExtension [\"task:ownership:reward_context\", [\n \"task-cache-1\"\n]];\n\nprivate _context = fromJSON (_result select 0);\n",[162,745,746,751,756,760,764],{"__ignoreMap":247},[251,747,748],{"class":253,"line":254},[251,749,750],{},"private _result = \"forge_server\" callExtension [\"task:ownership:reward_context\", [\n",[251,752,753],{"class":253,"line":261},[251,754,755],{}," \"task-cache-1\"\n",[251,757,758],{"class":253,"line":288},[251,759,634],{},[251,761,762],{"class":253,"line":308},[251,763,610],{"emptyLinePlaceholder":609},[251,765,766],{"class":253,"line":600},[251,767,768],{},"private _context = fromJSON (_result select 0);\n",[155,770,771,772,677,774,354],{},"The reward context contains ",[162,773,232],{},[162,775,293],{},[204,777,779],{"id":778},"server-task-flows","Server Task Flows",[155,781,782],{},"The task addon provides these server-owned task flows:",[170,784,785,790,795,800,805,810,815],{},[173,786,787],{},[162,788,789],{},"attack",[173,791,792],{},[162,793,794],{},"defend",[173,796,797],{},[162,798,799],{},"defuse",[173,801,802],{},[162,803,804],{},"delivery",[173,806,807],{},[162,808,809],{},"destroy",[173,811,812],{},[162,813,814],{},"hostage",[173,816,817],{},[162,818,819],{},"hvt",[155,821,822],{},"Mission designers can create tasks in four ways:",[170,824,825,828,834,840],{},[173,826,827],{},"Eden modules for editor-authored tasks.",[173,829,830,833],{},[162,831,832],{},"forge_server_task_fnc_startTask"," for script-authored tasks.",[173,835,836,839],{},[162,837,838],{},"forge_server_task_fnc_handler"," for pre-registered entities with reputation\ngating and ownership binding. This path expects the BIS task and catalog\nentry to already exist if map-task and CAD visibility are required.",[173,841,842,843,845],{},"Direct task function calls for server-owned or mission-authored flows that\nintentionally fall back to the ",[162,844,302],{}," org. This path expects the BIS task\nto already exist if map-task visibility is required.",[155,847,848],{},"The dynamic mission manager can also generate attack tasks from config. That is\nsystem-generated content rather than a hand-authored task creation path.",[204,850,852],{"id":851},"cad-compatibility","CAD Compatibility",[155,854,855,856,859],{},"CAD hydrates assignable tasks from ",[162,857,858],{},"TaskStore.getActiveTaskCatalog",". A task must\nhave a catalog entry and active task status before CAD can show and assign it.",[155,861,862],{},"CAD-compatible creation paths:",[170,864,865,870,875],{},[173,866,867,868,354],{},"Eden modules: compatible because they delegate to\n",[162,869,832],{},[173,871,872,874],{},[162,873,832],{},": compatible because it registers the\ncatalog entry, creates the BIS task, and dispatches through the handler.",[173,876,877,878,354],{},"Dynamic mission manager attack tasks: compatible because the mission manager\nuses ",[162,879,832],{},[155,881,882],{},"Limited or incompatible paths:",[170,884,885,890],{},[173,886,887,889],{},[162,888,838],{},": only compatible if a catalog entry was\nalready registered elsewhere. The handler sets active status and ownership,\nbut it does not create the BIS task shown in the map task tab or upsert the\ncatalog entry.",[173,891,892,893,896,897,900],{},"Direct task function calls: not CAD-compatible by default. They bypass\n",[162,894,895],{},"startTask"," and usually do not register the task catalog entry or active\nstatus that CAD hydrates from. They also only call ",[162,898,899],{},"BIS_fnc_taskSetState"," at\ncompletion\u002Ffailure; they do not create the BIS task first.",[204,902,904],{"id":903},"bis-map-task-prerequisite","BIS Map Task Prerequisite",[155,906,907,908,910,911,354],{},"Only the Eden task modules and ",[162,909,832],{}," create the BIS\ntask automatically through ",[162,912,913],{},"BIS_fnc_taskCreate",[155,915,916,917,919,920,923,924,926],{},"If a mission uses ",[162,918,838],{}," directly or calls a task flow\nfunction such as ",[162,921,922],{},"forge_server_task_fnc_attack",", the mission must create a BIS\ntask with the same task ID before the Forge task completes. Otherwise the\nsuccess\u002Ffailure ",[162,925,899],{}," call has no visible map task to update.",[155,928,929,930,932,933,935],{},"That prerequisite can be satisfied with a vanilla Eden task creation module or\na scripted ",[162,931,913],{}," call. ",[162,934,832],{}," is the\npreferred Forge path because it handles BIS task creation, Forge catalog\nregistration, entity registration, and handler dispatch together.",[204,937,939],{"id":938},"eden-modules","Eden Modules",[155,941,942],{},"Eden task modules are the normal designer-facing path. Place the module,\nconfigure its attributes, and sync it to the relevant entities or grouping\nmodules.",[155,944,945],{},"Available task modules:",[170,947,948,954,960,973,982,994,1000],{},[173,949,950,953],{},[162,951,952],{},"FORGE_Module_Attack",": sync directly to target units or vehicles.",[173,955,956,959],{},[162,957,958],{},"FORGE_Module_Destroy",": sync directly to objects, vehicles, or units.",[173,961,962,965,966,969,970,354],{},[162,963,964],{},"FORGE_Module_Defuse",": sync to ",[162,967,968],{},"FORGE_Module_Explosives"," and optionally\n",[162,971,972],{},"FORGE_Module_Protected",[173,974,975,965,978,981],{},[162,976,977],{},"FORGE_Module_Delivery",[162,979,980],{},"FORGE_Module_Cargo","; the cargo module syncs\nto cargo objects.",[173,983,984,965,987,990,991,354],{},[162,985,986],{},"FORGE_Module_Hostage",[162,988,989],{},"FORGE_Module_Hostages"," and\n",[162,992,993],{},"FORGE_Module_Shooters",[173,995,996,999],{},[162,997,998],{},"FORGE_Module_HVT",": sync directly to HVT units.",[173,1001,1002,1005],{},[162,1003,1004],{},"FORGE_Module_Defend",": configure the defense marker and wave settings.",[155,1007,1008,1009,354],{},"These modules delegate to ",[162,1010,832],{},[204,1012,1014],{"id":1013},"scripted-start-task","Scripted Start Task",[155,1016,1017,1018,1020,1021,354],{},"Use ",[162,1019,832],{}," when creating tasks from modules,\nmission scripts, or generated mission-manager content. It registers task\nentities, creates the BIS task, stores the catalog entry, then dispatches\nthrough ",[162,1022,838],{},[242,1024,1026],{"className":573,"code":1025,"language":575,"meta":247,"style":247},"[\n \"attack\",\n \"compound_attack_01\",\n getPosATL leader1,\n \"Attack: East Compound\",\n \"Eliminate all hostile forces.\",\n createHashMapFromArray [[\"targets\", [unit1, unit2, unit3]]],\n createHashMapFromArray [\n [\"limitFail\", 0],\n [\"limitSuccess\", 3],\n [\"funds\", 50000],\n [\"ratingFail\", -10],\n [\"ratingSuccess\", 20],\n [\"timeLimit\", 900]\n ],\n 0,\n getPlayerUID player,\n \"script\"\n] call forge_server_task_fnc_startTask;\n",[162,1027,1028,1033,1038,1043,1048,1053,1058,1063,1068,1073,1078,1084,1090,1096,1102,1108,1114,1120,1126],{"__ignoreMap":247},[251,1029,1030],{"class":253,"line":254},[251,1031,1032],{},"[\n",[251,1034,1035],{"class":253,"line":261},[251,1036,1037],{}," \"attack\",\n",[251,1039,1040],{"class":253,"line":288},[251,1041,1042],{}," \"compound_attack_01\",\n",[251,1044,1045],{"class":253,"line":308},[251,1046,1047],{}," getPosATL leader1,\n",[251,1049,1050],{"class":253,"line":600},[251,1051,1052],{}," \"Attack: East Compound\",\n",[251,1054,1055],{"class":253,"line":606},[251,1056,1057],{}," \"Eliminate all hostile forces.\",\n",[251,1059,1060],{"class":253,"line":613},[251,1061,1062],{}," createHashMapFromArray [[\"targets\", [unit1, unit2, unit3]]],\n",[251,1064,1065],{"class":253,"line":619},[251,1066,1067],{}," createHashMapFromArray [\n",[251,1069,1070],{"class":253,"line":625},[251,1071,1072],{}," [\"limitFail\", 0],\n",[251,1074,1075],{"class":253,"line":631},[251,1076,1077],{}," [\"limitSuccess\", 3],\n",[251,1079,1081],{"class":253,"line":1080},11,[251,1082,1083],{}," [\"funds\", 50000],\n",[251,1085,1087],{"class":253,"line":1086},12,[251,1088,1089],{}," [\"ratingFail\", -10],\n",[251,1091,1093],{"class":253,"line":1092},13,[251,1094,1095],{}," [\"ratingSuccess\", 20],\n",[251,1097,1099],{"class":253,"line":1098},14,[251,1100,1101],{}," [\"timeLimit\", 900]\n",[251,1103,1105],{"class":253,"line":1104},15,[251,1106,1107],{}," ],\n",[251,1109,1111],{"class":253,"line":1110},16,[251,1112,1113],{}," 0,\n",[251,1115,1117],{"class":253,"line":1116},17,[251,1118,1119],{}," getPlayerUID player,\n",[251,1121,1123],{"class":253,"line":1122},18,[251,1124,1125],{}," \"script\"\n",[251,1127,1129],{"class":253,"line":1128},19,[251,1130,1131],{},"] call forge_server_task_fnc_startTask;\n",[204,1133,1135],{"id":1134},"handler-calls","Handler Calls",[155,1137,1017,1138,1140],{},[162,1139,838],{}," directly when the task entities are already\nregistered and you want reputation gating plus ownership binding. Create the\nBIS task and catalog entry separately if this task should appear in the map\ntask tab or CAD:",[242,1142,1144],{"className":573,"code":1143,"language":575,"meta":247,"style":247},"[\n \"delivery\",\n [\"delivery_1\", 1, 3, \"delivery_zone\", 250000, -75, 300, false, false, 900],\n 250,\n getPlayerUID player\n] call forge_server_task_fnc_handler;\n",[162,1145,1146,1150,1155,1160,1165,1170],{"__ignoreMap":247},[251,1147,1148],{"class":253,"line":254},[251,1149,1032],{},[251,1151,1152],{"class":253,"line":261},[251,1153,1154],{}," \"delivery\",\n",[251,1156,1157],{"class":253,"line":288},[251,1158,1159],{}," [\"delivery_1\", 1, 3, \"delivery_zone\", 250000, -75, 300, false, false, 900],\n",[251,1161,1162],{"class":253,"line":308},[251,1163,1164],{}," 250,\n",[251,1166,1167],{"class":253,"line":600},[251,1168,1169],{}," getPlayerUID player\n",[251,1171,1172],{"class":253,"line":606},[251,1173,1174],{},"] call forge_server_task_fnc_handler;\n",[204,1176,1178],{"id":1177},"direct-task-calls","Direct Task Calls",[155,1180,1181,1182,1184],{},"Direct task function calls still work for mission-authored or server-owned\ntasks, but they do not provide a requester UID. Ownership falls back to the\n",[162,1183,302],{}," org. Create the BIS task separately if this task should appear in the\nmap task tab.",[204,1186,1188],{"id":1187},"timer-semantics","Timer Semantics",[155,1190,1191,1192,1195],{},"Task time limits use ",[162,1193,1194],{},"0"," for no limit:",[170,1197,1198,1204,1209,1214,1219],{},[173,1199,1200,1201],{},"attack ",[162,1202,1203],{},"timeLimit",[173,1205,1206,1207],{},"destroy ",[162,1208,1203],{},[173,1210,1211,1212],{},"delivery ",[162,1213,1203],{},[173,1215,1216,1217],{},"hostage ",[162,1218,1203],{},[173,1220,1221,1222],{},"HVT ",[162,1223,1203],{},[155,1225,1226,1227,1230],{},"Positive values are measured in seconds. Do not pass ",[162,1228,1229],{},"-1"," as a no-limit value;\nthe task runtime treats any non-zero task time limit as active.",[155,1232,1233,1234,1237,1238,1240,1241,1244],{},"Defuse IED timers are different. ",[162,1235,1236],{},"iedTimer"," must be greater than ",[162,1239,1194],{},", because\nIEDs are expected to have an active countdown. The Eden defuse module defaults\nto ",[162,1242,1243],{},"300"," seconds.",[204,1246,1248],{"id":1247},"defuse-counter","Defuse Counter",[242,1250,1252],{"className":573,"code":1251,"language":575,"meta":247,"style":247},"\"forge_server\" callExtension [\"task:defuse:increment\", [\"task-cache-1\"]];\nprivate _count = \"forge_server\" callExtension [\"task:defuse:get\", [\"task-cache-1\"]];\n",[162,1253,1254,1259],{"__ignoreMap":247},[251,1255,1256],{"class":253,"line":254},[251,1257,1258],{},"\"forge_server\" callExtension [\"task:defuse:increment\", [\"task-cache-1\"]];\n",[251,1260,1261],{"class":253,"line":261},[251,1262,1263],{},"private _count = \"forge_server\" callExtension [\"task:defuse:get\", [\"task-cache-1\"]];\n",[204,1265,1267],{"id":1266},"error-handling","Error Handling",[242,1269,1271],{"className":573,"code":1270,"language":575,"meta":247,"style":247},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Task error: %1\", _payload];\n};\n",[162,1272,1273,1278,1283,1288],{"__ignoreMap":247},[251,1274,1275],{"class":253,"line":254},[251,1276,1277],{},"private _payload = _result select 0;\n",[251,1279,1280],{"class":253,"line":261},[251,1281,1282],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[251,1284,1285],{"class":253,"line":288},[251,1286,1287],{}," systemChat format [\"Task error: %1\", _payload];\n",[251,1289,1290],{"class":253,"line":308},[251,1291,1292],{},"};\n",[1294,1295,1296],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":247,"searchDepth":261,"depth":261,"links":1298},[1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314],{"id":206,"depth":261,"text":207},{"id":314,"depth":261,"text":315},{"id":569,"depth":261,"text":570},{"id":637,"depth":261,"text":638},{"id":684,"depth":261,"text":685},{"id":739,"depth":261,"text":740},{"id":778,"depth":261,"text":779},{"id":851,"depth":261,"text":852},{"id":903,"depth":261,"text":904},{"id":938,"depth":261,"text":939},{"id":1013,"depth":261,"text":1014},{"id":1134,"depth":261,"text":1135},{"id":1177,"depth":261,"text":1178},{"id":1187,"depth":261,"text":1188},{"id":1247,"depth":261,"text":1248},{"id":1266,"depth":261,"text":1267},"md",null,{},{"title":57,"description":157},"KdbrlSiS5YQ3OEJob3r0ceVGYCznKZq-sUb7FfWDctU",[1321,1323],{"title":53,"path":54,"stem":55,"description":1322,"children":-1},"The store module processes checkout requests. It charges a payment source and\ngrants purchased items to the player locker, virtual arsenal locker, and\nvirtual garage unlocks.",{"title":61,"path":62,"stem":63,"description":1324,"children":-1},"The bank module stores player account balances, earnings, PINs, and transaction\nstrings. The hot-state API also owns the active banking workflows used by the\nUI: deposit, withdraw, transfer, checkout charge, and PIN validation.",1776805514938] \ No newline at end of file +[{"data":1,"prerenderedAt":1325},["ShallowReactive",2],{"navigation_docs":3,"-server-modules-task":145,"-server-modules-task-surround":1320},[4,27,41,93],{"title":5,"path":6,"stem":7,"children":8,"icon":26},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,10,14,18,22],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Framework Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F1.architecture",{"title":15,"path":16,"stem":17},"Module Reference","\u002Fgetting-started\u002Fmodule-reference","1.getting-started\u002F2.module-reference",{"title":19,"path":20,"stem":21},"Development Guide","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F3.development",{"title":23,"path":24,"stem":25},"SurrealDB Setup","\u002Fgetting-started\u002Fsurrealdb-setup","1.getting-started\u002F4.surrealdb-setup","i-lucide-rocket",{"title":28,"path":29,"stem":30,"children":31},"Forge Server Extension","\u002Fserver-extension","2.server-extension\u002F0.index",[32,33,37],{"title":28,"path":29,"stem":30},{"title":34,"path":35,"stem":36},"Forge Server API Reference","\u002Fserver-extension\u002Fapi-reference","2.server-extension\u002F1.api-reference",{"title":38,"path":39,"stem":40},"Forge Server Usage Examples","\u002Fserver-extension\u002Fusage-examples","2.server-extension\u002F2.usage-examples",{"title":42,"path":43,"stem":44,"children":45,"icon":92},"Server Modules","\u002Fserver-modules","3.server-modules\u002F0.index",[46,48,52,56,60,64,68,72,76,80,84,88],{"title":47,"path":43,"stem":44},"Server Module Guides",{"title":49,"path":50,"stem":51},"Actor Usage Guide","\u002Fserver-modules\u002Factor","3.server-modules\u002F1.actor",{"title":53,"path":54,"stem":55},"Store Usage Guide","\u002Fserver-modules\u002Fstore","3.server-modules\u002F10.store",{"title":57,"path":58,"stem":59},"Task Usage Guide","\u002Fserver-modules\u002Ftask","3.server-modules\u002F11.task",{"title":61,"path":62,"stem":63},"Bank Usage Guide","\u002Fserver-modules\u002Fbank","3.server-modules\u002F2.bank",{"title":65,"path":66,"stem":67},"CAD Usage Guide","\u002Fserver-modules\u002Fcad","3.server-modules\u002F3.cad",{"title":69,"path":70,"stem":71},"Economy Usage Guide","\u002Fserver-modules\u002Feconomy","3.server-modules\u002F4.economy",{"title":73,"path":74,"stem":75},"Garage Usage Guide","\u002Fserver-modules\u002Fgarage","3.server-modules\u002F5.garage",{"title":77,"path":78,"stem":79},"Locker Usage Guide","\u002Fserver-modules\u002Flocker","3.server-modules\u002F6.locker",{"title":81,"path":82,"stem":83},"Organization Usage Guide","\u002Fserver-modules\u002Forganization","3.server-modules\u002F7.organization",{"title":85,"path":86,"stem":87},"Owned Storage Usage Guide","\u002Fserver-modules\u002Fowned-storage","3.server-modules\u002F8.owned-storage",{"title":89,"path":90,"stem":91},"Phone Usage Guide","\u002Fserver-modules\u002Fphone","3.server-modules\u002F9.phone","i-lucide-layers-3",{"title":94,"path":95,"stem":96,"children":97,"icon":144},"Client Addons","\u002Fclient-addons","4.client-addons\u002F0.index",[98,100,104,108,112,116,120,124,128,132,136,140],{"title":99,"path":95,"stem":96},"Client Usage Guide",{"title":101,"path":102,"stem":103},"Client Main Usage Guide","\u002Fclient-addons\u002Fmain","4.client-addons\u002F1.main",{"title":105,"path":106,"stem":107},"Client Phone Usage Guide","\u002Fclient-addons\u002Fphone","4.client-addons\u002F10.phone",{"title":109,"path":110,"stem":111},"Client Store Usage Guide","\u002Fclient-addons\u002Fstore","4.client-addons\u002F11.store",{"title":113,"path":114,"stem":115},"Client Common Usage Guide","\u002Fclient-addons\u002Fcommon","4.client-addons\u002F2.common",{"title":117,"path":118,"stem":119},"Client Actor Usage Guide","\u002Fclient-addons\u002Factor","4.client-addons\u002F3.actor",{"title":121,"path":122,"stem":123},"Client Bank Usage Guide","\u002Fclient-addons\u002Fbank","4.client-addons\u002F4.bank",{"title":125,"path":126,"stem":127},"Client CAD Usage Guide","\u002Fclient-addons\u002Fcad","4.client-addons\u002F5.cad",{"title":129,"path":130,"stem":131},"Client Garage Usage Guide","\u002Fclient-addons\u002Fgarage","4.client-addons\u002F6.garage",{"title":133,"path":134,"stem":135},"Client Locker Usage Guide","\u002Fclient-addons\u002Flocker","4.client-addons\u002F7.locker",{"title":137,"path":138,"stem":139},"Client Notifications Usage Guide","\u002Fclient-addons\u002Fnotifications","4.client-addons\u002F8.notifications",{"title":141,"path":142,"stem":143},"Client Organization Usage Guide","\u002Fclient-addons\u002Forganization","4.client-addons\u002F9.organization","i-lucide-monitor-smartphone",{"id":146,"title":57,"body":147,"description":157,"extension":1315,"links":1316,"meta":1317,"navigation":609,"path":58,"seo":1318,"stem":59,"__hash__":1319},"docs\u002F3.server-modules\u002F11.task.md",{"type":148,"value":149,"toc":1297},"minimark",[150,154,158,166,169,203,208,211,238,241,312,316,567,571,635,639,671,682,686,732,737,741,769,776,780,783,820,823,846,849,853,860,863,880,883,901,905,914,927,936,940,943,946,1006,1011,1015,1023,1132,1136,1141,1175,1179,1185,1189,1196,1224,1231,1245,1249,1264,1268,1293],[151,152,57],"h1",{"id":153},"task-usage-guide",[155,156,157],"p",{},"The task module stores transient mission task metadata for active server or\nmission lifecycle workflows. SQF still owns Arma-only runtime state such as\nobjects and participants.",[155,159,160,161,165],{},"The server addon at ",[162,163,164],"code",{},"arma\u002Fserver\u002Faddons\u002Ftask"," also owns task execution:\ncreating BIS tasks, registering task entities, tracking participants, binding\ntask ownership, applying player\u002Forg rewards, and clearing task state when a\ntask completes.",[155,167,168],{},"Runtime dependencies:",[170,171,172,178,183,188,193,198],"ul",{},[173,174,175],"li",{},[162,176,177],{},"forge_server_extension",[173,179,180],{},[162,181,182],{},"forge_server_common",[173,184,185],{},[162,186,187],{},"forge_server_actor",[173,189,190],{},[162,191,192],{},"forge_server_bank",[173,194,195],{},[162,196,197],{},"forge_server_org",[173,199,200],{},[162,201,202],{},"forge_client_notifications",[204,205,207],"h2",{"id":206},"data-model","Data Model",[155,209,210],{},"Catalog entries are flexible JSON objects. The service normalizes these fields\nwhen a catalog entry is inserted or ownership changes:",[170,212,213,218,223,228,233],{},[173,214,215],{},[162,216,217],{},"taskId",[173,219,220],{},[162,221,222],{},"taskID",[173,224,225],{},[162,226,227],{},"accepted",[173,229,230],{},[162,231,232],{},"requesterUid",[173,234,235],{},[162,236,237],{},"orgID",[155,239,240],{},"Ownership context:",[242,243,248],"pre",{"className":244,"code":245,"language":246,"meta":247,"style":247},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n \"requesterUid\": \"76561198000000000\",\n \"orgId\": \"default\"\n}\n","json","",[162,249,250,259,286,306],{"__ignoreMap":247},[251,252,255],"span",{"class":253,"line":254},"line",1,[251,256,258],{"class":257},"sMK4o","{\n",[251,260,262,265,268,271,274,277,281,283],{"class":253,"line":261},2,[251,263,264],{"class":257}," \"",[251,266,232],{"class":267},"spNyl",[251,269,270],{"class":257},"\"",[251,272,273],{"class":257},":",[251,275,276],{"class":257}," \"",[251,278,280],{"class":279},"sfazB","76561198000000000",[251,282,270],{"class":257},[251,284,285],{"class":257},",\n",[251,287,289,291,294,296,298,300,303],{"class":253,"line":288},3,[251,290,264],{"class":257},[251,292,293],{"class":267},"orgId",[251,295,270],{"class":257},[251,297,273],{"class":257},[251,299,276],{"class":257},[251,301,302],{"class":279},"default",[251,304,305],{"class":257},"\"\n",[251,307,309],{"class":253,"line":308},4,[251,310,311],{"class":257},"}\n",[204,313,315],{"id":314},"commands","Commands",[317,318,319,335],"table",{},[320,321,322],"thead",{},[323,324,325,329,332],"tr",{},[326,327,328],"th",{},"Command",[326,330,331],{},"Arguments",[326,333,334],{},"Returns",[336,337,338,355,367,385,403,418,435,448,463,477,495,509,524,538,552],"tbody",{},[323,339,340,346,349],{},[341,342,343],"td",{},[162,344,345],{},"task:reset",[341,347,348],{},"none",[341,350,351,354],{},[162,352,353],{},"true",".",[323,356,357,362,364],{},[341,358,359],{},[162,360,361],{},"task:catalog:active",[341,363,348],{},[341,365,366],{},"Active catalog entry array JSON.",[323,368,369,374,379],{},[341,370,371],{},[162,372,373],{},"task:catalog:get",[341,375,376],{},[162,377,378],{},"task_id",[341,380,381,382,354],{},"Catalog entry JSON or ",[162,383,384],{},"null",[323,386,387,392,400],{},[341,388,389],{},[162,390,391],{},"task:catalog:upsert",[341,393,394,396,397],{},[162,395,378],{},", ",[162,398,399],{},"entry_json",[341,401,402],{},"Stored catalog entry JSON.",[323,404,405,410,414],{},[341,406,407],{},[162,408,409],{},"task:catalog:delete",[341,411,412],{},[162,413,378],{},[341,415,416,354],{},[162,417,353],{},[323,419,420,425,432],{},[341,421,422],{},[162,423,424],{},"task:ownership:bind",[341,426,427,396,429],{},[162,428,378],{},[162,430,431],{},"ownership_json",[341,433,434],{},"Ownership mutation result JSON.",[323,436,437,442,446],{},[341,438,439],{},[162,440,441],{},"task:ownership:release",[341,443,444],{},[162,445,378],{},[341,447,434],{},[323,449,450,455,461],{},[341,451,452],{},[162,453,454],{},"task:ownership:accept",[341,456,457,396,459],{},[162,458,378],{},[162,460,431],{},[341,462,434],{},[323,464,465,470,474],{},[341,466,467],{},[162,468,469],{},"task:ownership:reward_context",[341,471,472],{},[162,473,378],{},[341,475,476],{},"Reward context JSON.",[323,478,479,484,491],{},[341,480,481],{},[162,482,483],{},"task:status:set",[341,485,486,396,488],{},[162,487,378],{},[162,489,490],{},"status",[341,492,493,354],{},[162,494,353],{},[323,496,497,502,506],{},[341,498,499],{},[162,500,501],{},"task:status:get",[341,503,504],{},[162,505,378],{},[341,507,508],{},"Status string JSON.",[323,510,511,516,520],{},[341,512,513],{},[162,514,515],{},"task:status:clear",[341,517,518],{},[162,519,378],{},[341,521,522,354],{},[162,523,353],{},[323,525,526,531,535],{},[341,527,528],{},[162,529,530],{},"task:defuse:increment",[341,532,533],{},[162,534,378],{},[341,536,537],{},"New counter value JSON.",[323,539,540,545,549],{},[341,541,542],{},[162,543,544],{},"task:defuse:get",[341,546,547],{},[162,548,378],{},[341,550,551],{},"Counter value JSON.",[323,553,554,559,563],{},[341,555,556],{},[162,557,558],{},"task:clear",[341,560,561],{},[162,562,378],{},[341,564,565,354],{},[162,566,353],{},[204,568,570],{"id":569},"upsert-a-catalog-entry","Upsert a Catalog Entry",[242,572,576],{"className":573,"code":574,"language":575,"meta":247,"style":247},"language-sqf shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","private _entry = createHashMapFromArray [\n [\"title\", \"Destroy Cache\"],\n [\"description\", \"Destroy the enemy supply cache.\"],\n [\"reward\", 1500]\n];\n\nprivate _result = \"forge_server\" callExtension [\"task:catalog:upsert\", [\n \"task-cache-1\",\n toJSON _entry\n]];\n","sqf",[162,577,578,583,588,593,598,604,611,617,623,629],{"__ignoreMap":247},[251,579,580],{"class":253,"line":254},[251,581,582],{},"private _entry = createHashMapFromArray [\n",[251,584,585],{"class":253,"line":261},[251,586,587],{}," [\"title\", \"Destroy Cache\"],\n",[251,589,590],{"class":253,"line":288},[251,591,592],{}," [\"description\", \"Destroy the enemy supply cache.\"],\n",[251,594,595],{"class":253,"line":308},[251,596,597],{}," [\"reward\", 1500]\n",[251,599,601],{"class":253,"line":600},5,[251,602,603],{},"];\n",[251,605,607],{"class":253,"line":606},6,[251,608,610],{"emptyLinePlaceholder":609},true,"\n",[251,612,614],{"class":253,"line":613},7,[251,615,616],{},"private _result = \"forge_server\" callExtension [\"task:catalog:upsert\", [\n",[251,618,620],{"class":253,"line":619},8,[251,621,622],{}," \"task-cache-1\",\n",[251,624,626],{"class":253,"line":625},9,[251,627,628],{}," toJSON _entry\n",[251,630,632],{"class":253,"line":631},10,[251,633,634],{},"]];\n",[204,636,638],{"id":637},"mark-a-task-active","Mark a Task Active",[242,640,642],{"className":573,"code":641,"language":575,"meta":247,"style":247},"\"forge_server\" callExtension [\"task:status:set\", [\n \"task-cache-1\",\n \"active\"\n]];\n\nprivate _active = \"forge_server\" callExtension [\"task:catalog:active\", []];\n",[162,643,644,649,653,658,662,666],{"__ignoreMap":247},[251,645,646],{"class":253,"line":254},[251,647,648],{},"\"forge_server\" callExtension [\"task:status:set\", [\n",[251,650,651],{"class":253,"line":261},[251,652,622],{},[251,654,655],{"class":253,"line":288},[251,656,657],{}," \"active\"\n",[251,659,660],{"class":253,"line":308},[251,661,634],{},[251,663,664],{"class":253,"line":600},[251,665,610],{"emptyLinePlaceholder":609},[251,667,668],{"class":253,"line":606},[251,669,670],{},"private _active = \"forge_server\" callExtension [\"task:catalog:active\", []];\n",[155,672,673,674,677,678,681],{},"Completed statuses ",[162,675,676],{},"succeeded"," and ",[162,679,680],{},"failed"," are also stored as completed status\nfallbacks. Clearing status removes active and completed state.",[204,683,685],{"id":684},"accept-a-task","Accept a Task",[242,687,689],{"className":573,"code":688,"language":575,"meta":247,"style":247},"private _ownership = createHashMapFromArray [\n [\"requesterUid\", getPlayerUID player],\n [\"orgId\", \"default\"]\n];\n\nprivate _result = \"forge_server\" callExtension [\"task:ownership:accept\", [\n \"task-cache-1\",\n toJSON _ownership\n]];\n",[162,690,691,696,701,706,710,714,719,723,728],{"__ignoreMap":247},[251,692,693],{"class":253,"line":254},[251,694,695],{},"private _ownership = createHashMapFromArray [\n",[251,697,698],{"class":253,"line":261},[251,699,700],{}," [\"requesterUid\", getPlayerUID player],\n",[251,702,703],{"class":253,"line":288},[251,704,705],{}," [\"orgId\", \"default\"]\n",[251,707,708],{"class":253,"line":308},[251,709,603],{},[251,711,712],{"class":253,"line":600},[251,713,610],{"emptyLinePlaceholder":609},[251,715,716],{"class":253,"line":606},[251,717,718],{},"private _result = \"forge_server\" callExtension [\"task:ownership:accept\", [\n",[251,720,721],{"class":253,"line":613},[251,722,622],{},[251,724,725],{"class":253,"line":619},[251,726,727],{}," toJSON _ownership\n",[251,729,730],{"class":253,"line":625},[251,731,634],{},[155,733,734,736],{},[162,735,454],{}," fails if the task is not active or another requester\nalready accepted it.",[204,738,740],{"id":739},"rewards","Rewards",[242,742,744],{"className":573,"code":743,"language":575,"meta":247,"style":247},"private _result = \"forge_server\" callExtension [\"task:ownership:reward_context\", [\n \"task-cache-1\"\n]];\n\nprivate _context = fromJSON (_result select 0);\n",[162,745,746,751,756,760,764],{"__ignoreMap":247},[251,747,748],{"class":253,"line":254},[251,749,750],{},"private _result = \"forge_server\" callExtension [\"task:ownership:reward_context\", [\n",[251,752,753],{"class":253,"line":261},[251,754,755],{}," \"task-cache-1\"\n",[251,757,758],{"class":253,"line":288},[251,759,634],{},[251,761,762],{"class":253,"line":308},[251,763,610],{"emptyLinePlaceholder":609},[251,765,766],{"class":253,"line":600},[251,767,768],{},"private _context = fromJSON (_result select 0);\n",[155,770,771,772,677,774,354],{},"The reward context contains ",[162,773,232],{},[162,775,293],{},[204,777,779],{"id":778},"server-task-flows","Server Task Flows",[155,781,782],{},"The task addon provides these server-owned task flows:",[170,784,785,790,795,800,805,810,815],{},[173,786,787],{},[162,788,789],{},"attack",[173,791,792],{},[162,793,794],{},"defend",[173,796,797],{},[162,798,799],{},"defuse",[173,801,802],{},[162,803,804],{},"delivery",[173,806,807],{},[162,808,809],{},"destroy",[173,811,812],{},[162,813,814],{},"hostage",[173,816,817],{},[162,818,819],{},"hvt",[155,821,822],{},"Mission designers can create tasks in four ways:",[170,824,825,828,834,840],{},[173,826,827],{},"Eden modules for editor-authored tasks.",[173,829,830,833],{},[162,831,832],{},"forge_server_task_fnc_startTask"," for script-authored tasks.",[173,835,836,839],{},[162,837,838],{},"forge_server_task_fnc_handler"," for pre-registered entities with reputation\ngating and ownership binding. This path expects the BIS task and catalog\nentry to already exist if map-task and CAD visibility are required.",[173,841,842,843,845],{},"Direct task function calls for server-owned or mission-authored flows that\nintentionally fall back to the ",[162,844,302],{}," org. This path expects the BIS task\nto already exist if map-task visibility is required.",[155,847,848],{},"The dynamic mission manager can also generate attack tasks from config. That is\nsystem-generated content rather than a hand-authored task creation path.",[204,850,852],{"id":851},"cad-compatibility","CAD Compatibility",[155,854,855,856,859],{},"CAD hydrates assignable tasks from ",[162,857,858],{},"TaskStore.getActiveTaskCatalog",". A task must\nhave a catalog entry and active task status before CAD can show and assign it.",[155,861,862],{},"CAD-compatible creation paths:",[170,864,865,870,875],{},[173,866,867,868,354],{},"Eden modules: compatible because they delegate to\n",[162,869,832],{},[173,871,872,874],{},[162,873,832],{},": compatible because it registers the\ncatalog entry, creates the BIS task, and dispatches through the handler.",[173,876,877,878,354],{},"Dynamic mission manager attack tasks: compatible because the mission manager\nuses ",[162,879,832],{},[155,881,882],{},"Limited or incompatible paths:",[170,884,885,890],{},[173,886,887,889],{},[162,888,838],{},": only compatible if a catalog entry was\nalready registered elsewhere. The handler sets active status and ownership,\nbut it does not create the BIS task shown in the map task tab or upsert the\ncatalog entry.",[173,891,892,893,896,897,900],{},"Direct task function calls: not CAD-compatible by default. They bypass\n",[162,894,895],{},"startTask"," and usually do not register the task catalog entry or active\nstatus that CAD hydrates from. They also only call ",[162,898,899],{},"BIS_fnc_taskSetState"," at\ncompletion\u002Ffailure; they do not create the BIS task first.",[204,902,904],{"id":903},"bis-map-task-prerequisite","BIS Map Task Prerequisite",[155,906,907,908,910,911,354],{},"Only the Eden task modules and ",[162,909,832],{}," create the BIS\ntask automatically through ",[162,912,913],{},"BIS_fnc_taskCreate",[155,915,916,917,919,920,923,924,926],{},"If a mission uses ",[162,918,838],{}," directly or calls a task flow\nfunction such as ",[162,921,922],{},"forge_server_task_fnc_attack",", the mission must create a BIS\ntask with the same task ID before the Forge task completes. Otherwise the\nsuccess\u002Ffailure ",[162,925,899],{}," call has no visible map task to update.",[155,928,929,930,932,933,935],{},"That prerequisite can be satisfied with a vanilla Eden task creation module or\na scripted ",[162,931,913],{}," call. ",[162,934,832],{}," is the\npreferred Forge path because it handles BIS task creation, Forge catalog\nregistration, entity registration, and handler dispatch together.",[204,937,939],{"id":938},"eden-modules","Eden Modules",[155,941,942],{},"Eden task modules are the normal designer-facing path. Place the module,\nconfigure its attributes, and sync it to the relevant entities or grouping\nmodules.",[155,944,945],{},"Available task modules:",[170,947,948,954,960,973,982,994,1000],{},[173,949,950,953],{},[162,951,952],{},"FORGE_Module_Attack",": sync directly to target units or vehicles.",[173,955,956,959],{},[162,957,958],{},"FORGE_Module_Destroy",": sync directly to objects, vehicles, or units.",[173,961,962,965,966,969,970,354],{},[162,963,964],{},"FORGE_Module_Defuse",": sync to ",[162,967,968],{},"FORGE_Module_Explosives"," and optionally\n",[162,971,972],{},"FORGE_Module_Protected",[173,974,975,965,978,981],{},[162,976,977],{},"FORGE_Module_Delivery",[162,979,980],{},"FORGE_Module_Cargo","; the cargo module syncs\nto cargo objects.",[173,983,984,965,987,990,991,354],{},[162,985,986],{},"FORGE_Module_Hostage",[162,988,989],{},"FORGE_Module_Hostages"," and\n",[162,992,993],{},"FORGE_Module_Shooters",[173,995,996,999],{},[162,997,998],{},"FORGE_Module_HVT",": sync directly to HVT units.",[173,1001,1002,1005],{},[162,1003,1004],{},"FORGE_Module_Defend",": configure the defense marker and wave settings.",[155,1007,1008,1009,354],{},"These modules delegate to ",[162,1010,832],{},[204,1012,1014],{"id":1013},"scripted-start-task","Scripted Start Task",[155,1016,1017,1018,1020,1021,354],{},"Use ",[162,1019,832],{}," when creating tasks from modules,\nmission scripts, or generated mission-manager content. It registers task\nentities, creates the BIS task, stores the catalog entry, then dispatches\nthrough ",[162,1022,838],{},[242,1024,1026],{"className":573,"code":1025,"language":575,"meta":247,"style":247},"[\n \"attack\",\n \"compound_attack_01\",\n getPosATL leader1,\n \"Attack: East Compound\",\n \"Eliminate all hostile forces.\",\n createHashMapFromArray [[\"targets\", [unit1, unit2, unit3]]],\n createHashMapFromArray [\n [\"limitFail\", 0],\n [\"limitSuccess\", 3],\n [\"funds\", 50000],\n [\"ratingFail\", -10],\n [\"ratingSuccess\", 20],\n [\"timeLimit\", 900]\n ],\n 0,\n getPlayerUID player,\n \"script\"\n] call forge_server_task_fnc_startTask;\n",[162,1027,1028,1033,1038,1043,1048,1053,1058,1063,1068,1073,1078,1084,1090,1096,1102,1108,1114,1120,1126],{"__ignoreMap":247},[251,1029,1030],{"class":253,"line":254},[251,1031,1032],{},"[\n",[251,1034,1035],{"class":253,"line":261},[251,1036,1037],{}," \"attack\",\n",[251,1039,1040],{"class":253,"line":288},[251,1041,1042],{}," \"compound_attack_01\",\n",[251,1044,1045],{"class":253,"line":308},[251,1046,1047],{}," getPosATL leader1,\n",[251,1049,1050],{"class":253,"line":600},[251,1051,1052],{}," \"Attack: East Compound\",\n",[251,1054,1055],{"class":253,"line":606},[251,1056,1057],{}," \"Eliminate all hostile forces.\",\n",[251,1059,1060],{"class":253,"line":613},[251,1061,1062],{}," createHashMapFromArray [[\"targets\", [unit1, unit2, unit3]]],\n",[251,1064,1065],{"class":253,"line":619},[251,1066,1067],{}," createHashMapFromArray [\n",[251,1069,1070],{"class":253,"line":625},[251,1071,1072],{}," [\"limitFail\", 0],\n",[251,1074,1075],{"class":253,"line":631},[251,1076,1077],{}," [\"limitSuccess\", 3],\n",[251,1079,1081],{"class":253,"line":1080},11,[251,1082,1083],{}," [\"funds\", 50000],\n",[251,1085,1087],{"class":253,"line":1086},12,[251,1088,1089],{}," [\"ratingFail\", -10],\n",[251,1091,1093],{"class":253,"line":1092},13,[251,1094,1095],{}," [\"ratingSuccess\", 20],\n",[251,1097,1099],{"class":253,"line":1098},14,[251,1100,1101],{}," [\"timeLimit\", 900]\n",[251,1103,1105],{"class":253,"line":1104},15,[251,1106,1107],{}," ],\n",[251,1109,1111],{"class":253,"line":1110},16,[251,1112,1113],{}," 0,\n",[251,1115,1117],{"class":253,"line":1116},17,[251,1118,1119],{}," getPlayerUID player,\n",[251,1121,1123],{"class":253,"line":1122},18,[251,1124,1125],{}," \"script\"\n",[251,1127,1129],{"class":253,"line":1128},19,[251,1130,1131],{},"] call forge_server_task_fnc_startTask;\n",[204,1133,1135],{"id":1134},"handler-calls","Handler Calls",[155,1137,1017,1138,1140],{},[162,1139,838],{}," directly when the task entities are already\nregistered and you want reputation gating plus ownership binding. Create the\nBIS task and catalog entry separately if this task should appear in the map\ntask tab or CAD:",[242,1142,1144],{"className":573,"code":1143,"language":575,"meta":247,"style":247},"[\n \"delivery\",\n [\"delivery_1\", 1, 3, \"delivery_zone\", 250000, -75, 300, false, false, 900],\n 250,\n getPlayerUID player\n] call forge_server_task_fnc_handler;\n",[162,1145,1146,1150,1155,1160,1165,1170],{"__ignoreMap":247},[251,1147,1148],{"class":253,"line":254},[251,1149,1032],{},[251,1151,1152],{"class":253,"line":261},[251,1153,1154],{}," \"delivery\",\n",[251,1156,1157],{"class":253,"line":288},[251,1158,1159],{}," [\"delivery_1\", 1, 3, \"delivery_zone\", 250000, -75, 300, false, false, 900],\n",[251,1161,1162],{"class":253,"line":308},[251,1163,1164],{}," 250,\n",[251,1166,1167],{"class":253,"line":600},[251,1168,1169],{}," getPlayerUID player\n",[251,1171,1172],{"class":253,"line":606},[251,1173,1174],{},"] call forge_server_task_fnc_handler;\n",[204,1176,1178],{"id":1177},"direct-task-calls","Direct Task Calls",[155,1180,1181,1182,1184],{},"Direct task function calls still work for mission-authored or server-owned\ntasks, but they do not provide a requester UID. Ownership falls back to the\n",[162,1183,302],{}," org. Create the BIS task separately if this task should appear in the\nmap task tab.",[204,1186,1188],{"id":1187},"timer-semantics","Timer Semantics",[155,1190,1191,1192,1195],{},"Task time limits use ",[162,1193,1194],{},"0"," for no limit:",[170,1197,1198,1204,1209,1214,1219],{},[173,1199,1200,1201],{},"attack ",[162,1202,1203],{},"timeLimit",[173,1205,1206,1207],{},"destroy ",[162,1208,1203],{},[173,1210,1211,1212],{},"delivery ",[162,1213,1203],{},[173,1215,1216,1217],{},"hostage ",[162,1218,1203],{},[173,1220,1221,1222],{},"HVT ",[162,1223,1203],{},[155,1225,1226,1227,1230],{},"Positive values are measured in seconds. Do not pass ",[162,1228,1229],{},"-1"," as a no-limit value;\nthe task runtime treats any non-zero task time limit as active.",[155,1232,1233,1234,1237,1238,1240,1241,1244],{},"Defuse IED timers are different. ",[162,1235,1236],{},"iedTimer"," must be greater than ",[162,1239,1194],{},", because\nIEDs are expected to have an active countdown. The Eden defuse module defaults\nto ",[162,1242,1243],{},"300"," seconds.",[204,1246,1248],{"id":1247},"defuse-counter","Defuse Counter",[242,1250,1252],{"className":573,"code":1251,"language":575,"meta":247,"style":247},"\"forge_server\" callExtension [\"task:defuse:increment\", [\"task-cache-1\"]];\nprivate _count = \"forge_server\" callExtension [\"task:defuse:get\", [\"task-cache-1\"]];\n",[162,1253,1254,1259],{"__ignoreMap":247},[251,1255,1256],{"class":253,"line":254},[251,1257,1258],{},"\"forge_server\" callExtension [\"task:defuse:increment\", [\"task-cache-1\"]];\n",[251,1260,1261],{"class":253,"line":261},[251,1262,1263],{},"private _count = \"forge_server\" callExtension [\"task:defuse:get\", [\"task-cache-1\"]];\n",[204,1265,1267],{"id":1266},"error-handling","Error Handling",[242,1269,1271],{"className":573,"code":1270,"language":575,"meta":247,"style":247},"private _payload = _result select 0;\nif (_payload find \"Error:\" == 0) exitWith {\n systemChat format [\"Task error: %1\", _payload];\n};\n",[162,1272,1273,1278,1283,1288],{"__ignoreMap":247},[251,1274,1275],{"class":253,"line":254},[251,1276,1277],{},"private _payload = _result select 0;\n",[251,1279,1280],{"class":253,"line":261},[251,1281,1282],{},"if (_payload find \"Error:\" == 0) exitWith {\n",[251,1284,1285],{"class":253,"line":288},[251,1286,1287],{}," systemChat format [\"Task error: %1\", _payload];\n",[251,1289,1290],{"class":253,"line":308},[251,1291,1292],{},"};\n",[1294,1295,1296],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":247,"searchDepth":261,"depth":261,"links":1298},[1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314],{"id":206,"depth":261,"text":207},{"id":314,"depth":261,"text":315},{"id":569,"depth":261,"text":570},{"id":637,"depth":261,"text":638},{"id":684,"depth":261,"text":685},{"id":739,"depth":261,"text":740},{"id":778,"depth":261,"text":779},{"id":851,"depth":261,"text":852},{"id":903,"depth":261,"text":904},{"id":938,"depth":261,"text":939},{"id":1013,"depth":261,"text":1014},{"id":1134,"depth":261,"text":1135},{"id":1177,"depth":261,"text":1178},{"id":1187,"depth":261,"text":1188},{"id":1247,"depth":261,"text":1248},{"id":1266,"depth":261,"text":1267},"md",null,{},{"title":57,"description":157},"KdbrlSiS5YQ3OEJob3r0ceVGYCznKZq-sUb7FfWDctU",[1321,1323],{"title":53,"path":54,"stem":55,"description":1322,"children":-1},"The store module processes checkout requests. It charges a payment source and\ngrants purchased items to the player locker, virtual arsenal locker, and\nvirtual garage unlocks.",{"title":61,"path":62,"stem":63,"description":1324,"children":-1},"The bank module stores player account balances, earnings, PINs, and transaction\nstrings. The hot-state API also owns the active banking workflows used by the\nUI: deposit, withdraw, transfer, checkout charge, and PIN validation.",1776806627742] \ No newline at end of file diff --git a/tools/sync-docus-docs.mjs b/tools/sync-docus-docs.mjs index 74192b6..df4a455 100644 --- a/tools/sync-docus-docs.mjs +++ b/tools/sync-docus-docs.mjs @@ -20,7 +20,7 @@ const generatedPages = [ target: '1.getting-started/3.development.md' }, { - source: 'docs/SURREALDB_SETUP.md', + source: 'docs/surrealdb-setup.md', target: '1.getting-started/4.surrealdb-setup.md' }, {