mirror of
https://gitlab.com/phoenix-dvpmt/mmoitems.git
synced 2025-02-24 15:01:44 +01:00
Merge branch 'master'
This commit is contained in:
commit
2b001f57a9
@ -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);
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user