[{"data":1,"prerenderedAt":764},["ShallowReactive",2],{"/docs/scripts/pets/reference/exports":3,"/docs/scripts/pets/reference/exports-surround":752,"/docs/scripts/pets/reference/exports-implemented-suggestions":763},{"id":4,"title":5,"body":6,"description":742,"extension":743,"head":744,"implementedSuggestions":744,"meta":745,"navigation":746,"path":747,"schemaOrg":744,"seo":748,"sitemap":749,"stem":750,"__hash__":751},"docs/1.docs/scripts/5.pets/4.reference/3.exports.md","Exports",{"type":7,"value":8,"toc":727},"minimark",[9,31,36,43,66,114,120,137,168,174,185,275,285,316,382,386,392,414,483,489,503,574,580,590,636,642,654,720,723],[10,11,12,13,17,18,21,22,26,27,30],"p",{},"Call client exports from a ",[14,15,16],"strong",{},"client script"," and server exports from a ",[14,19,20],{},"server script",". Keep the resource folder named ",[23,24,25],"code",{},"sky_pets",". These are the exports registered by the core resource; its ",[23,28,29],{},"Sky.Cb"," requests and NUI callbacks are internal protocols.",[32,33,35],"h2",{"id":34},"client-exports","Client exports",[37,38,40],"h3",{"id":39},"openshopshopid",[23,41,42],{},"OpenShop(shopId)",[10,44,45,46,49,50,53,54,57,58,61,62,65],{},"Opens the configured pet shop directly, without the NPC's pets/supplies choice screen. ",[23,47,48],{},"shopId"," is a string key in ",[23,51,52],{},"Config.Shops",", such as ",[23,55,56],{},"\"pet_shop\"",". The function starts the client flow and has ",[14,59,60],{},"no success return value",". The server still checks proximity and the catalogue request.\nThe default shop point is at the cashier inside the bundled MLO: ",[23,63,64],{},"vector3(-169.0462, 226.0295, 92.27)",". This export does not move the player there.",[67,68,74],"pre",{"className":69,"code":70,"filename":71,"language":72,"meta":73,"style":73},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","exports[\"sky_pets\"]:OpenShop(\"pet_shop\")\n","client.lua","lua","",[23,75,76],{"__ignoreMap":73},[77,78,81,85,89,92,94,97,101,104,106,109,111],"span",{"class":79,"line":80},"line",1,[77,82,84],{"class":83},"sTEyZ","exports[",[77,86,88],{"class":87},"sMK4o","\"",[77,90,25],{"class":91},"sfazB",[77,93,88],{"class":87},[77,95,96],{"class":83},"]:",[77,98,100],{"class":99},"s2Zo4","OpenShop",[77,102,103],{"class":83},"(",[77,105,88],{"class":87},[77,107,108],{"class":91},"pet_shop",[77,110,88],{"class":87},[77,112,113],{"class":83},")\n",[37,115,117],{"id":116},"opensuppliesshopshopid",[23,118,119],{},"OpenSuppliesShop(shopId)",[10,121,122,123,125,126,53,129,132,133,136],{},"Opens a configured supplies shop directly. ",[23,124,48],{}," must be a string key in ",[23,127,128],{},"Config.SuppliesShops",[23,130,131],{},"\"pet_supplies\"","; passing the pet-shop ID does not choose its linked supplies shop for you. It shares the shop-opening function and has no success return value.\nBy default, the supplies shop uses the same cashier point inside the MLO. Saved ",[23,134,135],{},"/petsconfig"," locations can change it independently.",[67,138,140],{"className":69,"code":139,"filename":71,"language":72,"meta":73,"style":73},"exports[\"sky_pets\"]:OpenSuppliesShop(\"pet_supplies\")\n",[23,141,142],{"__ignoreMap":73},[77,143,144,146,148,150,152,154,157,159,161,164,166],{"class":79,"line":80},[77,145,84],{"class":83},[77,147,88],{"class":87},[77,149,25],{"class":91},[77,151,88],{"class":87},[77,153,96],{"class":83},[77,155,156],{"class":99},"OpenSuppliesShop",[77,158,103],{"class":83},[77,160,88],{"class":87},[77,162,163],{"class":91},"pet_supplies",[77,165,88],{"class":87},[77,167,113],{"class":83},[37,169,171],{"id":170},"openanimalmenu",[23,172,173],{},"OpenAnimalMenu()",[10,175,176,177,180,181,184],{},"Opens the local animal-form editor. Returns ",[23,178,179],{},"{ ok = true }"," on success or ",[23,182,183],{},"{ ok = false, error = \"...\" }"," for a local/server rejection. The player needs access, a valid state and no nearby player within the configured safety radius.",[67,186,188],{"className":69,"code":187,"filename":71,"language":72,"meta":73,"style":73},"local result = exports[\"sky_pets\"]:OpenAnimalMenu()\nif not result.ok then\n    print((\"Animal menu unavailable: %s\"):format(result.error))\nend\n",[23,189,190,218,238,269],{"__ignoreMap":73},[77,191,192,195,198,201,204,206,208,210,212,215],{"class":79,"line":80},[77,193,194],{"class":87},"local",[77,196,197],{"class":83}," result ",[77,199,200],{"class":87},"=",[77,202,203],{"class":83}," exports[",[77,205,88],{"class":87},[77,207,25],{"class":91},[77,209,88],{"class":87},[77,211,96],{"class":83},[77,213,214],{"class":99},"OpenAnimalMenu",[77,216,217],{"class":83},"()\n",[77,219,221,225,228,231,235],{"class":79,"line":220},2,[77,222,224],{"class":223},"s7zQu","if",[77,226,227],{"class":87}," not",[77,229,230],{"class":83}," result.",[77,232,234],{"class":233},"sBMFI","ok",[77,236,237],{"class":223}," then\n",[77,239,241,244,247,249,252,254,257,260,263,266],{"class":79,"line":240},3,[77,242,243],{"class":99},"    print",[77,245,246],{"class":83},"((",[77,248,88],{"class":87},[77,250,251],{"class":91},"Animal menu unavailable: %s",[77,253,88],{"class":87},[77,255,256],{"class":83},"):",[77,258,259],{"class":99},"format",[77,261,262],{"class":83},"(result.",[77,264,265],{"class":233},"error",[77,267,268],{"class":83},"))\n",[77,270,272],{"class":79,"line":271},4,[77,273,274],{"class":223},"end\n",[37,276,278,281,282],{"id":277},"togglepethud-and-togglepetmenu",[23,279,280],{},"TogglePetHud()"," and ",[23,283,284],{},"TogglePetMenu()",[10,286,287,288,291,292,295,296,299,300,303,304,307,308,311,312,315],{},"These client exports are registered ",[14,289,290],{},"only"," when ",[23,293,294],{},"Config.Hud.openMethod"," or ",[23,297,298],{},"Config.Radial.openMethod"," respectively is set to ",[23,301,302],{},"\"export\""," before resource start. They toggle the local player's HUD and pet radial. Each returns ",[23,305,306],{},"true"," when the toggle succeeds or ",[23,309,310],{},"false"," when the current state blocks it (for example, while another pet UI is open). The defaults use F7/F6 key bindings instead, so these exports do ",[14,313,314],{},"not"," exist in the default configuration.",[67,317,319],{"className":69,"code":318,"filename":71,"language":72,"meta":73,"style":73},"-- Requires Config.Radial.openMethod = \"export\" and a resource restart.\nlocal opened = exports[\"sky_pets\"]:TogglePetMenu()\nif not opened then\n    print(\"Pet menu cannot be toggled right now\")\nend\n",[23,320,321,327,351,362,377],{"__ignoreMap":73},[77,322,323],{"class":79,"line":80},[77,324,326],{"class":325},"sHwdD","-- Requires Config.Radial.openMethod = \"export\" and a resource restart.\n",[77,328,329,331,334,336,338,340,342,344,346,349],{"class":79,"line":220},[77,330,194],{"class":87},[77,332,333],{"class":83}," opened ",[77,335,200],{"class":87},[77,337,203],{"class":83},[77,339,88],{"class":87},[77,341,25],{"class":91},[77,343,88],{"class":87},[77,345,96],{"class":83},[77,347,348],{"class":99},"TogglePetMenu",[77,350,217],{"class":83},[77,352,353,355,357,359],{"class":79,"line":240},[77,354,224],{"class":223},[77,356,227],{"class":87},[77,358,333],{"class":83},[77,360,361],{"class":223},"then\n",[77,363,364,366,368,370,373,375],{"class":79,"line":271},[77,365,243],{"class":99},[77,367,103],{"class":83},[77,369,88],{"class":87},[77,371,372],{"class":91},"Pet menu cannot be toggled right now",[77,374,88],{"class":87},[77,376,113],{"class":83},[77,378,380],{"class":79,"line":379},5,[77,381,274],{"class":223},[32,383,385],{"id":384},"server-exports","Server exports",[37,387,389],{"id":388},"giveanimalaccesstarget",[23,390,391],{},"GiveAnimalAccess(target)",[10,393,394,395,398,399,402,403,406,407,295,410,413],{},"Grants access to the separate player animal-form feature. ",[23,396,397],{},"target"," is an online player source (",[23,400,401],{},"number",") or a validated persistent owner identifier (",[23,404,405],{},"string","). Returns ",[23,408,409],{},"{ ok = true, hasAccess = boolean }",[23,411,412],{},"{ ok = false, error = string }",". An eligible staff command permission may also give the player effective access without an explicit grant.",[67,415,418],{"className":69,"code":416,"filename":417,"language":72,"meta":73,"style":73},"local result = exports[\"sky_pets\"]:GiveAnimalAccess(player_source)\nif not result.ok then\n    print((\"Grant failed: %s\"):format(result.error))\nend\n","server.lua",[23,419,420,444,456,479],{"__ignoreMap":73},[77,421,422,424,426,428,430,432,434,436,438,441],{"class":79,"line":80},[77,423,194],{"class":87},[77,425,197],{"class":83},[77,427,200],{"class":87},[77,429,203],{"class":83},[77,431,88],{"class":87},[77,433,25],{"class":91},[77,435,88],{"class":87},[77,437,96],{"class":83},[77,439,440],{"class":99},"GiveAnimalAccess",[77,442,443],{"class":83},"(player_source)\n",[77,445,446,448,450,452,454],{"class":79,"line":220},[77,447,224],{"class":223},[77,449,227],{"class":87},[77,451,230],{"class":83},[77,453,234],{"class":233},[77,455,237],{"class":223},[77,457,458,460,462,464,467,469,471,473,475,477],{"class":79,"line":240},[77,459,243],{"class":99},[77,461,246],{"class":83},[77,463,88],{"class":87},[77,465,466],{"class":91},"Grant failed: %s",[77,468,88],{"class":87},[77,470,256],{"class":83},[77,472,259],{"class":99},[77,474,262],{"class":83},[77,476,265],{"class":233},[77,478,268],{"class":83},[77,480,481],{"class":79,"line":271},[77,482,274],{"class":223},[37,484,486],{"id":485},"removeanimalaccesstarget",[23,487,488],{},"RemoveAnimalAccess(target)",[10,490,491,492,495,496,498,499,502],{},"Revokes a grant using the same target types and result shape. If a player's staff permission still allows the animal menu, ",[23,493,494],{},"hasAccess"," can remain ",[23,497,306],{},"; the return reports ",[14,500,501],{},"effective"," access. Active sessions are closed when effective access is lost.",[67,504,506],{"className":69,"code":505,"filename":417,"language":72,"meta":73,"style":73},"local result = exports[\"sky_pets\"]:RemoveAnimalAccess(player_source)\nif result.ok then\n    print((\"Effective animal access: %s\"):format(tostring(result.hasAccess)))\nend\n",[23,507,508,531,541,570],{"__ignoreMap":73},[77,509,510,512,514,516,518,520,522,524,526,529],{"class":79,"line":80},[77,511,194],{"class":87},[77,513,197],{"class":83},[77,515,200],{"class":87},[77,517,203],{"class":83},[77,519,88],{"class":87},[77,521,25],{"class":91},[77,523,88],{"class":87},[77,525,96],{"class":83},[77,527,528],{"class":99},"RemoveAnimalAccess",[77,530,443],{"class":83},[77,532,533,535,537,539],{"class":79,"line":220},[77,534,224],{"class":223},[77,536,230],{"class":83},[77,538,234],{"class":233},[77,540,237],{"class":223},[77,542,543,545,547,549,552,554,556,558,560,563,565,567],{"class":79,"line":240},[77,544,243],{"class":99},[77,546,246],{"class":83},[77,548,88],{"class":87},[77,550,551],{"class":91},"Effective animal access: %s",[77,553,88],{"class":87},[77,555,256],{"class":83},[77,557,259],{"class":99},[77,559,103],{"class":83},[77,561,562],{"class":99},"tostring",[77,564,262],{"class":83},[77,566,494],{"class":233},[77,568,569],{"class":83},")))\n",[77,571,572],{"class":79,"line":271},[77,573,274],{"class":223},[37,575,577],{"id":576},"hasanimalaccesstarget",[23,578,579],{},"HasAnimalAccess(target)",[10,581,582,583,586,587,589],{},"Returns a ",[14,584,585],{},"boolean"," for effective access. An invalid target returns ",[23,588,310],{},". This reads the saved grant and, for an online player, the configured command permission.",[67,591,593],{"className":69,"code":592,"filename":417,"language":72,"meta":73,"style":73},"if exports[\"sky_pets\"]:HasAnimalAccess(player_source) then\n    print(\"Animal form is available to this player\")\nend\n",[23,594,595,617,632],{"__ignoreMap":73},[77,596,597,599,601,603,605,607,609,612,615],{"class":79,"line":80},[77,598,224],{"class":223},[77,600,203],{"class":83},[77,602,88],{"class":87},[77,604,25],{"class":91},[77,606,88],{"class":87},[77,608,96],{"class":83},[77,610,611],{"class":99},"HasAnimalAccess",[77,613,614],{"class":83},"(player_source) ",[77,616,361],{"class":223},[77,618,619,621,623,625,628,630],{"class":79,"line":220},[77,620,243],{"class":99},[77,622,103],{"class":83},[77,624,88],{"class":87},[77,626,627],{"class":91},"Animal form is available to this player",[77,629,88],{"class":87},[77,631,113],{"class":83},[77,633,634],{"class":79,"line":240},[77,635,274],{"class":223},[37,637,639],{"id":638},"openanimalmenusource",[23,640,641],{},"OpenAnimalMenu(source)",[10,643,644,645,648,649,295,651,653],{},"Requests that the server open the animal-form editor for an ",[14,646,647],{},"online player source",". Returns ",[23,650,179],{},[23,652,412],{},". It validates access and rejects a nearby-player conflict before sending the menu-open message. This is distinct from the client export of the same name.",[67,655,657],{"className":69,"code":656,"filename":417,"language":72,"meta":73,"style":73},"local result = exports[\"sky_pets\"]:OpenAnimalMenu(player_source)\nif not result.ok then\n    print((\"Animal menu denied: %s\"):format(result.error))\nend\n",[23,658,659,681,693,716],{"__ignoreMap":73},[77,660,661,663,665,667,669,671,673,675,677,679],{"class":79,"line":80},[77,662,194],{"class":87},[77,664,197],{"class":83},[77,666,200],{"class":87},[77,668,203],{"class":83},[77,670,88],{"class":87},[77,672,25],{"class":91},[77,674,88],{"class":87},[77,676,96],{"class":83},[77,678,214],{"class":99},[77,680,443],{"class":83},[77,682,683,685,687,689,691],{"class":79,"line":220},[77,684,224],{"class":223},[77,686,227],{"class":87},[77,688,230],{"class":83},[77,690,234],{"class":233},[77,692,237],{"class":223},[77,694,695,697,699,701,704,706,708,710,712,714],{"class":79,"line":240},[77,696,243],{"class":99},[77,698,246],{"class":83},[77,700,88],{"class":87},[77,702,703],{"class":91},"Animal menu denied: %s",[77,705,88],{"class":87},[77,707,256],{"class":83},[77,709,259],{"class":99},[77,711,262],{"class":83},[77,713,265],{"class":233},[77,715,268],{"class":83},[77,717,718],{"class":79,"line":271},[77,719,274],{"class":223},[10,721,722],{},"No core export grants pet ownership, adds combat XP or changes a pet's health. Those changes stay inside the validated shop and gameplay flows.",[724,725,726],"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":73,"searchDepth":80,"depth":220,"links":728},[729,736],{"id":34,"depth":220,"text":35,"children":730},[731,732,733,734],{"id":39,"depth":240,"text":42},{"id":116,"depth":240,"text":119},{"id":170,"depth":240,"text":173},{"id":277,"depth":240,"text":735},"TogglePetHud() and TogglePetMenu()",{"id":384,"depth":220,"text":385,"children":737},[738,739,740,741],{"id":388,"depth":240,"text":391},{"id":485,"depth":240,"text":488},{"id":576,"depth":240,"text":579},{"id":638,"depth":240,"text":641},"Complete Sky Pets core client and server exports, arguments, results, availability, and Lua examples.","md",null,{},true,"/docs/scripts/pets/reference/exports",{"title":5,"description":742},{"loc":747},"1.docs/scripts/5.pets/4.reference/3.exports","BdA8SLim0z_BL32uz4HQLf4uAHCcJq6xFQeEQWaB5ZM",[753,758],{"title":754,"path":755,"stem":756,"description":757,"children":-1},"Commands and permissions","/docs/scripts/pets/reference/commands","1.docs/scripts/5.pets/4.reference/2.commands","Player controls, staff tools, configurator commands, and diagnostic permission groups.",{"title":759,"path":760,"stem":761,"description":762,"children":-1},"Events","/docs/scripts/pets/reference/events","1.docs/scripts/5.pets/4.reference/4.events","Sky Pets local integration events, observer payloads, item-use entry points, and internal network-event boundaries.",[],1790206635584]