Skills now always have mana and stamina

This commit is contained in:
Jules 2021-07-25 16:17:26 +02:00
parent 9cbc951fad
commit 7496b2d2b9
2 changed files with 263 additions and 235 deletions

View File

@ -1,225 +1,229 @@
package net.Indyuce.mmocore.api.skill;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.api.util.math.formula.IntegerLinearValue;
import net.Indyuce.mmocore.api.util.math.formula.LinearValue;
import org.apache.commons.lang.Validate;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.inventory.ItemStack;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.api.util.math.formula.IntegerLinearValue;
import net.Indyuce.mmocore.api.util.math.formula.LinearValue;
import java.util.*;
public abstract class Skill {
private final String id;
private final String id;
private String name;
private ItemStack icon = new ItemStack(Material.BOOK);
private List<String> lore;
private boolean passive;
private String name;
private ItemStack icon = new ItemStack(Material.BOOK);
private List<String> lore;
private boolean passive;
private final Map<String, LinearValue> modifiers = new HashMap<>();
private final Skill skill = this;
private final Map<String, LinearValue> modifiers = new HashMap<>();
private final Skill skill = this;
protected static final Random random = new Random();
protected static final Random random = new Random();
public Skill() {
id = getClass().getSimpleName().toUpperCase();
name = getClass().getSimpleName().replace("_", " ");
public Skill() {
id = getClass().getSimpleName().toUpperCase();
name = getClass().getSimpleName().replace("_", " ");
Validate.notNull(id, "ID cannot be null");
Validate.notNull(id, "Name cannot be null");
}
Validate.notNull(id, "ID cannot be null");
Validate.notNull(id, "Name cannot be null");
public Skill(String id) {
this.id = id.toUpperCase().replace(" ", "_").replace("-", "_");
}
// Default modifiers
addModifierIfNone("mana", LinearValue.ZERO);
addModifierIfNone("stamina", LinearValue.ZERO);
}
public void setName(String name) {
this.name = name;
}
public Skill(String id) {
this.id = id.toUpperCase().replace(" ", "_").replace("-", "_");
}
public void setMaterial(Material material) {
setIcon(new ItemStack(material));
}
public void setName(String name) {
this.name = name;
}
public void setIcon(ItemStack item) {
this.icon = item;
}
public void setMaterial(Material material) {
setIcon(new ItemStack(material));
}
public void setLore(String... lore) {
setLore(Arrays.asList(lore));
}
public void setIcon(ItemStack item) {
this.icon = item;
}
public void setLore(List<String> lore) {
this.lore = lore;
}
public void setLore(String... lore) {
setLore(Arrays.asList(lore));
}
public void setPassive() {
passive = true;
}
public void setLore(List<String> lore) {
this.lore = lore;
}
public String getName() {
return name;
}
public void setPassive() {
passive = true;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getLowerCaseId() {
return id.replace("_", "-").toLowerCase();
}
public String getId() {
return id;
}
public List<String> getLore() {
return lore;
}
public String getLowerCaseId() {
return id.replace("_", "-").toLowerCase();
}
public ItemStack getIcon() {
return icon.clone();
}
public List<String> getLore() {
return lore;
}
/*
* passive skills do not display any message
*/
public boolean isPassive() {
return passive;
}
public ItemStack getIcon() {
return icon.clone();
}
public boolean hasModifier(String modifier) {
return modifiers.containsKey(modifier);
}
/**
* Passive skills do not display any message when trying to cast them
*
* @return If the skill is passive
*/
public boolean isPassive() {
return passive;
}
public void addModifier(String modifier, LinearValue linear) {
modifiers.put(modifier, linear);
}
public boolean hasModifier(String modifier) {
return modifiers.containsKey(modifier);
}
public LinearValue getModifierInfo(String modifier) {
return modifiers.get(modifier);
}
public void addModifier(String modifier, LinearValue linear) {
modifiers.put(modifier, linear);
}
public double getModifier(String modifier, int level) {
return modifiers.get(modifier).calculate(level);
}
public void addModifierIfNone(String mod, LinearValue defaultValue) {
if (!hasModifier(mod))
addModifier(mod, defaultValue);
}
public Set<String> getModifiers() {
return modifiers.keySet();
}
public LinearValue getModifierInfo(String modifier) {
return modifiers.get(modifier);
}
public void update(FileConfiguration config) {
name = config.getString("name", "INVALID NAME");
lore = config.getStringList("lore");
icon = MMOCoreUtils.readIcon(config.getString("material", "DIRT"));
public double getModifier(String modifier, int level) {
return modifiers.get(modifier).calculate(level);
}
for (String modifier : modifiers.keySet())
if (config.contains(modifier))
modifiers.put(modifier, readLinearValue(modifiers.get(modifier), config.getConfigurationSection(modifier)));
}
public Set<String> getModifiers() {
return modifiers.keySet();
}
private LinearValue readLinearValue(LinearValue current, ConfigurationSection config) {
return current instanceof IntegerLinearValue ? new IntegerLinearValue(config) : new LinearValue(config);
}
public void update(FileConfiguration config) {
name = config.getString("name", "INVALID NAME");
lore = config.getStringList("lore");
icon = MMOCoreUtils.readIcon(config.getString("material", "DIRT"));
/*
* not overriden for passive skills therefore not abstract.
*/
public SkillResult whenCast(PlayerData data, SkillInfo skill) {
return new SkillResult(data, skill);
}
for (String modifier : modifiers.keySet())
if (config.contains(modifier))
modifiers.put(modifier, readLinearValue(modifiers.get(modifier), config.getConfigurationSection(modifier)));
}
public SkillInfo newSkillInfo(ConfigurationSection config) {
return new SkillInfo(config);
}
private LinearValue readLinearValue(LinearValue current, ConfigurationSection config) {
return current instanceof IntegerLinearValue ? new IntegerLinearValue(config) : new LinearValue(config);
}
public SkillInfo newSkillInfo(int level) {
return new SkillInfo(level);
}
/*
* not overriden for passive skills therefore not abstract.
*/
public SkillResult whenCast(PlayerData data, SkillInfo skill) {
return new SkillResult(data, skill);
}
public class SkillInfo {
private final int level, max;
private final Map<String, LinearValue> modifiers = new HashMap<>(skill.modifiers);
public SkillInfo newSkillInfo(ConfigurationSection config) {
return new SkillInfo(config);
}
/*
* class used to save information about skills IN A CLASS CONTEXT i.e at
* which level the skill can be unlocked, etc.
*/
public SkillInfo(int level) {
this.level = level;
this.max = 0;
}
public SkillInfo newSkillInfo(int level) {
return new SkillInfo(level);
}
public SkillInfo(ConfigurationSection config) {
level = config.getInt("level");
max = config.getInt("max-level");
public class SkillInfo {
private final int level, max;
private final Map<String, LinearValue> modifiers = new HashMap<>(skill.modifiers);
for (String key : config.getKeys(false))
if (config.get(key) instanceof ConfigurationSection && modifiers.containsKey(key))
modifiers.put(key, readLinearValue(modifiers.get(key), config.getConfigurationSection(key)));
}
/*
* class used to save information about skills IN A CLASS CONTEXT i.e at
* which level the skill can be unlocked, etc.
*/
public SkillInfo(int level) {
this.level = level;
this.max = 0;
}
public Skill getSkill() {
return skill;
}
public SkillInfo(ConfigurationSection config) {
level = config.getInt("level");
max = config.getInt("max-level");
public int getUnlockLevel() {
return level;
}
for (String key : config.getKeys(false))
if (config.get(key) instanceof ConfigurationSection && modifiers.containsKey(key))
modifiers.put(key, readLinearValue(modifiers.get(key), config.getConfigurationSection(key)));
}
public boolean hasMaxLevel() {
return max > 0;
}
public Skill getSkill() {
return skill;
}
public int getMaxLevel() {
return max;
}
public int getUnlockLevel() {
return level;
}
/*
* this method can only OVERRIDE default modifiers
*/
public void addModifier(String modifier, LinearValue linear) {
if (modifiers.containsKey(modifier))
modifiers.put(modifier, linear);
}
public boolean hasMaxLevel() {
return max > 0;
}
public double getModifier(String modifier, int level) {
return modifiers.get(modifier).calculate(level);
}
public int getMaxLevel() {
return max;
}
public List<String> calculateLore(PlayerData data) {
return calculateLore(data, data.getSkillLevel(skill));
}
/*
* this method can only OVERRIDE default modifiers
*/
public void addModifier(String modifier, LinearValue linear) {
if (modifiers.containsKey(modifier))
modifiers.put(modifier, linear);
}
public List<String> calculateLore(PlayerData data, int x) {
List<String> list = new ArrayList<>();
public double getModifier(String modifier, int level) {
return modifiers.get(modifier).calculate(level);
}
Map<String, String> placeholders = calculateModifiers(x);
placeholders.put("mana_name", data.getProfess().getManaDisplay().getName());
lore.forEach(str -> list.add(applyPlaceholders(placeholders, str)));
public List<String> calculateLore(PlayerData data) {
return calculateLore(data, data.getSkillLevel(skill));
}
return list;
}
public List<String> calculateLore(PlayerData data, int x) {
List<String> list = new ArrayList<>();
private String applyPlaceholders(Map<String, String> placeholders, String str) {
while (str.contains("{") && str.substring(str.indexOf("{")).contains("}")) {
String holder = str.substring(str.indexOf("{") + 1, str.indexOf("}"));
str = str.replace("{" + holder + "}", placeholders.getOrDefault(holder, "PHE"));
}
return str;
}
Map<String, String> placeholders = calculateModifiers(x);
placeholders.put("mana_name", data.getProfess().getManaDisplay().getName());
lore.forEach(str -> list.add(applyPlaceholders(placeholders, str)));
private Map<String, String> calculateModifiers(int x) {
Map<String, String> map = new HashMap<>();
modifiers.keySet().forEach(modifier -> map.put(modifier, modifiers.get(modifier).getDisplay(x)));
return map;
}
}
return list;
}
private String applyPlaceholders(Map<String, String> placeholders, String str) {
while (str.contains("{") && str.substring(str.indexOf("{")).contains("}")) {
String holder = str.substring(str.indexOf("{") + 1, str.indexOf("}"));
str = str.replace("{" + holder + "}", placeholders.getOrDefault(holder, "PHE"));
}
return str;
}
private Map<String, String> calculateModifiers(int x) {
Map<String, String> map = new HashMap<>();
modifiers.keySet().forEach(modifier -> map.put(modifier, modifiers.get(modifier).getDisplay(x)));
return map;
}
}
}

View File

@ -4,86 +4,110 @@ import io.lumine.mythic.lib.MythicLib;
import org.bukkit.configuration.ConfigurationSection;
public class LinearValue {
private final double base, perLevel, min, max;
private final boolean hasmin, hasmax;
private final double base, perLevel, min, max;
private final boolean hasmin, hasmax;
public static final LinearValue ZERO = new LinearValue(0, 0, 0, 0);
/*
* a number which depends on the player level. it can be used as a skill
* modifier to make the ability better depending on the player level or as
* an attrribute value to make attributes increase with the player level
*/
public LinearValue(double base, double perLevel) {
this.base = base;
this.perLevel = perLevel;
hasmin = false;
hasmax = false;
min = 0;
max = 0;
}
/**
* A number formula which depends on the player level. It can be used
* to handle skill modifiers so that the ability gets better with the
* skill level, or as an attribute value to make them scale with the class level.
*
* @param base Base value
* @param perLevel Every level, final value is increased by X
*/
public LinearValue(double base, double perLevel) {
this.base = base;
this.perLevel = perLevel;
hasmin = false;
hasmax = false;
min = 0;
max = 0;
}
public LinearValue(double base, double perLevel, double min, double max) {
this.base = base;
this.perLevel = perLevel;
hasmin = true;
hasmax = true;
this.min = min;
this.max = max;
}
/**
* A number formula which depends on the player level. It can be used
* to handle skill modifiers so that the ability gets better with the
* skill level, or as an attribute value to make them scale with the class level.
*
* @param base Base value
* @param perLevel Every level, final value is increased by X
* @param min Minimum final value
* @param max Maximum final value
*/
public LinearValue(double base, double perLevel, double min, double max) {
this.base = base;
this.perLevel = perLevel;
hasmin = true;
hasmax = true;
this.min = min;
this.max = max;
}
public LinearValue(LinearValue value) {
base = value.base;
perLevel = value.perLevel;
hasmin = value.hasmin;
hasmax = value.hasmax;
min = value.min;
max = value.max;
}
/**
* Copies a linear formula
*
* @param value Formula to copy
*/
public LinearValue(LinearValue value) {
base = value.base;
perLevel = value.perLevel;
hasmin = value.hasmin;
hasmax = value.hasmax;
min = value.min;
max = value.max;
}
public LinearValue(ConfigurationSection config) {
base = config.getDouble("base");
perLevel = config.getDouble("per-level");
hasmin = config.contains("min");
hasmax = config.contains("max");
min = hasmin ? config.getDouble("min") : 0;
max = hasmax ? config.getDouble("max") : 0;
}
/**
* Loads a linear formula from a config section
*
* @param config Config to load the formula from
*/
public LinearValue(ConfigurationSection config) {
base = config.getDouble("base");
perLevel = config.getDouble("per-level");
hasmin = config.contains("min");
hasmax = config.contains("max");
min = hasmin ? config.getDouble("min") : 0;
max = hasmax ? config.getDouble("max") : 0;
}
public double getBaseValue() {
return base;
}
public double getBaseValue() {
return base;
}
public double getPerLevel() {
return perLevel;
}
public double getPerLevel() {
return perLevel;
}
public double getMax() {
return max;
}
public double getMax() {
return max;
}
public double getMin() {
return min;
}
public double getMin() {
return min;
}
public boolean hasMax() {
return hasmax;
}
public boolean hasMax() {
return hasmax;
}
public boolean hasMin() {
return hasmin;
}
public boolean hasMin() {
return hasmin;
}
public String getDisplay(int level) {
return MythicLib.plugin.getMMOConfig().decimals.format(calculate(level));
}
public String getDisplay(int level) {
return MythicLib.plugin.getMMOConfig().decimals.format(calculate(level));
}
public double calculate(int level) {
double value = base + perLevel * (level - 1);
public double calculate(int level) {
double value = base + perLevel * (level - 1);
if (hasmin) value = Math.max(min, value);
if (hasmin) value = Math.max(min, value);
if (hasmax) value = Math.min(max, value);
if (hasmax) value = Math.min(max, value);
return value;
}
return value;
}
}