From a6300de1ddf298dc7848e9c748f1439878063daa Mon Sep 17 00:00:00 2001 From: C4 <29991504+TheIllusiveC4@users.noreply.github.com> Date: Mon, 8 Apr 2024 10:23:53 +0000 Subject: [PATCH] deploy: 8d4e78d1dba656f7cd57d1e30bc909cb4db0c8ce --- 1.18.x.html | 4 +- 1.18.x/category/champions.html | 4 +- 1.18.x/category/mod-integrations.html | 4 +- 1.18.x/champions/commands.html | 4 +- 1.18.x/champions/integration/gamestages.html | 4 +- .../champions/integration/scalinghealth.html | 4 +- 1.18.x/champions/loottable.html | 4 +- 1.18.x/champions/nbt.html | 4 +- 404.html | 4 +- assets/js/036fc41e.f755e690.js | 1 + ...65537.4ba6a38e.js => 09965537.5f34f1c3.js} | 2 +- assets/js/141528fa.e38fb020.js | 1 + assets/js/1bf10563.4ceafe31.js | 1 - assets/js/21ef5f27.ff91795f.js | 1 - assets/js/27236a1a.7929d5a5.js | 1 - assets/js/2e6e5734.8b970756.js | 1 + assets/js/3890de59.15866a4a.js | 1 - assets/js/3a36d978.8b966a18.js | 1 + assets/js/46c0d933.19808eaf.js | 1 + assets/js/4c92833a.3e9f3bb6.js | 1 + assets/js/4c92833a.b0943cf9.js | 1 - assets/js/514a6b50.a4b38b2b.js | 1 - assets/js/6e5aa4fa.5ab8692f.js | 1 + assets/js/71c056c1.eb08e33a.js | 1 + assets/js/78280e3d.f199502b.js | 1 - assets/js/85ac19f8.6d43aa8c.js | 1 + assets/js/8dae1db0.fe5c8f4f.js | 1 - assets/js/935f2afb.0e792366.js | 1 + assets/js/935f2afb.161f87f1.js | 1 - assets/js/93ac1f71.d94df6db.js | 1 - ...97929.e904a711.js => 99097929.2c00f282.js} | 2 +- assets/js/99b1d78b.7f651d2b.js | 1 + assets/js/a4f7be8a.8c4ddd02.js | 1 + assets/js/a61686b6.3b96c0df.js | 1 + assets/js/add24532.40f62002.js | 1 - assets/js/bfeab3de.5bc9b32a.js | 1 + assets/js/cacef8c5.dc676ee6.js | 1 - assets/js/d943a703.e4f3409d.js | 1 + assets/js/dcc5fc19.12bcd037.js | 1 - assets/js/e0b249dc.e7365bbb.js | 1 + assets/js/e7ff71d3.b3ca14a4.js | 1 + assets/js/ef6cb8ea.5174c0cb.js | 1 - assets/js/f078da08.f2b13b03.js | 1 + assets/js/f0f42f24.a590ca38.js | 1 + assets/js/f1e13461.2ea46632.js | 1 + assets/js/main.45461eec.js | 2 - assets/js/main.d7092566.js | 2 + ...CENSE.txt => main.d7092566.js.LICENSE.txt} | 0 assets/js/runtime~main.1a997ad7.js | 1 + assets/js/runtime~main.f5d27b1e.js | 1 - category/api.html | 13 ++ category/curios.html | 6 +- category/diet.html | 6 +- category/inventory.html | 13 ++ category/items.html | 13 ++ category/slots.html | 13 ++ .../APIs/renderer-interface.html | 59 --------- curios/api/renderer-interface.html | 59 +++++++++ curios/commands.html | 10 +- curios/configuration.html | 53 ++++++++ curios/curios-nbt.html | 33 ----- curios/entity-register.html | 61 --------- .../getting-started.html | 12 +- curios/inventory/basic-inventory.html | 62 +++++++++ .../curio-creation.html | 12 +- curios/items/curios-nbt.html | 33 +++++ .../rendering-registry.html | 16 +-- curios/preset-slots.html | 26 ---- curios/slot-register.html | 60 --------- curios/slot-textures.html | 36 ----- .../data-generation.html | 16 +-- curios/{ => slots}/datapack-example.html | 20 +-- curios/slots/entity-register.html | 63 +++++++++ curios/slots/preset-slots.html | 26 ++++ .../slot-modifiers.html | 22 ++-- curios/slots/slot-register.html | 124 ++++++++++++++++++ curios/slots/slot-textures.html | 36 +++++ diet/datapack-example.html | 4 +- diet/diet-groups.html | 4 +- diet/diet-suites.html | 4 +- diet/food-classification.html | 4 +- index.html | 4 +- sitemap.xml | 2 +- versions.html | 4 +- 84 files changed, 622 insertions(+), 387 deletions(-) create mode 100644 assets/js/036fc41e.f755e690.js rename assets/js/{09965537.4ba6a38e.js => 09965537.5f34f1c3.js} (76%) create mode 100644 assets/js/141528fa.e38fb020.js delete mode 100644 assets/js/1bf10563.4ceafe31.js delete mode 100644 assets/js/21ef5f27.ff91795f.js delete mode 100644 assets/js/27236a1a.7929d5a5.js create mode 100644 assets/js/2e6e5734.8b970756.js delete mode 100644 assets/js/3890de59.15866a4a.js create mode 100644 assets/js/3a36d978.8b966a18.js create mode 100644 assets/js/46c0d933.19808eaf.js create mode 100644 assets/js/4c92833a.3e9f3bb6.js delete mode 100644 assets/js/4c92833a.b0943cf9.js delete mode 100644 assets/js/514a6b50.a4b38b2b.js create mode 100644 assets/js/6e5aa4fa.5ab8692f.js create mode 100644 assets/js/71c056c1.eb08e33a.js delete mode 100644 assets/js/78280e3d.f199502b.js create mode 100644 assets/js/85ac19f8.6d43aa8c.js delete mode 100644 assets/js/8dae1db0.fe5c8f4f.js create mode 100644 assets/js/935f2afb.0e792366.js delete mode 100644 assets/js/935f2afb.161f87f1.js delete mode 100644 assets/js/93ac1f71.d94df6db.js rename assets/js/{99097929.e904a711.js => 99097929.2c00f282.js} (61%) create mode 100644 assets/js/99b1d78b.7f651d2b.js create mode 100644 assets/js/a4f7be8a.8c4ddd02.js create mode 100644 assets/js/a61686b6.3b96c0df.js delete mode 100644 assets/js/add24532.40f62002.js create mode 100644 assets/js/bfeab3de.5bc9b32a.js delete mode 100644 assets/js/cacef8c5.dc676ee6.js create mode 100644 assets/js/d943a703.e4f3409d.js delete mode 100644 assets/js/dcc5fc19.12bcd037.js create mode 100644 assets/js/e0b249dc.e7365bbb.js create mode 100644 assets/js/e7ff71d3.b3ca14a4.js delete mode 100644 assets/js/ef6cb8ea.5174c0cb.js create mode 100644 assets/js/f078da08.f2b13b03.js create mode 100644 assets/js/f0f42f24.a590ca38.js create mode 100644 assets/js/f1e13461.2ea46632.js delete mode 100644 assets/js/main.45461eec.js create mode 100644 assets/js/main.d7092566.js rename assets/js/{main.45461eec.js.LICENSE.txt => main.d7092566.js.LICENSE.txt} (100%) create mode 100644 assets/js/runtime~main.1a997ad7.js delete mode 100644 assets/js/runtime~main.f5d27b1e.js create mode 100644 category/api.html create mode 100644 category/inventory.html create mode 100644 category/items.html create mode 100644 category/slots.html delete mode 100644 curios/Developing with Curios/APIs/renderer-interface.html create mode 100644 curios/api/renderer-interface.html create mode 100644 curios/configuration.html delete mode 100644 curios/curios-nbt.html delete mode 100644 curios/entity-register.html rename curios/{Developing with Curios => }/getting-started.html (60%) create mode 100644 curios/inventory/basic-inventory.html rename curios/{Developing with Curios => items}/curio-creation.html (80%) create mode 100644 curios/items/curios-nbt.html rename curios/{Developing with Curios => items}/rendering-registry.html (61%) delete mode 100644 curios/preset-slots.html delete mode 100644 curios/slot-register.html delete mode 100644 curios/slot-textures.html rename curios/{Developing with Curios => slots}/data-generation.html (76%) rename curios/{ => slots}/datapack-example.html (62%) create mode 100644 curios/slots/entity-register.html create mode 100644 curios/slots/preset-slots.html rename curios/{Developing with Curios => slots}/slot-modifiers.html (72%) create mode 100644 curios/slots/slot-register.html create mode 100644 curios/slots/slot-textures.html diff --git a/1.18.x.html b/1.18.x.html index d4c9347..8a5b13a 100644 --- a/1.18.x.html +++ b/1.18.x.html @@ -4,8 +4,8 @@ Overview | Illusive Soulworks - - + +
Skip to main content
Version: 1.18.x

