!Moved enchants classes

This commit is contained in:
Jules 2021-07-26 12:26:45 +02:00
parent 4b0b41cc30
commit 81390e5e48
6 changed files with 284 additions and 347 deletions

View File

@ -17,6 +17,7 @@ import net.Indyuce.mmoitems.api.util.message.FFPMMOItems;
import net.Indyuce.mmoitems.command.MMOItemsCommandTreeRoot;
import net.Indyuce.mmoitems.comp.*;
import net.Indyuce.mmoitems.comp.eco.VaultSupport;
import net.Indyuce.mmoitems.comp.enchants.AdvancedEnchantmentsHook;
import net.Indyuce.mmoitems.comp.enchants.CrazyEnchantsStat;
import net.Indyuce.mmoitems.comp.enchants.EnchantPlugin;
import net.Indyuce.mmoitems.comp.enchants.MythicEnchantsSupport;
@ -129,13 +130,13 @@ public class MMOItems extends LuminePlugin {
if (Bukkit.getPluginManager().getPlugin("MMOCore") != null)
new MMOCoreMMOLoader();
if (Bukkit.getPluginManager().getPlugin("mcMMO") != null) {
if (Bukkit.getPluginManager().getPlugin("mcMMO") != null)
//statManager.register(McMMOHook.MCMMO_SUPER_TOOL);
statManager.register(McMMOHook.disableMcMMORepair);
}
if (Bukkit.getPluginManager().getPlugin("AdvancedEnchantments") != null) {
if (Bukkit.getPluginManager().getPlugin("AdvancedEnchantments") != null)
statManager.register(AdvancedEnchantmentsHook.ADVANCED_ENCHANTMENTS);
}
if (Bukkit.getPluginManager().getPlugin("MythicEnchants") != null)
enchantPlugins.add(new MythicEnchantsSupport());
}

View File

@ -1,40 +0,0 @@
package net.Indyuce.mmoitems.comp;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.event.MMOItemReforgeEvent;
import net.Indyuce.mmoitems.stat.data.type.StatData;
import net.Indyuce.mmoitems.stat.type.ItemStat;
import net.advancedplugins.ae.api.EnchantApplyEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.item.NBTItem;
public class AdvancedEnchantmentsHook implements Listener {
public static final ItemStat ADVANCED_ENCHANTMENTS = new AdvancedEnchantsStat();
@EventHandler
public void a(EnchantApplyEvent event) {
NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(event.getItem());
if (item.getType() != null && item.getBoolean("MMOITEMS_DISABLE_ADVANCED_ENCHANTS"))
event.setCancelled(true);
}
@EventHandler
public void onReforge(MMOItemReforgeEvent event) {
if (!event.getOptions().shouldKeepAdvancedEnchants()) { return; }
//RFG// MMOItems.log("§8Reforge §4EFG§f Keeping Advanced Enchantments");
// Ez just get from old put in new
StatData aEnchs = event.getOldMMOItem().getData(ADVANCED_ENCHANTMENTS);
// Bruh
if (aEnchs == null) { return; }
// Well that should have worked
event.getNewMMOItem().setData(ADVANCED_ENCHANTMENTS, aEnchs);
}
}

View File

