I read this post here while I was trying to figure out how to detect whether an item was custom and set/get values from it. Some code was provided but it was all in NMS. I have successfully made a reflection version which you can implement very easily into your plugins. Now the need for hidden lore is gone!! This now works with ANY version(Maybe except for 1.13 )! The updated version also supports complex NBT manipulation with ITEMS, TILES and ENTITIES!!! Here are two pictures of an item, one with an nbt tag, and one without. The only way to see the amount of NBT tag info is using debug mode, but if it is turned off, both items look exactly the same. No NBT: Yes NBT: The new version also supports more complex NBT editing! Shout out to @kowagatte for his excellent tutorial on how to manipulate NBT tags! Here is a quick demo on how to use the updated version: Code (Java): // Here we have an ordinary ItemStack ItemStack item = new ItemStack( Material.GOLD_SWORD ); // What's this!?! UNBREAKABILITY?!?! GREAT! item = NBTEditor.setItemTag( item, ( byte ) 1, "Unbreakable" ); item = NBTEditor.setItemTag( item, ( short ) 1, "ench", null, "id" ); // We can even add enchants to this thing! // Here are the arguments explained: // '( short ) 1' - The data value to set; Be sure you cast it to the appropriate type! // '"ench"' - The TagList that contains all the enchantments of an item // 'null' - This specifies we want to create a new list element, as opposed to editing an existing one // 'id' - This specifies the tag we want to edit, namely, the id of the enchantment item = NBTEditor.setItemTag( item, ( short ) 20, "ench", 0, "lvl" ); // Now, to edit it, we provide the same arguments, except we change the 'null' to a 0, to specify the 1st element // We also change 'id' to 'lvl' because we want to set the level of the enchantment // Here is a more thorough chunk of code to set the item to do 20 damage when in the mainhand item = NBTEditor.setItemTag( item, "generic.attackDamage", "AttributeModifiers", null, "AttributeName" ); item = NBTEditor.setItemTag( item, "generic.attackDamage", "AttributeModifiers", 0, "Name" ); item = NBTEditor.setItemTag( item, "mainhand", "AttributeModifiers", 0, "Slot" ); item = NBTEditor.setItemTag( item, ( double ) 20, "AttributeModifiers", 0, "Amount" ); item = NBTEditor.setItemTag( item, 0, "AttributeModifiers", 0, "Operation" ); item = NBTEditor.setItemTag( item, ( long ) 894654, "AttributeModifiers", 0, "UUIDLeast" ); item = NBTEditor.setItemTag( item, ( long ) 2872, "AttributeModifiers", 0, "UUIDMost" ); // Gettings the values still works the same way Object value = NBTEditor.getItemTag( item, "AttributeModifiers", 0, "Amount" ); // value = 20 for the 20 damage it does // You can also use NBTEditor.setEntityTag() and ItemUtil.getEntityTag() // If you find any of this confusing, remember! It's completely optional as this version still // supports setting and getting simple tags! The only difference is that the arguments are swapped item = NBTEditor.setItemTag( item, "HELLO THIS IS THE VALUE NOW!", "A message" ); Object message = NBTEditor.getItemTag( item, "A message" ); // message = "HELLO THIS IS THE VALUE NOW!" // You can now also get nested hashmaps that contain all the tags and lists by not providing any arguments when using getItemTag(); You can find the Item NBT data structure here. And here is the updated NBTEditor class for you to use! Perfect for custom items! Unfortunately, the final version is too large to fit on this post. Get the newest version here. The new version supports the following( basically all the data types available when working with NBT ): Strings Ints Longs Floats Shorts Bytes Byte arrays Int arrays Feel free to message me if you need any help understanding how to use this resource . If you encounter any errors or bugs, tell me so I can fix it as quickly as possible! If you would also like additional features added, tell me too so I can add them!