[{"data":1,"prerenderedAt":933},["ShallowReactive",2],{"docs-navigation:\u002Fdocs\u002Fconventions\u002Fmetadata":3,"docs-page-estimated-read-time:\u002Fdocs\u002Fconventions\u002Fmetadata":399,"docs-page:\u002Fdocs\u002Fconventions\u002Fmetadata":400},[4,9,41,69,282],{"title":5,"path":6,"stem":7,"icon":8},"Welcome to the Vital docs","\u002Fdocs\u002Fabout","docs\u002F1.about","i-lucide-info",{"title":10,"path":11,"stem":12,"children":13,"icon":40},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F2.getting-started\u002F1.index",[14,16,35],{"title":15,"path":11,"stem":12,"icon":8},"What is Vital?",{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":34},"Installation","i-lucide-download","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F2.getting-started\u002F1.installation",[22,26,30],{"title":23,"path":24,"stem":25},"Using a starter project (~5 minutes)","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fstarter","docs\u002F2.getting-started\u002F1.installation\u002F2.starter",{"title":27,"path":28,"stem":29},"Manual configuration (~7-8 minutes)","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fmanual","docs\u002F2.getting-started\u002F1.installation\u002F3.manual",{"title":31,"path":32,"stem":33},"Using the initializer (~2-3 minutes)","\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Finitializer","docs\u002F2.getting-started\u002F1.installation\u002F4.initializer",false,{"title":36,"path":37,"stem":38,"icon":39},"Main class","\u002Fdocs\u002Fgetting-started\u002Fmain-plugin-class","docs\u002F2.getting-started\u002F2.main-plugin-class","i-lucide-play","i-lucide-circle-play",{"title":42,"path":43,"stem":44,"children":45,"icon":68},"Conventions","\u002Fdocs\u002Fconventions","docs\u002F3.conventions\u002F1.index",[46,48,52,56,60,64],{"title":47,"path":43,"stem":44,"icon":8},"About",{"title":49,"path":50,"stem":51},"Spring","\u002Fdocs\u002Fconventions\u002Fspring","docs\u002F3.conventions\u002F2.spring",{"title":53,"path":54,"stem":55},"Platforms","\u002Fdocs\u002Fconventions\u002Fplatform-implementations","docs\u002F3.conventions\u002F3.platform-implementations",{"title":57,"path":58,"stem":59},"Metadata","\u002Fdocs\u002Fconventions\u002Fmetadata","docs\u002F3.conventions\u002F4.metadata",{"title":61,"path":62,"stem":63},"Lifecycles","\u002Fdocs\u002Fconventions\u002Flifecycles","docs\u002F3.conventions\u002F5.lifecycles",{"title":65,"path":66,"stem":67},"(Optional) Advanced class loading","\u002Fdocs\u002Fconventions\u002Fadvanced-classloading","docs\u002F3.conventions\u002F6.advanced-classloading","i-lucide-cog",{"title":70,"path":71,"stem":72,"children":73,"icon":281},"Modules","\u002Fdocs\u002Fmodules","docs\u002F4.modules\u002F1.index",[74,76,100,106,112,126,136,150,164,178,188,224,234,248,257,275],{"title":75,"path":71,"stem":72,"icon":8},"What are modules?",{"title":77,"path":78,"stem":79,"children":80,"icon":99},"vital-core","\u002Fdocs\u002Fmodules\u002Fvital-core","docs\u002F4.modules\u002F2.vital-core\u002F1.index",[81,83,87,91,95],{"title":82,"path":78,"stem":79,"icon":8},"About this module",{"title":84,"path":85,"stem":86},"Configuration","\u002Fdocs\u002Fmodules\u002Fvital-core\u002Fconfiguration","docs\u002F4.modules\u002F2.vital-core\u002F2.configuration",{"title":88,"path":89,"stem":90},"Listeners","\u002Fdocs\u002Fmodules\u002Fvital-core\u002Flisteners","docs\u002F4.modules\u002F2.vital-core\u002F3.listeners",{"title":92,"path":93,"stem":94},"Conditional beans","\u002Fdocs\u002Fmodules\u002Fvital-core\u002Fconditional-beans","docs\u002F4.modules\u002F2.vital-core\u002F4.conditional-beans",{"title":96,"path":97,"stem":98},"Repositories","\u002Fdocs\u002Fmodules\u002Fvital-core\u002Frepositories","docs\u002F4.modules\u002F2.vital-core\u002F5.repositories","",{"title":101,"path":102,"stem":103,"children":104,"icon":99},"vital-cloudnet4-bridge","\u002Fdocs\u002Fmodules\u002Fvital-cloudnet4-bridge","docs\u002F4.modules\u002Fvital-cloudnet4-bridge\u002F1.index",[105],{"title":82,"path":102,"stem":103,"icon":8},{"title":107,"path":108,"stem":109,"children":110,"icon":99},"vital-cloudnet4-driver","\u002Fdocs\u002Fmodules\u002Fvital-cloudnet4-driver","docs\u002F4.modules\u002Fvital-cloudnet4-driver\u002F1.index",[111],{"title":82,"path":108,"stem":109,"icon":8},{"title":113,"path":114,"stem":115,"children":116,"icon":99},"vital-commands","\u002Fdocs\u002Fmodules\u002Fvital-commands","docs\u002F4.modules\u002Fvital-commands\u002F1.index",[117,118,122],{"title":82,"path":114,"stem":115,"icon":8},{"title":119,"path":120,"stem":121},"Commands","\u002Fdocs\u002Fmodules\u002Fvital-commands\u002Fcommands","docs\u002F4.modules\u002Fvital-commands\u002Fcommands",{"title":123,"path":124,"stem":125},"Exception handling","\u002Fdocs\u002Fmodules\u002Fvital-commands\u002Fexception-handling","docs\u002F4.modules\u002Fvital-commands\u002Fexception-handling",{"title":127,"path":128,"stem":129,"children":130,"icon":99},"vital-configs","\u002Fdocs\u002Fmodules\u002Fvital-configs","docs\u002F4.modules\u002Fvital-configs\u002F1.index",[131,132],{"title":82,"path":128,"stem":129,"icon":8},{"title":133,"path":134,"stem":135},"Configs","\u002Fdocs\u002Fmodules\u002Fvital-configs\u002Fconfigs","docs\u002F4.modules\u002Fvital-configs\u002F2.configs",{"title":137,"path":138,"stem":139,"children":140,"icon":99},"vital-holograms","\u002Fdocs\u002Fmodules\u002Fvital-holograms","docs\u002F4.modules\u002Fvital-holograms\u002F1.index",[141,142,146],{"title":82,"path":138,"stem":139,"icon":8},{"title":143,"path":144,"stem":145},"Global holograms","\u002Fdocs\u002Fmodules\u002Fvital-holograms\u002Fglobal-holograms","docs\u002F4.modules\u002Fvital-holograms\u002F2.global-holograms",{"title":147,"path":148,"stem":149},"Player holograms","\u002Fdocs\u002Fmodules\u002Fvital-holograms\u002Fplayer-holograms","docs\u002F4.modules\u002Fvital-holograms\u002F3.player-holograms",{"title":151,"path":152,"stem":153,"children":154,"icon":99},"vital-inventories","\u002Fdocs\u002Fmodules\u002Fvital-inventories","docs\u002F4.modules\u002Fvital-inventories\u002F1.index",[155,156,160],{"title":82,"path":152,"stem":153,"icon":8},{"title":157,"path":158,"stem":159},"Normal inventories","\u002Fdocs\u002Fmodules\u002Fvital-inventories\u002Fnormal-inventories","docs\u002F4.modules\u002Fvital-inventories\u002F2.normal-inventories",{"title":161,"path":162,"stem":163},"Paged inventories","\u002Fdocs\u002Fmodules\u002Fvital-inventories\u002Fpaged-inventories","docs\u002F4.modules\u002Fvital-inventories\u002F3.paged-inventories",{"title":165,"path":166,"stem":167,"children":168,"icon":99},"vital-items","\u002Fdocs\u002Fmodules\u002Fvital-items","docs\u002F4.modules\u002Fvital-items\u002F1.index",[169,170,174],{"title":82,"path":166,"stem":167,"icon":8},{"title":171,"path":172,"stem":173},"Items","\u002Fdocs\u002Fmodules\u002Fvital-items\u002Fitems","docs\u002F4.modules\u002Fvital-items\u002F2.items",{"title":175,"path":176,"stem":177},"Item builders","\u002Fdocs\u002Fmodules\u002Fvital-items\u002Fitem-builders","docs\u002F4.modules\u002Fvital-items\u002F3.item-builders",{"title":179,"path":180,"stem":181,"children":182,"icon":99},"vital-localization","\u002Fdocs\u002Fmodules\u002Fvital-localization","docs\u002F4.modules\u002Fvital-localization\u002F1.index",[183,184],{"title":82,"path":180,"stem":181,"icon":8},{"title":185,"path":186,"stem":187},"Localization","\u002Fdocs\u002Fmodules\u002Fvital-localization\u002Flocalization","docs\u002F4.modules\u002Fvital-localization\u002F2.localization",{"title":189,"path":190,"stem":191,"children":192,"icon":99},"vital-minigames","\u002Fdocs\u002Fmodules\u002Fvital-minigames","docs\u002F4.modules\u002Fvital-minigames\u002F1.index",[193,194,208],{"title":82,"path":190,"stem":191,"icon":8},{"title":195,"path":196,"stem":197,"children":198,"icon":99},"Global games","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Fglobal-games","docs\u002F4.modules\u002Fvital-minigames\u002F2.global-games\u002F1.index",[199,200,204],{"title":47,"path":196,"stem":197,"icon":8},{"title":201,"path":202,"stem":203},"States","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Fglobal-games\u002Fstates","docs\u002F4.modules\u002Fvital-minigames\u002F2.global-games\u002F2.states",{"title":205,"path":206,"stem":207},"Countdown states","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Fglobal-games\u002Fcountdown-states","docs\u002F4.modules\u002Fvital-minigames\u002F2.global-games\u002F3.countdown-states",{"title":209,"path":210,"stem":211,"children":212,"icon":99},"Instanced games","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Finstanced-games","docs\u002F4.modules\u002Fvital-minigames\u002F3.instanced-games\u002F1.index",[213,214,218,221],{"title":47,"path":210,"stem":211,"icon":8},{"title":215,"path":216,"stem":217},"Instances","\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Finstanced-games\u002Finstances","docs\u002F4.modules\u002Fvital-minigames\u002F3.instanced-games\u002F2.instances",{"title":201,"path":219,"stem":220},"\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Finstanced-games\u002Fstates","docs\u002F4.modules\u002Fvital-minigames\u002F3.instanced-games\u002F3.states",{"title":205,"path":222,"stem":223},"\u002Fdocs\u002Fmodules\u002Fvital-minigames\u002Finstanced-games\u002Fcountdown-states","docs\u002F4.modules\u002Fvital-minigames\u002F3.instanced-games\u002F4.countdown-states",{"title":225,"path":226,"stem":227,"children":228,"icon":99},"vital-players","\u002Fdocs\u002Fmodules\u002Fvital-players","docs\u002F4.modules\u002Fvital-players\u002F1.index",[229,230],{"title":82,"path":226,"stem":227,"icon":8},{"title":231,"path":232,"stem":233},"Players","\u002Fdocs\u002Fmodules\u002Fvital-players\u002Fplayers","docs\u002F4.modules\u002Fvital-players\u002F2.players",{"title":235,"path":236,"stem":237,"children":238,"icon":99},"vital-scoreboards","\u002Fdocs\u002Fmodules\u002Fvital-scoreboards","docs\u002F4.modules\u002Fvital-scoreboards\u002F1.index",[239,240,244],{"title":82,"path":236,"stem":237,"icon":8},{"title":241,"path":242,"stem":243},"Global scoreboards","\u002Fdocs\u002Fmodules\u002Fvital-scoreboards\u002Fglobal-scoreboards","docs\u002F4.modules\u002Fvital-scoreboards\u002Fglobal-scoreboards",{"title":245,"path":246,"stem":247},"Player scoreboards","\u002Fdocs\u002Fmodules\u002Fvital-scoreboards\u002Fplayer-scoreboards","docs\u002F4.modules\u002Fvital-scoreboards\u002Fplayer-scoreboards",{"title":249,"path":250,"stem":251,"children":252,"icon":99},"vital-statistics","\u002Fdocs\u002Fmodules\u002Fvital-statistics","docs\u002F4.modules\u002Fvital-statistics\u002F1.index",[253,254],{"title":82,"path":250,"stem":251,"icon":8},{"title":84,"path":255,"stem":256},"\u002Fdocs\u002Fmodules\u002Fvital-statistics\u002Fconfiguration","docs\u002F4.modules\u002Fvital-statistics\u002F2.configuration",{"title":258,"path":259,"stem":260,"children":261,"icon":99},"vital-tasks","\u002Fdocs\u002Fmodules\u002Fvital-tasks","docs\u002F4.modules\u002Fvital-tasks\u002F1.index",[262,263,267,271],{"title":82,"path":259,"stem":260,"icon":8},{"title":264,"path":265,"stem":266},"Repeatable tasks","\u002Fdocs\u002Fmodules\u002Fvital-tasks\u002Frepeatable-tasks","docs\u002F4.modules\u002Fvital-tasks\u002F2.repeatable-tasks",{"title":268,"path":269,"stem":270},"Countdown tasks","\u002Fdocs\u002Fmodules\u002Fvital-tasks\u002Fcountdown-tasks","docs\u002F4.modules\u002Fvital-tasks\u002F3.countdown-tasks",{"title":272,"path":273,"stem":274},"Scheduled tasks","\u002Fdocs\u002Fmodules\u002Fvital-tasks\u002Fscheduled-tasks","docs\u002F4.modules\u002Fvital-tasks\u002F4.scheduled-tasks",{"title":276,"path":277,"stem":278,"children":279,"icon":99},"vital-utils (Also for non Vital projects)","\u002Fdocs\u002Fmodules\u002Fvital-utils","docs\u002F4.modules\u002Fvital-utils\u002F1.index",[280],{"title":82,"path":277,"stem":278,"icon":8},"i-lucide-package",{"title":283,"path":284,"stem":285,"children":286,"icon":398},"Recipes","\u002Fdocs\u002Frecipes","docs\u002F5.recipes\u002F1.index",[287,289,301,305,317,330,341,344,368,371,384],{"title":288,"path":284,"stem":285,"icon":8},"What are recipes?",{"title":119,"path":290,"stem":291,"children":292,"page":34},"\u002Fdocs\u002Frecipes\u002Fcommands","docs\u002F5.recipes\u002Fcommands",[293,297],{"title":294,"path":295,"stem":296},"Command with arg exception handler","\u002Fdocs\u002Frecipes\u002Fcommands\u002Fcommands","docs\u002F5.recipes\u002Fcommands\u002Fcommands",{"title":298,"path":299,"stem":300},"Global command exception handler","\u002Fdocs\u002Frecipes\u002Fcommands\u002Fglobal-exception-handler","docs\u002F5.recipes\u002Fcommands\u002Fglobal-exception-handler",{"title":302,"path":303,"stem":304},"Config","\u002Fdocs\u002Frecipes\u002Fconfig","docs\u002F5.recipes\u002Fconfig",{"title":306,"path":307,"stem":308,"children":309,"page":34},"Holograms","\u002Fdocs\u002Frecipes\u002Fholograms","docs\u002F5.recipes\u002Fholograms",[310,314],{"title":311,"path":312,"stem":313},"Global hologram","\u002Fdocs\u002Frecipes\u002Fholograms\u002Fglobal-holograms","docs\u002F5.recipes\u002Fholograms\u002Fglobal-holograms",{"title":147,"path":315,"stem":316},"\u002Fdocs\u002Frecipes\u002Fholograms\u002Fplayer-holograms","docs\u002F5.recipes\u002Fholograms\u002Fplayer-holograms",{"title":318,"path":319,"stem":320,"children":321,"page":34},"Inventories","\u002Fdocs\u002Frecipes\u002Finventories","docs\u002F5.recipes\u002Finventories",[322,326],{"title":323,"path":324,"stem":325},"Normal inventory","\u002Fdocs\u002Frecipes\u002Finventories\u002Fnormal-inventory","docs\u002F5.recipes\u002Finventories\u002Fnormal-inventory",{"title":327,"path":328,"stem":329},"Paged inventory","\u002Fdocs\u002Frecipes\u002Finventories\u002Fpaged-inventory","docs\u002F5.recipes\u002Finventories\u002Fpaged-inventory",{"title":171,"path":331,"stem":332,"children":333,"page":34},"\u002Fdocs\u002Frecipes\u002Fitems","docs\u002F5.recipes\u002Fitems",[334,338],{"title":335,"path":336,"stem":337},"Interactable items","\u002Fdocs\u002Frecipes\u002Fitems\u002Finteractable-items","docs\u002F5.recipes\u002Fitems\u002Finteractable-items",{"title":175,"path":339,"stem":340},"\u002Fdocs\u002Frecipes\u002Fitems\u002Fitem-builders","docs\u002F5.recipes\u002Fitems\u002Fitem-builders",{"title":185,"path":342,"stem":343},"\u002Fdocs\u002Frecipes\u002Flocalization","docs\u002F5.recipes\u002Flocalization",{"title":345,"path":346,"stem":347,"children":348,"page":34},"Minigames","\u002Fdocs\u002Frecipes\u002Fminigames","docs\u002F5.recipes\u002Fminigames",[349,353,357,361,365],{"title":350,"path":351,"stem":352},"Global minigame countdown states","\u002Fdocs\u002Frecipes\u002Fminigames\u002Fglobal-countdown-states","docs\u002F5.recipes\u002Fminigames\u002Fglobal-countdown-states",{"title":354,"path":355,"stem":356},"Global minigame states","\u002Fdocs\u002Frecipes\u002Fminigames\u002Fglobal-states","docs\u002F5.recipes\u002Fminigames\u002Fglobal-states",{"title":358,"path":359,"stem":360},"Instance countdown states","\u002Fdocs\u002Frecipes\u002Fminigames\u002Finstance-countdown-states","docs\u002F5.recipes\u002Fminigames\u002Finstance-countdown-states",{"title":362,"path":363,"stem":364},"Instance states","\u002Fdocs\u002Frecipes\u002Fminigames\u002Finstance-states","docs\u002F5.recipes\u002Fminigames\u002Finstance-states",{"title":215,"path":366,"stem":367},"\u002Fdocs\u002Frecipes\u002Fminigames\u002Finstances","docs\u002F5.recipes\u002Fminigames\u002Finstances",{"title":231,"path":369,"stem":370},"\u002Fdocs\u002Frecipes\u002Fplayers","docs\u002F5.recipes\u002Fplayers",{"title":372,"path":373,"stem":374,"children":375,"page":34},"Scoreboards","\u002Fdocs\u002Frecipes\u002Fscoreboards","docs\u002F5.recipes\u002Fscoreboards",[376,380],{"title":377,"path":378,"stem":379},"Global scoreboard","\u002Fdocs\u002Frecipes\u002Fscoreboards\u002Fglobal-scoreboard","docs\u002F5.recipes\u002Fscoreboards\u002Fglobal-scoreboard",{"title":381,"path":382,"stem":383},"Player scoreboard","\u002Fdocs\u002Frecipes\u002Fscoreboards\u002Fplayer-scoreboard","docs\u002F5.recipes\u002Fscoreboards\u002Fplayer-scoreboard",{"title":385,"path":386,"stem":387,"children":388,"page":34},"Tasks","\u002Fdocs\u002Frecipes\u002Ftasks","docs\u002F5.recipes\u002Ftasks",[389,392,395],{"title":268,"path":390,"stem":391},"\u002Fdocs\u002Frecipes\u002Ftasks\u002Fcountdown-tasks","docs\u002F5.recipes\u002Ftasks\u002Fcountdown-tasks",{"title":264,"path":393,"stem":394},"\u002Fdocs\u002Frecipes\u002Ftasks\u002Frepeatable-tasks","docs\u002F5.recipes\u002Ftasks\u002Frepeatable-tasks",{"title":272,"path":396,"stem":397},"\u002Fdocs\u002Frecipes\u002Ftasks\u002Fscheduled-tasks","docs\u002F5.recipes\u002Ftasks\u002Fscheduled-tasks","i-lucide-cooking-pot",3,{"id":401,"title":57,"body":402,"description":926,"extension":927,"meta":928,"navigation":929,"path":58,"rawbody":930,"seo":931,"stem":59,"__hash__":932},"docs\u002Fdocs\u002F3.conventions\u002F4.metadata.md",{"type":403,"value":404,"toc":924},"minimark",[405,409,417,423,432,547,550,556,722,732,868,883,920],[406,407,57],"h1",{"id":408},"metadata",[410,411,412,413,416],"p",{},"Vital is designed in a way to keep your project code as readable and as short as possible.",[414,415],"br",{},"\nThis means less writing to separate configuration files, more writing to your actual classes in code.",[410,418,419,420,422],{},"Because some implementations need additional metadata, like commands need a name, permissions, args, etc. Vital uses a system called metaprogramming to directly configure your classes in code.",[414,421],{},"\nEach class that must be fitted with additional metadata will fail to initialize or work if you don't provide them.",[410,424,425,426,428,429,431],{},"Metadata is always provided in the form of annotations.",[414,427],{},"\nFor example, when you create a command, you must specify its name and permissions.",[414,430],{},"\nTo do this, you must add an info annotation to your command class, e.g.:",[433,434,439],"pre",{"className":435,"code":436,"filename":437,"language":438,"meta":99,"style":99},"language-java shiki shiki-themes material-theme-lighter github-light github-dark","@VitalCommand.Info(name = \"mycommand\", permission = \"mycommand.permission.node\", playerOnly = true)\npublic class MyCommand extends VitalCommand.Spigot {\n  \n}\n","MyCommand.java","java",[440,441,442,506,535,541],"code",{"__ignoreMap":99},[443,444,447,451,455,458,462,466,470,474,477,480,483,485,487,490,492,494,497,499,503],"span",{"class":445,"line":446},"line",1,[443,448,450],{"class":449},"sP7_E","@",[443,452,454],{"class":453},"sbsja","VitalCommand.Info",[443,456,457],{"class":449},"(",[443,459,461],{"class":460},"sZMiF","name",[443,463,465],{"class":464},"smGrS"," =",[443,467,469],{"class":468},"sjJ54"," \"",[443,471,473],{"class":472},"s_sjI","mycommand",[443,475,476],{"class":468},"\"",[443,478,479],{"class":449},",",[443,481,482],{"class":460}," permission",[443,484,465],{"class":464},[443,486,469],{"class":468},[443,488,489],{"class":472},"mycommand.permission.node",[443,491,476],{"class":468},[443,493,479],{"class":449},[443,495,496],{"class":460}," playerOnly",[443,498,465],{"class":464},[443,500,502],{"class":501},"s39Yj"," true",[443,504,505],{"class":449},")\n",[443,507,509,512,515,519,522,525,529,532],{"class":445,"line":508},2,[443,510,511],{"class":453},"public",[443,513,514],{"class":453}," class",[443,516,518],{"class":517},"sbgvK"," MyCommand",[443,520,521],{"class":453}," extends",[443,523,524],{"class":517}," VitalCommand",[443,526,528],{"class":527},"stp6e",".",[443,530,531],{"class":517},"Spigot",[443,533,534],{"class":449}," {\n",[443,536,537],{"class":445,"line":399},[443,538,540],{"class":539},"su5hD","  \n",[443,542,544],{"class":445,"line":543},4,[443,545,546],{"class":449},"}\n",[410,548,549],{},"This metadata info annotation is read when the command is constructed and will determine how your command behaves.",[410,551,552,553,555],{},"These annotations are not only limited to classes, you may also sometimes need to provide annotations to specific functions.",[414,554],{},"\nE.g., when you define arguments in a command.",[433,557,559],{"className":435,"code":558,"filename":437,"language":438,"meta":99,"style":99},"@VitalCommand.Info(name = \"mycommand\", permission = \"mycommand.permission.node\", playerOnly = true)\npublic class MyCommand extends VitalCommand.Spigot {\n  @ArgHandler(arg = @Arg(name = \"somearg\", permission = \"mycommand.somearg.permission.node\", playerOnly = true))\n  public ReturnState onSomearg(Player player) {\n    \u002F\u002F ...\n  }\n}\n",[440,560,561,601,619,677,704,711,717],{"__ignoreMap":99},[443,562,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599],{"class":445,"line":446},[443,564,450],{"class":449},[443,566,454],{"class":453},[443,568,457],{"class":449},[443,570,461],{"class":460},[443,572,465],{"class":464},[443,574,469],{"class":468},[443,576,473],{"class":472},[443,578,476],{"class":468},[443,580,479],{"class":449},[443,582,482],{"class":460},[443,584,465],{"class":464},[443,586,469],{"class":468},[443,588,489],{"class":472},[443,590,476],{"class":468},[443,592,479],{"class":449},[443,594,496],{"class":460},[443,596,465],{"class":464},[443,598,502],{"class":501},[443,600,505],{"class":449},[443,602,603,605,607,609,611,613,615,617],{"class":445,"line":508},[443,604,511],{"class":453},[443,606,514],{"class":453},[443,608,518],{"class":517},[443,610,521],{"class":453},[443,612,524],{"class":517},[443,614,528],{"class":527},[443,616,531],{"class":517},[443,618,534],{"class":449},[443,620,621,624,627,629,632,634,637,640,642,644,646,648,651,653,655,657,659,661,664,666,668,670,672,674],{"class":445,"line":399},[443,622,623],{"class":449},"  @",[443,625,626],{"class":453},"ArgHandler",[443,628,457],{"class":449},[443,630,631],{"class":460},"arg",[443,633,465],{"class":464},[443,635,636],{"class":449}," @",[443,638,639],{"class":453},"Arg",[443,641,457],{"class":449},[443,643,461],{"class":460},[443,645,465],{"class":464},[443,647,469],{"class":468},[443,649,650],{"class":472},"somearg",[443,652,476],{"class":468},[443,654,479],{"class":449},[443,656,482],{"class":460},[443,658,465],{"class":464},[443,660,469],{"class":468},[443,662,663],{"class":472},"mycommand.somearg.permission.node",[443,665,476],{"class":468},[443,667,479],{"class":449},[443,669,496],{"class":460},[443,671,465],{"class":464},[443,673,502],{"class":501},[443,675,676],{"class":449},"))\n",[443,678,679,682,686,690,692,695,699,702],{"class":445,"line":543},[443,680,681],{"class":453},"  public",[443,683,685],{"class":684},"s_bVq"," ReturnState",[443,687,689],{"class":688},"sGLFI"," onSomearg",[443,691,457],{"class":449},[443,693,694],{"class":684},"Player",[443,696,698],{"class":697},"s99_P"," player",[443,700,701],{"class":449},")",[443,703,534],{"class":449},[443,705,707],{"class":445,"line":706},5,[443,708,710],{"class":709},"sutJx","    \u002F\u002F ...\n",[443,712,714],{"class":445,"line":713},6,[443,715,716],{"class":449},"  }\n",[443,718,720],{"class":445,"line":719},7,[443,721,546],{"class":449},[410,723,724,725,728,729,731],{},"Every class that supports these metadata info annotations implements the ",[440,726,727],{},"VitalHasInfo"," interface.",[414,730],{},"\nYou can also define your own classes that support these info annotations.",[433,733,736],{"className":435,"code":734,"filename":735,"language":438,"meta":99,"style":99},"public class MyCustomInfoClass implements VitalHasInfo {\n  private final Map\u003CClass\u003C? extends Annotation>, ? extends Annotation> info;\n \n  @Override\n  public Map\u003CClass\u003C? extends Annotation>, ? extends Annotation> getInfo() {\n    return info;\n  }\n}\n","MyCustomInfoClass.java",[440,737,738,755,801,806,813,849,859,863],{"__ignoreMap":99},[443,739,740,742,744,747,750,753],{"class":445,"line":446},[443,741,511],{"class":453},[443,743,514],{"class":453},[443,745,746],{"class":517}," MyCustomInfoClass",[443,748,749],{"class":453}," implements",[443,751,752],{"class":517}," VitalHasInfo",[443,754,534],{"class":449},[443,756,757,760,763,766,769,772,774,777,779,782,785,788,790,792,795,798],{"class":445,"line":508},[443,758,759],{"class":453},"  private",[443,761,762],{"class":453}," final",[443,764,765],{"class":684}," Map",[443,767,768],{"class":449},"\u003C",[443,770,771],{"class":684},"Class",[443,773,768],{"class":449},[443,775,776],{"class":453},"?",[443,778,521],{"class":453},[443,780,781],{"class":453}," Annotation",[443,783,784],{"class":449},">,",[443,786,787],{"class":453}," ?",[443,789,521],{"class":453},[443,791,781],{"class":453},[443,793,794],{"class":449},">",[443,796,797],{"class":539}," info",[443,799,800],{"class":449},";\n",[443,802,803],{"class":445,"line":399},[443,804,805],{"class":539}," \n",[443,807,808,810],{"class":445,"line":543},[443,809,623],{"class":449},[443,811,812],{"class":453},"Override\n",[443,814,815,817,819,821,823,825,827,829,831,833,835,837,839,841,844,847],{"class":445,"line":706},[443,816,681],{"class":453},[443,818,765],{"class":684},[443,820,768],{"class":449},[443,822,771],{"class":684},[443,824,768],{"class":449},[443,826,776],{"class":453},[443,828,521],{"class":453},[443,830,781],{"class":453},[443,832,784],{"class":449},[443,834,787],{"class":453},[443,836,521],{"class":453},[443,838,781],{"class":453},[443,840,794],{"class":449},[443,842,843],{"class":688}," getInfo",[443,845,846],{"class":449},"()",[443,848,534],{"class":449},[443,850,851,855,857],{"class":445,"line":713},[443,852,854],{"class":853},"sVHd0","    return",[443,856,797],{"class":539},[443,858,800],{"class":449},[443,860,861],{"class":445,"line":719},[443,862,716],{"class":449},[443,864,866],{"class":445,"line":865},8,[443,867,546],{"class":449},[410,869,870,871,528,874,876,877,879,880,528],{},"To retrieve an info annotation from any of these classes that support them, use ",[440,872,873],{},"getInfo(Class\u003C? extends Annotation>)",[414,875],{},"\nBecause classes may support multiple info annotations, ",[440,878,727],{}," will always be a ",[440,881,882],{},"Map\u003CClass\u003C? extends Annotation>, ? extends Annotation>",[433,884,886],{"className":435,"code":885,"filename":735,"language":438,"meta":99,"style":99},"final VitalCommand.Info myCommandInfo = getInfo(VitalCommand.Info);\n",[440,887,888],{"__ignoreMap":99},[443,889,890,893,895,897,900,903,906,908,910,913,915,917],{"class":445,"line":446},[443,891,892],{"class":453},"final",[443,894,524],{"class":684},[443,896,528],{"class":449},[443,898,899],{"class":684},"Info",[443,901,902],{"class":539}," myCommandInfo ",[443,904,905],{"class":464},"=",[443,907,843],{"class":688},[443,909,457],{"class":449},[443,911,912],{"class":539},"VitalCommand",[443,914,528],{"class":449},[443,916,899],{"class":539},[443,918,919],{"class":449},");\n",[921,922,923],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stp6e, html code.shiki .stp6e{--shiki-light:#39ADB5;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .s_bVq, html code.shiki .s_bVq{--shiki-light:#9C3EDA;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}",{"title":99,"searchDepth":508,"depth":508,"links":925},[],"This page explains how metadata for specific components are defined in the Vital framework.","md",{},{"title":57},"---\ntitle: Metadata\ndescription: This page explains how metadata for specific components are defined in the Vital framework.\nnavigation:\n  title: Metadata\n---\n\n# Metadata\n\nVital is designed in a way to keep your project code as readable and as short as possible.  \nThis means less writing to separate configuration files, more writing to your actual classes in code.  \n\nBecause some implementations need additional metadata, like commands need a name, permissions, args, etc. Vital uses a system called metaprogramming to directly configure your classes in code.  \nEach class that must be fitted with additional metadata will fail to initialize or work if you don't provide them.  \n\nMetadata is always provided in the form of annotations.  \nFor example, when you create a command, you must specify its name and permissions.  \nTo do this, you must add an info annotation to your command class, e.g.:  \n```java [MyCommand.java]\n@VitalCommand.Info(name = \"mycommand\", permission = \"mycommand.permission.node\", playerOnly = true)\npublic class MyCommand extends VitalCommand.Spigot {\n  \n}\n```\n\nThis metadata info annotation is read when the command is constructed and will determine how your command behaves.  \n\n\nThese annotations are not only limited to classes, you may also sometimes need to provide annotations to specific functions.  \nE.g., when you define arguments in a command.  \n```java [MyCommand.java]\n@VitalCommand.Info(name = \"mycommand\", permission = \"mycommand.permission.node\", playerOnly = true)\npublic class MyCommand extends VitalCommand.Spigot {\n  @ArgHandler(arg = @Arg(name = \"somearg\", permission = \"mycommand.somearg.permission.node\", playerOnly = true))\n  public ReturnState onSomearg(Player player) {\n    \u002F\u002F ...\n  }\n}\n```\n\nEvery class that supports these metadata info annotations implements the `VitalHasInfo` interface.  \nYou can also define your own classes that support these info annotations.  \n\n```java [MyCustomInfoClass.java]\npublic class MyCustomInfoClass implements VitalHasInfo {\n  private final Map\u003CClass\u003C? extends Annotation>, ? extends Annotation> info;\n \n  @Override\n  public Map\u003CClass\u003C? extends Annotation>, ? extends Annotation> getInfo() {\n    return info;\n  }\n}\n```\n\nTo retrieve an info annotation from any of these classes that support them, use `getInfo(Class\u003C? extends Annotation>)`.  \nBecause classes may support multiple info annotations, `VitalHasInfo` will always be a `Map\u003CClass\u003C? extends Annotation>, ? extends Annotation>`.  \n\n```java [MyCustomInfoClass.java]\nfinal VitalCommand.Info myCommandInfo = getInfo(VitalCommand.Info);\n```\n",{"title":57,"description":926},"QZdhRaJfZkwb3y2OmdcD1QqcyU_bhMvlRZXtqQHpL6c",1789308658758]