mirror of
https://gitlab.com/phoenix-dvpmt/mmoitems.git
synced 2025-02-01 11:11:21 +01:00
Improved performance of checks for item level reqs
This commit is contained in:
parent
6fbcfad835
commit
514efa21a4
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user