Overview

diff --git a/1.18.x/category/champions.html b/1.18.x/category/champions.html index ecd8f72..1146def 100644 --- a/1.18.x/category/champions.html +++ b/1.18.x/category/champions.html @@ -4,8 +4,8 @@ Champions | Illusive Soulworks - - + + diff --git a/1.18.x/category/mod-integrations.html b/1.18.x/category/mod-integrations.html index e1a0415..a8a067b 100644 --- a/1.18.x/category/mod-integrations.html +++ b/1.18.x/category/mod-integrations.html @@ -4,8 +4,8 @@ Mod Integrations | Illusive Soulworks - - + + diff --git a/1.18.x/champions/commands.html b/1.18.x/champions/commands.html index 652b361..9f7ec0a 100644 --- a/1.18.x/champions/commands.html +++ b/1.18.x/champions/commands.html @@ -4,8 +4,8 @@ Commands | Illusive Soulworks - - + +
Version: 1.18.x

Commands

diff --git a/1.18.x/champions/integration/gamestages.html b/1.18.x/champions/integration/gamestages.html index e69b324..0573ad4 100644 --- a/1.18.x/champions/integration/gamestages.html +++ b/1.18.x/champions/integration/gamestages.html @@ -4,8 +4,8 @@ Game Stages | Illusive Soulworks - - + +
Version: 1.18.x

Game Stages

diff --git a/1.18.x/champions/integration/scalinghealth.html b/1.18.x/champions/integration/scalinghealth.html index d20a29a..0c635af 100644 --- a/1.18.x/champions/integration/scalinghealth.html +++ b/1.18.x/champions/integration/scalinghealth.html @@ -4,8 +4,8 @@ Scaling Health | Illusive Soulworks - - + +
Version: 1.18.x

Scaling Health

diff --git a/1.18.x/champions/loottable.html b/1.18.x/champions/loottable.html index f5650d4..b23a02d 100644 --- a/1.18.x/champions/loottable.html +++ b/1.18.x/champions/loottable.html @@ -4,8 +4,8 @@ Loot | Illusive Soulworks - - + +
Version: 1.18.x

Loot

diff --git a/1.18.x/champions/nbt.html b/1.18.x/champions/nbt.html index c80d914..9edd0dc 100644 --- a/1.18.x/champions/nbt.html +++ b/1.18.x/champions/nbt.html @@ -4,8 +4,8 @@ NBT Tags | Illusive Soulworks - - + +
Version: 1.18.x

NBT Tags

diff --git a/404.html b/404.html index 3f512aa..7010208 100644 --- a/404.html +++ b/404.html @@ -4,8 +4,8 @@ Illusive Soulworks - - + +

Page Not Found

