NBT Improvements

This commit is contained in:
rockyhawk64 2024-06-16 21:36:21 +10:00
parent 843ba8b393
commit a8663e41a7
4 changed files with 124 additions and 54 deletions

View File

@ -126,7 +126,7 @@
<dependency> <dependency>
<groupId>de.tr7zw</groupId> <groupId>de.tr7zw</groupId>
<artifactId>item-nbt-api</artifactId> <artifactId>item-nbt-api</artifactId>
<version>2.12.4-SNAPSHOT</version> <version>2.13.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -99,7 +99,7 @@ public class Panel{
} }
try { try {
//add NBT to item and return the ItemStack //add NBT to item and return the ItemStack
return plugin.nbt.setNBT(s, "CommandPanelsHotbar", "string", panelName + ":" + slot); return plugin.nbt.setNBT(s, "CommandPanelsHotbar", "string_" + panelName + ":" + slot);
}catch(Exception e) { }catch(Exception e) {
//return air if null //return air if null
return new ItemStack(Material.AIR); return new ItemStack(Material.AIR);

View File

@ -191,10 +191,12 @@ public class ItemCreation {
} }
if(itemSection.contains("nbt")){ if(itemSection.contains("nbt")){
plugin.nbt.applyNBTRecursively("", itemSection.getConfigurationSection("nbt"), s, p, panel, position); //ItemStack item, ConfigurationSection section, Player player, Panel panel, PanelPosition position
plugin.nbt.applyNBTRecursively(s, itemSection.getConfigurationSection("nbt"), p, panel, position);
//plugin.nbt.applyNBTRecursively("", itemSection.getConfigurationSection("nbt"), s, p, panel, position);
} }
if(addNBT){ if(addNBT){
plugin.nbt.setNBT(s, "CommandPanelsItem","boolean", "true"); plugin.nbt.setNBT(s, "CommandPanelsItem","boolean_" + "true");
} }
if (itemSection.contains("enchanted")) { if (itemSection.contains("enchanted")) {

View File

@ -1,9 +1,11 @@
package me.rockyhawk.commandpanels.ioclasses.nbt; package me.rockyhawk.commandpanels.ioclasses.nbt;
import de.tr7zw.changeme.nbtapi.NBTCompound;
import de.tr7zw.changeme.nbtapi.NBTItem; import de.tr7zw.changeme.nbtapi.NBTItem;
import me.rockyhawk.commandpanels.CommandPanels; import me.rockyhawk.commandpanels.CommandPanels;
import me.rockyhawk.commandpanels.api.Panel; import me.rockyhawk.commandpanels.api.Panel;
import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition; import me.rockyhawk.commandpanels.openpanelsmanager.PanelPosition;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -21,45 +23,6 @@ public class NBTManager {
return nbtitem1.equals(nbtitem2); return nbtitem1.equals(nbtitem2);
} }
public ItemStack setNBT(ItemStack item, String key, String type, String value) {
type = type.toLowerCase();
if (item == null) {
throw new IllegalArgumentException("ItemStack cannot be null");
}
NBTItem nbtItem = new NBTItem(item);
switch (type.toLowerCase()) {
case "byte":
nbtItem.setByte(key, Byte.valueOf(value));
break;
case "boolean":
nbtItem.setBoolean(key, Boolean.valueOf(value));
break;
case "short":
nbtItem.setShort(key, Short.valueOf(value));
break;
case "integer":
nbtItem.setInteger(key, Integer.valueOf(value));
break;
case "long":
nbtItem.setLong(key, Long.valueOf(value));
break;
case "float":
nbtItem.setFloat(key, Float.valueOf(value));
break;
case "double":
nbtItem.setDouble(key, Double.valueOf(value));
break;
case "string":
nbtItem.setString(key, value);
break;
default:
throw new IllegalArgumentException("Unsupported NBT type: " + type);
}
item.setItemMeta(nbtItem.getItem().getItemMeta());
return item;
}
public Object getNBT(ItemStack item, String key, String type) { public Object getNBT(ItemStack item, String key, String type) {
type = type.toLowerCase(); type = type.toLowerCase();
NBTItem nbtItem = new NBTItem(item); NBTItem nbtItem = new NBTItem(item);
@ -92,20 +55,125 @@ public class NBTManager {
//nbt will be assigned with the value "string_value_1 //nbt will be assigned with the value "string_value_1
//which uses the type "String" and value "value_1" //which uses the type "String" and value "value_1"
public void applyNBTRecursively(String path, ConfigurationSection section, ItemStack s, Player p, Panel panel, PanelPosition position) { // Method to apply NBT recursively
for (String key : section.getKeys(true)) { public ItemStack setNBT(ItemStack item, String key, String value) {
String fullPath = path.isEmpty() ? key : path + "." + key; if (item == null || item.getType() == Material.AIR) {
return item;
}
NBTItem nbtItem = new NBTItem(item);
setNBTDirectlyOnItem(nbtItem, key, value);
item.setItemMeta(nbtItem.getItem().getItemMeta());
return item;
}
// Method to apply NBT recursively
public void applyNBTRecursively(ItemStack item, ConfigurationSection section, Player player, Panel panel, PanelPosition position) {
NBTItem nbtItem = new NBTItem(item);
// Iterate over each key in the root of the ConfigurationSection
for (String key : section.getKeys(false)) {
// Check if the key represents a ConfigurationSection
if (section.isConfigurationSection(key)) { if (section.isConfigurationSection(key)) {
// Recursive call for nested sections // Create a compound for each ConfigurationSection
applyNBTRecursively(fullPath, section.getConfigurationSection(key), s, p, panel, position); NBTCompound compound = nbtItem.addCompound(key);
convertSectionToNBT(compound, section.getConfigurationSection(key), player, panel, position);
} else { } else {
// Set the NBT tag at this level // Handle non-section values directly on the NBTItem if necessary
String wholeValue = plugin.tex.attachPlaceholders(panel, position, p, section.getString(key)); String value = plugin.tex.attachPlaceholders(panel, position, player, section.getString(key));
int firstUnderscore = wholeValue.indexOf("_"); setNBTDirectlyOnItem(nbtItem, key, value);
String type = wholeValue.substring(0, firstUnderscore); }
String value = wholeValue.substring(firstUnderscore + 1); }
s = plugin.nbt.setNBT(s, fullPath, type, value); item.setItemMeta(nbtItem.getItem().getItemMeta());
}
// Convert ConfigurationSection to NBTCompound recursively
private void convertSectionToNBT(NBTCompound compound, ConfigurationSection section, Player player, Panel panel, PanelPosition position) {
for (String key : section.getKeys(false)) {
if (section.isConfigurationSection(key)) {
// Recursively convert sub-sections to their own compounds
NBTCompound subCompound = compound.addCompound(key);
convertSectionToNBT(subCompound, section.getConfigurationSection(key), player, panel, position);
} else {
// Handle scalar values within each compound
String value = plugin.tex.attachPlaceholders(panel, position, player, section.getString(key));
setNBTOnCompound(compound, key, value);
} }
} }
} }
private void setNBTDirectlyOnItem(NBTItem nbtItem, String key, String value) {
int underscoreIndex = value.indexOf("_");
if (underscoreIndex == -1) return; // Skip if format is invalid
String type = value.substring(0, underscoreIndex);
String val = value.substring(underscoreIndex + 1);
switch (type.toLowerCase()) {
case "byte":
nbtItem.setByte(key, Byte.parseByte(val));
break;
case "boolean":
nbtItem.setBoolean(key, Boolean.parseBoolean(val));
break;
case "short":
nbtItem.setShort(key, Short.parseShort(val));
break;
case "integer":
nbtItem.setInteger(key, Integer.parseInt(val));
break;
case "long":
nbtItem.setLong(key, Long.parseLong(val));
break;
case "float":
nbtItem.setFloat(key, Float.parseFloat(val));
break;
case "double":
nbtItem.setDouble(key, Double.parseDouble(val));
break;
case "string":
nbtItem.setString(key, val);
break;
default:
throw new IllegalArgumentException("Unsupported NBT type: " + type);
}
}
// Set typed value on an NBTCompound
private void setNBTOnCompound(NBTCompound compound, String key, String value) {
int underscoreIndex = value.indexOf("_");
if (underscoreIndex == -1) return; // Invalid format, skip
String type = value.substring(0, underscoreIndex);
String val = value.substring(underscoreIndex + 1);
switch (type.toLowerCase()) {
case "byte":
compound.setByte(key, Byte.parseByte(val));
break;
case "boolean":
compound.setBoolean(key, Boolean.parseBoolean(val));
break;
case "short":
compound.setShort(key, Short.parseShort(val));
break;
case "integer":
compound.setInteger(key, Integer.parseInt(val));
break;
case "long":
compound.setLong(key, Long.parseLong(val));
break;
case "float":
compound.setFloat(key, Float.parseFloat(val));
break;
case "double":
compound.setDouble(key, Double.parseDouble(val));
break;
case "string":
compound.setString(key, val);
break;
default:
throw new IllegalArgumentException("Unsupported NBT type: " + type);
}
}
} }