Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
diff --git a/assets/js/036fc41e.f755e690.js b/assets/js/036fc41e.f755e690.js
new file mode 100644
index 0000000..84bb34e
--- /dev/null
+++ b/assets/js/036fc41e.f755e690.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[882],{2211:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>a});var n=t(5893),i=t(1151);const s={sidebar_position:13},r="Configuration",l={id:"curios/configuration",title:"Configuration",description:"Curios has various configuration files that can be used to change settings related to the user interface, curios",source:"@site/docs/curios/configuration.md",sourceDirName:"curios",slug:"/curios/configuration",permalink:"/curios/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/configuration.md",tags:[],version:"current",sidebarPosition:13,frontMatter:{sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"ICurioRenderer",permalink:"/curios/api/renderer-interface"},next:{title:"Commands",permalink:"/curios/commands"}},d={},a=[{value:"Slot Configuration",id:"slot-configuration",level:2},{value:"Syntax",id:"syntax",level:3},{value:"id (string, required)",id:"id-string-required",level:4},{value:"size (integer)",id:"size-integer",level:4},{value:"operation ("SET"|"ADD"|"REMOVE")",id:"operation-setaddremove",level:4},{value:"order (integer)",id:"order-integer",level:4},{value:"icon (string)",id:"icon-string",level:4},{value:"add_cosmetic (boolean)",id:"add_cosmetic-boolean",level:4},{value:"use_native_gui (boolean)",id:"use_native_gui-boolean",level:4},{value:"render_toggle (boolean)",id:"render_toggle-boolean",level:4},{value:"drop_rule ("DEFAULT"|"ALWAYS_DROP"|"ALWAYS_KEEP"|"DESTROY")",id:"drop_rule-defaultalways_dropalways_keepdestroy",level:4},{value:"Example",id:"example",level:3}];function c(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",strong:"strong",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h1,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsx)(o.p,{children:"Curios has various configuration files that can be used to change settings related to the user interface, curios\nbehavior, and more."}),"\n",(0,n.jsx)(o.h2,{id:"slot-configuration",children:"Slot Configuration"}),"\n",(0,n.jsxs)(o.p,{children:["Although the datapack method described in the ",(0,n.jsx)(o.a,{href:"/curios/slots/slot-register",children:"slot types"})," page is the recommended method for\nall consumers, users who are not familiar with datapacks or do not need the features of the format are able to create\nand modify slots through the Curios configuration file."]}),"\n",(0,n.jsxs)(o.p,{children:["This configuration is located in the ",(0,n.jsx)(o.code,{children:"curios-common.toml"})," configuration file found in the ",(0,n.jsx)(o.code,{children:"config"})," folder of the user's\nroot Minecraft instance."]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-toml",children:"#List of slots to create or modify.\nslots = []\n"})}),"\n",(0,n.jsx)(o.p,{children:"The slots list will be empty at first. Users can define a slot entry by inputting a string entry into the array. All\nslots that are defined in this setting will automatically be assigned to players if they are not already assigned."}),"\n",(0,n.jsx)(o.admonition,{type:"note",children:(0,n.jsx)(o.p,{children:"This setting is loaded server-side only and synced to clients. Servers can change this setting without updating clients\nand clients will receive the proper slots upon joining."})}),"\n",(0,n.jsx)(o.h3,{id:"syntax",children:"Syntax"}),"\n",(0,n.jsxs)(o.p,{children:["Each entry must include an ",(0,n.jsx)(o.code,{children:"id"})," field that represents the identifier of the slot type, and fields in the entry must be\nseparated by semicolons. The following fields are available for use through the configuration file:"]}),"\n",(0,n.jsxs)(o.h4,{id:"id-string-required",children:[(0,n.jsx)(o.strong,{children:"id"})," (string, ",(0,n.jsx)(o.em,{children:"required"}),")"]}),"\n",(0,n.jsx)(o.p,{children:"The identifier for the slot type to create or modify."}),"\n",(0,n.jsxs)(o.h4,{id:"size-integer",children:[(0,n.jsx)(o.strong,{children:"size"})," (integer)"]}),"\n",(0,n.jsx)(o.p,{children:"The number of slots of this slot type to give by default."}),"\n",(0,n.jsxs)(o.h4,{id:"operation-setaddremove",children:[(0,n.jsx)(o.strong,{children:"operation"})," (",(0,n.jsx)(o.code,{children:'"SET"'}),"|",(0,n.jsx)(o.code,{children:'"ADD"'}),"|",(0,n.jsx)(o.code,{children:'"REMOVE"'}),")"]}),"\n",(0,n.jsxs)(o.p,{children:["Whether to use ",(0,n.jsx)(o.code,{children:"size"})," to set, add, or remove from the total number of slots."]}),"\n",(0,n.jsxs)(o.h4,{id:"order-integer",children:[(0,n.jsx)(o.strong,{children:"order"})," (integer)"]}),"\n",(0,n.jsx)(o.p,{children:"The order the slots will appear in the native Curios GUI, lower numbers appear first."}),"\n",(0,n.jsxs)(o.h4,{id:"icon-string",children:[(0,n.jsx)(o.strong,{children:"icon"})," (string)"]}),"\n",(0,n.jsx)(o.p,{children:"The location of the icon to use for the slot type."}),"\n",(0,n.jsxs)(o.h4,{id:"add_cosmetic-boolean",children:[(0,n.jsx)(o.strong,{children:"add_cosmetic"})," (boolean)"]}),"\n",(0,n.jsx)(o.p,{children:"The location of the icon to use for the slot type."}),"\n",(0,n.jsxs)(o.h4,{id:"use_native_gui-boolean",children:[(0,n.jsx)(o.strong,{children:"use_native_gui"})," (boolean)"]}),"\n",(0,n.jsxs)(o.p,{children:["When ",(0,n.jsx)(o.code,{children:"false"}),", does not add the slot type to the native Curios GUI."]}),"\n",(0,n.jsxs)(o.h4,{id:"render_toggle-boolean",children:[(0,n.jsx)(o.strong,{children:"render_toggle"})," (boolean)"]}),"\n",(0,n.jsxs)(o.p,{children:["When ",(0,n.jsx)(o.code,{children:"false"}),", does not allow the slot type to toggle its rendering."]}),"\n",(0,n.jsxs)(o.h4,{id:"drop_rule-defaultalways_dropalways_keepdestroy",children:[(0,n.jsx)(o.strong,{children:"drop_rule"})," (",(0,n.jsx)(o.code,{children:'"DEFAULT"'}),"|",(0,n.jsx)(o.code,{children:'"ALWAYS_DROP"'}),"|",(0,n.jsx)(o.code,{children:'"ALWAYS_KEEP"'}),"|",(0,n.jsx)(o.code,{children:'"DESTROY"'}),")"]}),"\n",(0,n.jsxs)(o.p,{children:["Whether to drop, keep, destroy, or follow the ",(0,n.jsx)(o.code,{children:"keepCurios"})," configuration setting."]}),"\n",(0,n.jsx)(o.h3,{id:"example",children:"Example"}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-toml",children:'slots = ["id=ring;size=10", "id=charm;size=3;add_cosmetic=true"]\n'})}),"\n",(0,n.jsxs)(o.p,{children:["This setting will create or modify two slot types, ",(0,n.jsx)(o.code,{children:'"ring"'})," and ",(0,n.jsx)(o.code,{children:'"charm"'}),", and assign both of them to all players. The\nring slot type will be created at size 10, and the charm slot type will be created at size 3 while also adding cosmetic\nslots for them. These settings will override any settings from the datapack configurations as described in the main\n",(0,n.jsx)(o.a,{href:"/curios/slots/slot-register",children:"slot types page"}),"."]})]})}function h(e={}){const{wrapper:o}={...(0,i.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,o,t)=>{t.d(o,{Z:()=>l,a:()=>r});var n=t(7294);const i={},s=n.createContext(i);function r(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function l(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/09965537.4ba6a38e.js b/assets/js/09965537.5f34f1c3.js
similarity index 76%
rename from assets/js/09965537.4ba6a38e.js
rename to assets/js/09965537.5f34f1c3.js
index ceea7a0..c25dd0d 100644
--- a/assets/js/09965537.4ba6a38e.js
+++ b/assets/js/09965537.5f34f1c3.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[131],{7616:e=>{e.exports=JSON.parse('{"title":"Curios","description":"A Minecraft mod introducing a flexible and expandable accessory/equipment API for users and developers.","slug":"/category/curios","permalink":"/category/curios","navigation":{"previous":{"title":"Overview","permalink":"/"},"next":{"title":"Registering and Editing Slot Types","permalink":"/curios/slot-register"}}}')}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[131],{7616:e=>{e.exports=JSON.parse('{"title":"Curios","description":"A Minecraft mod introducing a flexible and expandable accessory/equipment API for users and developers.","slug":"/category/curios","permalink":"/category/curios","navigation":{"previous":{"title":"Overview","permalink":"/"},"next":{"title":"Setting Up the Development Environment","permalink":"/curios/getting-started"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/141528fa.e38fb020.js b/assets/js/141528fa.e38fb020.js
new file mode 100644
index 0000000..c2fa983
--- /dev/null
+++ b/assets/js/141528fa.e38fb020.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[596],{5216:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var o=i(5893),s=i(1151);const n={sidebar_position:12},r="Curios Attribute Modifiers (NBT)",a={id:"curios/items/curios-nbt",title:"Curios Attribute Modifiers (NBT)",description:"A tutorial on how to edit a curio item's NBT data to add attribute modifiers when the item is worn in a curio slot.",source:"@site/docs/curios/items/curios-nbt.md",sourceDirName:"curios/items",slug:"/curios/items/curios-nbt",permalink:"/curios/items/curios-nbt",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/items/curios-nbt.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Rendering a Curio",permalink:"/curios/items/rendering-registry"},next:{title:"Inventory",permalink:"/category/inventory"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Syntax",id:"syntax",level:2}];function u(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"curios-attribute-modifiers-nbt",children:"Curios Attribute Modifiers (NBT)"}),"\n",(0,o.jsx)(t.p,{children:"A tutorial on how to edit a curio item's NBT data to add attribute modifiers when the item is worn in a curio slot."}),"\n",(0,o.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.p,{children:"Attribute modifiers used in item NBT for regular equipment slots will not work with curio slots. This is because the\nattribute modifiers are coded to work only in specific slots, and it will not recognize the custom curio slots. In order\nto grant this functionality, Curios adds its own method of adding NBT attribute modifiers in items."}),"\n",(0,o.jsxs)(t.p,{children:["The format for Curios is almost exactly the same as Minecraft, so it is recommended to look through this ",(0,o.jsx)(t.a,{href:"https://minecraft.fandom.com/wiki/Attribute",children:"Attribute Guide"}),"\nfor extended information about attribute names, syntax, and possible fields. This guide will only go over the\ndifferences in Curios."]}),"\n",(0,o.jsx)(t.h2,{id:"syntax",children:"Syntax"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.p,{children:"This is the vanilla way of adding an attribute modifier to the chest slot in an item's NBT:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:'/give @s netherite_chestplate{AttributeModifiers:[{Slot:"chest", AttributeName:"generic.attack_damage", Name:"generic.attack_damage", Amount:20.0, Operation:0, UUID:[I; 42853, 1689024593, -201178, -1559272105]}]} 1\n'})}),"\n",(0,o.jsx)(t.p,{children:"This is the Curios way of achieving the same in the body slot:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:'/give @s netherite_chestplate{CurioAttributeModifiers:[{Slot:"body", AttributeName:"generic.attack_damage", Name:"generic.attack_damage", Amount:20.0, Operation:0}]} 1\n'})}),"\n",(0,o.jsxs)(t.p,{children:["Note that the main differences are the change from ",(0,o.jsx)(t.code,{children:"AttributeModifiers"})," to ",(0,o.jsx)(t.code,{children:"CurioAttributeModifiers"})," and the change in\nthe slot name. The slot name should be the ",(0,o.jsx)(t.code,{children:"identifier"})," of a registered slot type."]}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsx)(t.p,{children:"It is recommended that the UUID be left out except for special circumstances. When absent, Curios will give the attribute\nmodifier a UUID based on the slot context which will prevent any stacking issues that could arise when multiple slots\nof the same type exist and the same attribute modifier is applied multiple times."})})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var o=i(7294);const s={},n=o.createContext(s);function r(e){const t=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(n.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1bf10563.4ceafe31.js b/assets/js/1bf10563.4ceafe31.js
deleted file mode 100644
index 9190346..0000000
--- a/assets/js/1bf10563.4ceafe31.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[268],{629:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=i(5893),r=i(1151),o=i(4866),a=i(5162);const s={sidebar_position:2},l="Creating a Curio",c={id:"curios/Developing with Curios/curio-creation",title:"Creating a Curio",description:"A tutorial on how to attach curio capabilities to your items.",source:"@site/docs/curios/Developing with Curios/curio-creation.mdx",sourceDirName:"curios/Developing with Curios",slug:"/curios/Developing with Curios/curio-creation",permalink:"/curios/Developing with Curios/curio-creation",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/Developing with Curios/curio-creation.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Setting Up the Development Environment",permalink:"/curios/Developing with Curios/getting-started"},next:{title:"Slot Modifiers",permalink:"/curios/Developing with Curios/slot-modifiers"}},u={},d=[{value:"Overview",id:"overview",level:2},{value:"Attaching an ICurio capability",id:"attaching-an-icurio-capability",level:2},{value:"Implementing the ICurioItem interface",id:"implementing-the-icurioitem-interface",level:2},{value:"Registering an ICurioItem implementation",id:"registering-an-icurioitem-implementation",level:2},{value:"Priority",id:"priority",level:2}];function h(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"creating-a-curio",children:"Creating a Curio"}),"\n",(0,n.jsx)(t.p,{children:"A tutorial on how to attach curio capabilities to your items."}),"\n",(0,n.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"Curios comes with interfaces that you can attach to your items in order to define certain behaviors for those items when\ninteracting with curios slots. This includes events such as ticking while in a curio slot or triggering certain actions\nwhen equipped or unequipped into a curio slot."}),"\n",(0,n.jsxs)(t.p,{children:["There are three main ways to implement the capability on your item: directly attaching an ",(0,n.jsx)(t.code,{children:"ICurio"})," implementation as a\ncapability, extending the ",(0,n.jsx)(t.code,{children:"ICurioItem"})," interface on your item, or registering an ",(0,n.jsx)(t.code,{children:"ICurioItem"})," implementation to an item."]}),"\n",(0,n.jsxs)(t.p,{children:["Only ",(0,n.jsx)(t.strong,{children:"one"})," of these methods needs to be implemented for the curio item to work."]}),"\n",(0,n.jsxs)(t.h2,{id:"attaching-an-icurio-capability",children:["Attaching an ",(0,n.jsx)(t.code,{children:"ICurio"})," capability"]}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsxs)(o.Z,{groupId:"modloader",children:[(0,n.jsxs)(a.Z,{value:"forge",label:"Forge",default:!0,children:[(0,n.jsx)(t.p,{children:"This is recommended for mods that are Forge-oriented, due to the use of capabilities, and want to attach the\ncapability optionally to their own items or another mod's items."}),(0,n.jsxs)(t.p,{children:["To attach the capability to your own items, override the ",(0,n.jsx)(t.code,{children:"IForgeItem#initCapabilities"})," method:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"@Override\npublic ICapabilityProvider initCapabilities(ItemStack stack, CompoundTag unused) {\n return CuriosApi.createCurioProvider(new ICurio() {\n \n @Override\n public ItemStack getStack() {\n return stack;\n }\n\n @Override\n public void curioTick(SlotContext slotContext) {\n // ticking logic here\n }\n });\n}\n"})}),(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"ICurio"})," implementation in the example can be replaced or extended by your own custom implementation. The\nimplementation can also exist in a separate class altogether as long as the instantiation is still done in the\n",(0,n.jsx)(t.code,{children:"IForgeItem#initCapabilities"})," method."]}),(0,n.jsxs)(t.p,{children:["To attach the capability to any item, including vanilla's and other mods', subscribe to the\n",(0,n.jsx)(t.code,{children:"AttachCapabilitiesEvent"})," and use its methods:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"@SubscribeEvent\npublic void attachCapabilities(AttachCapabilitiesEvent evt) {\n ItemStack stack = evt.getObject();\n Item item = stack.getItem();\n evt.addCapability(CuriosCapability.ID_ITEM, CuriosApi.createCurioProvider(new ICurio() {\n \n @Override\n public ItemStack getStack() {\n return stack;\n }\n \n @Override\n public void curioTick(SlotContext slotContext) {\n // ticking logic here\n }\n }));\n}\n"})}),(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsxs)(t.p,{children:["You will need to pass in the ",(0,n.jsx)(t.code,{children:"ItemStack"})," from the ",(0,n.jsx)(t.code,{children:"IForgeItem#initCapabilities"})," argument or the\n",(0,n.jsx)(t.code,{children:"AttachCapabilitiesEvent#getObject"})," result to the return of ",(0,n.jsx)(t.code,{children:"ICurio#getStack"})," as shown in the example. This makes sure\nthat the implementation receives the correct ",(0,n.jsx)(t.code,{children:"ItemStack"})," for further curios logic. Technically, ",(0,n.jsx)(t.code,{children:"ICurio#getStack"})," can\nreturn any stack if proxies are needed, but the use-case for that is outside the scope of this documentation."]})})]}),(0,n.jsxs)(a.Z,{value:"neoforge-2",label:"NeoForge 1.20.3+",default:!0,children:[(0,n.jsx)(t.p,{children:"This is recommended for mods that are NeoForge-oriented, due to the use of capabilities, and want to attach the\ncapability optionally to their own items or another mod's items."}),(0,n.jsxs)(t.p,{children:["To attach the capability to any item, including vanilla's and other mods', subscribe to the\n",(0,n.jsx)(t.code,{children:"RegisterCapabilitiesEvent"})," on the mod event bus and use its methods:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'@Mod("examplemod")\npublic class ExampleMod {\n\n public ExampleMod(IEventBus modEventBus) {\n modEventBus.addListener(this::registerCapabilities);\n }\n\n public void registerCapabilities(final RegisterCapabilitiesEvent evt) {\n evt.registerItem(\n CuriosCapability.ITEM,\n (stack, context) -> new ICurio() {\n\n @Override\n public ItemStack getStack() {\n return stack;\n }\n\n @Override\n public void curioTick(SlotContext slotContext) {\n // ticking logic here\n },\n ExampleMod.ITEM);\n }\n'})}),(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"ICurio"})," implementation in the example can be replaced or extended by your own custom implementation."]}),(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsxs)(t.p,{children:["You will need to pass in the ",(0,n.jsx)(t.code,{children:"ItemStack"})," from the ",(0,n.jsx)(t.code,{children:"(stack, context)"})," lambda in the ",(0,n.jsx)(t.code,{children:"RegisterCapabilitiesEvent#registerItem"}),"\nmethod to the return of ",(0,n.jsx)(t.code,{children:"ICurio#getStack"})," as shown in the example. This makes sure that the implementation receives the\ncorrect ",(0,n.jsx)(t.code,{children:"ItemStack"})," for further curios logic. Technically, ",(0,n.jsx)(t.code,{children:"ICurio#getStack"})," can return any stack if proxies are needed,\nbut the use-case for that is outside the scope of this documentation."]})})]})]}),"\n",(0,n.jsxs)(t.h2,{id:"implementing-the-icurioitem-interface",children:["Implementing the ",(0,n.jsx)(t.code,{children:"ICurioItem"})," interface"]}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"This is recommended for mods that want the simplest and most straightforward method, do not mind having Curios as a\nrequired dependency, and are only working with their own items."}),"\n",(0,n.jsxs)(t.p,{children:["To implement the ",(0,n.jsx)(t.code,{children:"ICurioItem"})," interface, simply implement it on your item class:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"public class CurioItem extends Item implements ICurioItem {\n\n public CurioItem() {\n super(new Item.Properties().stacksTo(1).defaultDurability(0));\n }\n\n @Override\n public void curioTick(SlotContext slotContext, ItemStack stack) {\n // ticking logic here\n }\n}\n"})}),"\n",(0,n.jsxs)(t.h2,{id:"registering-an-icurioitem-implementation",children:["Registering an ",(0,n.jsx)(t.code,{children:"ICurioItem"})," implementation"]}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"This is recommended for multi-loader mods as a platform-agnostic method of registering Curios behavior to their own\nitems or another mod's items that can be loaded optionally."}),"\n",(0,n.jsxs)(t.p,{children:["To register an ",(0,n.jsx)(t.code,{children:"ICurioItem"})," implementation, first create the implementation:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"public class CurioItem implements ICurioItem {\n\n @Override\n public void curioTick(SlotContext slotContext, ItemStack stack) {\n // ticking logic here\n }\n}\n"})}),"\n",(0,n.jsxs)(t.p,{children:["And then register it by using ",(0,n.jsx)(t.code,{children:"CurioApi#registerCurio"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"CuriosApi.registerCurio(CurioModItems.MY_ITEM, new CurioItem());\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Registration can occur at any time, but for simplicity can be called during the ",(0,n.jsx)(t.code,{children:"FMLCommonSetupEvent"})," phase during mod\nloading:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'@Mod("CurioMod")\npublic class CurioMod {\n\n public CurioMod() {\n final IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus();\n eventBus.addListener(this::setup);\n }\n\n private void setup(final FMLCommonSetupEvent evt) {\n CuriosApi.registerCurio(CurioModItems.MY_ITEM, new CurioItem());\n }\n}\n'})}),"\n",(0,n.jsx)(t.h2,{id:"priority",children:"Priority"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"In situations where multiple implementations are registered to the same item, there a few things to take note of:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Only one implementation will be used on any one item, any other implementations found will be ignored."}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"ICurio"})," capabilities initialized through ",(0,n.jsx)(t.code,{children:"IForgeItem#initCapabilities"})," will always be prioritized and other\nimplementations will be ignored."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"ICurioItem"})," implementations registered through ",(0,n.jsx)(t.code,{children:"CuriosApi#registerCurio"})," will be prioritized over ",(0,n.jsx)(t.code,{children:"ICurioItem"}),"\nimplementations directly on the item class."]}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},5162:(e,t,i)=>{i.d(t,{Z:()=>a});i(7294);var n=i(512);const r={tabItem:"tabItem_Ymn6"};var o=i(5893);function a(e){let{children:t,hidden:i,className:a}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.Z)(r.tabItem,a),hidden:i,children:t})}},4866:(e,t,i)=>{i.d(t,{Z:()=>I});var n=i(7294),r=i(512),o=i(2466),a=i(6550),s=i(469),l=i(1980),c=i(7392),u=i(12);function d(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:i}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:i,attributes:n,default:r}}=e;return{value:t,label:i,attributes:n,default:r}}))}(i);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function m(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:i}=e;const r=(0,a.k6)(),o=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l._X)(o),(0,n.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function g(e){const{defaultValue:t,queryString:i=!1,groupId:r}=e,o=h(e),[a,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=i.find((e=>e.default))??i[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[c,d]=p({queryString:i,groupId:r}),[g,b]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,u.Nk)(i);return[r,(0,n.useCallback)((e=>{i&&o.set(e)}),[i,o])]}({groupId:r}),v=(()=>{const e=c??g;return m({value:e,tabValues:o})?e:null})();(0,s.Z)((()=>{v&&l(v)}),[v]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)}),[d,b,o]),tabValues:o}}var b=i(2389);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(5893);function f(e){let{className:t,block:i,selectedValue:n,selectValue:a,tabValues:s}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,o.o5)(),u=e=>{const t=e.currentTarget,i=l.indexOf(t),r=s[i].value;r!==n&&(c(t),a(r))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":i},t),children:s.map((e=>{let{value:t,label:i,attributes:o}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:d,onClick:u,...o,className:(0,r.Z)("tabs__item",v.tabItem,o?.className,{"tabs__item--active":n===t}),children:i??t},t)}))})}function j(e){let{lazy:t,children:i,selectedValue:r}=e;const o=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function C(e){const t=g(e);return(0,x.jsxs)("div",{className:(0,r.Z)("tabs-container",v.tabList),children:[(0,x.jsx)(f,{...e,...t}),(0,x.jsx)(j,{...e,...t})]})}function I(e){const t=(0,b.Z)();return(0,x.jsx)(C,{...e,children:d(e.children)},String(t))}},1151:(e,t,i)=>{i.d(t,{Z:()=>s,a:()=>a});var n=i(7294);const r={},o=n.createContext(r);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/21ef5f27.ff91795f.js b/assets/js/21ef5f27.ff91795f.js
deleted file mode 100644
index bdab2ef..0000000
--- a/assets/js/21ef5f27.ff91795f.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[183],{1159:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>n,default:()=>h,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var r=t(5893),o=t(1151);const c={sidebar_position:10},n="Preset Slot Types",i={id:"curios/preset-slots",title:"Preset Slot Types",description:"A list of commonly used slot types that are already defined in Curios for developers to use.",source:"@site/docs/curios/preset-slots.md",sourceDirName:"curios",slug:"/curios/preset-slots",permalink:"/curios/preset-slots",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/preset-slots.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"Adding Custom Slot Textures",permalink:"/curios/slot-textures"},next:{title:"Example Datapack",permalink:"/curios/datapack-example"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Slot Types",id:"slot-types",level:2}];function a(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"preset-slot-types",children:"Preset Slot Types"}),"\n",(0,r.jsx)(s.p,{children:"A list of commonly used slot types that are already defined in Curios for developers to use."}),"\n",(0,r.jsx)(s.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsxs)(s.p,{children:["One of the benefits of using Curios is that multiple developers can share slot types between each other, allowing\nmechanics and items to cooperate seamlessly. As long as the ",(0,r.jsx)(s.code,{children:"identifier"})," for the slot type is the same, the slot types\nwill be merged together upon registration. To reduce the need for redundant code and data, Curios provides a preset\nlist of slot types that are commonly used in the modded community and should be favored over creating wholly unique slot\ntypes when applicable."]}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsx)(s.p,{children:"Although these slot types are provided by Curios, they are not active by default. A developer or user will still need to\ntake the proper steps to register the slot type(s) that they want in order to add them to the game."})}),"\n",(0,r.jsx)(s.h2,{id:"slot-types",children:"Slot Types"}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Identifier"}),(0,r.jsx)(s.th,{children:"Usage"}),(0,r.jsx)(s.th,{children:"Examples"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"curio"})}),(0,r.jsx)(s.td,{children:"Universal, able to equip or be equipped into any slot type"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/botania",children:"Botania"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"back"})}),(0,r.jsx)(s.td,{children:"Items worn on the back, such as capes or backpacks"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/backpacked",children:"Backpacked"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/bountifulbaubles",children:"BountifulBaubles"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/curious-elytra",children:"Elytra Slot"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/curious-shulker-boxes",children:"Shulker Box Slot"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"belt"})}),(0,r.jsx)(s.td,{children:"Items worn around the waist, such as belts or pouches"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/artifacts",children:"Artifacts"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/cyclic",children:"Cyclic"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/natures-aura",children:"Nature's Aura"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"body"})}),(0,r.jsx)(s.td,{children:"Items worn around the torso, such as cloaks or shirts"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/engineers-tools",children:"Engineer's Tools"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/reliquary-v1-3",children:"Reliquary"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bracelet"})}),(0,r.jsx)(s.td,{children:"Items worn around the wrist, such as bands or bracelets"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"charm"})}),(0,r.jsx)(s.td,{children:"Miscellaneous items, either held or not associated with a body part"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/angel-ring",children:"Angel Ring"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/curio-of-undying",children:"Charm of Undying"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/dark-utilities",children:"Dark Utilities"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"head"})}),(0,r.jsx)(s.td,{children:"Items worn on top of the head, such as crowns or hats"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/vanillatweaks",children:"VanillaTweaks"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"hands"})}),(0,r.jsx)(s.td,{children:"Items worn on hands, such as gloves or gauntlets"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/artifacts",children:"Artifacts"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/cyclic",children:"Cyclic"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"necklace"})}),(0,r.jsx)(s.td,{children:"Items worn around the neck, such as amulets or necklaces"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/azure-rpg-items",children:"Azure RPG Items"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/potion-capsule",children:"Potion Capsule"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ring"})}),(0,r.jsx)(s.td,{children:'Items worn on the "fingers", such as rings'}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/enigmatic-legacy",children:"Enigmatic Legacy"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/gobber",children:"Gobber"})]})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,o.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},1151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>n});var r=t(7294);const o={},c=r.createContext(o);function n(e){const s=r.useContext(c);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:n(e.components),r.createElement(c.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/27236a1a.7929d5a5.js b/assets/js/27236a1a.7929d5a5.js
deleted file mode 100644
index 64775bf..0000000
--- a/assets/js/27236a1a.7929d5a5.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[512],{8407:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>a,frontMatter:()=>d,metadata:()=>c,toc:()=>o});var t=n(5893),s=n(1151);const d={sidebar_position:1},r="ICurioRenderer",c={id:"curios/Developing with Curios/APIs/renderer-interface",title:"ICurioRenderer",description:"Methods",source:"@site/docs/curios/Developing with Curios/APIs/renderer-interface.md",sourceDirName:"curios/Developing with Curios/APIs",slug:"/curios/Developing with Curios/APIs/renderer-interface",permalink:"/curios/Developing with Curios/APIs/renderer-interface",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/Developing with Curios/APIs/renderer-interface.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Rendering a Curio",permalink:"/curios/Developing with Curios/rendering-registry"},next:{title:"Diet",permalink:"/category/diet"}},l={},o=[{value:"Methods",id:"methods",level:2},{value:"Reference",id:"reference",level:2},{value:"render()",id:"render",level:3},{value:"static translateIfSneaking()",id:"static-translateifsneaking",level:3},{value:"static rotateIfSneaking()",id:"static-rotateifsneaking",level:3},{value:"static followHeadRotations()",id:"static-followheadrotations",level:3},{value:"static followBodyRotations()",id:"static-followbodyrotations",level:3}];function h(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"icuriorenderer",children:(0,t.jsx)(i.code,{children:"ICurioRenderer"})}),"\n",(0,t.jsx)(i.h2,{id:"methods",children:"Methods"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"#reference",children:"Reference"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"#render",children:"render()"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"#static-translateifsneaking",children:"static translateIfSneaking()"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"#static-rotateifsneaking",children:"static rotateIfSneaking()"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"#static-followheadrotations",children:"static followHeadRotations()"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"#static-followbodyrotations",children:"static followBodyRotations()"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"reference",children:"Reference"}),"\n",(0,t.jsx)(i.h3,{id:"render",children:(0,t.jsx)(i.code,{children:"render()"})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsx)(i.p,{children:"Runs the rendering code when an associated item is equipped in a curio slot and the visibility of the rendering is\nenabled. An equipped cosmetic item will override the rendering of its related functional item."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Name"}),(0,t.jsx)(i.th,{children:"Type"}),(0,t.jsx)(i.th,{children:"Description"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"stack"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"ItemStack"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"ItemStack"})," being rendered"]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"slotContext"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"SlotContext"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"SlotContext"})," for the slot with the ",(0,t.jsx)(i.code,{children:"ItemStack"})," being rendered"]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"poseStack"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"PoseStack"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"PoseStack"})," passed from the parent ",(0,t.jsx)(i.code,{children:"RenderLayer"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"renderLayerParent"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"RenderLayerParent"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"RenderLayerParent"})," passed from the parent ",(0,t.jsx)(i.code,{children:"RenderLayer"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"light"})}),(0,t.jsx)(i.td,{children:"integer"}),(0,t.jsx)(i.td,{children:"Light value"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"limbSwing"})}),(0,t.jsx)(i.td,{children:"float"}),(0,t.jsx)(i.td,{children:"Limb swing value"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"limbSwingAmount"})}),(0,t.jsx)(i.td,{children:"float"}),(0,t.jsx)(i.td,{children:"Limb swing amount value"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"partialTicks"})}),(0,t.jsx)(i.td,{children:"float"}),(0,t.jsx)(i.td,{children:"Partial ticks value"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"ageInTicks"})}),(0,t.jsx)(i.td,{children:"float"}),(0,t.jsx)(i.td,{children:"Age in ticks value"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"netHeadYaw"})}),(0,t.jsx)(i.td,{children:"float"}),(0,t.jsx)(i.td,{children:"Net head yaw value"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"headPitch"})}),(0,t.jsx)(i.td,{children:"float"}),(0,t.jsx)(i.td,{children:"Head pitch value"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"static-translateifsneaking",children:(0,t.jsx)(i.code,{children:"static translateIfSneaking()"})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsxs)(i.p,{children:["Applies a translation to the given ",(0,t.jsx)(i.code,{children:"PoseStack"})," if the given ",(0,t.jsx)(i.code,{children:"LivingEntity"})," is crouching. This is called to have the\nrender appropriately adjust its positioning up or down based on the crouching status of the entity."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Name"}),(0,t.jsx)(i.th,{children:"Type"}),(0,t.jsx)(i.th,{children:"Description"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"poseStack"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"PoseStack"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"PoseStack"})," passed from the parent ",(0,t.jsx)(i.code,{children:"RenderLayer"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"livingEntity"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LivingEntity"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"LivingEntity"})," to check ",(0,t.jsx)(i.code,{children:"isCrouching()"})]})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"static-rotateifsneaking",children:(0,t.jsx)(i.code,{children:"static rotateIfSneaking()"})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsxs)(i.p,{children:["Applies a rotation to the given ",(0,t.jsx)(i.code,{children:"PoseStack"})," if the given ",(0,t.jsx)(i.code,{children:"LivingEntity"})," is crouching. This is called to have the\nrender appropriately adjust its rotations based on the crouching status of the entity. Specifically, these rotations\nare based on the body/torso rotations of the entity."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Name"}),(0,t.jsx)(i.th,{children:"Type"}),(0,t.jsx)(i.th,{children:"Description"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"poseStack"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"PoseStack"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"PoseStack"})," passed from the parent ",(0,t.jsx)(i.code,{children:"RenderLayer"})]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"livingEntity"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LivingEntity"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"LivingEntity"})," to check ",(0,t.jsx)(i.code,{children:"isCrouching()"})," and rotate around"]})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"static-followheadrotations",children:(0,t.jsx)(i.code,{children:"static followHeadRotations()"})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsxs)(i.p,{children:["Applies rotations to the given ",(0,t.jsx)(i.code,{children:"ModelPart"}),"s based on the given ",(0,t.jsx)(i.code,{children:"LivingEntity"})," and its head rotations. This is called to\nrender the model parts in alignment with the entity's head. This does nothing if the entity's renderer does not\nimplement ",(0,t.jsx)(i.code,{children:"LivingEntityRenderer"})," or if the model does not have a head inherited from the ",(0,t.jsx)(i.code,{children:"HumanoidModel"})," class."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Name"}),(0,t.jsx)(i.th,{children:"Type"}),(0,t.jsx)(i.th,{children:"Description"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"livingEntity"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LivingEntity"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"LivingEntity"})," to align the rotations around"]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"modelParts"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"ModelPart..."})}),(0,t.jsx)(i.td,{children:"List of model parts to align to the head movement"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"static-followbodyrotations",children:(0,t.jsx)(i.code,{children:"static followBodyRotations()"})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsxs)(i.p,{children:["Applies rotations to the given ",(0,t.jsx)(i.code,{children:"HumanoidModel"}),"s based on the given ",(0,t.jsx)(i.code,{children:"LivingEntity"})," and its rotations. This is called to\nrender the model parts in alignment with the entity's movements, such as their leg and arm movements when walking or\ninteracting with objects."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Name"}),(0,t.jsx)(i.th,{children:"Type"}),(0,t.jsx)(i.th,{children:"Description"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"livingEntity"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"LivingEntity"})}),(0,t.jsxs)(i.td,{children:[(0,t.jsx)(i.code,{children:"LivingEntity"})," to align the rotations around"]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"models"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"HumanoidModel..."})}),(0,t.jsx)(i.td,{children:"List of model parts to align to the body movement"})]})]})]})]})}function a(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>r});var t=n(7294);const s={},d=t.createContext(s);function r(e){const i=t.useContext(d);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(d.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2e6e5734.8b970756.js b/assets/js/2e6e5734.8b970756.js
new file mode 100644
index 0000000..a769854
--- /dev/null
+++ b/assets/js/2e6e5734.8b970756.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[805],{3841:e=>{e.exports=JSON.parse('{"title":"Items","description":"All about curio items and how to create or manage them.","slug":"/category/items","permalink":"/category/items","navigation":{"previous":{"title":"Example Datapack","permalink":"/curios/slots/datapack-example"},"next":{"title":"Creating a Curio","permalink":"/curios/items/curio-creation"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/3890de59.15866a4a.js b/assets/js/3890de59.15866a4a.js
deleted file mode 100644
index 469b830..0000000
--- a/assets/js/3890de59.15866a4a.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[895],{1757:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var s=n(5893),i=n(1151);const a={sidebar_position:11},o="Example Datapack",r={id:"curios/datapack-example",title:"Example Datapack",description:"An example datapack for configuring various curio mechanics, including adding slot types to entities and modifying",source:"@site/docs/curios/datapack-example.md",sourceDirName:"curios",slug:"/curios/datapack-example",permalink:"/curios/datapack-example",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/datapack-example.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Preset Slot Types",permalink:"/curios/preset-slots"},next:{title:"Curios Attribute Modifiers (NBT)",permalink:"/curios/curios-nbt"}},d={},l=[{value:"Getting Started",id:"getting-started",level:2},{value:"Registering a New Slot Type",id:"registering-a-new-slot-type",level:2},{value:"Modifying an Existing Slot Type",id:"modifying-an-existing-slot-type",level:2},{value:"Adding Slot Types to One or More Entities",id:"adding-slot-types-to-one-or-more-entities",level:2},{value:"Adding an Item to a Curio Slot",id:"adding-an-item-to-a-curio-slot",level:2},{value:"Activating the Datapack",id:"activating-the-datapack",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"example-datapack",children:"Example Datapack"}),"\n",(0,s.jsx)(t.p,{children:"An example datapack for configuring various curio mechanics, including adding slot types to entities and modifying\nexisting slot types."}),"\n",(0,s.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,s.jsxs)(t.p,{children:["First, download the ",(0,s.jsx)(t.a,{target:"_blank",href:n(1121).Z+"",children:"example datapack"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Unzip the file and there will be the following folder structure:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"|data\n--|curios\n --|tags\n --|items\n --|ring.json\n--|curios_example\n --|curios\n --|entities\n --|entities.json\n --|slots\n --|ring.json\n|pack.mcmeta\n"})}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:".mcmeta"})," file and ",(0,s.jsx)(t.code,{children:".json"})," files can be opened and edited in any text editor, such as Notepad."]}),"\n",(0,s.jsxs)(t.admonition,{type:"note",children:[(0,s.jsx)(t.p,{children:(0,s.jsxs)(t.strong,{children:["Why are there two folders for ",(0,s.jsx)(t.em,{children:"curios"})," and ",(0,s.jsx)(t.em,{children:"curios_example"}),"?"]})}),(0,s.jsxs)(t.p,{children:["The namespace used for this datapack is ",(0,s.jsx)(t.code,{children:"curios_example"}),". The ",(0,s.jsx)(t.code,{children:"curios_example"})," folder has a sub-folder called ",(0,s.jsx)(t.code,{children:"curios"}),"\nwhich houses the ",(0,s.jsx)(t.code,{children:"entities"})," and ",(0,s.jsx)(t.code,{children:"slots"})," folder. This is the custom data that is specifically for the Curios mod. On the\nother hand, the ",(0,s.jsx)(t.code,{children:"curios"})," folder that houses the ",(0,s.jsx)(t.code,{children:"tags"})," folder is using the name as a separate namespace for the purposes\nof adding item tags, which are read by vanilla."]})]}),"\n",(0,s.jsx)(t.h2,{id:"registering-a-new-slot-type",children:"Registering a New Slot Type"}),"\n",(0,s.jsxs)(t.p,{children:["Adding a new slot type is controlled by the ",(0,s.jsx)(t.code,{children:"data/curios_example/curios/slots/example.json"})," file:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'{\n "size": 1,\n "add_cosmetic": true\n}\n'})}),"\n",(0,s.jsx)(t.p,{children:"The file and file name specifies these properties for the slot type:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["The identifier for the slot type is ",(0,s.jsx)(t.code,{children:"example"}),", as denoted by the file name"]}),"\n",(0,s.jsxs)(t.li,{children:["The number of slots available is ",(0,s.jsx)(t.code,{children:"1"}),", as denoted by the ",(0,s.jsx)(t.code,{children:'"size"'})," field"]}),"\n",(0,s.jsxs)(t.li,{children:["Each slot of this slot type has an associated cosmetic slot, as denoted by the ",(0,s.jsx)(t.code,{children:'"add_cosmetic"'})," field"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["For more information on the fields and customization of slot types, please refer to ",(0,s.jsx)(t.a,{href:"/curios/slot-register",children:"the slot types page"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"modifying-an-existing-slot-type",children:"Modifying an Existing Slot Type"}),"\n",(0,s.jsxs)(t.p,{children:["Modifying an existing slot type is controlled by the ",(0,s.jsx)(t.code,{children:"data/curios_example/curios/slots/ring.json"})," file:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'{\n "size": 2,\n "add_cosmetic": true\n}\n'})}),"\n",(0,s.jsx)(t.p,{children:"The file and file name specifies these properties for the slot type:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["The identifier for the slot type to change is ",(0,s.jsx)(t.code,{children:"ring"}),", as denoted by the file name"]}),"\n",(0,s.jsxs)(t.li,{children:["The number of slots available is ",(0,s.jsx)(t.code,{children:"2"}),", as denoted by the ",(0,s.jsx)(t.code,{children:'"size"'})," field"]}),"\n",(0,s.jsxs)(t.li,{children:["Each slot of this slot type has an associated cosmetic slot, as denoted by the ",(0,s.jsx)(t.code,{children:'"add_cosmetic"'})," field"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Note that this is exactly the same syntax as registering a new slot type. This is because modifying and registering a\nslot type both have the exact same process, the difference solely being whether multiple files exist for the same slot\ntype or not."}),"\n",(0,s.jsxs)(t.p,{children:["For more information on how slot types are modified from multiple files, please refer to ",(0,s.jsx)(t.a,{href:"/curios/slot-register",children:"the slot types page"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"adding-slot-types-to-one-or-more-entities",children:"Adding Slot Types to One or More Entities"}),"\n",(0,s.jsxs)(t.p,{children:["Just creating the slot type isn't enough, as now it has to be added to one or more entities in order to appear anywhere.\nThis is configured by the ",(0,s.jsx)(t.code,{children:"data/curios_example/curios/entities/entities.json"})," file:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'{\n "entities": [\n "minecraft:player",\n "minecraft:armor_stand"\n ],\n "slots": [\n "back",\n "body",\n "belt",\n "bracelet",\n "charm",\n "curio",\n "example",\n "hands",\n "head",\n "necklace",\n "ring"\n ]\n}\n'})}),"\n",(0,s.jsx)(t.p,{children:"The file specifies these properties:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["The slots being given are all the ",(0,s.jsx)(t.a,{href:"/curios/preset-slots",children:"preset slot types"})," and the ",(0,s.jsx)(t.code,{children:"example"})," slot type created by this\ndatapack, as denoted by the ",(0,s.jsx)(t.code,{children:'"slots"'})," list"]}),"\n",(0,s.jsxs)(t.li,{children:["The entities being given slots are all players and armor stands, as denoted by the ",(0,s.jsx)(t.code,{children:'"entities"'})," list"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["For more information on the fields and customization of entity slots, please refer to ",(0,s.jsx)(t.a,{href:"/curios/entity-register",children:"the entity slots page"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"adding-an-item-to-a-curio-slot",children:"Adding an Item to a Curio Slot"}),"\n",(0,s.jsxs)(t.p,{children:["Items are added to slot types by adding them to the relevant item tag. In the example datapack, an item tag for the\n",(0,s.jsx)(t.code,{children:"ring"})," slot type is created at ",(0,s.jsx)(t.code,{children:"data/curios/tags/items/ring.json"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-json",children:'{\n "replace": false,\n "values": [\n "minecraft:diamond"\n ]\n}\n'})}),"\n",(0,s.jsxs)(t.p,{children:["The file name is the same as the identifier for the slot type and will be the name of the tag that is created. By\nsetting ",(0,s.jsx)(t.code,{children:"replace"})," to ",(0,s.jsx)(t.code,{children:"false"}),", the values are added to the tag instead of replacing them. Listing ",(0,s.jsx)(t.code,{children:"minecraft:diamond"})," in\nthe ",(0,s.jsx)(t.code,{children:"values"})," array will add the diamond item to the tag and consequently diamonds will be equippable in the ",(0,s.jsx)(t.code,{children:"ring"})," slots."]}),"\n",(0,s.jsxs)(t.p,{children:["For more information on tags and item tags, please refer to the ",(0,s.jsx)(t.a,{href:"https://minecraft.wiki/w/Tag",children:"page on the Minecraft wiki"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"activating-the-datapack",children:"Activating the Datapack"}),"\n",(0,s.jsxs)(t.p,{children:["Datapacks are created on a per-world basis and need to be placed in the ",(0,s.jsx)(t.code,{children:"datapacks"})," folder of the ",(0,s.jsx)(t.code,{children:"world"})," folder on a\ndedicated server or the ",(0,s.jsx)(t.code,{children:"saves/(World Name)"})," folder in single player. They should automatically be enabled upon loading\nthe datapack for the first time in the world."]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1121:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/files/curios_example-b9398f30472c661860955db867e85daa.zip"},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>o});var s=n(7294);const i={},a=s.createContext(i);function o(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3a36d978.8b966a18.js b/assets/js/3a36d978.8b966a18.js
new file mode 100644
index 0000000..5e77c2d
--- /dev/null
+++ b/assets/js/3a36d978.8b966a18.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[492],{6652:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>n,default:()=>h,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var r=t(5893),o=t(1151);const c={sidebar_position:5},n="Preset Slot Types",i={id:"curios/slots/preset-slots",title:"Preset Slot Types",description:"A list of commonly used slot types that are already defined in Curios for developers to use.",source:"@site/docs/curios/slots/preset-slots.md",sourceDirName:"curios/slots",slug:"/curios/slots/preset-slots",permalink:"/curios/slots/preset-slots",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/slots/preset-slots.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Entity Slot Types",permalink:"/curios/slots/entity-register"},next:{title:"Slot Icon Textures",permalink:"/curios/slots/slot-textures"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Slot Types",id:"slot-types",level:2}];function a(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.h1,{id:"preset-slot-types",children:"Preset Slot Types"}),"\n",(0,r.jsx)(s.p,{children:"A list of commonly used slot types that are already defined in Curios for developers to use."}),"\n",(0,r.jsx)(s.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsxs)(s.p,{children:["One of the benefits of using Curios is that multiple developers can share slot types between each other, allowing\nmechanics and items to cooperate seamlessly. As long as the ",(0,r.jsx)(s.code,{children:"identifier"})," for the slot type is the same, the slot types\nwill be merged together upon registration. To reduce the need for redundant code and data, Curios provides a preset\nlist of slot types that are commonly used in the modded community and should be favored over creating wholly unique slot\ntypes when applicable."]}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["Although these slot types are provided by Curios, they are not added to any entities by default. This needs to be done\nby the developer or user by ",(0,r.jsx)(s.a,{href:"/curios/slots/entity-register",children:"adding slot types to entities"}),"."]})}),"\n",(0,r.jsx)(s.h2,{id:"slot-types",children:"Slot Types"}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Identifier"}),(0,r.jsx)(s.th,{children:"Usage"}),(0,r.jsx)(s.th,{children:"Examples"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"curio"})}),(0,r.jsx)(s.td,{children:"Universal, able to equip or be equipped into any slot type"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/botania",children:"Botania"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"back"})}),(0,r.jsx)(s.td,{children:"Items worn on the back, such as capes or backpacks"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/backpacked",children:"Backpacked"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/bountifulbaubles",children:"BountifulBaubles"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/curious-elytra",children:"Elytra Slot"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/curious-shulker-boxes",children:"Shulker Box Slot"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"belt"})}),(0,r.jsx)(s.td,{children:"Items worn around the waist, such as belts or pouches"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/artifacts",children:"Artifacts"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/cyclic",children:"Cyclic"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/natures-aura",children:"Nature's Aura"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"body"})}),(0,r.jsx)(s.td,{children:"Items worn around the torso, such as cloaks or shirts"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/engineers-tools",children:"Engineer's Tools"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/reliquary-v1-3",children:"Reliquary"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"bracelet"})}),(0,r.jsx)(s.td,{children:"Items worn around the wrist, such as bands or bracelets"}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"charm"})}),(0,r.jsx)(s.td,{children:"Miscellaneous items, either held or not associated with a body part"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/angel-ring",children:"Angel Ring"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/curio-of-undying",children:"Charm of Undying"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/dark-utilities",children:"Dark Utilities"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"head"})}),(0,r.jsx)(s.td,{children:"Items worn on top of the head, such as crowns or hats"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/vanillatweaks",children:"VanillaTweaks"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"hands"})}),(0,r.jsx)(s.td,{children:"Items worn on hands, such as gloves or gauntlets"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/artifacts",children:"Artifacts"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/cyclic",children:"Cyclic"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"necklace"})}),(0,r.jsx)(s.td,{children:"Items worn around the neck, such as amulets or necklaces"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/azure-rpg-items",children:"Azure RPG Items"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/potion-capsule",children:"Potion Capsule"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ring"})}),(0,r.jsx)(s.td,{children:'Items worn on the "fingers", such as rings'}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/enigmatic-legacy",children:"Enigmatic Legacy"}),", ",(0,r.jsx)(s.a,{href:"https://www.curseforge.com/minecraft/mc-mods/gobber",children:"Gobber"})]})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,o.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},1151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>n});var r=t(7294);const o={},c=r.createContext(o);function n(e){const s=r.useContext(c);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:n(e.components),r.createElement(c.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/46c0d933.19808eaf.js b/assets/js/46c0d933.19808eaf.js
new file mode 100644
index 0000000..664cc11
--- /dev/null
+++ b/assets/js/46c0d933.19808eaf.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[577],{3781:t=>{t.exports=JSON.parse('{"title":"Slots","description":"All about curio slots and how to manage them.","slug":"/category/slots","permalink":"/category/slots","navigation":{"previous":{"title":"Setting Up the Development Environment","permalink":"/curios/getting-started"},"next":{"title":"Slot Types","permalink":"/curios/slots/slot-register"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/4c92833a.3e9f3bb6.js b/assets/js/4c92833a.3e9f3bb6.js
new file mode 100644
index 0000000..6c9359e
--- /dev/null
+++ b/assets/js/4c92833a.3e9f3bb6.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[270],{1119:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>t,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>o});var i=s(5893),l=s(1151);const r={sidebar_position:14},t="Commands",c={id:"curios/commands",title:"Commands",description:"A tutorial on the various commands available through Curios.",source:"@site/docs/curios/commands.md",sourceDirName:"curios",slug:"/curios/commands",permalink:"/curios/commands",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/commands.md",tags:[],version:"current",sidebarPosition:14,frontMatter:{sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"Configuration",permalink:"/curios/configuration"},next:{title:"Diet",permalink:"/category/diet"}},d={},o=[{value:"Command Guide",id:"command-guide",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Arguments",id:"arguments",level:2},{value:"Examples",id:"examples",level:2},{value:"Entity Selector Options",id:"entity-selector-options",level:2},{value:"Tag Format",id:"tag-format",level:3},{value:"Inverting",id:"inverting",level:3},{value:"Examples",id:"examples-1",level:3}];function h(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"commands",children:"Commands"}),"\n",(0,i.jsx)(n.p,{children:"A tutorial on the various commands available through Curios."}),"\n",(0,i.jsx)(n.h2,{id:"command-guide",children:"Command Guide"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Syntax"}),(0,i.jsx)(n.th,{children:"Meaning"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"plain text"})}),(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.strong,{children:"Enter this literally"}),", exactly as shown."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsxs)(n.td,{children:["An ",(0,i.jsx)(n.strong,{children:"argument"})," that should be replaced with an appropriate value."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"[entry]"})}),(0,i.jsxs)(n.td,{children:["This entry is ",(0,i.jsx)(n.strong,{children:"optional"}),"."]})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"syntax",children:"Syntax"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.p,{children:["All the commands begin with ",(0,i.jsx)(n.code,{children:"curios"})," and have the following options:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"list"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Outputs a list of slot identifiers, categorized by mod."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"replace with [amount]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Places the specified item in the specified slot on the target player."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"set [amount]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Sets a number of slots for the specified slot type on the target player."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"add [amount]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Adds a number of slots for the specified slot type on the target player."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"remove [amount]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Removes a number of slots for the specified slot type on the target player."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"clear [slotId]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Clears the specified slot type of all its items. If no slot type is specified, all curios items will be cleared."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"drop [slotId]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Drops all the items in the specified slot type. If no slot type is specified, all curios items will be dropped."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"reset "}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Resets the target player's curios inventory to its default slots, also clears all curios items."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"arguments",children:"Arguments"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:""}),": ",(0,i.jsx)(n.a,{href:"https://minecraft.fandom.com/wiki/Argument_types#minecraft:entity",children:"player"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specifies the player to perform the command on."}),"\n",(0,i.jsx)(n.li,{children:"Must be a player name, a target selector, or a UUID."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:""}),": ",(0,i.jsx)(n.a,{href:"https://minecraft.fandom.com/wiki/Argument_types#int",children:"int"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specifies the quantity of slots or items."}),"\n",(0,i.jsx)(n.li,{children:"Must be a whole number greater than or equal to 1."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:""}),": ",(0,i.jsx)(n.a,{href:"https://minecraft.fandom.com/wiki/Argument_types#int",children:"int"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specifies the index within the slot type."}),"\n",(0,i.jsx)(n.li,{children:"Must be a whole number greater than or equal to 0."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:""}),": ",(0,i.jsx)(n.a,{href:"/curios/slots/slot-register",children:"slot_identifier"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specifies a slot type."}),"\n",(0,i.jsx)(n.li,{children:"Must be an identifier of a registered slot type."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["To add 3 ",(0,i.jsx)(n.code,{children:'"ring"'})," slots to a player:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"curios add ring Player123 1"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["To place a ",(0,i.jsx)(n.code,{children:'"minecraft:totem_of_undying"'})," item in the first ",(0,i.jsx)(n.code,{children:'"charm"'})," slot found on a player:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"curios replace charm 0 Player123 with minecraft:totem_of_undying 1"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"entity-selector-options",children:"Entity Selector Options"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.p,{children:"Curios has a custom entity selector option to use with commands that target entities, such as @a or @p."}),"\n",(0,i.jsxs)(n.p,{children:["The option starts with curios= and takes in a single ",(0,i.jsx)(n.strong,{children:"CompoundTag"})," as an argument. A blank tag would be ",(0,i.jsx)(n.code,{children:"curios={}"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"tag-format",children:"Tag Format"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"CompoundTag"})," has the following fields:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"item"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"required:"})," false"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"type:"})," ",(0,i.jsx)(n.strong,{children:"CompoundTag"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"description:"})," Denotes an item to match in the target's curios inventory."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'curios={item:{id:"minecraft:glass_bottle"}}'})}),"\n",(0,i.jsxs)(n.li,{children:["This will search for a ",(0,i.jsx)(n.code,{children:"minecraft:glass_bottle"})," in the target's curios inventory."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"slot"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"required:"})," false"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"type:"})," string[]"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"description:"})," Denotes a slot type to search in the target's curios inventory."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'curios={slot:["ring"]}'})}),"\n",(0,i.jsxs)(n.li,{children:["This will search for ",(0,i.jsx)(n.code,{children:'"ring"'})," slots in the target's curios inventory."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"index"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"required:"})," false"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"type:"})," int[min, max]"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"description:"})," Denotes the indices in slots to search in the target's curios inventory."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"curios={index:[0,1]}"})}),"\n",(0,i.jsx)(n.li,{children:"This will search for the first index of each slot type in the target's curios inventory."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"exclusive"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"required:"})," false"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"type:"})," boolean"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"description:"})," Denotes whether the selector is searching for only one match."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'curios={slot:["ring"],exclusive:true}'})}),"\n",(0,i.jsxs)(n.li,{children:["This will search for ",(0,i.jsx)(n.code,{children:'"ring"'})," slots in the target's curios inventory but will not return a match if any other slot type is found in the inventory as well."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"inverting",children:"Inverting"}),"\n",(0,i.jsxs)(n.p,{children:["The selector option also supports inverting. Placing a ",(0,i.jsx)(n.code,{children:"!"})," before the ",(0,i.jsx)(n.strong,{children:"CompoundTag"})," will invert the search.\nFor example, ",(0,i.jsx)(n.code,{children:'curios=!{slot:["ring"]}'})," will search for targets that do ",(0,i.jsx)(n.em,{children:"not"})," have ",(0,i.jsx)(n.code,{children:'"ring"'})," slots in their curios inventory."]}),"\n",(0,i.jsx)(n.h3,{id:"examples-1",children:"Examples"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To kill all players who have a ",(0,i.jsx)(n.code,{children:"minecraft:glass_bottle"})," in a ",(0,i.jsx)(n.code,{children:'"ring"'})," slot of the curios inventory:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'/kill @a[curios={item:{id:"minecraft:glass_bottle"},slot:["ring"]}]'})}),"\n"]}),"\n"]}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>c,a:()=>t});var i=s(7294);const l={},r=i.createContext(l);function t(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:t(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/4c92833a.b0943cf9.js b/assets/js/4c92833a.b0943cf9.js
deleted file mode 100644
index 19aeeb0..0000000
--- a/assets/js/4c92833a.b0943cf9.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[270],{1119:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>t,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>o});var i=s(5893),l=s(1151);const r={sidebar_position:14},t="Commands",c={id:"curios/commands",title:"Commands",description:"A tutorial on the various commands available through Curios.",source:"@site/docs/curios/commands.md",sourceDirName:"curios",slug:"/curios/commands",permalink:"/curios/commands",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/commands.md",tags:[],version:"current",sidebarPosition:14,frontMatter:{sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"Curios Attribute Modifiers (NBT)",permalink:"/curios/curios-nbt"},next:{title:"Setting Up the Development Environment",permalink:"/curios/Developing with Curios/getting-started"}},d={},o=[{value:"Command Guide",id:"command-guide",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Arguments",id:"arguments",level:2},{value:"Examples",id:"examples",level:2},{value:"Entity Selector Options",id:"entity-selector-options",level:2},{value:"Tag Format",id:"tag-format",level:3},{value:"Inverting",id:"inverting",level:3},{value:"Examples",id:"examples-1",level:3}];function h(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"commands",children:"Commands"}),"\n",(0,i.jsx)(n.p,{children:"A tutorial on the various commands available through Curios."}),"\n",(0,i.jsx)(n.h2,{id:"command-guide",children:"Command Guide"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Syntax"}),(0,i.jsx)(n.th,{children:"Meaning"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"plain text"})}),(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.strong,{children:"Enter this literally"}),", exactly as shown."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsxs)(n.td,{children:["An ",(0,i.jsx)(n.strong,{children:"argument"})," that should be replaced with an appropriate value."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"[entry]"})}),(0,i.jsxs)(n.td,{children:["This entry is ",(0,i.jsx)(n.strong,{children:"optional"}),"."]})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"syntax",children:"Syntax"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.p,{children:["All the commands begin with ",(0,i.jsx)(n.code,{children:"curios"})," and have the following options:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"list"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Outputs a list of slot identifiers, categorized by mod."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"replace with [amount]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Places the specified item in the specified slot on the target player."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"set [amount]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Sets a number of slots for the specified slot type on the target player."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"add [amount]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Adds a number of slots for the specified slot type on the target player."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"remove [amount]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Removes a number of slots for the specified slot type on the target player."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"clear [slotId]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Clears the specified slot type of all its items. If no slot type is specified, all curios items will be cleared."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"drop [slotId]"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Drops all the items in the specified slot type. If no slot type is specified, all curios items will be dropped."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"reset "}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Resets the target player's curios inventory to its default slots, also clears all curios items."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"arguments",children:"Arguments"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:""}),": ",(0,i.jsx)(n.a,{href:"https://minecraft.fandom.com/wiki/Argument_types#minecraft:entity",children:"player"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specifies the player to perform the command on."}),"\n",(0,i.jsx)(n.li,{children:"Must be a player name, a target selector, or a UUID."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:""}),": ",(0,i.jsx)(n.a,{href:"https://minecraft.fandom.com/wiki/Argument_types#int",children:"int"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specifies the quantity of slots or items."}),"\n",(0,i.jsx)(n.li,{children:"Must be a whole number greater than or equal to 1."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:""}),": ",(0,i.jsx)(n.a,{href:"https://minecraft.fandom.com/wiki/Argument_types#int",children:"int"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specifies the index within the slot type."}),"\n",(0,i.jsx)(n.li,{children:"Must be a whole number greater than or equal to 0."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:""}),": ",(0,i.jsx)(n.a,{href:"slot-register",children:"slot_identifier"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specifies a slot type."}),"\n",(0,i.jsx)(n.li,{children:"Must be an identifier of a registered slot type."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["To add 3 ",(0,i.jsx)(n.code,{children:'"ring"'})," slots to a player:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"curios add ring Player123 1"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["To place a ",(0,i.jsx)(n.code,{children:'"minecraft:totem_of_undying"'})," item in the first ",(0,i.jsx)(n.code,{children:'"charm"'})," slot found on a player:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"curios replace charm 0 Player123 with minecraft:totem_of_undying 1"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"entity-selector-options",children:"Entity Selector Options"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.p,{children:"Curios has a custom entity selector option to use with commands that target entities, such as @a or @p."}),"\n",(0,i.jsxs)(n.p,{children:["The option starts with curios= and takes in a single ",(0,i.jsx)(n.strong,{children:"CompoundTag"})," as an argument. A blank tag would be ",(0,i.jsx)(n.code,{children:"curios={}"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"tag-format",children:"Tag Format"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"CompoundTag"})," has the following fields:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"item"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"required:"})," false"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"type:"})," ",(0,i.jsx)(n.strong,{children:"CompoundTag"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"description:"})," Denotes an item to match in the target's curios inventory."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'curios={item:{id:"minecraft:glass_bottle"}}'})}),"\n",(0,i.jsxs)(n.li,{children:["This will search for a ",(0,i.jsx)(n.code,{children:"minecraft:glass_bottle"})," in the target's curios inventory."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"slot"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"required:"})," false"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"type:"})," string[]"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"description:"})," Denotes a slot type to search in the target's curios inventory."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'curios={slot:["ring"]}'})}),"\n",(0,i.jsxs)(n.li,{children:["This will search for ",(0,i.jsx)(n.code,{children:'"ring"'})," slots in the target's curios inventory."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"index"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"required:"})," false"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"type:"})," int[min, max]"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"description:"})," Denotes the indices in slots to search in the target's curios inventory."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"curios={index:[0,1]}"})}),"\n",(0,i.jsx)(n.li,{children:"This will search for the first index of each slot type in the target's curios inventory."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"exclusive"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"required:"})," false"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"type:"})," boolean"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"description:"})," Denotes whether the selector is searching for only one match."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'curios={slot:["ring"],exclusive:true}'})}),"\n",(0,i.jsxs)(n.li,{children:["This will search for ",(0,i.jsx)(n.code,{children:'"ring"'})," slots in the target's curios inventory but will not return a match if any other slot type is found in the inventory as well."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"inverting",children:"Inverting"}),"\n",(0,i.jsxs)(n.p,{children:["The selector option also supports inverting. Placing a ",(0,i.jsx)(n.code,{children:"!"})," before the ",(0,i.jsx)(n.strong,{children:"CompoundTag"})," will invert the search.\nFor example, ",(0,i.jsx)(n.code,{children:'curios=!{slot:["ring"]}'})," will search for targets that do ",(0,i.jsx)(n.em,{children:"not"})," have ",(0,i.jsx)(n.code,{children:'"ring"'})," slots in their curios inventory."]}),"\n",(0,i.jsx)(n.h3,{id:"examples-1",children:"Examples"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To kill all players who have a ",(0,i.jsx)(n.code,{children:"minecraft:glass_bottle"})," in a ",(0,i.jsx)(n.code,{children:'"ring"'})," slot of the curios inventory:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'/kill @a[curios={item:{id:"minecraft:glass_bottle"},slot:["ring"]}]'})}),"\n"]}),"\n"]}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>c,a:()=>t});var i=s(7294);const l={},r=i.createContext(l);function t(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:t(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/514a6b50.a4b38b2b.js b/assets/js/514a6b50.a4b38b2b.js
deleted file mode 100644
index bdbdccd..0000000
--- a/assets/js/514a6b50.a4b38b2b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[670],{169:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var o=s(5893),n=s(1151);const r={sidebar_position:5},i="Adding Custom Slot Textures",a={id:"curios/slot-textures",title:"Adding Custom Slot Textures",description:"A tutorial on how to add custom slot textures to slot types.",source:"@site/docs/curios/slot-textures.md",sourceDirName:"curios",slug:"/curios/slot-textures",permalink:"/curios/slot-textures",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/slot-textures.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Adding Slot Types to Entities",permalink:"/curios/entity-register"},next:{title:"Preset Slot Types",permalink:"/curios/preset-slots"}},c={},d=[{value:"Overview",id:"overview",level:2},{value:"Registering a Slot Texture",id:"registering-a-slot-texture",level:2},{value:"Using a Slot Texture",id:"using-a-slot-texture",level:2}];function l(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",img:"img",p:"p",pre:"pre",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"adding-custom-slot-textures",children:"Adding Custom Slot Textures"}),"\n",(0,o.jsx)(t.p,{children:"A tutorial on how to add custom slot textures to slot types."}),"\n",(0,o.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsxs)(t.p,{children:["Registering a new custom slot texture can be done through a resource pack. If you are\nunfamiliar with resource packs, it is recommended to read through the ",(0,o.jsx)(t.a,{href:"https://minecraft.fandom.com/wiki/Resource_pack",children:"wiki page"}),"\nin order to understand the concept and structure before proceeding to the rest of this page."]}),"\n",(0,o.jsx)(t.h2,{id:"registering-a-slot-texture",children:"Registering a Slot Texture"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsxs)(t.p,{children:["Create a new resource directory ",(0,o.jsx)(t.code,{children:"assets/(namespace)/textures/slot"})," and place any ",(0,o.jsx)(t.code,{children:".png"})," file in the ",(0,o.jsx)(t.code,{children:"slot"})," folder."]}),"\n",(0,o.jsxs)(t.admonition,{type:"info",children:[(0,o.jsx)(t.p,{children:"The image itself should be 16x16 in size and have a transparent background with only the slot texture drawn."}),(0,o.jsxs)(t.p,{children:["Example: ",(0,o.jsx)(t.img,{src:"https://github.com/TheIllusiveC4/Curios/blob/1.16.x-forge/src/main/resources/assets/curios/textures/item/empty_back_slot.png?raw=true",alt:""})]})]}),"\n",(0,o.jsx)(t.admonition,{type:"note",children:(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"(namespace)"})," field should be replaced by the namespace chosen for this portion of the resource pack. If this is a\npart of a mod, the namespace is usually the mod ID. If this is part of a user-defined resource pack, then the namespace\ncan be anything that is lowercased with no special characters."]})}),"\n",(0,o.jsx)(t.h2,{id:"using-a-slot-texture",children:"Using a Slot Texture"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsxs)(t.p,{children:["When entering the fields of the ",(0,o.jsx)(t.code,{children:".json"})," slot registration files as described in ",(0,o.jsx)(t.a,{href:"./slot-register",children:"Register a Slot Type"}),",\nthe ",(0,o.jsx)(t.code,{children:'"icon"'})," field should be set to the path of the slot that was added to the resource directory."]}),"\n",(0,o.jsxs)(t.p,{children:["For example, a ",(0,o.jsx)(t.code,{children:"empty_test_slot.png"})," file placed in ",(0,o.jsx)(t.code,{children:"assets/test/textures/slot"})," that wants to be added to the ",(0,o.jsx)(t.code,{children:"charm"}),"\nslot should have a ",(0,o.jsx)(t.code,{children:"charm.json"})," slot registration file in a datapack with the following contents:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-json",children:'{\n "icon": "test:slot/empty_test_slot"\n}\n'})}),"\n",(0,o.jsx)(t.admonition,{type:"caution",children:(0,o.jsxs)(t.p,{children:["Note that the path in ",(0,o.jsx)(t.code,{children:'"icon"'})," is not the entire path of the directory. It omits the ",(0,o.jsx)(t.code,{children:"texture"})," part and also omits the\n",(0,o.jsx)(t.code,{children:".png"})," extension. This is due to how Curios and Minecraft parses the icon, so make sure the path is formatted correctly\nwhen adding this field."]})})]})}function h(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>i});var o=s(7294);const n={},r=o.createContext(n);function i(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6e5aa4fa.5ab8692f.js b/assets/js/6e5aa4fa.5ab8692f.js
new file mode 100644
index 0000000..e3790e5
--- /dev/null
+++ b/assets/js/6e5aa4fa.5ab8692f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[499],{4888:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>a,frontMatter:()=>s,metadata:()=>c,toc:()=>o});var t=i(5893),d=i(1151);const s={sidebar_position:1},r="ICurioRenderer",c={id:"curios/api/renderer-interface",title:"ICurioRenderer",description:"Methods",source:"@site/docs/curios/api/renderer-interface.md",sourceDirName:"curios/api",slug:"/curios/api/renderer-interface",permalink:"/curios/api/renderer-interface",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/api/renderer-interface.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"API",permalink:"/category/api"},next:{title:"Configuration",permalink:"/curios/configuration"}},l={},o=[{value:"Methods",id:"methods",level:2},{value:"Reference",id:"reference",level:2},{value:"render()",id:"render",level:3},{value:"static translateIfSneaking()",id:"static-translateifsneaking",level:3},{value:"static rotateIfSneaking()",id:"static-rotateifsneaking",level:3},{value:"static followHeadRotations()",id:"static-followheadrotations",level:3},{value:"static followBodyRotations()",id:"static-followbodyrotations",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"icuriorenderer",children:(0,t.jsx)(n.code,{children:"ICurioRenderer"})}),"\n",(0,t.jsx)(n.h2,{id:"methods",children:"Methods"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"#reference",children:"Reference"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#render",children:"render()"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#static-translateifsneaking",children:"static translateIfSneaking()"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#static-rotateifsneaking",children:"static rotateIfSneaking()"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#static-followheadrotations",children:"static followHeadRotations()"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"#static-followbodyrotations",children:"static followBodyRotations()"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,t.jsx)(n.h3,{id:"render",children:(0,t.jsx)(n.code,{children:"render()"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.p,{children:"Runs the rendering code when an associated item is equipped in a curio slot and the visibility of the rendering is\nenabled. An equipped cosmetic item will override the rendering of its related functional item."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Name"}),(0,t.jsx)(n.th,{children:"Type"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"stack"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ItemStack"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"ItemStack"})," being rendered"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"slotContext"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SlotContext"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"SlotContext"})," for the slot with the ",(0,t.jsx)(n.code,{children:"ItemStack"})," being rendered"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"poseStack"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"PoseStack"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"PoseStack"})," passed from the parent ",(0,t.jsx)(n.code,{children:"RenderLayer"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"renderLayerParent"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"RenderLayerParent"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"RenderLayerParent"})," passed from the parent ",(0,t.jsx)(n.code,{children:"RenderLayer"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"light"})}),(0,t.jsx)(n.td,{children:"integer"}),(0,t.jsx)(n.td,{children:"Light value"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"limbSwing"})}),(0,t.jsx)(n.td,{children:"float"}),(0,t.jsx)(n.td,{children:"Limb swing value"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"limbSwingAmount"})}),(0,t.jsx)(n.td,{children:"float"}),(0,t.jsx)(n.td,{children:"Limb swing amount value"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"partialTicks"})}),(0,t.jsx)(n.td,{children:"float"}),(0,t.jsx)(n.td,{children:"Partial ticks value"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ageInTicks"})}),(0,t.jsx)(n.td,{children:"float"}),(0,t.jsx)(n.td,{children:"Age in ticks value"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"netHeadYaw"})}),(0,t.jsx)(n.td,{children:"float"}),(0,t.jsx)(n.td,{children:"Net head yaw value"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"headPitch"})}),(0,t.jsx)(n.td,{children:"float"}),(0,t.jsx)(n.td,{children:"Head pitch value"})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"static-translateifsneaking",children:(0,t.jsx)(n.code,{children:"static translateIfSneaking()"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:["Applies a translation to the given ",(0,t.jsx)(n.code,{children:"PoseStack"})," if the given ",(0,t.jsx)(n.code,{children:"LivingEntity"})," is crouching. This is called to have the\nrender appropriately adjust its positioning up or down based on the crouching status of the entity."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Name"}),(0,t.jsx)(n.th,{children:"Type"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"poseStack"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"PoseStack"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"PoseStack"})," passed from the parent ",(0,t.jsx)(n.code,{children:"RenderLayer"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"livingEntity"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LivingEntity"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"LivingEntity"})," to check ",(0,t.jsx)(n.code,{children:"isCrouching()"})]})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"static-rotateifsneaking",children:(0,t.jsx)(n.code,{children:"static rotateIfSneaking()"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:["Applies a rotation to the given ",(0,t.jsx)(n.code,{children:"PoseStack"})," if the given ",(0,t.jsx)(n.code,{children:"LivingEntity"})," is crouching. This is called to have the\nrender appropriately adjust its rotations based on the crouching status of the entity. Specifically, these rotations\nare based on the body/torso rotations of the entity."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Name"}),(0,t.jsx)(n.th,{children:"Type"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"poseStack"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"PoseStack"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"PoseStack"})," passed from the parent ",(0,t.jsx)(n.code,{children:"RenderLayer"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"livingEntity"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LivingEntity"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"LivingEntity"})," to check ",(0,t.jsx)(n.code,{children:"isCrouching()"})," and rotate around"]})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"static-followheadrotations",children:(0,t.jsx)(n.code,{children:"static followHeadRotations()"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:["Applies rotations to the given ",(0,t.jsx)(n.code,{children:"ModelPart"}),"s based on the given ",(0,t.jsx)(n.code,{children:"LivingEntity"})," and its head rotations. This is called to\nrender the model parts in alignment with the entity's head. This does nothing if the entity's renderer does not\nimplement ",(0,t.jsx)(n.code,{children:"LivingEntityRenderer"})," or if the model does not have a head inherited from the ",(0,t.jsx)(n.code,{children:"HumanoidModel"})," class."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Name"}),(0,t.jsx)(n.th,{children:"Type"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"livingEntity"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LivingEntity"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"LivingEntity"})," to align the rotations around"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"modelParts"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ModelPart..."})}),(0,t.jsx)(n.td,{children:"List of model parts to align to the head movement"})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"static-followbodyrotations",children:(0,t.jsx)(n.code,{children:"static followBodyRotations()"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:["Applies rotations to the given ",(0,t.jsx)(n.code,{children:"HumanoidModel"}),"s based on the given ",(0,t.jsx)(n.code,{children:"LivingEntity"})," and its rotations. This is called to\nrender the model parts in alignment with the entity's movements, such as their leg and arm movements when walking or\ninteracting with objects."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Parameters:"})}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Name"}),(0,t.jsx)(n.th,{children:"Type"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"livingEntity"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LivingEntity"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"LivingEntity"})," to align the rotations around"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"models"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"HumanoidModel..."})}),(0,t.jsx)(n.td,{children:"List of model parts to align to the body movement"})]})]})]})]})}function a(e={}){const{wrapper:n}={...(0,d.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>c,a:()=>r});var t=i(7294);const d={},s=t.createContext(d);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/71c056c1.eb08e33a.js b/assets/js/71c056c1.eb08e33a.js
new file mode 100644
index 0000000..e8c2d87
--- /dev/null
+++ b/assets/js/71c056c1.eb08e33a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[977],{7338:e=>{e.exports=JSON.parse('{"title":"Inventory","description":"All about the curio inventory and how to manage it.","slug":"/category/inventory","permalink":"/category/inventory","navigation":{"previous":{"title":"Curios Attribute Modifiers (NBT)","permalink":"/curios/items/curios-nbt"},"next":{"title":"Basic Inventory Management","permalink":"/curios/inventory/basic-inventory"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/78280e3d.f199502b.js b/assets/js/78280e3d.f199502b.js
deleted file mode 100644
index 2f3ddff..0000000
--- a/assets/js/78280e3d.f199502b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[143],{8462:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var n=i(5893),s=i(1151);const r={sidebar_position:3},o="Adding Slot Types to Entities",l={id:"curios/entity-register",title:"Adding Slot Types to Entities",description:"A tutorial on how to add registered slot types to entities.",source:"@site/docs/curios/entity-register.md",sourceDirName:"curios",slug:"/curios/entity-register",permalink:"/curios/entity-register",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/entity-register.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Registering and Editing Slot Types",permalink:"/curios/slot-register"},next:{title:"Adding Custom Slot Textures",permalink:"/curios/slot-textures"}},a={},d=[{value:"Overview",id:"overview",level:2},{value:"Directory",id:"directory",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Example",id:"example",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"adding-slot-types-to-entities",children:"Adding Slot Types to Entities"}),"\n",(0,n.jsx)(t.p,{children:"A tutorial on how to add registered slot types to entities."}),"\n",(0,n.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsxs)(t.p,{children:["Beginning in 1.20, the recommended way to add a registered slot type to an entity is through a datapack. If you are\nunfamiliar with datapacks, it is recommended to read through the ",(0,n.jsx)(t.a,{href:"https://minecraft.fandom.com/wiki/Data_pack",children:"wiki page"}),"\nin order to understand the concept and structure before proceeding to the rest of this page."]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"/curios/slot-register",children:"Registered slot types"})," will all be available for use but will not appear in-game until they are\nadded to one or more entities."]}),"\n",(0,n.jsx)(t.h2,{id:"directory",children:"Directory"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsxs)(t.p,{children:["The file should be a ",(0,n.jsx)(t.code,{children:".json"})," file located in the ",(0,n.jsx)(t.code,{children:"~/data/(namespace)/curios/entities/"})," folder of the datapack."]}),"\n",(0,n.jsxs)(t.admonition,{type:"note",children:[(0,n.jsx)(t.p,{children:"The file can be named anything."}),(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"(namespace)"})," field should be replaced by the namespace chosen for this portion of the datapack. If this is a part\nof a mod, the namespace is usually the mod ID. If this is part of a user-defined datapack, then the namespace can be\nanything that is lowercased with no special characters."]})]}),"\n",(0,n.jsx)(t.h2,{id:"syntax",children:"Syntax"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsxs)(t.p,{children:["The structure of the ",(0,n.jsx)(t.code,{children:".json"})," file for the entity configuration consists of a top-level JSON object that holds several\npotential fields."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"entities"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"An array of registry names of entity types or entity type tags."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"slots"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["An array of ",(0,n.jsx)(t.code,{children:"identifier"})," names for registered slot types."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"replace"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["A boolean, ",(0,n.jsx)(t.code,{children:"true"})," if the values listed in this file should replace values in lower-priority datapacks"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"conditions"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["An array of ",(0,n.jsx)(t.code,{children:"ICondition"})," implementations that must all pass before these slots are loaded into these entities"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"All the listed slots will be associated to all the listed entities."}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["Adding multiple of the same ",(0,n.jsx)(t.code,{children:"identifier"})," to the ",(0,n.jsx)(t.code,{children:"slots"})," array will ",(0,n.jsx)(t.strong,{children:"not"})," add multiple slots. Each entry in the ",(0,n.jsx)(t.code,{children:"slots"}),"\narray represents a ",(0,n.jsx)(t.a,{href:"/curios/slot-register",children:"registered slot type"})," and the entries do not stack, please refer to that page in\norder to change slot type behavior including default size."]})}),"\n",(0,n.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'{\n "entities": ["player", "minecraft:zombie"],\n "slots": ["head", "back"]\n}\n'})}),"\n",(0,n.jsxs)(t.p,{children:["This configuration will give two slot types, ",(0,n.jsx)(t.code,{children:"head"})," and ",(0,n.jsx)(t.code,{children:"back"}),", to all players and all zombies."]})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>l,a:()=>o});var n=i(7294);const s={},r=n.createContext(s);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/85ac19f8.6d43aa8c.js b/assets/js/85ac19f8.6d43aa8c.js
new file mode 100644
index 0000000..a6af48b
--- /dev/null
+++ b/assets/js/85ac19f8.6d43aa8c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[755],{8153:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>r,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>d});var n=s(5893),i=s(1151);const a={sidebar_position:17},o="Example Datapack",l={id:"curios/slots/datapack-example",title:"Example Datapack",description:"An example datapack for configuring various curio mechanics, including adding slot types to entities and modifying",source:"@site/docs/curios/slots/datapack-example.md",sourceDirName:"curios/slots",slug:"/curios/slots/datapack-example",permalink:"/curios/slots/datapack-example",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/slots/datapack-example.md",tags:[],version:"current",sidebarPosition:17,frontMatter:{sidebar_position:17},sidebar:"tutorialSidebar",previous:{title:"Data Generation",permalink:"/curios/slots/data-generation"},next:{title:"Items",permalink:"/category/items"}},r={},d=[{value:"Getting Started",id:"getting-started",level:2},{value:"Registering a New Slot Type",id:"registering-a-new-slot-type",level:2},{value:"Modifying an Existing Slot Type",id:"modifying-an-existing-slot-type",level:2},{value:"Adding Slot Types to One or More Entities",id:"adding-slot-types-to-one-or-more-entities",level:2},{value:"Adding an Item to a Curio Slot",id:"adding-an-item-to-a-curio-slot",level:2},{value:"Activating the Datapack",id:"activating-the-datapack",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"example-datapack",children:"Example Datapack"}),"\n",(0,n.jsx)(t.p,{children:"An example datapack for configuring various curio mechanics, including adding slot types to entities and modifying\nexisting slot types."}),"\n",(0,n.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,n.jsxs)(t.p,{children:["First, download the ",(0,n.jsx)(t.a,{target:"_blank",href:s(1121).Z+"",children:"example datapack"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Unzip the file and there will be the following folder structure:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"|data\n--|curios\n --|tags\n --|items\n --|ring.json\n--|curios_example\n --|curios\n --|entities\n --|entities.json\n --|slots\n --|ring.json\n|pack.mcmeta\n"})}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:".mcmeta"})," file and ",(0,n.jsx)(t.code,{children:".json"})," files can be opened and edited in any text editor, such as Notepad."]}),"\n",(0,n.jsxs)(t.admonition,{type:"note",children:[(0,n.jsx)(t.p,{children:(0,n.jsxs)(t.strong,{children:["Why are there two folders for ",(0,n.jsx)(t.em,{children:"curios"})," and ",(0,n.jsx)(t.em,{children:"curios_example"}),"?"]})}),(0,n.jsxs)(t.p,{children:["The namespace used for this datapack is ",(0,n.jsx)(t.code,{children:"curios_example"}),". The ",(0,n.jsx)(t.code,{children:"curios_example"})," folder has a sub-folder called ",(0,n.jsx)(t.code,{children:"curios"}),"\nwhich houses the ",(0,n.jsx)(t.code,{children:"entities"})," and ",(0,n.jsx)(t.code,{children:"slots"})," folder. This is the custom data that is specifically for the Curios mod. On the\nother hand, the ",(0,n.jsx)(t.code,{children:"curios"})," folder that houses the ",(0,n.jsx)(t.code,{children:"tags"})," folder is using the name as a separate namespace for the purposes\nof adding item tags, which are read by vanilla."]})]}),"\n",(0,n.jsx)(t.h2,{id:"registering-a-new-slot-type",children:"Registering a New Slot Type"}),"\n",(0,n.jsxs)(t.p,{children:["Adding a new slot type is controlled by the ",(0,n.jsx)(t.code,{children:"data/curios_example/curios/slots/example.json"})," file:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'{\n "size": 1,\n "add_cosmetic": true\n}\n'})}),"\n",(0,n.jsx)(t.p,{children:"The file and file name specifies these properties for the slot type:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["The identifier for the slot type is ",(0,n.jsx)(t.code,{children:"example"}),", as denoted by the file name"]}),"\n",(0,n.jsxs)(t.li,{children:["The number of slots available is ",(0,n.jsx)(t.code,{children:"1"}),", as denoted by the ",(0,n.jsx)(t.code,{children:'"size"'})," field"]}),"\n",(0,n.jsxs)(t.li,{children:["Each slot of this slot type has an associated cosmetic slot, as denoted by the ",(0,n.jsx)(t.code,{children:'"add_cosmetic"'})," field"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["For more information on the fields and customization of slot types, please refer to ",(0,n.jsx)(t.a,{href:"/curios/slots/slot-register",children:"the slot types page"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"modifying-an-existing-slot-type",children:"Modifying an Existing Slot Type"}),"\n",(0,n.jsxs)(t.p,{children:["Modifying an existing slot type is controlled by the ",(0,n.jsx)(t.code,{children:"data/curios_example/curios/slots/ring.json"})," file:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'{\n "size": 2,\n "add_cosmetic": true\n}\n'})}),"\n",(0,n.jsx)(t.p,{children:"The file and file name specifies these properties for the slot type:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["The identifier for the slot type to change is ",(0,n.jsx)(t.code,{children:"ring"}),", as denoted by the file name"]}),"\n",(0,n.jsxs)(t.li,{children:["The number of slots available is ",(0,n.jsx)(t.code,{children:"2"}),", as denoted by the ",(0,n.jsx)(t.code,{children:'"size"'})," field"]}),"\n",(0,n.jsxs)(t.li,{children:["Each slot of this slot type has an associated cosmetic slot, as denoted by the ",(0,n.jsx)(t.code,{children:'"add_cosmetic"'})," field"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Note that this is exactly the same syntax as registering a new slot type. This is because modifying and registering a\nslot type both have the exact same process, the difference solely being whether multiple files exist for the same slot\ntype or not."}),"\n",(0,n.jsxs)(t.p,{children:["For more information on how slot types are modified from multiple files, please refer to ",(0,n.jsx)(t.a,{href:"/curios/slots/slot-register",children:"the slot types page"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"adding-slot-types-to-one-or-more-entities",children:"Adding Slot Types to One or More Entities"}),"\n",(0,n.jsxs)(t.p,{children:["Just creating the slot type isn't enough, as now it has to be added to one or more entities in order to appear anywhere.\nThis is configured by the ",(0,n.jsx)(t.code,{children:"data/curios_example/curios/entities/entities.json"})," file:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'{\n "entities": [\n "minecraft:player",\n "minecraft:armor_stand"\n ],\n "slots": [\n "back",\n "body",\n "belt",\n "bracelet",\n "charm",\n "curio",\n "example",\n "hands",\n "head",\n "necklace",\n "ring"\n ]\n}\n'})}),"\n",(0,n.jsx)(t.p,{children:"The file specifies these properties:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["The slots being given are all the ",(0,n.jsx)(t.a,{href:"/curios/slots/preset-slots",children:"preset slot types"})," and the ",(0,n.jsx)(t.code,{children:"example"})," slot type created by this\ndatapack, as denoted by the ",(0,n.jsx)(t.code,{children:'"slots"'})," list"]}),"\n",(0,n.jsxs)(t.li,{children:["The entities being given slots are all players and armor stands, as denoted by the ",(0,n.jsx)(t.code,{children:'"entities"'})," list"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["For more information on the fields and customization of entity slots, please refer to ",(0,n.jsx)(t.a,{href:"/curios/slots/entity-register",children:"the entity slots page"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"adding-an-item-to-a-curio-slot",children:"Adding an Item to a Curio Slot"}),"\n",(0,n.jsxs)(t.p,{children:["Items are added to slot types by adding them to the relevant item tag. In the example datapack, an item tag for the\n",(0,n.jsx)(t.code,{children:"ring"})," slot type is created at ",(0,n.jsx)(t.code,{children:"data/curios/tags/items/ring.json"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'{\n "replace": false,\n "values": [\n "minecraft:diamond"\n ]\n}\n'})}),"\n",(0,n.jsxs)(t.p,{children:["The file name is the same as the identifier for the slot type and will be the name of the tag that is created. By\nsetting ",(0,n.jsx)(t.code,{children:"replace"})," to ",(0,n.jsx)(t.code,{children:"false"}),", the values are added to the tag instead of replacing them. Listing ",(0,n.jsx)(t.code,{children:"minecraft:diamond"})," in\nthe ",(0,n.jsx)(t.code,{children:"values"})," array will add the diamond item to the tag and consequently diamonds will be equippable in the ",(0,n.jsx)(t.code,{children:"ring"})," slots."]}),"\n",(0,n.jsxs)(t.p,{children:["For more information on tags and item tags, please refer to the ",(0,n.jsx)(t.a,{href:"https://minecraft.wiki/w/Tag",children:"page on the Minecraft wiki"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"activating-the-datapack",children:"Activating the Datapack"}),"\n",(0,n.jsxs)(t.p,{children:["Datapacks are created on a per-world basis and need to be placed in the ",(0,n.jsx)(t.code,{children:"datapacks"})," folder of the ",(0,n.jsx)(t.code,{children:"world"})," folder on a\ndedicated server or the ",(0,n.jsx)(t.code,{children:"saves/(World Name)"})," folder in single player. They should automatically be enabled upon loading\nthe datapack for the first time in the world."]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1121:(e,t,s)=>{s.d(t,{Z:()=>n});const n=s.p+"assets/files/curios_example-b9398f30472c661860955db867e85daa.zip"},1151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>o});var n=s(7294);const i={},a=n.createContext(i);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8dae1db0.fe5c8f4f.js b/assets/js/8dae1db0.fe5c8f4f.js
deleted file mode 100644
index 24de308..0000000
--- a/assets/js/8dae1db0.fe5c8f4f.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[677],{2206:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var i=r(5893),t=r(1151);const o={sidebar_position:8},s="Rendering a Curio",a={id:"curios/Developing with Curios/rendering-registry",title:"Rendering a Curio",description:"A tutorial on how to run rendering code when a specific curio item is equipped on an entity.",source:"@site/docs/curios/Developing with Curios/rendering-registry.md",sourceDirName:"curios/Developing with Curios",slug:"/curios/Developing with Curios/rendering-registry",permalink:"/curios/Developing with Curios/rendering-registry",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/Developing with Curios/rendering-registry.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Data Generation",permalink:"/curios/Developing with Curios/data-generation"},next:{title:"ICurioRenderer",permalink:"/curios/Developing with Curios/APIs/renderer-interface"}},d={},l=[{value:"Create an ICurioRenderer",id:"create-an-icuriorenderer",level:2},{value:"Example",id:"example",level:3},{value:"Register your renderer",id:"register-your-renderer",level:2},{value:"Example",id:"example-1",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"rendering-a-curio",children:"Rendering a Curio"}),"\n",(0,i.jsx)(n.p,{children:"A tutorial on how to run rendering code when a specific curio item is equipped on an entity."}),"\n",(0,i.jsxs)(n.h2,{id:"create-an-icuriorenderer",children:["Create an ",(0,i.jsx)(n.code,{children:"ICurioRenderer"})]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.code,{children:"top.theillusivec4.curios.api.client"})," package, you'll find an interface called ",(0,i.jsx)(n.code,{children:"ICurioRenderer"}),". This interface\nneeds to be implemented on an object of your choice, as its ",(0,i.jsx)(n.code,{children:"render"})," method is what will be called to run your rendering\ncode later."]}),"\n",(0,i.jsxs)(n.p,{children:["For the full guide on the interface, see ",(0,i.jsx)(n.a,{href:"/curios/Developing%20with%20Curios/APIs/renderer-interface",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"public class MyCurioRenderer implements ICurioRenderer {\n \n @Override\n public > void render(ItemStack stack,\n SlotContext slotContext,\n PoseStack matrixStack,\n RenderLayerParent renderLayerParent,\n MultiBufferSource renderTypeBuffer,\n int light, float limbSwing,\n float limbSwingAmount,\n float partialTicks,\n float ageInTicks,\n float netHeadYaw,\n float headPitch) {\n // Render code goes here\n }\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"register-your-renderer",children:"Register your renderer"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.p,{children:["Once you have an implementation of ",(0,i.jsx)(n.code,{children:"ICurioRenderer"}),", you need to register an instance of that to an item. This is done\nby calling the ",(0,i.jsx)(n.code,{children:"register"})," method in ",(0,i.jsx)(n.code,{children:"top.theillusivec4.curios.api.client.CuriosRendererRegistry"})," during the\n",(0,i.jsx)(n.code,{children:"FMLClientSetupEvent"})," in mod loading."]}),"\n",(0,i.jsx)(n.h3,{id:"example-1",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'@Mod("CurioMod")\npublic class CurioMod {\n \n public CurioMod() {\n final IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus();\n eventBus.addListener(this::clientSetup);\n }\n\n private void clientSetup(final FMLClientSetupEvent evt) {\n CuriosRendererRegistry.register(CurioModItems.MY_ITEM, () -> new MyCurioRenderer());\n }\n}\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Multiple items are allowed to share a renderer instance or type. This can be handy if your ",(0,i.jsx)(n.code,{children:"ICurioRenderer"}),"\nimplementation shares a lot of common code or if your items have very similar renders, in which case you may find it\nadvantageous to simply register those items with a single renderer rather than multiple."]})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},1151:(e,n,r)=>{r.d(n,{Z:()=>a,a:()=>s});var i=r(7294);const t={},o=i.createContext(t);function s(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/935f2afb.0e792366.js b/assets/js/935f2afb.0e792366.js
new file mode 100644
index 0000000..7283207
--- /dev/null
+++ b/assets/js/935f2afb.0e792366.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"1.20.x","banner":null,"badge":true,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Overview","href":"/","docId":"intro","unlisted":false},{"type":"category","label":"Curios","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Setting Up the Development Environment","href":"/curios/getting-started","docId":"curios/getting-started","unlisted":false},{"type":"category","label":"Slots","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Slot Types","href":"/curios/slots/slot-register","docId":"curios/slots/slot-register","unlisted":false},{"type":"link","label":"Entity Slot Types","href":"/curios/slots/entity-register","docId":"curios/slots/entity-register","unlisted":false},{"type":"link","label":"Preset Slot Types","href":"/curios/slots/preset-slots","docId":"curios/slots/preset-slots","unlisted":false},{"type":"link","label":"Slot Icon Textures","href":"/curios/slots/slot-textures","docId":"curios/slots/slot-textures","unlisted":false},{"type":"link","label":"Slot Modifiers","href":"/curios/slots/slot-modifiers","docId":"curios/slots/slot-modifiers","unlisted":false},{"type":"link","label":"Data Generation","href":"/curios/slots/data-generation","docId":"curios/slots/data-generation","unlisted":false},{"type":"link","label":"Example Datapack","href":"/curios/slots/datapack-example","docId":"curios/slots/datapack-example","unlisted":false}],"href":"/category/slots"},{"type":"category","label":"Items","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Creating a Curio","href":"/curios/items/curio-creation","docId":"curios/items/curio-creation","unlisted":false},{"type":"link","label":"Rendering a Curio","href":"/curios/items/rendering-registry","docId":"curios/items/rendering-registry","unlisted":false},{"type":"link","label":"Curios Attribute Modifiers (NBT)","href":"/curios/items/curios-nbt","docId":"curios/items/curios-nbt","unlisted":false}],"href":"/category/items"},{"type":"category","label":"Inventory","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basic Inventory Management","href":"/curios/inventory/basic-inventory","docId":"curios/inventory/basic-inventory","unlisted":false}],"href":"/category/inventory"},{"type":"category","label":"API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ICurioRenderer","href":"/curios/api/renderer-interface","docId":"curios/api/renderer-interface","unlisted":false}],"href":"/category/api"},{"type":"link","label":"Configuration","href":"/curios/configuration","docId":"curios/configuration","unlisted":false},{"type":"link","label":"Commands","href":"/curios/commands","docId":"curios/commands","unlisted":false}],"href":"/category/curios"},{"type":"category","label":"Diet","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Customizing Food Groups","href":"/diet/diet-groups","docId":"diet/diet-groups","unlisted":false},{"type":"link","label":"Categorizing Food to Groups","href":"/diet/food-classification","docId":"diet/food-classification","unlisted":false},{"type":"link","label":"Customizing Diet Suites","href":"/diet/diet-suites","docId":"diet/diet-suites","unlisted":false},{"type":"link","label":"Example Datapack","href":"/diet/datapack-example","docId":"diet/datapack-example","unlisted":false}],"href":"/category/diet"}]},"docs":{"curios/api/renderer-interface":{"id":"curios/api/renderer-interface","title":"ICurioRenderer","description":"Methods","sidebar":"tutorialSidebar"},"curios/commands":{"id":"curios/commands","title":"Commands","description":"A tutorial on the various commands available through Curios.","sidebar":"tutorialSidebar"},"curios/configuration":{"id":"curios/configuration","title":"Configuration","description":"Curios has various configuration files that can be used to change settings related to the user interface, curios","sidebar":"tutorialSidebar"},"curios/getting-started":{"id":"curios/getting-started","title":"Setting Up the Development Environment","description":"A tutorial on how to set up your development workspace to work with Curios API interfaces and methods.","sidebar":"tutorialSidebar"},"curios/inventory/basic-inventory":{"id":"curios/inventory/basic-inventory","title":"Basic Inventory Management","description":"Learn how to access and manage the Curios inventory attached to an entity.","sidebar":"tutorialSidebar"},"curios/items/curio-creation":{"id":"curios/items/curio-creation","title":"Creating a Curio","description":"A tutorial on how to attach curio capabilities to your items.","sidebar":"tutorialSidebar"},"curios/items/curios-nbt":{"id":"curios/items/curios-nbt","title":"Curios Attribute Modifiers (NBT)","description":"A tutorial on how to edit a curio item\'s NBT data to add attribute modifiers when the item is worn in a curio slot.","sidebar":"tutorialSidebar"},"curios/items/rendering-registry":{"id":"curios/items/rendering-registry","title":"Rendering a Curio","description":"A tutorial on how to run rendering code when a specific curio item is equipped on an entity.","sidebar":"tutorialSidebar"},"curios/slots/data-generation":{"id":"curios/slots/data-generation","title":"Data Generation","description":"A tutorial on how to programmatically generate the Curios data files.","sidebar":"tutorialSidebar"},"curios/slots/datapack-example":{"id":"curios/slots/datapack-example","title":"Example Datapack","description":"An example datapack for configuring various curio mechanics, including adding slot types to entities and modifying","sidebar":"tutorialSidebar"},"curios/slots/entity-register":{"id":"curios/slots/entity-register","title":"Entity Slot Types","description":"A tutorial on how to add registered slot types to entities.","sidebar":"tutorialSidebar"},"curios/slots/preset-slots":{"id":"curios/slots/preset-slots","title":"Preset Slot Types","description":"A list of commonly used slot types that are already defined in Curios for developers to use.","sidebar":"tutorialSidebar"},"curios/slots/slot-modifiers":{"id":"curios/slots/slot-modifiers","title":"Slot Modifiers","description":"A tutorial on how to add and remove slots from the curios inventory on entities.","sidebar":"tutorialSidebar"},"curios/slots/slot-register":{"id":"curios/slots/slot-register","title":"Slot Types","description":"A tutorial on how to register and modify slot types that are recognized by Curios.","sidebar":"tutorialSidebar"},"curios/slots/slot-textures":{"id":"curios/slots/slot-textures","title":"Slot Icon Textures","description":"A tutorial on how to add custom slot textures to slot types.","sidebar":"tutorialSidebar"},"diet/datapack-example":{"id":"diet/datapack-example","title":"Example Datapack","description":"An example datapack for configuring various diet mechanics, including adding a new food group and adding food to that","sidebar":"tutorialSidebar"},"diet/diet-groups":{"id":"diet/diet-groups","title":"Customizing Food Groups","description":"A tutorial on how to edit available food groups and their respective metadata.","sidebar":"tutorialSidebar"},"diet/diet-suites":{"id":"diet/diet-suites","title":"Customizing Diet Suites","description":"A tutorial on how to customize suites of food groups and diet effects.","sidebar":"tutorialSidebar"},"diet/food-classification":{"id":"diet/food-classification","title":"Categorizing Food to Groups","description":"Food classification into groups is done through item tags.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Overview","description":"WIP! Check back later for updates.","sidebar":"tutorialSidebar"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/935f2afb.161f87f1.js b/assets/js/935f2afb.161f87f1.js
deleted file mode 100644
index d8f36cb..0000000
--- a/assets/js/935f2afb.161f87f1.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"1.20.x","banner":null,"badge":true,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Overview","href":"/","docId":"intro","unlisted":false},{"type":"category","label":"Curios","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Registering and Editing Slot Types","href":"/curios/slot-register","docId":"curios/slot-register","unlisted":false},{"type":"link","label":"Adding Slot Types to Entities","href":"/curios/entity-register","docId":"curios/entity-register","unlisted":false},{"type":"link","label":"Adding Custom Slot Textures","href":"/curios/slot-textures","docId":"curios/slot-textures","unlisted":false},{"type":"link","label":"Preset Slot Types","href":"/curios/preset-slots","docId":"curios/preset-slots","unlisted":false},{"type":"link","label":"Example Datapack","href":"/curios/datapack-example","docId":"curios/datapack-example","unlisted":false},{"type":"link","label":"Curios Attribute Modifiers (NBT)","href":"/curios/curios-nbt","docId":"curios/curios-nbt","unlisted":false},{"type":"link","label":"Commands","href":"/curios/commands","docId":"curios/commands","unlisted":false},{"type":"category","label":"Developing with Curios","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Setting Up the Development Environment","href":"/curios/Developing with Curios/getting-started","docId":"curios/Developing with Curios/getting-started","unlisted":false},{"type":"link","label":"Creating a Curio","href":"/curios/Developing with Curios/curio-creation","docId":"curios/Developing with Curios/curio-creation","unlisted":false},{"type":"link","label":"Slot Modifiers","href":"/curios/Developing with Curios/slot-modifiers","docId":"curios/Developing with Curios/slot-modifiers","unlisted":false},{"type":"link","label":"Data Generation","href":"/curios/Developing with Curios/data-generation","docId":"curios/Developing with Curios/data-generation","unlisted":false},{"type":"link","label":"Rendering a Curio","href":"/curios/Developing with Curios/rendering-registry","docId":"curios/Developing with Curios/rendering-registry","unlisted":false},{"type":"category","label":"APIs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ICurioRenderer","href":"/curios/Developing with Curios/APIs/renderer-interface","docId":"curios/Developing with Curios/APIs/renderer-interface","unlisted":false}]}]}],"href":"/category/curios"},{"type":"category","label":"Diet","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Customizing Food Groups","href":"/diet/diet-groups","docId":"diet/diet-groups","unlisted":false},{"type":"link","label":"Categorizing Food to Groups","href":"/diet/food-classification","docId":"diet/food-classification","unlisted":false},{"type":"link","label":"Customizing Diet Suites","href":"/diet/diet-suites","docId":"diet/diet-suites","unlisted":false},{"type":"link","label":"Example Datapack","href":"/diet/datapack-example","docId":"diet/datapack-example","unlisted":false}],"href":"/category/diet"}]},"docs":{"curios/commands":{"id":"curios/commands","title":"Commands","description":"A tutorial on the various commands available through Curios.","sidebar":"tutorialSidebar"},"curios/curios-nbt":{"id":"curios/curios-nbt","title":"Curios Attribute Modifiers (NBT)","description":"A tutorial on how to edit a curio item\'s NBT data to add attribute modifiers when the item is worn in a curio slot.","sidebar":"tutorialSidebar"},"curios/datapack-example":{"id":"curios/datapack-example","title":"Example Datapack","description":"An example datapack for configuring various curio mechanics, including adding slot types to entities and modifying","sidebar":"tutorialSidebar"},"curios/Developing with Curios/APIs/renderer-interface":{"id":"curios/Developing with Curios/APIs/renderer-interface","title":"ICurioRenderer","description":"Methods","sidebar":"tutorialSidebar"},"curios/Developing with Curios/curio-creation":{"id":"curios/Developing with Curios/curio-creation","title":"Creating a Curio","description":"A tutorial on how to attach curio capabilities to your items.","sidebar":"tutorialSidebar"},"curios/Developing with Curios/data-generation":{"id":"curios/Developing with Curios/data-generation","title":"Data Generation","description":"A tutorial on how to programmatically generate the Curios data files.","sidebar":"tutorialSidebar"},"curios/Developing with Curios/getting-started":{"id":"curios/Developing with Curios/getting-started","title":"Setting Up the Development Environment","description":"A tutorial on how to set up your development workspace to work with Curios API interfaces and methods.","sidebar":"tutorialSidebar"},"curios/Developing with Curios/rendering-registry":{"id":"curios/Developing with Curios/rendering-registry","title":"Rendering a Curio","description":"A tutorial on how to run rendering code when a specific curio item is equipped on an entity.","sidebar":"tutorialSidebar"},"curios/Developing with Curios/slot-modifiers":{"id":"curios/Developing with Curios/slot-modifiers","title":"Slot Modifiers","description":"A tutorial on how to add and remove slots from the curios inventory on entities.","sidebar":"tutorialSidebar"},"curios/entity-register":{"id":"curios/entity-register","title":"Adding Slot Types to Entities","description":"A tutorial on how to add registered slot types to entities.","sidebar":"tutorialSidebar"},"curios/preset-slots":{"id":"curios/preset-slots","title":"Preset Slot Types","description":"A list of commonly used slot types that are already defined in Curios for developers to use.","sidebar":"tutorialSidebar"},"curios/slot-register":{"id":"curios/slot-register","title":"Registering and Editing Slot Types","description":"A tutorial on how to register and modify slot types that are recognized by Curios.","sidebar":"tutorialSidebar"},"curios/slot-textures":{"id":"curios/slot-textures","title":"Adding Custom Slot Textures","description":"A tutorial on how to add custom slot textures to slot types.","sidebar":"tutorialSidebar"},"diet/datapack-example":{"id":"diet/datapack-example","title":"Example Datapack","description":"An example datapack for configuring various diet mechanics, including adding a new food group and adding food to that","sidebar":"tutorialSidebar"},"diet/diet-groups":{"id":"diet/diet-groups","title":"Customizing Food Groups","description":"A tutorial on how to edit available food groups and their respective metadata.","sidebar":"tutorialSidebar"},"diet/diet-suites":{"id":"diet/diet-suites","title":"Customizing Diet Suites","description":"A tutorial on how to customize suites of food groups and diet effects.","sidebar":"tutorialSidebar"},"diet/food-classification":{"id":"diet/food-classification","title":"Categorizing Food to Groups","description":"Food classification into groups is done through item tags.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Overview","description":"WIP! Check back later for updates.","sidebar":"tutorialSidebar"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/93ac1f71.d94df6db.js b/assets/js/93ac1f71.d94df6db.js
deleted file mode 100644
index 52665c0..0000000
--- a/assets/js/93ac1f71.d94df6db.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[844],{9938:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>d,metadata:()=>o,toc:()=>a});var t=n(5893),r=n(1151);const d={sidebar_position:4},s="Data Generation",o={id:"curios/Developing with Curios/data-generation",title:"Data Generation",description:"A tutorial on how to programmatically generate the Curios data files.",source:"@site/docs/curios/Developing with Curios/data-generation.md",sourceDirName:"curios/Developing with Curios",slug:"/curios/Developing with Curios/data-generation",permalink:"/curios/Developing with Curios/data-generation",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/Developing with Curios/data-generation.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Slot Modifiers",permalink:"/curios/Developing with Curios/slot-modifiers"},next:{title:"Rendering a Curio",permalink:"/curios/Developing with Curios/rendering-registry"}},l={},a=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Slot Generation",id:"slot-generation",level:2},{value:"Example",id:"example",level:3},{value:"Entities Generation",id:"entities-generation",level:2},{value:"Example",id:"example-1",level:3},{value:"Criterion Triggers",id:"criterion-triggers",level:2},{value:"Example",id:"example-2",level:3}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h1,{id:"data-generation",children:"Data Generation"}),"\n",(0,t.jsx)(i.p,{children:"A tutorial on how to programmatically generate the Curios data files."}),"\n",(0,t.jsx)(i.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsxs)(i.p,{children:["The documentation on this page was written with the assumption that readers are already familiar with basic data\ngeneration and its usages. If you are not, please prime yourself by learning about data generation on either ",(0,t.jsx)(i.a,{href:"https://forge.gemwire.uk/wiki/Datageneration",children:"Forge"}),"\nor ",(0,t.jsx)(i.a,{href:"https://docs.neoforged.net/docs/datagen/",children:"NeoForge"})," before proceeding further."]}),"\n",(0,t.jsx)(i.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsxs)(i.p,{children:["Slots and entities can be generated for a mod by constructing a new implementation of the\n",(0,t.jsx)(i.code,{children:"top.theillusivec4.curios.api.CuriosDataProvider"})," class, making sure to override the ",(0,t.jsx)(i.code,{children:"generate"})," method to run the\ngeneration code."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-java",children:"public class CuriosTestProvider extends CuriosDataProvider {\n\n public CuriosTestProvider(String modId, PackOutput output,\n ExistingFileHelper fileHelper,\n CompletableFuture registries) {\n super(modId, output, fileHelper, registries);\n }\n\n @Override\n public void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n // Generation code here\n }\n}\n"})}),"\n",(0,t.jsxs)(i.p,{children:["A new instance of the implementation should be constructed in the ",(0,t.jsx)(i.code,{children:"GatherDataEvent"})," event on the MOD event bus."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-java",children:'// On the MOD event bus\n@SubscribeEvent\npublic void gatherData(GatherDataEvent event) {\n event.getGenerator().addProvider(\n // Tell generator to run only when server data are generating\n event.includeServer(),\n new CuriosTestProvider(\n "mod_id",\n event.getGenerator().getPackOutput(),\n event.getExistingFileHelper(),\n event.getLookupProvider()\n )\n );\n}\n'})}),"\n",(0,t.jsx)(i.h2,{id:"slot-generation",children:"Slot Generation"}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"CuriosDataProvider"})," has a ",(0,t.jsx)(i.code,{children:"createSlot"})," method to facilitate easy data generation of slot types, by taking in an initial\n",(0,t.jsx)(i.code,{children:"String"})," identifier/file name and allowing developers to chain additional parameters as needed."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-java",children:'@Override\npublic void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n this.createSlot("test_slot"); // Create a slot with the identifier and file name "test_slot"\n}\n'})}),"\n",(0,t.jsxs)(i.p,{children:["Additional parameters can be added by calling methods on the ",(0,t.jsx)(i.code,{children:"ISlotData"})," returned by the ",(0,t.jsx)(i.code,{children:"createSlot"})," method call. Most\nof these parameters are linked to fields for ",(0,t.jsx)(i.code,{children:"ISlotType"}),", more information on how these fields are constructed and what\nthey represent can be found on the page for ",(0,t.jsx)(i.a,{href:"/curios/slot-register#-syntax",children:"slot registration"}),"."]}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Method"}),(0,t.jsx)(i.th,{children:"Parameters"}),(0,t.jsx)(i.th,{children:"Field"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"replace"})}),(0,t.jsx)(i.td,{children:"boolean"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"replace"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"size"})}),(0,t.jsx)(i.td,{children:"integer"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"size"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"operation"})}),(0,t.jsx)(i.td,{children:"string"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"operation"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"order"})}),(0,t.jsx)(i.td,{children:"integer"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"order"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"icon"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"ResourceLocation"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"icon"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"addCosmetic"})}),(0,t.jsx)(i.td,{children:"boolean"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"add_cosmetic"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"useNativeGui"})}),(0,t.jsx)(i.td,{children:"boolean"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"use_native_gui"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"renderToggle"})}),(0,t.jsx)(i.td,{children:"boolean"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"render_toggle"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"dropRule"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"ICurio$DropRule"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"drop_rule"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"addCondition"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"ICondition"})}),(0,t.jsx)(i.td,{children:"N/A"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"example",children:"Example"}),"\n",(0,t.jsxs)(i.p,{children:["The following example creates a slot file with the file name and identifier ",(0,t.jsx)(i.code,{children:"test_slot"}),", gives it a size of ",(0,t.jsx)(i.code,{children:"4"}),", sets the\ndrop rule to ",(0,t.jsx)(i.code,{children:'"ALWAYS_KEEP"'})," so that it is never dropped upon death, and gives it a cosmetic slot by setting ",(0,t.jsx)(i.code,{children:"addCosmetic"}),"\nto ",(0,t.jsx)(i.code,{children:"true"}),"."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-java",children:'@Override\npublic void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n this.createSlot("test_slot")\n .size(4)\n .dropRule(ICurio.DropRule.ALWAYS_KEEP)\n .addCosmetic(true);\n}\n'})}),"\n",(0,t.jsx)(i.h2,{id:"entities-generation",children:"Entities Generation"}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:"CuriosDataProvider"})," has a ",(0,t.jsx)(i.code,{children:"createEntities"})," method to facilitate easy data generation of adding slot types to entities,\nby taking in an initial ",(0,t.jsx)(i.code,{children:"String"})," file name and allowing developers to chain additional parameters as needed."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-java",children:'@Override\npublic void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n this.createEntities("test_entities"); // Create an entities file with the name "test_entities"\n}\n'})}),"\n",(0,t.jsxs)(i.p,{children:["Additional parameters can be added by calling methods on the ",(0,t.jsx)(i.code,{children:"IEntitiesData"})," returned by the ",(0,t.jsx)(i.code,{children:"createEntities"})," method\ncall. All of these parameters correspond to JSON fields, more information on these can be found on the page for\n",(0,t.jsx)(i.a,{href:"/curios/entity-register#-syntax",children:"entity registration"}),"."]}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Method"}),(0,t.jsx)(i.th,{children:"Parameters"}),(0,t.jsx)(i.th,{children:"Field"}),(0,t.jsx)(i.th,{children:"Notes"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"replace"})}),(0,t.jsx)(i.td,{children:"boolean"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"replace"})}),(0,t.jsx)(i.td,{})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"addPlayer"})}),(0,t.jsx)(i.td,{children:"N/A"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"entities"})}),(0,t.jsxs)(i.td,{children:["Adds ",(0,t.jsx)(i.code,{children:'"minecraft:player"'})," to the ",(0,t.jsx)(i.code,{children:"entities"})," array"]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"addEntities"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"EntityType>[]"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"entities"})}),(0,t.jsx)(i.td,{})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"addSlots"})}),(0,t.jsx)(i.td,{children:"string[]"}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"slots"})}),(0,t.jsxs)(i.td,{children:["Adds each string as a slot identifier to the ",(0,t.jsx)(i.code,{children:"slots"})," array"]})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"addCondition"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"ICondition"})}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"conditions"})}),(0,t.jsx)(i.td,{})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"example-1",children:"Example"}),"\n",(0,t.jsxs)(i.p,{children:["The following example creates an entities file with the file name ",(0,t.jsx)(i.code,{children:"test_entities"}),", and assigns the ",(0,t.jsx)(i.code,{children:'"head"'}),", ",(0,t.jsx)(i.code,{children:'"ring"'}),",\nand ",(0,t.jsx)(i.code,{children:'"necklace"'})," slot types to the ",(0,t.jsx)(i.code,{children:'"minecraft:player"'})," and ",(0,t.jsx)(i.code,{children:'"minecraft:zombie"'})," entities."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-java",children:'@Override\npublic void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n this.createEntities("test_entities")\n .addPlayer()\n .addEntities(EntityType.ZOMBIE)\n .addSlots("head", "ring", "necklace");\n}\n'})}),"\n",(0,t.jsx)(i.h2,{id:"criterion-triggers",children:"Criterion Triggers"}),"\n",(0,t.jsxs)(i.p,{children:["Curios provides several helper methods in the ",(0,t.jsx)(i.code,{children:"top.theillusivec4.curios.api.CuriosTriggers"})," class to generate data\nassociated with criterion triggers used for advancements and other similar files."]}),"\n",(0,t.jsxs)(i.p,{children:["Currently, the only triggers available are ",(0,t.jsx)(i.code,{children:"equip"})," and ",(0,t.jsx)(i.code,{children:"equipAtLocation"})," for triggering when a certain item is equipped\ninto a curio slot."]}),"\n",(0,t.jsx)(i.h3,{id:"example-2",children:"Example"}),"\n",(0,t.jsxs)(i.p,{children:["The following example will create an advancement file, ",(0,t.jsx)(i.code,{children:"curiostest/test"}),", that adds a criteration called ",(0,t.jsx)(i.code,{children:'"test"'}),", that\nis triggered when a ",(0,t.jsx)(i.code,{children:'"minecraft:diamond"'})," item is equipped in the Badlands biome."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-java",children:'Advancement.Builder.advancement()\n .addCriterion("test",\n CuriosTriggers.equipAtLocation(\n ItemPredicate.Builder.item().of(Items.DIAMOND),\n LocationPredicate.Builder.location().setBiome(Biomes.BADLANDS)))\n .save(saver, new ResourceLocation("curiostest", "test"), existingFileHelper);\n'})})]})}function h(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,i,n)=>{n.d(i,{Z:()=>o,a:()=>s});var t=n(7294);const r={},d=t.createContext(r);function s(e){const i=t.useContext(d);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(d.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/99097929.e904a711.js b/assets/js/99097929.2c00f282.js
similarity index 61%
rename from assets/js/99097929.e904a711.js
rename to assets/js/99097929.2c00f282.js
index d2f786e..5e8d1db 100644
--- a/assets/js/99097929.e904a711.js
+++ b/assets/js/99097929.2c00f282.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[368],{1754:e=>{e.exports=JSON.parse('{"title":"Diet","description":"A Minecraft mod featuring a customizable food group-based nutrition and diet system.","slug":"/category/diet","permalink":"/category/diet","navigation":{"previous":{"title":"ICurioRenderer","permalink":"/curios/Developing with Curios/APIs/renderer-interface"},"next":{"title":"Customizing Food Groups","permalink":"/diet/diet-groups"}}}')}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[368],{1754:e=>{e.exports=JSON.parse('{"title":"Diet","description":"A Minecraft mod featuring a customizable food group-based nutrition and diet system.","slug":"/category/diet","permalink":"/category/diet","navigation":{"previous":{"title":"Commands","permalink":"/curios/commands"},"next":{"title":"Customizing Food Groups","permalink":"/diet/diet-groups"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/99b1d78b.7f651d2b.js b/assets/js/99b1d78b.7f651d2b.js
new file mode 100644
index 0000000..7680317
--- /dev/null
+++ b/assets/js/99b1d78b.7f651d2b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[664],{6343:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var i=r(5893),t=r(1151);const o={sidebar_position:8},s="Rendering a Curio",d={id:"curios/items/rendering-registry",title:"Rendering a Curio",description:"A tutorial on how to run rendering code when a specific curio item is equipped on an entity.",source:"@site/docs/curios/items/rendering-registry.md",sourceDirName:"curios/items",slug:"/curios/items/rendering-registry",permalink:"/curios/items/rendering-registry",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/items/rendering-registry.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Creating a Curio",permalink:"/curios/items/curio-creation"},next:{title:"Curios Attribute Modifiers (NBT)",permalink:"/curios/items/curios-nbt"}},a={},c=[{value:"Create an ICurioRenderer",id:"create-an-icuriorenderer",level:2},{value:"Register your renderer",id:"register-your-renderer",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"rendering-a-curio",children:"Rendering a Curio"}),"\n",(0,i.jsx)(n.p,{children:"A tutorial on how to run rendering code when a specific curio item is equipped on an entity."}),"\n",(0,i.jsxs)(n.h2,{id:"create-an-icuriorenderer",children:["Create an ",(0,i.jsx)(n.code,{children:"ICurioRenderer"})]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.code,{children:"top.theillusivec4.curios.api.client"})," package, you'll find an interface called ",(0,i.jsx)(n.code,{children:"ICurioRenderer"}),". This interface\nneeds to be implemented on an object of your choice, as its ",(0,i.jsx)(n.code,{children:"render"})," method is what will be called to run your rendering\ncode later."]}),"\n",(0,i.jsxs)(n.p,{children:["For the full guide on the interface, see ",(0,i.jsx)(n.a,{href:"/curios/api/renderer-interface",children:"here"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"public class MyCurioRenderer implements ICurioRenderer {\n \n @Override\n public > void render(ItemStack stack,\n SlotContext slotContext,\n PoseStack matrixStack,\n RenderLayerParent renderLayerParent,\n MultiBufferSource renderTypeBuffer,\n int light, float limbSwing,\n float limbSwingAmount,\n float partialTicks,\n float ageInTicks,\n float netHeadYaw,\n float headPitch) {\n // Render code goes here\n }\n}\n"})}),"\n",(0,i.jsx)(n.h2,{id:"register-your-renderer",children:"Register your renderer"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.p,{children:["Once you have an implementation of ",(0,i.jsx)(n.code,{children:"ICurioRenderer"}),", you need to register an instance of that to an item. This is done\nby calling the ",(0,i.jsx)(n.code,{children:"register"})," method in ",(0,i.jsx)(n.code,{children:"top.theillusivec4.curios.api.client.CuriosRendererRegistry"})," during the\n",(0,i.jsx)(n.code,{children:"FMLClientSetupEvent"})," in mod loading."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'@Mod("CurioMod")\npublic class CurioMod {\n \n public CurioMod() {\n final IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus();\n eventBus.addListener(this::clientSetup);\n }\n\n private void clientSetup(final FMLClientSetupEvent evt) {\n CuriosRendererRegistry.register(CurioModItems.MY_ITEM, () -> new MyCurioRenderer());\n }\n}\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Multiple items are allowed to share a renderer instance or type. This can be handy if your ",(0,i.jsx)(n.code,{children:"ICurioRenderer"}),"\nimplementation shares a lot of common code or if your items have very similar renders, in which case you may find it\nadvantageous to simply register those items with a single renderer rather than multiple."]})})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,n,r)=>{r.d(n,{Z:()=>d,a:()=>s});var i=r(7294);const t={},o=i.createContext(t);function s(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/a4f7be8a.8c4ddd02.js b/assets/js/a4f7be8a.8c4ddd02.js
new file mode 100644
index 0000000..4f20084
--- /dev/null
+++ b/assets/js/a4f7be8a.8c4ddd02.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[750],{6966:e=>{e.exports=JSON.parse('{"title":"API","description":"All about the Curio API interfaces.","slug":"/category/api","permalink":"/category/api","navigation":{"previous":{"title":"Basic Inventory Management","permalink":"/curios/inventory/basic-inventory"},"next":{"title":"ICurioRenderer","permalink":"/curios/api/renderer-interface"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/a61686b6.3b96c0df.js b/assets/js/a61686b6.3b96c0df.js
new file mode 100644
index 0000000..3be8b92
--- /dev/null
+++ b/assets/js/a61686b6.3b96c0df.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[922],{3610:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var n=s(5893),i=s(1151);const r={sidebar_position:3},o="Entity Slot Types",l={id:"curios/slots/entity-register",title:"Entity Slot Types",description:"A tutorial on how to add registered slot types to entities.",source:"@site/docs/curios/slots/entity-register.md",sourceDirName:"curios/slots",slug:"/curios/slots/entity-register",permalink:"/curios/slots/entity-register",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/slots/entity-register.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Slot Types",permalink:"/curios/slots/slot-register"},next:{title:"Preset Slot Types",permalink:"/curios/slots/preset-slots"}},a={},d=[{value:"Overview",id:"overview",level:2},{value:"Directory",id:"directory",level:2},{value:"Syntax",id:"syntax",level:2},{value:"replace (boolean)",id:"replace-boolean",level:3},{value:"entities (string[])",id:"entities-string",level:3},{value:"slots (string[])",id:"slots-string",level:3},{value:"conditions (string[])",id:"conditions-string",level:3},{value:"Example",id:"example",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"entity-slot-types",children:"Entity Slot Types"}),"\n",(0,n.jsx)(t.p,{children:"A tutorial on how to add registered slot types to entities."}),"\n",(0,n.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsxs)(t.p,{children:["The recommended way to add a registered slot type to an entity is through a datapack. If you are unfamiliar with\ndatapacks, it is recommended to read through the ",(0,n.jsx)(t.a,{href:"https://minecraft.fandom.com/wiki/Data_pack",children:"wiki page"})," in order to\nunderstand the concept and structure before proceeding to the rest of this page."]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"/curios/slots/slot-register",children:"Registered slot types"})," will all be available for use but will not appear in-game until they are\nadded to one or more entities."]}),"\n",(0,n.jsxs)(t.p,{children:["Alternatively, users can instead choose to use the ",(0,n.jsx)(t.a,{href:"../configuration#slot-configuration",children:"Curios configuration"})," to create\nand assign slot types to ",(0,n.jsx)(t.strong,{children:"players only"}),". There are fewer features than those offered in the datapack method, but some\nusers may find the process to be more straightforward."]}),"\n",(0,n.jsx)(t.h2,{id:"directory",children:"Directory"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsxs)(t.p,{children:["The file should be a ",(0,n.jsx)(t.code,{children:".json"})," file located in the ",(0,n.jsx)(t.code,{children:"~/data/(namespace)/curios/entities/"})," folder of the datapack."]}),"\n",(0,n.jsxs)(t.admonition,{type:"note",children:[(0,n.jsx)(t.p,{children:"The file can be named anything."}),(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"(namespace)"})," field should be replaced by the namespace chosen for this portion of the datapack. If this is a part\nof a mod, the namespace is usually the mod ID. If this is part of a user-defined datapack, then the namespace can be\nanything that is lowercased with no special characters."]})]}),"\n",(0,n.jsx)(t.h2,{id:"syntax",children:"Syntax"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsxs)(t.p,{children:["The structure of the ",(0,n.jsx)(t.code,{children:".json"})," file for the entity configuration consists of a top-level JSON object that holds several\npotential fields."]}),"\n",(0,n.jsx)(t.p,{children:"All fields are optional unless otherwise noted."}),"\n",(0,n.jsxs)(t.h3,{id:"replace-boolean",children:[(0,n.jsx)(t.strong,{children:"replace"})," (boolean)"]}),"\n",(0,n.jsxs)(t.p,{children:["When ",(0,n.jsx)(t.code,{children:"true"}),", replaces data from lower-priority datapacks."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"default:"})," ",(0,n.jsx)(t.code,{children:"false"})]}),"\n"]}),"\n",(0,n.jsxs)(t.h3,{id:"entities-string",children:[(0,n.jsx)(t.strong,{children:"entities"})," (string[])"]}),"\n",(0,n.jsx)(t.p,{children:"An array of registry names of entity types or entity type tags."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"default:"})," ",(0,n.jsx)(t.code,{children:"[]"})]}),"\n"]}),"\n",(0,n.jsxs)(t.h3,{id:"slots-string",children:[(0,n.jsx)(t.strong,{children:"slots"})," (string[])"]}),"\n",(0,n.jsxs)(t.p,{children:["An array of ",(0,n.jsx)(t.code,{children:"identifier"})," names for registered slot types."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"default:"})," ",(0,n.jsx)(t.code,{children:"[]"})]}),"\n"]}),"\n",(0,n.jsxs)(t.h3,{id:"conditions-string",children:[(0,n.jsx)(t.strong,{children:"conditions"})," (string[])"]}),"\n",(0,n.jsxs)(t.p,{children:["An array of ",(0,n.jsx)(t.code,{children:"ICondition"})," implementations that must all pass before these slots are loaded into these entities."]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"default:"})," ",(0,n.jsx)(t.code,{children:"[]"})]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"All the listed slots will be associated to all the listed entities."}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["Adding multiple of the same ",(0,n.jsx)(t.code,{children:"identifier"})," to the ",(0,n.jsx)(t.code,{children:"slots"})," array will ",(0,n.jsx)(t.strong,{children:"not"})," add multiple slots. Each entry in the ",(0,n.jsx)(t.code,{children:"slots"}),"\narray represents a ",(0,n.jsx)(t.a,{href:"/curios/slots/slot-register",children:"registered slot type"})," and the entries do not stack, please refer to that page in\norder to change slot type behavior including default size."]})}),"\n",(0,n.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-json",children:'{\n "entities": ["player", "minecraft:zombie"],\n "slots": ["head", "back"]\n}\n'})}),"\n",(0,n.jsxs)(t.p,{children:["This configuration will give two slot types, ",(0,n.jsx)(t.code,{children:"head"})," and ",(0,n.jsx)(t.code,{children:"back"}),", to all players and all zombies."]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>o});var n=s(7294);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/add24532.40f62002.js b/assets/js/add24532.40f62002.js
deleted file mode 100644
index e993749..0000000
--- a/assets/js/add24532.40f62002.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[422],{2272:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>l,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var o=i(5893),s=i(1151);const n={sidebar_position:12},r="Curios Attribute Modifiers (NBT)",a={id:"curios/curios-nbt",title:"Curios Attribute Modifiers (NBT)",description:"A tutorial on how to edit a curio item's NBT data to add attribute modifiers when the item is worn in a curio slot.",source:"@site/docs/curios/curios-nbt.md",sourceDirName:"curios",slug:"/curios/curios-nbt",permalink:"/curios/curios-nbt",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/curios-nbt.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Example Datapack",permalink:"/curios/datapack-example"},next:{title:"Commands",permalink:"/curios/commands"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Syntax",id:"syntax",level:2}];function u(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"curios-attribute-modifiers-nbt",children:"Curios Attribute Modifiers (NBT)"}),"\n",(0,o.jsx)(t.p,{children:"A tutorial on how to edit a curio item's NBT data to add attribute modifiers when the item is worn in a curio slot."}),"\n",(0,o.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.p,{children:"Attribute modifiers used in item NBT for regular equipment slots will not work with curio slots. This is because the\nattribute modifiers are coded to work only in specific slots, and it will not recognize the custom curio slots. In order\nto grant this functionality, Curios adds its own method of adding NBT attribute modifiers in items."}),"\n",(0,o.jsxs)(t.p,{children:["The format for Curios is almost exactly the same as Minecraft, so it is recommended to look through this ",(0,o.jsx)(t.a,{href:"https://minecraft.fandom.com/wiki/Attribute",children:"Attribute Guide"}),"\nfor extended information about attribute names, syntax, and possible fields. This guide will only go over the\ndifferences in Curios."]}),"\n",(0,o.jsx)(t.h2,{id:"syntax",children:"Syntax"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsx)(t.p,{children:"This is the vanilla way of adding an attribute modifier to the chest slot in an item's NBT:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:'/give @s netherite_chestplate{AttributeModifiers:[{Slot:"chest", AttributeName:"generic.attack_damage", Name:"generic.attack_damage", Amount:20.0, Operation:0, UUID:[I; 42853, 1689024593, -201178, -1559272105]}]} 1\n'})}),"\n",(0,o.jsx)(t.p,{children:"This is the Curios way of achieving the same in the body slot:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:'/give @s netherite_chestplate{CurioAttributeModifiers:[{Slot:"body", AttributeName:"generic.attack_damage", Name:"generic.attack_damage", Amount:20.0, Operation:0}]} 1\n'})}),"\n",(0,o.jsxs)(t.p,{children:["Note that the main differences are the change from ",(0,o.jsx)(t.code,{children:"AttributeModifiers"})," to ",(0,o.jsx)(t.code,{children:"CurioAttributeModifiers"})," and the change in\nthe slot name. The slot name should be the ",(0,o.jsx)(t.code,{children:"identifier"})," of a registered slot type."]}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsx)(t.p,{children:"It is recommended that the UUID be left out except for special circumstances. When absent, Curios will give the attribute\nmodifier a UUID based on the slot context which will prevent any stacking issues that could arise when multiple slots\nof the same type exist and the same attribute modifier is applied multiple times."})})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var o=i(7294);const s={},n=o.createContext(s);function r(e){const t=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(n.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/bfeab3de.5bc9b32a.js b/assets/js/bfeab3de.5bc9b32a.js
new file mode 100644
index 0000000..1b15477
--- /dev/null
+++ b/assets/js/bfeab3de.5bc9b32a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[82],{8815:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=i(5893),r=i(1151),o=i(4866),s=i(5162);const a={sidebar_position:11},l="Slot Modifiers",d={id:"curios/slots/slot-modifiers",title:"Slot Modifiers",description:"A tutorial on how to add and remove slots from the curios inventory on entities.",source:"@site/docs/curios/slots/slot-modifiers.mdx",sourceDirName:"curios/slots",slug:"/curios/slots/slot-modifiers",permalink:"/curios/slots/slot-modifiers",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/slots/slot-modifiers.mdx",tags:[],version:"current",sidebarPosition:11,frontMatter:{sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Slot Icon Textures",permalink:"/curios/slots/slot-textures"},next:{title:"Data Generation",permalink:"/curios/slots/data-generation"}},u={},c=[{value:"Overview",id:"overview",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Adding or Removing Slots",id:"adding-or-removing-slots",level:2},{value:"Removing Slot Modifiers",id:"removing-slot-modifiers",level:2},{value:"Items",id:"items",level:2},{value:"Interfaces",id:"interfaces",level:3},{value:"NBT Tag",id:"nbt-tag",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"slot-modifiers",children:"Slot Modifiers"}),"\n",(0,n.jsx)(t.p,{children:"A tutorial on how to add and remove slots from the curios inventory on entities."}),"\n",(0,n.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,n.jsxs)(t.p,{children:["Slot modifiers are a way to dynamically add and/or remove slots from entities the same way developers could add and/or\nremove health or attack damage. In fact, it uses the exact same ",(0,n.jsx)(t.code,{children:"AttributeModifier"})," system to accomplish this."]}),"\n",(0,n.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,n.jsxs)(t.p,{children:["The main way to interact with and add slot modifiers is through the ",(0,n.jsx)(t.code,{children:"top.theillusivec4.curios.api.type.capability.ICuriosItemHandler"}),"\ninterface. A developer can grab the specific instance of this on the entity by following the steps from the ",(0,n.jsx)(t.a,{href:"/curios/inventory/basic-inventory",children:"inventory"}),"\nguide to query the capability from Curios."]}),"\n",(0,n.jsx)(t.h2,{id:"adding-or-removing-slots",children:"Adding or Removing Slots"}),"\n",(0,n.jsxs)(t.p,{children:["Adding slots can be done through ",(0,n.jsx)(t.code,{children:"ICuriosItemHandler#addTransientSlotModifiers(Multimap)"})," and\n",(0,n.jsx)(t.code,{children:"ICuriosItemHandler#addPermanentSlotModifiers(Multimap)"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["A ",(0,n.jsx)(t.strong,{children:"transient"})," slot modifier is a slot modifier that is not serialized to the player data, while a ",(0,n.jsx)(t.strong,{children:"permanent"})," slot\nmodifier is serialized. The former will disappear upon players relogging into a world and the latter will always remain\nuntil manually removed. Transient slot modifiers are often used for effects that may not always be present and need to\nbe verified at certain times while permanent slot modifiers are often used as rewards or other effects that are not\nmeant to be removed often, if ever."]}),"\n",(0,n.jsx)(t.admonition,{type:"tip",children:(0,n.jsx)(t.p,{children:"For slot types that should not appear until given by a relevant slot modifier, be sure to set the default amount of slots\nto 0 so that it does not give any slots by default."})}),"\n",(0,n.jsx)(t.p,{children:"An example of adding a transient slot modifier:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.getCuriosInventory(livingEntity).ifPresent(inventory -> {\n inventory.addTransientSlotModifier("ring", uuid, "name", 2, AttributeModifier.Operation.ADDITION));\n});\n'})}),"\n",(0,n.jsxs)(t.p,{children:["This will add 2 slots to the ",(0,n.jsx)(t.code,{children:"ring"})," slot type, with the specified ",(0,n.jsx)(t.code,{children:"name"})," and ",(0,n.jsx)(t.code,{children:"uuid"})," (UUID is not provided so developers\nwill need to generate or substitute one). Note that each key for the map must be a valid ",(0,n.jsx)(t.code,{children:"SlotType"})," identifier, such as\n",(0,n.jsx)(t.code,{children:'"ring"'})," or ",(0,n.jsx)(t.code,{children:'"necklace"'}),"."]}),"\n",(0,n.jsx)(t.p,{children:"In the case of adding multiple slot modifiers at once:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.getCuriosInventory(livingEntity).ifPresent(inventory -> {\n Map map = LinkedHashMultimap.create();\n map.put("ring", new AttributeModifier(uuid, "name", 2, AttributeModifier.Operation.ADDITION));\n map.put("necklace", new AttributeModifier(uuid, "name", 1, AttributeModifier.Operation.ADDITION));\n inventory.addTransientSlotModifiers(map);\n});\n'})}),"\n",(0,n.jsxs)(t.p,{children:["If slots need to be ",(0,n.jsx)(t.strong,{children:"removed"}),", this is as simple as stating a negative amount for an ",(0,n.jsx)(t.code,{children:"AttributeModifier.Operation.ADDITION"}),"\noperation in the ",(0,n.jsx)(t.code,{children:"AttributeModifier"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'inventory.addTransientSlotModifier("ring", uuid, "name", -2, AttributeModifier.Operation.ADDITION));\n'})}),"\n",(0,n.jsxs)(t.p,{children:["Instead of adding 2 slots, this will ",(0,n.jsx)(t.strong,{children:"remove"})," 2 slots."]}),"\n",(0,n.jsx)(t.p,{children:"If the total slot amount results in a number less than 0, the slots will remain at 0 but the slot modifiers will remain\nand existing slot modifiers will stack with each other. If a slot modifier removes 2 slots and the base amount is\nalready 0, there will seemingly be no effect. However, if another slot modifier adds 3 slots on top of that, it will add\nto the existing -2 and result in a total of 1 slot."}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["Slot modifiers can only add slots for slot types that are already assigned to entities. If a slot type exists but is not\nassigned to the specified entity, then the slot modifier will not be able to add any slots of that slot type. Be sure to\ngo over ",(0,n.jsx)(t.a,{href:"./entity-register",children:"how to assign slots to entities"})," if slot modifiers do not appear to be adding any slots."]})}),"\n",(0,n.jsx)(t.h2,{id:"removing-slot-modifiers",children:"Removing Slot Modifiers"}),"\n",(0,n.jsxs)(t.p,{children:["Removing slot modifiers can be done through ",(0,n.jsx)(t.code,{children:"ICuriosItemHandler#removeSlotModifiers(Multimap)"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"This follows very similar logic as the preceding section on adding slot modifiers:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.getCuriosInventory(livingEntity).ifPresent(inventory -> {\n inventory.removeSlotModifier("ring", uuid);\n})\n'})}),"\n",(0,n.jsxs)(t.p,{children:["This will remove the slot modifier with UUID ",(0,n.jsx)(t.code,{children:"uuid"})," from the ",(0,n.jsx)(t.code,{children:"ring"})," slot type."]}),"\n",(0,n.jsx)(t.p,{children:"In the case of removing multiple slot modifiers at once:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.getCuriosInventory(livingEntity).ifPresent(inventory -> {\n Map map = LinkedHashMultimap.create();\n map.put("ring", new AttributeModifier(uuid, "name", 2, AttributeModifier.Operation.ADDITION));\n inventory.removeSlotModifiers(map);\n})\n'})}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"AttributeModifier"})," used is mostly filler, the amount and operation do not matter. The key and the ",(0,n.jsx)(t.code,{children:"uuid"}),", however,\nmust match the ones used for the slot modifier being removed."]}),"\n",(0,n.jsx)(t.h2,{id:"items",children:"Items"}),"\n",(0,n.jsx)(t.p,{children:"The methods above are helpful for universal applications, but there are more streamlined methods for developers that\nwant to attach slot modifiers to specific items so that they are only applied when those items are equipped and then\nremoved when unequipped."}),"\n",(0,n.jsx)(t.h3,{id:"interfaces",children:"Interfaces"}),"\n",(0,n.jsxs)(t.p,{children:["Both the ",(0,n.jsx)(t.code,{children:"ICurio"})," and ",(0,n.jsx)(t.code,{children:"ICurioItem"})," interfaces expose a method called ",(0,n.jsx)(t.code,{children:"getAttributeModifiers"})," that returns a\n",(0,n.jsx)(t.code,{children:"Multimap"})," denoting attributes and their modifiers, in the same way that items themselves\nhave a similar method when equipped in vanilla slots. For more information on attaching these interfaces to items, see\nthe ",(0,n.jsx)(t.a,{href:"../items/curio-creation",children:"curio creation page"}),"."]}),"\n",(0,n.jsxs)(o.Z,{groupId:"curiointerface",children:[(0,n.jsx)(s.Z,{value:"curio",label:"ICurio",default:!0,children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"@Override\npublic Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid) {\n Multimap map = LinkedHashMultimap.create();\n // Add attribute modifiers\n return map;\n}\n"})})}),(0,n.jsx)(s.Z,{value:"curioitem",label:"ICurioItem",default:!0,children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"@Override\npublic Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid, ItemStack stack) {\n Multimap map = LinkedHashMultimap.create();\n // Add attribute modifiers\n return map;\n}\n"})})})]}),"\n",(0,n.jsxs)(t.p,{children:["In order to add ",(0,n.jsx)(t.strong,{children:"slot"})," modifiers specifically, developers can leverage the\n",(0,n.jsx)(t.code,{children:"CuriosApi#addSlotModifier(Multimap, String, UUID, double, AttributeModifier.Operation)"})," method:"]}),"\n",(0,n.jsxs)(o.Z,{groupId:"curiointerface",children:[(0,n.jsx)(s.Z,{value:"curio",label:"ICurio",default:!0,children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'@Override\npublic Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid) {\n Multimap map = LinkedHashMultimap.create();\n CuriosApi.addSlotModifier(map, "ring", uuid, 2, AttributeModifier.Operation.ADDITION);\n return map;\n}\n'})})}),(0,n.jsx)(s.Z,{value:"curioitem",label:"ICurioItem",default:!0,children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'@Override\npublic Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid, ItemStack stack) {\n Multimap map = LinkedHashMultimap.create();\n CuriosApi.addSlotModifier(map, "ring", uuid, 2, AttributeModifier.Operation.ADDITION);\n return map;\n}\n'})})})]}),"\n",(0,n.jsxs)(t.p,{children:["This will add 2 slots of the ",(0,n.jsx)(t.code,{children:"ring"})," slot type using the passed in ",(0,n.jsx)(t.code,{children:"uuid"})," from the second parameter of the method. The\nslots will only be added when this item is equipped and those slots will be removed when this item is unequipped."]}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["Although the ",(0,n.jsx)(t.code,{children:"uuid"})," in the preceding section can be decided on a case-by-case basis, the ",(0,n.jsx)(t.code,{children:"uuid"})," in this section related\nto items is ",(0,n.jsx)(t.strong,{children:"strongly encouraged"})," to be fed from the second parameter of the ",(0,n.jsx)(t.code,{children:"getAttributeModifiers"})," method. This is\nbecause the UUID in the parameter is guaranteed to be slot-specific, which avoids any collision issues in case multiple\ninstances of the same item are equipped."]})}),"\n",(0,n.jsx)(t.h3,{id:"nbt-tag",children:"NBT Tag"}),"\n",(0,n.jsx)(t.p,{children:"The previous method works for items that developers can directly register or implement interfaces or capabilities for,\nbut this can fall short if developers want to add these modifiers dynamically or even override previously registered\nbehavior."}),"\n",(0,n.jsxs)(t.p,{children:["As an alternative, developers can directly add slot modifiers to item NBT tags as well using ",(0,n.jsx)(t.code,{children:"CuriosApi#addSlotModifier(ItemStack, String, String, UUID, double, AttributeModifier.Operation, String)"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.addSlotModifier(stack, "ring", "name", uuid, 2, AttributeModifier.Operation.ADDITION, "necklace");\n'})}),"\n",(0,n.jsxs)(t.p,{children:["There are two slot identifiers in this method. The first one, ",(0,n.jsx)(t.code,{children:'"ring"'})," above, denotes the slot type that the slot modifier\ngives or removes slots from. The second one, ",(0,n.jsx)(t.code,{children:'"necklace"'})," above, denotes the slot type that the slot modifier becomes\nactive in. In other words, the above example will give 2 ",(0,n.jsx)(t.code,{children:"ring"})," slots when the item is equipped in a ",(0,n.jsx)(t.code,{children:"necklace"})," slot."]}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["It's usually best to use ",(0,n.jsx)(t.code,{children:"null"})," in place of the ",(0,n.jsx)(t.code,{children:"uuid"}),", to avoid collisions as described in the preceding caution note,\nunless there is justification for providing a static UUID. Providing a ",(0,n.jsx)(t.code,{children:"null"})," UUID will allow Curios to provide a\nslot-specific UUID in its place."]})})]})}function m(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},5162:(e,t,i)=>{i.d(t,{Z:()=>s});i(7294);var n=i(512);const r={tabItem:"tabItem_Ymn6"};var o=i(5893);function s(e){let{children:t,hidden:i,className:s}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.Z)(r.tabItem,s),hidden:i,children:t})}},4866:(e,t,i)=>{i.d(t,{Z:()=>I});var n=i(7294),r=i(512),o=i(2466),s=i(6550),a=i(469),l=i(1980),d=i(7392),u=i(12);function c(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:i}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return c(e).map((e=>{let{props:{value:t,label:i,attributes:n,default:r}}=e;return{value:t,label:i,attributes:n,default:r}}))}(i);return function(e){const t=(0,d.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function m(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:i}=e;const r=(0,s.k6)(),o=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l._X)(o),(0,n.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:r}=e,o=h(e),[s,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=i.find((e=>e.default))??i[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[d,c]=p({queryString:i,groupId:r}),[f,v]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,u.Nk)(i);return[r,(0,n.useCallback)((e=>{i&&o.set(e)}),[i,o])]}({groupId:r}),g=(()=>{const e=d??f;return m({value:e,tabValues:o})?e:null})();(0,a.Z)((()=>{g&&l(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),c(e),v(e)}),[c,v,o]),tabValues:o}}var v=i(2389);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=i(5893);function x(e){let{className:t,block:i,selectedValue:n,selectValue:s,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,o.o5)(),u=e=>{const t=e.currentTarget,i=l.indexOf(t),r=a[i].value;r!==n&&(d(t),s(r))},c=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":i},t),children:a.map((e=>{let{value:t,label:i,attributes:o}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:c,onClick:u,...o,className:(0,r.Z)("tabs__item",g.tabItem,o?.className,{"tabs__item--active":n===t}),children:i??t},t)}))})}function j(e){let{lazy:t,children:i,selectedValue:r}=e;const o=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function y(e){const t=f(e);return(0,b.jsxs)("div",{className:(0,r.Z)("tabs-container",g.tabList),children:[(0,b.jsx)(x,{...e,...t}),(0,b.jsx)(j,{...e,...t})]})}function I(e){const t=(0,v.Z)();return(0,b.jsx)(y,{...e,children:c(e.children)},String(t))}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>s});var n=i(7294);const r={},o=n.createContext(r);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/cacef8c5.dc676ee6.js b/assets/js/cacef8c5.dc676ee6.js
deleted file mode 100644
index 8f1aeb4..0000000
--- a/assets/js/cacef8c5.dc676ee6.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[690],{498:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=i(5893),r=i(1151),o=i(4866),s=i(5162);const a={sidebar_position:3},l="Slot Modifiers",d={id:"curios/Developing with Curios/slot-modifiers",title:"Slot Modifiers",description:"A tutorial on how to add and remove slots from the curios inventory on entities.",source:"@site/docs/curios/Developing with Curios/slot-modifiers.mdx",sourceDirName:"curios/Developing with Curios",slug:"/curios/Developing with Curios/slot-modifiers",permalink:"/curios/Developing with Curios/slot-modifiers",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/Developing with Curios/slot-modifiers.mdx",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Creating a Curio",permalink:"/curios/Developing with Curios/curio-creation"},next:{title:"Data Generation",permalink:"/curios/Developing with Curios/data-generation"}},u={},c=[{value:"Overview",id:"overview",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Adding or Removing Slots",id:"adding-or-removing-slots",level:2},{value:"Removing Slot Modifiers",id:"removing-slot-modifiers",level:2},{value:"Items",id:"items",level:2},{value:"Interfaces",id:"interfaces",level:3},{value:"NBT Tag",id:"nbt-tag",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"slot-modifiers",children:"Slot Modifiers"}),"\n",(0,n.jsx)(t.p,{children:"A tutorial on how to add and remove slots from the curios inventory on entities."}),"\n",(0,n.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,n.jsxs)(t.p,{children:["Slot modifiers are a way to dynamically add and/or remove slots from entities the same way developers could add and/or\nremove health or attack damage. In fact, it uses the exact same ",(0,n.jsx)(t.code,{children:"AttributeModifier"})," system to accomplish this."]}),"\n",(0,n.jsx)(t.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,n.jsxs)(t.p,{children:["The main way to interact with and add slot modifiers is through the ",(0,n.jsx)(t.code,{children:"top.theillusivec4.curios.api.type.capability.ICuriosItemHandler"}),"\ninterface. A developer can grab the specific instance of this on the entity by querying the capability from Curios:"]}),"\n",(0,n.jsxs)(o.Z,{groupId:"modloader",children:[(0,n.jsxs)(s.Z,{value:"forge",label:"Forge",default:!0,children:[(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"LazyOptional maybeCuriosInventory = CuriosApi.getCuriosInventory(livingEntity);\n"})}),(0,n.jsxs)(t.p,{children:["The query returns a ",(0,n.jsx)(t.code,{children:"LazyOptional"})," as the specified entity may not have a curios inventory. If the result is certain to\nexist, then the optionality can be disregarded and simplified to:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"ICuriosItemHandler curiosInventory = CuriosApi.getCuriosInventory(livingEntity).resolve().get();\n"})})]}),(0,n.jsxs)(s.Z,{value:"neoforge-2",label:"NeoForge 1.20.3+",children:[(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"Optional maybeCuriosInventory = CuriosApi.getCuriosInventory(livingEntity);\n"})}),(0,n.jsxs)(t.p,{children:["The query returns a ",(0,n.jsx)(t.code,{children:"Optional"})," as the specified entity may not have a curios inventory. If the result is certain to\nexist, then the optionality can be disregarded and simplified to:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"ICuriosItemHandler curiosInventory = CuriosApi.getCuriosInventory(livingEntity).get();\n"})})]})]}),"\n",(0,n.jsx)(t.h2,{id:"adding-or-removing-slots",children:"Adding or Removing Slots"}),"\n",(0,n.jsxs)(t.p,{children:["Adding slots can be done through ",(0,n.jsx)(t.code,{children:"ICuriosItemHandler#addTransientSlotModifiers(Multimap)"})," and\n",(0,n.jsx)(t.code,{children:"ICuriosItemHandler#addPermanentSlotModifiers(Multimap)"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["A ",(0,n.jsx)(t.strong,{children:"transient"})," slot modifier is a slot modifier that is not serialized to the player data, while a ",(0,n.jsx)(t.strong,{children:"permanent"})," slot\nmodifier is serialized. The former will disappear upon players relogging into a world and the latter will always remain\nuntil manually removed. Transient slot modifiers are often used for effects that may not always be present and need to\nbe verified at certain times while permanent slot modifiers are often used as rewards or other effects that are not\nmeant to be removed often, if ever."]}),"\n",(0,n.jsx)(t.admonition,{type:"tip",children:(0,n.jsx)(t.p,{children:"For slot types that should not appear until given by a relevant slot modifier, be sure to set the default amount of slots\nto 0 so that it does not give any slots by default."})}),"\n",(0,n.jsx)(t.p,{children:"An example of adding a transient slot modifier:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.getCuriosInventory(livingEntity).ifPresent(inventory -> {\n inventory.addTransientSlotModifier("ring", uuid, "name", 2, AttributeModifier.Operation.ADDITION));\n});\n'})}),"\n",(0,n.jsxs)(t.p,{children:["This will add 2 slots to the ",(0,n.jsx)(t.code,{children:"ring"})," slot type, with the specified ",(0,n.jsx)(t.code,{children:"name"})," and ",(0,n.jsx)(t.code,{children:"uuid"})," (UUID is not provided so developers\nwill need to generate or substitute one). Note that each key for the map must be a valid ",(0,n.jsx)(t.code,{children:"SlotType"})," identifier, such as\n",(0,n.jsx)(t.code,{children:'"ring"'})," or ",(0,n.jsx)(t.code,{children:'"necklace"'}),"."]}),"\n",(0,n.jsx)(t.p,{children:"In the case of adding multiple slot modifiers at once:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.getCuriosInventory(livingEntity).ifPresent(inventory -> {\n Map map = LinkedHashMultimap.create();\n map.put("ring", new AttributeModifier(uuid, "name", 2, AttributeModifier.Operation.ADDITION));\n map.put("necklace", new AttributeModifier(uuid, "name", 1, AttributeModifier.Operation.ADDITION));\n inventory.addTransientSlotModifiers(map);\n});\n'})}),"\n",(0,n.jsxs)(t.p,{children:["If slots need to be ",(0,n.jsx)(t.strong,{children:"removed"}),", this is as simple as stating a negative amount for an ",(0,n.jsx)(t.code,{children:"AttributeModifier.Operation.ADDITION"}),"\noperation in the ",(0,n.jsx)(t.code,{children:"AttributeModifier"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'inventory.addTransientSlotModifier("ring", uuid, "name", -2, AttributeModifier.Operation.ADDITION));\n'})}),"\n",(0,n.jsxs)(t.p,{children:["Instead of adding 2 slots, this will ",(0,n.jsx)(t.strong,{children:"remove"})," 2 slots."]}),"\n",(0,n.jsx)(t.p,{children:"If the total slot amount results in a number less than 0, the slots will remain at 0 but the slot modifiers will remain\nand existing slot modifiers will stack with each other. If a slot modifier removes 2 slots and the base amount is\nalready 0, there will seemingly be no effect. However, if another slot modifier adds 3 slots on top of that, it will add\nto the existing -2 and result in a total of 1 slot."}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["Slot modifiers can only add slots for slot types that are already assigned to entities. If a slot type exists but is not\nassigned to the specified entity, then the slot modifier will not be able to add any slots of that slot type. Be sure to\ngo over ",(0,n.jsx)(t.a,{href:"../entity-register",children:"how to assign slots to entities"})," if slot modifiers do not appear to be adding any slots."]})}),"\n",(0,n.jsx)(t.h2,{id:"removing-slot-modifiers",children:"Removing Slot Modifiers"}),"\n",(0,n.jsxs)(t.p,{children:["Removing slot modifiers can be done through ",(0,n.jsx)(t.code,{children:"ICuriosItemHandler#removeSlotModifiers(Multimap)"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"This follows very similar logic as the preceding section on adding slot modifiers:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.getCuriosInventory(livingEntity).ifPresent(inventory -> {\n inventory.removeSlotModifier("ring", uuid);\n})\n'})}),"\n",(0,n.jsxs)(t.p,{children:["This will remove the slot modifier with UUID ",(0,n.jsx)(t.code,{children:"uuid"})," from the ",(0,n.jsx)(t.code,{children:"ring"})," slot type."]}),"\n",(0,n.jsx)(t.p,{children:"In the case of removing multiple slot modifiers at once:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.getCuriosInventory(livingEntity).ifPresent(inventory -> {\n Map map = LinkedHashMultimap.create();\n map.put("ring", new AttributeModifier(uuid, "name", 2, AttributeModifier.Operation.ADDITION));\n inventory.removeSlotModifiers(map);\n})\n'})}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"AttributeModifier"})," used is mostly filler, the amount and operation do not matter. The key and the ",(0,n.jsx)(t.code,{children:"uuid"}),", however,\nmust match the ones used for the slot modifier being removed."]}),"\n",(0,n.jsx)(t.h2,{id:"items",children:"Items"}),"\n",(0,n.jsx)(t.p,{children:"The methods above are helpful for universal applications, but there are more streamlined methods for developers that\nwant to attach slot modifiers to specific items so that they are only applied when those items are equipped and then\nremoved when unequipped."}),"\n",(0,n.jsx)(t.h3,{id:"interfaces",children:"Interfaces"}),"\n",(0,n.jsxs)(t.p,{children:["Both the ",(0,n.jsx)(t.code,{children:"ICurio"})," and ",(0,n.jsx)(t.code,{children:"ICurioItem"})," interfaces expose a method called ",(0,n.jsx)(t.code,{children:"getAttributeModifiers"})," that returns a\n",(0,n.jsx)(t.code,{children:"Multimap"})," denoting attributes and their modifiers, in the same way that items themselves\nhave a similar method when equipped in vanilla slots. For more information on attaching these interfaces to items, see\nthe ",(0,n.jsx)(t.a,{href:"./curio-creation",children:"curio creation page"}),"."]}),"\n",(0,n.jsxs)(o.Z,{groupId:"curiointerface",children:[(0,n.jsx)(s.Z,{value:"curio",label:"ICurio",default:!0,children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"@Override\npublic Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid) {\n Multimap map = LinkedHashMultimap.create();\n // Add attribute modifiers\n return map;\n}\n"})})}),(0,n.jsx)(s.Z,{value:"curioitem",label:"ICurioItem",default:!0,children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"@Override\npublic Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid, ItemStack stack) {\n Multimap map = LinkedHashMultimap.create();\n // Add attribute modifiers\n return map;\n}\n"})})})]}),"\n",(0,n.jsxs)(t.p,{children:["In order to add ",(0,n.jsx)(t.strong,{children:"slot"})," modifiers specifically, developers can leverage the\n",(0,n.jsx)(t.code,{children:"CuriosApi#addSlotModifier(Multimap, String, UUID, double, AttributeModifier.Operation)"})," method:"]}),"\n",(0,n.jsxs)(o.Z,{groupId:"curiointerface",children:[(0,n.jsx)(s.Z,{value:"curio",label:"ICurio",default:!0,children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'@Override\npublic Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid) {\n Multimap map = LinkedHashMultimap.create();\n CuriosApi.addSlotModifier(map, "ring", uuid, 2, AttributeModifier.Operation.ADDITION);\n return map;\n}\n'})})}),(0,n.jsx)(s.Z,{value:"curioitem",label:"ICurioItem",default:!0,children:(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'@Override\npublic Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid, ItemStack stack) {\n Multimap map = LinkedHashMultimap.create();\n CuriosApi.addSlotModifier(map, "ring", uuid, 2, AttributeModifier.Operation.ADDITION);\n return map;\n}\n'})})})]}),"\n",(0,n.jsxs)(t.p,{children:["This will add 2 slots of the ",(0,n.jsx)(t.code,{children:"ring"})," slot type using the passed in ",(0,n.jsx)(t.code,{children:"uuid"})," from the second parameter of the method. The\nslots will only be added when this item is equipped and those slots will be removed when this item is unequipped."]}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["Although the ",(0,n.jsx)(t.code,{children:"uuid"})," in the preceding section can be decided on a case-by-case basis, the ",(0,n.jsx)(t.code,{children:"uuid"})," in this section related\nto items is ",(0,n.jsx)(t.strong,{children:"strongly encouraged"})," to be fed from the second parameter of the ",(0,n.jsx)(t.code,{children:"getAttributeModifiers"})," method. This is\nbecause the UUID in the parameter is guaranteed to be slot-specific, which avoids any collision issues in case multiple\ninstances of the same item are equipped."]})}),"\n",(0,n.jsx)(t.h3,{id:"nbt-tag",children:"NBT Tag"}),"\n",(0,n.jsx)(t.p,{children:"The previous method works for items that developers can directly register or implement interfaces or capabilities for,\nbut this can fall short if developers want to add these modifiers dynamically or even override previously registered\nbehavior."}),"\n",(0,n.jsxs)(t.p,{children:["As an alternative, developers can directly add slot modifiers to item NBT tags as well using ",(0,n.jsx)(t.code,{children:"CuriosApi#addSlotModifier(ItemStack, String, String, UUID, double, AttributeModifier.Operation, String)"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'CuriosApi.addSlotModifier(stack, "ring", "name", uuid, 2, AttributeModifier.Operation.ADDITION, "necklace");\n'})}),"\n",(0,n.jsxs)(t.p,{children:["There are two slot identifiers in this method. The first one, ",(0,n.jsx)(t.code,{children:'"ring"'})," above, denotes the slot type that the slot modifier\ngives or removes slots from. The second one, ",(0,n.jsx)(t.code,{children:'"necklace"'})," above, denotes the slot type that the slot modifier becomes\nactive in. In other words, the above example will give 2 ",(0,n.jsx)(t.code,{children:"ring"})," slots when the item is equipped in a ",(0,n.jsx)(t.code,{children:"necklace"})," slot."]}),"\n",(0,n.jsx)(t.admonition,{type:"caution",children:(0,n.jsxs)(t.p,{children:["It's usually best to use ",(0,n.jsx)(t.code,{children:"null"})," in place of the ",(0,n.jsx)(t.code,{children:"uuid"}),", to avoid collisions as described in the preceding caution note,\nunless there is justification for providing a static UUID. Providing a ",(0,n.jsx)(t.code,{children:"null"})," UUID will allow Curios to provide a\nslot-specific UUID in its place."]})})]})}function m(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},5162:(e,t,i)=>{i.d(t,{Z:()=>s});i(7294);var n=i(512);const r={tabItem:"tabItem_Ymn6"};var o=i(5893);function s(e){let{children:t,hidden:i,className:s}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.Z)(r.tabItem,s),hidden:i,children:t})}},4866:(e,t,i)=>{i.d(t,{Z:()=>I});var n=i(7294),r=i(512),o=i(2466),s=i(6550),a=i(469),l=i(1980),d=i(7392),u=i(12);function c(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:i}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return c(e).map((e=>{let{props:{value:t,label:i,attributes:n,default:r}}=e;return{value:t,label:i,attributes:n,default:r}}))}(i);return function(e){const t=(0,d.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function m(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:i}=e;const r=(0,s.k6)(),o=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l._X)(o),(0,n.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function f(e){const{defaultValue:t,queryString:i=!1,groupId:r}=e,o=h(e),[s,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=i.find((e=>e.default))??i[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[d,c]=p({queryString:i,groupId:r}),[f,v]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,u.Nk)(i);return[r,(0,n.useCallback)((e=>{i&&o.set(e)}),[i,o])]}({groupId:r}),g=(()=>{const e=d??f;return m({value:e,tabValues:o})?e:null})();(0,a.Z)((()=>{g&&l(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),c(e),v(e)}),[c,v,o]),tabValues:o}}var v=i(2389);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=i(5893);function x(e){let{className:t,block:i,selectedValue:n,selectValue:s,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,o.o5)(),u=e=>{const t=e.currentTarget,i=l.indexOf(t),r=a[i].value;r!==n&&(d(t),s(r))},c=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":i},t),children:a.map((e=>{let{value:t,label:i,attributes:o}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:c,onClick:u,...o,className:(0,r.Z)("tabs__item",g.tabItem,o?.className,{"tabs__item--active":n===t}),children:i??t},t)}))})}function j(e){let{lazy:t,children:i,selectedValue:r}=e;const o=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function y(e){const t=f(e);return(0,b.jsxs)("div",{className:(0,r.Z)("tabs-container",g.tabList),children:[(0,b.jsx)(x,{...e,...t}),(0,b.jsx)(j,{...e,...t})]})}function I(e){const t=(0,v.Z)();return(0,b.jsx)(y,{...e,children:c(e.children)},String(t))}},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>s});var n=i(7294);const r={},o=n.createContext(r);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d943a703.e4f3409d.js b/assets/js/d943a703.e4f3409d.js
new file mode 100644
index 0000000..8c50530
--- /dev/null
+++ b/assets/js/d943a703.e4f3409d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[18],{7145:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>l,toc:()=>a});var t=i(5893),r=i(1151);const s={sidebar_position:1},o="Setting Up the Development Environment",l={id:"curios/getting-started",title:"Setting Up the Development Environment",description:"A tutorial on how to set up your development workspace to work with Curios API interfaces and methods.",source:"@site/docs/curios/getting-started.md",sourceDirName:"curios",slug:"/curios/getting-started",permalink:"/curios/getting-started",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/getting-started.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Curios",permalink:"/category/curios"},next:{title:"Slots",permalink:"/category/slots"}},c={},a=[{value:"Set up your build script",id:"set-up-your-build-script",level:2},{value:"Add repository",id:"add-repository",level:3},{value:"Add dependencies",id:"add-dependencies",level:3},{value:"Configure runs for mixin",id:"configure-runs-for-mixin",level:3},{value:"Select a version",id:"select-a-version",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"setting-up-the-development-environment",children:"Setting Up the Development Environment"}),"\n",(0,t.jsx)(n.p,{children:"A tutorial on how to set up your development workspace to work with Curios API interfaces and methods."}),"\n",(0,t.jsx)(n.h2,{id:"set-up-your-build-script",children:"Set up your build script"}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add-repository",children:"Add repository"}),"\n",(0,t.jsxs)(n.p,{children:["First, add the repository hosting the Curios API files by adding the following to your build script's\n",(0,t.jsx)(n.code,{children:"repositories"})," block:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-gradle",children:'repositories {\n maven {\n name = "Illusive Soulworks maven"\n url = "https://maven.theillusivec4.top/"\n }\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"add-dependencies",children:"Add dependencies"}),"\n",(0,t.jsxs)(n.p,{children:["Secondly, add the Curios API dependencies to your build script's ",(0,t.jsx)(n.code,{children:"dependencies"})," block:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-gradle",children:'dependencies {\n // Compile against only the API artifact\n compileOnly(fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}:api"))\n // Use the full Curios API jar at runtime\n runtimeOnly(fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}"))\n}\n'})}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Why compile against only the API artifact?"})}),(0,t.jsx)(n.p,{children:"Compiling against only the API artifact is recommended because the artifact only contains the public API packages,\ninterfaces, and methods. These are all intended to be stable and will not break within the same major version if used.\nThe same cannot be said about internal packages and methods, which may accidentally be used if the full jar is included\nduring compile time. Including the full jar at runtime still means that testing can occur normally in development."}),(0,t.jsxs)(n.p,{children:["If there is an internal package and or method you would like to use, please make a suggestion on the ",(0,t.jsx)(n.a,{href:"https://github.com/TheIllusiveC4/Curios/issues",children:"issue tracker"}),"\nso that it may potentially be included in the public API."]})]}),"\n",(0,t.jsx)(n.h3,{id:"configure-runs-for-mixin",children:"Configure runs for mixin"}),"\n",(0,t.jsx)(n.p,{children:"Finally, since Curios uses mixins, your run configurations will need to ensure that the remapping functions correctly:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-gradle",children:"property 'mixin.env.remapRefMap', 'true'\nproperty 'mixin.env.refMapRemappingFile', \"${projectDir}/build/createSrgToMcp/output.srg\"\n"})}),"\n",(0,t.jsx)(n.p,{children:"Add the above code block into each of the run configurations that you plan on using, for example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-gradle",children:"runs {\n client {\n property 'mixin.env.remapRefMap', 'true'\n property 'mixin.env.refMapRemappingFile', \"${projectDir}/build/createSrgToMcp/output.srg\"\n }\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"Remember to regenerate the run configurations after changing the settings."}),"\n",(0,t.jsx)(n.h2,{id:"select-a-version",children:"Select a version"}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:["If you followed the steps above, ",(0,t.jsx)(n.code,{children:"${curios_version}"})," should be defined so that it is replaced by the specific Curios API\nversion that you want to use. This property can be set up by including a mapping in the ",(0,t.jsx)(n.code,{children:"gradle.properties"})," file located\nin the same directory as the ",(0,t.jsx)(n.code,{children:"build.gradle"})," file."]}),"\n",(0,t.jsxs)(n.p,{children:["Please see ",(0,t.jsx)(n.a,{href:"https://www.curseforge.com/minecraft/mc-mods/curios/files",children:"CurseForge"}),", ",(0,t.jsx)(n.a,{href:"https://modrinth.com/mod/curios/versions",children:"Modrinth"}),",\nor the ",(0,t.jsx)(n.a,{href:"https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/",children:"maven"})," for possible versions."]}),"\n",(0,t.jsxs)(n.p,{children:["Example in ",(0,t.jsx)(n.code,{children:"gradle.properties"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"curios_version=5.3.1+1.20.1\n"})})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>o});var t=i(7294);const r={},s=t.createContext(r);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/dcc5fc19.12bcd037.js b/assets/js/dcc5fc19.12bcd037.js
deleted file mode 100644
index 184b9f8..0000000
--- a/assets/js/dcc5fc19.12bcd037.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[162],{107:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>a});var t=i(5893),r=i(1151);const o={sidebar_position:1},s="Setting Up the Development Environment",l={id:"curios/Developing with Curios/getting-started",title:"Setting Up the Development Environment",description:"A tutorial on how to set up your development workspace to work with Curios API interfaces and methods.",source:"@site/docs/curios/Developing with Curios/getting-started.md",sourceDirName:"curios/Developing with Curios",slug:"/curios/Developing with Curios/getting-started",permalink:"/curios/Developing with Curios/getting-started",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/Developing with Curios/getting-started.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Commands",permalink:"/curios/commands"},next:{title:"Creating a Curio",permalink:"/curios/Developing with Curios/curio-creation"}},c={},a=[{value:"Set up your build script",id:"set-up-your-build-script",level:2},{value:"Add repository",id:"add-repository",level:3},{value:"Add dependencies",id:"add-dependencies",level:3},{value:"Configure runs for mixin",id:"configure-runs-for-mixin",level:3},{value:"Select a version",id:"select-a-version",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"setting-up-the-development-environment",children:"Setting Up the Development Environment"}),"\n",(0,t.jsx)(n.p,{children:"A tutorial on how to set up your development workspace to work with Curios API interfaces and methods."}),"\n",(0,t.jsx)(n.h2,{id:"set-up-your-build-script",children:"Set up your build script"}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h3,{id:"add-repository",children:"Add repository"}),"\n",(0,t.jsxs)(n.p,{children:["First, add the repository hosting the Curios API files by adding the following to your build script's\n",(0,t.jsx)(n.code,{children:"repositories"})," block:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-gradle",children:'repositories {\n maven {\n name = "Illusive Soulworks maven"\n url = "https://maven.theillusivec4.top/"\n }\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"add-dependencies",children:"Add dependencies"}),"\n",(0,t.jsxs)(n.p,{children:["Secondly, add the Curios API dependencies to your build script's ",(0,t.jsx)(n.code,{children:"dependencies"})," block:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-gradle",children:'dependencies {\n // Compile against only the API artifact\n compileOnly(fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}:api"))\n // Use the full Curios API jar at runtime\n runtimeOnly(fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}"))\n}\n'})}),"\n",(0,t.jsxs)(n.admonition,{type:"note",children:[(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Why compile against only the API artifact?"})}),(0,t.jsx)(n.p,{children:"Compiling against only the API artifact is recommended because the artifact only contains the public API packages,\ninterfaces, and methods. These are all intended to be stable and will not break within the same major version if used.\nThe same cannot be said about internal packages and methods, which may accidentally be used if the full jar is included\nduring compile time. Including the full jar at runtime still means that testing can occur normally in development."}),(0,t.jsxs)(n.p,{children:["If there is an internal package and or method you would like to use, please make a suggestion on the ",(0,t.jsx)(n.a,{href:"https://github.com/TheIllusiveC4/Curios/issues",children:"issue tracker"}),"\nso that it may potentially be included in the public API."]})]}),"\n",(0,t.jsx)(n.h3,{id:"configure-runs-for-mixin",children:"Configure runs for mixin"}),"\n",(0,t.jsx)(n.p,{children:"Finally, since Curios uses mixins, your run configurations will need to ensure that the remapping functions correctly:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-gradle",children:"property 'mixin.env.remapRefMap', 'true'\nproperty 'mixin.env.refMapRemappingFile', \"${projectDir}/build/createSrgToMcp/output.srg\"\n"})}),"\n",(0,t.jsx)(n.p,{children:"Add the above code block into each of the run configurations that you plan on using, for example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-gradle",children:"runs {\n client {\n property 'mixin.env.remapRefMap', 'true'\n property 'mixin.env.refMapRemappingFile', \"${projectDir}/build/createSrgToMcp/output.srg\"\n }\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"Remember to regenerate the run configurations after changing the settings."}),"\n",(0,t.jsx)(n.h2,{id:"select-a-version",children:"Select a version"}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:["If you followed the steps above, ",(0,t.jsx)(n.code,{children:"${curios_version}"})," should be defined so that it is replaced by the specific Curios API\nversion that you want to use. This property can be set up by including a mapping in the ",(0,t.jsx)(n.code,{children:"gradle.properties"})," file located\nin the same directory as the ",(0,t.jsx)(n.code,{children:"build.gradle"})," file."]}),"\n",(0,t.jsxs)(n.p,{children:["Please see ",(0,t.jsx)(n.a,{href:"https://www.curseforge.com/minecraft/mc-mods/curios/files",children:"CurseForge"}),", ",(0,t.jsx)(n.a,{href:"https://modrinth.com/mod/curios/versions",children:"Modrinth"}),",\nor the ",(0,t.jsx)(n.a,{href:"https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/",children:"maven"})," for possible versions."]}),"\n",(0,t.jsxs)(n.p,{children:["Example in ",(0,t.jsx)(n.code,{children:"gradle.properties"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"curios_version=5.3.1+1.20.1\n"})})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>s});var t=i(7294);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/e0b249dc.e7365bbb.js b/assets/js/e0b249dc.e7365bbb.js
new file mode 100644
index 0000000..9128b69
--- /dev/null
+++ b/assets/js/e0b249dc.e7365bbb.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[420],{1439:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>l});var o=s(5893),r=s(1151);const n={sidebar_position:9},i="Slot Icon Textures",a={id:"curios/slots/slot-textures",title:"Slot Icon Textures",description:"A tutorial on how to add custom slot textures to slot types.",source:"@site/docs/curios/slots/slot-textures.md",sourceDirName:"curios/slots",slug:"/curios/slots/slot-textures",permalink:"/curios/slots/slot-textures",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/slots/slot-textures.md",tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"Preset Slot Types",permalink:"/curios/slots/preset-slots"},next:{title:"Slot Modifiers",permalink:"/curios/slots/slot-modifiers"}},c={},l=[{value:"Overview",id:"overview",level:2},{value:"Registering a Slot Texture",id:"registering-a-slot-texture",level:2},{value:"Using a Slot Texture",id:"using-a-slot-texture",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",img:"img",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"slot-icon-textures",children:"Slot Icon Textures"}),"\n",(0,o.jsx)(t.p,{children:"A tutorial on how to add custom slot textures to slot types."}),"\n",(0,o.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsxs)(t.p,{children:["Registering a new custom slot texture can be done through a resource pack. If you are\nunfamiliar with resource packs, it is recommended to read through the ",(0,o.jsx)(t.a,{href:"https://minecraft.fandom.com/wiki/Resource_pack",children:"wiki page"}),"\nin order to understand the concept and structure before proceeding to the rest of this page."]}),"\n",(0,o.jsx)(t.h2,{id:"registering-a-slot-texture",children:"Registering a Slot Texture"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsxs)(t.p,{children:["Create a new resource directory ",(0,o.jsx)(t.code,{children:"assets/(namespace)/textures/slot"})," and place any ",(0,o.jsx)(t.code,{children:".png"})," file in the ",(0,o.jsx)(t.code,{children:"slot"})," folder."]}),"\n",(0,o.jsxs)(t.admonition,{type:"info",children:[(0,o.jsx)(t.p,{children:"The image itself should be 16x16 in size and have a transparent background with only the slot texture drawn."}),(0,o.jsxs)(t.p,{children:["Example: ",(0,o.jsx)(t.img,{src:"https://github.com/TheIllusiveC4/Curios/blob/1.16.x-forge/src/main/resources/assets/curios/textures/item/empty_back_slot.png?raw=true",alt:""})]})]}),"\n",(0,o.jsx)(t.admonition,{type:"note",children:(0,o.jsxs)(t.p,{children:["The ",(0,o.jsx)(t.code,{children:"(namespace)"})," field should be replaced by the namespace chosen for this portion of the resource pack. If this is a\npart of a mod, the namespace is usually the mod ID. If this is part of a user-defined resource pack, then the namespace\ncan be anything that is lowercased with no special characters."]})}),"\n",(0,o.jsx)(t.h2,{id:"using-a-slot-texture",children:"Using a Slot Texture"}),"\n",(0,o.jsx)(t.hr,{}),"\n",(0,o.jsxs)(t.p,{children:["When entering the fields of the ",(0,o.jsx)(t.code,{children:".json"})," slot registration files as described in ",(0,o.jsx)(t.a,{href:"./slot-register",children:"Register a Slot Type"}),",\nthe ",(0,o.jsx)(t.code,{children:'"icon"'})," field should be set to the path of the slot that was added to the resource directory."]}),"\n",(0,o.jsxs)(t.p,{children:["For example, a ",(0,o.jsx)(t.code,{children:"empty_test_slot.png"})," file placed in ",(0,o.jsx)(t.code,{children:"assets/test/textures/slot"})," that wants to be added to the ",(0,o.jsx)(t.code,{children:"charm"}),"\nslot should have a ",(0,o.jsx)(t.code,{children:"charm.json"})," slot registration file in a datapack with the following contents:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-json",children:'{\n "icon": "test:slot/empty_test_slot"\n}\n'})}),"\n",(0,o.jsx)(t.admonition,{type:"caution",children:(0,o.jsxs)(t.p,{children:["Note that the path in ",(0,o.jsx)(t.code,{children:'"icon"'})," is not the entire path of the directory. It omits the ",(0,o.jsx)(t.code,{children:"texture"})," part and also omits the\n",(0,o.jsx)(t.code,{children:".png"})," extension. This is due to how Curios and Minecraft parses the icon, so make sure the path is formatted correctly\nwhen adding this field."]})})]})}function h(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>i});var o=s(7294);const r={},n=o.createContext(r);function i(e){const t=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(n.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/e7ff71d3.b3ca14a4.js b/assets/js/e7ff71d3.b3ca14a4.js
new file mode 100644
index 0000000..a928831
--- /dev/null
+++ b/assets/js/e7ff71d3.b3ca14a4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[821],{3792:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=i(5893),r=i(1151),o=i(4866),a=i(5162);const s={sidebar_position:2},l="Creating a Curio",c={id:"curios/items/curio-creation",title:"Creating a Curio",description:"A tutorial on how to attach curio capabilities to your items.",source:"@site/docs/curios/items/curio-creation.mdx",sourceDirName:"curios/items",slug:"/curios/items/curio-creation",permalink:"/curios/items/curio-creation",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/items/curio-creation.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Items",permalink:"/category/items"},next:{title:"Rendering a Curio",permalink:"/curios/items/rendering-registry"}},u={},d=[{value:"Overview",id:"overview",level:2},{value:"Attaching an ICurio capability",id:"attaching-an-icurio-capability",level:2},{value:"Implementing the ICurioItem interface",id:"implementing-the-icurioitem-interface",level:2},{value:"Registering an ICurioItem implementation",id:"registering-an-icurioitem-implementation",level:2},{value:"Priority",id:"priority",level:2}];function h(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"creating-a-curio",children:"Creating a Curio"}),"\n",(0,n.jsx)(t.p,{children:"A tutorial on how to attach curio capabilities to your items."}),"\n",(0,n.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"Curios comes with interfaces that you can attach to your items in order to define certain behaviors for those items when\ninteracting with curios slots. This includes events such as ticking while in a curio slot or triggering certain actions\nwhen equipped or unequipped into a curio slot."}),"\n",(0,n.jsxs)(t.p,{children:["There are three main ways to implement the capability on your item: directly attaching an ",(0,n.jsx)(t.code,{children:"ICurio"})," implementation as a\ncapability, extending the ",(0,n.jsx)(t.code,{children:"ICurioItem"})," interface on your item, or registering an ",(0,n.jsx)(t.code,{children:"ICurioItem"})," implementation to an item."]}),"\n",(0,n.jsxs)(t.p,{children:["Only ",(0,n.jsx)(t.strong,{children:"one"})," of these methods needs to be implemented for the curio item to work."]}),"\n",(0,n.jsxs)(t.h2,{id:"attaching-an-icurio-capability",children:["Attaching an ",(0,n.jsx)(t.code,{children:"ICurio"})," capability"]}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsxs)(o.Z,{groupId:"modloader",children:[(0,n.jsxs)(a.Z,{value:"forge",label:"Forge",default:!0,children:[(0,n.jsx)(t.p,{children:"This is recommended for mods that are Forge-oriented, due to the use of capabilities, and want to attach the\ncapability optionally to their own items or another mod's items."}),(0,n.jsxs)(t.p,{children:["To attach the capability to your own items, override the ",(0,n.jsx)(t.code,{children:"IForgeItem#initCapabilities"})," method:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"@Override\npublic ICapabilityProvider initCapabilities(ItemStack stack, CompoundTag unused) {\n return CuriosApi.createCurioProvider(new ICurio() {\n \n @Override\n public ItemStack getStack() {\n return stack;\n }\n\n @Override\n public void curioTick(SlotContext slotContext) {\n // ticking logic here\n }\n });\n}\n"})}),(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"ICurio"})," implementation in the example can be replaced or extended by your own custom implementation. The\nimplementation can also exist in a separate class altogether as long as the instantiation is still done in the\n",(0,n.jsx)(t.code,{children:"IForgeItem#initCapabilities"})," method."]}),(0,n.jsxs)(t.p,{children:["To attach the capability to any item, including vanilla's and other mods', subscribe to the\n",(0,n.jsx)(t.code,{children:"AttachCapabilitiesEvent"})," and use its methods:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"@SubscribeEvent\npublic void attachCapabilities(AttachCapabilitiesEvent evt) {\n ItemStack stack = evt.getObject();\n Item item = stack.getItem();\n evt.addCapability(CuriosCapability.ID_ITEM, CuriosApi.createCurioProvider(new ICurio() {\n \n @Override\n public ItemStack getStack() {\n return stack;\n }\n \n @Override\n public void curioTick(SlotContext slotContext) {\n // ticking logic here\n }\n }));\n}\n"})}),(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsxs)(t.p,{children:["You will need to pass in the ",(0,n.jsx)(t.code,{children:"ItemStack"})," from the ",(0,n.jsx)(t.code,{children:"IForgeItem#initCapabilities"})," argument or the\n",(0,n.jsx)(t.code,{children:"AttachCapabilitiesEvent#getObject"})," result to the return of ",(0,n.jsx)(t.code,{children:"ICurio#getStack"})," as shown in the example. This makes sure\nthat the implementation receives the correct ",(0,n.jsx)(t.code,{children:"ItemStack"})," for further curios logic. Technically, ",(0,n.jsx)(t.code,{children:"ICurio#getStack"})," can\nreturn any stack if proxies are needed, but the use-case for that is outside the scope of this documentation."]})})]}),(0,n.jsxs)(a.Z,{value:"neoforge-2",label:"NeoForge 1.20.3+",default:!0,children:[(0,n.jsx)(t.p,{children:"This is recommended for mods that are NeoForge-oriented, due to the use of capabilities, and want to attach the\ncapability optionally to their own items or another mod's items."}),(0,n.jsxs)(t.p,{children:["To attach the capability to any item, including vanilla's and other mods', subscribe to the\n",(0,n.jsx)(t.code,{children:"RegisterCapabilitiesEvent"})," on the mod event bus and use its methods:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'@Mod("examplemod")\npublic class ExampleMod {\n\n public ExampleMod(IEventBus modEventBus) {\n modEventBus.addListener(this::registerCapabilities);\n }\n\n public void registerCapabilities(final RegisterCapabilitiesEvent evt) {\n evt.registerItem(\n CuriosCapability.ITEM,\n (stack, context) -> new ICurio() {\n\n @Override\n public ItemStack getStack() {\n return stack;\n }\n\n @Override\n public void curioTick(SlotContext slotContext) {\n // ticking logic here\n },\n ExampleMod.ITEM);\n }\n'})}),(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"ICurio"})," implementation in the example can be replaced or extended by your own custom implementation."]}),(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsxs)(t.p,{children:["You will need to pass in the ",(0,n.jsx)(t.code,{children:"ItemStack"})," from the ",(0,n.jsx)(t.code,{children:"(stack, context)"})," lambda in the ",(0,n.jsx)(t.code,{children:"RegisterCapabilitiesEvent#registerItem"}),"\nmethod to the return of ",(0,n.jsx)(t.code,{children:"ICurio#getStack"})," as shown in the example. This makes sure that the implementation receives the\ncorrect ",(0,n.jsx)(t.code,{children:"ItemStack"})," for further curios logic. Technically, ",(0,n.jsx)(t.code,{children:"ICurio#getStack"})," can return any stack if proxies are needed,\nbut the use-case for that is outside the scope of this documentation."]})})]})]}),"\n",(0,n.jsxs)(t.h2,{id:"implementing-the-icurioitem-interface",children:["Implementing the ",(0,n.jsx)(t.code,{children:"ICurioItem"})," interface"]}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"This is recommended for mods that want the simplest and most straightforward method, do not mind having Curios as a\nrequired dependency, and are only working with their own items."}),"\n",(0,n.jsxs)(t.p,{children:["To implement the ",(0,n.jsx)(t.code,{children:"ICurioItem"})," interface, simply implement it on your item class:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"public class CurioItem extends Item implements ICurioItem {\n\n public CurioItem() {\n super(new Item.Properties().stacksTo(1).defaultDurability(0));\n }\n\n @Override\n public void curioTick(SlotContext slotContext, ItemStack stack) {\n // ticking logic here\n }\n}\n"})}),"\n",(0,n.jsxs)(t.h2,{id:"registering-an-icurioitem-implementation",children:["Registering an ",(0,n.jsx)(t.code,{children:"ICurioItem"})," implementation"]}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"This is recommended for multi-loader mods as a platform-agnostic method of registering Curios behavior to their own\nitems or another mod's items that can be loaded optionally."}),"\n",(0,n.jsxs)(t.p,{children:["To register an ",(0,n.jsx)(t.code,{children:"ICurioItem"})," implementation, first create the implementation:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"public class CurioItem implements ICurioItem {\n\n @Override\n public void curioTick(SlotContext slotContext, ItemStack stack) {\n // ticking logic here\n }\n}\n"})}),"\n",(0,n.jsxs)(t.p,{children:["And then register it by using ",(0,n.jsx)(t.code,{children:"CurioApi#registerCurio"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:"CuriosApi.registerCurio(CurioModItems.MY_ITEM, new CurioItem());\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Registration can occur at any time, but for simplicity can be called during the ",(0,n.jsx)(t.code,{children:"FMLCommonSetupEvent"})," phase during mod\nloading:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-java",children:'@Mod("CurioMod")\npublic class CurioMod {\n\n public CurioMod() {\n final IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus();\n eventBus.addListener(this::setup);\n }\n\n private void setup(final FMLCommonSetupEvent evt) {\n CuriosApi.registerCurio(CurioModItems.MY_ITEM, new CurioItem());\n }\n}\n'})}),"\n",(0,n.jsx)(t.h2,{id:"priority",children:"Priority"}),"\n",(0,n.jsx)(t.hr,{}),"\n",(0,n.jsx)(t.p,{children:"In situations where multiple implementations are registered to the same item, there a few things to take note of:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Only one implementation will be used on any one item, any other implementations found will be ignored."}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"ICurio"})," capabilities initialized through ",(0,n.jsx)(t.code,{children:"IForgeItem#initCapabilities"})," will always be prioritized and other\nimplementations will be ignored."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"ICurioItem"})," implementations registered through ",(0,n.jsx)(t.code,{children:"CuriosApi#registerCurio"})," will be prioritized over ",(0,n.jsx)(t.code,{children:"ICurioItem"}),"\nimplementations directly on the item class."]}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},5162:(e,t,i)=>{i.d(t,{Z:()=>a});i(7294);var n=i(512);const r={tabItem:"tabItem_Ymn6"};var o=i(5893);function a(e){let{children:t,hidden:i,className:a}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.Z)(r.tabItem,a),hidden:i,children:t})}},4866:(e,t,i)=>{i.d(t,{Z:()=>C});var n=i(7294),r=i(512),o=i(2466),a=i(6550),s=i(469),l=i(1980),c=i(7392),u=i(12);function d(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:i}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:i,attributes:n,default:r}}=e;return{value:t,label:i,attributes:n,default:r}}))}(i);return function(e){const t=(0,c.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,i])}function m(e){let{value:t,tabValues:i}=e;return i.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:i}=e;const r=(0,a.k6)(),o=function(e){let{queryString:t=!1,groupId:i}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:t,groupId:i});return[(0,l._X)(o),(0,n.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(r.location.search);t.set(o,e),r.replace({...r.location,search:t.toString()})}),[o,r])]}function g(e){const{defaultValue:t,queryString:i=!1,groupId:r}=e,o=h(e),[a,l]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=i.find((e=>e.default))??i[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[c,d]=p({queryString:i,groupId:r}),[g,b]=function(e){let{groupId:t}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(t),[r,o]=(0,u.Nk)(i);return[r,(0,n.useCallback)((e=>{i&&o.set(e)}),[i,o])]}({groupId:r}),x=(()=>{const e=c??g;return m({value:e,tabValues:o})?e:null})();(0,s.Z)((()=>{x&&l(x)}),[x]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)}),[d,b,o]),tabValues:o}}var b=i(2389);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=i(5893);function f(e){let{className:t,block:i,selectedValue:n,selectValue:a,tabValues:s}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,o.o5)(),u=e=>{const t=e.currentTarget,i=l.indexOf(t),r=s[i].value;r!==n&&(c(t),a(r))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const i=l.indexOf(e.currentTarget)+1;t=l[i]??l[0];break}case"ArrowLeft":{const i=l.indexOf(e.currentTarget)-1;t=l[i]??l[l.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.Z)("tabs",{"tabs--block":i},t),children:s.map((e=>{let{value:t,label:i,attributes:o}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>l.push(e),onKeyDown:d,onClick:u,...o,className:(0,r.Z)("tabs__item",x.tabItem,o?.className,{"tabs__item--active":n===t}),children:i??t},t)}))})}function j(e){let{lazy:t,children:i,selectedValue:r}=e;const o=(Array.isArray(i)?i:[i]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function I(e){const t=g(e);return(0,v.jsxs)("div",{className:(0,r.Z)("tabs-container",x.tabList),children:[(0,v.jsx)(f,{...e,...t}),(0,v.jsx)(j,{...e,...t})]})}function C(e){const t=(0,b.Z)();return(0,v.jsx)(I,{...e,children:d(e.children)},String(t))}},1151:(e,t,i)=>{i.d(t,{Z:()=>s,a:()=>a});var n=i(7294);const r={},o=n.createContext(r);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ef6cb8ea.5174c0cb.js b/assets/js/ef6cb8ea.5174c0cb.js
deleted file mode 100644
index 2863edf..0000000
--- a/assets/js/ef6cb8ea.5174c0cb.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[969],{8329:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>a,frontMatter:()=>d,metadata:()=>o,toc:()=>c});var i=s(5893),n=s(1151);const d={sidebar_position:1},r="Registering and Editing Slot Types",o={id:"curios/slot-register",title:"Registering and Editing Slot Types",description:"A tutorial on how to register and modify slot types that are recognized by Curios.",source:"@site/docs/curios/slot-register.md",sourceDirName:"curios",slug:"/curios/slot-register",permalink:"/curios/slot-register",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/slot-register.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Curios",permalink:"/category/curios"},next:{title:"Adding Slot Types to Entities",permalink:"/curios/entity-register"}},l={},c=[{value:"Overview",id:"overview",level:2},{value:"Directory",id:"directory",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Example",id:"example",level:2},{value:"Modifying a Slot Type",id:"modifying-a-slot-type",level:2},{value:"Example",id:"example-1",level:3}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"registering-and-editing-slot-types",children:"Registering and Editing Slot Types"}),"\n",(0,i.jsx)(t.p,{children:"A tutorial on how to register and modify slot types that are recognized by Curios."}),"\n",(0,i.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsxs)(t.p,{children:["Beginning in 1.20, the recommended way to register a slot type is through a datapack. If you are unfamiliar with\ndatapacks, it is recommended to read through the ",(0,i.jsx)(t.a,{href:"https://minecraft.fandom.com/wiki/Data_pack",children:"wiki page"})," in order to\nunderstand the concept and structure before proceeding to the rest of this page."]}),"\n",(0,i.jsxs)(t.p,{children:["If using one of the ",(0,i.jsx)(t.a,{href:"./preset-slots",children:"Preset Slot Types"}),", this step can be skipped since Curios natively provides the\nneeded datapack registration."]}),"\n",(0,i.jsxs)(t.admonition,{type:"info",children:[(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Why are my registered slot types not appearing?"})}),(0,i.jsxs)(t.p,{children:["Registering slot types makes them available for use; however, they are ",(0,i.jsx)(t.em,{children:"not"})," added to any entities (including players)\nby default. In order to add them to an entity, please refer to ",(0,i.jsx)(t.a,{href:"/curios/entity-register",children:"the next step"})," on adding slot\ntypes to entities."]})]}),"\n",(0,i.jsx)(t.h2,{id:"directory",children:"Directory"}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsxs)(t.p,{children:["The file should be a ",(0,i.jsx)(t.code,{children:".json"})," file with the ",(0,i.jsx)(t.code,{children:"identifier"})," for the slot type to be registered as the name. This file\nshould be located in the ",(0,i.jsx)(t.code,{children:"~/data/(namespace)/curios/slots/"})," folder of the datapack."]}),"\n",(0,i.jsxs)(t.p,{children:["Example: Registering a ",(0,i.jsx)(t.code,{children:"head"})," slot type requires creating a ",(0,i.jsx)(t.code,{children:"head.json"})," file located in ",(0,i.jsx)(t.code,{children:"~/data/(namespace)/curios/slots/"}),"\nso the final path should look like ",(0,i.jsx)(t.code,{children:"~/data/(namespace)/curios/slots/head.json"}),"."]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsxs)(t.p,{children:["The ",(0,i.jsx)(t.code,{children:"(namespace)"})," field should be replaced by the namespace chosen for this portion of the datapack. If this is a part\nof a mod, the namespace is usually the mod ID. If this is part of a user-defined datapack, then the namespace can be\nanything that is lowercased with no special characters."]})}),"\n",(0,i.jsx)(t.h2,{id:"syntax",children:"Syntax"}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsxs)(t.p,{children:["The structure of the ",(0,i.jsx)(t.code,{children:".json"})," file for the slot type consists of a top-level JSON object that holds various fields\nrelated to that slot type."]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Field"}),(0,i.jsx)(t.th,{children:"Type"}),(0,i.jsx)(t.th,{children:"Default"}),(0,i.jsx)(t.th,{children:"Required"}),(0,i.jsx)(t.th,{children:"Description"}),(0,i.jsx)(t.th,{children:"Merge Behavior"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"replace"})}),(0,i.jsx)(t.td,{children:"boolean"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsxs)(t.td,{children:["When ",(0,i.jsx)(t.code,{children:"true"}),", replaces data from lower-priority datapacks"]}),(0,i.jsx)(t.td,{children:"N/A"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"size"})}),(0,i.jsx)(t.td,{children:"integer"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"1"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsx)(t.td,{children:"The number of slots of this slot type to give by default"}),(0,i.jsx)(t.td,{children:"The highest size will be used"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"operation"})}),(0,i.jsxs)(t.td,{children:[(0,i.jsx)(t.code,{children:'"SET"'}),"|",(0,i.jsx)(t.code,{children:'"ADD"'}),"|",(0,i.jsx)(t.code,{children:'"REMOVE"'})]}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:'"SET"'})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsxs)(t.td,{children:["Whether to use ",(0,i.jsx)(t.code,{children:"size"})," to set, add, or remove from the total number of slots"]}),(0,i.jsx)(t.td,{children:"N/A"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"order"})}),(0,i.jsx)(t.td,{children:"integer"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"1000"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsx)(t.td,{children:"The order the slots will appear in the native Curios GUI, lower numbers appear higher"}),(0,i.jsx)(t.td,{children:"The lowest order will be used"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"icon"})}),(0,i.jsx)(t.td,{children:"string"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"curios:slot/empty_curios_slot"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsx)(t.td,{children:"The location of the icon to use for the slot type"}),(0,i.jsx)(t.td,{children:"The last icon will be used"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"add_cosmetic"})}),(0,i.jsx)(t.td,{children:"boolean"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsxs)(t.td,{children:["When ",(0,i.jsx)(t.code,{children:"true"}),", adds a cosmetic slot next to the original that does not provide function but still renders its contents"]}),(0,i.jsxs)(t.td,{children:[(0,i.jsx)(t.code,{children:"true"})," if any add a cosmetic slot"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"use_native_gui"})}),(0,i.jsx)(t.td,{children:"boolean"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"true"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsxs)(t.td,{children:["When ",(0,i.jsx)(t.code,{children:"false"}),", does not add the slot type to the native Curios GUI"]}),(0,i.jsxs)(t.td,{children:[(0,i.jsx)(t.code,{children:"false"})," if any do not use the native GUI"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"render_toggle"})}),(0,i.jsx)(t.td,{children:"boolean"}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"true"})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsxs)(t.td,{children:["When ",(0,i.jsx)(t.code,{children:"false"}),", does not allow the slot type to toggle its rendering"]}),(0,i.jsxs)(t.td,{children:[(0,i.jsx)(t.code,{children:"false"})," if any do not allow render toggling"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"drop_rule"})}),(0,i.jsxs)(t.td,{children:[(0,i.jsx)(t.code,{children:'"DEFAULT"'}),"|",(0,i.jsx)(t.code,{children:'"ALWAYS_DROP"'}),"|",(0,i.jsx)(t.code,{children:'"ALWAYS_KEEP"'}),"|",(0,i.jsx)(t.code,{children:'"DESTROY"'})]}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:'"DEFAULT"'})}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"false"})}),(0,i.jsxs)(t.td,{children:["Whether to drop, keep, destroy, or follow the ",(0,i.jsx)(t.code,{children:"keepCurios"})," configuration"]}),(0,i.jsx)(t.td,{children:"N/A"})]})]})]}),"\n",(0,i.jsxs)(t.admonition,{type:"info",children:[(0,i.jsx)(t.p,{children:(0,i.jsxs)(t.strong,{children:["Which ",(0,i.jsx)(t.code,{children:"operation"})," value should I use?"]})}),(0,i.jsxs)(t.p,{children:["In most cases, ",(0,i.jsx)(t.code,{children:'"SET"'})," (also the default if no value is defined) will accomplish the desired result. It denotes that a\nslot type should have a certain amount of slots by default, with the highest value among all consumers being used.\n",(0,i.jsx)(t.code,{children:'"ADD"'}),"and ",(0,i.jsx)(t.code,{children:'"REMOVE"'})," are inherent slot modifiers and are based on the amount of slots specified by all ",(0,i.jsx)(t.code,{children:'"SET"'}),"\noperations, the result of which can change based on the mods/datapacks loaded."]})]}),"\n",(0,i.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-json",children:'{\n "order": 20,\n "size": 4,\n "icon": "curios:slot/empty_custom_slot",\n "add_cosmetic": true\n}\n'})}),"\n",(0,i.jsxs)(t.p,{children:["This slot type will have a relatively low order of 20, which will make it appear higher than most slots. It also has\nsize of 4 which means that it will register 4 slots to any given entity by default. For the GUI, it uses an icon\nlocated at ",(0,i.jsx)(t.code,{children:"curios:slot/empty_custom_slot"}),". It also has added a cosmetic slot so there will be an additional slot for\ncosmetic items next to it in the Curios GUI."]}),"\n",(0,i.jsx)(t.h2,{id:"modifying-a-slot-type",children:"Modifying a Slot Type"}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsxs)(t.p,{children:["The process of modifying a slot type is identical to registering a new slot type, except using the same ",(0,i.jsx)(t.code,{children:"identifier"})," as\nthe existing slot type. All slot types that share an ",(0,i.jsx)(t.code,{children:"identifier"})," will be merged according to the ",(0,i.jsx)(t.strong,{children:"Merge Behavior"})," of\neach field as outlined above."]}),"\n",(0,i.jsx)(t.h3,{id:"example-1",children:"Example"}),"\n",(0,i.jsxs)(t.p,{children:["Curios natively provides data for the ",(0,i.jsx)(t.code,{children:"ring"})," slot, which defaults the size to 1. In order to increase the size to 2,\ncreate a ",(0,i.jsx)(t.code,{children:"ring.json"})," slot registration file in the datapack with the contents:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-json",children:'{\n "size": 2\n}\n'})}),"\n",(0,i.jsx)(t.p,{children:"This will merge the size data of this registration with the existing registration provided by Curios, keeping all of the\nother data intact while increasing the number of slots to 2."})]})}function a(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>o,a:()=>r});var i=s(7294);const n={},d=i.createContext(n);function r(e){const t=i.useContext(d);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(d.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/f078da08.f2b13b03.js b/assets/js/f078da08.f2b13b03.js
new file mode 100644
index 0000000..7b3eeaa
--- /dev/null
+++ b/assets/js/f078da08.f2b13b03.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[214],{2010:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>a});var n=t(5893),r=t(1151);const s={sidebar_position:13},d="Data Generation",o={id:"curios/slots/data-generation",title:"Data Generation",description:"A tutorial on how to programmatically generate the Curios data files.",source:"@site/docs/curios/slots/data-generation.md",sourceDirName:"curios/slots",slug:"/curios/slots/data-generation",permalink:"/curios/slots/data-generation",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/slots/data-generation.md",tags:[],version:"current",sidebarPosition:13,frontMatter:{sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"Slot Modifiers",permalink:"/curios/slots/slot-modifiers"},next:{title:"Example Datapack",permalink:"/curios/slots/datapack-example"}},l={},a=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Slot Generation",id:"slot-generation",level:2},{value:"Example",id:"example",level:3},{value:"Entities Generation",id:"entities-generation",level:2},{value:"Example",id:"example-1",level:3},{value:"Criterion Triggers",id:"criterion-triggers",level:2},{value:"Example",id:"example-2",level:3}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h1,{id:"data-generation",children:"Data Generation"}),"\n",(0,n.jsx)(i.p,{children:"A tutorial on how to programmatically generate the Curios data files."}),"\n",(0,n.jsx)(i.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(i.hr,{}),"\n",(0,n.jsxs)(i.p,{children:["The documentation on this page was written with the assumption that readers are already familiar with basic data\ngeneration and its usages. If you are not, please prime yourself by learning about data generation on either ",(0,n.jsx)(i.a,{href:"https://forge.gemwire.uk/wiki/Datageneration",children:"Forge"}),"\nor ",(0,n.jsx)(i.a,{href:"https://docs.neoforged.net/docs/datagen/",children:"NeoForge"})," before proceeding further."]}),"\n",(0,n.jsx)(i.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,n.jsx)(i.hr,{}),"\n",(0,n.jsxs)(i.p,{children:["Slots and entities can be generated for a mod by constructing a new implementation of the\n",(0,n.jsx)(i.code,{children:"top.theillusivec4.curios.api.CuriosDataProvider"})," class, making sure to override the ",(0,n.jsx)(i.code,{children:"generate"})," method to run the\ngeneration code."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-java",children:"public class CuriosTestProvider extends CuriosDataProvider {\n\n public CuriosTestProvider(String modId, PackOutput output,\n ExistingFileHelper fileHelper,\n CompletableFuture registries) {\n super(modId, output, fileHelper, registries);\n }\n\n @Override\n public void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n // Generation code here\n }\n}\n"})}),"\n",(0,n.jsxs)(i.p,{children:["A new instance of the implementation should be constructed in the ",(0,n.jsx)(i.code,{children:"GatherDataEvent"})," event on the MOD event bus."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-java",children:'// On the MOD event bus\n@SubscribeEvent\npublic void gatherData(GatherDataEvent event) {\n event.getGenerator().addProvider(\n // Tell generator to run only when server data are generating\n event.includeServer(),\n new CuriosTestProvider(\n "mod_id",\n event.getGenerator().getPackOutput(),\n event.getExistingFileHelper(),\n event.getLookupProvider()\n )\n );\n}\n'})}),"\n",(0,n.jsx)(i.h2,{id:"slot-generation",children:"Slot Generation"}),"\n",(0,n.jsx)(i.hr,{}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"CuriosDataProvider"})," has a ",(0,n.jsx)(i.code,{children:"createSlot"})," method to facilitate easy data generation of slot types, by taking in an initial\n",(0,n.jsx)(i.code,{children:"String"})," identifier/file name and allowing developers to chain additional parameters as needed."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-java",children:'@Override\npublic void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n this.createSlot("test_slot"); // Create a slot with the identifier and file name "test_slot"\n}\n'})}),"\n",(0,n.jsxs)(i.p,{children:["Additional parameters can be added by calling methods on the ",(0,n.jsx)(i.code,{children:"ISlotData"})," returned by the ",(0,n.jsx)(i.code,{children:"createSlot"})," method call. Most\nof these parameters are linked to fields for ",(0,n.jsx)(i.code,{children:"ISlotType"}),", more information on how these fields are constructed and what\nthey represent can be found on the page for ",(0,n.jsx)(i.a,{href:"/curios/slots/slot-register#-syntax",children:"slot registration"}),"."]}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Method"}),(0,n.jsx)(i.th,{children:"Parameters"}),(0,n.jsx)(i.th,{children:"Field"})]})}),(0,n.jsxs)(i.tbody,{children:[(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"replace"})}),(0,n.jsx)(i.td,{children:"boolean"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"replace"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"size"})}),(0,n.jsx)(i.td,{children:"integer"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"size"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"operation"})}),(0,n.jsx)(i.td,{children:"string"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"operation"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"order"})}),(0,n.jsx)(i.td,{children:"integer"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"order"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"icon"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ResourceLocation"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"icon"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"addCosmetic"})}),(0,n.jsx)(i.td,{children:"boolean"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"add_cosmetic"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"useNativeGui"})}),(0,n.jsx)(i.td,{children:"boolean"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"use_native_gui"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"renderToggle"})}),(0,n.jsx)(i.td,{children:"boolean"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"render_toggle"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"dropRule"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ICurio$DropRule"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"drop_rule"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"addCondition"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ICondition"})}),(0,n.jsx)(i.td,{children:"N/A"})]})]})]}),"\n",(0,n.jsx)(i.h3,{id:"example",children:"Example"}),"\n",(0,n.jsxs)(i.p,{children:["The following example creates a slot file with the file name and identifier ",(0,n.jsx)(i.code,{children:"test_slot"}),", gives it a size of ",(0,n.jsx)(i.code,{children:"4"}),", sets the\ndrop rule to ",(0,n.jsx)(i.code,{children:'"ALWAYS_KEEP"'})," so that it is never dropped upon death, and gives it a cosmetic slot by setting ",(0,n.jsx)(i.code,{children:"addCosmetic"}),"\nto ",(0,n.jsx)(i.code,{children:"true"}),"."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-java",children:'@Override\npublic void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n this.createSlot("test_slot")\n .size(4)\n .dropRule(ICurio.DropRule.ALWAYS_KEEP)\n .addCosmetic(true);\n}\n'})}),"\n",(0,n.jsx)(i.h2,{id:"entities-generation",children:"Entities Generation"}),"\n",(0,n.jsx)(i.hr,{}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"CuriosDataProvider"})," has a ",(0,n.jsx)(i.code,{children:"createEntities"})," method to facilitate easy data generation of adding slot types to entities,\nby taking in an initial ",(0,n.jsx)(i.code,{children:"String"})," file name and allowing developers to chain additional parameters as needed."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-java",children:'@Override\npublic void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n this.createEntities("test_entities"); // Create an entities file with the name "test_entities"\n}\n'})}),"\n",(0,n.jsxs)(i.p,{children:["Additional parameters can be added by calling methods on the ",(0,n.jsx)(i.code,{children:"IEntitiesData"})," returned by the ",(0,n.jsx)(i.code,{children:"createEntities"})," method\ncall. All of these parameters correspond to JSON fields, more information on these can be found on the page for\n",(0,n.jsx)(i.a,{href:"/curios/slots/entity-register#-syntax",children:"entity registration"}),"."]}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Method"}),(0,n.jsx)(i.th,{children:"Parameters"}),(0,n.jsx)(i.th,{children:"Field"}),(0,n.jsx)(i.th,{children:"Notes"})]})}),(0,n.jsxs)(i.tbody,{children:[(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"replace"})}),(0,n.jsx)(i.td,{children:"boolean"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"replace"})}),(0,n.jsx)(i.td,{})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"addPlayer"})}),(0,n.jsx)(i.td,{children:"N/A"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"entities"})}),(0,n.jsxs)(i.td,{children:["Adds ",(0,n.jsx)(i.code,{children:'"minecraft:player"'})," to the ",(0,n.jsx)(i.code,{children:"entities"})," array"]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"addEntities"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"EntityType>[]"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"entities"})}),(0,n.jsx)(i.td,{})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"addSlots"})}),(0,n.jsx)(i.td,{children:"string[]"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"slots"})}),(0,n.jsxs)(i.td,{children:["Adds each string as a slot identifier to the ",(0,n.jsx)(i.code,{children:"slots"})," array"]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"addCondition"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ICondition"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"conditions"})}),(0,n.jsx)(i.td,{})]})]})]}),"\n",(0,n.jsx)(i.h3,{id:"example-1",children:"Example"}),"\n",(0,n.jsxs)(i.p,{children:["The following example creates an entities file with the file name ",(0,n.jsx)(i.code,{children:"test_entities"}),", and assigns the ",(0,n.jsx)(i.code,{children:'"head"'}),", ",(0,n.jsx)(i.code,{children:'"ring"'}),",\nand ",(0,n.jsx)(i.code,{children:'"necklace"'})," slot types to the ",(0,n.jsx)(i.code,{children:'"minecraft:player"'})," and ",(0,n.jsx)(i.code,{children:'"minecraft:zombie"'})," entities."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-java",children:'@Override\npublic void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {\n this.createEntities("test_entities")\n .addPlayer()\n .addEntities(EntityType.ZOMBIE)\n .addSlots("head", "ring", "necklace");\n}\n'})}),"\n",(0,n.jsx)(i.h2,{id:"criterion-triggers",children:"Criterion Triggers"}),"\n",(0,n.jsxs)(i.p,{children:["Curios provides several helper methods in the ",(0,n.jsx)(i.code,{children:"top.theillusivec4.curios.api.CuriosTriggers"})," class to generate data\nassociated with criterion triggers used for advancements and other similar files."]}),"\n",(0,n.jsxs)(i.p,{children:["Currently, the only triggers available are ",(0,n.jsx)(i.code,{children:"equip"})," and ",(0,n.jsx)(i.code,{children:"equipAtLocation"})," for triggering when a certain item is equipped\ninto a curio slot."]}),"\n",(0,n.jsx)(i.h3,{id:"example-2",children:"Example"}),"\n",(0,n.jsxs)(i.p,{children:["The following example will create an advancement file, ",(0,n.jsx)(i.code,{children:"curiostest/test"}),", that adds a criteration called ",(0,n.jsx)(i.code,{children:'"test"'}),", that\nis triggered when a ",(0,n.jsx)(i.code,{children:'"minecraft:diamond"'})," item is equipped in the Badlands biome."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-java",children:'Advancement.Builder.advancement()\n .addCriterion("test",\n CuriosTriggers.equipAtLocation(\n ItemPredicate.Builder.item().of(Items.DIAMOND),\n LocationPredicate.Builder.location().setBiome(Biomes.BADLANDS)))\n .save(saver, new ResourceLocation("curiostest", "test"), existingFileHelper);\n'})})]})}function h(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},1151:(e,i,t)=>{t.d(i,{Z:()=>o,a:()=>d});var n=t(7294);const r={},s=n.createContext(r);function d(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/f0f42f24.a590ca38.js b/assets/js/f0f42f24.a590ca38.js
new file mode 100644
index 0000000..8a3b419
--- /dev/null
+++ b/assets/js/f0f42f24.a590ca38.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[602],{8155:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>a});var t=n(5893),i=n(1151);const o={sidebar_position:1},r="Slot Types",l={id:"curios/slots/slot-register",title:"Slot Types",description:"A tutorial on how to register and modify slot types that are recognized by Curios.",source:"@site/docs/curios/slots/slot-register.md",sourceDirName:"curios/slots",slug:"/curios/slots/slot-register",permalink:"/curios/slots/slot-register",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/slots/slot-register.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Slots",permalink:"/category/slots"},next:{title:"Entity Slot Types",permalink:"/curios/slots/entity-register"}},d={},a=[{value:"Overview",id:"overview",level:2},{value:"Directory",id:"directory",level:2},{value:"Syntax",id:"syntax",level:2},{value:"replace (boolean)",id:"replace-boolean",level:3},{value:"size (integer)",id:"size-integer",level:3},{value:"operation ("SET"|"ADD"|"REMOVE")",id:"operation-setaddremove",level:3},{value:"order (integer)",id:"order-integer",level:3},{value:"icon (string)",id:"icon-string",level:3},{value:"add_cosmetic (boolean)",id:"add_cosmetic-boolean",level:3},{value:"use_native_gui (boolean)",id:"use_native_gui-boolean",level:3},{value:"render_toggle (boolean)",id:"render_toggle-boolean",level:3},{value:"drop_rule ("DEFAULT"|"ALWAYS_DROP"|"ALWAYS_KEEP"|"DESTROY")",id:"drop_rule-defaultalways_dropalways_keepdestroy",level:3},{value:"validators (string[])",id:"validators-string",level:3},{value:"Example",id:"example",level:2},{value:"Modifying a Slot Type",id:"modifying-a-slot-type",level:2},{value:"Example",id:"example-1",level:3}];function c(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h1,{id:"slot-types",children:"Slot Types"}),"\n",(0,t.jsx)(s.p,{children:"A tutorial on how to register and modify slot types that are recognized by Curios."}),"\n",(0,t.jsx)(s.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsxs)(s.p,{children:["The recommended way to register a slot type is through a datapack. If a user or developer is unfamiliar with datapacks,\nit is recommended to read through the ",(0,t.jsx)(s.a,{href:"https://minecraft.fandom.com/wiki/Data_pack",children:"wiki page"})," in order to understand\nthe concept and structure before proceeding to the rest of this page."]}),"\n",(0,t.jsxs)(s.p,{children:["Alternatively, users can instead choose to use the ",(0,t.jsx)(s.a,{href:"../configuration#slot-configuration",children:"Curios configuration"})," to create\nand modify slot types. There are fewer features than those offered in the datapack method, but some users may find the\nprocess to be more straightforward."]}),"\n",(0,t.jsxs)(s.p,{children:["If using one of the ",(0,t.jsx)(s.a,{href:"./preset-slots",children:"Preset Slot Types"}),", this step can be skipped since Curios natively provides the\nneeded datapack registration."]}),"\n",(0,t.jsxs)(s.admonition,{type:"info",children:[(0,t.jsx)(s.p,{children:(0,t.jsx)(s.strong,{children:"Why are my registered slot types not appearing?"})}),(0,t.jsxs)(s.p,{children:["Registering slot types makes them available for use; however, they are ",(0,t.jsx)(s.em,{children:"not"})," added to any entities (including players)\nby default. In order to add them to an entity, please refer to ",(0,t.jsx)(s.a,{href:"/curios/slots/entity-register",children:"the next step"})," on adding slot\ntypes to entities."]})]}),"\n",(0,t.jsx)(s.h2,{id:"directory",children:"Directory"}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsxs)(s.p,{children:["The file should be a ",(0,t.jsx)(s.code,{children:".json"})," file with the ",(0,t.jsx)(s.code,{children:"identifier"})," for the slot type to be registered as the name. This file\nshould be located in the ",(0,t.jsx)(s.code,{children:"~/data/(namespace)/curios/slots/"})," folder of the datapack."]}),"\n",(0,t.jsxs)(s.p,{children:["Example: Registering a ",(0,t.jsx)(s.code,{children:"head"})," slot type requires creating a ",(0,t.jsx)(s.code,{children:"head.json"})," file located in ",(0,t.jsx)(s.code,{children:"~/data/(namespace)/curios/slots/"}),"\nso the final path should look like ",(0,t.jsx)(s.code,{children:"~/data/(namespace)/curios/slots/head.json"}),"."]}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"(namespace)"})," field should be replaced by the namespace chosen for this portion of the datapack. If this is a part\nof a mod, the namespace is usually the mod ID. If this is part of a user-defined datapack, then the namespace can be\nanything that is lowercased with no special characters."]})}),"\n",(0,t.jsx)(s.h2,{id:"syntax",children:"Syntax"}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsxs)(s.p,{children:["The structure of the ",(0,t.jsx)(s.code,{children:".json"})," file for the slot type consists of a top-level JSON object that holds various fields\nrelated to that slot type."]}),"\n",(0,t.jsx)(s.p,{children:"All fields are optional unless otherwise noted. Each field denotes certain merging behavior which defines how the\nfield is merged between all data files that include it."}),"\n",(0,t.jsxs)(s.h3,{id:"replace-boolean",children:[(0,t.jsx)(s.strong,{children:"replace"})," (boolean)"]}),"\n",(0,t.jsxs)(s.p,{children:["When ",(0,t.jsx)(s.code,{children:"true"}),", replaces data from lower-priority datapacks."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:"false"})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," N/A"]}),"\n"]}),"\n",(0,t.jsxs)(s.h3,{id:"size-integer",children:[(0,t.jsx)(s.strong,{children:"size"})," (integer)"]}),"\n",(0,t.jsx)(s.p,{children:"The number of slots of this slot type to give by default."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:"1"})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," The highest size will be used."]}),"\n"]}),"\n",(0,t.jsxs)(s.h3,{id:"operation-setaddremove",children:[(0,t.jsx)(s.strong,{children:"operation"})," (",(0,t.jsx)(s.code,{children:'"SET"'}),"|",(0,t.jsx)(s.code,{children:'"ADD"'}),"|",(0,t.jsx)(s.code,{children:'"REMOVE"'}),")"]}),"\n",(0,t.jsxs)(s.p,{children:["Whether to use ",(0,t.jsx)(s.code,{children:"size"})," to set, add, or remove from the total number of slots."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:'"SET"'})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," N/A"]}),"\n"]}),"\n",(0,t.jsxs)(s.h3,{id:"order-integer",children:[(0,t.jsx)(s.strong,{children:"order"})," (integer)"]}),"\n",(0,t.jsx)(s.p,{children:"The order the slots will appear in the native Curios GUI, lower numbers appear first."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:"1000"})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," The lowest order will be used."]}),"\n"]}),"\n",(0,t.jsxs)(s.h3,{id:"icon-string",children:[(0,t.jsx)(s.strong,{children:"icon"})," (string)"]}),"\n",(0,t.jsx)(s.p,{children:"The location of the icon to use for the slot type."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:'"curios:slot/empty_curios_slot"'})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," The last icon will be used."]}),"\n"]}),"\n",(0,t.jsxs)(s.h3,{id:"add_cosmetic-boolean",children:[(0,t.jsx)(s.strong,{children:"add_cosmetic"})," (boolean)"]}),"\n",(0,t.jsx)(s.p,{children:"The location of the icon to use for the slot type."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:"false"})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," ",(0,t.jsx)(s.code,{children:"true"})," if any data file sets this field to ",(0,t.jsx)(s.code,{children:"true"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.h3,{id:"use_native_gui-boolean",children:[(0,t.jsx)(s.strong,{children:"use_native_gui"})," (boolean)"]}),"\n",(0,t.jsxs)(s.p,{children:["When ",(0,t.jsx)(s.code,{children:"false"}),", does not add the slot type to the native Curios GUI."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:"true"})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," ",(0,t.jsx)(s.code,{children:"false"})," if any data file sets this field to ",(0,t.jsx)(s.code,{children:"false"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.h3,{id:"render_toggle-boolean",children:[(0,t.jsx)(s.strong,{children:"render_toggle"})," (boolean)"]}),"\n",(0,t.jsxs)(s.p,{children:["When ",(0,t.jsx)(s.code,{children:"false"}),", does not allow the slot type to toggle its rendering."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:"true"})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," ",(0,t.jsx)(s.code,{children:"false"})," if any data file sets this field to ",(0,t.jsx)(s.code,{children:"false"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.h3,{id:"drop_rule-defaultalways_dropalways_keepdestroy",children:[(0,t.jsx)(s.strong,{children:"drop_rule"})," (",(0,t.jsx)(s.code,{children:'"DEFAULT"'}),"|",(0,t.jsx)(s.code,{children:'"ALWAYS_DROP"'}),"|",(0,t.jsx)(s.code,{children:'"ALWAYS_KEEP"'}),"|",(0,t.jsx)(s.code,{children:'"DESTROY"'}),")"]}),"\n",(0,t.jsxs)(s.p,{children:["Whether to drop, keep, destroy, or follow the ",(0,t.jsx)(s.code,{children:"keepCurios"})," configuration setting."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:'"DEFAULT"'})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," N/A"]}),"\n"]}),"\n",(0,t.jsxs)(s.h3,{id:"validators-string",children:[(0,t.jsx)(s.strong,{children:"validators"})," (string[])"]}),"\n",(0,t.jsx)(s.p,{children:"The list of registered predicates from the Curios API used by this slot type to validate item insertions."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"default:"})," ",(0,t.jsx)(s.code,{children:'["curios:tag"]'})]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"merging:"})," Each entry is added into the final array."]}),"\n"]}),"\n",(0,t.jsxs)(s.admonition,{type:"info",children:[(0,t.jsx)(s.p,{children:(0,t.jsxs)(s.strong,{children:["Which ",(0,t.jsx)(s.code,{children:"operation"})," value should I use?"]})}),(0,t.jsxs)(s.p,{children:["In most cases, ",(0,t.jsx)(s.code,{children:'"SET"'})," (also the default if no value is defined) will accomplish the desired result. It denotes that a\nslot type should have a certain amount of slots by default, with the highest value among all consumers being used.\n",(0,t.jsx)(s.code,{children:'"ADD"'}),"and ",(0,t.jsx)(s.code,{children:'"REMOVE"'})," are inherent slot modifiers and are based on the amount of slots specified by all ",(0,t.jsx)(s.code,{children:'"SET"'}),"\noperations, the result of which can change based on the mods/datapacks loaded."]})]}),"\n",(0,t.jsx)(s.h2,{id:"example",children:"Example"}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "order": 20,\n "size": 4,\n "icon": "curios:slot/empty_custom_slot",\n "add_cosmetic": true\n}\n'})}),"\n",(0,t.jsxs)(s.p,{children:["This slot type will have a relatively low order of 20, which will make it appear higher than most slots. It also has\nsize of 4 which means that it will register 4 slots to any given entity by default. For the GUI, it uses an icon\nlocated at ",(0,t.jsx)(s.code,{children:"curios:slot/empty_custom_slot"}),". It also has added a cosmetic slot so there will be an additional slot for\ncosmetic items next to it in the Curios GUI."]}),"\n",(0,t.jsx)(s.h2,{id:"modifying-a-slot-type",children:"Modifying a Slot Type"}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsxs)(s.p,{children:["The process of modifying a slot type is identical to registering a new slot type, except using the same ",(0,t.jsx)(s.code,{children:"identifier"})," as\nthe existing slot type. All slot types that share an ",(0,t.jsx)(s.code,{children:"identifier"})," will be merged according to the ",(0,t.jsx)(s.strong,{children:"Merge Behavior"})," of\neach field as outlined above."]}),"\n",(0,t.jsx)(s.h3,{id:"example-1",children:"Example"}),"\n",(0,t.jsxs)(s.p,{children:["Curios natively provides data for the ",(0,t.jsx)(s.code,{children:"ring"})," slot, which defaults the size to 1. In order to increase the size to 2,\ncreate a ",(0,t.jsx)(s.code,{children:"ring.json"})," slot registration file in the datapack with the contents:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-json",children:'{\n "size": 2\n}\n'})}),"\n",(0,t.jsx)(s.p,{children:"This will merge the size data of this registration with the existing registration provided by Curios, keeping all of the\nother data intact while increasing the number of slots to 2."})]})}function h(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},1151:(e,s,n)=>{n.d(s,{Z:()=>l,a:()=>r});var t=n(7294);const i={},o=t.createContext(i);function r(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/f1e13461.2ea46632.js b/assets/js/f1e13461.2ea46632.js
new file mode 100644
index 0000000..e3a5491
--- /dev/null
+++ b/assets/js/f1e13461.2ea46632.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[83],{1262:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>l,default:()=>v,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var r=t(5893),i=t(1151),s=t(4866),a=t(5162);const o={sidebar_position:1},l="Basic Inventory Management",c={id:"curios/inventory/basic-inventory",title:"Basic Inventory Management",description:"Learn how to access and manage the Curios inventory attached to an entity.",source:"@site/docs/curios/inventory/basic-inventory.mdx",sourceDirName:"curios/inventory",slug:"/curios/inventory/basic-inventory",permalink:"/curios/inventory/basic-inventory",draft:!1,unlisted:!1,editUrl:"https://github.com/illusivesoulworks/docs/edit/main/docs/curios/inventory/basic-inventory.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Inventory",permalink:"/category/inventory"},next:{title:"API",permalink:"/category/api"}},u={},d=[{value:"Overview",id:"overview",level:2},{value:"Using the inventory",id:"using-the-inventory",level:2},{value:"Accessing the inventory",id:"accessing-the-inventory",level:2},{value:"Accessing the entire inventory",id:"accessing-the-entire-inventory",level:3},{value:"Accessing an inventory for a slot type",id:"accessing-an-inventory-for-a-slot-type",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"basic-inventory-management",children:"Basic Inventory Management"}),"\n",(0,r.jsx)(n.p,{children:"Learn how to access and manage the Curios inventory attached to an entity."}),"\n",(0,r.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["Each entity that has been assigned any number of slot types based on ",(0,r.jsx)(n.a,{href:"/curios/slots/entity-register",children:"entity registration"}),"\nwill automatically gain a Curios inventory, initialized with a sub-inventory for each slot type that has been assigned.\nThis inventory can be used for a variety of purposes, such as finding out which items are held in the inventory or\nmodifying the number of slots that are in each sub-inventory."]}),"\n",(0,r.jsxs)(n.p,{children:["The interface for the Curios inventory can be found as ",(0,r.jsx)(n.code,{children:"top.theillusivec4.curios.api.type.capability.ICuriosItemHandler"}),",\nwhich holds all of the methods that developers can use to access and manage the inventory."]}),"\n",(0,r.jsx)(n.h2,{id:"using-the-inventory",children:"Using the inventory"}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["To begin using the inventory, developers will need to grab the instance associated with each entity. The\n",(0,r.jsx)(n.code,{children:"top.theillusivec4.curios.api.CuriosApi"})," class has a ",(0,r.jsx)(n.code,{children:"getCuriosInventory"})," method that can be used:"]}),"\n",(0,r.jsxs)(s.Z,{groupId:"modloader",children:[(0,r.jsxs)(a.Z,{value:"forge",label:"Forge",default:!0,children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"LazyOptional maybeCuriosInventory = CuriosApi.getCuriosInventory(livingEntity);\n"})}),(0,r.jsxs)(n.p,{children:["The query returns a ",(0,r.jsx)(n.code,{children:"LazyOptional"})," as the specified entity may not have a curios inventory. If the result is certain to\nexist, then the optionality can be disregarded and simplified to:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"ICuriosItemHandler curiosInventory = CuriosApi.getCuriosInventory(livingEntity).resolve().get();\n"})})]}),(0,r.jsxs)(a.Z,{value:"neoforge-2",label:"NeoForge 1.20.3+",children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"Optional maybeCuriosInventory = CuriosApi.getCuriosInventory(livingEntity);\n"})}),(0,r.jsxs)(n.p,{children:["The query returns a ",(0,r.jsx)(n.code,{children:"Optional"})," as the specified entity may not have a curios inventory. If the result is certain to\nexist, then the optionality can be disregarded and simplified to:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"ICuriosItemHandler curiosInventory = CuriosApi.getCuriosInventory(livingEntity).get();\n"})})]})]}),"\n",(0,r.jsxs)(n.p,{children:["Since the method returns an ",(0,r.jsx)(n.code,{children:"Optional"})," by default, developers will need to make sure to use ",(0,r.jsx)(n.code,{children:"Optional#ifPresent"})," first\nin order to check that the inventory actually exists:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"CuriosApi.getCuriosInventory(livingEntity).ifPresent(curiosInventory -> {\n // code here - with access to the inventory instance that now definitely exists\n});\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Once a developer has the ",(0,r.jsx)(n.code,{children:"ICuriosItemHandler"})," instance, they can use the methods from that instance to interact with the\nCurios inventory."]}),"\n",(0,r.jsx)(n.h2,{id:"accessing-the-inventory",children:"Accessing the inventory"}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.p,{children:"As mentioned previously, each slot type assigned to an entity is given a sub-inventory in the Curios inventory to\nprovide easy and categorical access. There are two main ways to interact with these slot inventories, depending on\nwhether the developer wants to access all of the slot inventories or just a particular one."}),"\n",(0,r.jsx)(n.h3,{id:"accessing-the-entire-inventory",children:"Accessing the entire inventory"}),"\n",(0,r.jsxs)(n.p,{children:["The entire Curios inventory exists as a ",(0,r.jsx)(n.code,{children:"Map"}),", with the slot type identifiers acting as each\nkey and the ",(0,r.jsx)(n.code,{children:"ICurioStackHandler"})," acting as the inventory attached to the slot type. To access this, the ",(0,r.jsx)(n.code,{children:"getCurios"}),"\nmethod can be used:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"Map curios = curiosInventory.getCurios();\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsxs)(n.p,{children:["This returns an ",(0,r.jsx)(n.strong,{children:"unmodifiable"})," map so attempts to change the structure of the map directly through this method, such\nas adding or removing slot inventories, will not work. Any changes to the structure needs to be done through other\nmethods, this method is primarily for accessing the list of slot inventories on the entity."]})}),"\n",(0,r.jsx)(n.p,{children:"From here, developers can either iterate through the entire map:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"curios.forEach((identifier, slotInventory) -> {\n // code here - with the identifier and slot inventory access\n})\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Or developers can access a particular sub-inventory, such as a slot type with the ",(0,r.jsx)(n.code,{children:'"ring"'})," identifier:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'ICurioStackHandler slotInventory = curios.get("ring");\n\n// null check to ensure that the slot inventory exists\nif (slotInventory != null) {\n // code here\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"However, if all a developer wants is to access a particular sub-inventory, there's a more straightforward method\noutlined in the next section that can be used instead."}),"\n",(0,r.jsx)(n.h3,{id:"accessing-an-inventory-for-a-slot-type",children:"Accessing an inventory for a slot type"}),"\n",(0,r.jsx)(n.p,{children:"In order to access a particular inventory for slot type, developers can either access the whole inventory as outlined\nin the preceding section or skip straight to a sub-inventory for that slot type:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'Optional slotInventory = curiosInventory.getStacksHandler("ring");\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The above code will retrive an ",(0,r.jsx)(n.code,{children:"Optional"})," for the slot inventory with the ",(0,r.jsx)(n.code,{children:'"ring"'})," identifier passed into the\nparameter. This is an ",(0,r.jsx)(n.code,{children:"Optional"})," because the slot inventory being queried may not exist on the entity, which is a\npossibility that developers must consider because higher-priority datapacks are capable of removing slot types from\nentities. For that reason, be sure to use ",(0,r.jsx)(n.code,{children:"ifPresent"})," before accessing the inventory:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'curiosInventory.getStacksHandler("ring").ifPresent(slotInventory -> {\n // code here - with access to the slot inventory with the "ring" identifier\n});\n'})})]})}function v(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},5162:(e,n,t)=>{t.d(n,{Z:()=>a});t(7294);var r=t(512);const i={tabItem:"tabItem_Ymn6"};var s=t(5893);function a(e){let{children:n,hidden:t,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.Z)(i.tabItem,a),hidden:t,children:n})}},4866:(e,n,t)=>{t.d(n,{Z:()=>I});var r=t(7294),i=t(512),s=t(2466),a=t(6550),o=t(469),l=t(1980),c=t(7392),u=t(12);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,r.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:r,default:i}}=e;return{value:n,label:t,attributes:r,default:i}}))}(t);return function(e){const n=(0,c.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function v(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const i=(0,a.k6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l._X)(s),(0,r.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(i.location.search);n.set(s,e),i.replace({...i.location,search:n.toString()})}),[s,i])]}function y(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,s=h(e),[a,l]=(0,r.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!v({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:s}))),[c,d]=p({queryString:t,groupId:i}),[y,g]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,s]=(0,u.Nk)(t);return[i,(0,r.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:i}),m=(()=>{const e=c??y;return v({value:e,tabValues:s})?e:null})();(0,o.Z)((()=>{m&&l(m)}),[m]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!v({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,s]),tabValues:s}}var g=t(2389);const m={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=t(5893);function b(e){let{className:n,block:t,selectedValue:r,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.o5)(),u=e=>{const n=e.currentTarget,t=l.indexOf(n),i=o[t].value;i!==r&&(c(n),a(i))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:r===n?0:-1,"aria-selected":r===n,ref:e=>l.push(e),onKeyDown:d,onClick:u,...s,className:(0,i.Z)("tabs__item",m.tabItem,s?.className,{"tabs__item--active":r===n}),children:t??n},n)}))})}function x(e){let{lazy:n,children:t,selectedValue:i}=e;const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===i));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function j(e){const n=y(e);return(0,f.jsxs)("div",{className:(0,i.Z)("tabs-container",m.tabList),children:[(0,f.jsx)(b,{...e,...n}),(0,f.jsx)(x,{...e,...n})]})}function I(e){const n=(0,g.Z)();return(0,f.jsx)(j,{...e,children:d(e.children)},String(n))}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>a});var r=t(7294);const i={},s=r.createContext(i);function a(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/main.45461eec.js b/assets/js/main.45461eec.js
deleted file mode 100644
index 6d13fa5..0000000
--- a/assets/js/main.45461eec.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! For license information please see main.45461eec.js.LICENSE.txt */
-(self.webpackChunkillusivesoulworks_docs=self.webpackChunkillusivesoulworks_docs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});n(7294);var r=n(8356),a=n.n(r),o=n(6887);const i={"09965537":[()=>n.e(131).then(n.t.bind(n,7616,19)),"~docs/default/category-tutorialsidebar-category-curios-11f.json",7616],"0e384e19":[()=>n.e(671).then(n.bind(n,7876)),"@site/docs/intro.md",7876],"14eb3368":[()=>Promise.all([n.e(532),n.e(817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],17896441:[()=>Promise.all([n.e(532),n.e(918)]).then(n.bind(n,8688)),"@theme/DocItem",8688],"18c10e97":[()=>n.e(691).then(n.bind(n,6018)),"@site/docs/diet/diet-groups.md",6018],"1bf10563":[()=>Promise.all([n.e(532),n.e(268)]).then(n.bind(n,629)),"@site/docs/curios/Developing with Curios/curio-creation.mdx",629],"21ef5f27":[()=>n.e(183).then(n.bind(n,1159)),"@site/docs/curios/preset-slots.md",1159],"247783bb":[()=>n.e(334).then(n.t.bind(n,3769,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"27236a1a":[()=>n.e(512).then(n.bind(n,8407)),"@site/docs/curios/Developing with Curios/APIs/renderer-interface.md",8407],"3890de59":[()=>n.e(895).then(n.bind(n,1757)),"@site/docs/curios/datapack-example.md",1757],"4c92833a":[()=>n.e(270).then(n.bind(n,1119)),"@site/docs/curios/commands.md",1119],"514a6b50":[()=>n.e(670).then(n.bind(n,169)),"@site/docs/curios/slot-textures.md",169],"5e95c892":[()=>n.e(661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"6c8344a3":[()=>n.e(933).then(n.bind(n,9580)),"@site/versioned_docs/version-1.18.x/champions/integration/gamestages.md",9580],"78280e3d":[()=>n.e(143).then(n.bind(n,8462)),"@site/docs/curios/entity-register.md",8462],"7ffb7c5f":[()=>n.e(551).then(n.bind(n,4250)),"@site/docs/diet/diet-suites.md",4250],"8dae1db0":[()=>n.e(677).then(n.bind(n,2206)),"@site/docs/curios/Developing with Curios/rendering-registry.md",2206],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93ac1f71":[()=>n.e(844).then(n.bind(n,9938)),"@site/docs/curios/Developing with Curios/data-generation.md",9938],"93c91ab0":[()=>n.e(58).then(n.t.bind(n,8504,19)),"~docs/default/category-118-x-tutorialsidebar-category-mod-integrations-a7b.json",8504],"93d27ab8":[()=>n.e(789).then(n.t.bind(n,6080,19)),"~docs/default/category-118-x-tutorialsidebar-category-champions-91c.json",6080],"94fad746":[()=>n.e(455).then(n.bind(n,8456)),"@site/versioned_docs/version-1.18.x/champions/nbt.md",8456],"96cf4fb7":[()=>n.e(495).then(n.bind(n,5880)),"@site/versioned_docs/version-1.18.x/champions/commands.md",5880],99097929:[()=>n.e(368).then(n.t.bind(n,1754,19)),"~docs/default/category-tutorialsidebar-category-diet-992.json",1754],a0145bdd:[()=>n.e(168).then(n.t.bind(n,3894,19)),"~docs/default/version-1-18-x-metadata-prop-3c6.json",3894],a54b83c5:[()=>n.e(842).then(n.bind(n,7345)),"@site/docs/diet/food-classification.md",7345],a7434565:[()=>n.e(645).then(n.t.bind(n,5745,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],a7bd4aaa:[()=>n.e(518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a94703ab:[()=>Promise.all([n.e(532),n.e(107)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],ab811e82:[()=>n.e(564).then(n.bind(n,7339)),"@site/versioned_docs/version-1.18.x/champions/integration/scalinghealth.md",7339],add24532:[()=>n.e(422).then(n.bind(n,2272)),"@site/docs/curios/curios-nbt.md",2272],bd58d19a:[()=>n.e(408).then(n.bind(n,5077)),"@site/docs/diet/datapack-example.md",5077],cacef8c5:[()=>Promise.all([n.e(532),n.e(690)]).then(n.bind(n,498)),"@site/docs/curios/Developing with Curios/slot-modifiers.mdx",498],d8ef455a:[()=>n.e(904).then(n.bind(n,164)),"@site/versioned_docs/version-1.18.x/intro.md",164],dcc5fc19:[()=>n.e(162).then(n.bind(n,107)),"@site/docs/curios/Developing with Curios/getting-started.md",107],e380917f:[()=>n.e(335).then(n.bind(n,7515)),"@site/versioned_docs/version-1.18.x/champions/loottable.md",7515],ef6cb8ea:[()=>n.e(969).then(n.bind(n,8329)),"@site/docs/curios/slot-register.md",8329],fa17a3e5:[()=>n.e(181).then(n.bind(n,5111)),"@site/src/pages/versions.tsx",5111]};var l=n(5893);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(9670),c=n(226);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e(772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,l.jsx)(c.z,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},f=[],p=[],g=(0,u.Z)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),a().Map({loading:s,loader:d,modules:f,webpack:()=>p,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;return delete a.__context,(0,l.jsx)(c.z,{value:i,children:(0,l.jsx)(o,{...a,...n})})}})}const f=[{path:"/versions",component:d("/versions","21c"),exact:!0},{path:"/",component:d("/","ec6"),routes:[{path:"/1.18.x",component:d("/1.18.x","8d6"),routes:[{path:"/1.18.x",component:d("/1.18.x","693"),routes:[{path:"/1.18.x",component:d("/1.18.x","a91"),exact:!0,sidebar:"tutorialSidebar"},{path:"/1.18.x/category/champions",component:d("/1.18.x/category/champions","2e3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/1.18.x/category/mod-integrations",component:d("/1.18.x/category/mod-integrations","5b1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/1.18.x/champions/commands",component:d("/1.18.x/champions/commands","5ab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/1.18.x/champions/integration/gamestages",component:d("/1.18.x/champions/integration/gamestages","196"),exact:!0,sidebar:"tutorialSidebar"},{path:"/1.18.x/champions/integration/scalinghealth",component:d("/1.18.x/champions/integration/scalinghealth","8bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/1.18.x/champions/loottable",component:d("/1.18.x/champions/loottable","0e6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/1.18.x/champions/nbt",component:d("/1.18.x/champions/nbt","05f"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/",component:d("/","e74"),routes:[{path:"/",component:d("/","f25"),routes:[{path:"/category/curios",component:d("/category/curios","4b6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/diet",component:d("/category/diet","ea0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/commands",component:d("/curios/commands","6be"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/curios-nbt",component:d("/curios/curios-nbt","a6b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/datapack-example",component:d("/curios/datapack-example","836"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/Developing with Curios/APIs/renderer-interface",component:d("/curios/Developing with Curios/APIs/renderer-interface","5ee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/Developing with Curios/curio-creation",component:d("/curios/Developing with Curios/curio-creation","313"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/Developing with Curios/data-generation",component:d("/curios/Developing with Curios/data-generation","aa5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/Developing with Curios/getting-started",component:d("/curios/Developing with Curios/getting-started","cd0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/Developing with Curios/rendering-registry",component:d("/curios/Developing with Curios/rendering-registry","c96"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/Developing with Curios/slot-modifiers",component:d("/curios/Developing with Curios/slot-modifiers","0d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/entity-register",component:d("/curios/entity-register","2eb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/preset-slots",component:d("/curios/preset-slots","b79"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/slot-register",component:d("/curios/slot-register","0dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/curios/slot-textures",component:d("/curios/slot-textures","b8f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/diet/datapack-example",component:d("/diet/datapack-example","118"),exact:!0,sidebar:"tutorialSidebar"},{path:"/diet/diet-groups",component:d("/diet/diet-groups","09b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/diet/diet-suites",component:d("/diet/diet-suites","711"),exact:!0,sidebar:"tutorialSidebar"},{path:"/diet/food-classification",component:d("/diet/food-classification","d6e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/",component:d("/","96c"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"*",component:d("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>i});var r=n(7294),a=n(5893);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),a=n(745),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790),f=n(5893);function p(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var g=n(5742),h=n(2263),m=n(4996),y=n(6668),b=n(1944),v=n(4711),w=n(9727),k=n(3320),x=n(8780),S=n(197);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.Z)(),r=(0,v.l)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,f.jsxs)(g.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,c.TH)();return e+(0,x.applyTrailingSlash)((0,m.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,f.jsxs)(g.Z,{children:[(0,f.jsx)("meta",{property:"og:url",content:a}),(0,f.jsx)("link",{rel:"canonical",href:a})]})}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,y.L)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(g.Z,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:w.h})]}),n&&(0,f.jsx)(b.d,{image:n}),(0,f.jsx)(_,{}),(0,f.jsx)(E,{}),(0,f.jsx)(S.Z,{tag:k.HX,locale:e}),(0,f.jsx)(g.Z,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const T=new Map;function N(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var j=n(8934),A=n(8940),L=n(469);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const O=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),P("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(O,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(c.AW,{location:t,render:()=>e})})}}const D=I,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n