From 3622203e323f59983a37fc4096b0be3ee219cffd Mon Sep 17 00:00:00 2001 From: Roch Blonndiaux Date: Mon, 6 Mar 2023 14:49:30 +0100 Subject: [PATCH] MMOItemType super type --- .../java/net/Indyuce/mmoitems/api/Type.java | 3 +- .../net/Indyuce/mmoitems/api/TypeSet.java | 6 + .../mmoitems/api/interaction/GemStone.java | 3 +- .../api/interaction/weapon/Weapon.java | 4 +- .../api/item/build/ItemStackBuilder.java | 7 +- .../mmoitems/api/item/type/MMOItemType.java | 23 +- .../net/Indyuce/mmoitems/gui/ItemBrowser.java | 3 +- .../gui/edition/UpgradingEdition.java | 407 +++++++------- .../Indyuce/mmoitems/listener/ItemUse.java | 34 +- .../mmoitems/manager/BlockManager.java | 12 +- .../Indyuce/mmoitems/manager/StatManager.java | 4 +- .../mmoitems/manager/TemplateManager.java | 532 +++++++++--------- .../Indyuce/mmoitems/stat/type/ItemStat.java | 7 +- 13 files changed, 542 insertions(+), 503 deletions(-) diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/Type.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/Type.java index 62c33cd8..89f47179 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/Type.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/Type.java @@ -253,7 +253,8 @@ public class Type { */ @Deprecated public boolean canHave(ItemStat stat) { - return stat.isCompatible(this); + // return stat.isCompatible(this); + return false; } private ItemStack read(String str) { diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/TypeSet.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/TypeSet.java index 8351cfb8..197c1758 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/TypeSet.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/TypeSet.java @@ -6,6 +6,7 @@ import io.lumine.mythic.lib.damage.AttackMetadata; import io.lumine.mythic.lib.damage.DamageType; import io.lumine.mythic.lib.version.VersionSound; import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.api.item.type.MMOItemType; import net.Indyuce.mmoitems.util.MMOUtils; import net.Indyuce.mmoitems.api.interaction.weapon.Weapon; import net.Indyuce.mmoitems.api.player.PlayerData; @@ -20,6 +21,11 @@ import org.bukkit.potion.PotionEffectType; import java.util.Random; +/** + * @deprecated This class is deprecated and will be removed in the next major + * update. Use {@link MMOItemType} instead. + * @see MMOItemType + */ public enum TypeSet { /** diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/interaction/GemStone.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/interaction/GemStone.java index becd0913..abdbb945 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/interaction/GemStone.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/interaction/GemStone.java @@ -2,7 +2,6 @@ package net.Indyuce.mmoitems.api.interaction; import io.lumine.mythic.lib.api.item.NBTItem; import net.Indyuce.mmoitems.ItemStats; -import net.Indyuce.mmoitems.api.Type; import net.Indyuce.mmoitems.api.event.item.ApplyGemStoneEvent; import net.Indyuce.mmoitems.api.item.mmoitem.LiveMMOItem; import net.Indyuce.mmoitems.api.item.mmoitem.MMOItem; @@ -64,7 +63,7 @@ public class GemStone extends UseItem { */ String appliableTypes = getNBTItem().getString(ItemStats.ITEM_TYPE_RESTRICTION.getNBTPath()); if (!appliableTypes.equals("") && (!targetType.isWeapon() || !appliableTypes.contains("WEAPON")) - && !appliableTypes.contains(targetType.getItemSet().name()) && !appliableTypes.contains(targetType.getId())) + && !appliableTypes.contains(targetType.getType().name()) && !appliableTypes.contains(targetType.getId())) return new ApplyResult(ResultType.NONE); // Check for success rate diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/Weapon.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/Weapon.java index f75600b0..473b13ce 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/Weapon.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/Weapon.java @@ -110,8 +110,8 @@ public class Weapon extends UseItem { return false; // Handle item set attack effects - if (getMMOItem().getType().getItemSet().hasAttackEffect() && !getNBTItem().getBoolean("MMOITEMS_DISABLE_ATTACK_PASSIVE")) - getMMOItem().getType().getItemSet().applyAttackEffect(attackMeta, playerData, target, this); + if (getMMOItem().getType().hasAttackEffect() && !getNBTItem().getBoolean("MMOITEMS_DISABLE_ATTACK_PASSIVE")) + getMMOItem().getType().applyAttackEffect(attackMeta, playerData, target, this); return true; } diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/build/ItemStackBuilder.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/build/ItemStackBuilder.java index 4a8d96ea..2869e5ff 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/build/ItemStackBuilder.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/build/ItemStackBuilder.java @@ -6,11 +6,11 @@ import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.util.AdventureUtils; import net.Indyuce.mmoitems.ItemStats; import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.Type; import net.Indyuce.mmoitems.api.event.GenerateLoreEvent; import net.Indyuce.mmoitems.api.event.ItemBuildEvent; import net.Indyuce.mmoitems.api.item.mmoitem.MMOItem; import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate; +import net.Indyuce.mmoitems.api.item.type.MMOItemType; import net.Indyuce.mmoitems.stat.DisplayName; import net.Indyuce.mmoitems.stat.Enchants; import net.Indyuce.mmoitems.stat.data.MaterialData; @@ -35,6 +35,7 @@ import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.logging.Level; +import java.util.stream.Collectors; public class ItemStackBuilder { @NotNull @@ -195,7 +196,7 @@ public class ItemStackBuilder { } // Display gem stone lore hint thing - if (builtMMOItem.getType() == Type.GEM_STONE) + if (builtMMOItem.getType().getType() == MMOItemType.Type.GEM_STONE) lore.insert("gem-stone-lore", ItemStat.translate("gem-stone-lore")); // Display item type @@ -218,7 +219,7 @@ public class ItemStackBuilder { Bukkit.getPluginManager().callEvent(event); AdventureUtils.setLore(meta, event.getParsedLore().stream() .map(s -> ChatColor.WHITE + s) - .toList()); + .collect(Collectors.toList())); if (meta.hasDisplayName()) AdventureUtils.setDisplayName(meta, ChatColor.WHITE + meta.getDisplayName()); diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/type/MMOItemType.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/type/MMOItemType.java index 6da7d46a..bc507597 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/type/MMOItemType.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/type/MMOItemType.java @@ -17,6 +17,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -30,6 +31,7 @@ public class MMOItemType { private final String id; private final String name; + private final Type type; private final ModifierSource modifierSource; private final boolean weapon; private final String loreFormat; @@ -39,9 +41,10 @@ public class MMOItemType { private final @org.jetbrains.annotations.Nullable Script script; - protected MMOItemType(String id, String name, ModifierSource modifierSource, boolean weapon, String loreFormat, ItemStack item, @org.jetbrains.annotations.Nullable Script script, List> stats) { + protected MMOItemType(String id, String name, Type type, ModifierSource modifierSource, boolean weapon, String loreFormat, ItemStack item, @org.jetbrains.annotations.Nullable Script script, List> stats) { this.id = id; this.name = name; + this.type = type; this.modifierSource = modifierSource; this.weapon = weapon; this.loreFormat = loreFormat; @@ -71,6 +74,9 @@ public class MMOItemType { return loreFormat; } + public Type getType() { + return type; + } public ItemStack getItem() { return item; @@ -125,6 +131,7 @@ public class MMOItemType { ", modifierSource=" + modifierSource + ", weapon=" + weapon + ", loreFormat='" + loreFormat + '\'' + + ", type=" + type + '}'; } @@ -173,13 +180,25 @@ public class MMOItemType { final String loreFormat = section.getString("lore-format"); final ItemStack item = read(section.getString("display", Material.STONE.toString())); final Script script = section.isString("script") ? MythicLib.plugin.getSkills().getScriptOrThrow(section.getString("script")) : null; + final Type superType = Arrays.stream(Type.values()) + .filter(type1 -> Objects.equals(section.getString("type").toLowerCase(), type1.name().toLowerCase())) + .findFirst() + .orElse(Type.NONE); // TODO: Load the stats final List> stats = new ArrayList<>(); - MMOItemType type = new MMOItemType(id, name, modifierSource, weapon, loreFormat, item, script, stats); + MMOItemType type = new MMOItemType(id, name, superType, modifierSource, weapon, loreFormat, item, script, stats); type.getUnidentifiedTemplate().update(section.getConfigurationSection("unident-item")); return type; } + + public enum Type { + GEM_STONE, + RANGE, + BLOCK, + CONSUMABLE, + NONE + } } diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/gui/ItemBrowser.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/gui/ItemBrowser.java index de1c6a84..46c48282 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/gui/ItemBrowser.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/gui/ItemBrowser.java @@ -8,7 +8,6 @@ import io.lumine.mythic.lib.api.util.ui.SilentNumbers; import io.lumine.mythic.lib.util.AdventureUtils; import io.lumine.mythic.lib.version.VersionMaterial; import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.Type; import net.Indyuce.mmoitems.api.edition.NewItemEdition; import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate; import net.Indyuce.mmoitems.api.item.type.MMOItemType; @@ -177,7 +176,7 @@ public class ItemBrowser extends PluginInventory { previousMeta.setDisplayName(ChatColor.GREEN + "Previous Page"); previous.setItemMeta(previousMeta); - if (type == Type.BLOCK) { + if (type.getType() == MMOItemType.Type.BLOCK) { ItemStack downloadPack = new ItemStack(Material.HOPPER); ItemMeta downloadMeta = downloadPack.getItemMeta(); downloadMeta.setDisplayName(ChatColor.GREEN + "Download Default Resourcepack"); diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/gui/edition/UpgradingEdition.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/gui/edition/UpgradingEdition.java index 6ba1b301..af7f8e75 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/gui/edition/UpgradingEdition.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/gui/edition/UpgradingEdition.java @@ -1,14 +1,14 @@ package net.Indyuce.mmoitems.gui.edition; -import net.Indyuce.mmoitems.ItemStats; -import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.util.MMOUtils; -import net.Indyuce.mmoitems.api.Type; -import net.Indyuce.mmoitems.api.edition.StatEdition; -import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate; -import net.Indyuce.mmoitems.api.item.util.NamedItemStack; import io.lumine.mythic.lib.api.util.AltChar; import io.lumine.mythic.lib.version.VersionMaterial; +import net.Indyuce.mmoitems.ItemStats; +import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.api.edition.StatEdition; +import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate; +import net.Indyuce.mmoitems.api.item.type.MMOItemType; +import net.Indyuce.mmoitems.api.item.util.NamedItemStack; +import net.Indyuce.mmoitems.util.MMOUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -24,227 +24,226 @@ import java.util.ArrayList; import java.util.List; public class UpgradingEdition extends EditionInventory { - private static final ItemStack notAvailable = new NamedItemStack(VersionMaterial.RED_STAINED_GLASS_PANE.toMaterial(), "&cNot Available"); + private static final ItemStack notAvailable = new NamedItemStack(VersionMaterial.RED_STAINED_GLASS_PANE.toMaterial(), "&cNot Available"); - public UpgradingEdition(Player player, MMOItemTemplate template) { - super(player, template); - } + public UpgradingEdition(Player player, MMOItemTemplate template) { + super(player, template); + } - @Override - public Inventory getInventory() { - Inventory inv = Bukkit.createInventory(this, 54, "Upgrade Setup: " + template.getId()); + @Override + public Inventory getInventory() { + Inventory inv = Bukkit.createInventory(this, 54, "Upgrade Setup: " + template.getId()); - boolean workbench = getEditedSection().getBoolean("upgrade.workbench"); - if (!template.getType().corresponds(Type.CONSUMABLE)) { + boolean workbench = getEditedSection().getBoolean("upgrade.workbench"); + if (template.getType().getType() != MMOItemType.Type.CONSUMABLE) { + ItemStack workbenchItem = new ItemStack(VersionMaterial.CRAFTING_TABLE.toMaterial()); + ItemMeta workbenchItemMeta = workbenchItem.getItemMeta(); + workbenchItemMeta.setDisplayName(ChatColor.GREEN + "Workbench Upgrade Only?"); + List workbenchItemLore = new ArrayList<>(); + workbenchItemLore.add(ChatColor.GRAY + "When toggled on, players must"); + workbenchItemLore.add(ChatColor.GRAY + "use a crafting station recipe in"); + workbenchItemLore.add(ChatColor.GRAY + "order to upgrade their weapon."); + workbenchItemLore.add(""); + workbenchItemLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GOLD + workbench); + workbenchItemLore.add(""); + workbenchItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to change this value."); + workbenchItemMeta.setLore(workbenchItemLore); + workbenchItem.setItemMeta(workbenchItemMeta); + inv.setItem(20, workbenchItem); - ItemStack workbenchItem = new ItemStack(VersionMaterial.CRAFTING_TABLE.toMaterial()); - ItemMeta workbenchItemMeta = workbenchItem.getItemMeta(); - workbenchItemMeta.setDisplayName(ChatColor.GREEN + "Workbench Upgrade Only?"); - List workbenchItemLore = new ArrayList<>(); - workbenchItemLore.add(ChatColor.GRAY + "When toggled on, players must"); - workbenchItemLore.add(ChatColor.GRAY + "use a crafting station recipe in"); - workbenchItemLore.add(ChatColor.GRAY + "order to upgrade their weapon."); - workbenchItemLore.add(""); - workbenchItemLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GOLD + workbench); - workbenchItemLore.add(""); - workbenchItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to change this value."); - workbenchItemMeta.setLore(workbenchItemLore); - workbenchItem.setItemMeta(workbenchItemMeta); - inv.setItem(20, workbenchItem); + String upgradeTemplate = getEditedSection().getString("upgrade.template"); + ItemStack templateItem = new ItemStack(VersionMaterial.OAK_SIGN.toMaterial()); + ItemMeta templateItemMeta = templateItem.getItemMeta(); + templateItemMeta.setDisplayName(ChatColor.GREEN + "Upgrade Template"); + List templateItemLore = new ArrayList<>(); + templateItemLore.add(ChatColor.GRAY + "This option dictates what stats are improved"); + templateItemLore.add(ChatColor.GRAY + "when your item is upgraded. More info on the wiki."); + templateItemLore.add(""); + templateItemLore.add(ChatColor.GRAY + "Current Value: " + + (upgradeTemplate == null ? ChatColor.RED + "No template" : ChatColor.GOLD + upgradeTemplate)); + templateItemLore.add(""); + templateItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to input the template."); + templateItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); + templateItemMeta.setLore(templateItemLore); + templateItem.setItemMeta(templateItemMeta); + inv.setItem(22, templateItem); - String upgradeTemplate = getEditedSection().getString("upgrade.template"); - ItemStack templateItem = new ItemStack(VersionMaterial.OAK_SIGN.toMaterial()); - ItemMeta templateItemMeta = templateItem.getItemMeta(); - templateItemMeta.setDisplayName(ChatColor.GREEN + "Upgrade Template"); - List templateItemLore = new ArrayList<>(); - templateItemLore.add(ChatColor.GRAY + "This option dictates what stats are improved"); - templateItemLore.add(ChatColor.GRAY + "when your item is upgraded. More info on the wiki."); - templateItemLore.add(""); - templateItemLore.add(ChatColor.GRAY + "Current Value: " - + (upgradeTemplate == null ? ChatColor.RED + "No template" : ChatColor.GOLD + upgradeTemplate)); - templateItemLore.add(""); - templateItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to input the template."); - templateItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); - templateItemMeta.setLore(templateItemLore); - templateItem.setItemMeta(templateItemMeta); - inv.setItem(22, templateItem); + int max = getEditedSection().getInt("upgrade.max"); + ItemStack maxItem = new ItemStack(Material.BARRIER); + ItemMeta maxItemMeta = maxItem.getItemMeta(); + maxItemMeta.setDisplayName(ChatColor.GREEN + "Max Upgrades"); + List maxItemLore = new ArrayList<>(); + maxItemLore.add(ChatColor.GRAY + "The maximum amount of upgrades your"); + maxItemLore.add(ChatColor.GRAY + "item may receive (recipe or consumable)."); + maxItemLore.add(""); + maxItemLore.add(ChatColor.GRAY + "Current Value: " + (max == 0 ? ChatColor.RED + "No limit" : ChatColor.GOLD + "" + max)); + maxItemLore.add(""); + maxItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to chance this value."); + maxItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); + maxItemMeta.setLore(maxItemLore); + maxItem.setItemMeta(maxItemMeta); + inv.setItem(40, maxItem); - int max = getEditedSection().getInt("upgrade.max"); - ItemStack maxItem = new ItemStack(Material.BARRIER); - ItemMeta maxItemMeta = maxItem.getItemMeta(); - maxItemMeta.setDisplayName(ChatColor.GREEN + "Max Upgrades"); - List maxItemLore = new ArrayList<>(); - maxItemLore.add(ChatColor.GRAY + "The maximum amount of upgrades your"); - maxItemLore.add(ChatColor.GRAY + "item may receive (recipe or consumable)."); - maxItemLore.add(""); - maxItemLore.add(ChatColor.GRAY + "Current Value: " + (max == 0 ? ChatColor.RED + "No limit" : ChatColor.GOLD + "" + max)); - maxItemLore.add(""); - maxItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to chance this value."); - maxItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); - maxItemMeta.setLore(maxItemLore); - maxItem.setItemMeta(maxItemMeta); - inv.setItem(40, maxItem); + int min = getEditedSection().getInt("upgrade.min", 0); + ItemStack minItem = new ItemStack(Material.BARRIER); + ItemMeta minItemMeta = minItem.getItemMeta(); + minItemMeta.setDisplayName(ChatColor.GREEN + "Min Upgrades"); + List minItemLore = new ArrayList<>(); + minItemLore.add(ChatColor.GRAY + "The minimum level your item can be"); + minItemLore.add(ChatColor.GRAY + "downgraded to (by dying or breaking)."); + minItemLore.add(""); + minItemLore.add(ChatColor.GRAY + "Current Value: " + (min == 0 ? ChatColor.RED + "0" : ChatColor.GOLD + String.valueOf(min))); + minItemLore.add(""); + minItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to chance this value."); + minItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); + minItemMeta.setLore(minItemLore); + minItem.setItemMeta(minItemMeta); + inv.setItem(41, minItem); + } else { + inv.setItem(20, notAvailable); + inv.setItem(22, notAvailable); + } - int min = getEditedSection().getInt("upgrade.min", 0); - ItemStack minItem = new ItemStack(Material.BARRIER); - ItemMeta minItemMeta = minItem.getItemMeta(); - minItemMeta.setDisplayName(ChatColor.GREEN + "Min Upgrades"); - List minItemLore = new ArrayList<>(); - minItemLore.add(ChatColor.GRAY + "The minimum level your item can be"); - minItemLore.add(ChatColor.GRAY + "downgraded to (by dying or breaking)."); - minItemLore.add(""); - minItemLore.add(ChatColor.GRAY + "Current Value: " + (min == 0 ? ChatColor.RED + "0" : ChatColor.GOLD + String.valueOf(min))); - minItemLore.add(""); - minItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to chance this value."); - minItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); - minItemMeta.setLore(minItemLore); - minItem.setItemMeta(minItemMeta); - inv.setItem(41, minItem); - } else { - inv.setItem(20, notAvailable); - inv.setItem(22, notAvailable); - } + if (!workbench || template.getType().getType() == MMOItemType.Type.CONSUMABLE) { - if (!workbench || template.getType().corresponds(Type.CONSUMABLE)) { + String reference = getEditedSection().getString("upgrade.reference"); + ItemStack referenceItem = new ItemStack(Material.PAPER); + ItemMeta referenceItemMeta = referenceItem.getItemMeta(); + referenceItemMeta.setDisplayName(ChatColor.GREEN + "Upgrade Reference"); + List referenceItemLore = new ArrayList<>(); + referenceItemLore.add(ChatColor.GRAY + "This option dictates what consumables can"); + referenceItemLore.add(ChatColor.GRAY + "upgrade your item. " + ChatColor.AQUA + "The consumable upgrade"); + referenceItemLore.add(ChatColor.AQUA + "reference must match your item's reference" + ChatColor.GRAY + ","); + referenceItemLore.add(ChatColor.GRAY + "otherwise it can't upgrade it. Leave this blank"); + referenceItemLore.add(ChatColor.GRAY + "so any consumable can upgrade this item."); + referenceItemLore.add(""); + referenceItemLore + .add(ChatColor.GRAY + "Current Value: " + (reference == null ? ChatColor.RED + "No reference" : ChatColor.GOLD + reference)); + referenceItemLore.add(""); + referenceItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to input the reference."); + referenceItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); + referenceItemMeta.setLore(referenceItemLore); + referenceItem.setItemMeta(referenceItemMeta); + inv.setItem(38, referenceItem); + } else + inv.setItem(38, notAvailable); - String reference = getEditedSection().getString("upgrade.reference"); - ItemStack referenceItem = new ItemStack(Material.PAPER); - ItemMeta referenceItemMeta = referenceItem.getItemMeta(); - referenceItemMeta.setDisplayName(ChatColor.GREEN + "Upgrade Reference"); - List referenceItemLore = new ArrayList<>(); - referenceItemLore.add(ChatColor.GRAY + "This option dictates what consumables can"); - referenceItemLore.add(ChatColor.GRAY + "upgrade your item. " + ChatColor.AQUA + "The consumable upgrade"); - referenceItemLore.add(ChatColor.AQUA + "reference must match your item's reference" + ChatColor.GRAY + ","); - referenceItemLore.add(ChatColor.GRAY + "otherwise it can't upgrade it. Leave this blank"); - referenceItemLore.add(ChatColor.GRAY + "so any consumable can upgrade this item."); - referenceItemLore.add(""); - referenceItemLore - .add(ChatColor.GRAY + "Current Value: " + (reference == null ? ChatColor.RED + "No reference" : ChatColor.GOLD + reference)); - referenceItemLore.add(""); - referenceItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to input the reference."); - referenceItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); - referenceItemMeta.setLore(referenceItemLore); - referenceItem.setItemMeta(referenceItemMeta); - inv.setItem(38, referenceItem); - } else - inv.setItem(38, notAvailable); + double success = getEditedSection().getDouble("upgrade.success"); + ItemStack successItem = new ItemStack(VersionMaterial.EXPERIENCE_BOTTLE.toMaterial()); + ItemMeta successItemMeta = successItem.getItemMeta(); + successItemMeta.setDisplayName(ChatColor.GREEN + "Success Chance"); + List successItemLore = new ArrayList<>(); + successItemLore.add(ChatColor.GRAY + "The chance of successfully upgrading"); + successItemLore.add(ChatColor.GRAY + "when using a consumable or when using"); + successItemLore.add(ChatColor.GRAY + "a station upgrading recipe."); + successItemLore.add(""); + successItemLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GOLD + (success == 0 ? "100" : "" + success) + "%"); + successItemLore.add(""); + successItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Left click to change this value."); + successItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); + successItemMeta.setLore(successItemLore); + successItem.setItemMeta(successItemMeta); + inv.setItem(24, successItem); - double success = getEditedSection().getDouble("upgrade.success"); - ItemStack successItem = new ItemStack(VersionMaterial.EXPERIENCE_BOTTLE.toMaterial()); - ItemMeta successItemMeta = successItem.getItemMeta(); - successItemMeta.setDisplayName(ChatColor.GREEN + "Success Chance"); - List successItemLore = new ArrayList<>(); - successItemLore.add(ChatColor.GRAY + "The chance of successfully upgrading"); - successItemLore.add(ChatColor.GRAY + "when using a consumable or when using"); - successItemLore.add(ChatColor.GRAY + "a station upgrading recipe."); - successItemLore.add(""); - successItemLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GOLD + (success == 0 ? "100" : "" + success) + "%"); - successItemLore.add(""); - successItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Left click to change this value."); - successItemLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to reset."); - successItemMeta.setLore(successItemLore); - successItem.setItemMeta(successItemMeta); - inv.setItem(24, successItem); + if (success > 0 && template.getType().getType() != MMOItemType.Type.CONSUMABLE) { + ItemStack destroyOnFail = new ItemStack(Material.FISHING_ROD); + ItemMeta destroyOnFailMeta = destroyOnFail.getItemMeta(); + ((Damageable) destroyOnFailMeta).setDamage(30); + destroyOnFailMeta.setDisplayName(ChatColor.GREEN + "Destroy on fail?"); + List destroyOnFailLore = new ArrayList<>(); + destroyOnFailLore.add(ChatColor.GRAY + "When toggled on, the item will be"); + destroyOnFailLore.add(ChatColor.GRAY + "destroyed when failing at upgrading it."); + destroyOnFailLore.add(""); + destroyOnFailLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GOLD + getEditedSection().getBoolean("upgrade.destroy")); + destroyOnFailLore.add(""); + destroyOnFailLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to change this value."); + destroyOnFailMeta.setLore(destroyOnFailLore); + destroyOnFail.setItemMeta(destroyOnFailMeta); + inv.setItem(42, destroyOnFail); + } - if (success > 0 && !template.getType().corresponds(Type.CONSUMABLE)) { - ItemStack destroyOnFail = new ItemStack(Material.FISHING_ROD); - ItemMeta destroyOnFailMeta = destroyOnFail.getItemMeta(); - ((Damageable) destroyOnFailMeta).setDamage(30); - destroyOnFailMeta.setDisplayName(ChatColor.GREEN + "Destroy on fail?"); - List destroyOnFailLore = new ArrayList<>(); - destroyOnFailLore.add(ChatColor.GRAY + "When toggled on, the item will be"); - destroyOnFailLore.add(ChatColor.GRAY + "destroyed when failing at upgrading it."); - destroyOnFailLore.add(""); - destroyOnFailLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GOLD + getEditedSection().getBoolean("upgrade.destroy")); - destroyOnFailLore.add(""); - destroyOnFailLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to change this value."); - destroyOnFailMeta.setLore(destroyOnFailLore); - destroyOnFail.setItemMeta(destroyOnFailMeta); - inv.setItem(42, destroyOnFail); - } + addEditionInventoryItems(inv, true); - addEditionInventoryItems(inv, true); + return inv; + } - return inv; - } + @Override + public void whenClicked(InventoryClickEvent event) { + ItemStack item = event.getCurrentItem(); - @Override - public void whenClicked(InventoryClickEvent event) { - ItemStack item = event.getCurrentItem(); + event.setCancelled(true); + if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false)) + return; - event.setCancelled(true); - if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false)) - return; + if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Success Chance")) { + if (event.getAction() == InventoryAction.PICKUP_ALL) + new StatEdition(this, ItemStats.UPGRADE, "rate").enable("Write in the chat the success rate you want."); - if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Success Chance")) { - if (event.getAction() == InventoryAction.PICKUP_ALL) - new StatEdition(this, ItemStats.UPGRADE, "rate").enable("Write in the chat the success rate you want."); + if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.success")) { + getEditedSection().set("upgrade.success", null); + registerTemplateEdition(); + player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset success chance."); + } + } - if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.success")) { - getEditedSection().set("upgrade.success", null); - registerTemplateEdition(); - player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset success chance."); - } - } + if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Max Upgrades")) { + if (event.getAction() == InventoryAction.PICKUP_ALL) + new StatEdition(this, ItemStats.UPGRADE, "max").enable("Write in the chat the number you want."); - if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Max Upgrades")) { - if (event.getAction() == InventoryAction.PICKUP_ALL) - new StatEdition(this, ItemStats.UPGRADE, "max").enable("Write in the chat the number you want."); + if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.max")) { + getEditedSection().set("upgrade.max", null); + registerTemplateEdition(); + player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset the number of max upgrades."); + } + } - if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.max")) { - getEditedSection().set("upgrade.max", null); - registerTemplateEdition(); - player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset the number of max upgrades."); - } - } + if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Min Upgrades")) { + if (event.getAction() == InventoryAction.PICKUP_ALL) + new StatEdition(this, ItemStats.UPGRADE, "min").enable("Write in the chat the number you want."); - if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Min Upgrades")) { - if (event.getAction() == InventoryAction.PICKUP_ALL) - new StatEdition(this, ItemStats.UPGRADE, "min").enable("Write in the chat the number you want."); + if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.min")) { + getEditedSection().set("upgrade.min", null); + registerTemplateEdition(); + player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset the number of min level."); + } + } - if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.min")) { - getEditedSection().set("upgrade.min", null); - registerTemplateEdition(); - player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset the number of min level."); - } - } + if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Upgrade Template")) { + if (event.getAction() == InventoryAction.PICKUP_ALL) + new StatEdition(this, ItemStats.UPGRADE, "template").enable("Write in the chat the upgrade template ID you want."); - if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Upgrade Template")) { - if (event.getAction() == InventoryAction.PICKUP_ALL) - new StatEdition(this, ItemStats.UPGRADE, "template").enable("Write in the chat the upgrade template ID you want."); + if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.template")) { + getEditedSection().set("upgrade.template", null); + registerTemplateEdition(); + player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset upgrade template."); + } + } - if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.template")) { - getEditedSection().set("upgrade.template", null); - registerTemplateEdition(); - player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset upgrade template."); - } - } + if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Upgrade Reference")) { + if (event.getAction() == InventoryAction.PICKUP_ALL) + new StatEdition(this, ItemStats.UPGRADE, "ref").enable("Write in the chat the upgrade reference (text) you want."); - if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Upgrade Reference")) { - if (event.getAction() == InventoryAction.PICKUP_ALL) - new StatEdition(this, ItemStats.UPGRADE, "ref").enable("Write in the chat the upgrade reference (text) you want."); + if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.reference")) { + getEditedSection().set("upgrade.reference", null); + registerTemplateEdition(); + player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset upgrade reference."); + } + } - if (event.getAction() == InventoryAction.PICKUP_HALF && getEditedSection().contains("upgrade.reference")) { - getEditedSection().set("upgrade.reference", null); - registerTemplateEdition(); - player.sendMessage(MMOItems.plugin.getPrefix() + "Successfully reset upgrade reference."); - } - } + if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Workbench Upgrade Only?")) { + boolean bool = !getEditedSection().getBoolean("upgrade.workbench"); + getEditedSection().set("upgrade.workbench", bool); + registerTemplateEdition(); + player.sendMessage(MMOItems.plugin.getPrefix() + + (bool ? "Your item must now be upgraded via recipes." : "Your item can now be upgraded using consumables.")); + } - if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Workbench Upgrade Only?")) { - boolean bool = !getEditedSection().getBoolean("upgrade.workbench"); - getEditedSection().set("upgrade.workbench", bool); - registerTemplateEdition(); - player.sendMessage(MMOItems.plugin.getPrefix() - + (bool ? "Your item must now be upgraded via recipes." : "Your item can now be upgraded using consumables.")); - } - - if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Destroy on fail?")) { - boolean bool = !getEditedSection().getBoolean("upgrade.destroy"); - getEditedSection().set("upgrade.destroy", bool); - registerTemplateEdition(); - player.sendMessage(MMOItems.plugin.getPrefix() - + (bool ? "Your item will be destroyed upon failing upgrade." : "Your item will not be destroyed upon failing upgrade.")); - } - } + if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Destroy on fail?")) { + boolean bool = !getEditedSection().getBoolean("upgrade.destroy"); + getEditedSection().set("upgrade.destroy", bool); + registerTemplateEdition(); + player.sendMessage(MMOItems.plugin.getPrefix() + + (bool ? "Your item will be destroyed upon failing upgrade." : "Your item will not be destroyed upon failing upgrade.")); + } + } } \ No newline at end of file diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java index 57622d95..679f962c 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java @@ -9,7 +9,6 @@ import io.lumine.mythic.lib.comp.interaction.InteractionType; import io.lumine.mythic.lib.damage.MeleeAttackMetadata; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.api.Type; -import net.Indyuce.mmoitems.api.TypeSet; import net.Indyuce.mmoitems.api.event.item.SpecialWeaponAttackEvent; import net.Indyuce.mmoitems.api.interaction.*; import net.Indyuce.mmoitems.api.interaction.weapon.Gauntlet; @@ -109,7 +108,6 @@ public class ItemUse implements Listener { @EventHandler(ignoreCancelled = true) public void meleeAttacks(PlayerAttackEvent event) { - // Checks if it's a melee attack if (!(event.getAttack() instanceof MeleeAttackMetadata)) return; @@ -123,24 +121,24 @@ public class ItemUse implements Listener { ItemStack weaponUsed = player.getInventory().getItem(((MeleeAttackMetadata) event.getAttack()).getHand().toBukkit()); NBTItem item = MythicLib.plugin.getVersion().getWrapper().getNBTItem(weaponUsed); - if (item.hasType() && Type.get(item.getType()) != Type.BLOCK) { - Weapon weapon = new Weapon(playerData, item); + if (!item.hasType() + || MMOItemType.get(item.getType()) == null + || MMOItemType.get(item.getType()).getType() == MMOItemType.Type.BLOCK) + return; + Weapon weapon = new Weapon(playerData, item); - if (weapon.getMMOItem().getType().getItemSet() == TypeSet.RANGE) { - event.setCancelled(true); - return; - } - - if (!weapon.checkItemRequirements()) { - event.setCancelled(true); - return; - } - - if (!weapon.handleTargetedAttack(event.getAttack(), event.getEntity())) { - event.setCancelled(true); - return; - } + if (weapon.getMMOItem().getType().getType() == MMOItemType.Type.RANGE) { + event.setCancelled(true); + return; } + + if (!weapon.checkItemRequirements()) { + event.setCancelled(true); + return; + } + + if (!weapon.handleTargetedAttack(event.getAttack(), event.getEntity())) + event.setCancelled(true); } /** diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/BlockManager.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/BlockManager.java index 5e8b4d22..fbb04df3 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/BlockManager.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/BlockManager.java @@ -2,10 +2,10 @@ package net.Indyuce.mmoitems.manager; import net.Indyuce.mmoitems.ItemStats; import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.Type; import net.Indyuce.mmoitems.api.block.CustomBlock; import net.Indyuce.mmoitems.api.item.mmoitem.MMOItem; import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate; +import net.Indyuce.mmoitems.api.item.type.MMOItemType; import net.Indyuce.mmoitems.api.util.MushroomState; import net.Indyuce.mmoitems.stat.data.DoubleData; import org.bukkit.Material; @@ -13,13 +13,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.MultipleFacing; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.logging.Level; public class BlockManager implements Reloadable { @@ -109,7 +103,7 @@ public class BlockManager implements Reloadable { customBlocks.clear(); mushroomStateValue.clear(); - for (MMOItemTemplate template : MMOItems.plugin.getTemplates().getTemplates(Type.BLOCK)) { + for (MMOItemTemplate template : MMOItems.plugin.getTemplates().getTemplates(MMOItemType.Type.BLOCK)) { MMOItem mmoitem = template.newBuilder(0, null).build(); int id = mmoitem.hasData(ItemStats.BLOCK_ID) ? (int) ((DoubleData) mmoitem.getData(ItemStats.BLOCK_ID)).getValue() : 0; if (id > 0 && id < 161 && id != 54) diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/StatManager.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/StatManager.java index 9648a0f9..f63f25a4 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/StatManager.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/StatManager.java @@ -5,7 +5,7 @@ import io.lumine.mythic.lib.element.Element; import net.Indyuce.mmoitems.ItemStats; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.api.ConfigFile; -import net.Indyuce.mmoitems.api.Type; +import net.Indyuce.mmoitems.api.item.type.MMOItemType; import net.Indyuce.mmoitems.stat.type.*; import net.Indyuce.mmoitems.util.ElementStatType; import org.apache.commons.lang3.Validate; @@ -172,7 +172,7 @@ public class StatManager { stats.put(stat.getId(), stat); - if (stat instanceof DoubleStat && !(stat instanceof GemStoneStat) && stat.isCompatible(Type.GEM_STONE)) + if (stat instanceof DoubleStat && !(stat instanceof GemStoneStat) && stat.isCompatible(MMOItemType.Type.GEM_STONE)) numeric.add((DoubleStat) stat); if (stat instanceof ItemRestriction) diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/TemplateManager.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/TemplateManager.java index 41d60f1b..ef76c3bb 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/TemplateManager.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/TemplateManager.java @@ -25,303 +25,321 @@ import java.util.stream.Collectors; public class TemplateManager implements Reloadable { - /* - * registered mmoitem templates - */ - private final TemplateMap templates = new TemplateMap<>(); + /* + * registered mmoitem templates + */ + private final TemplateMap templates = new TemplateMap<>(); - /* - * bank of item modifiers which can be used anywhere in generation templates - * to make item generation easier. - */ - private final Map modifiers = new HashMap<>(); + /* + * bank of item modifiers which can be used anywhere in generation templates + * to make item generation easier. + */ + private final Map modifiers = new HashMap<>(); - private static final Random random = new Random(); + private static final Random random = new Random(); - /** - * @param type The MMOItem Type - * @param id The MMOItem ID - * - * @return If these two Strings represent a loaded MMOItem Template - */ - public boolean hasTemplate(@Nullable MMOItemType type, @Nullable String id) { - if (type == null || id == null) { return false; } - return templates.hasValue(type, id); - } + /** + * @param type The MMOItem Type + * @param id The MMOItem ID + * @return If these two Strings represent a loaded MMOItem Template + */ + public boolean hasTemplate(@Nullable MMOItemType type, @Nullable String id) { + if (type == null || id == null) { + return false; + } + return templates.hasValue(type, id); + } - /** - * @param nbt The 'processed' ItemStack you are trying to read. - * - * @return If there is a MMOItem Template information in this NBTItem - */ - public boolean hasTemplate(@Nullable NBTItem nbt) { - if (nbt == null) { return false; } - return hasTemplate(MMOItemType.get(nbt.getType()), nbt.getString("MMOITEMS_ITEM_ID")); - } + /** + * @param nbt The 'processed' ItemStack you are trying to read. + * @return If there is a MMOItem Template information in this NBTItem + */ + public boolean hasTemplate(@Nullable NBTItem nbt) { + if (nbt == null) { + return false; + } + return hasTemplate(MMOItemType.get(nbt.getType()), nbt.getString("MMOITEMS_ITEM_ID")); + } - /** - * Gets the template of such type and ID - * - * @param type Type of MMOItem - * @param id ID of MMOItem - * - * @return A template of these qualifications if it found them, - */ - @Nullable - @Contract("_, null -> null") - public MMOItemTemplate getTemplate(@Nullable MMOItemType type, @Nullable String id) { - if (type == null || id == null) return null; - return templates.getValue(type, id); - } + /** + * Gets the template of such type and ID + * + * @param type Type of MMOItem + * @param id ID of MMOItem + * @return A template of these qualifications if it found them, + */ + @Nullable + @Contract("_, null -> null") + public MMOItemTemplate getTemplate(@Nullable MMOItemType type, @Nullable String id) { + if (type == null || id == null) return null; + return templates.getValue(type, id); + } - /** - * Attempts to get the Item Template of this Item Stack. - * - * @param nbt The NBTItem you are trying to read. - * - * @return The MMOItem Template parent of it, if it has any. - */ - @Nullable - @Contract("null -> null") - public MMOItemTemplate getTemplate(@Nullable NBTItem nbt) { - if (nbt == null) return null; - return getTemplate(MMOItemType.get(nbt.getType()), nbt.getString("MMOITEMS_ITEM_ID")); - } + /** + * Attempts to get the Item Template of this Item Stack. + * + * @param nbt The NBTItem you are trying to read. + * @return The MMOItem Template parent of it, if it has any. + */ + @Nullable + @Contract("null -> null") + public MMOItemTemplate getTemplate(@Nullable NBTItem nbt) { + if (nbt == null) return null; + return getTemplate(MMOItemType.get(nbt.getType()), nbt.getString("MMOITEMS_ITEM_ID")); + } + + /** + * Used in class constructors to easily + * + * @param type The item type + * @param id The item ID + * @return MMOItem template if it exists, or throws an IAE otherwise + */ + @NotNull + @Contract("_, null -> fail") + public MMOItemTemplate getTemplateOrThrow(@Nullable MMOItemType type, @Nullable String id) { + Validate.isTrue(type != null && hasTemplate(type, id), "Could not find a template with ID '" + id + "'"); + return templates.getValue(type, id); + } + + @NotNull + public Collection getTemplates(@NotNull MMOItemType type) { + return templates.collectValues(type); + } - /** - * Used in class constructors to easily - * - * @param type The item type - * @param id The item ID - * @return MMOItem template if it exists, or throws an IAE otherwise - */ @NotNull - @Contract("_, null -> fail") - public MMOItemTemplate getTemplateOrThrow(@Nullable MMOItemType type, @Nullable String id) { - Validate.isTrue(type != null && hasTemplate(type, id), "Could not find a template with ID '" + id + "'"); - return templates.getValue(type, id); - } - - @NotNull public Collection getTemplates(@NotNull MMOItemType type) { - return templates.collectValues(type); - } - - @NotNull public List getTemplateNames(@NotNull MMOItemType type) { - return this.templates.collectValues(type) + public List getTemplates(@NotNull MMOItemType.Type type) { + return templates.collectValues() .stream() - .map(MMOItemTemplate::getId) + .filter(template -> template.getType().getType() == type) .collect(Collectors.toList()); } - /** - * Registers an MMOItem template internally. Can be done at any time - * - * @param template Template to register - */ - public void registerTemplate(@NotNull MMOItemTemplate template) { - Validate.notNull(template, "MMOItem template cannot be null"); + @NotNull + public List getTemplateNames(@NotNull MMOItemType type) { + return this.templates.collectValues(type) + .stream() + .map(MMOItemTemplate::getId) + .collect(Collectors.toList()); + } - templates.setValue(template.getType(), template.getId(), template); - } + /** + * Registers an MMOItem template internally. Can be done at any time + * + * @param template Template to register + */ + public void registerTemplate(@NotNull MMOItemTemplate template) { + Validate.notNull(template, "MMOItem template cannot be null"); - /** - * Unregisters a template from mmoitem registery. Must be used when an item - * is removed from the config files. Also disables the dynamic updater for - * that item - * - * @param type The item type - * @param id The item ID - */ - public void unregisterTemplate(@NotNull MMOItemType type, @NotNull String id) { - templates.removeValue(type, id); - } + templates.setValue(template.getType(), template.getId(), template); + } - /** - * Unregisters a template from mmoitem registery and clears it from the - * config file - * - * @param type The item type - * @param id The item ID - */ - public void deleteTemplate(@NotNull MMOItemType type, @NotNull String id) { - unregisterTemplate(type, id); + /** + * Unregisters a template from mmoitem registery. Must be used when an item + * is removed from the config files. Also disables the dynamic updater for + * that item + * + * @param type The item type + * @param id The item ID + */ + public void unregisterTemplate(@NotNull MMOItemType type, @NotNull String id) { + templates.removeValue(type, id); + } - ConfigFile config = type.getConfigFile(); - config.getConfig().set(id, null); - config.save(); - } + /** + * Unregisters a template from mmoitem registery and clears it from the + * config file + * + * @param type The item type + * @param id The item ID + */ + public void deleteTemplate(@NotNull MMOItemType type, @NotNull String id) { + unregisterTemplate(type, id); - /** - * Used whenever an item is created or edited through the GUI edition. This - * method unregisters the current template and loads it again from the - * configuration file. - * - * Can also be used right after creating a template after the config file - * has been initialized in order to load the newly created item - * - * @param type The item type - * @param id The item ID - */ - @SuppressWarnings("UnusedReturnValue") - public MMOItemTemplate requestTemplateUpdate(@NotNull MMOItemType type, @NotNull String id) { - templates.removeValue(type, id); + ConfigFile config = type.getConfigFile(); + config.getConfig().set(id, null); + config.save(); + } - try { - MMOItemTemplate template = new MMOItemTemplate(type, type.getConfigFile().getConfig().getConfigurationSection(id)); - template.postLoad(); - registerTemplate(template); - return template; + /** + * Used whenever an item is created or edited through the GUI edition. This + * method unregisters the current template and loads it again from the + * configuration file. + *

+ * Can also be used right after creating a template after the config file + * has been initialized in order to load the newly created item + * + * @param type The item type + * @param id The item ID + */ + @SuppressWarnings("UnusedReturnValue") + public MMOItemTemplate requestTemplateUpdate(@NotNull MMOItemType type, @NotNull String id) { + templates.removeValue(type, id); - } catch (IllegalArgumentException exception) { - MMOItems.plugin.getLogger().log(Level.INFO, - "An error occurred while trying to reload item gen template '" + id + "': " + exception.getMessage()); - return null; - } - } + try { + MMOItemTemplate template = new MMOItemTemplate(type, type.getConfigFile().getConfig().getConfigurationSection(id)); + template.postLoad(); + registerTemplate(template); + return template; - /** - * @return Collects all existing mmoitem templates into a set so that it can - * be filtered afterwards to generate random loot - */ - public Collection collectTemplates() { return templates.collectValues(); } + } catch (IllegalArgumentException exception) { + MMOItems.plugin.getLogger().log(Level.INFO, + "An error occurred while trying to reload item gen template '" + id + "': " + exception.getMessage()); + return null; + } + } - public boolean hasModifier(String id) { return modifiers.containsKey(id); } + /** + * @return Collects all existing mmoitem templates into a set so that it can + * be filtered afterwards to generate random loot + */ + public Collection collectTemplates() { + return templates.collectValues(); + } - public TemplateModifier getModifier(String id) { return modifiers.get(id); } + public boolean hasModifier(String id) { + return modifiers.containsKey(id); + } - public Collection getModifiers() { return modifiers.values(); } + public TemplateModifier getModifier(String id) { + return modifiers.get(id); + } - public ItemTier rollTier() { + public Collection getModifiers() { + return modifiers.values(); + } - double s = 0; - for (ItemTier tier : MMOItems.plugin.getTiers().getAll()) { - if (s >= 1 || random.nextDouble() < tier.getGenerationChance() / (1 - s)) - return tier; + public ItemTier rollTier() { - s += tier.getGenerationChance(); - } + double s = 0; + for (ItemTier tier : MMOItems.plugin.getTiers().getAll()) { + if (s >= 1 || random.nextDouble() < tier.getGenerationChance() / (1 - s)) + return tier; - // default tier - return null; - } + s += tier.getGenerationChance(); + } - /** - * @param playerLevel Input player level - * @return Generates a randomly chosen item level. The level - * spread (editable in the main config file) - * corresponding to the standard deviation of a gaussian - * distribution centered on the player level (input) - */ - public int rollLevel(int playerLevel) { - double spread = MMOItems.plugin.getLanguage().levelSpread; - double found = random.nextGaussian() * spread * .7 + playerLevel; + // default tier + return null; + } - // must be in [level - spread, level + spread] - // lower bound must be higher than 1 - found = Math.max(Math.min(found, playerLevel + spread), Math.max(1, playerLevel - spread)); + /** + * @param playerLevel Input player level + * @return Generates a randomly chosen item level. The level + * spread (editable in the main config file) + * corresponding to the standard deviation of a gaussian + * distribution centered on the player level (input) + */ + public int rollLevel(int playerLevel) { + double spread = MMOItems.plugin.getLanguage().levelSpread; + double found = random.nextGaussian() * spread * .7 + playerLevel; - return (int) found; - } + // must be in [level - spread, level + spread] + // lower bound must be higher than 1 + found = Math.max(Math.min(found, playerLevel + spread), Math.max(1, playerLevel - spread)); - /** - * Templates must be loaded whenever MMOItems enables so that other plugins - * like MMOCore can load template references in drop items or other objects. - * Template data is only loaded when MMOItems enables, once sets, tiers.. - * are initialized - */ - public void preloadTemplates() { - for (MMOItemType type : MMOItems.plugin.getTypes().getAll()) { - FileConfiguration config = type.getConfigFile().getConfig(); - for (String key : config.getKeys(false)) - try { - registerTemplate(new MMOItemTemplate(type, config.getConfigurationSection(key))); - } catch (IllegalArgumentException exception) { - MMOItems.plugin.getLogger().log(Level.INFO, "Could not preload item template '" + key + "': " + exception.getMessage()); - } - } - } + return (int) found; + } - /** - * Loads item generator modifiers and post load item templates. - */ - public void postloadTemplates() { - FriendlyFeedbackProvider ffp = new FriendlyFeedbackProvider(FFPMMOItems.get()); - ffp.activatePrefix(true, "Item Templates"); - ffp.log(FriendlyFeedbackCategory.INFORMATION, "Loading template modifiers, please wait.."); - for (File file : new File(MMOItems.plugin.getDataFolder() + "/modifiers").listFiles()) { - FileConfiguration config = YamlConfiguration.loadConfiguration(file); - ffp.activatePrefix(true, "Item Templates \u00a78($r" + file.getPath() + "\u00a78)"); - for (String key : config.getKeys(false)) - try { - TemplateModifier modifier = new TemplateModifier(config.getConfigurationSection(key)); - modifiers.put(modifier.getId(), modifier); - } catch (IllegalArgumentException exception) { - ffp.log(FriendlyFeedbackCategory.INFORMATION, "Could not load template modifier '" + key + "': " + exception.getMessage()); - } - } + /** + * Templates must be loaded whenever MMOItems enables so that other plugins + * like MMOCore can load template references in drop items or other objects. + * Template data is only loaded when MMOItems enables, once sets, tiers.. + * are initialized + */ + public void preloadTemplates() { + for (MMOItemType type : MMOItems.plugin.getTypes().getAll()) { + FileConfiguration config = type.getConfigFile().getConfig(); + for (String key : config.getKeys(false)) + try { + registerTemplate(new MMOItemTemplate(type, config.getConfigurationSection(key))); + } catch (IllegalArgumentException exception) { + MMOItems.plugin.getLogger().log(Level.INFO, "Could not preload item template '" + key + "': " + exception.getMessage()); + } + } + } - ffp.activatePrefix(true, "Item Templates"); - ffp.log(FriendlyFeedbackCategory.INFORMATION, "Loading item templates, please wait..."); - templates.forEach(template -> { - try { - template.postLoad(); - } catch (IllegalArgumentException exception) { - ffp.activatePrefix(true, "Item Templates \u00a78($r" + template.getType().getId() + "\u00a78)"); - ffp.log(FriendlyFeedbackCategory.INFORMATION, "Could not load item template '" + template.getId() + "': " + exception.getMessage()); - } - }); + /** + * Loads item generator modifiers and post load item templates. + */ + public void postloadTemplates() { + FriendlyFeedbackProvider ffp = new FriendlyFeedbackProvider(FFPMMOItems.get()); + ffp.activatePrefix(true, "Item Templates"); + ffp.log(FriendlyFeedbackCategory.INFORMATION, "Loading template modifiers, please wait.."); + for (File file : new File(MMOItems.plugin.getDataFolder() + "/modifiers").listFiles()) { + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + ffp.activatePrefix(true, "Item Templates \u00a78($r" + file.getPath() + "\u00a78)"); + for (String key : config.getKeys(false)) + try { + TemplateModifier modifier = new TemplateModifier(config.getConfigurationSection(key)); + modifiers.put(modifier.getId(), modifier); + } catch (IllegalArgumentException exception) { + ffp.log(FriendlyFeedbackCategory.INFORMATION, "Could not load template modifier '" + key + "': " + exception.getMessage()); + } + } - // Print all failures - ffp.sendTo(FriendlyFeedbackCategory.INFORMATION, MMOItems.getConsole()); - } + ffp.activatePrefix(true, "Item Templates"); + ffp.log(FriendlyFeedbackCategory.INFORMATION, "Loading item templates, please wait..."); + templates.forEach(template -> { + try { + template.postLoad(); + } catch (IllegalArgumentException exception) { + ffp.activatePrefix(true, "Item Templates \u00a78($r" + template.getType().getId() + "\u00a78)"); + ffp.log(FriendlyFeedbackCategory.INFORMATION, "Could not load item template '" + template.getId() + "': " + exception.getMessage()); + } + }); - /** - * Reloads the item templates. This is the method used to reload the manager - * when the server is already running. It clears all the maps and loads - * everything again. Template references in other plugins like MMOCore must - * be refreshed afterwards. - */ - public void reload() { - templates.clear(); - modifiers.clear(); + // Print all failures + ffp.sendTo(FriendlyFeedbackCategory.INFORMATION, MMOItems.getConsole()); + } - FriendlyFeedbackProvider ffp = new FriendlyFeedbackProvider(FFPMMOItems.get()); - ffp.activatePrefix(true, "Item Templates"); - ffp.log(FriendlyFeedbackCategory.INFORMATION, "Loading template modifiers, please wait.."); + /** + * Reloads the item templates. This is the method used to reload the manager + * when the server is already running. It clears all the maps and loads + * everything again. Template references in other plugins like MMOCore must + * be refreshed afterwards. + */ + public void reload() { + templates.clear(); + modifiers.clear(); - for (File file : new File(MMOItems.plugin.getDataFolder() + "/modifiers").listFiles()) { - FileConfiguration config = YamlConfiguration.loadConfiguration(file); - ffp.activatePrefix(true, "Item Templates \u00a78($r" + file.getPath() + "\u00a78)"); - for (String key : config.getKeys(false)) - try { - TemplateModifier modifier = new TemplateModifier(config.getConfigurationSection(key)); - modifiers.put(modifier.getId(), modifier); - } catch (IllegalArgumentException exception) { + FriendlyFeedbackProvider ffp = new FriendlyFeedbackProvider(FFPMMOItems.get()); + ffp.activatePrefix(true, "Item Templates"); + ffp.log(FriendlyFeedbackCategory.INFORMATION, "Loading template modifiers, please wait.."); - // Log - ffp.log(FriendlyFeedbackCategory.INFORMATION, "Could not load template modifier '" + key + "': " + exception.getMessage()); - } - } + for (File file : new File(MMOItems.plugin.getDataFolder() + "/modifiers").listFiles()) { + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + ffp.activatePrefix(true, "Item Templates \u00a78($r" + file.getPath() + "\u00a78)"); + for (String key : config.getKeys(false)) + try { + TemplateModifier modifier = new TemplateModifier(config.getConfigurationSection(key)); + modifiers.put(modifier.getId(), modifier); + } catch (IllegalArgumentException exception) { - ffp.activatePrefix(true, "Item Templates"); - ffp.log(FriendlyFeedbackCategory.INFORMATION, "Loading item templates, please wait..."); - for (MMOItemType type : MMOItems.plugin.getTypes().getAll()) { - FileConfiguration config = type.getConfigFile().getConfig(); - ffp.activatePrefix(true, "Item Templates \u00a78($r" + type.getId() + "\u00a78)"); - for (String key : config.getKeys(false)) - try { - MMOItemTemplate template = new MMOItemTemplate(type, config.getConfigurationSection(key)); - template.postLoad(); - registerTemplate(template); + // Log + ffp.log(FriendlyFeedbackCategory.INFORMATION, "Could not load template modifier '" + key + "': " + exception.getMessage()); + } + } - } catch (IllegalArgumentException exception) { + ffp.activatePrefix(true, "Item Templates"); + ffp.log(FriendlyFeedbackCategory.INFORMATION, "Loading item templates, please wait..."); + for (MMOItemType type : MMOItems.plugin.getTypes().getAll()) { + FileConfiguration config = type.getConfigFile().getConfig(); + ffp.activatePrefix(true, "Item Templates \u00a78($r" + type.getId() + "\u00a78)"); + for (String key : config.getKeys(false)) + try { + MMOItemTemplate template = new MMOItemTemplate(type, config.getConfigurationSection(key)); + template.postLoad(); + registerTemplate(template); - // Log - ffp.log(FriendlyFeedbackCategory.INFORMATION, "Could not load item template '" + key + "': " + exception.getMessage()); - } - } + } catch (IllegalArgumentException exception) { - // Print all failures - ffp.sendTo(FriendlyFeedbackCategory.INFORMATION, MMOItems.getConsole()); - } + // Log + ffp.log(FriendlyFeedbackCategory.INFORMATION, "Could not load item template '" + key + "': " + exception.getMessage()); + } + } + + // Print all failures + ffp.sendTo(FriendlyFeedbackCategory.INFORMATION, MMOItems.getConsole()); + } } diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/ItemStat.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/ItemStat.java index 79a4c9ed..01702a1e 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/ItemStat.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/ItemStat.java @@ -215,7 +215,12 @@ public abstract class ItemStat, S extends StatData> public boolean isCompatible(MMOItemType type) { String lower = type.getId().toLowerCase(); return !compatibleTypes.contains("!" + lower) && (compatibleTypes.contains("all") || compatibleTypes.contains(lower) - || compatibleTypes.contains(type.getItemSet().getName().toLowerCase())); + || compatibleTypes.contains(type.getType().name().toLowerCase())); + } + + public boolean isCompatible(MMOItemType.Type type) { + String lower = type.name().toLowerCase(); + return !compatibleTypes.contains("!" + lower) && (compatibleTypes.contains("all") || compatibleTypes.contains(lower)); } public boolean hasValidMaterial(ItemStack item) {