We could not find what you were looking for.

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
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Q=n(9670);const K=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!K.has(e))(e))return!1;K.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),R(e))},te=Object.freeze(ee),ne=Boolean(!0);if(l.Z.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(i.B6,{children:(0,f.jsx)(o.VK,{children:(0,f.jsx)(q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},l=()=>{if(ne)r.startTransition((()=>{a.hydrateRoot(e,t,{onRecoverableError:n})}));else{const o=a.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{o.render(t)}))}};R(window.location.pathname).then(l)}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>f});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"1.20.x","isLast":true,"path":"/","mainDocId":"intro","docs":[{"id":"curios/commands","path":"/curios/commands","sidebar":"tutorialSidebar"},{"id":"curios/curios-nbt","path":"/curios/curios-nbt","sidebar":"tutorialSidebar"},{"id":"curios/datapack-example","path":"/curios/datapack-example","sidebar":"tutorialSidebar"},{"id":"curios/Developing with Curios/APIs/renderer-interface","path":"/curios/Developing with Curios/APIs/renderer-interface","sidebar":"tutorialSidebar"},{"id":"curios/Developing with Curios/curio-creation","path":"/curios/Developing with Curios/curio-creation","sidebar":"tutorialSidebar"},{"id":"curios/Developing with Curios/data-generation","path":"/curios/Developing with Curios/data-generation","sidebar":"tutorialSidebar"},{"id":"curios/Developing with Curios/getting-started","path":"/curios/Developing with Curios/getting-started","sidebar":"tutorialSidebar"},{"id":"curios/Developing with Curios/rendering-registry","path":"/curios/Developing with Curios/rendering-registry","sidebar":"tutorialSidebar"},{"id":"curios/Developing with Curios/slot-modifiers","path":"/curios/Developing with Curios/slot-modifiers","sidebar":"tutorialSidebar"},{"id":"curios/entity-register","path":"/curios/entity-register","sidebar":"tutorialSidebar"},{"id":"curios/preset-slots","path":"/curios/preset-slots","sidebar":"tutorialSidebar"},{"id":"curios/slot-register","path":"/curios/slot-register","sidebar":"tutorialSidebar"},{"id":"curios/slot-textures","path":"/curios/slot-textures","sidebar":"tutorialSidebar"},{"id":"diet/datapack-example","path":"/diet/datapack-example","sidebar":"tutorialSidebar"},{"id":"diet/diet-groups","path":"/diet/diet-groups","sidebar":"tutorialSidebar"},{"id":"diet/diet-suites","path":"/diet/diet-suites","sidebar":"tutorialSidebar"},{"id":"diet/food-classification","path":"/diet/food-classification","sidebar":"tutorialSidebar"},{"id":"intro","path":"/","sidebar":"tutorialSidebar"},{"id":"/category/curios","path":"/category/curios","sidebar":"tutorialSidebar"},{"id":"/category/diet","path":"/category/diet","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/","label":"intro"}}}},{"name":"1.18.x","label":"1.18.x","isLast":false,"path":"/1.18.x","mainDocId":"intro","docs":[{"id":"champions/commands","path":"/1.18.x/champions/commands","sidebar":"tutorialSidebar"},{"id":"champions/integration/gamestages","path":"/1.18.x/champions/integration/gamestages","sidebar":"tutorialSidebar"},{"id":"champions/integration/scalinghealth","path":"/1.18.x/champions/integration/scalinghealth","sidebar":"tutorialSidebar"},{"id":"champions/loottable","path":"/1.18.x/champions/loottable","sidebar":"tutorialSidebar"},{"id":"champions/nbt","path":"/1.18.x/champions/nbt","sidebar":"tutorialSidebar"},{"id":"intro","path":"/1.18.x/","sidebar":"tutorialSidebar"},{"id":"/category/champions","path":"/1.18.x/category/champions","sidebar":"tutorialSidebar"},{"id":"/category/mod-integrations","path":"/1.18.x/category/mod-integrations","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/1.18.x/","label":"intro"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"3.0.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.0.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.0.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.0.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.0.1"}}}');var u=n(5893);const c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(c);function f(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(6040),s=n(5893);function u(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,s.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,s.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,s.jsx)(c,{error:t})]})}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,s.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)(p,{fallback:()=>(0,s.jsx)(u,{error:t,tryAgain:n}),children:[(0,s.jsx)(o.Z,{children:(0,s.jsx)("title",{children:"Page Error"})}),(0,s.jsx)(l.Z,{children:(0,s.jsx)(u,{error:t,tryAgain:n})})]})}const f=e=>(0,s.jsx)(d,{...e});class p extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??f)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(7294);var r=n(405),a=n(5893);function o(e){return(0,a.jsx)(r.ql,{...e})}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(3727),o=n(8780),i=n(2263),l=n(3919),s=n(412),u=n(5893);const c=r.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:g,isActive:h,"data-noBrokenLinkCheck":m,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.Z)(),{withBaseUrl:k}=(0,d.C)(),x=(0,r.useContext)(c),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const E=f||p;const _=(0,l.Z)(E),C=E?.replace("pathname://","");let T=void 0!==C?(N=C,y&&(e=>e.startsWith("/"))(N)?k(N):N):void 0;var N;T&&_&&(T=(0,o.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const j=(0,r.useRef)(!1),A=n?a.OL:a.rU,L=s.Z.canUseIntersectionObserver,P=(0,r.useRef)(),O=()=>{j.current||null==T||(window.docusaurus.preload(T),j.current=!0)};(0,r.useEffect)((()=>(!L&&_&&null!=T&&window.docusaurus.prefetch(T),()=>{L&&P.current&&P.current.disconnect()})),[P,T,L,_]);const R=T?.startsWith("#")??!1,I=!T||!_||R;return I||m||x.collectLink(T),I?(0,u.jsx)("a",{ref:S,href:T,...E&&!_&&{target:"_blank",rel:"noopener noreferrer"},...b}):(0,u.jsx)(A,{...b,onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,L&&e&&_&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),P.current.observe(e))},to:T,...n&&{isActive:h,activeClassName:g}})}const p=r.forwardRef(f)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u,I:()=>s});var r=n(7294),a=n(5893);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(7529);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return o(l({message:n,id:r}),t)}function u(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=l({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>i});var r=n(7294),a=n(5893);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),l=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:l,children:t})}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>h,gA:()=>f,_r:()=>c,Jo:()=>m,zh:()=>d,yW:()=>g,gB:()=>p});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function p(e){return d(e).versions}function g(e){const t=d(e);return l(t)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function m(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(2573),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(6854),n(3163)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},7955:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(512),a=n(5999),o=n(6668),i=n(9960);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var s=n(5893);function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:c}}=(0,o.L)();if("h1"===t||!n)return(0,s.jsx)(t,{...u,id:void 0});const d=(0,a.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,s.jsxs)(t,{...u,className:(0,r.Z)("anchor",c?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,s.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d,children:"\u200b"})]})}},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(7294);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(5893);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},6040:(e,t,n)=>{"use strict";n.d(t,{Z:()=>pt});var r=n(7294),a=n(512),o=n(4763),i=n(1944),l=n(6550),s=n(5999),u=n(5936),c=n(5893);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const g=(0,s.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??g,{containerRef:n,onClick:r}=p();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var m=n(5281),y=n(9727);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(h,{className:b.skipToContent})}var w=n(6668),k=n(9689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:a,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,s.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.Z)("clean-btn close",S.closeButton,e.className),children:(0,c.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,a.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function N(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,c.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,c.jsx)("div",{className:T.announcementBarPlaceholder}),(0,c.jsx)(C,{className:T.announcementBarContent}),o&&(0,c.jsx)(E,{onClick:n,className:T.announcementBarClose})]})}var j=n(7747),A=n(2466);var L=n(902),P=n(3102);const O=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,j.e)(),t=(0,P.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,L.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,c.jsx)(O.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(O);if(!e)throw new L.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:I(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=D();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(2949),z=n(2389);function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function Z(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.Z)(),l=(0,s.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,s.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,a.Z)(U.toggle,t),children:(0,c.jsxs)("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,c.jsx)(B,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),(0,c.jsx)($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(Z),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,M.I)();return r?null:(0,c.jsx)(H,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var q=n(1327);function G(){return(0,c.jsx)(q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,j.e)();return(0,c.jsx)("button",{type:"button","aria-label":(0,s.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(G,{}),(0,c.jsx)(W,{className:"margin-right--md"}),(0,c.jsx)(Y,{})]})}var K=n(9960),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...u}=e;const d=(0,X.Z)(r),f=(0,X.Z)(t),p=(0,X.Z)(a,{forcePrependBaseUrl:!0}),g=o&&a&&!(0,J.Z)(a),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[o,g&&(0,c.jsx)(te.Z,{...l&&{width:12,height:12}})]})};return a?(0,c.jsx)(K.Z,{href:s?p:a,...u,...h}):(0,c.jsx)(K.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},...u,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,c.jsx)(ne,{className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,a.Z)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,c.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(6043),le=n(8596),se=n(2263);const ue={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,c.jsxs)("div",{ref:s,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,a.Z)("navbar__link",o),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:l.children??l.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(_e,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:o,onClick:i,...s}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[u,d,g]),(0,c.jsxs)("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,c.jsx)(ne,{role:"button",className:(0,a.Z)(ue.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),p()},children:s.children??s.label}),(0,c.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(_e,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,c.jsx)(r,{...n})}var ge=n(4711);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const me="iconLanguage_nlXk";var ye=n(1875);const be={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,a.Z)(n,be.navbarSearchContainer),children:t})}var we=n(143),ke=n(3438);var xe=n(373);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));const Ee={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,se.Z)(),f=(0,ge.l)(),{search:p,hash:g}=(0,l.TH)(),h=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${g}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],m=t?(0,s.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,c.jsx)(pe,{...o,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(he,{className:me}),m]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(ve,{className:n,children:(0,c.jsx)(ye.Z,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,c.jsx)(i,{className:(0,a.Z)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.Iw)(r),i=(0,ke.vY)(t,r),l=o?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>l||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.Iw)(r),i=(0,ke.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,ke.lO)(r)[0],i=t??o.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,c.jsx)(oe,{...a,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:u,hash:d}=(0,l.TH)(),f=(0,we.Iw)(n),p=(0,we.gB)(n),{savePreferredVersionName:g}=(0,xe.J)(n),h=[...a,...p.map((e=>{const t=f.alternateDocVersions[e.name]??Se(e);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...o],m=(0,ke.lO)(n)[0],y=t&&h.length>1?(0,s.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,b=t&&h.length>1?void 0:Se(m).path;return h.length<=1?(0,c.jsx)(oe,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,c.jsx)(pe,{...i,mobile:t,label:y,to:b,items:h,isActive:r?()=>!1:void 0})}};function _e(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=Ee[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(a,{...n})}function Ce(){const e=(0,j.e)(),t=(0,w.L)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(_e,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Te(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(s.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ne(){const e=0===(0,w.L)().navbar.items.length,t=D();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Te,{onClick:()=>t.hide()}),t.content]})}function je(){const e=(0,j.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,c.jsx)(F,{header:(0,c.jsx)(Q,{}),primaryMenu:(0,c.jsx)(Ce,{}),secondaryMenu:(0,c.jsx)(Ne,{})}):null}const Ae={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,a.Z)("navbar-sidebar__backdrop",e.className)})}function Pe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,j.e)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,A.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:l,"aria-label":(0,s.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ae.navbarHideable,!d&&Ae.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Le,{onClick:i.toggle}),(0,c.jsx)(je,{})]})}var Oe=n(8780);const Re={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Ie(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(s.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function De(e){let{error:t}=e;const n=(0,Oe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:Re.errorBoundaryError,children:n})}class Fe extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Me="right";function ze(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,c.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Be(){const{toggle:e,shown:t}=(0,j.e)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,s.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,c.jsx)(ze,{})})}const $e={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(Fe,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,c.jsx)(_e,{...e})},t)))})}function Ze(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function He(){const e=(0,j.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Me)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,c.jsx)(Ze,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(Be,{}),(0,c.jsx)(G,{}),(0,c.jsx)(Ue,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(Ue,{items:r}),(0,c.jsx)(W,{className:$e.colorModeToggle}),!a&&(0,c.jsx)(ve,{children:(0,c.jsx)(ye.Z,{})})]})})}function Ve(){return(0,c.jsx)(Pe,{children:(0,c.jsx)(He,{})})}function We(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,l=(0,X.Z)(n),s=(0,X.Z)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(K.Z,{className:"footer__link-item",...r?{href:o?s:r}:{to:l},...i,children:[a,r&&!(0,J.Z)(r)&&(0,c.jsx)(te.Z,{})]})}function qe(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(We,{item:t})},t.href??t.to)}function Ge(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(qe,{item:e},t)))})]})}function Ye(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(Ge,{column:e},t)))})}function Qe(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ke(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(We,{item:t})}function Xe(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(Ke,{item:e}),t.length!==n+1&&(0,c.jsx)(Qe,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(Ye,{columns:t}):(0,c.jsx)(Xe,{links:t})}var et=n(9965);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(et.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,c.jsx)(K.Z,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,c.jsx)(nt,{logo:t})}):(0,c.jsx)(nt,{logo:t})}function at(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,c.jsx)("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function it(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,c.jsx)(ot,{style:a,links:n&&n.length>0&&(0,c.jsx)(Je,{links:n}),logo:r&&(0,c.jsx)(rt,{logo:r}),copyright:t&&(0,c.jsx)(at,{copyright:t})})}const lt=r.memo(it),st=(0,L.Qc)([M.S,k.pl,A.OC,xe.L5,i.VC,function(e){let{children:t}=e;return(0,c.jsx)(P.n2,{children:(0,c.jsx)(j.M,{children:(0,c.jsx)(R,{children:t})})})}]);function ut(e){let{children:t}=e;return(0,c.jsx)(st,{children:t})}var ct=n(7955);function dt(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(ct.Z,{as:"h1",className:"hero__title",children:(0,c.jsx)(s.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(Ie,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(De,{error:t})})]})})})}const ft={mainWrapper:"mainWrapper_z2l0"};function pt(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,y.t)(),(0,c.jsxs)(ut,{children:[(0,c.jsx)(i.d,{title:l,description:s}),(0,c.jsx)(v,{}),(0,c.jsx)(N,{}),(0,c.jsx)(Ve,{}),(0,c.jsx)("div",{id:d,className:(0,a.Z)(m.k.wrapper.main,ft.mainWrapper,r),children:(0,c.jsx)(o.Z,{fallback:e=>(0,c.jsx)(dt,{...e}),children:t})}),!n&&(0,c.jsx)(lt,{})]})}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});n(7294);var r=n(9960),a=n(4996),o=n(2263),i=n(6668),l=n(9965),s=n(5893);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Z)(t.src),dark:(0,a.Z)(t.srcDark||t.src)},i=(0,s.jsx)(l.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,o.Z)(),{navbar:{title:n,logo:l}}=(0,i.L)(),{imageClassName:c,titleClassName:d,...f}=e,p=(0,a.Z)(l?.href||"/"),g=n?"":t,h=l?.alt??g;return(0,s.jsxs)(r.Z,{to:p,...f,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(u,{logo:l,alt:h,imageClassName:c}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(7294);var r=n(5742),a=n(5893);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.Z,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},9965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7294),a=n(512),o=n(2389),i=n(2949);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(5893);function u(e){let{className:t,children:n}=e;const u=(0,o.Z)(),{colorMode:c}=(0,i.I)();return(0,s.jsx)(s.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.Z)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:o},e)}))})}function c(e){const{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(u,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>u,z:()=>y});var r=n(7294),a=n(412),o=n(469),i=n(1442),l=n(5893);const s="ease-in-out";function u(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return f(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function g(e){if(!a.Z.canUseDOM)return e?c:d}function h(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:o}),(0,l.jsx)(t,{ref:c,style:u?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(c.current,n),i?.(n))},className:s,children:a})}function m(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[s,u]=(0,r.useState)(t);return(0,o.Z)((()=>{t||i(!0)}),[t]),(0,o.Z)((()=>{a&&u(t)}),[a,t]),a?(0,l.jsx)(h,{...n,collapsed:s}):null}function y(e){let{lazy:t,...n}=e;const r=t?m:h;return(0,l.jsx)(r,{...n})}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>h,pl:()=>g});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668),s=n(5893);const u=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),d=()=>"true"===u.get(),f=e=>u.set(String(e)),p=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&f(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(p.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>y,S:()=>m});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668),s=n(5893);const u=r.createContext(void 0),c="theme",d=(0,i.WA)(c),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,g=e=>a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),h=e=>{d.set(p(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&h(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[a,i])}();return(0,s.jsx)(u.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(u);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>y});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(3438),s=n(902),u=n(12),c=n(5893);const d=e=>`docs-preferred-version-${e}`,f={save:(e,t,n)=>{(0,u.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(d(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const g=r.createContext(null);function h(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(f.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){f.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=h();return(0,c.jsx)(g.Provider,{value:n,children:t})}function y(e){let{children:t}=e;return l.cE?(0,c.jsx)(m,{children:t}):(0,c.jsx)(c.Fragment,{children:t})}function b(){const e=(0,r.useContext)(g);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>u,b:()=>s});var r=n(7294),a=n(902),o=n(5893);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(l.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(l);if(e===i)throw new a.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,q:()=>l});var r=n(7294),a=n(902),o=n(5893);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new a.i6("DocsVersionProvider");return e}},7747:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(1980),l=n(6668),s=n(902),u=n(5893);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[s,u]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(s)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:s})),[e,n,c,s])}function f(e){let{children:t}=e;const n=d();return(0,u.jsx)(c.Provider,{value:n,children:t})}function p(){const e=r.useContext(c);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>u,n2:()=>l});var r=n(7294),a=n(902),o=n(5893);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=o,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>l});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){const[e,t]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){t(function(){if(!a.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>i?o.desktop:o.mobile}())}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},3438:(e,t,n)=>{"use strict";n.d(t,{LM:()=>g,MN:()=>T,SN:()=>C,_F:()=>b,cE:()=>f,f:()=>w,jA:()=>h,lO:()=>S,oz:()=>E,s1:()=>x,vY:()=>_,xz:()=>p});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(4477),u=n(1116),c=n(7392),d=n(8596);const f=!!i._r;function p(e){const t=(0,s.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function g(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=g(t);if(e)return e}}(e):void 0:e.href}function h(){const{pathname:e}=(0,a.TH)(),t=(0,u.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=k({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),y=(e,t)=>e.some((e=>b(e,t)));function b(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||y(e.items,t))}function v(e,t){switch(e.type){case"category":return b(e,t)||e.items.some((e=>v(e,t)));case"link":return!e.unlisted||b(e,t);default:return!0}}function w(e,t){return(0,r.useMemo)((()=>e.filter((e=>v(e,t)))),[e,t])}function k(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function x(){const e=(0,u.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?k({sidebarItems:e.items,pathname:t}):null}function S(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([t,n,a].filter(Boolean))),[t,n,a])}function E(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function _(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function C(e){let{route:t}=e;const n=(0,a.TH)(),r=(0,s.E)(),i=t.routes,l=i.find((e=>(0,a.LX)(n.pathname,e)));if(!l)return null;const u=l.sidebar,c=u?r.docsSidebars[u]:void 0;return{docElement:(0,o.H)(i),sidebarName:u,sidebarItems:c}}function T(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!g(e)))}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>i,_X:()=>l});var r=n(7294),a=n(6550),o=n(902);function i(e){!function(e){const t=(0,a.k6)(),n=(0,o.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){return function(e){const t=(0,a.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>d,VC:()=>g});var r=n(7294),a=n(512),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2263);var c=n(5893);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const l=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.C)(),f=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.Z,{children:[t&&(0,c.jsx)("title",{children:l}),t&&(0,c.jsx)("meta",{property:"og:title",content:l}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,c.jsx)("meta",{property:"og:image",content:f}),f&&(0,c.jsx)("meta",{name:"twitter:image",content:f}),i]})}const f=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(f),l=(0,a.Z)(i,t);return(0,c.jsxs)(f.Provider,{value:l,children:[(0,c.jsx)(o.Z,{children:(0,c.jsx)("html",{className:l})}),n]})}function g(e){let{children:t}=e;const n=l(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,a.Z)(r,o),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>l,Qc:()=>c,Ql:()=>u,i6:()=>s,zX:()=>i});var r=n(7294),a=n(469),o=n(5893);function i(e){const t=(0,r.useRef)(e);return(0,a.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,a.Z)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function u(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>h,OC:()=>c,RF:()=>p,o5:()=>g});var r=n(7294),a=n(412),o=n(2389),i=n(469),l=n(902),s=n(5893);const u=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(u.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(u);if(null==e)throw new l.i6("ScrollControllerProvider");return e}const f=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),a=(0,r.useRef)(f()),o=(0,l.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=f();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function g(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.Z)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:a}}function h(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>c,WA:()=>u});var r=n(7294);const a="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=i(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function c(e,t){const n=(0,r.useRef)((()=>null===e?s:u(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),a=n(6550),o=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.Z)(),{pathname:s}=(0,a.TH)(),u=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>p,PP:()=>N,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var l=n(8776);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,h(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var a=p(n);a&&a!==g&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),m=0;m{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},4779:(e,t,n)=>{var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var g=e[i],h=n[2],m=n[3],y=n[4],b=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=h&&null!=g&&g!==h,x="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||c,_=y||b;r.push({name:m||o++,prefix:h||"",delimiter:E,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+s(E)+"]+?"})}}return i{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.gradle=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("gradle","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("gradle","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("gradle","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.gradle}(Prism)},2503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},4277:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},6854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),g=f.indexOf(p);if(g>-1){++a;var h=f.substring(0,g),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=f.substring(g+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(m),y&&b.push.apply(b,i([y])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(Prism)},9930:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},3163:(e,t,n)=>{var r={"./prism-gradle":1565,"./prism-java":2503,"./prism-json":4277,"./prism-toml":9930};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=3163},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(3840);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n
\ No newline at end of file diff --git a/curios/preset-slots.html b/curios/preset-slots.html deleted file mode 100644 index d2eabad..0000000 --- a/curios/preset-slots.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Preset Slot Types | Illusive Soulworks - - - - -
Version: 1.20.x

