package com.nisovin.magicspells.mana;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import com.nisovin.magicspells.events.ManaChangeEvent;
public class ManaBar {
private String playerName;
private ManaRank rank;
private int maxMana;
private int regenAmount;
private String prefix;
private ChatColor colorFull;
private ChatColor colorEmpty;
private int mana;
public ManaBar(Player player, ManaRank rank) {
this.playerName = player.getName().toLowerCase();
setRank(rank);
}
public void setRank(ManaRank rank) {
this.rank = rank;
this.maxMana = rank.maxMana;
this.regenAmount = rank.regenAmount;
this.mana = rank.startingMana;
setDisplayData(rank.prefix, rank.colorFull, rank.colorEmpty);
}
public Player getPlayer() {
return Bukkit.getPlayerExact(playerName);
}
public ManaRank getManaRank() {
return rank;
}
public int getMana() {
return mana;
}
public int getMaxMana() {
return maxMana;
}
public int getRegenAmount() {
return regenAmount;
}
public void setMaxMana(int max) {
this.maxMana = max;
if (mana > maxMana) {
mana = maxMana;
}
}
public void setRegenAmount(int amount) {
this.regenAmount = amount;
}
private void setDisplayData(String prefix, ChatColor colorFull, ChatColor colorEmpty) {
this.prefix = prefix;
this.colorFull = colorFull;
this.colorEmpty = colorEmpty;
}
public String getPrefix() {
return prefix;
}
public ChatColor getColorFull() {
return colorFull;
}
public ChatColor getColorEmpty() {
return colorEmpty;
}
public boolean has(int amount) {
return mana >= amount;
}
public boolean changeMana(int amount, ManaChangeReason reason) {
int newAmt = mana;
if (amount > 0) {
if (mana == maxMana) return false;
newAmt += amount;
if (newAmt > maxMana) newAmt = maxMana;
} else if (amount < 0) {
if (mana == 0) return false;
newAmt += amount;
if (newAmt < 0) newAmt = 0;
}
if (newAmt == mana) return false;
newAmt = callManaChangeEvent(newAmt, reason);
if (newAmt > maxMana) newAmt = maxMana;
if (newAmt < 0) newAmt = 0;
if (newAmt == mana) return false;
mana = newAmt;
return true;
}
public boolean setMana(int amount, ManaChangeReason reason) {
int newAmt = amount;
if (newAmt > maxMana) {
newAmt = maxMana;
} else if (newAmt < 0) {
newAmt = 0;
}
newAmt = callManaChangeEvent(newAmt, reason);
if (newAmt == mana) return false;
mana = newAmt;
return true;
}
public boolean regenerate() {
if ((regenAmount > 0 && mana == maxMana) || (regenAmount < 0 && mana == 0)) return false;
return changeMana(regenAmount, ManaChangeReason.REGEN);
}
private int callManaChangeEvent(int newAmt, ManaChangeReason reason) {
Player player = getPlayer();
if (player != null && player.isOnline()) {
ManaChangeEvent event = new ManaChangeEvent(player, mana, newAmt, maxMana, reason);
Bukkit.getPluginManager().callEvent(event);
return event.getNewAmount();
} else {
return newAmt;
}
}
}