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