[{"data":1,"prerenderedAt":865},["ShallowReactive",2],{"docs-navigation:\u002Fdocs\u002Fmodules\u002Fvital-configs\u002Fconfigs":3,"docs-page-estimated-read-time:\u002Fdocs\u002Fmodules\u002Fvital-configs\u002Fconfigs":399,"docs-page:\u002Fdocs\u002Fmodules\u002Fvital-configs\u002Fconfigs":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":133,"body":402,"description":858,"extension":859,"meta":860,"navigation":861,"path":134,"rawbody":862,"seo":863,"stem":135,"__hash__":864},"docs\u002Fdocs\u002F4.modules\u002Fvital-configs\u002F2.configs.md",{"type":403,"value":404,"toc":854},"minimark",[405,409,422,519,526,529,534,540,639,658,661,664,673,679,683,689,779,788,841,850],[406,407,133],"h1",{"id":408},"configs",[410,411,412,413,417,418,421],"p",{},"A config will be a class that extends ",[414,415,416],"code",{},"VitalConfig"," and is annotated with ",[414,419,420],{},"@VitalConfig.Info",".",[423,424,429],"pre",{"className":425,"code":426,"filename":427,"language":428,"meta":99,"style":99},"language-java shiki shiki-themes material-theme-lighter github-light github-dark","@VitalConfig.Info(name = \"myconfig.yaml\", processor = VitalYAMLConfigProcessor.class)\npublic class MyConfig extends VitalConfig {\n  \n}\n","MyConfig.java","java",[414,430,431,486,508,513],{"__ignoreMap":99},[432,433,436,440,444,447,451,455,459,463,466,469,472,474,478,480,483],"span",{"class":434,"line":435},"line",1,[432,437,439],{"class":438},"sP7_E","@",[432,441,443],{"class":442},"sbsja","VitalConfig.Info",[432,445,446],{"class":438},"(",[432,448,450],{"class":449},"sZMiF","name",[432,452,454],{"class":453},"smGrS"," =",[432,456,458],{"class":457},"sjJ54"," \"",[432,460,462],{"class":461},"s_sjI","myconfig.yaml",[432,464,465],{"class":457},"\"",[432,467,468],{"class":438},",",[432,470,471],{"class":449}," processor",[432,473,454],{"class":453},[432,475,477],{"class":476},"su5hD"," VitalYAMLConfigProcessor",[432,479,421],{"class":438},[432,481,482],{"class":476},"class",[432,484,485],{"class":438},")\n",[432,487,489,492,495,499,502,505],{"class":434,"line":488},2,[432,490,491],{"class":442},"public",[432,493,494],{"class":442}," class",[432,496,498],{"class":497},"sbgvK"," MyConfig",[432,500,501],{"class":442}," extends",[432,503,504],{"class":497}," VitalConfig",[432,506,507],{"class":438}," {\n",[432,509,510],{"class":434,"line":399},[432,511,512],{"class":476},"  \n",[432,514,516],{"class":434,"line":515},4,[432,517,518],{"class":438},"}\n",[410,520,521,522,525],{},"For every config, you define the name (path to your config, relative to your server.jar file) and the processor that should be used for your config.",[523,524],"br",{},"\nVital currently supports two types of configs and provides a processor for each: YAML files and Properties files.",[410,527,528],{},"Based on what data you want to store and how you want to store it, you can choose the appropriate processor in your info annotation.",[530,531,533],"h2",{"id":532},"storing-data","Storing data",[410,535,536,537,421],{},"To store data, simply create a new field in your config class and annotate it with ",[414,538,539],{},"@Property",[423,541,543],{"className":425,"code":542,"filename":427,"language":428,"meta":99,"style":99},"@VitalConfig.Info(name = \"myconfig.yaml\", processor = VitalYAMLConfigProcessor.class)\npublic class MyConfig extends VitalConfig {\n  @Property(types = {String.class})\n  private String myCustomString;\n}\n",[414,544,545,577,591,619,634],{"__ignoreMap":99},[432,546,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575],{"class":434,"line":435},[432,548,439],{"class":438},[432,550,443],{"class":442},[432,552,446],{"class":438},[432,554,450],{"class":449},[432,556,454],{"class":453},[432,558,458],{"class":457},[432,560,462],{"class":461},[432,562,465],{"class":457},[432,564,468],{"class":438},[432,566,471],{"class":449},[432,568,454],{"class":453},[432,570,477],{"class":476},[432,572,421],{"class":438},[432,574,482],{"class":476},[432,576,485],{"class":438},[432,578,579,581,583,585,587,589],{"class":434,"line":488},[432,580,491],{"class":442},[432,582,494],{"class":442},[432,584,498],{"class":497},[432,586,501],{"class":442},[432,588,504],{"class":497},[432,590,507],{"class":438},[432,592,593,596,599,601,604,606,609,612,614,616],{"class":434,"line":399},[432,594,595],{"class":438},"  @",[432,597,598],{"class":442},"Property",[432,600,446],{"class":438},[432,602,603],{"class":449},"types",[432,605,454],{"class":453},[432,607,608],{"class":438}," {",[432,610,611],{"class":476},"String",[432,613,421],{"class":438},[432,615,482],{"class":476},[432,617,618],{"class":438},"})\n",[432,620,621,624,628,631],{"class":434,"line":515},[432,622,623],{"class":442},"  private",[432,625,627],{"class":626},"s_bVq"," String",[432,629,630],{"class":476}," myCustomString",[432,632,633],{"class":438},";\n",[432,635,637],{"class":434,"line":636},5,[432,638,518],{"class":438},[410,640,641,642,645,646,648,649,653,654,657],{},"The ",[414,643,644],{},"@Property(types = Class\u003C?>...)"," annotation is used to explicitly specify the type that you want to store.",[523,647],{},"\nVital ",[650,651,652],"strong",{},"CAN"," implicitly ",[650,655,656],{},"guess"," the type if you omit the parameter, but generally this isn't recommended.",[410,659,660],{},"The annotation is especially relevant if you need to store more complex types, like a list, a map, or your own custom type.",[662,663],"hr",{},[410,665,666,667,669,670,421],{},"Simply write to your field (via a setter, or directly).",[523,668],{},"\nIf you want to save your data to your config file, simply call ",[414,671,672],{},"save()",[410,674,675,676,678],{},"Vital will automatically convert all of your fields annotated with ",[414,677,539],{}," to a serialized object and save it to your config file.",[530,680,682],{"id":681},"custom-types","Custom types",[410,684,685,686,688],{},"You can also store your own custom data types in your configs.",[523,687],{},"\nSimply add your custom data type to your config as a new field.",[423,690,692],{"className":425,"code":691,"filename":427,"language":428,"meta":99,"style":99},"@VitalConfig.Info(name = \"myconfig.yaml\", processor = VitalYAMLConfigProcessor.class)\npublic class MyConfig extends VitalConfig {\n  @Property(types = {MyCustomObject.class})\n  private MyCustomObject myCustomObject;\n}\n",[414,693,694,726,740,763,775],{"__ignoreMap":99},[432,695,696,698,700,702,704,706,708,710,712,714,716,718,720,722,724],{"class":434,"line":435},[432,697,439],{"class":438},[432,699,443],{"class":442},[432,701,446],{"class":438},[432,703,450],{"class":449},[432,705,454],{"class":453},[432,707,458],{"class":457},[432,709,462],{"class":461},[432,711,465],{"class":457},[432,713,468],{"class":438},[432,715,471],{"class":449},[432,717,454],{"class":453},[432,719,477],{"class":476},[432,721,421],{"class":438},[432,723,482],{"class":476},[432,725,485],{"class":438},[432,727,728,730,732,734,736,738],{"class":434,"line":488},[432,729,491],{"class":442},[432,731,494],{"class":442},[432,733,498],{"class":497},[432,735,501],{"class":442},[432,737,504],{"class":497},[432,739,507],{"class":438},[432,741,742,744,746,748,750,752,754,757,759,761],{"class":434,"line":399},[432,743,595],{"class":438},[432,745,598],{"class":442},[432,747,446],{"class":438},[432,749,603],{"class":449},[432,751,454],{"class":453},[432,753,608],{"class":438},[432,755,756],{"class":476},"MyCustomObject",[432,758,421],{"class":438},[432,760,482],{"class":476},[432,762,618],{"class":438},[432,764,765,767,770,773],{"class":434,"line":515},[432,766,623],{"class":442},[432,768,769],{"class":626}," MyCustomObject",[432,771,772],{"class":476}," myCustomObject",[432,774,633],{"class":438},[432,776,777],{"class":434,"line":636},[432,778,518],{"class":438},[410,780,781,782,784,785,787],{},"And then make sure that your custom object type has a default constructor (a constructor without any parameters), so that Vital can create a new instance of your type when it needs to load your config.",[523,783],{},"\nAdditionally, all fields that you also want to store in your config on your custom object need to be annotated with ",[414,786,539],{}," as well.",[423,789,792],{"className":425,"code":790,"filename":791,"language":428,"meta":99,"style":99},"public class MyCustomObject {\n  @Property(types = {String.class})\n  private String myCustomObjectString;\n}\n","MyCustomObject.java",[414,793,794,804,826,837],{"__ignoreMap":99},[432,795,796,798,800,802],{"class":434,"line":435},[432,797,491],{"class":442},[432,799,494],{"class":442},[432,801,769],{"class":497},[432,803,507],{"class":438},[432,805,806,808,810,812,814,816,818,820,822,824],{"class":434,"line":488},[432,807,595],{"class":438},[432,809,598],{"class":442},[432,811,446],{"class":438},[432,813,603],{"class":449},[432,815,454],{"class":453},[432,817,608],{"class":438},[432,819,611],{"class":476},[432,821,421],{"class":438},[432,823,482],{"class":476},[432,825,618],{"class":438},[432,827,828,830,832,835],{"class":434,"line":399},[432,829,623],{"class":442},[432,831,627],{"class":626},[432,833,834],{"class":476}," myCustomObjectString",[432,836,633],{"class":438},[432,838,839],{"class":434,"line":515},[432,840,518],{"class":438},[842,843,844],"blockquote",{},[410,845,846,847,849],{},"Note that some config types, like properties, don't support such complex data structures and can only store simple data like strings, booleans and numbers.",[523,848],{},"\nIf you need to store more complex data, you might want to use a YAML file.",[851,852,853],"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 .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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}",{"title":99,"searchDepth":488,"depth":488,"links":855},[856,857],{"id":532,"depth":488,"text":533},{"id":681,"depth":488,"text":682},"This page explains how you can create a class-based config using `vital-configs`.","md",{},{"title":133},"---\ntitle: Configs\ndescription: This page explains how you can create a class-based config using `vital-configs`.\nnavigation:\n  title: Configs\n---\n\n# Configs\n\nA config will be a class that extends `VitalConfig` and is annotated with `@VitalConfig.Info`.\n```java [MyConfig.java]\n@VitalConfig.Info(name = \"myconfig.yaml\", processor = VitalYAMLConfigProcessor.class)\npublic class MyConfig extends VitalConfig {\n  \n}\n```\n\nFor every config, you define the name (path to your config, relative to your server.jar file) and the processor that should be used for your config.  \nVital currently supports two types of configs and provides a processor for each: YAML files and Properties files.\n\nBased on what data you want to store and how you want to store it, you can choose the appropriate processor in your info annotation.\n\n## Storing data\n\nTo store data, simply create a new field in your config class and annotate it with `@Property`.\n\n```java [MyConfig.java]\n@VitalConfig.Info(name = \"myconfig.yaml\", processor = VitalYAMLConfigProcessor.class)\npublic class MyConfig extends VitalConfig {\n  @Property(types = {String.class})\n  private String myCustomString;\n}\n```\n\nThe `@Property(types = Class\u003C?>...)` annotation is used to explicitly specify the type that you want to store.  \nVital **CAN** implicitly **guess** the type if you omit the parameter, but generally this isn't recommended.\n\nThe annotation is especially relevant if you need to store more complex types, like a list, a map, or your own custom type.\n\n---\n\nSimply write to your field (via a setter, or directly).  \nIf you want to save your data to your config file, simply call `save()`.\n\nVital will automatically convert all of your fields annotated with `@Property` to a serialized object and save it to your config file.  \n\n## Custom types\n\nYou can also store your own custom data types in your configs.  \nSimply add your custom data type to your config as a new field.\n\n```java [MyConfig.java]\n@VitalConfig.Info(name = \"myconfig.yaml\", processor = VitalYAMLConfigProcessor.class)\npublic class MyConfig extends VitalConfig {\n  @Property(types = {MyCustomObject.class})\n  private MyCustomObject myCustomObject;\n}\n```\n\nAnd then make sure that your custom object type has a default constructor (a constructor without any parameters), so that Vital can create a new instance of your type when it needs to load your config.  \nAdditionally, all fields that you also want to store in your config on your custom object need to be annotated with `@Property` as well.\n\n```java [MyCustomObject.java]\npublic class MyCustomObject {\n  @Property(types = {String.class})\n  private String myCustomObjectString;\n}\n```\n\n> Note that some config types, like properties, don't support such complex data structures and can only store simple data like strings, booleans and numbers.  \n> If you need to store more complex data, you might want to use a YAML file.\n",{"title":133,"description":858},"ScRnbWm5fLYKwC0tgwxGSvvx1KTVHpZP-nOQS9JfgKc",1789308658758]