Improved performance of checks for item level reqs

This commit is contained in:
Jules 2024-07-27 13:49:37 -07:00
parent 6fbcfad835
commit 514efa21a4
4 changed files with 60 additions and 152 deletions

View File

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

View File

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

View File

@ -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<ItemTag> getAppliedNBT(@NotNull DoubleData data) {
// Make and bake
ArrayList<ItemTag> 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<ItemTag> 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<ItemTag> 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;
}
/*

View File

@ -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<ItemTag> tags = new ArrayList<>();
if (mmoitem.getNBT().hasTag(getNBTPath()))
tags.add(ItemTag.getTagAtPath(getNBTPath(), mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE));