[{"data":1,"prerenderedAt":753},["ShallowReactive",2],{"/docs/base/jobs-base/client-exports/radial-menu":3,"/docs/base/jobs-base/client-exports/radial-menu-surround":741,"/docs/base/jobs-base/client-exports/radial-menu-implemented-suggestions":752},{"id":4,"title":5,"body":6,"description":732,"extension":733,"head":734,"implementedSuggestions":734,"meta":735,"navigation":303,"path":736,"schemaOrg":734,"seo":737,"sitemap":738,"stem":739,"__hash__":740},"docs/1.docs/base/2.jobs-base/3.client-exports/5.radial-menu.md","Radial Menu",{"type":7,"value":8,"toc":721},"minimark",[9,17,21,29,36,47,85,91,141,160,178,184,235,241,269,356,362,396,435,441,472,520,526,584,660,664,674,714,717],[10,11,12],"p",{},[13,14,16],"a",{"href":15},"/docs/base/jobs-base/client-exports","All client exports",[18,19,5],"h2",{"id":20},"radial-menu",[10,22,23,24,28],{},"When ",[25,26,27],"code",{},"Config.JobRadial.targetContext.enabled"," is enabled, the player target tracker and its marker remain active for the entire time the radial menu is open. This is independent of whether the currently visible actions require a player target.",[30,31,33],"h3",{"id":32},"openradialmenu",[25,34,35],{},"openRadialMenu()",[37,38,39],"ul",{},[40,41,42,46],"li",{},[43,44,45],"strong",{},"Purpose",": Opens the job radial menu as if the player pressed the configured hotkey.",[48,49,54],"pre",{"className":50,"code":51,"language":52,"meta":53,"style":53},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","exports[\"sky_jobs_base\"]:openRadialMenu()\n","lua","",[25,55,56],{"__ignoreMap":53},[57,58,61,65,69,73,75,78,82],"span",{"class":59,"line":60},"line",1,[57,62,64],{"class":63},"sTEyZ","exports[",[57,66,68],{"class":67},"sMK4o","\"",[57,70,72],{"class":71},"sfazB","sky_jobs_base",[57,74,68],{"class":67},[57,76,77],{"class":63},"]:",[57,79,81],{"class":80},"s2Zo4","openRadialMenu",[57,83,84],{"class":63},"()\n",[30,86,88],{"id":87},"registerradialprovideroptions",[25,89,90],{},"registerRadialProvider(options)",[37,92,93,98,132],{},[40,94,95,97],{},[43,96,45],{},": Registers the calling client resource as a dynamic radial action provider.",[40,99,100,103,104],{},[43,101,102],{},"Arguments",":\n",[37,105,106,116],{},[40,107,108,111,112,115],{},[25,109,110],{},"options.jobKeys"," (",[25,113,114],{},"string | string[]?",") - limits the provider to exact job keys.",[40,117,118,111,121,123,124,127,128,131],{},[25,119,120],{},"options.jobGroups",[25,122,114],{},") - limits the provider to job groups such as ",[25,125,126],{},"police"," or ",[25,129,130],{},"crime",".",[40,133,134,137,138,131],{},[43,135,136],{},"Returns",": ",[25,139,140],{},"boolean",[10,142,143,144,147,148,151,152,155,156,159],{},"The provider resource must expose ",[25,145,146],{},"getRadialActions",", ",[25,149,150],{},"triggerRadialMenuAction",", and optionally ",[25,153,154],{},"canInteractRadialMenuAction",". Prefer this self-registration flow over adding the resource to ",[25,157,158],{},"Config.JobRadial.providers","; the config list is intended for providers that cannot register themselves. A live self-registration and its job filters take precedence over a legacy config entry for the same resource.",[10,161,162,163,166,167,147,170,173,174,177],{},"An action may use ",[25,164,165],{},"menu = { id, icon?, label?, description? }"," to join a submenu. Actions with the same menu ID are grouped together, while a submenu containing only one currently available action is flattened automatically. Actions may also use ",[25,168,169],{},"oxTarget = { types, bones?, distance?, boneRadius?, netId? }",[25,171,172],{},"radialTarget = true",", and ",[25,175,176],{},"targetValidate = true"," to receive and validate the live entity context.",[10,179,180,181,131],{},"When an action already displayed its own feedback or intentionally cancelled without a notification, its handler can return ",[25,182,183],{},"false, { silent = true }",[48,185,187],{"className":50,"code":186,"language":52,"meta":53,"style":53},"exports[\"sky_jobs_base\"]:registerRadialProvider({\n    jobGroups = { \"crime\" }\n})\n",[25,188,189,207,229],{"__ignoreMap":53},[57,190,191,193,195,197,199,201,204],{"class":59,"line":60},[57,192,64],{"class":63},[57,194,68],{"class":67},[57,196,72],{"class":71},[57,198,68],{"class":67},[57,200,77],{"class":63},[57,202,203],{"class":80},"registerRadialProvider",[57,205,206],{"class":63},"({\n",[57,208,210,213,216,219,221,223,226],{"class":59,"line":209},2,[57,211,212],{"class":63},"    jobGroups ",[57,214,215],{"class":67},"=",[57,217,218],{"class":63}," { ",[57,220,68],{"class":67},[57,222,130],{"class":71},[57,224,225],{"class":67},"\" ",[57,227,228],{"class":63},"}\n",[57,230,232],{"class":59,"line":231},3,[57,233,234],{"class":63},"})\n",[30,236,238],{"id":237},"getradialactions",[25,239,240],{},"getRadialActions()",[37,242,243,248],{},[40,244,245,247],{},[43,246,45],{},": Returns all available radial menu actions with their metadata.",[40,249,250,137,252,255,256,147,259,147,262,147,265,268],{},[43,251,136],{},[25,253,254],{},"RadialAction[]"," — array of action objects with ",[25,257,258],{},"id",[25,260,261],{},"label",[25,263,264],{},"icon",[25,266,267],{},"disabled",", and more.",[48,270,272],{"className":50,"code":271,"language":52,"meta":53,"style":53},"local actions = exports[\"sky_jobs_base\"]:getRadialActions()\n\nfor _, action in ipairs(actions) do\n    print(action.id, action.label, action.disabled)\nend\n",[25,273,274,299,305,326,350],{"__ignoreMap":53},[57,275,276,279,282,284,287,289,291,293,295,297],{"class":59,"line":60},[57,277,278],{"class":67},"local",[57,280,281],{"class":63}," actions ",[57,283,215],{"class":67},[57,285,286],{"class":63}," exports[",[57,288,68],{"class":67},[57,290,72],{"class":71},[57,292,68],{"class":67},[57,294,77],{"class":63},[57,296,146],{"class":80},[57,298,84],{"class":63},[57,300,301],{"class":59,"line":209},[57,302,304],{"emptyLinePlaceholder":303},true,"\n",[57,306,307,311,314,317,320,323],{"class":59,"line":231},[57,308,310],{"class":309},"s7zQu","for",[57,312,313],{"class":63}," _, action ",[57,315,316],{"class":309},"in",[57,318,319],{"class":80}," ipairs",[57,321,322],{"class":63},"(actions) ",[57,324,325],{"class":309},"do\n",[57,327,329,332,335,338,341,343,345,347],{"class":59,"line":328},4,[57,330,331],{"class":80},"    print",[57,333,334],{"class":63},"(action.",[57,336,258],{"class":337},"sBMFI",[57,339,340],{"class":63},", action.",[57,342,261],{"class":337},[57,344,340],{"class":63},[57,346,267],{"class":337},[57,348,349],{"class":63},")\n",[57,351,353],{"class":59,"line":352},5,[57,354,355],{"class":309},"end\n",[30,357,359],{"id":358},"getradialactionactionid",[25,360,361],{},"getRadialAction(actionId)",[37,363,364,369,384],{},[40,365,366,368],{},[43,367,45],{},": Fetches a single radial action by its ID.",[40,370,371,103,373],{},[43,372,102],{},[37,374,375],{},[40,376,377,111,380,383],{},[25,378,379],{},"actionId",[25,381,382],{},"string",") — the action identifier.",[40,385,386,137,388,391,392,395],{},[43,387,136],{},[25,389,390],{},"table | nil"," — the action object, or ",[25,393,394],{},"nil"," if not found.",[48,397,399],{"className":50,"code":398,"language":52,"meta":53,"style":53},"local action = exports[\"sky_jobs_base\"]:getRadialAction(\"stretcher_carry\")\n",[25,400,401],{"__ignoreMap":53},[57,402,403,405,408,410,412,414,416,418,420,423,426,428,431,433],{"class":59,"line":60},[57,404,278],{"class":67},[57,406,407],{"class":63}," action ",[57,409,215],{"class":67},[57,411,286],{"class":63},[57,413,68],{"class":67},[57,415,72],{"class":71},[57,417,68],{"class":67},[57,419,77],{"class":63},[57,421,422],{"class":80},"getRadialAction",[57,424,425],{"class":63},"(",[57,427,68],{"class":67},[57,429,430],{"class":71},"stretcher_carry",[57,432,68],{"class":67},[57,434,349],{"class":63},[30,436,438],{"id":437},"isradialmenuactionavailableactionid",[25,439,440],{},"isRadialMenuActionAvailable(actionId)",[37,442,443,448,461],{},[40,444,445,447],{},[43,446,45],{},": Checks if a radial action exists and is currently enabled.",[40,449,450,103,452],{},[43,451,102],{},[37,453,454],{},[40,455,456,111,458,460],{},[25,457,379],{},[25,459,382],{},")",[40,462,463,137,465,467,468,471],{},[43,464,136],{},[25,466,140],{}," — ",[25,469,470],{},"true"," when the action exists and is not disabled.",[48,473,475],{"className":50,"code":474,"language":52,"meta":53,"style":53},"if exports[\"sky_jobs_base\"]:isRadialMenuActionAvailable(\"treat_patient\") then\n    -- Action is available\nend\n",[25,476,477,510,516],{"__ignoreMap":53},[57,478,479,482,484,486,488,490,492,495,497,499,502,504,507],{"class":59,"line":60},[57,480,481],{"class":309},"if",[57,483,286],{"class":63},[57,485,68],{"class":67},[57,487,72],{"class":71},[57,489,68],{"class":67},[57,491,77],{"class":63},[57,493,494],{"class":80},"isRadialMenuActionAvailable",[57,496,425],{"class":63},[57,498,68],{"class":67},[57,500,501],{"class":71},"treat_patient",[57,503,68],{"class":67},[57,505,506],{"class":63},") ",[57,508,509],{"class":309},"then\n",[57,511,512],{"class":59,"line":209},[57,513,515],{"class":514},"sHwdD","    -- Action is available\n",[57,517,518],{"class":59,"line":231},[57,519,355],{"class":309},[30,521,523],{"id":522},"triggerradialmenuactionactionid-context",[25,524,525],{},"triggerRadialMenuAction(actionId, context?)",[37,527,528,533,554],{},[40,529,530,532],{},[43,531,45],{},": Executes a radial action handler without opening the UI.",[40,534,535,103,537],{},[43,536,102],{},[37,538,539,545],{},[40,540,541,111,543,460],{},[25,542,379],{},[25,544,382],{},[40,546,547,111,550,553],{},[25,548,549],{},"context",[25,551,552],{},"table?",") - optional selected entity, network ID, distance, and target information forwarded to the action provider.",[40,555,556,103,558],{},[43,557,136],{},[37,559,560,571],{},[40,561,562,467,564,566,567,570],{},[25,563,140],{},[25,565,470],{}," on success, ",[25,568,569],{},"false"," on failure.",[40,572,573,575,576,579,580,583],{},[25,574,552],{}," — on failure, a table with ",[25,577,578],{},"key"," (locale key) and ",[25,581,582],{},"fallback"," (error message).",[48,585,587],{"className":50,"code":586,"language":52,"meta":53,"style":53},"local success, err = exports[\"sky_jobs_base\"]:triggerRadialMenuAction(\"treat_patient\")\n\nif not success then\n    print(\"Failed:\", err.fallback)\nend\n",[25,588,589,620,624,636,656],{"__ignoreMap":53},[57,590,591,593,596,598,600,602,604,606,608,610,612,614,616,618],{"class":59,"line":60},[57,592,278],{"class":67},[57,594,595],{"class":63}," success, err ",[57,597,215],{"class":67},[57,599,286],{"class":63},[57,601,68],{"class":67},[57,603,72],{"class":71},[57,605,68],{"class":67},[57,607,77],{"class":63},[57,609,150],{"class":80},[57,611,425],{"class":63},[57,613,68],{"class":67},[57,615,501],{"class":71},[57,617,68],{"class":67},[57,619,349],{"class":63},[57,621,622],{"class":59,"line":209},[57,623,304],{"emptyLinePlaceholder":303},[57,625,626,628,631,634],{"class":59,"line":231},[57,627,481],{"class":309},[57,629,630],{"class":67}," not",[57,632,633],{"class":63}," success ",[57,635,509],{"class":309},[57,637,638,640,642,644,647,649,652,654],{"class":59,"line":328},[57,639,331],{"class":80},[57,641,425],{"class":63},[57,643,68],{"class":67},[57,645,646],{"class":71},"Failed:",[57,648,68],{"class":67},[57,650,651],{"class":63},", err.",[57,653,582],{"class":337},[57,655,349],{"class":63},[57,657,658],{"class":59,"line":352},[57,659,355],{"class":309},[30,661,663],{"id":662},"built-in-actions","Built-in Actions",[10,665,666,667,669,670,673],{},"These actions are registered by ",[25,668,72],{}," itself. Job scripts (like ",[25,671,672],{},"sky_ambulancejob",") add their own actions on top.",[675,676,677,690],"table",{},[678,679,680],"thead",{},[681,682,683,687],"tr",{},[684,685,686],"th",{},"Action ID",[684,688,689],{},"Description",[691,692,693,704],"tbody",{},[681,694,695,701],{},[696,697,698],"td",{},[25,699,700],{},"tablet",[696,702,703],{},"Opens the tablet interface.",[681,705,706,711],{},[696,707,708],{},[25,709,710],{},"remove_trunk_prop",[696,712,713],{},"Removes a nearby placed trunk prop.",[715,716],"br",{},[718,719,720],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--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 .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}",{"title":53,"searchDepth":60,"depth":209,"links":722},[723],{"id":20,"depth":209,"text":5,"children":724},[725,726,727,728,729,730,731],{"id":32,"depth":231,"text":35},{"id":87,"depth":231,"text":90},{"id":237,"depth":231,"text":240},{"id":358,"depth":231,"text":361},{"id":437,"depth":231,"text":440},{"id":522,"depth":231,"text":525},{"id":662,"depth":231,"text":663},"Reference for Radial Menu in sky_jobs_base.","md",null,{},"/docs/base/jobs-base/client-exports/radial-menu",{"title":5,"description":732},{"loc":736},"1.docs/base/2.jobs-base/3.client-exports/5.radial-menu","qfNy8CkDNPKcxwRmFJmzgLC6hqON8UVSP0_tOfMrH_Q",[742,747],{"title":743,"path":744,"stem":745,"description":746,"children":-1},"Player Interactions","/docs/base/jobs-base/client-exports/player-interactions","1.docs/base/2.jobs-base/3.client-exports/4.player-interactions","Reference for Player Interactions in sky_jobs_base.",{"title":748,"path":749,"stem":750,"description":751,"children":-1},"Storage","/docs/base/jobs-base/client-exports/storage","1.docs/base/2.jobs-base/3.client-exports/6.storage","Reference for Storage in sky_jobs_base.",[],1791814188443]