From 514efa21a430ee1a8b9ed82bda0fde51755020f7 Mon Sep 17 00:00:00 2001 From: Jules Date: Sat, 27 Jul 2024 13:49:37 -0700 Subject: [PATCH] Improved performance of checks for item level reqs --- .../mmoitems/comp/rpg/AuraSkillsHook.java | 26 ++-- .../mmoitems/comp/rpg/AureliumSkillsHook.java | 22 ++-- .../Indyuce/mmoitems/stat/RequiredLevel.java | 115 ++---------------- .../mmoitems/stat/type/RequiredLevelStat.java | 49 ++++---- 4 files changed, 60 insertions(+), 152 deletions(-) diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AuraSkillsHook.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AuraSkillsHook.java index db3eb2a9..34e22ba1 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AuraSkillsHook.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AuraSkillsHook.java @@ -83,7 +83,7 @@ public class AuraSkillsHook implements RPGHandler, Listener { double currentMaxMana = user.getMaxMana(); - if(user.getMana() > currentMaxMana) { + if (user.getMana() > currentMaxMana) { user.setMana(currentMaxMana); } @@ -106,13 +106,13 @@ public class AuraSkillsHook implements RPGHandler, Listener { public void a(UserLoadEvent event) { Player player = event.getPlayer(); PlayerData playerData = PlayerData.get(player); - playerData.setRPGPlayer(new AuraSkillsPlayer(playerData, event.getUser())); + playerData.setRPGPlayer(new PlayerWrapper(playerData, event.getUser())); } - public static class AuraSkillsPlayer extends RPGPlayer { + private static class PlayerWrapper extends RPGPlayer { private final SkillsUser info; - public AuraSkillsPlayer(PlayerData playerData, SkillsUser rpgPlayerData) { + public PlayerWrapper(PlayerData playerData, SkillsUser rpgPlayerData) { super(playerData); info = rpgPlayerData; @@ -149,7 +149,7 @@ public class AuraSkillsHook implements RPGHandler, Listener { } } - public class RequiredProfessionStat extends RequiredLevelStat { + private class RequiredProfessionStat extends RequiredLevelStat { private final Skill skill; public RequiredProfessionStat(Skills skill) { @@ -161,19 +161,17 @@ public class AuraSkillsHook implements RPGHandler, Listener { @Override public boolean canUse(RPGPlayer player, NBTItem item, boolean message) { + final int requirement = item.getInteger(this.getNBTPath()); + if (requirement <= 0) return true; final int skillLevel = aSkills.getUser(player.getPlayer().getUniqueId()).getSkillLevel(skill); - final int required = item.getInteger("MMOITEMS_REQUIRED_" + skill.name()); + if (skillLevel >= requirement || player.getPlayer().hasPermission("mmoitems.bypass.level")) return true; - if (skillLevel < required && !player.getPlayer().hasPermission("mmoitems.bypass.level")) { - if (message) { - Message.NOT_ENOUGH_PROFESSION.format(ChatColor.RED, "#profession#", skill.getDisplayName(Locale.getDefault())).send(player.getPlayer()); - player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f); - } - return false; + if (message) { + Message.NOT_ENOUGH_PROFESSION.format(ChatColor.RED, "#profession#", skill.getDisplayName(Locale.getDefault())).send(player.getPlayer()); + player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f); } - - return true; + return false; } } } \ No newline at end of file diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AureliumSkillsHook.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AureliumSkillsHook.java index 73feadf7..98f8d446 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AureliumSkillsHook.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AureliumSkillsHook.java @@ -91,13 +91,13 @@ public class AureliumSkillsHook implements RPGHandler, Listener { public void a(PlayerDataLoadEvent event) { Player player = event.getPlayerData().getPlayer(); PlayerData playerData = PlayerData.get(player); - playerData.setRPGPlayer(new AureliumSkillsPlayer(playerData, event.getPlayerData())); + playerData.setRPGPlayer(new PlayerWrapper(playerData, event.getPlayerData())); } - public class AureliumSkillsPlayer extends RPGPlayer { + public class PlayerWrapper extends RPGPlayer { private final com.archyx.aureliumskills.data.PlayerData info; - public AureliumSkillsPlayer(PlayerData playerData, com.archyx.aureliumskills.data.PlayerData rpgPlayerData) { + public PlayerWrapper(PlayerData playerData, com.archyx.aureliumskills.data.PlayerData rpgPlayerData) { super(playerData); info = rpgPlayerData; @@ -150,19 +150,17 @@ public class AureliumSkillsHook implements RPGHandler, Listener { @Override public boolean canUse(RPGPlayer player, NBTItem item, boolean message) { + final int requirement = item.getInteger(this.getNBTPath()); + if (requirement <= 0) return true; final int skillLevel = AureliumAPI.getSkillLevel(player.getPlayer(), skill); - final int required = item.getInteger("MMOITEMS_REQUIRED_" + skill.name()); + if (skillLevel >= requirement || player.getPlayer().hasPermission("mmoitems.bypass.level")) return true; - if (skillLevel < required && !player.getPlayer().hasPermission("mmoitems.bypass.level")) { - if (message) { - Message.NOT_ENOUGH_PROFESSION.format(ChatColor.RED, "#profession#", skill.getDisplayName(Locale.getDefault())).send(player.getPlayer()); - player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f); - } - return false; + if (message) { + Message.NOT_ENOUGH_PROFESSION.format(ChatColor.RED, "#profession#", skill.getDisplayName(Locale.getDefault())).send(player.getPlayer()); + player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f); } - - return true; + return false; } } } \ No newline at end of file diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/RequiredLevel.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/RequiredLevel.java index 6d4a5c00..b00d4112 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/RequiredLevel.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/RequiredLevel.java @@ -1,29 +1,17 @@ package net.Indyuce.mmoitems.stat; -import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.NBTItem; -import io.lumine.mythic.lib.api.item.SupportedNBTTagValues; import net.Indyuce.mmoitems.ItemStats; -import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder; -import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem; import net.Indyuce.mmoitems.api.player.RPGPlayer; -import net.Indyuce.mmoitems.api.util.NumericStatFormula; import net.Indyuce.mmoitems.api.util.message.Message; -import net.Indyuce.mmoitems.stat.data.DoubleData; import net.Indyuce.mmoitems.stat.data.RequiredLevelData; -import net.Indyuce.mmoitems.stat.data.random.RandomRequiredLevelData; -import net.Indyuce.mmoitems.stat.data.type.StatData; -import net.Indyuce.mmoitems.stat.type.DoubleStat; -import net.Indyuce.mmoitems.stat.type.ItemRestriction; +import net.Indyuce.mmoitems.stat.type.RequiredLevelStat; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Sound; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; - -public class RequiredLevel extends DoubleStat implements ItemRestriction { +public class RequiredLevel extends RequiredLevelStat { /** * Stat that uses a custom DoubleStatData because the merge algorithm is @@ -31,100 +19,21 @@ public class RequiredLevel extends DoubleStat implements ItemRestriction { * only keep the highest levels of the two and not sum the two values */ public RequiredLevel() { - super("REQUIRED_LEVEL", Material.EXPERIENCE_BOTTLE, "Required Level", - new String[]{"The level your item needs", "in order to be used."}, new String[]{"!block", "all"}); - } - - @Override - public void whenApplied(@NotNull ItemStackBuilder item, @NotNull DoubleData data) { - final int lvl = (int) data.getValue(); - if (lvl <= 0) return; - - item.getLore().insert(getPath(), DoubleStat.formatPath(getPath(), getGeneralStatFormat(), false, false, lvl)); - item.addItemTag(getAppliedNBT(data)); - } - - @Override - public void whenPreviewed(@NotNull ItemStackBuilder item, @NotNull DoubleData currentData, @NotNull NumericStatFormula templateData) throws IllegalArgumentException { - - // Get Value - double techMinimum = templateData.calculate(0, NumericStatFormula.FormulaInputType.LOWER_BOUND); - double techMaximum = templateData.calculate(0, NumericStatFormula.FormulaInputType.UPPER_BOUND); - - // Add NBT Path - item.addItemTag(getAppliedNBT(currentData)); - - // Display if not ZERO - if (techMinimum != 0 || techMaximum != 0) { - final String builtRange = DoubleStat.formatPath(getPath(), getGeneralStatFormat(), false, false, Math.floor(techMinimum), Math.floor(techMaximum)); - - // Just display normally - item.getLore().insert(getPath(), builtRange); - } - } - - @NotNull - @Override - public ArrayList getAppliedNBT(@NotNull DoubleData data) { - - // Make and bake - ArrayList ret = new ArrayList<>(); - ret.add(new ItemTag(getNBTPath(), data.getValue())); - return ret; - } - - @Override - public RandomRequiredLevelData whenInitialized(Object object) { - return new RandomRequiredLevelData(object); - } - - @Override - public void whenLoaded(@NotNull ReadMMOItem mmoitem) { - - // Find relevat tgs - ArrayList tags = new ArrayList<>(); - if (mmoitem.getNBT().hasTag(getNBTPath())) - tags.add(ItemTag.getTagAtPath(getNBTPath(), mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE)); - - // Build - StatData data = getLoadedNBT(tags); - - // Valid? - if (data != null) { - mmoitem.setData(this, data); - } - } - - - @Nullable - @Override - public RequiredLevelData getLoadedNBT(@NotNull ArrayList storedTags) { - - // Find - ItemTag rTag = ItemTag.getTagAtPath(getNBTPath(), storedTags); - - // Found? - if (rTag != null) { - - // Yes - return new RequiredLevelData((Double) rTag.getValue()); - } - - // no - return null; + super("LEVEL", Material.EXPERIENCE_BOTTLE, "Level", new String[]{"The level your item needs", "in order to be used."}); } @Override public boolean canUse(RPGPlayer player, NBTItem item, boolean message) { - int level = item.getInteger(ItemStats.REQUIRED_LEVEL.getNBTPath()); - if (player.getLevel() < level && !player.getPlayer().hasPermission("mmoitems.bypass.level")) { - if (message) { - Message.NOT_ENOUGH_LEVELS.format(ChatColor.RED).send(player.getPlayer()); - player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f); - } - return false; + final int level = item.getInteger(this.getNBTPath()); + if (level <= 0) return true; + + if (player.getLevel() >= level || player.getPlayer().hasPermission("mmoitems.bypass.level")) return true; + + if (message) { + Message.NOT_ENOUGH_LEVELS.format(ChatColor.RED).send(player.getPlayer()); + player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f); } - return true; + return false; } /* diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/RequiredLevelStat.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/RequiredLevelStat.java index ff7c3887..923c511a 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/RequiredLevelStat.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/RequiredLevelStat.java @@ -2,6 +2,7 @@ package net.Indyuce.mmoitems.stat.type; import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.SupportedNBTTagValues; +import io.lumine.mythic.lib.util.annotation.BackwardsCompatibility; import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder; import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem; import net.Indyuce.mmoitems.api.util.NumericStatFormula; @@ -16,18 +17,25 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; /** - * Used by {@link net.Indyuce.mmoitems.comp.rpg.AuraSkillsHook} - * to handle required skill levels. + * Mostly used by external plugins to implement custom level + * requirements like Heroes secondary hero level reqs or + * AuraSkills/MMOCore for profession levels. + * + * @author Jules */ public abstract class RequiredLevelStat extends DoubleStat implements ItemRestriction, GemStoneStat { // private final String idKey; + @Deprecated + @BackwardsCompatibility(version = "6.10") + public RequiredLevelStat(boolean ignored, String idKey, Material mat, String nameKey, String[] lore) { + super(idKey, mat, "Required " + nameKey, lore, new String[]{"!block", "all"}); + + // this.idKey = idKey; + } + public RequiredLevelStat(String idKey, Material mat, String nameKey, String[] lore) { - super("REQUIRED_" + idKey, - mat, - "Required " + nameKey, - lore, - new String[]{"!block", "all"}); + super("REQUIRED_" + idKey, mat, "Required " + nameKey, lore, new String[]{"!block", "all"}); // this.idKey = idKey; } @@ -36,12 +44,12 @@ public abstract class RequiredLevelStat extends DoubleStat implements ItemRestri public void whenApplied(@NotNull ItemStackBuilder item, @NotNull DoubleData data) { // Lore Management - int lvl = (int) data.getValue(); - String format = getGeneralStatFormat().replace("{value}", String.valueOf(lvl)); + final int requirement = (int) data.getValue(); + final String format = getGeneralStatFormat().replace("{value}", String.valueOf(requirement)); item.getLore().insert(getPath(), format); // Insert NBT - item.addItemTag(new ItemTag(getNBTPath(), lvl)); + item.addItemTag(new ItemTag(getNBTPath(), requirement)); } @Override @@ -52,18 +60,13 @@ public abstract class RequiredLevelStat extends DoubleStat implements ItemRestri double techMaximum = templateData.calculate(0, NumericStatFormula.FormulaInputType.UPPER_BOUND); // Cancel if it its NEGATIVE and this doesn't support negative stats. - if (techMaximum < 0 && !handleNegativeStats()) { - return; - } - if (techMinimum < 0 && !handleNegativeStats()) { - techMinimum = 0; - } - if (techMinimum < ((NumericStatFormula) templateData).getBase() - ((NumericStatFormula) templateData).getMaxSpread()) { - techMinimum = ((NumericStatFormula) templateData).getBase() - ((NumericStatFormula) templateData).getMaxSpread(); - } - if (techMaximum > ((NumericStatFormula) templateData).getBase() + ((NumericStatFormula) templateData).getMaxSpread()) { - techMaximum = ((NumericStatFormula) templateData).getBase() + ((NumericStatFormula) templateData).getMaxSpread(); - } + if (techMaximum < 0 && !handleNegativeStats()) return; + + if (techMinimum < 0 && !handleNegativeStats()) techMinimum = 0; + if (techMinimum < templateData.getBase() - templateData.getMaxSpread()) + techMinimum = templateData.getBase() - templateData.getMaxSpread(); + if (techMaximum > templateData.getBase() + templateData.getMaxSpread()) + techMaximum = templateData.getBase() + templateData.getMaxSpread(); // Add NBT Path item.addItemTag(getAppliedNBT(currentData)); @@ -91,7 +94,7 @@ public abstract class RequiredLevelStat extends DoubleStat implements ItemRestri @Override public void whenLoaded(@NotNull ReadMMOItem mmoitem) { - // Find relevat tgs + // Find relevant tgs ArrayList tags = new ArrayList<>(); if (mmoitem.getNBT().hasTag(getNBTPath())) tags.add(ItemTag.getTagAtPath(getNBTPath(), mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE));