diff --git a/src/main/java/net/Indyuce/mmoitems/api/item/MMOItem.java b/src/main/java/net/Indyuce/mmoitems/api/item/MMOItem.java index 9a18af4f..988e32ae 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/item/MMOItem.java +++ b/src/main/java/net/Indyuce/mmoitems/api/item/MMOItem.java @@ -1,15 +1,14 @@ package net.Indyuce.mmoitems.api.item; -import net.Indyuce.mmoitems.api.Type; -import net.Indyuce.mmoitems.api.item.build.MMOItemBuilder; -import net.Indyuce.mmoitems.stat.data.UpgradeData; -import net.Indyuce.mmoitems.stat.data.type.StatData; -import net.Indyuce.mmoitems.stat.type.ItemStat; - import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; +import net.Indyuce.mmoitems.api.Type; +import net.Indyuce.mmoitems.api.item.build.MMOItemBuilder; +import net.Indyuce.mmoitems.stat.data.type.StatData; +import net.Indyuce.mmoitems.stat.type.ItemStat; + public class MMOItem { private final Type type; private final String id; @@ -65,13 +64,6 @@ public class MMOItem { return clone; } - public boolean isUpgradable() { - UpgradeData upgradeData = (UpgradeData) this.getData(ItemStat.UPGRADE); - if (upgradeData != null) - return upgradeData.getTemplate() != null; - return false; - } - public void replaceData(ItemStat stat, StatData data) { stats.replace(stat, data); } diff --git a/src/main/java/net/Indyuce/mmoitems/api/item/build/MMOItemBuilder.java b/src/main/java/net/Indyuce/mmoitems/api/item/build/MMOItemBuilder.java index 41ad2b73..77dfe764 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/item/build/MMOItemBuilder.java +++ b/src/main/java/net/Indyuce/mmoitems/api/item/build/MMOItemBuilder.java @@ -1,6 +1,7 @@ package net.Indyuce.mmoitems.api.item.build; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.UUID; import java.util.logging.Level; @@ -22,6 +23,7 @@ import net.Indyuce.mmoitems.stat.data.MaterialData; import net.Indyuce.mmoitems.stat.data.StoredTagsData; import net.Indyuce.mmoitems.stat.data.StringData; import net.Indyuce.mmoitems.stat.data.UpgradeData; +import net.Indyuce.mmoitems.stat.data.type.UpgradeInfo; import net.Indyuce.mmoitems.stat.type.DoubleStat; import net.Indyuce.mmoitems.stat.type.ItemStat; import net.asangarin.hexcolors.ColorParse; @@ -30,21 +32,22 @@ import net.mmogroup.mmolib.api.item.ItemTag; import net.mmogroup.mmolib.api.item.NBTItem; public class MMOItemBuilder { - private final MMOItem mmoitem; + private MMOItem mmoitem; private final ItemStack item; private final ItemMeta meta; private final MMOItemLore lore = new MMOItemLore(); private final List tags = new ArrayList<>(); - private static final AttributeModifier fakeModifier = new AttributeModifier(UUID.fromString("87851e28-af12-43f6-898e-c62bde6bd0ec"), - "mmoitemsDecoy", 0, Operation.ADD_NUMBER); + private static final AttributeModifier fakeModifier = new AttributeModifier( + UUID.fromString("87851e28-af12-43f6-898e-c62bde6bd0ec"), "mmoitemsDecoy", 0, Operation.ADD_NUMBER); public MMOItemBuilder(MMOItem mmoitem) { this.mmoitem = mmoitem; item = new ItemStack( - mmoitem.hasData(ItemStat.MATERIAL) ? ((MaterialData) mmoitem.getData(ItemStat.MATERIAL)).getMaterial() : Material.DIAMOND_SWORD); + mmoitem.hasData(ItemStat.MATERIAL) ? ((MaterialData) mmoitem.getData(ItemStat.MATERIAL)).getMaterial() + : Material.DIAMOND_SWORD); meta = item.getItemMeta(); meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); @@ -52,7 +55,8 @@ public class MMOItemBuilder { tags.add(new ItemTag("MMOITEMS_ITEM_ID", mmoitem.getId())); if (MMOItems.plugin.getUpdater().hasData(mmoitem)) - tags.add(new ItemTag("MMOITEMS_ITEM_UUID", MMOItems.plugin.getUpdater().getData(mmoitem).getUniqueId().toString())); + tags.add(new ItemTag("MMOITEMS_ITEM_UUID", + MMOItems.plugin.getUpdater().getData(mmoitem).getUniqueId().toString())); } public MMOItemLore getLore() { @@ -77,104 +81,14 @@ public class MMOItemBuilder { } public NBTItem buildNBT() { - - // TODO MMOItems 6 - scrap that big portion - if (MMOItems.plugin.getConfig().getBoolean("item-upgrading.display-stat-changes", false)) - if (mmoitem.isUpgradable()) { - UpgradeData upgradeData = ((UpgradeData) mmoitem.getData(ItemStat.UPGRADE)); - for (ItemStat stat : upgradeData.getTemplate().getKeys()) { - try { - if (upgradeData.getLevel() > 0) { + this.mmoitem = new StatLore(mmoitem).generateNewItem(); - // data getters - DoubleStat.DoubleUpgradeInfo doubleUpgradeInfo = ((DoubleStat.DoubleUpgradeInfo) upgradeData.getTemplate().getUpgradeInfo(stat)); - StoredTagsData data = (StoredTagsData) mmoitem.getData(ItemStat.STORED_TAGS); - - if (!mmoitem.hasData(stat)) - mmoitem.setData(stat, new DoubleData(0)); - - // default values - double baseValue = 0; - boolean hasBase = false; - double value = ((DoubleData) mmoitem.getData(stat)).generateNewValue(); - int level = upgradeData.getLevel(); - - - /* - * checks if base value is set - */ - for (ItemTag tag : data.getTags()) { - if (tag.getPath().equals("BASE_" + stat.getNBTPath())) { - hasBase = true; - baseValue = Double.parseDouble(tag.getValue().toString()); - break; - } - } - - /* - * sets the base value in stored_tags if it's not set - * will also get the correct base for already upgraded items - */ - if (!hasBase) // this checks if the base stat is registers - if (doubleUpgradeInfo != null) { - - ItemTag baseTag; - - if (!doubleUpgradeInfo.isRelative()) { - baseTag = new ItemTag("BASE_" + stat.getNBTPath(), - value/level ); - - } - - else { - double base = value; - for(int i=1;i<=level;i++){ - base /= 1 + doubleUpgradeInfo.getAmount(); - } - baseTag = new ItemTag("BASE_" + stat.getNBTPath(), base); - } - - data.addTag(baseTag); - baseValue = Double.parseDouble(baseTag.getValue().toString()); - mmoitem.replaceData(ItemStat.STORED_TAGS, data); - } - - /* - * updates the stats - */ - if (doubleUpgradeInfo != null) // this updates stats to the current version - if (!doubleUpgradeInfo.isRelative()) - mmoitem.replaceData(stat, new DoubleData((doubleUpgradeInfo.getAmount() * level) - + baseValue)); - else if (doubleUpgradeInfo.isRelative()) { - double base = baseValue; - for(int i=1;i<=level;i++){ - base *= 1 + doubleUpgradeInfo.getAmount(); - } - mmoitem.replaceData(stat, new DoubleData(base)); - } - - /* - * inserts the correct lore - */ - value = ((DoubleData) mmoitem.getData(stat)).generateNewValue(); - if (value > 0) - lore.insert(stat.getPath(), stat.format(value, "#", new StatFormat("##").format(value)) - + new ColorParse(MMOItems.plugin.getConfig().getString("item-upgrading.stat-change-suffix", " &e(+#stat#)") - .replace("#stat#", new StatFormat("##").format(value-baseValue))).toChatColor()); - } - } catch (IllegalArgumentException exception) { - MMOItems.plugin.getLogger().log(Level.WARNING, "An error occurred while trying to generate item '" + mmoitem.getId() + "' with stat '" - + stat.getId() + "': " + exception.getMessage()); - } - } - } for (ItemStat stat : mmoitem.getStats()) try { stat.whenApplied(this, mmoitem.getData(stat)); } catch (IllegalArgumentException exception) { - MMOItems.plugin.getLogger().log(Level.WARNING, "An error occurred while trying to generate item '" + mmoitem.getId() + "' with stat '" - + stat.getId() + "': " + exception.getMessage()); + MMOItems.plugin.getLogger().log(Level.WARNING, "An error occurred while trying to generate item '" + + mmoitem.getId() + "' with stat '" + stat.getId() + "': " + exception.getMessage()); } // lore @@ -182,14 +96,15 @@ public class MMOItemBuilder { lore.insert("gem-stone-lore", ItemStat.translate("gem-stone-lore")); lore.insert("item-type", ItemStat.translate("item-type").replace("#", - mmoitem.getStats().contains(ItemStat.DISPLAYED_TYPE) ? ((StringData) mmoitem.getData(ItemStat.DISPLAYED_TYPE)).toString() + mmoitem.getStats().contains(ItemStat.DISPLAYED_TYPE) + ? ((StringData) mmoitem.getData(ItemStat.DISPLAYED_TYPE)).toString() : mmoitem.getType().getName())); meta.setLore(lore.build().toStringList()); /* * this tag is added to entirely override default vanilla item attribute - * modifiers, this way armor gives no ARMOR or ARMOR TOUGHNESS to the - * holder. since 4.7 attributes are handled via custom calculations + * modifiers, this way armor gives no ARMOR or ARMOR TOUGHNESS to the holder. + * since 4.7 attributes are handled via custom calculations */ try { @@ -198,9 +113,8 @@ public class MMOItemBuilder { return MMOLib.plugin.getNMS().getNBTItem(item).addTag(tags); /* - * on legacy spigot, it is not required to add a fake modifier to - * the modifier list, so just override the string tag and it works - * fine. + * on legacy spigot, it is not required to add a fake modifier to the modifier + * list, so just override the string tag and it works fine. */ } catch (NoSuchMethodError exception) { item.setItemMeta(meta); @@ -213,4 +127,126 @@ public class MMOItemBuilder { public ItemStack build() { return buildNBT().toItem(); } + + public class StatLore { + private final MMOItem mmoitem; + + private final UpgradeData upgradeData; + + /*** @deprecated will be improved with mmoitems 6 + * + * @param mmoitem + */ + public StatLore(MMOItem mmoitem) { + this.mmoitem = mmoitem.clone(); + this.upgradeData = ((UpgradeData) mmoitem.getData(ItemStat.UPGRADE)); + + } + + public MMOItem getMMOItem() { + return mmoitem; + } + + public boolean isUpgradable() { + if (upgradeData != null) + return upgradeData.getTemplate() != null; + return false; + } + + public MMOItem generateNewItem() { + if (MMOItems.plugin.getConfig().getBoolean("item-upgrading.display-stat-changes", false) + && isUpgradable()) { + if (upgradeData.getLevel() > 0) + for (ItemStat stat : upgradeData.getTemplate().getKeys()) { + UpgradeInfo upgradeInfo = upgradeData.getTemplate().getUpgradeInfo(stat); + if (upgradeInfo instanceof DoubleStat.DoubleUpgradeInfo) { + + DoubleStat.DoubleUpgradeInfo info = ((DoubleStat.DoubleUpgradeInfo) upgradeInfo); + int level = upgradeData.getLevel(); + + if (!mmoitem.hasData(stat)) + mmoitem.setData(stat, new DoubleData(0)); + + calculateBase(stat, info, level); + + updateStat(stat, info, level); + + double value = getValue(stat); + + System.out.println("VALUE: " + value); + System.out.println("BASE: " + getBase(stat)); + + if (value > 0) + lore.insert(stat.getPath(), stat.format(value, "#", new StatFormat("##").format(value)) + + new ColorParse(MMOItems.plugin.getConfig() + .getString("item-upgrading.stat-change-suffix", " &e(+#stat#)") + .replace("#stat#", new StatFormat("##").format(value - getBase(stat)))) + .toChatColor()); + } + } + } + return mmoitem; + } + + public void calculateBase(ItemStat stat, DoubleStat.DoubleUpgradeInfo info, int level) { + if (!hasBase(stat)) { + ItemTag tag; + String key = "BASE_" + stat.getNBTPath(); + double value = getValue(stat); + + // does inverse math to get the base + if (info.isRelative()) { + double upgradeAmount = ((DoubleStat.DoubleUpgradeInfo) upgradeData.getTemplate() + .getUpgradeInfo(stat)).getAmount(); + + for (int i = 1; i <= level; i++) { + value /= 1 + upgradeAmount; + } + + tag = new ItemTag(key, value); + } else { + tag = new ItemTag(key, Math.max(0, value - (info.getAmount() * level))); + } + StoredTagsData tagsData = (StoredTagsData) mmoitem.getData(ItemStat.STORED_TAGS); + + tagsData.addTag(tag); + mmoitem.replaceData(ItemStat.STORED_TAGS, tagsData); + } + } + + // sets the mmoitem data to reflect current upgrade + public void updateStat(ItemStat stat, DoubleStat.DoubleUpgradeInfo info, int level) { + double base = getBase(stat); + if (info.isRelative()) { + for (int i = 1; i <= level; i++) { + base *= 1 + info.getAmount(); + } + mmoitem.replaceData(stat, new DoubleData(base)); + } else { + mmoitem.replaceData(stat, new DoubleData((info.getAmount() * level) + base)); + } + } + + public HashMap getStoredTags() { + HashMap map = new HashMap<>(); + StoredTagsData tagsData = (StoredTagsData) mmoitem.getData(ItemStat.STORED_TAGS); + + for (ItemTag tag : tagsData.getTags()) + map.put(tag.getPath(), tag); + return map; + } + + public double getValue(ItemStat stat) { + return ((DoubleData) mmoitem.getData(stat)).generateNewValue(); + } + + public boolean hasBase(ItemStat stat) { + return getStoredTags().containsKey("BASE_" + stat.getNBTPath()); + } + + public double getBase(ItemStat stat) { + return Double.parseDouble(getStoredTags().get("BASE_" + stat.getNBTPath()).getValue().toString()); + } + } + }