From ac5ed15e09d232b49ea4c09c40cfb774034da6fa Mon Sep 17 00:00:00 2001 From: Xanadu13 Date: Mon, 18 Mar 2024 16:30:06 +0800 Subject: [PATCH] add data_type:simple --- .../enderdragon/manager/ItemManager.java | 420 ++++++++++-------- 1 file changed, 243 insertions(+), 177 deletions(-) diff --git a/src/main/java/pers/xanadu/enderdragon/manager/ItemManager.java b/src/main/java/pers/xanadu/enderdragon/manager/ItemManager.java index 02f1f1c..e49325f 100644 --- a/src/main/java/pers/xanadu/enderdragon/manager/ItemManager.java +++ b/src/main/java/pers/xanadu/enderdragon/manager/ItemManager.java @@ -20,10 +20,11 @@ import pers.xanadu.enderdragon.reward.Chance; import pers.xanadu.enderdragon.util.Version; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; public class ItemManager { @Getter - private static boolean legacy = false; + private static final AtomicBoolean legacy = new AtomicBoolean(false); public static String write(Reward reward){ Chance chance = reward.getChance(); return write(reward.getItem(),chance.getValue(),chance.getStr(),reward.getName()); @@ -51,104 +52,12 @@ public class ItemManager { } case "_advanced" : { section.set("data_type","advanced"); - ConfigurationSection section_data = section.createSection("data"); - //type - String type = item.getType().name(); - section_data.set("type",type); - if("AIR".equals(type)) break; - //amount - int amount = item.getAmount(); - section_data.set("amount",amount); - //damage - int damage = item.getDurability(); - if(damage != 0) section_data.set("damage",damage); - ItemMeta meta = item.getItemMeta(); - if(meta == null) break; - //DisplayName - String display_name = meta.getDisplayName(); - if(!"".equals(display_name)) section_data.set("display_name",display_name); - //LocalizedName - if(meta.hasLocalizedName()){ - section_data.set("localized_name",meta.getLocalizedName()); - } - //lore - List lores = meta.getLore(); - if(lores != null) section_data.set("lore",lores); - //Enchantments - if(meta.hasEnchants()){ - ConfigurationSection enchants = section_data.createSection("enchants"); - Map mp = meta.getEnchants(); - mp.forEach((enchantment,level) -> enchants.set(enchantment.getName(),level)); - } - if(Version.mcMainVersion>=14 || "v1_13_R2".equals(Version.getVersion())){ - //AttributeModifiers - if(meta.hasAttributeModifiers()){ - ConfigurationSection attributes = section_data.createSection("AttributeModifiers"); - meta.getAttributeModifiers().forEach((attribute,modifier)->{ - attributes.set(attribute.name(),modifier); - }); - } - } - if(Version.mcMainVersion>=14){ - //CustomModelData - if(meta.hasCustomModelData()) { - section_data.set("CustomModelData",meta.getCustomModelData());//int - } - //PersistentDataContainer - PersistentDataContainer dataContainer = meta.getPersistentDataContainer(); - if(!dataContainer.isEmpty()){ - ConfigurationSection dataContainer_section = section_data.createSection("PersistentDataContainer"); - String cpd = EnderDragon.getInstance().getNMSManager().PDCtoString(dataContainer); - dataContainer_section.set("data_type","nbt"); - dataContainer_section.set("data",cpd); - } - } - //RepairCost - if(meta instanceof Repairable){ - Repairable repairable = (Repairable) meta; - section_data.set("RepairCost",repairable.getRepairCost()); - } - //ItemFlags - Set flags = meta.getItemFlags(); - if(!flags.isEmpty()){ - List list = new ArrayList<>(); - flags.forEach(flag ->{ - list.add(flag.name()); - }); - section_data.set("ItemFlags",list); - } - //Unbreakable - section_data.set("unbreakable",meta.isUnbreakable()); - //internal - Object cpd = EnderDragon.getInstance().getNMSManager().getCPD(item); - Map mp = EnderDragon.getInstance().getNMSManager().cpdToMap(cpd); - if(mp.containsKey("tag")){ - cpd = mp.get("tag"); - mp = EnderDragon.getInstance().getNMSManager().cpdToMap(cpd); - mp.remove("Damage"); - if(mp.containsKey("display")){ - Object display = mp.get("display"); - Map display_mp = EnderDragon.getInstance().getNMSManager().cpdToMap(display); - display_mp.remove("Name"); - display_mp.remove("LocName"); - display_mp.remove("Lore"); - Object new_display = EnderDragon.getInstance().getNMSManager().getNBTTagCompound(display_mp); - mp.put("display",new_display); - } - //mp.remove("display");//Name, LocName, Lore, color - mp.remove("Enchantments"); - mp.remove("AttributeModifiers"); - mp.remove("CustomModelData"); - mp.remove("PublicBukkitValues");//PersistentDataContainer - mp.remove("RepairCost"); - mp.remove("HideFlags");//ItemFlags - mp.remove("Unbreakable"); - //CanDestroy, CanPlaceOn - Object new_cpd = EnderDragon.getInstance().getNMSManager().getNBTTagCompound(mp); - ConfigurationSection internal = section_data.createSection("internal"); - internal.set("data_type","nbt"); - internal.set("data",new_cpd.toString()); - } + save2section_adv(item,section); + break; + } + case "simple": { + section.set("data_type","simple"); + save2section_simple(item,section); break; } case "nbt": @@ -175,11 +84,11 @@ public class ItemManager { //data_type may be null ItemStack item; if("nbt".equals(data_type)) { - legacy = true; + legacy.compareAndSet(false,true); item = readFromNBT(section0,"data"); } else if("advanced".equals(data_type)) { - legacy = true; + legacy.compareAndSet(false,true); item = readFromAdvData(section0, "data"); } else { @@ -321,12 +230,244 @@ public class ItemManager { if (nbt == null) return new ItemStack(Material.AIR); return section.getItemStack(path); } + public static ItemStack readFromSimple(ConfigurationSection section, String path){ + if (section == null) return new ItemStack(Material.AIR); + section = section.getConfigurationSection(path); + if(section == null) return new ItemStack(Material.AIR); + //material + String type = section.getString("material"); + if (type==null || "AIR".equals(type)) return new ItemStack(Material.AIR); + Material material = Material.getMaterial(type); + if (material == null) return new ItemStack(Material.AIR); + //amount + int amount = section.getInt("amount",1); + ItemStack itemStack = new ItemStack(material,amount); + ItemMeta meta = itemStack.getItemMeta(); + assert meta != null; + //display_name + String display_name = section.getString("display_name"); + if (display_name != null) meta.setDisplayName(display_name); + //loc_name + if(section.contains("loc_name")){ + String LocalizedName = section.getString("loc_name"); + if(LocalizedName != null) meta.setLocalizedName(LocalizedName); + } + //lore + if(section.contains("lore")){ + List lore = section.getStringList("lore"); + if(!lore.isEmpty()) meta.setLore(lore); + } + //enchants + if(section.contains("enchants")){ + ConfigurationSection enchants = section.getConfigurationSection("enchants"); + if(enchants != null){ + enchants.getKeys(false).forEach(key->{ + Enchantment enchantment = Enchantment.getByName(key); + int level = enchants.getInt(key); + if(enchantment != null && level>0){ + meta.addEnchant(enchantment,level,true); + } + }); + } + } + //CustomModelData + if(Version.mcMainVersion>=14 && section.contains("CustomModelData")){ + int CustomModelData = section.getInt("CustomModelData"); + meta.setCustomModelData(CustomModelData); + } + //RepairCost + if(section.contains("RepairCost")){ + int cost = section.getInt("RepairCost"); + if(meta instanceof Repairable){ + ((Repairable)meta).setRepairCost(cost); + } + } + //Unbreakable + if(section.contains("unbreakable")) + meta.setUnbreakable(section.getBoolean("unbreakable")); + //ItemFlags + if(section.contains("ItemFlags")){ + List names = section.getStringList("ItemFlags"); + names.forEach(name->meta.addItemFlags(ItemFlag.valueOf(name))); + } + itemStack.setItemMeta(meta); + //damage + if (section.contains("damage")){ + int damage = section.getInt("damage"); + // 在itemStack.setItemMeta(meta)之后,直接设置到itemStack上 + itemStack.setDurability((short) damage); + } + return itemStack; + } public static ItemStack readFromString(String str){ YamlConfiguration yml = new YamlConfiguration(); if(Config.advanced_setting_backslash_split_reward) yml.options().pathSeparator('\\'); yml.set("test",str); return yml.getItemStack("test"); } + public static void save2section_simple(ItemStack itemStack, ConfigurationSection section){ + save2section_simple(itemStack,section,"data"); + } + public static void save2section_simple(ItemStack itemStack, ConfigurationSection section,String path){ + ConfigurationSection res = section.createSection(path); + //material + String material = itemStack.getType().name(); + res.set("material",material); + if ("AIR".equals(material)) return; + //amount + int amount = itemStack.getAmount(); + res.set("amount",amount); + //damage + int damage = itemStack.getDurability(); + if (damage != 0) res.set("damage",damage); + ItemMeta meta = itemStack.getItemMeta(); + if (meta == null) return; + //display_name + if (meta.hasDisplayName()){ + String display_name = meta.getDisplayName(); + res.set("display_name",display_name); + } + //loc_name + if (meta.hasLocalizedName()){ + String loc_name = meta.getLocalizedName(); + res.set("loc_name",loc_name); + } + //lore + if (meta.hasLore()){ + List lore = meta.getLore(); + res.set("lore",lore); + } + //enchants + if (meta.hasEnchants()){ + ConfigurationSection enchants = res.createSection("enchants"); + Map mp = meta.getEnchants(); + mp.forEach((enchantment, level) -> enchants.set(enchantment.getName(),level)); + } + //CustomModelData + if(Version.mcMainVersion>=14 && meta.hasCustomModelData()){ + res.set("CustomModelData",meta.getCustomModelData());//int + } + //RepairCost + if(meta instanceof Repairable){ + Repairable repairable = (Repairable) meta; + int RepairCost = repairable.getRepairCost(); + if (RepairCost != 0) res.set("RepairCost",RepairCost); + } + //Unbreakable + if (meta.isUnbreakable()) { + res.set("unbreakable",true); + } + //ItemFlags + Set flags = meta.getItemFlags(); + if(!flags.isEmpty()){ + List list = new ArrayList<>(); + flags.forEach(flag ->{ + list.add(flag.name()); + }); + res.set("ItemFlags",list); + } + //cannot handle nbt currently + } + public static void save2section_adv(ItemStack item, ConfigurationSection section){ + ConfigurationSection section_data = section.createSection("data"); + //type + String type = item.getType().name(); + section_data.set("type",type); + if("AIR".equals(type)) return; + //amount + int amount = item.getAmount(); + section_data.set("amount",amount); + //damage + int damage = item.getDurability(); + if(damage != 0) section_data.set("damage",damage); + ItemMeta meta = item.getItemMeta(); + if(meta == null) return; + //DisplayName + String display_name = meta.getDisplayName(); + if(!"".equals(display_name)) section_data.set("display_name",display_name); + //LocalizedName + if(meta.hasLocalizedName()){ + section_data.set("localized_name",meta.getLocalizedName()); + } + //lore + List lores = meta.getLore(); + if(lores != null) section_data.set("lore",lores); + //Enchantments + if(meta.hasEnchants()){ + ConfigurationSection enchants = section_data.createSection("enchants"); + Map mp = meta.getEnchants(); + mp.forEach((enchantment,level) -> enchants.set(enchantment.getName(),level)); + } + if(Version.mcMainVersion>=14 || "v1_13_R2".equals(Version.getVersion())){ + //AttributeModifiers + if(meta.hasAttributeModifiers()){ + ConfigurationSection attributes = section_data.createSection("AttributeModifiers"); + meta.getAttributeModifiers().forEach((attribute,modifier)->{ + attributes.set(attribute.name(),modifier); + }); + } + } + if(Version.mcMainVersion>=14){ + //CustomModelData + if(meta.hasCustomModelData()) { + section_data.set("CustomModelData",meta.getCustomModelData());//int + } + //PersistentDataContainer + PersistentDataContainer dataContainer = meta.getPersistentDataContainer(); + if(!dataContainer.isEmpty()){ + ConfigurationSection dataContainer_section = section_data.createSection("PersistentDataContainer"); + String cpd = EnderDragon.getInstance().getNMSManager().PDCtoString(dataContainer); + dataContainer_section.set("data_type","nbt"); + dataContainer_section.set("data",cpd); + } + } + //RepairCost + if(meta instanceof Repairable){ + Repairable repairable = (Repairable) meta; + section_data.set("RepairCost",repairable.getRepairCost()); + } + //ItemFlags + Set flags = meta.getItemFlags(); + if(!flags.isEmpty()){ + List list = new ArrayList<>(); + flags.forEach(flag ->{ + list.add(flag.name()); + }); + section_data.set("ItemFlags",list); + } + //Unbreakable + section_data.set("unbreakable",meta.isUnbreakable()); + //internal + Object cpd = EnderDragon.getInstance().getNMSManager().getCPD(item); + Map mp = EnderDragon.getInstance().getNMSManager().cpdToMap(cpd); + if(mp.containsKey("tag")){ + cpd = mp.get("tag"); + mp = EnderDragon.getInstance().getNMSManager().cpdToMap(cpd); + mp.remove("Damage"); + if(mp.containsKey("display")){ + Object display = mp.get("display"); + Map display_mp = EnderDragon.getInstance().getNMSManager().cpdToMap(display); + display_mp.remove("Name"); + display_mp.remove("LocName"); + display_mp.remove("Lore"); + Object new_display = EnderDragon.getInstance().getNMSManager().getNBTTagCompound(display_mp); + mp.put("display",new_display); + } + //mp.remove("display");//Name, LocName, Lore, color + mp.remove("Enchantments"); + mp.remove("AttributeModifiers"); + mp.remove("CustomModelData"); + mp.remove("PublicBukkitValues");//PersistentDataContainer + mp.remove("RepairCost"); + mp.remove("HideFlags");//ItemFlags + mp.remove("Unbreakable"); + //CanDestroy, CanPlaceOn + Object new_cpd = EnderDragon.getInstance().getNMSManager().getNBTTagCompound(mp); + ConfigurationSection internal = section_data.createSection("internal"); + internal.set("data_type","nbt"); + internal.set("data",new_cpd.toString()); + } + } public static void addLoreFront(ItemStack item, String lore){ ItemMeta meta = item.getItemMeta(); if(meta != null) { @@ -341,7 +482,7 @@ public class ItemManager { item.setItemMeta(meta); } } - public static void addLoreBack(ItemStack item, String lore){ + public static void addLoreTail(ItemStack item, String lore){ ItemMeta meta = item.getItemMeta(); if(meta != null) { List lores = meta.getLore(); @@ -360,81 +501,6 @@ public class ItemManager { if(item.getType() == Material.AIR) return true; return false; } - private static void saveUnhandledTags(ConfigurationSection section, Map mp){ - mp.forEach((k,v)->{ - //Bukkit.broadcastMessage(k+": "+v.getClass().toString()); - if(v instanceof Map){ - saveUnhandledTags(section.createSection(k), (Map) v); - } - else section.set(k,v.toString()); - }); - } -/** - private static void saveUnhandledTags(ConfigurationSection section, Map mp){ - mp.forEach((k,v)->{ - Object obj = v; - //Bukkit.broadcastMessage(obj.getClass().toString()); - try{ - obj = EnderDragon.getInstance().getNMSItemManager().parseNBT(v); - }catch (Throwable ignored){ - - } - if(obj instanceof Map){ - saveUnhandledTags(section.createSection(k), (Map) obj); - } - else section.set(k,obj); - }); - }**/ - private static Map getUnhandledTags(ConfigurationSection section){ - Map res = new HashMap<>(); - section.getKeys(false).forEach(key->{ - Object obj = section.get(key); - if(obj instanceof ConfigurationSection){ - ConfigurationSection subSection = section.getConfigurationSection(key); - if(subSection != null){ - obj = getUnhandledTags(subSection); -// Object mp = getUnhandledTags(subSection); -// Bukkit.getLogger().info(mp.getClass().toString()); -// try{ -// obj = EnderDragon.getInstance().getNMSItemManager().getNBTBase(mp); -// }catch (Throwable throwable){ -// -// } - } - } - else obj = EnderDragon.getInstance().getNMSManager().getCPD((String) obj); - //else obj = EnderDragon.getInstance().getNMSItemManager().readAsNBTBase((String) obj); - res.put(key,obj); - }); - return res; - } - -// private static Object dfs(ConfigurationSection section){ -// section.getKeys(false).forEach(key->{ -// Object obj = section.get(key); -// if(obj instanceof ConfigurationSection){ -// ConfigurationSection subSection = section.getConfigurationSection(key); -// if(subSection != null) obj = dfs(subSection); -// } -// else obj = EnderDragon.getInstance().getNMSItemManager().readAsNBTBase((String) obj); -// -// }); -// return -// } - -// //internal -// Map mp = EnderDragon.getInstance().getNMSManager().getUnhandledTags(meta); -// if(mp != null){ -// ConfigurationSection internal = section_data.createSection("internal"); -// mp.forEach((k,v)->{ -// Object obj = EnderDragon.getInstance().getNMSItemManager().parseNBT(v); -// -// if(obj instanceof Map) obj = obj.toString(); -// else if(obj instanceof List) obj = obj.toString(); -// -// internal.set(k,obj); -// }); -// }