package de.tobiyas.racesandclasses.playermanagement.spellmanagement.mana.impl;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.ChatColor;
import de.tobiyas.racesandclasses.RacesAndClasses;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.classes.ClassContainer;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.race.RaceContainer;
import de.tobiyas.racesandclasses.eventprocessing.eventresolvage.resolvers.WorldResolver;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer;
import de.tobiyas.racesandclasses.playermanagement.spellmanagement.mana.ManaManager;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.TraitWithCost;
import de.tobiyas.util.formating.StringFormatUtils;
import de.tobiyas.util.math.Math2;
public abstract class AbstractManaManager implements ManaManager {
/**
* The Player to manage.
*/
protected final RaCPlayer racPlayer;
/**
* The Plugin to call Stuff on
*/
protected RacesAndClasses plugin = RacesAndClasses.getPlugin();
/**
* The map of max mana bonuses.
*/
protected final Map<String,Double> maxManaBonusses = new HashMap<String, Double>();
public AbstractManaManager(RaCPlayer racPlayer) {
this.racPlayer = racPlayer;
}
@Override
public void rescanPlayer() {
if(racPlayer == null || !racPlayer.isOnline() || WorldResolver.isOnDisabledWorld(racPlayer)){
return;
}
int level = racPlayer.getLevelManager().getCurrentLevel();
RaceContainer race = racPlayer.getRace();
if(race != null && race.getManaBonus(level) > 0){
addMaxManaBonus("race", race.getManaBonus(level));
}
ClassContainer clazz = racPlayer.getclass();
if(clazz != null && clazz.getManaBonus(level) > 0){
addMaxManaBonus("class", clazz.getManaBonus(level));
}
}
@Override
public boolean playerCastSpell(TraitWithCost spellToCast) {
if(!hasEnoughMana(spellToCast)) return false;
drownMana(spellToCast.getCost(racPlayer));
return true;
}
@Override
public boolean hasEnoughMana(TraitWithCost spell) {
return hasEnoughMana(spell.getCost(racPlayer));
}
@Override
public boolean hasEnoughMana(double manaNeeded) {
return getCurrentMana() >= manaNeeded;
}
@Override
public void addMaxManaBonus(String key, double value) {
maxManaBonusses.put(key, value);
double bonus = 0;
for(Double val : maxManaBonusses.values()) bonus += val;
applyMaxManaBonus(bonus);
}
@Override
public void removeMaxManaBonus(String key) {
maxManaBonusses.remove(key);
double bonus = 0;
for(Double value : maxManaBonusses.values()) bonus += value;
applyMaxManaBonus(bonus);
}
@Override
public void tick(){
double maxMana = getMaxMana();
if(maxMana <= 0) maxMana = 0.1;
double percent = Math2.clamp(0, getCurrentMana() / getMaxMana(), 1);
String line = StringFormatUtils.formatToPercent(percent, 10, '\u220E', ChatColor.BLUE, ChatColor.WHITE);
line = ChatColor.DARK_BLUE.toString() + '\u2739' + " {" + line + ChatColor.DARK_BLUE + "}";
racPlayer.getActionbarDisplay().setSegment("manabar", line);
racPlayer.getActionbarDisplay().setSegment("mana", ""+getCurrentMana());
racPlayer.getActionbarDisplay().setSegment("maxmana", ""+getMaxMana());
}
/**
* Recalculate the Max-Mana bonus.
*/
protected abstract void applyMaxManaBonus(double bonus);
@Override
public Map<String, Double> getAllBonuses() {
return new HashMap<String,Double>(maxManaBonusses);
}
@Override
public RaCPlayer getPlayer() {
return racPlayer;
}
@Override
public boolean isManaFull() {
return getCurrentMana() >= getMaxMana();
}
}