{"id":52798,"date":"2026-06-03T01:05:59","date_gmt":"2026-06-02T22:05:59","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/"},"modified":"2026-06-03T01:05:59","modified_gmt":"2026-06-02T22:05:59","slug":"custom-item-data","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/","title":{"rendered":"Custom Item Data"},"content":{"rendered":"<p># Custom Item Data<\/p>\n<p>![Version](https:\/\/img.shields.io\/badge\/Minecraft-1.20.6-green) ![Loader](https:\/\/img.shields.io\/badge\/Loader-Fabric-blue) ![Status](https:\/\/img.shields.io\/badge\/Status-In_Development-orange)<\/p>\n<p>A **Fabric library mod** for Minecraft **1.20.6** that lets you store persistent, typed, schema-validated data on any `ItemStack`.<\/p>\n<p>### Two ways to use it:<br \/>\n&#8211; As a **mod developer**, call the `ItemDataAPI` from your own mod to read\/write values on items.<br \/>\n&#8211; As a **server admin**, use the `\/itemdata` commands in-game to define and edit item data without writing code.<\/p>\n<p>&#8212;<\/p>\n<p>## Features<\/p>\n<p>&#8211; Store typed data (`int`, `float`, `string`, `boolean` + your own types for framework) on any `ItemStack`.<br \/>\n&#8211; Schema-based validation \u2014 the framework rejects values that don&#8217;t match the registered type.<br \/>\n&#8211; Automatic persistence (survives save\/load, gives\/clones, etc.).<br \/>\n&#8211; Stacks with different data **don&#8217;t stack together**.<br \/>\n&#8211; In-game admin commands (`\/itemdata [\u2026]`) persisted in the world save.<br \/>\n&#8211; Pluggable custom types via a simple `CustomDataType<T>` interface.<\/p>\n<p>&#8212;<\/p>\n<p>## Installation (end users)<\/p>\n<p>1. Install **Fabric Loader** for Minecraft 1.20.6: https:\/\/fabricmc.net\/use\/installer\/<br \/>\n2. Download **Fabric API** for 1.20.6 and drop the `.jar` into your `mods\/` folder.<br \/>\n3. Drop `customitemdata-1.0.0.jar` into the same `mods\/` folder.<br \/>\n4. Launch the game (or server). You should see `[ItemDataFramework] Initialis\u00e9 avec succ\u00e8s.` in the log.<\/p>\n<p>That&#8217;s it \u2014 the mod is now active. By itself it does nothing visible; it becomes useful when another mod calls its API, or when an OP uses the `\/itemdata` commands.<\/p>\n<p>&#8212;<\/p>\n<p>## Admin commands tutorial<\/p>\n<p>All commands require OP level 2. They operate on the item **currently held in the main hand**.<\/p>\n<p>&#8220;`text<br \/>\n\/itemdata define <param_name> <type><br \/>\n\/itemdata define <param_name> <type> <visible> <nullable> [default]<br \/>\n\/itemdata remove <param_name>\n\/itemdata set <param_name> <value><br \/>\n\/itemdata get <param_name>\n\/itemdata list<br \/>\n\/itemrename [name]<br \/>\n&#8220;`<\/p>\n<p>Example session \u2014 give a stick a &#8220;points&#8221; counter:<\/p>\n<p>&#8220;`text<br \/>\n\/itemdata define nb_point int<br \/>\n\/itemdata set nb_point 42<br \/>\n\/itemdata get nb_point \u2192 42<br \/>\n\/itemdata list \u2192 nb_point (int)<br \/>\n&#8220;`<\/p>\n<p>Schemas defined this way are saved in the world save, so they persist across restarts.<\/p>\n<p>&#8212;<\/p>\n<p>## Framework tutorial (for mod developers)<\/p>\n<p>This section walks you through using ItemDataFramework from your own Fabric mod \u2014 from zero to a working example in four steps.<\/p>\n<p>### Step 1 \u2014 Add the dependency<\/p>\n<p>Until the mod is published to a Maven repository, the simplest approach is to drop its `.jar` into your project and reference it locally.<\/p>\n<p>**Option A \u2014 local jar** (fastest):<\/p>\n<p>1. Build this mod: `.\/gradlew build` \u2014 the jar lands in `build\/libs\/customitemdata-1.0.0.jar`.<br \/>\n2. Copy that jar into a `libs\/` folder in your own mod project.<br \/>\n3. In your `build.gradle`:<\/p>\n<p>&#8220;`gradle<br \/>\ndependencies {<br \/>\n    modImplementation files(&#8220;libs\/customitemdata-1.0.0.jar&#8221;)<br \/>\n    \/\/ or: modImplementation fileTree(dir: &#8220;libs&#8221;, include: [&#8220;*.jar&#8221;])<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>4. In your `fabric.mod.json`, declare it as a dependency so it loads first:<\/p>\n<p>&#8220;`json<br \/>\n&#8220;depends&#8221;: {<br \/>\n    &#8220;fabricloader&#8221;: &#8220;>=0.18.4&#8221;,<br \/>\n    &#8220;minecraft&#8221;: &#8220;~1.20.6&#8221;,<br \/>\n    &#8220;fabric-api&#8221;: &#8220;*&#8221;,<br \/>\n    &#8220;customitemdata&#8221;: &#8220;*&#8221;<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>### Step 2 \u2014 Register a schema<\/p>\n<p>A **schema** tells the framework which parameters an item type is allowed to carry, and of what type. Register your schemas once, in your mod&#8217;s `onInitialize()`, *after* Minecraft&#8217;s registries are ready.<\/p>\n<p>&#8220;`java<br \/>\npackage com.example.mymod;<\/p>\n<p>import fr.hdi.customitemdata.schema.SchemaEntry;<br \/>\nimport fr.hdi.customitemdata.schema.SchemaManager;<br \/>\nimport net.fabricmc.api.ModInitializer;<\/p>\n<p>public class MyMod implements ModInitializer {<\/p>\n<p>    @Override<br \/>\n    public void onInitialize() {<br \/>\n        SchemaManager schemas = SchemaManager.getInstance();<\/p>\n<p>        \/\/ A simple integer counter on sticks, visible in the tooltip,<br \/>\n        \/\/ defaulting to &#8220;0&#8221; and required (not nullable).<br \/>\n        schemas.registerSchema(&#8220;minecraft:stick&#8221;,<br \/>\n            new SchemaEntry.Builder(&#8220;nb_point&#8221;, &#8220;int&#8221;)<br \/>\n                .visible(true)<br \/>\n                .nullable(false)<br \/>\n                .defaultValue(&#8220;0&#8221;)<br \/>\n                .build());<\/p>\n<p>        \/\/ A string &#8220;owner&#8221; field on diamond swords.<br \/>\n        schemas.registerSchema(&#8220;minecraft:diamond_sword&#8221;,<br \/>\n            new SchemaEntry.Builder(&#8220;owner&#8221;, &#8220;string&#8221;)<br \/>\n                .visible(true)<br \/>\n                .build());<br \/>\n    }<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>Available primitive types: `int`, `float`, `string`, `boolean`.<\/p>\n<p>> Schemas registered via the API are re-applied every time the server starts \u2014 they are **not** persisted to the world. Only schemas created via `\/itemdata define` are persisted.<\/p>\n<p>### Step 3 \u2014 Read and write with `ItemDataAPI`<\/p>\n<p>Once a schema exists, use `ItemDataAPI` anywhere you have an `ItemStack`. The API validates against the schema automatically; if validation fails, `set*` returns `false` and the stack is left unchanged.<\/p>\n<p>&#8220;`java<br \/>\nimport fr.hdi.customitemdata.api.ItemDataAPI;<br \/>\nimport net.minecraft.item.ItemStack;<\/p>\n<p>ItemStack stack = player.getMainHandStack();<\/p>\n<p>ItemDataAPI.setCustomName(stack, &#8220;My Item&#8221;);<\/p>\n<p>\/\/ Write<br \/>\nItemDataAPI.setInt(stack, &#8220;nb_point&#8221;, 42);<br \/>\nItemDataAPI.setString(stack, &#8220;owner&#8221;, &#8220;Steve&#8221;);<\/p>\n<p>\/\/ Read (with default fallback)<br \/>\nint points   = ItemDataAPI.getInt(stack, &#8220;nb_point&#8221;, 0);<br \/>\nString owner = ItemDataAPI.getString(stack, &#8220;owner&#8221;, &#8220;unknown&#8221;);<\/p>\n<p>\/\/ Read as Optional (absent if the key isn&#8217;t present)<br \/>\nItemDataAPI.getInt(stack, &#8220;nb_point&#8221;).ifPresent(value -> &#8230;);<\/p>\n<p>\/\/ Check \/ delete<br \/>\nboolean has = ItemDataAPI.has(stack, &#8220;nb_point&#8221;);<br \/>\nItemDataAPI.remove(stack, &#8220;nb_point&#8221;);<br \/>\n&#8220;`<\/p>\n<p>Under the hood, every value is serialized as a `String` inside a single `ItemDataComponent` attached to the stack. Two stacks with different data **will not merge**, because that&#8217;s how vanilla Data Components work.<\/p>\n<p>### Step 4 \u2014 Create a custom data type<\/p>\n<p>When `int` \/ `float` \/ `string` \/ `boolean` aren&#8217;t enough, implement `CustomDataType<T>` to plug in your own type. You need to provide:<\/p>\n<p>&#8211; a unique string ID (`namespace:name`),<br \/>\n&#8211; an `encode` that turns your object into a string,<br \/>\n&#8211; a `decode` that parses it back,<br \/>\n&#8211; a `Codec<T>` (used for Minecraft data integration, e.g. datapacks).<\/p>\n<p>&#8220;`java<br \/>\npackage com.example.mymod;<\/p>\n<p>import com.mojang.serialization.Codec;<br \/>\nimport com.mojang.serialization.codecs.RecordCodecBuilder;<br \/>\nimport fr.hdi.customitemdata.api.CustomDataType;<\/p>\n<p>public final class PointDataType implements CustomDataType<PointDataType.Point> {<\/p>\n<p>    public static final String TYPE_ID = &#8220;mymod:point&#8221;;<br \/>\n    public static final PointDataType INSTANCE = new PointDataType();<\/p>\n<p>    private PointDataType() {}<\/p>\n<p>    @Override public String getId() { return TYPE_ID; }<\/p>\n<p>    @Override public Codec<Point> getCodec() { return Point.CODEC; }<\/p>\n<p>    @Override<br \/>\n    public String encode(Point value) {<br \/>\n        return value.x() + &#8220;,&#8221; + value.y();<br \/>\n    }<\/p>\n<p>    @Override<br \/>\n    public Point decode(String stored) {<br \/>\n        String[] parts = stored.split(&#8220;,&#8221;, 2);<br \/>\n        return new Point(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]));<br \/>\n    }<\/p>\n<p>    \/\/ Nicer tooltip display: &#8220;(3, 7)&#8221; instead of &#8220;Point[x=3, y=7]&#8221;<br \/>\n    @Override<br \/>\n    public String display(String stored) {<br \/>\n        Point p = decode(stored);<br \/>\n        return &#8220;(&#8221; + p.x() + &#8220;, &#8221; + p.y() + &#8220;)&#8221;;<br \/>\n    }<\/p>\n<p>    public record Point(int x, int y) {<br \/>\n        public static final Codec<Point> CODEC = RecordCodecBuilder.create(i -> i.group(<br \/>\n            Codec.INT.fieldOf(&#8220;x&#8221;).forGetter(Point::x),<br \/>\n            Codec.INT.fieldOf(&#8220;y&#8221;).forGetter(Point::y)<br \/>\n        ).apply(i, Point::new));<br \/>\n    }<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>Register it **before** any schema that uses it:<\/p>\n<p>&#8220;`java<br \/>\nSchemaManager schemas = SchemaManager.getInstance();<\/p>\n<p>schemas.registerCustomType(PointDataType.INSTANCE);<\/p>\n<p>schemas.registerSchema(&#8220;minecraft:compass&#8221;,<br \/>\n    new SchemaEntry.Builder(&#8220;target&#8221;, PointDataType.TYPE_ID).build());<br \/>\n&#8220;`<\/p>\n<p>Then read\/write through the generic `get`\/`set` overloads:<\/p>\n<p>&#8220;`java<br \/>\nItemDataAPI.set(stack, &#8220;target&#8221;, new PointDataType.Point(3, 7), PointDataType.INSTANCE);<\/p>\n<p>Optional<PointDataType.Point> target =<br \/>\n    ItemDataAPI.get(stack, &#8220;target&#8221;, PointDataType.INSTANCE);<br \/>\n&#8220;`<\/p>\n<p>### Full working example<\/p>\n<p>A minimal mod that defines two parameters on a stick, sets them on the first tick, and reads them back:<\/p>\n<p>&#8220;`java<br \/>\npackage com.example.mymod;<\/p>\n<p>import fr.hdi.customitemdata.api.ItemDataAPI;<br \/>\nimport fr.hdi.customitemdata.schema.SchemaEntry;<br \/>\nimport fr.hdi.customitemdata.schema.SchemaManager;<br \/>\nimport net.fabricmc.api.ModInitializer;<br \/>\nimport net.fabricmc.fabric.api.event.player.UseItemCallback;<br \/>\nimport net.minecraft.item.ItemStack;<br \/>\nimport net.minecraft.item.Items;<br \/>\nimport net.minecraft.util.ActionResult;<br \/>\nimport net.minecraft.util.TypedActionResult;<\/p>\n<p>public class MyMod implements ModInitializer {<\/p>\n<p>    @Override<br \/>\n    public void onInitialize() {<br \/>\n        SchemaManager schemas = SchemaManager.getInstance();<\/p>\n<p>        schemas.registerSchema(&#8220;minecraft:stick&#8221;,<br \/>\n            new SchemaEntry.Builder(&#8220;nb_point&#8221;, &#8220;int&#8221;)<br \/>\n                .nullable(false).defaultValue(&#8220;0&#8221;).build());<\/p>\n<p>        schemas.registerSchema(&#8220;minecraft:stick&#8221;,<br \/>\n            new SchemaEntry.Builder(&#8220;owner&#8221;, &#8220;string&#8221;).build());<\/p>\n<p>        \/\/ Right-click a stick to increment its counter.<br \/>\n        UseItemCallback.EVENT.register((player, world, hand) -> {<br \/>\n            ItemStack stack = player.getStackInHand(hand);<br \/>\n            if (stack.getItem() != Items.STICK) {<br \/>\n                return TypedActionResult.pass(stack);<br \/>\n            }<\/p>\n<p>            int current = ItemDataAPI.getInt(stack, &#8220;nb_point&#8221;, 0);<br \/>\n            ItemDataAPI.setInt(stack, &#8220;nb_point&#8221;, current + 1);<br \/>\n            ItemDataAPI.setString(stack, &#8220;owner&#8221;, player.getName().getString());<\/p>\n<p>            player.sendMessage(<br \/>\n                net.minecraft.text.Text.literal(&#8220;Points: &#8221; + (current + 1)), true);<br \/>\n            return TypedActionResult.success(stack);<br \/>\n        });<br \/>\n    }<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## Reference<\/p>\n<p>### `ItemDataAPI` (static methods)<\/p>\n<p>| Method                                                     | Purpose                                  |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|<br \/>\n| `getRaw(stack, key)` \/ `setRaw(stack, key, value)`         | Raw string access                        |<br \/>\n| `getInt` \/ `setInt`                                        | Integer values                           |<br \/>\n| `getFloat` \/ `setFloat`                                    | Float values                             |<br \/>\n| `getString` \/ `setString`                                  | String values                            |<br \/>\n| `getBoolean` \/ `setBoolean`                                | Boolean values                           |<br \/>\n| `get(stack, key, customType)` \/ `set(stack, key, v, t)`    | Custom typed values                      |<br \/>\n| `has(stack, key)` \/ `hasData(stack)`                       | Presence checks                          |<br \/>\n| `remove(stack, key)`                                       | Delete a key (removes component if empty)|<br \/>\n| `getComponent(stack)`                                      | Access the raw `ItemDataComponent`       |<\/p>\n<p>### `SchemaEntry.Builder`<\/p>\n<p>| Method               | Default | Description                                    |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|<br \/>\n| `visible(boolean)`   | `true`  | Show in item tooltip                           |<br \/>\n| `nullable(boolean)`  | `true`  | Allow the parameter to be absent               |<br \/>\n| `defaultValue(String)`| `null` | Default encoded value (e.g. `&#8221;0&#8243;`, `&#8221;false&#8221;`)  |<br \/>\n| `fromCommand(boolean)`| `false`| Mark as command-sourced (triggers persistence) |<\/p>\n<p>### `SchemaManager` (singleton via `getInstance()`)<\/p>\n<p>| Method                                           | Purpose                              |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|<br \/>\n| `registerSchema(itemId, entry)`                  | API-side schema registration         |<br \/>\n| `registerCustomType(customDataType)`             | Register a `CustomDataType<T>`       |<br \/>\n| `getEntry(itemId, paramName)`                    | Look up a single entry               |<br \/>\n| `getEntries(itemId)`                             | Look up all entries for an item      |<br \/>\n| `hasSchema(itemId)`                              | Does the item have any schema?       |<br \/>\n| `isKnownType(typeId)`                            | Is the type ID primitive or custom?  |<br \/>\n| `validateValue(entry, value)`                    | Validate a string against an entry   |<\/p>\n<p>&#8212;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A useful mod for Minecraft servers or framework for mod developers to store easily data on item.<\/p>\n","protected":false},"featured_media":52799,"template":"","meta":{"_minecraft_slug":"custom-item-data","_minecraft_project_id":"ErlykZCV","_minecraft_author":"Hdi","_minecraft_license":"LicenseRef-All-Rights-Reserved","_minecraft_downloads":54,"_minecraft_follows":1,"_minecraft_client_side":"required","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"custom-item-data.zip","_minecraft_size_bytes":291395,"_minecraft_version_count":7,"_minecraft_updated_at":"2026-05-16T18:07:12.308289Z","_minecraft_date_created":"2026-04-25T15:15:24.193170Z","_minecraft_date_modified":"2026-05-12T18:23:43.621460Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/custom-item-data","_minecraft_icon_attachment_id":52799,"_minecraft_imported_at":"2026-06-02T22:06:00+00:00","_minecraft_import_hash":"5c723a5d52e912ca20ecc4ac0d8b2f09","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[97,873,98,91,92],"mod_loader":[99,100],"minecraft_version":[102],"class_list":["post-52798","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-fabric","mod_category-library","mod_category-quilt","mod_category-storage","mod_category-utility","mod_loader-fabric","mod_loader-quilt","minecraft_version-1-20-6"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Custom Item Data - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Custom Item Data - Minecraft\" \/>\n<meta property=\"og:description\" content=\"A useful mod for Minecraft servers or framework for mod developers to store easily data on item.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/custom-item-data\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/custom-item-data\\\/\",\"name\":\"Custom Item Data - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/custom-item-data\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/custom-item-data\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/custom-item-data-icon-5ab382bc7a7d2f885764878a8a18e1229b0d629e.png\",\"datePublished\":\"2026-06-02T22:05:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/custom-item-data\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/custom-item-data\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/custom-item-data\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/custom-item-data-icon-5ab382bc7a7d2f885764878a8a18e1229b0d629e.png\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/custom-item-data-icon-5ab382bc7a7d2f885764878a8a18e1229b0d629e.png\",\"width\":16,\"height\":16},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/custom-item-data\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Custom Item Data\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Custom Item Data - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/","og_locale":"en_US","og_type":"article","og_title":"Custom Item Data - Minecraft","og_description":"A useful mod for Minecraft servers or framework for mod developers to store easily data on item.","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/","name":"Custom Item Data - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/custom-item-data-icon-5ab382bc7a7d2f885764878a8a18e1229b0d629e.png","datePublished":"2026-06-02T22:05:59+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/custom-item-data-icon-5ab382bc7a7d2f885764878a8a18e1229b0d629e.png","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/custom-item-data-icon-5ab382bc7a7d2f885764878a8a18e1229b0d629e.png","width":16,"height":16},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/custom-item-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"Custom Item Data"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/52798","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/52799"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=52798"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=52798"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=52798"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=52798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}