Preset Slot Types

-

A list of commonly used slot types that are already defined in Curios for developers to use.

-

Overview

-
-

One of the benefits of using Curios is that multiple developers can share slot types between each other, allowing -mechanics and items to cooperate seamlessly. As long as the identifier for the slot type is the same, the slot types -will be merged together upon registration. To reduce the need for redundant code and data, Curios provides a preset -list of slot types that are commonly used in the modded community and should be favored over creating wholly unique slot -types when applicable.

-
note

Although these slot types are provided by Curios, they are not active by default. A developer or user will still need to -take the proper steps to register the slot type(s) that they want in order to add them to the game.

-

Slot Types

-
-
IdentifierUsageExamples
curioUniversal, able to equip or be equipped into any slot typeBotania
backItems worn on the back, such as capes or backpacksBackpacked, BountifulBaubles, Elytra Slot, Shulker Box Slot
beltItems worn around the waist, such as belts or pouchesArtifacts, Cyclic, Nature's Aura
bodyItems worn around the torso, such as cloaks or shirtsEngineer's Tools, Reliquary
braceletItems worn around the wrist, such as bands or bracelets
charmMiscellaneous items, either held or not associated with a body partAngel Ring, Charm of Undying, Dark Utilities
headItems worn on top of the head, such as crowns or hatsVanillaTweaks
handsItems worn on hands, such as gloves or gauntletsArtifacts, Cyclic
necklaceItems worn around the neck, such as amulets or necklacesAzure RPG Items, Potion Capsule
ringItems worn on the "fingers", such as ringsEnigmatic Legacy, Gobber
- - \ No newline at end of file diff --git a/curios/slot-register.html b/curios/slot-register.html deleted file mode 100644 index f2190bc..0000000 --- a/curios/slot-register.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - -Registering and Editing Slot Types | Illusive Soulworks - - - - -
Version: 1.20.x