@ -1,260 +0,0 @@
package net.Indyuce.mmoitems.comp;
import io.lumine.mythic.lib.api.item.ItemTag;
import io.lumine.mythic.lib.api.item.SupportedNBTTagValues;
import io.lumine.mythic.lib.api.util.ui.FriendlyFeedbackProvider;
import io.lumine.mythic.lib.api.util.ui.SilentNumbers;
import io.lumine.mythic.lib.version.VersionMaterial;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder;
import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem;
import net.Indyuce.mmoitems.api.util.message.FFPMMOItems;
import net.Indyuce.mmoitems.gui.edition.EditionInventory;
import net.Indyuce.mmoitems.stat.data.StringListData;
import net.Indyuce.mmoitems.stat.data.type.StatData;
import net.Indyuce.mmoitems.stat.type.StringListStat;
import net.advancedplugins.ae.enchanthandler.enchantments.AEnchants;
import net.advancedplugins.ae.enchanthandler.enchantments.AdvancedEnchantment;
import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* List of enchantments in an item yes
*/
public class AdvancedEnchantsStat extends StringListStat {
public AdvancedEnchantsStat() {
super("ADVANCED_ENCHANTS", VersionMaterial.EXPERIENCE_BOTTLE.toMaterial(), "Advanced Enchants", new String[]{"The AEnchants of this. Format:", "\u00a7e[internal_name] [level]"}, new String[]{"!miscellaneous", "!block", "all"});
}
@Override
public void whenApplied(@NotNull ItemStackBuilder item, @NotNull StatData data) {
/*
* Now just apply all of them as AEnchants
*/
StringListData sList = (StringListData) data;
// Do that
HashMap<String, Integer> aes = readList(sList.getList());
ArrayList<String> loreInserts = new ArrayList<>();
// Dont repeat
ArrayList<String> repeats = new ArrayList<>();
// Enchant the item
for (String ench : aes.keySet()) {
Integer lvl = aes.get(ench);
// Skip trash
if (ench == null || lvl == null || ench.isEmpty()) { continue; }
if (!AEnchants.getEnchants().contains(ench.toLowerCase())) { continue; }
// Find the actual enchantment and include lore
AdvancedEnchantment instance = new AdvancedEnchantment(ench);
// Exceed max level? Nope
if (!instance.getLevelList().contains(lvl)) { continue; }
// Skip repetitions
if (repeats.contains(ench.toLowerCase())) { continue; }
repeats.add(ench.toLowerCase());
String display = instance.getDisplay(lvl) + " " + SilentNumbers.toRomanNumerals(lvl);
// Add lore
loreInserts.add(display);
// Add the tag
item.addItemTag(tagForAEnchantment(ench, lvl));
}
item.getLore().insert(getPath(), loreInserts);
}
@Override
public void whenInput(@NotNull EditionInventory inv, @NotNull String message, Object... info) {
List<String> list = inv.getEditedSection().contains(getPath()) ? inv.getEditedSection().getStringList(getPath()) : new ArrayList<>();
// Get space
AEListEnchantment fromMessage = readEntry(message);
Validate.notNull(fromMessage, FriendlyFeedbackProvider.quickForPlayer(FFPMMOItems.get(),
"Incorrect format, use $e[internal_name] [level]$b. For the list of enchantments, use $r/ae list$b. "));
Validate.isTrue(AEnchants.getEnchants().contains(fromMessage.getName().toLowerCase()), FriendlyFeedbackProvider.quickForPlayer(FFPMMOItems.get(),
"Adv Enchantment '$u{0}$b' doesnt exist. For the list of enchantments, use $r/ae list$b. ", fromMessage.getName()));
// Find the actual enchantment to compare level
AdvancedEnchantment instance = new AdvancedEnchantment(fromMessage.getName());
Validate.isTrue(instance.getLevelList().contains(fromMessage.getLevel()), FriendlyFeedbackProvider.quickForPlayer(FFPMMOItems.get(),
"Adv Enchantment '$u{0}$b' cannot be level $u{1}$b. It only admits levels $e{2}$b. ", fromMessage.getName(), String.valueOf(fromMessage.getLevel()),
SilentNumbers.collapseList(SilentNumbers.transcribeList(instance.getLevelList(), String::valueOf), "$b,$e ")));
// Level is valid, lets remove old enchantment from this list
for (int s = 0; s < list.size(); s++) {
// Get that
AEListEnchantment atList = readEntry(list.get(s));
// Skip
if (atList == null) { continue; }
// Same? remove
if (atList.getName().toLowerCase().equals(fromMessage.getName().toLowerCase())) {
// Remove and repeat index
list.remove(s);
s--;
}
}
// Include the message
list.add(message);
inv.getEditedSection().set(getPath(), list);
inv.registerTemplateEdition();
inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + getName() + " Stat successfully added.");
}
/**
*
* @param name Name of the AEnch ~ arrow_deflect
* @param level Level of the AEnch ~ 4
* @return The tag ~ "ae_enchantment;arrow_deflect": 4
*/
ItemTag tagForAEnchantment(@NotNull String name, int level) { return new ItemTag(AE_TAG + ";" + name, level); }
@NotNull public static final String AE_TAG = "ae_enchantment";
@Override
public void whenLoaded(@NotNull ReadMMOItem mmoitem) {
// Look at all tags that start with ae_enchantment I guess
ArrayList<ItemTag> relevantTags = new ArrayList<>();
for (String tag : mmoitem.getNBT().getTags()) {
// Valid tag?
if (tag == null) { continue; }
if (tag.startsWith(AE_TAG)) {
ItemTag thatTag = ItemTag.getTagAtPath(tag, mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE);
// Not null?
if (thatTag != null) {
relevantTags.add(new ItemTag(tag, SilentNumbers.round((Double) thatTag.getValue())));
}
}
}
// Generate data
StatData data = getLoadedNBT(relevantTags);
// Valid?
if (data != null) {
/*
* This data has the enchantments that used to be stored in the item.
*/
mmoitem.setData(this, data);
}
}
@Nullable
@Override
public StatData getLoadedNBT(@NotNull ArrayList<ItemTag> storedTags) {
ArrayList<String> aEnchs = new ArrayList<>();
// Yes
for (ItemTag tag : storedTags) {
if (tag == null) { continue; }
if (!(tag.getValue() instanceof Integer)) { continue; }
// Path must be valid
int spc = tag.getPath().indexOf(AE_TAG + ";");
if (spc < 0) { continue; }
// Crop
String enchantment = tag.getPath().substring(AE_TAG.length() + 1 + spc);
int value = (int) tag.getValue();
// Make String
String str = enchantment + " " + SilentNumbers.removeDecimalZeros(String.valueOf(value));
aEnchs.add(str);
}
if (aEnchs.size() == 0) {
// Compatibility with StatHistory probably
return super.getLoadedNBT(storedTags);
}
// THats it
return new StringListData(aEnchs);
}
@NotNull HashMap<String, Integer> readList(@NotNull List<String> listed) {
HashMap<String, Integer> ret = new HashMap<>();
// Split all by like NAME
for (String str : listed) {
// List
AEListEnchantment aeLE = readEntry(str);
// Skip trash
if (aeLE == null) { continue; }
// Put
ret.put(aeLE.getName(), aeLE.getLevel());
}
return ret;
}
@Nullable AEListEnchantment readEntry(@Nullable String str) {
// Skip trash
if (str == null || !str.contains(" ")) { return null; }
// Split by integer
int spc = str.lastIndexOf(' ');
String level = str.substring(spc + 1);
// Parse that
Integer lvl = SilentNumbers.IntegerParse(level);
// Not null right
if (lvl == null) { return null; }
// Add that
String name = str.substring(0, spc);
return new AEListEnchantment(name, lvl);
}
private static class AEListEnchantment {
@NotNull final String name;
final int level;
AEListEnchantment(@NotNull String name, int level) {
this.name = name;
this.level = level;
}
@NotNull public String getName() { return name; }
public int getLevel() { return level; }
@Override public String toString() { return getName() + " " + getLevel(); }
}
}

