diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/ItemTier.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/ItemTier.java index 93941353..e1551dc2 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/ItemTier.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/ItemTier.java @@ -18,7 +18,9 @@ import java.util.List; import java.util.Random; public class ItemTier { - private final String name, id; + private final String id; + private final String name; + private final String unparsedName; private final UnidentificationInfo unidentificationInfo; // Deconstruction @@ -44,10 +46,10 @@ public class ItemTier { * @param config Configuration section to get all values from */ public ItemTier(@NotNull ConfigurationSection config) { - // The name and ID, crucial parts. - id = config.getName().toUpperCase().replace("-", "_"); - name = MythicLib.plugin.parseColors(config.getString("name")); + this.id = config.getName().toUpperCase().replace("-", "_"); + this.unparsedName = config.getString("name"); + this.name = MythicLib.plugin.parseColors(unparsedName); // Deconstruct and Unidentification deconstructTable = config.contains("deconstruct-item") ? new DropTable(config.getConfigurationSection("deconstruct-item")) : null; @@ -89,8 +91,8 @@ public class ItemTier { /** * @return Reads the deconstruction drop table. This may return a list - * containing multiple items and they should all be added to the - * player's inventory + * containing multiple items and they should all be added to the + * player's inventory */ public List getDeconstructedLoot(@NotNull PlayerData player) { //noinspection ConstantConditions @@ -119,7 +121,7 @@ public class ItemTier { /** * @return If the item tier has a modifier capacity ie if this tier let - * generated items have modifiers + * generated items have modifiers */ public boolean hasCapacity() { return capacity != null; @@ -127,8 +129,8 @@ public class ItemTier { /** * @return The formula for modifier capacity which can be then rolled to - * generate a random amount of modifier capacity when generating a - * random item + * generate a random amount of modifier capacity when generating a + * random item */ @Nullable public NumericStatFormula getModifierCapacity() { @@ -140,6 +142,10 @@ public class ItemTier { return unidentificationInfo; } + public @NotNull String getUnparsedName() { + return unparsedName; + } + public static class UnidentificationInfo { @NotNull private final String name, prefix; diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/DisplayName.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/DisplayName.java index 162aa708..2ac4e4c9 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/DisplayName.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/DisplayName.java @@ -1,7 +1,9 @@ package net.Indyuce.mmoitems.stat; +import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.SupportedNBTTagValues; +import io.lumine.mythic.lib.comp.adventure.AdventureParser; import io.lumine.mythic.lib.version.VersionMaterial; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.api.ItemTier; @@ -19,90 +21,104 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; public class DisplayName extends StringStat implements GemStoneStat { - private final String[] cleanFilter = {ChatColor.BOLD.toString(), ChatColor.ITALIC.toString(), ChatColor.UNDERLINE.toString(), ChatColor.STRIKETHROUGH.toString(), ChatColor.MAGIC.toString()}; + private final String[] cleanFilter = {ChatColor.BOLD.toString(), ChatColor.ITALIC.toString(), ChatColor.UNDERLINE.toString(), ChatColor.STRIKETHROUGH.toString(), ChatColor.MAGIC.toString()}; - public DisplayName() { - super("NAME", VersionMaterial.OAK_SIGN.toMaterial(), "Display Name", new String[] { "The item display name." }, - new String[] { "all" }); - } + public DisplayName() { + super("NAME", VersionMaterial.OAK_SIGN.toMaterial(), "Display Name", new String[]{"The item display name."}, + new String[]{"all"}); + } - @Override - public void whenApplied(@NotNull ItemStackBuilder item, @NotNull StringData data) { + @Override + public void whenApplied(@NotNull ItemStackBuilder item, @NotNull StringData data) { + final AdventureParser parser = MythicLib.plugin.getAdventureParser(); + // Bake + String format = data.toString(); - // Bake - String format = data.toString(); + ItemTier tier = item.getMMOItem().getTier(); + format = format.replace("", tier != null ? parser.stripColors(tier.getUnparsedName()) : ""); + format = format.replace("", tier != null ? parser.lastColor(tier.getUnparsedName(), true) : "&f"); + format = format.replace("", tier != null ? parser.lastColor(tier.getUnparsedName(), false) : ""); - ItemTier tier = item.getMMOItem().getTier(); - format = format.replace("", tier != null ? ChatColor.stripColor(tier.getName()) : ""); - format = format.replace("", tier != null ? ChatColor.getLastColors(tier.getName()) : "&f"); - if (tier != null) - for (String filter : cleanFilter) - if (ChatColor.getLastColors(tier.getName()).contains(filter)) - format = format.replace("", ChatColor.getLastColors(tier.getName().replace(filter, ""))); + // Is this upgradable? + format = cropUpgrade(format); + if (item.getMMOItem().hasUpgradeTemplate()) { + format = appendUpgradeLevel(format, item.getMMOItem().getUpgradeLevel()); + } - // Is this upgradable? - format = cropUpgrade(format); - if (item.getMMOItem().hasUpgradeTemplate()) { format = appendUpgradeLevel(format, item.getMMOItem().getUpgradeLevel()); } + item.getMeta().setDisplayName(format); - item.getMeta().setDisplayName(format); + // Force Stat History generation + StatHistory.from(item.getMMOItem(), this); - // Force Stat History generation - StatHistory.from(item.getMMOItem(), this); + // Add NBT + item.addItemTag(getAppliedNBT(data)); + } - // Add NBT - item.addItemTag(getAppliedNBT(data)); - } + @NotNull + String cropUpgrade(@NotNull String format) { + String suffix = MMOItems.plugin.getConfig().getString("item-upgrading.name-suffix", " &8(&e+#lvl#&8)"); + if (suffix == null || suffix.isEmpty()) { + return format; + } - @NotNull String cropUpgrade(@NotNull String format) { - String suffix = MMOItems.plugin.getConfig().getString("item-upgrading.name-suffix", " &8(&e+#lvl#&8)"); - if (suffix == null || suffix.isEmpty()) { return format; } + //MMOItems.getConsole().sendMessage("Level " + upgradeLevel); + //MMOItems.getConsole().sendMessage("Format " + format); - //MMOItems.getConsole().sendMessage("Level " + upgradeLevel); - //MMOItems.getConsole().sendMessage("Format " + format); + if (suffix != null) { - if (suffix != null) { + // Crop lvl + int lvlOFFSET = suffix.indexOf("#lvl#"); + if (lvlOFFSET < 0) { + return format; + } + String sB4 = suffix.substring(0, lvlOFFSET); + String aFt = suffix.substring(lvlOFFSET + "#lvl#".length()); + String sB4_alt = sB4.replace("+", "-"); + String aFt_alt = aFt.replace("+", "-"); - // Crop lvl - int lvlOFFSET = suffix.indexOf("#lvl#"); - if (lvlOFFSET < 0) { return format; } - String sB4 = suffix.substring(0, lvlOFFSET); - String aFt = suffix.substring(lvlOFFSET + "#lvl#".length()); - String sB4_alt = sB4.replace("+", "-"); - String aFt_alt = aFt.replace("+", "-"); + // Remove it + if (format.contains(sB4)) { - // Remove it - if (format.contains(sB4)) { + // Get offsets + int sB4_offset = format.indexOf(sB4); + int aFt_offset = format.lastIndexOf(aFt); - // Get offsets - int sB4_offset = format.indexOf(sB4); - int aFt_offset = format.lastIndexOf(aFt); + // No after = to completion + if (aFt_offset < 0) { + aFt_offset = format.length(); + } else { + aFt_offset += aFt.length(); + } - // No after = to completion - if (aFt_offset < 0) { aFt_offset = format.length(); } else { aFt_offset += aFt.length(); } + // Remove that + String beforePrefix = format.substring(0, sB4_offset); + String afterPrefix = format.substring(aFt_offset); - // Remove that - String beforePrefix = format.substring(0, sB4_offset); - String afterPrefix = format.substring(aFt_offset); + // Replace + format = beforePrefix + afterPrefix; + } - // Replace - format = beforePrefix + afterPrefix; } + // Remove it + if (format.contains(sB4_alt)) { - // Remove it - if (format.contains(sB4_alt)) { + // Get offsets + int sB4_offset = format.indexOf(sB4_alt); + int aFt_offset = format.lastIndexOf(aFt_alt); - // Get offsets - int sB4_offset = format.indexOf(sB4_alt); - int aFt_offset = format.lastIndexOf(aFt_alt); + // No after = to completion + if (aFt_offset < 0) { + aFt_offset = format.length(); + } else { + aFt_offset += aFt_alt.length(); + } - // No after = to completion - if (aFt_offset < 0) { aFt_offset = format.length(); } else { aFt_offset += aFt_alt.length(); } + // Remove that + String beforePrefix = format.substring(0, sB4_offset); + String afterPrefix = format.substring(aFt_offset); - // Remove that - String beforePrefix = format.substring(0, sB4_offset); - String afterPrefix = format.substring(aFt_offset); - - // Replace - format = beforePrefix + afterPrefix; } + // Replace + format = beforePrefix + afterPrefix; + } /*/ Bake old indices for removal ArrayList oldSuffixii = new ArrayList<>(); boolean negativity = false; @@ -122,193 +138,202 @@ public class DisplayName extends StringStat implements GemStoneStat { //MMOItems.getConsole().sendMessage("Edited " + format); } //*/ - //MMOItems.getConsole().sendMessage("Final " + format); - } + //MMOItems.getConsole().sendMessage("Final " + format); + } - return format; - } + return format; + } - @NotNull - public static String appendUpgradeLevel(@NotNull String format, int lvl) { - String suffix = MMOItems.plugin.getConfig().getString("item-upgrading.name-suffix"); - if (suffix != null && lvl != 0) { - String actSuffix = levelPrefix(suffix, lvl); - return format + actSuffix; - } + @NotNull + public static String appendUpgradeLevel(@NotNull String format, int lvl) { + String suffix = MMOItems.plugin.getConfig().getString("item-upgrading.name-suffix"); + if (suffix != null && lvl != 0) { + String actSuffix = levelPrefix(suffix, lvl); + return format + actSuffix; + } - return format; - } + return format; + } - @NotNull - public static String levelPrefix(@NotNull String template, int toLevel) { - return template - .replace("#lvl#", String.valueOf(toLevel)) - .replace("+-", "-"); - } + @NotNull + public static String levelPrefix(@NotNull String template, int toLevel) { + return template + .replace("#lvl#", String.valueOf(toLevel)) + .replace("+-", "-"); + } - /** - * This is not saved as a custom NBT data, instead it is stored as the name of the item itself. - * Alas this returns an empty list - */ - @NotNull - @Override - public ArrayList getAppliedNBT(@NotNull StringData data) { + /** + * This is not saved as a custom NBT data, instead it is stored as the name of the item itself. + * Alas this returns an empty list + */ + @NotNull + @Override + public ArrayList getAppliedNBT(@NotNull StringData data) { - if (data instanceof NameData) { + if (data instanceof NameData) { - ArrayList tags = new ArrayList<>(); + ArrayList tags = new ArrayList<>(); - // Append those - tags.add(new ItemTag(getNBTPath(), ((NameData) data).getMainName())); - if (((NameData) data).hasPrefixes()) { tags.add(((NameData) data).compressPrefixes(getNBTPath() + "_PRE"));} - if (((NameData) data).hasSuffixes()) { tags.add(((NameData) data).compressSuffixes(getNBTPath() + "_SUF"));} + // Append those + tags.add(new ItemTag(getNBTPath(), ((NameData) data).getMainName())); + if (((NameData) data).hasPrefixes()) { + tags.add(((NameData) data).compressPrefixes(getNBTPath() + "_PRE")); + } + if (((NameData) data).hasSuffixes()) { + tags.add(((NameData) data).compressSuffixes(getNBTPath() + "_SUF")); + } - return tags; - } + return tags; + } - // Thats it - return new ArrayList<>(); - } + // Thats it + return new ArrayList<>(); + } - @Override - public void whenLoaded(@NotNull ReadMMOItem mmoitem) { + @Override + public void whenLoaded(@NotNull ReadMMOItem mmoitem) { - // Get tags - ArrayList relevantTags = new ArrayList<>(); boolean stored = false; - ItemTag mainName = ItemTag.getTagAtPath(getNBTPath(), mmoitem.getNBT(), SupportedNBTTagValues.STRING); + // Get tags + ArrayList relevantTags = new ArrayList<>(); + boolean stored = false; + ItemTag mainName = ItemTag.getTagAtPath(getNBTPath(), mmoitem.getNBT(), SupportedNBTTagValues.STRING); - //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Loading name of \u00a7b" + mmoitem.getType() + " " + mmoitem.getId()); + //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Loading name of \u00a7b" + mmoitem.getType() + " " + mmoitem.getId()); - if (mainName != null) { + if (mainName != null) { - // Ah yes - ItemTag prefixes = ItemTag.getTagAtPath(getNBTPath() + "_PRE", mmoitem.getNBT(), SupportedNBTTagValues.STRING); - ItemTag suffixes = ItemTag.getTagAtPath(getNBTPath() + "_SUF", mmoitem.getNBT(), SupportedNBTTagValues.STRING); - relevantTags.add(mainName); - relevantTags.add(prefixes); - relevantTags.add(suffixes); + // Ah yes + ItemTag prefixes = ItemTag.getTagAtPath(getNBTPath() + "_PRE", mmoitem.getNBT(), SupportedNBTTagValues.STRING); + ItemTag suffixes = ItemTag.getTagAtPath(getNBTPath() + "_SUF", mmoitem.getNBT(), SupportedNBTTagValues.STRING); + relevantTags.add(mainName); + relevantTags.add(prefixes); + relevantTags.add(suffixes); - // No need to evaluate anvil changes if the item has no display name - if (mmoitem.getNBT().getItem().getItemMeta().hasDisplayName()) { stored = true; } + // No need to evaluate anvil changes if the item has no display name + if (mmoitem.getNBT().getItem().getItemMeta().hasDisplayName()) { + stored = true; + } - } else { + } else { - // No need to continue if the item has no display name - if (!mmoitem.getNBT().getItem().getItemMeta().hasDisplayName()) { return; } + // No need to continue if the item has no display name + if (!mmoitem.getNBT().getItem().getItemMeta().hasDisplayName()) { + return; + } - //NME//MMOItems.log("\u00a7a\u00a2\u00a2\u00a2\u00a77 Older item, decrypting as main name as:\u00a7f " + cropUpgrade(mmoitem.getNBT().getItem().getItemMeta().getDisplayName())); + //NME//MMOItems.log("\u00a7a\u00a2\u00a2\u00a2\u00a77 Older item, decrypting as main name as:\u00a7f " + cropUpgrade(mmoitem.getNBT().getItem().getItemMeta().getDisplayName())); - // Add sole tag - relevantTags.add(new ItemTag(getNBTPath(), cropUpgrade(mmoitem.getNBT().getItem().getItemMeta().getDisplayName()))); - } + // Add sole tag + relevantTags.add(new ItemTag(getNBTPath(), cropUpgrade(mmoitem.getNBT().getItem().getItemMeta().getDisplayName()))); + } - // Use that - NameData bakedData = (NameData) getLoadedNBT(relevantTags); + // Use that + NameData bakedData = (NameData) getLoadedNBT(relevantTags); - // Valid? - if (bakedData != null) { + // Valid? + if (bakedData != null) { - //NME//MMOItems.log("\u00a7e\u00a2\u00a2\u00a2\u00a77 Built:\u00a7f " + bakedData.toString()); - /* - * Suppose we expect an item name with prefixes and suffixes, - * well, removing those should leave the bare name, right? - * - * If the player has renamed their item, this bare name will be somewhat - * different, and this is where those changes are updated. - */ + //NME//MMOItems.log("\u00a7e\u00a2\u00a2\u00a2\u00a77 Built:\u00a7f " + bakedData.toString()); + /* + * Suppose we expect an item name with prefixes and suffixes, + * well, removing those should leave the bare name, right? + * + * If the player has renamed their item, this bare name will be somewhat + * different, and this is where those changes are updated. + */ - @Nullable String itemName = null; - if (stored) { + @Nullable String itemName = null; + if (stored) { - // Could the player have renamed? - itemName = mmoitem.getNBT().getItem().getItemMeta().getDisplayName(); - String colorless = ChatColor.stripColor(itemName); + // Could the player have renamed? + itemName = mmoitem.getNBT().getItem().getItemMeta().getDisplayName(); + String colorless = ChatColor.stripColor(itemName); - //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Comparing: " + itemName + " | " + colorless); - // By player - if (!itemName.equals(colorless)) { - //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Not anvil"); - itemName = null; + //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Comparing: " + itemName + " | " + colorless); + // By player + if (!itemName.equals(colorless)) { + //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Not anvil"); + itemName = null; - } else { - //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Replaced main with \u00a7b " + itemName); - bakedData.setString(itemName); - } + } else { + //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Replaced main with \u00a7b " + itemName); + bakedData.setString(itemName); + } - } + } - // Set - mmoitem.setData(this, bakedData); + // Set + mmoitem.setData(this, bakedData); - // Update in SH. Must happen after setting the data - if (stored && itemName != null) { + // Update in SH. Must happen after setting the data + if (stored && itemName != null) { - // History not prematurely loaded? - if (mmoitem.getStatHistory(this) == null) { + // History not prematurely loaded? + if (mmoitem.getStatHistory(this) == null) { - // Also load history :think ing: - ItemTag hisTag = ItemTag.getTagAtPath(ItemStackBuilder.history_keyword + getId(), mmoitem.getNBT(), SupportedNBTTagValues.STRING); + // Also load history :think ing: + ItemTag hisTag = ItemTag.getTagAtPath(ItemStackBuilder.history_keyword + getId(), mmoitem.getNBT(), SupportedNBTTagValues.STRING); - if (hisTag != null) { + if (hisTag != null) { - // Aye - StatHistory hist = StatHistory.fromNBTString(mmoitem, (String) hisTag.getValue()); + // Aye + StatHistory hist = StatHistory.fromNBTString(mmoitem, (String) hisTag.getValue()); - // History valid? Record - if (hist != null) { + // History valid? Record + if (hist != null) { - // Original Data - NameData og = (NameData) hist.getOriginalData(); + // Original Data + NameData og = (NameData) hist.getOriginalData(); - // Overwrite - og.setString(itemName); + // Overwrite + og.setString(itemName); - // Load its stat history - mmoitem.setStatHistory(this, hist); + // Load its stat history + mmoitem.setStatHistory(this, hist); - //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Name History:"); - //NME//hist.log(); - } - } - } - } - } - } + //NME//MMOItems.log("\u00a7b\u00a2\u00a2\u00a2\u00a77 Name History:"); + //NME//hist.log(); + } + } + } + } + } + } - @Nullable - @Override - public StringData getLoadedNBT(@NotNull ArrayList storedTags) { + @Nullable + @Override + public StringData getLoadedNBT(@NotNull ArrayList storedTags) { - // You got a double right - ItemTag tg = ItemTag.getTagAtPath(getNBTPath(), storedTags); + // You got a double right + ItemTag tg = ItemTag.getTagAtPath(getNBTPath(), storedTags); - // Found righ - if (tg != null) { + // Found righ + if (tg != null) { - // Get number - String value = (String) tg.getValue(); + // Get number + String value = (String) tg.getValue(); - // That's it - NameData nd = new NameData(value); + // That's it + NameData nd = new NameData(value); - nd.readPrefixes(ItemTag.getTagAtPath(getNBTPath() + "_PRE", storedTags)); - nd.readSuffixes(ItemTag.getTagAtPath(getNBTPath() + "_SUF", storedTags)); + nd.readPrefixes(ItemTag.getTagAtPath(getNBTPath() + "_PRE", storedTags)); + nd.readSuffixes(ItemTag.getTagAtPath(getNBTPath() + "_SUF", storedTags)); - return nd; - } + return nd; + } - // Fail - return null; - } + // Fail + return null; + } - @NotNull - @Override - public StringData getClearStatData() { - return new NameData(""); - } + @NotNull + @Override + public StringData getClearStatData() { + return new NameData(""); + } - @Override - public StringData whenInitialized(Object object) { - return new NameData(object.toString()); - } + @Override + public StringData whenInitialized(Object object) { + return new NameData(object.toString()); + } }