Merge branch 'master'

This commit is contained in:
Jules 2020-08-03 18:41:41 +02:00
commit 2b001f57a9
2 changed files with 145 additions and 117 deletions

View File

@ -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);
}

View File

@ -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<ItemTag> 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<String, ItemTag> getStoredTags() {
HashMap<String, ItemTag> 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());
}
}
}