From 2a2a7f70078272581635470b60fa4c1f51d9090a Mon Sep 17 00:00:00 2001 From: Indyuce Date: Thu, 13 Feb 2020 23:50:27 +0100 Subject: [PATCH] Resource rework. See GitHub wiki for more info Added an option to disable vanilla eating/sat regen --- .../java/net/Indyuce/mmocore/MMOCore.java | 31 +++---- .../mmocore/api/player/PlayerData.java | 13 +-- .../api/player/profess/PlayerClass.java | 60 ++++++------ .../{ => resource}/ManaDisplayOptions.java | 6 +- .../profess/resource/PlayerResource.java | 44 +++++---- .../profess/resource/ResourceHandler.java | 91 ++++++++++++++++--- .../command/rpg/admin/AdminCommandMap.java | 9 +- ...ommandMap.java => ResourceCommandMap.java} | 4 +- .../listener/option/DisableRegeneration.java | 18 ++++ .../mmocore/manager/ConfigManager.java | 13 +-- src/main/resources/config.yml | 5 + src/main/resources/default/classes/human.yml | 8 -- src/main/resources/default/classes/mage.yml | 19 ++++ .../resources/default/classes/marksman.yml | 19 ++++ src/main/resources/default/classes/rogue.yml | 1 - 15 files changed, 221 insertions(+), 120 deletions(-) rename src/main/java/net/Indyuce/mmocore/api/player/profess/{ => resource}/ManaDisplayOptions.java (88%) rename src/main/java/net/Indyuce/mmocore/command/rpg/admin/{ResourcesCommandMap.java => ResourceCommandMap.java} (88%) create mode 100644 src/main/java/net/Indyuce/mmocore/listener/option/DisableRegeneration.java diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index 79cfd57c..6db956a7 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -62,6 +62,7 @@ import net.Indyuce.mmocore.listener.PlayerListener; import net.Indyuce.mmocore.listener.SpellCast; import net.Indyuce.mmocore.listener.WaypointsListener; import net.Indyuce.mmocore.listener.option.DeathExperienceLoss; +import net.Indyuce.mmocore.listener.option.DisableRegeneration; import net.Indyuce.mmocore.listener.option.HealthScale; import net.Indyuce.mmocore.listener.option.NoSpawnerEXP; import net.Indyuce.mmocore.listener.option.VanillaExperienceOverride; @@ -231,20 +232,13 @@ public class MMOCore extends JavaPlugin { */ new BukkitRunnable() { public void run() { - for (PlayerData data : PlayerData.getAll()) - if (data.isOnline() && !data.getPlayer().isDead()) { - - data.giveStellium(data.getStats().getStat(StatType.STELLIUM_REGENERATION)); - - if (data.canRegen(PlayerResource.HEALTH)) - data.heal(data.calculateRegen(PlayerResource.HEALTH)); - - if (data.canRegen(PlayerResource.MANA)) - data.giveMana(data.calculateRegen(PlayerResource.MANA)); - - if (data.canRegen(PlayerResource.STAMINA)) - data.giveStamina(data.calculateRegen(PlayerResource.STAMINA)); - } + for (PlayerData player : PlayerData.getAll()) + if (player.isOnline() && !player.getPlayer().isDead()) + for (PlayerResource resource : PlayerResource.values()) { + double d = player.getProfess().getHandler(resource).getRegen(player); + if (d > 0) + resource.regen(player, d); + } } }.runTaskTimerAsynchronously(MMOCore.plugin, 100, 20); @@ -254,9 +248,9 @@ public class MMOCore extends JavaPlugin { * produced by people not reading the installation guide... */ if (Bukkit.getPluginManager().getPlugin("MMOItemsMana") != null) { - Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "[MMOCore] MMOCore is not meant to be used with the Mana & Stamina MMOItems!!!"); - Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "[MMOCore] Please read the installation guide!"); - Bukkit.broadcastMessage(ChatColor.DARK_RED + "[MMOCore] MMOCore is not meant to be used with the Mana & Stamina MMOItems!!!"); + getLogger().log(Level.SEVERE, ChatColor.DARK_RED + "MMOCore is not meant to be used with MMOItems ManaAndStamina"); + getLogger().log(Level.SEVERE, ChatColor.DARK_RED + "Please read the installation guide!"); + Bukkit.broadcastMessage(ChatColor.DARK_RED + "[MMOCore] MMOCore is not meant to be used with MMOItems ManaAndStamina"); Bukkit.broadcastMessage(ChatColor.DARK_RED + "[MMOCore] Please read the installation guide!"); return; } @@ -288,6 +282,9 @@ public class MMOCore extends JavaPlugin { if (getConfig().getBoolean("death-exp-loss.enabled")) Bukkit.getPluginManager().registerEvents(new DeathExperienceLoss(), this); + if (getConfig().getBoolean("disable-vanilla-regen")) + Bukkit.getPluginManager().registerEvents(new DisableRegeneration(), this); + Bukkit.getPluginManager().registerEvents(new WaypointsListener(), this); Bukkit.getPluginManager().registerEvents(new PlayerListener(), this); Bukkit.getPluginManager().registerEvents(new GoldPouchesListener(), this); diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index c530ece3..ffeee467 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -11,7 +11,6 @@ import java.util.UUID; import java.util.logging.Level; import java.util.stream.Collectors; -import net.Indyuce.mmoitems.MMOItems; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.Color; @@ -39,7 +38,6 @@ import net.Indyuce.mmocore.api.player.attribute.PlayerAttributes; import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.api.player.profess.PlayerClass.Subclass; import net.Indyuce.mmocore.api.player.profess.SavedClassInformation; -import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.social.FriendRequest; import net.Indyuce.mmocore.api.player.social.Party; import net.Indyuce.mmocore.api.player.social.guilds.Guild; @@ -50,6 +48,7 @@ import net.Indyuce.mmocore.api.skill.Skill.SkillInfo; import net.Indyuce.mmocore.api.skill.SkillResult; import net.Indyuce.mmocore.api.skill.SkillResult.CancelReason; import net.Indyuce.mmocore.listener.SpellCast.SkillCasting; +import net.Indyuce.mmoitems.MMOItems; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; import net.mmogroup.mmolib.MMOLib; @@ -81,7 +80,7 @@ public class PlayerData extends OfflinePlayerData { private final PlayerSkillData skillData = new PlayerSkillData(this); private long lastWaypoint, lastLogin, lastFriendRequest, actionBarTimeOut; - + /* * NON-FINAL player data stuff made public to facilitate field change */ @@ -567,14 +566,6 @@ public class PlayerData extends OfflinePlayerData { return attributes; } - public boolean canRegen(PlayerResource resource) { - return getProfess().getHandler(resource).isAvailable(this); - } - - public double calculateRegen(PlayerResource resource) { - return getProfess().getHandler(resource).getRegen(this); - } - public void setMana(double amount) { mana = Math.max(0, Math.min(amount, getStats().getStat(StatType.MAX_MANA))); } diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java index 38ee7459..2f813887 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java @@ -31,6 +31,7 @@ import net.Indyuce.mmocore.api.load.MMOLoadException; import net.Indyuce.mmocore.api.math.formula.LinearValue; import net.Indyuce.mmocore.api.math.particle.CastingParticle; import net.Indyuce.mmocore.api.player.profess.event.EventTrigger; +import net.Indyuce.mmocore.api.player.profess.resource.ManaDisplayOptions; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.profess.resource.ResourceHandler; import net.Indyuce.mmocore.api.player.stats.StatType; @@ -51,9 +52,9 @@ public class PlayerClass { private final Map skills = new LinkedHashMap<>(); private final List subclasses = new ArrayList<>(); - private Map eventTriggers = new HashMap<>(); + private final Map resourceHandlers = new HashMap<>(); + private final Map eventTriggers = new HashMap<>(); - private final Map resources = new HashMap<>(); private CastingParticle castParticle = new CastingParticle(Particle.SPELL_INSTANT); /* @@ -67,9 +68,9 @@ public class PlayerClass { name = ChatColor.translateAlternateColorCodes('&', config.getString("display.name")); icon = MMOCoreUtils.readIcon(config.getString("display.item")); - - if(config.contains("display.texture")) { - if(icon.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) { + + if (config.contains("display.texture")) { + if (icon.getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) { ItemMeta meta = icon.getItemMeta(); try { Field profileField = meta.getClass().getDeclaredField("profile"); @@ -81,12 +82,11 @@ public class PlayerClass { MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] Could not apply playerhead texture: " + exception.getMessage()); } icon.setItemMeta(meta); - } - else { + } else { MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] Could not add player head texture. The item is not a playerhead!"); } } - + for (String string : config.getStringList("display.lore")) description.add(ChatColor.GRAY + ChatColor.translateAlternateColorCodes('&', string)); for (String string : config.getStringList("display.attribute-lore")) @@ -141,8 +141,6 @@ public class PlayerClass { for (String key : config.getConfigurationSection("triggers").getKeys(false)) { try { String format = key.toLowerCase().replace("_", "-").replace(" ", "-"); - // Validate.isTrue(MMOCore.plugin.classManager.isEventRegistered(format), - // "Could not find trigger event called '" + format + "'"); eventTriggers.put(format, new EventTrigger(format, config.getStringList("triggers." + key))); } catch (IllegalArgumentException exception) { MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] " + exception.getMessage()); @@ -150,8 +148,21 @@ public class PlayerClass { } } - for (PlayerResource resource : PlayerResource.values()) - resources.put(resource, new ResourceHandler(this, resource)); + /* + * must make sure all the resourceHandlers are registered when the + * placer class is initialized. + */ + for (PlayerResource resource : PlayerResource.values()) { + if (config.isConfigurationSection("resource." + resource.name().toLowerCase())) + try { + resourceHandlers.put(resource, new ResourceHandler(resource, config.getConfigurationSection("resource." + resource.name().toLowerCase()))); + } catch (IllegalArgumentException exception) { + MMOCore.log(Level.WARNING, "[PlayerClasses:" + id + "] Could not load special resource regen for " + resource.name() + ": " + exception.getMessage()); + resourceHandlers.put(resource, new ResourceHandler(resource)); + } + else + resourceHandlers.put(resource, new ResourceHandler(resource)); + } } /* @@ -170,7 +181,7 @@ public class PlayerClass { setOption(ClassOption.DEFAULT, false); for (PlayerResource resource : PlayerResource.values()) - resources.put(resource, new ResourceHandler(this, resource)); + resourceHandlers.put(resource, new ResourceHandler(resource)); } public void loadSubclasses(ClassManager manager) { @@ -193,7 +204,7 @@ public class PlayerClass { } public ResourceHandler getHandler(PlayerResource resource) { - return resources.get(resource); + return resourceHandlers.get(resource); } public int getMaxLevel() { @@ -203,7 +214,7 @@ public class PlayerClass { public int getDisplayOrder() { return displayOrder; } - + public String getFileName() { return fileName; } @@ -311,26 +322,13 @@ public class PlayerClass { */ DISPLAY(true), - /* - * resource regeneration depends on max resource - */ - MISSING_HEALTH_REGEN, - MISSING_MANA_REGEN, - MISSING_STAMINA_REGEN, - - /* - * resource regeneration depends on missing resource - */ - MAX_HEALTH_REGEN, - MAX_MANA_REGEN, - MAX_STAMINA_REGEN, - /* * only regen resource when out of combat */ OFF_COMBAT_HEALTH_REGEN, - OFF_COMBAT_MANA_REGEN(true), - OFF_COMBAT_STAMINA_REGEN; + OFF_COMBAT_MANA_REGEN, + OFF_COMBAT_STAMINA_REGEN, + OFF_COMBAT_STELLIUM_REGEN; private final boolean def; diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/ManaDisplayOptions.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java similarity index 88% rename from src/main/java/net/Indyuce/mmocore/api/player/profess/ManaDisplayOptions.java rename to src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java index e8f02853..a34667cb 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/ManaDisplayOptions.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ManaDisplayOptions.java @@ -1,4 +1,4 @@ -package net.Indyuce.mmocore.api.player.profess; +package net.Indyuce.mmocore.api.player.profess.resource; import org.apache.commons.lang.Validate; import org.bukkit.ChatColor; @@ -27,8 +27,8 @@ public class ManaDisplayOptions { public ManaDisplayOptions(ChatColor color, String name, char barCharacter) { Validate.notNull(color, "Color cannot be null"); - Validate.notNull(name, "name cannot be null"); - Validate.notNull(barCharacter, "barCharacter cannot be null"); + Validate.notNull(name, "Name cannot be null"); + Validate.notNull(barCharacter, "Bar character cannot be null"); this.color = color; this.name = name; diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/PlayerResource.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/PlayerResource.java index 7493e7f3..c580ec61 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/PlayerResource.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/PlayerResource.java @@ -1,5 +1,6 @@ package net.Indyuce.mmocore.api.player.profess.resource; +import java.util.function.BiConsumer; import java.util.function.Function; import org.bukkit.attribute.Attribute; @@ -13,44 +14,41 @@ public enum PlayerResource { /* * used to handle resource regeneration. */ - HEALTH(StatType.HEALTH_REGENERATION, ClassOption.OFF_COMBAT_HEALTH_REGEN, ClassOption.MAX_HEALTH_REGEN, ClassOption.MISSING_HEALTH_REGEN, (data) -> data.getPlayer().getHealth(), (data) -> data.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()), - MANA(StatType.MANA_REGENERATION, ClassOption.OFF_COMBAT_MANA_REGEN, ClassOption.MAX_MANA_REGEN, ClassOption.MISSING_MANA_REGEN, (data) -> data.getMana(), (data) -> data.getStats().getStat(StatType.MAX_MANA)), - STAMINA(StatType.STAMINA_REGENERATION, ClassOption.OFF_COMBAT_STAMINA_REGEN, ClassOption.MAX_STAMINA_REGEN, ClassOption.MISSING_STAMINA_REGEN, (data) -> data.getStamina(), (data) -> data.getStats().getStat(StatType.MAX_STAMINA)); + HEALTH(StatType.HEALTH_REGENERATION, ClassOption.OFF_COMBAT_HEALTH_REGEN, (data) -> data.getPlayer().getHealth(), (data) -> data.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(), (data, d) -> data.heal(d)), + MANA(StatType.MANA_REGENERATION, ClassOption.OFF_COMBAT_MANA_REGEN, (data) -> data.getMana(), (data) -> data.getStats().getStat(StatType.MAX_MANA), (data, d) -> data.giveMana(d)), + STAMINA(StatType.STAMINA_REGENERATION, ClassOption.OFF_COMBAT_STAMINA_REGEN, (data) -> data.getStamina(), (data) -> data.getStats().getStat(StatType.MAX_STAMINA), (data, d) -> data.giveStamina(d)), + STELLIUM(StatType.STELLIUM_REGENERATION, ClassOption.OFF_COMBAT_STELLIUM_REGEN, (data) -> data.getStellium(), (data) -> data.getStats().getStat(StatType.MAX_STELLIUM), (data, d) -> data.giveStellium(d)); private final StatType regenStat; - private final ClassOption offCombatRegen, maxRegen, missingRegen; + private final ClassOption offCombatRegen; private final Function current, max; + private final BiConsumer regen; - private PlayerResource(StatType regenStat, ClassOption offCombatRegen, ClassOption maxRegen, ClassOption missingRegen, Function current, Function max) { + private PlayerResource(StatType regenStat, ClassOption offCombatRegen, Function current, Function max, BiConsumer regen) { this.regenStat = regenStat; this.offCombatRegen = offCombatRegen; - this.maxRegen = maxRegen; - this.missingRegen = missingRegen; this.current = current; this.max = max; - } - - public ClassOption getMaxRegen() { - return maxRegen; - } - - public ClassOption getMissingRegen() { - return missingRegen; - } - - public ClassOption getOffCombatRegen() { - return offCombatRegen; + this.regen = regen; } public StatType getRegenStat() { return regenStat; } - public double getCurrent(PlayerData data) { - return current.apply(data); + public ClassOption getOffCombatRegen() { + return offCombatRegen; } - public double getMax(PlayerData data) { - return max.apply(data); + public double getCurrent(PlayerData player) { + return current.apply(player); + } + + public double getMax(PlayerData player) { + return max.apply(player); + } + + public void regen(PlayerData player, double amount) { + regen.accept(player, amount); } } diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ResourceHandler.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ResourceHandler.java index 97b4d0f4..bb363fd9 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ResourceHandler.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/resource/ResourceHandler.java @@ -1,25 +1,92 @@ package net.Indyuce.mmocore.api.player.profess.resource; -import java.util.function.Function; -import java.util.function.Predicate; +import java.util.function.BiFunction; +import org.apache.commons.lang.Validate; +import org.bukkit.configuration.ConfigurationSection; + +import net.Indyuce.mmocore.api.math.formula.LinearValue; import net.Indyuce.mmocore.api.player.PlayerData; -import net.Indyuce.mmocore.api.player.profess.PlayerClass; public class ResourceHandler { - private final Function regen; - private final Predicate available; - public ResourceHandler(PlayerClass profess, PlayerResource resource) { - available = profess.hasOption(resource.getOffCombatRegen()) ? (data) -> !data.isInCombat() : (data) -> true; - regen = profess.hasOption(resource.getMaxRegen()) ? (data) -> resource.getMax(data) * data.getStats().getStat(resource.getRegenStat()) / 100 : profess.hasOption(resource.getMissingRegen()) ? (data) -> Math.max(0, resource.getMax(data) - resource.getCurrent(data)) * data.getStats().getStat(resource.getRegenStat()) / 100 : (data) -> data.getStats().getStat(resource.getRegenStat()); + /* + * resource regeneration only applies when player is off combat + */ + private final boolean offCombatOnly; + + /* + * percentage of scaling which the player regenerates every second + */ + private final LinearValue scalar; + + /* + * whether the resource regeneration scales on missing or max resource. if + * TYPE is null, then there is no special regeneration. + */ + private final HandlerType type; + private final PlayerResource resource; + + public ResourceHandler(PlayerResource resource) { + this(resource, null, null, false); } - public boolean isAvailable(PlayerData data) { - return available.test(data); + public ResourceHandler(PlayerResource resource, ConfigurationSection config) { + this.resource = resource; + offCombatOnly = config.getBoolean("off-combat"); + + Validate.isTrue(config.contains("type"), "Could not find resource regen scaling type"); + type = HandlerType.valueOf(config.getString("type").toUpperCase()); + + Validate.notNull(config.getConfigurationSection("value"), "Could not find resource regen value config section"); + scalar = new LinearValue(config.getConfigurationSection("value")); } - public double getRegen(PlayerData data) { - return regen.apply(data); + public ResourceHandler(PlayerResource resource, HandlerType type, LinearValue scalar, boolean offCombatOnly) { + this.resource = resource; + this.type = type; + this.scalar = scalar; + this.offCombatOnly = offCombatOnly; + } + + /* + * REGENERATION FORMULAS HERE. + */ + public double getRegen(PlayerData player) { + + double d = 0; + + // base resource regeneration = value of the corresponding regen stat + if (!player.isInCombat() || !player.getProfess().hasOption(resource.getOffCombatRegen())) + d += player.getStats().getStat(resource.getRegenStat()); + + // extra resource regeneration based on CLASS, scales on LEVEL + if (type != null && (!player.isInCombat() || !offCombatOnly)) + d = this.scalar.calculate(player.getLevel()) / 100 * type.getScaling(player, resource); + + return d; + } + + public enum HandlerType { + + /* + * resource regeneration scales on max resource + */ + MAX((player, resource) -> resource.getMax(player)), + + /* + * resource regeneration scales on missing resource + */ + MISSING((player, resource) -> resource.getMax(player) - resource.getCurrent(player)); + + private final BiFunction calculation; + + private HandlerType(BiFunction calculation) { + this.calculation = calculation; + } + + public double getScaling(PlayerData player, PlayerResource resource) { + return calculation.apply(player, resource); + } } } diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AdminCommandMap.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AdminCommandMap.java index 8b2021b9..7a46768a 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AdminCommandMap.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/AdminCommandMap.java @@ -21,10 +21,11 @@ public class AdminCommandMap extends CommandMap { addFloor(new PointsCommandMap("class", this, (data, points) -> data.setClassPoints(points), (data, points) -> data.giveClassPoints(points), (data) -> data.getClassPoints())); addFloor(new PointsCommandMap("attribute", this, (data, points) -> data.setAttributePoints(points), (data, points) -> data.giveAttributePoints(points), (data) -> data.getAttributePoints())); addFloor(new PointsCommandMap("attr-realloc", this, (data, points) -> data.setAttributeReallocationPoints(points), (data, points) -> data.giveAttributeReallocationPoints(points), (data) -> data.getAttributeReallocationPoints())); - - addFloor(new ResourcesCommandMap("mana", this, (data, value) -> data.setMana(value), (data, value) -> data.giveMana(value), (data, value) -> data.giveMana(-value), (data) -> data.getMana())); - addFloor(new ResourcesCommandMap("stamina", this, (data, value) -> data.setStamina(value), (data, value) -> data.giveStamina(value), (data, value) -> data.giveStamina(-value), (data) -> data.getStamina())); - addFloor(new ResourcesCommandMap("stellium", this, (data, value) -> data.setStellium(value), (data, value) -> data.giveStellium(value), (data, value) -> data.giveStellium(-value), (data) -> data.getStellium())); + + addFloor(new ResourceCommandMap("health", this, (data, value) -> data.getPlayer().setHealth(value), (data, value) -> data.heal(value), (data, value) -> data.heal(-value), (data) -> data.getPlayer().getHealth())); + addFloor(new ResourceCommandMap("mana", this, (data, value) -> data.setMana(value), (data, value) -> data.giveMana(value), (data, value) -> data.giveMana(-value), (data) -> data.getMana())); + addFloor(new ResourceCommandMap("stamina", this, (data, value) -> data.setStamina(value), (data, value) -> data.giveStamina(value), (data, value) -> data.giveStamina(-value), (data) -> data.getStamina())); + addFloor(new ResourceCommandMap("stellium", this, (data, value) -> data.setStellium(value), (data, value) -> data.giveStellium(value), (data, value) -> data.giveStellium(-value), (data) -> data.getStellium())); } @Override diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourcesCommandMap.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourceCommandMap.java similarity index 88% rename from src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourcesCommandMap.java rename to src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourceCommandMap.java index 842e05b1..c58d784f 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourcesCommandMap.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ResourceCommandMap.java @@ -13,11 +13,11 @@ import net.Indyuce.mmocore.command.api.CommandEnd; import net.Indyuce.mmocore.command.api.CommandMap; import net.Indyuce.mmocore.command.api.Parameter; -public class ResourcesCommandMap extends CommandMap { +public class ResourceCommandMap extends CommandMap { private final String type; private final Function get; - public ResourcesCommandMap(String type, CommandMap parent, BiConsumer set, BiConsumer give, BiConsumer take, Function get) { + public ResourceCommandMap(String type, CommandMap parent, BiConsumer set, BiConsumer give, BiConsumer take, Function get) { super(parent, "resource-" + type); this.type = type; diff --git a/src/main/java/net/Indyuce/mmocore/listener/option/DisableRegeneration.java b/src/main/java/net/Indyuce/mmocore/listener/option/DisableRegeneration.java new file mode 100644 index 00000000..90d09697 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/listener/option/DisableRegeneration.java @@ -0,0 +1,18 @@ +package net.Indyuce.mmocore.listener.option; + +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityRegainHealthEvent; +import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; + +public class DisableRegeneration implements Listener { + + @EventHandler(priority = EventPriority.HIGH) + public void a(EntityRegainHealthEvent event) { + if (event.getEntityType() == EntityType.PLAYER) + if (event.getRegainReason() == RegainReason.SATIATED || event.getRegainReason() == RegainReason.REGEN || event.getRegainReason() == RegainReason.EATING) + event.setCancelled(true); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java b/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java index 64852dcf..17e85ff3 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java @@ -124,17 +124,14 @@ public class ConfigManager { } } - private ChatColor getColorOrDefault(String configKey, ChatColor defaultColor) { - ChatColor newColor; + private ChatColor getColorOrDefault(String key, ChatColor defaultColor) { try { - newColor = ChatColor.valueOf(MMOCore.plugin.getConfig().getString("resource-bar-colors." + configKey).toUpperCase()); + return ChatColor.valueOf(MMOCore.plugin.getConfig().getString("resource-bar-colors." + key).toUpperCase()); } - catch(Exception e) { - MMOCore.log(Level.WARNING, "Resource Bar color config '" + configKey + "' is invalid... Using default color."); - newColor = defaultColor; + catch(IllegalArgumentException exception) { + MMOCore.log(Level.WARNING, "Could not read resource bar color from '" + key + "': using default."); + return defaultColor; } - - return newColor; } public DecimalFormat newFormat(String pattern) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index bf3615d1..c20a1215 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -70,6 +70,11 @@ health-scale: enabled: true scale: 20 +# Disable player health regen due to saturation and eating +# to control health regen via MMOCore resource regen. +# Requires a SERVER reload when changed. +disable-vanilla-regen: false + # Allows to toggle exp hologram from gaining experiences game-indicators: exp: diff --git a/src/main/resources/default/classes/human.yml b/src/main/resources/default/classes/human.yml index 94fdfad0..f53c86e7 100644 --- a/src/main/resources/default/classes/human.yml +++ b/src/main/resources/default/classes/human.yml @@ -5,14 +5,6 @@ options: default: true display: false - # Health/mana regen scales on missing health/mana - missing-health-regen: false - missing-mana-regen: false - - # Resource regen scales on max mana/health - max-health-regen: false - max-mana-regen: false - # Only regens when out of combat off-combat-health-regen: false off-combat-mana-regen: false diff --git a/src/main/resources/default/classes/mage.yml b/src/main/resources/default/classes/mage.yml index 836eb525..42ebff13 100644 --- a/src/main/resources/default/classes/mage.yml +++ b/src/main/resources/default/classes/mage.yml @@ -44,6 +44,25 @@ cast-particle: options: off-combat-health-regen: true +# Special resource regeneration: (when out of combat), +# players can regen a set % of their maximum mana/missing mana. +# This % can scale with the player level. +# It also works with other player resources: health, stellium and stamina! +resource: + mana: + + # Scales with max mana. + type: MAX + + # Regen from 3 to 10% of max mana every second + value: + base: 3 + per-level: .1 + max: 10 + + # Only regen when out of combat. + off-combat: true + attributes: max-health: base: 18 diff --git a/src/main/resources/default/classes/marksman.yml b/src/main/resources/default/classes/marksman.yml index b7c32a5a..f16225cf 100644 --- a/src/main/resources/default/classes/marksman.yml +++ b/src/main/resources/default/classes/marksman.yml @@ -40,6 +40,25 @@ mana: cast-particle: particle: CRIT +# Special resource regeneration: (when out of combat), +# players can regen a set % of their stamina mana/missing stamina. +# This % can scale with the player level. +# It also works with other player resources: health, stellium and mana! +resource: + stamina: + + # Regen scales with missing stamina. + type: MISSING + + # Regen from 3 to 10% of missing stamina every second + value: + base: 5 + per-level: .2 + max: 13 + + # Only regen when out of combat. + off-combat: true + skills: WEAKEN: level: 3 diff --git a/src/main/resources/default/classes/rogue.yml b/src/main/resources/default/classes/rogue.yml index e9575eca..5713b175 100644 --- a/src/main/resources/default/classes/rogue.yml +++ b/src/main/resources/default/classes/rogue.yml @@ -35,7 +35,6 @@ triggers: options: off-combat-mana-regen: true off-combat-health-regen: true - missing-health-regen: true cast-particle: particle: SPELL_WITCH