View File

@ -1,7 +0,0 @@
package net.Indyuce.mmoitems.comp.enchants;
import net.Indyuce.mmoitems.stat.data.type.StatData;
public class AdvancedCrazyEnchantsData implements StatData {
}

View File

@ -0,0 +1,39 @@
package net.Indyuce.mmoitems.comp.enchants;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.item.NBTItem;
import net.Indyuce.mmoitems.api.event.MMOItemReforgeEvent;
import net.Indyuce.mmoitems.stat.data.type.StatData;
import net.Indyuce.mmoitems.stat.type.ItemStat;
import net.advancedplugins.ae.api.EnchantApplyEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class AdvancedEnchantmentsHook implements Listener {
public static final ItemStat ADVANCED_ENCHANTMENTS = new AdvancedEnchantsStat();
@EventHandler
public void a(EnchantApplyEvent event) {
NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(event.getItem());
if (item.getBoolean("MMOITEMS_DISABLE_ADVANCED_ENCHANTS"))
event.setCancelled(true);
}
@EventHandler
public void onReforge(MMOItemReforgeEvent event) {
if (!event.getOptions().shouldKeepAdvancedEnchants())
return;
//RFG// MMOItems.log("§8Reforge §4EFG§f Keeping Advanced Enchantments");
// Ez just get from old put in new
StatData aEnchs = event.getOldMMOItem().getData(ADVANCED_ENCHANTMENTS);
// Bruh
if (aEnchs == null)
return;
// Well that should have worked
event.getNewMMOItem().setData(ADVANCED_ENCHANTMENTS, aEnchs);
}
}

View File

