forge/docus/dist/client-addons/_payload.json
2026-05-23 09:23:12 -05:00

1 line
16 KiB
JSON

[{"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]