Added %mmocore_exp_<boost/multiplier>_<main/profession>%

This commit is contained in:
Indyuce 2020-08-15 13:39:55 +02:00
parent 9a37ed70e3
commit 6f749e2684
3 changed files with 108 additions and 57 deletions

View File

@ -9,18 +9,44 @@ public class Booster {
private final double extra;
private final String author;
// length not final because boosters can stack, this allows to reduce the
// amount of boosters
/**
* Length is not final because boosters can stacks. This allows to reduce
* the amount of boosters displayed in the main player menu
*/
private long length;
/**
* @param extra
* 1 for +100% experience, 3 for 300% etc.
* @param length
* Booster length in milliseconds
*/
public Booster(double extra, long length) {
this(null, null, extra, length);
}
/**
* @param author
* The booster creator
* @param extra
* 1 for +100% experience, 3 for 300% etc.
* @param length
* Booster length in milliseconds
*/
public Booster(String author, double extra, long length) {
this(author, null, extra, length);
}
/**
* @param author
* The booster creator
* @param profession
* Either null for main level boosters or a specific profession
* @param extra
* 1 for +100% experience, 3 for 300% etc.
* @param length
* Booster length in milliseconds
*/
public Booster(String author, Profession profession, double extra, long length) {
this.author = author;
this.length = length * 1000;
@ -28,42 +54,10 @@ public class Booster {
this.extra = extra;
}
public boolean isTimedOut() {
return date + length < System.currentTimeMillis();
}
public long getLeft() {
return Math.max(0, date + length - System.currentTimeMillis());
}
public long getCreationDate() {
return date;
}
public long getLength() {
return length;
}
public void addLength(long length) {
this.length += length;
}
public boolean hasProfession() {
return profession != null;
}
public Profession getProfession() {
return profession;
}
public UUID getUniqueId() {
return uuid;
}
public double calculateExp(double exp) {
return exp * (1 + extra);
}
public double getExtra() {
return extra;
}
@ -76,6 +70,34 @@ public class Booster {
return author;
}
public long getCreationDate() {
return date;
}
public boolean hasProfession() {
return profession != null;
}
public Profession getProfession() {
return profession;
}
public boolean isTimedOut() {
return date + length < System.currentTimeMillis();
}
public long getLeft() {
return Math.max(0, date + length - System.currentTimeMillis());
}
public long getLength() {
return length;
}
public void addLength(long length) {
this.length += length;
}
public boolean canStackWith(Booster booster) {
return extra == booster.extra && (profession != null ? profession.equals(booster.getProfession()) : booster.getProfession() == null);
}

View File

@ -100,16 +100,27 @@ public class RPGPlaceholders extends PlaceholderExpansion {
return "" + PlayerData.get(player).getAttributeReallocationPoints();
else if (identifier.startsWith("attribute_"))
return String.valueOf(PlayerData.get(player).getAttributes().getAttribute(
MMOCore.plugin.attributeManager.get(identifier.substring(10).toLowerCase().replace("_", "-"))));
return String.valueOf(PlayerData.get(player).getAttributes()
.getAttribute(MMOCore.plugin.attributeManager.get(identifier.substring(10).toLowerCase().replace("_", "-"))));
else if (identifier.equals("mana"))
return MMOCore.plugin.configManager.decimal.format(PlayerData.get(player).getMana());
else if (identifier.equals("mana_bar")) {
PlayerData data = PlayerData.get(player);
return data.getProfess().getManaDisplay().generateBar(data.getMana(),
data.getStats().getStat(StatType.MAX_MANA));
return data.getProfess().getManaDisplay().generateBar(data.getMana(), data.getStats().getStat(StatType.MAX_MANA));
}
else if (identifier.startsWith("exp_multiplier_")) {
String format = identifier.substring(15).toLowerCase().replace("_", "-").replace(" ", "-");
Profession profession = format.equals("main") ? null : MMOCore.plugin.professionManager.get(format);
return MMOCore.plugin.configManager.decimal.format(MMOCore.plugin.boosterManager.getMultiplier(profession) * 100);
}
else if (identifier.startsWith("exp_boost_")) {
String format = identifier.substring(10).toLowerCase().replace("_", "-").replace(" ", "-");
Profession profession = format.equals("main") ? null : MMOCore.plugin.professionManager.get(format);
return MMOCore.plugin.configManager.decimal.format((MMOCore.plugin.boosterManager.getMultiplier(profession) - 1) * 100);
}
else if (identifier.equals("stamina"))
@ -121,8 +132,7 @@ public class RPGPlaceholders extends PlaceholderExpansion {
double ratio = 20 * data.getStamina() / data.getStats().getStat(StatType.MAX_STAMINA);
for (double j = 1; j < 20; j++)
format += (ratio >= j ? MMOCore.plugin.configManager.staminaFull
: ratio >= j - .5 ? MMOCore.plugin.configManager.staminaHalf
: MMOCore.plugin.configManager.staminaEmpty)
: ratio >= j - .5 ? MMOCore.plugin.configManager.staminaHalf : MMOCore.plugin.configManager.staminaEmpty)
+ AltChar.listSquare;
return format;
}
@ -140,8 +150,7 @@ public class RPGPlaceholders extends PlaceholderExpansion {
PlayerData data = PlayerData.get(player);
double ratio = 20 * data.getStellium() / data.getStats().getStat(StatType.MAX_STELLIUM);
for (double j = 1; j < 20; j++)
format += (ratio >= j ? ChatColor.BLUE : ratio >= j - .5 ? ChatColor.AQUA : ChatColor.WHITE)
+ AltChar.listSquare;
format += (ratio >= j ? ChatColor.BLUE : ratio >= j - .5 ? ChatColor.AQUA : ChatColor.WHITE) + AltChar.listSquare;
return format;
}
@ -153,8 +162,8 @@ public class RPGPlaceholders extends PlaceholderExpansion {
else if (identifier.equals("quest_progress")) {
PlayerQuests data = PlayerData.get(player).getQuestData();
return data.hasCurrent()
? MMOCore.plugin.configManager.decimal.format((int) (double) data.getCurrent().getObjectiveNumber()
/ data.getCurrent().getQuest().getObjectives().size() * 100)
? MMOCore.plugin.configManager.decimal
.format((int) (double) data.getCurrent().getObjectiveNumber() / data.getCurrent().getQuest().getObjectives().size() * 100)
: "0";
}

View File

@ -8,11 +8,19 @@ import net.Indyuce.mmocore.api.experience.Booster;
import net.Indyuce.mmocore.api.experience.Profession;
public class BoosterManager {
private List<Booster> map = new ArrayList<>();
private final List<Booster> map = new ArrayList<>();
/**
* If MMOCore can find a booster with the same profession and value, the two
* boosters will stack to reduce the amount of boosters displayed at the
* same time. Otherwise, booster is registered
*
* @param booster
* Booster to register
*/
public void register(Booster booster) {
// always flush booster list to reduce future calculations
// flushes booster list to reduce future calculations
flush();
for (Booster active : map)
@ -24,6 +32,13 @@ public class BoosterManager {
map.add(booster);
}
public Booster get(int index) {
return map.get(index);
}
/**
* Cleans timed out boosters from the MMOCore registry
*/
public void flush() {
for (Iterator<Booster> iterator = map.iterator(); iterator.hasNext();) {
Booster next = iterator.next();
@ -32,23 +47,28 @@ public class BoosterManager {
}
}
public int calculateExp(Profession profession, double exp) {
flush();
/**
* @return Sums all current experience boosters values
*/
public double getMultiplier(Profession profession) {
double d = 1;
for (Booster booster : map)
if (booster.getProfession() == profession)
exp = booster.calculateExp(exp);
if (booster.getProfession() == profession && !booster.isTimedOut())
d += booster.getExtra();
return (int) exp;
return d;
}
public List<Booster> getBoosters() {
flush();
public int calculateExp(Profession profession, double exp) {
return (int) (exp * getMultiplier(profession));
}
/**
* @return Collection of currently registered boosters. Some of them can be
* expired but are not unregistered yet!
*/
public List<Booster> getBoosters() {
return map;
}
public Booster get(int index) {
return map.get(index);
}
}