@ -1,78 +1,282 @@
package net.Indyuce.mmoitems.comp.enchants;
import io.lumine.mythic.lib.api.item.ItemTag;
import io.lumine.mythic.lib.api.item.SupportedNBTTagValues;
import io.lumine.mythic.lib.api.util.ui.FriendlyFeedbackProvider;
import io.lumine.mythic.lib.api.util.ui.SilentNumbers;
import io.lumine.mythic.lib.version.VersionMaterial;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder;
import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem;
import net.Indyuce.mmoitems.api.util.message.FFPMMOItems;
import net.Indyuce.mmoitems.gui.edition.EditionInventory;
import net.Indyuce.mmoitems.stat.data.random.RandomStatData;
import net.Indyuce.mmoitems.stat.data.StringListData;
import net.Indyuce.mmoitems.stat.data.type.StatData;
import net.Indyuce.mmoitems.stat.type.InternalStat;
import net.Indyuce.mmoitems.stat.type.StringStat;
import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryClickEvent;
import net.Indyuce.mmoitems.stat.type.StringListStat;
import net.advancedplugins.ae.enchanthandler.enchantments.AEnchants;
import net.advancedplugins.ae.enchanthandler.enchantments.AdvancedEnchantment;
import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
public class AdvancedEnchantsStat extends StringStat implements InternalStat {
/**
* List of enchantments in an item yes
*/
public class AdvancedEnchantsStat extends StringListStat {
public AdvancedEnchantsStat() {
super("ADVANCED_ENCHANTS", Material.BOOK, "Advanced Enchants", new String[0], new String[]{"all"});
}
@Override
public RandomStatData whenInitialized(Object object) {
// Not supported
return null;
super("ADVANCED_ENCHANTS", VersionMaterial.EXPERIENCE_BOTTLE.toMaterial(), "Advanced Enchants", new String[]{"The AEnchants of this. Format:", "\u00a7e[internal_name] [level]"}, new String[]{"!miscellaneous", "!block", "all"});
}
@Override
public void whenApplied(@NotNull ItemStackBuilder item, @NotNull StatData data) {
/*
* Now just apply all of them as AEnchants
*/
StringListData sList = (StringListData) data;
// Do that
HashMap<String, Integer> aes = readList(sList.getList());
ArrayList<String> loreInserts = new ArrayList<>();
// Dont repeat
ArrayList<String> repeats = new ArrayList<>();
// Enchant the item
for (String ench : aes.keySet()) {
}
Integer lvl = aes.get(ench);
@Override
public void whenLoaded(@NotNull ReadMMOItem mmoitem) {
// Skip trash
if (ench == null || lvl == null || ench.isEmpty()) {
continue;
}
if (!AEnchants.getEnchants().contains(ench.toLowerCase())) {
continue;
}
}
// Find the actual enchantment and include lore
AdvancedEnchantment instance = new AdvancedEnchantment(ench);
@NotNull
@Override
public ArrayList<ItemTag> getAppliedNBT(@NotNull StatData data) {
return new ArrayList<>();
}
// Exceed max level? Nope
if (!instance.getLevelList().contains(lvl)) {
continue;
}
@Override
public void whenClicked(@NotNull EditionInventory inv, @NotNull InventoryClickEvent event) {
// Not supported
// Skip repetitions
if (repeats.contains(ench.toLowerCase())) {
continue;
}
repeats.add(ench.toLowerCase());
String display = instance.getDisplay(lvl) + " " + SilentNumbers.toRomanNumerals(lvl);
// Add lore
loreInserts.add(display);
// Add the tag
item.addItemTag(getEnchantTag(ench, lvl));
}
item.getLore().insert(getPath(), loreInserts);
}
@Override
public void whenInput(@NotNull EditionInventory inv, @NotNull String message, Object... info) {
// Not supported
List<String> list = inv.getEditedSection().contains(getPath()) ? inv.getEditedSection().getStringList(getPath()) : new ArrayList<>();
// Get space
AEListEnchantment fromMessage = readEntry(message);
Validate.notNull(fromMessage, FriendlyFeedbackProvider.quickForPlayer(FFPMMOItems.get(),
"Incorrect format, use $e[internal_name] [level]$b. For the list of enchantments, use $r/ae list$b. "));
Validate.isTrue(AEnchants.getEnchants().contains(fromMessage.getName().toLowerCase()), FriendlyFeedbackProvider.quickForPlayer(FFPMMOItems.get(),
"Adv Enchantment '$u{0}$b' doesnt exist. For the list of enchantments, use $r/ae list$b. ", fromMessage.getName()));
// Find the actual enchantment to compare level
AdvancedEnchantment instance = new AdvancedEnchantment(fromMessage.getName());
Validate.isTrue(instance.getLevelList().contains(fromMessage.getLevel()), FriendlyFeedbackProvider.quickForPlayer(FFPMMOItems.get(),
"Adv Enchantment '$u{0}$b' cannot be level $u{1}$b. It only admits levels $e{2}$b. ", fromMessage.getName(), String.valueOf(fromMessage.getLevel()),
SilentNumbers.collapseList(SilentNumbers.transcribeList(instance.getLevelList(), String::valueOf), "$b,$e ")));
// Level is valid, lets remove old enchantment from this list
for (int s = 0; s < list.size(); s++) {
// Get that
AEListEnchantment atList = readEntry(list.get(s));
// Skip
if (atList == null) {
continue;
}
// Same? remove
if (atList.getName().toLowerCase().equals(fromMessage.getName().toLowerCase())) {
// Remove and repeat index
list.remove(s);
s--;
}
}
// Include the message
list.add(message);
inv.getEditedSection().set(getPath(), list);
inv.registerTemplateEdition();
inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + getName() + " Stat successfully added.");
}
/**
* @param name Name of the AEnch ~ arrow_deflect
* @param level Level of the AEnch ~ 4
* @return The tag ~ "ae_enchantment;arrow_deflect": 4
*/
private ItemTag getEnchantTag(@NotNull String name, int level) {
return new ItemTag(AE_TAG + ";" + name, level);
}
@NotNull
public static final String AE_TAG = "ae_enchantment";
@Override
public void whenLoaded(@NotNull ReadMMOItem mmoitem) {
// Look at all tags that start with ae_enchantment I guess
ArrayList<ItemTag> relevantTags = new ArrayList<>();
for (String tag : mmoitem.getNBT().getTags()) {
// Valid tag?
if (tag == null) {
continue;
}
if (tag.startsWith(AE_TAG)) {
ItemTag thatTag = ItemTag.getTagAtPath(tag, mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE);
// Not null?
if (thatTag != null) {
relevantTags.add(new ItemTag(tag, SilentNumbers.round((Double) thatTag.getValue())));
}
}
}
// Generate data
StatData data = getLoadedNBT(relevantTags);
// Valid?
if (data != null)
// This data has the enchantments that used to be stored in the item.
mmoitem.setData(this, data);
}
@Nullable
@Override
public StatData getLoadedNBT(@NotNull ArrayList<ItemTag> storedTags) {
return null;
}
@Override
public void whenDisplayed(List<String> lore, Optional<RandomStatData> statData) {
// Not supported
ArrayList<String> aEnchs = new ArrayList<>();
// Yes
for (ItemTag tag : storedTags) {
if (tag == null || !(tag.getValue() instanceof Integer))
continue;
// Path must be valid
int spc = tag.getPath().indexOf(AE_TAG + ";");
if (spc < 0)
continue;
// Crop
String enchantment = tag.getPath().substring(AE_TAG.length() + 1 + spc);
int value = (int) tag.getValue();
// Make String
String str = enchantment + " " + SilentNumbers.removeDecimalZeros(String.valueOf(value));
aEnchs.add(str);
}
if (aEnchs.size() == 0)
// Compatibility with StatHistory probably
return super.getLoadedNBT(storedTags);
// THats it
return new StringListData(aEnchs);
}
@NotNull
@Override
public StatData getClearStatData() {
// Not supported
return null;
HashMap<String, Integer> readList(@NotNull List<String> listed) {
HashMap<String, Integer> ret = new HashMap<>();
// Split all by like NAME
for (String str : listed) {
// List
AEListEnchantment aeLE = readEntry(str);
// Skip trash
if (aeLE == null)
continue;
// Put
ret.put(aeLE.getName(), aeLE.getLevel());
}
return ret;
}
@Nullable
AEListEnchantment readEntry(@Nullable String str) {
// Skip trash
if (str == null || !str.contains(" "))
return null;
// Split by integer
int spc = str.lastIndexOf(' ');
String level = str.substring(spc + 1);
// Parse that
Integer lvl = SilentNumbers.IntegerParse(level);
// Not null right
if (lvl == null)
return null;
// Add that
String name = str.substring(0, spc);
return new AEListEnchantment(name, lvl);
}
private class AEListEnchantment {
@NotNull
private final String name;
private final int level;
public AEListEnchantment(@NotNull String name, int level) {
this.name = name;
this.level = level;
}
@NotNull
public String getName() {
return name;
}
public int getLevel() {
return level;
}
@Override
public String toString() {
return getName() + " " + getLevel();
}
}
}