Registering and Editing Slot Types

-

A tutorial on how to register and modify slot types that are recognized by Curios.

-

Overview

-
-

Beginning in 1.20, the recommended way to register a slot type is through a datapack. If you are unfamiliar with -datapacks, it is recommended to read through the wiki page in order to -understand the concept and structure before proceeding to the rest of this page.

-

If using one of the Preset Slot Types, this step can be skipped since Curios natively provides the -needed datapack registration.

-
info

Why are my registered slot types not appearing?

Registering slot types makes them available for use; however, they are not added to any entities (including players) -by default. In order to add them to an entity, please refer to the next step on adding slot -types to entities.

-

Directory

-
-

The file should be a .json file with the identifier for the slot type to be registered as the name. This file -should be located in the ~/data/(namespace)/curios/slots/ folder of the datapack.

-

Example: Registering a head slot type requires creating a head.json file located in ~/data/(namespace)/curios/slots/ -so the final path should look like ~/data/(namespace)/curios/slots/head.json.

-
note

The (namespace) field should be replaced by the namespace chosen for this portion of the datapack. If this is a part -of a mod, the namespace is usually the mod ID. If this is part of a user-defined datapack, then the namespace can be -anything that is lowercased with no special characters.

-

Syntax

-
-

The structure of the .json file for the slot type consists of a top-level JSON object that holds various fields -related to that slot type.

-
FieldTypeDefaultRequiredDescriptionMerge Behavior
replacebooleanfalsefalseWhen true, replaces data from lower-priority datapacksN/A
sizeinteger1falseThe number of slots of this slot type to give by defaultThe highest size will be used
operation"SET"|"ADD"|"REMOVE""SET"falseWhether to use size to set, add, or remove from the total number of slotsN/A
orderinteger1000falseThe order the slots will appear in the native Curios GUI, lower numbers appear higherThe lowest order will be used
iconstringcurios:slot/empty_curios_slotfalseThe location of the icon to use for the slot typeThe last icon will be used
add_cosmeticbooleanfalsefalseWhen true, adds a cosmetic slot next to the original that does not provide function but still renders its contentstrue if any add a cosmetic slot
use_native_guibooleantruefalseWhen false, does not add the slot type to the native Curios GUIfalse if any do not use the native GUI
render_togglebooleantruefalseWhen false, does not allow the slot type to toggle its renderingfalse if any do not allow render toggling
drop_rule"DEFAULT"|"ALWAYS_DROP"|"ALWAYS_KEEP"|"DESTROY""DEFAULT"falseWhether to drop, keep, destroy, or follow the keepCurios configurationN/A
-
info

Which operation value should I use?

In most cases, "SET" (also the default if no value is defined) will accomplish the desired result. It denotes that a -slot type should have a certain amount of slots by default, with the highest value among all consumers being used. -"ADD"and "REMOVE" are inherent slot modifiers and are based on the amount of slots specified by all "SET" -operations, the result of which can change based on the mods/datapacks loaded.

-

Example

-
-
{
"order": 20,
"size": 4,
"icon": "curios:slot/empty_custom_slot",
"add_cosmetic": true
}
-

This slot type will have a relatively low order of 20, which will make it appear higher than most slots. It also has -size of 4 which means that it will register 4 slots to any given entity by default. For the GUI, it uses an icon -located at curios:slot/empty_custom_slot. It also has added a cosmetic slot so there will be an additional slot for -cosmetic items next to it in the Curios GUI.

-

Modifying a Slot Type

-
-

The process of modifying a slot type is identical to registering a new slot type, except using the same identifier as -the existing slot type. All slot types that share an identifier will be merged according to the Merge Behavior of -each field as outlined above.

-

Example

-

Curios natively provides data for the ring slot, which defaults the size to 1. In order to increase the size to 2, -create a ring.json slot registration file in the datapack with the contents:

-
{
"size": 2
}
-

This will merge the size data of this registration with the existing registration provided by Curios, keeping all of the -other data intact while increasing the number of slots to 2.

- - \ No newline at end of file diff --git a/curios/slot-textures.html b/curios/slot-textures.html deleted file mode 100644 index 8b330e1..0000000 --- a/curios/slot-textures.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -Adding Custom Slot Textures | Illusive Soulworks - - - - -
Version: 1.20.x

Adding Custom Slot Textures

-

A tutorial on how to add custom slot textures to slot types.

-

Overview

-
-

Registering a new custom slot texture can be done through a resource pack. If you are -unfamiliar with resource packs, it is recommended to read through the wiki page -in order to understand the concept and structure before proceeding to the rest of this page.

-

Registering a Slot Texture

-
-

Create a new resource directory assets/(namespace)/textures/slot and place any .png file in the slot folder.

-
info

The image itself should be 16x16 in size and have a transparent background with only the slot texture drawn.

Example:

-
note

The (namespace) field should be replaced by the namespace chosen for this portion of the resource pack. If this is a -part of a mod, the namespace is usually the mod ID. If this is part of a user-defined resource pack, then the namespace -can be anything that is lowercased with no special characters.

-

Using a Slot Texture

-
-

When entering the fields of the .json slot registration files as described in Register a Slot Type, -the "icon" field should be set to the path of the slot that was added to the resource directory.

-

For example, a empty_test_slot.png file placed in assets/test/textures/slot that wants to be added to the charm -slot should have a charm.json slot registration file in a datapack with the following contents:

-
{
"icon": "test:slot/empty_test_slot"
}
-
caution

Note that the path in "icon" is not the entire path of the directory. It omits the texture part and also omits the -.png extension. This is due to how Curios and Minecraft parses the icon, so make sure the path is formatted correctly -when adding this field.

- - \ No newline at end of file diff --git a/curios/Developing with Curios/data-generation.html b/curios/slots/data-generation.html similarity index 76% rename from curios/Developing with Curios/data-generation.html rename to curios/slots/data-generation.html index 8f50203..2e53872 100644 --- a/curios/Developing with Curios/data-generation.html +++ b/curios/slots/data-generation.html @@ -1,14 +1,14 @@ - + -Data Generation | Illusive Soulworks - - +Data Generation | Illusive Soulworks + + -
Version: 1.20.x

Data Generation

+
Version: 1.20.x

Data Generation

A tutorial on how to programmatically generate the Curios data files.

Prerequisites


@@ -30,7 +30,7 @@

Slot Generat
@Override
public void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {
this.createSlot("test_slot"); // Create a slot with the identifier and file name "test_slot"
}

Additional parameters can be added by calling methods on the ISlotData returned by the createSlot method call. Most of these parameters are linked to fields for ISlotType, more information on how these fields are constructed and what -they represent can be found on the page for slot registration.

+they represent can be found on the page for slot registration.

MethodParametersField
replacebooleanreplace
sizeintegersize
operationstringoperation
orderintegerorder
iconResourceLocationicon
addCosmeticbooleanadd_cosmetic
useNativeGuibooleanuse_native_gui
renderTogglebooleanrender_toggle
dropRuleICurio$DropRuledrop_rule
addConditionIConditionN/A

Example

The following example creates a slot file with the file name and identifier test_slot, gives it a size of 4, sets the @@ -44,7 +44,7 @@

Entities
@Override
public void generate(HolderLookup.Provider registries, ExistingFileHelper fileHelper) {
this.createEntities("test_entities"); // Create an entities file with the name "test_entities"
}

Additional parameters can be added by calling methods on the IEntitiesData returned by the createEntities method call. All of these parameters correspond to JSON fields, more information on these can be found on the page for -entity registration.

+entity registration.

MethodParametersFieldNotes
replacebooleanreplace
addPlayerN/AentitiesAdds "minecraft:player" to the entities array
addEntitiesEntityType<?>[]entities
addSlotsstring[]slotsAdds each string as a slot identifier to the slots array
addConditionIConditionconditions

Example

The following example creates an entities file with the file name test_entities, and assigns the "head", "ring", @@ -58,6 +58,6 @@

Criterion

Example

The following example will create an advancement file, curiostest/test, that adds a criteration called "test", that is triggered when a "minecraft:diamond" item is equipped in the Badlands biome.

-
Advancement.Builder.advancement()
.addCriterion("test",
CuriosTriggers.equipAtLocation(
ItemPredicate.Builder.item().of(Items.DIAMOND),
LocationPredicate.Builder.location().setBiome(Biomes.BADLANDS)))
.save(saver, new ResourceLocation("curiostest", "test"), existingFileHelper);
+
Advancement.Builder.advancement()
.addCriterion("test",
CuriosTriggers.equipAtLocation(
ItemPredicate.Builder.item().of(Items.DIAMOND),
LocationPredicate.Builder.location().setBiome(Biomes.BADLANDS)))
.save(saver, new ResourceLocation("curiostest", "test"), existingFileHelper);
\ No newline at end of file diff --git a/curios/datapack-example.html b/curios/slots/datapack-example.html similarity index 62% rename from curios/datapack-example.html rename to curios/slots/datapack-example.html index 9377585..28db6cd 100644 --- a/curios/datapack-example.html +++ b/curios/slots/datapack-example.html @@ -1,14 +1,14 @@ - + -Example Datapack | Illusive Soulworks - - +Example Datapack | Illusive Soulworks + + -
Version: 1.20.x

Example Datapack

+
Version: 1.20.x

Example Datapack

An example datapack for configuring various curio mechanics, including adding slot types to entities and modifying existing slot types.

Getting Started

@@ -29,7 +29,7 @@

  • The number of slots available is 1, as denoted by the "size" field
  • Each slot of this slot type has an associated cosmetic slot, as denoted by the "add_cosmetic" field
  • -

    For more information on the fields and customization of slot types, please refer to the slot types page.

    +

    For more information on the fields and customization of slot types, please refer to the slot types page.

    Modifying an Existing Slot Type

    Modifying an existing slot type is controlled by the data/curios_example/curios/slots/ring.json file:

    {
    "size": 2,
    "add_cosmetic": true
    }
    @@ -42,18 +42,18 @@

    the slot types page.

    +

    For more information on how slot types are modified from multiple files, please refer to the slot types page.

    Adding Slot Types to One or More Entities

    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. This is configured by the data/curios_example/curios/entities/entities.json file:

    {
    "entities": [
    "minecraft:player",
    "minecraft:armor_stand"
    ],
    "slots": [
    "back",
    "body",
    "belt",
    "bracelet",
    "charm",
    "curio",
    "example",
    "hands",
    "head",
    "necklace",
    "ring"
    ]
    }

    The file specifies these properties:

      -
    • The slots being given are all the preset slot types and the example slot type created by this +
    • The slots being given are all the preset slot types and the example slot type created by this datapack, as denoted by the "slots" list
    • The entities being given slots are all players and armor stands, as denoted by the "entities" list
    -

    For more information on the fields and customization of entity slots, please refer to the entity slots page.

    +

    For more information on the fields and customization of entity slots, please refer to the entity slots page.

    Adding an Item to a Curio Slot

    Items are added to slot types by adding them to the relevant item tag. In the example datapack, an item tag for the ring slot type is created at data/curios/tags/items/ring.json:

    @@ -65,6 +65,6 @@

    Activating the Datapack

    Datapacks are created on a per-world basis and need to be placed in the datapacks folder of the world folder on a dedicated server or the saves/(World Name) folder in single player. They should automatically be enabled upon loading -the datapack for the first time in the world.

    +the datapack for the first time in the world.

    \ No newline at end of file diff --git a/curios/slots/entity-register.html b/curios/slots/entity-register.html new file mode 100644 index 0000000..49a9ad2 --- /dev/null +++ b/curios/slots/entity-register.html @@ -0,0 +1,63 @@ + + + + + +Entity Slot Types | Illusive Soulworks + + + + +
    Version: 1.20.x

    Entity Slot Types

    +

    A tutorial on how to add registered slot types to entities.

    +

    Overview

    +
    +

    The recommended way to add a registered slot type to an entity is through a datapack. If you are unfamiliar with +datapacks, it is recommended to read through the wiki page in order to +understand the concept and structure before proceeding to the rest of this page.

    +

    Registered slot types will all be available for use but will not appear in-game until they are +added to one or more entities.

    +

    Alternatively, users can instead choose to use the Curios configuration to create +and assign slot types to players only. There are fewer features than those offered in the datapack method, but some +users may find the process to be more straightforward.

    +

    Directory

    +
    +

    The file should be a .json file located in the ~/data/(namespace)/curios/entities/ folder of the datapack.

    +
    note

    The file can be named anything.

    The (namespace) field should be replaced by the namespace chosen for this portion of the datapack. If this is a part +of a mod, the namespace is usually the mod ID. If this is part of a user-defined datapack, then the namespace can be +anything that is lowercased with no special characters.

    +

    Syntax

    +
    +

    The structure of the .json file for the entity configuration consists of a top-level JSON object that holds several +potential fields.

    +

    All fields are optional unless otherwise noted.

    +

    replace (boolean)

    +

    When true, replaces data from lower-priority datapacks.

    +
      +
    • default: false
    • +
    +

    entities (string[])

    +

    An array of registry names of entity types or entity type tags.

    +
      +
    • default: []
    • +
    +

    slots (string[])

    +

    An array of identifier names for registered slot types.

    +
      +
    • default: []
    • +
    +

    conditions (string[])

    +

    An array of ICondition implementations that must all pass before these slots are loaded into these entities.

    +
      +
    • default: []
    • +
    +

    All the listed slots will be associated to all the listed entities.

    +
    caution

    Adding multiple of the same identifier to the slots array will not add multiple slots. Each entry in the slots +array represents a registered slot type and the entries do not stack, please refer to that page in +order to change slot type behavior including default size.

    +

    Example

    +
    +
    {
    "entities": ["player", "minecraft:zombie"],
    "slots": ["head", "back"]
    }
    +

    This configuration will give two slot types, head and back, to all players and all zombies.

    + + \ No newline at end of file diff --git a/curios/slots/preset-slots.html b/curios/slots/preset-slots.html new file mode 100644 index 0000000..78e4708 --- /dev/null +++ b/curios/slots/preset-slots.html @@ -0,0 +1,26 @@ + + + + + +Preset Slot Types | Illusive Soulworks + + + + +
    Version: 1.20.x

    Preset Slot Types

    +

    A list of commonly used slot types that are already defined in Curios for developers to use.

    +

    Overview

    +
    +

    One of the benefits of using Curios is that multiple developers can share slot types between each other, allowing +mechanics and items to cooperate seamlessly. As long as the identifier for the slot type is the same, the slot types +will be merged together upon registration. To reduce the need for redundant code and data, Curios provides a preset +list of slot types that are commonly used in the modded community and should be favored over creating wholly unique slot +types when applicable.

    +
    note

    Although these slot types are provided by Curios, they are not added to any entities by default. This needs to be done +by the developer or user by adding slot types to entities.

    +

    Slot Types

    +
    +
    IdentifierUsageExamples
    curioUniversal, able to equip or be equipped into any slot typeBotania
    backItems worn on the back, such as capes or backpacksBackpacked, BountifulBaubles, Elytra Slot, Shulker Box Slot
    beltItems worn around the waist, such as belts or pouchesArtifacts, Cyclic, Nature's Aura
    bodyItems worn around the torso, such as cloaks or shirtsEngineer's Tools, Reliquary
    braceletItems worn around the wrist, such as bands or bracelets
    charmMiscellaneous items, either held or not associated with a body partAngel Ring, Charm of Undying, Dark Utilities
    headItems worn on top of the head, such as crowns or hatsVanillaTweaks
    handsItems worn on hands, such as gloves or gauntletsArtifacts, Cyclic
    necklaceItems worn around the neck, such as amulets or necklacesAzure RPG Items, Potion Capsule
    ringItems worn on the "fingers", such as ringsEnigmatic Legacy, Gobber
    + + \ No newline at end of file diff --git a/curios/Developing with Curios/slot-modifiers.html b/curios/slots/slot-modifiers.html similarity index 72% rename from curios/Developing with Curios/slot-modifiers.html rename to curios/slots/slot-modifiers.html index ee48f23..c6951a6 100644 --- a/curios/Developing with Curios/slot-modifiers.html +++ b/curios/slots/slot-modifiers.html @@ -1,24 +1,22 @@ - + -Slot Modifiers | Illusive Soulworks - - +Slot Modifiers | Illusive Soulworks + + -
    Version: 1.20.x

    Slot Modifiers

    +
    Version: 1.20.x

    Slot Modifiers

    A tutorial on how to add and remove slots from the curios inventory on entities.

    Overview

    Slot modifiers are a way to dynamically add and/or remove slots from entities the same way developers could add and/or remove health or attack damage. In fact, it uses the exact same AttributeModifier system to accomplish this.

    Getting Started

    The main way to interact with and add slot modifiers is through the top.theillusivec4.curios.api.type.capability.ICuriosItemHandler -interface. A developer can grab the specific instance of this on the entity by querying the capability from Curios:

    -
    LazyOptional<ICuriosItemHandler> maybeCuriosInventory = CuriosApi.getCuriosInventory(livingEntity);

    The query returns a LazyOptional as the specified entity may not have a curios inventory. If the result is certain to -exist, then the optionality can be disregarded and simplified to:

    ICuriosItemHandler curiosInventory = CuriosApi.getCuriosInventory(livingEntity).resolve().get();
    +interface. A developer can grab the specific instance of this on the entity by following the steps from the inventory +guide to query the capability from Curios.

    Adding or Removing Slots

    Adding slots can be done through ICuriosItemHandler#addTransientSlotModifiers(Multimap<String, AttributeModifier>) and ICuriosItemHandler#addPermanentSlotModifiers(Multimap<String, AttributeModifier>).

    @@ -46,7 +44,7 @@

    Add to the existing -2 and result in a total of 1 slot.

    caution

    Slot modifiers can only add slots for slot types that are already assigned to entities. If a slot type exists but is not assigned to the specified entity, then the slot modifier will not be able to add any slots of that slot type. Be sure to -go over how to assign slots to entities if slot modifiers do not appear to be adding any slots.

    +go over how to assign slots to entities if slot modifiers do not appear to be adding any slots.

    Removing Slot Modifiers

    Removing slot modifiers can be done through ICuriosItemHandler#removeSlotModifiers(Multimap<String, AttributeModifier>).

    This follows very similar logic as the preceding section on adding slot modifiers:

    @@ -64,7 +62,7 @@

    InterfacesBoth the ICurio and ICurioItem interfaces expose a method called getAttributeModifiers that returns a Multimap<Attribute, AttributeModifier> denoting attributes and their modifiers, in the same way that items themselves have a similar method when equipped in vanilla slots. For more information on attaching these interfaces to items, see -the curio creation page.

    +the curio creation page.

    @Override
    public Multimap<Attribute, AttributeModifier> getAttributeModifiers(SlotContext slotContext, UUID uuid) {
    Multimap<Attribute, AttributeModifier> map = LinkedHashMultimap.create();
    // Add attribute modifiers
    return map;
    }

    In order to add slot modifiers specifically, developers can leverage the CuriosApi#addSlotModifier(Multimap, String, UUID, double, AttributeModifier.Operation) method:

    @@ -86,6 +84,6 @@

    NBT Tag
    caution

    It's usually best to use null in place of the uuid, to avoid collisions as described in the preceding caution note, unless there is justification for providing a static UUID. Providing a null UUID will allow Curios to provide a -slot-specific UUID in its place.

    +slot-specific UUID in its place.

    \ No newline at end of file diff --git a/curios/slots/slot-register.html b/curios/slots/slot-register.html new file mode 100644 index 0000000..aa28b96 --- /dev/null +++ b/curios/slots/slot-register.html @@ -0,0 +1,124 @@ + + + + + +Slot Types | Illusive Soulworks + + + + +
    Version: 1.20.x

    Slot Types

    +

    A tutorial on how to register and modify slot types that are recognized by Curios.

    +

    Overview

    +
    +

    The recommended way to register a slot type is through a datapack. If a user or developer is unfamiliar with datapacks, +it is recommended to read through the wiki page in order to understand +the concept and structure before proceeding to the rest of this page.

    +

    Alternatively, users can instead choose to use the Curios configuration to create +and modify slot types. There are fewer features than those offered in the datapack method, but some users may find the +process to be more straightforward.

    +

    If using one of the Preset Slot Types, this step can be skipped since Curios natively provides the +needed datapack registration.

    +
    info

    Why are my registered slot types not appearing?

    Registering slot types makes them available for use; however, they are not added to any entities (including players) +by default. In order to add them to an entity, please refer to the next step on adding slot +types to entities.

    +

    Directory

    +
    +

    The file should be a .json file with the identifier for the slot type to be registered as the name. This file +should be located in the ~/data/(namespace)/curios/slots/ folder of the datapack.

    +

    Example: Registering a head slot type requires creating a head.json file located in ~/data/(namespace)/curios/slots/ +so the final path should look like ~/data/(namespace)/curios/slots/head.json.

    +
    note

    The (namespace) field should be replaced by the namespace chosen for this portion of the datapack. If this is a part +of a mod, the namespace is usually the mod ID. If this is part of a user-defined datapack, then the namespace can be +anything that is lowercased with no special characters.

    +

    Syntax

    +
    +

    The structure of the .json file for the slot type consists of a top-level JSON object that holds various fields +related to that slot type.

    +

    All fields are optional unless otherwise noted. Each field denotes certain merging behavior which defines how the +field is merged between all data files that include it.

    +

    replace (boolean)

    +

    When true, replaces data from lower-priority datapacks.

    +
      +
    • default: false
    • +
    • merging: N/A
    • +
    +

    size (integer)

    +

    The number of slots of this slot type to give by default.

    +
      +
    • default: 1
    • +
    • merging: The highest size will be used.
    • +
    +

    operation ("SET"|"ADD"|"REMOVE")

    +

    Whether to use size to set, add, or remove from the total number of slots.

    +
      +
    • default: "SET"
    • +
    • merging: N/A
    • +
    +

    order (integer)

    +

    The order the slots will appear in the native Curios GUI, lower numbers appear first.

    +
      +
    • default: 1000
    • +
    • merging: The lowest order will be used.
    • +
    +

    icon (string)

    +

    The location of the icon to use for the slot type.

    +
      +
    • default: "curios:slot/empty_curios_slot"
    • +
    • merging: The last icon will be used.
    • +
    +

    add_cosmetic (boolean)

    +

    The location of the icon to use for the slot type.

    +
      +
    • default: false
    • +
    • merging: true if any data file sets this field to true.
    • +
    +

    use_native_gui (boolean)

    +

    When false, does not add the slot type to the native Curios GUI.

    +
      +
    • default: true
    • +
    • merging: false if any data file sets this field to false.
    • +
    +

    render_toggle (boolean)

    +

    When false, does not allow the slot type to toggle its rendering.

    +
      +
    • default: true
    • +
    • merging: false if any data file sets this field to false.
    • +
    +

    drop_rule ("DEFAULT"|"ALWAYS_DROP"|"ALWAYS_KEEP"|"DESTROY")

    +

    Whether to drop, keep, destroy, or follow the keepCurios configuration setting.

    +
      +
    • default: "DEFAULT"
    • +
    • merging: N/A
    • +
    +

    validators (string[])

    +

    The list of registered predicates from the Curios API used by this slot type to validate item insertions.

    +
      +
    • default: ["curios:tag"]
    • +
    • merging: Each entry is added into the final array.
    • +
    +
    info

    Which operation value should I use?

    In most cases, "SET" (also the default if no value is defined) will accomplish the desired result. It denotes that a +slot type should have a certain amount of slots by default, with the highest value among all consumers being used. +"ADD"and "REMOVE" are inherent slot modifiers and are based on the amount of slots specified by all "SET" +operations, the result of which can change based on the mods/datapacks loaded.

    +

    Example

    +
    +
    {
    "order": 20,
    "size": 4,
    "icon": "curios:slot/empty_custom_slot",
    "add_cosmetic": true
    }
    +

    This slot type will have a relatively low order of 20, which will make it appear higher than most slots. It also has +size of 4 which means that it will register 4 slots to any given entity by default. For the GUI, it uses an icon +located at curios:slot/empty_custom_slot. It also has added a cosmetic slot so there will be an additional slot for +cosmetic items next to it in the Curios GUI.

    +

    Modifying a Slot Type

    +
    +

    The process of modifying a slot type is identical to registering a new slot type, except using the same identifier as +the existing slot type. All slot types that share an identifier will be merged according to the Merge Behavior of +each field as outlined above.

    +

    Example

    +

    Curios natively provides data for the ring slot, which defaults the size to 1. In order to increase the size to 2, +create a ring.json slot registration file in the datapack with the contents:

    +
    {
    "size": 2
    }
    +

    This will merge the size data of this registration with the existing registration provided by Curios, keeping all of the +other data intact while increasing the number of slots to 2.

    + + \ No newline at end of file diff --git a/curios/slots/slot-textures.html b/curios/slots/slot-textures.html new file mode 100644 index 0000000..0d46c3b --- /dev/null +++ b/curios/slots/slot-textures.html @@ -0,0 +1,36 @@ + + + + + +Slot Icon Textures | Illusive Soulworks + + + + +
    Version: 1.20.x

    Slot Icon Textures

    +

    A tutorial on how to add custom slot textures to slot types.

    +

    Overview

    +
    +

    Registering a new custom slot texture can be done through a resource pack. If you are +unfamiliar with resource packs, it is recommended to read through the wiki page +in order to understand the concept and structure before proceeding to the rest of this page.

    +

    Registering a Slot Texture

    +
    +

    Create a new resource directory assets/(namespace)/textures/slot and place any .png file in the slot folder.

    +
    info

    The image itself should be 16x16 in size and have a transparent background with only the slot texture drawn.

    Example:

    +
    note

    The (namespace) field should be replaced by the namespace chosen for this portion of the resource pack. If this is a +part of a mod, the namespace is usually the mod ID. If this is part of a user-defined resource pack, then the namespace +can be anything that is lowercased with no special characters.

    +

    Using a Slot Texture

    +
    +

    When entering the fields of the .json slot registration files as described in Register a Slot Type, +the "icon" field should be set to the path of the slot that was added to the resource directory.

    +

    For example, a empty_test_slot.png file placed in assets/test/textures/slot that wants to be added to the charm +slot should have a charm.json slot registration file in a datapack with the following contents:

    +
    {
    "icon": "test:slot/empty_test_slot"
    }
    +
    caution

    Note that the path in "icon" is not the entire path of the directory. It omits the texture part and also omits the +.png extension. This is due to how Curios and Minecraft parses the icon, so make sure the path is formatted correctly +when adding this field.

    + + \ No newline at end of file diff --git a/diet/datapack-example.html b/diet/datapack-example.html index fa5701e..1d7a8f5 100644 --- a/diet/datapack-example.html +++ b/diet/datapack-example.html @@ -4,8 +4,8 @@ Example Datapack | Illusive Soulworks - - + +
    Version: 1.20.x

    Example Datapack

    diff --git a/diet/diet-groups.html b/diet/diet-groups.html index e733971..4748f42 100644 --- a/diet/diet-groups.html +++ b/diet/diet-groups.html @@ -4,8 +4,8 @@ Customizing Food Groups | Illusive Soulworks - - + +
    Version: 1.20.x

    Customizing Food Groups

    diff --git a/diet/diet-suites.html b/diet/diet-suites.html index 9b7cbc0..626d8b2 100644 --- a/diet/diet-suites.html +++ b/diet/diet-suites.html @@ -4,8 +4,8 @@ Customizing Diet Suites | Illusive Soulworks - - + +
    Version: 1.20.x

    Customizing Diet Suites

    diff --git a/diet/food-classification.html b/diet/food-classification.html index 40b8bae..6953172 100644 --- a/diet/food-classification.html +++ b/diet/food-classification.html @@ -4,8 +4,8 @@ Categorizing Food to Groups | Illusive Soulworks - - + +
    Version: 1.20.x

    Categorizing Food to Groups

    diff --git a/index.html b/index.html index 45b326c..df58f66 100644 --- a/index.html +++ b/index.html @@ -4,8 +4,8 @@ Overview | Illusive Soulworks - - + +
    Version: 1.20.x

    Overview

    diff --git a/sitemap.xml b/sitemap.xml index c92088e..ccfc09d 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://docs.illusivesoulworks.com/versionsweekly0.5https://docs.illusivesoulworks.com/1.18.xweekly0.5https://docs.illusivesoulworks.com/1.18.x/category/championsweekly0.5https://docs.illusivesoulworks.com/1.18.x/category/mod-integrationsweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/commandsweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/integration/gamestagesweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/integration/scalinghealthweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/loottableweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/nbtweekly0.5https://docs.illusivesoulworks.com/category/curiosweekly0.5https://docs.illusivesoulworks.com/category/dietweekly0.5https://docs.illusivesoulworks.com/curios/commandsweekly0.5https://docs.illusivesoulworks.com/curios/curios-nbtweekly0.5https://docs.illusivesoulworks.com/curios/datapack-exampleweekly0.5https://docs.illusivesoulworks.com/curios/Developing%20with%20Curios/APIs/renderer-interfaceweekly0.5https://docs.illusivesoulworks.com/curios/Developing%20with%20Curios/curio-creationweekly0.5https://docs.illusivesoulworks.com/curios/Developing%20with%20Curios/data-generationweekly0.5https://docs.illusivesoulworks.com/curios/Developing%20with%20Curios/getting-startedweekly0.5https://docs.illusivesoulworks.com/curios/Developing%20with%20Curios/rendering-registryweekly0.5https://docs.illusivesoulworks.com/curios/Developing%20with%20Curios/slot-modifiersweekly0.5https://docs.illusivesoulworks.com/curios/entity-registerweekly0.5https://docs.illusivesoulworks.com/curios/preset-slotsweekly0.5https://docs.illusivesoulworks.com/curios/slot-registerweekly0.5https://docs.illusivesoulworks.com/curios/slot-texturesweekly0.5https://docs.illusivesoulworks.com/diet/datapack-exampleweekly0.5https://docs.illusivesoulworks.com/diet/diet-groupsweekly0.5https://docs.illusivesoulworks.com/diet/diet-suitesweekly0.5https://docs.illusivesoulworks.com/diet/food-classificationweekly0.5https://docs.illusivesoulworks.com/weekly0.5 \ No newline at end of file +https://docs.illusivesoulworks.com/versionsweekly0.5https://docs.illusivesoulworks.com/1.18.xweekly0.5https://docs.illusivesoulworks.com/1.18.x/category/championsweekly0.5https://docs.illusivesoulworks.com/1.18.x/category/mod-integrationsweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/commandsweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/integration/gamestagesweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/integration/scalinghealthweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/loottableweekly0.5https://docs.illusivesoulworks.com/1.18.x/champions/nbtweekly0.5https://docs.illusivesoulworks.com/category/apiweekly0.5https://docs.illusivesoulworks.com/category/curiosweekly0.5https://docs.illusivesoulworks.com/category/dietweekly0.5https://docs.illusivesoulworks.com/category/inventoryweekly0.5https://docs.illusivesoulworks.com/category/itemsweekly0.5https://docs.illusivesoulworks.com/category/slotsweekly0.5https://docs.illusivesoulworks.com/curios/api/renderer-interfaceweekly0.5https://docs.illusivesoulworks.com/curios/commandsweekly0.5https://docs.illusivesoulworks.com/curios/configurationweekly0.5https://docs.illusivesoulworks.com/curios/getting-startedweekly0.5https://docs.illusivesoulworks.com/curios/inventory/basic-inventoryweekly0.5https://docs.illusivesoulworks.com/curios/items/curio-creationweekly0.5https://docs.illusivesoulworks.com/curios/items/curios-nbtweekly0.5https://docs.illusivesoulworks.com/curios/items/rendering-registryweekly0.5https://docs.illusivesoulworks.com/curios/slots/data-generationweekly0.5https://docs.illusivesoulworks.com/curios/slots/datapack-exampleweekly0.5https://docs.illusivesoulworks.com/curios/slots/entity-registerweekly0.5https://docs.illusivesoulworks.com/curios/slots/preset-slotsweekly0.5https://docs.illusivesoulworks.com/curios/slots/slot-modifiersweekly0.5https://docs.illusivesoulworks.com/curios/slots/slot-registerweekly0.5https://docs.illusivesoulworks.com/curios/slots/slot-texturesweekly0.5https://docs.illusivesoulworks.com/diet/datapack-exampleweekly0.5https://docs.illusivesoulworks.com/diet/diet-groupsweekly0.5https://docs.illusivesoulworks.com/diet/diet-suitesweekly0.5https://docs.illusivesoulworks.com/diet/food-classificationweekly0.5https://docs.illusivesoulworks.com/weekly0.5 \ No newline at end of file diff --git a/versions.html b/versions.html index f4969cd..b56cf02 100644 --- a/versions.html +++ b/versions.html @@ -4,8 +4,8 @@ Versions | Illusive Soulworks - - + +

    Illusive Soulworks project documentation versions

    Current version

    Here you can find the documentation for the latest version.

    1.20.xDocumentationRelease Notes

    Past versions

    Here you can find documentation for previous versions of Illusive Soulworks projects.

    1.18.xDocumentationRelease Notes