package de.tobiyas.racesandclasses.playermanagement.skilltree; import java.util.Collection; import java.util.HashMap; import java.util.Map; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.TraitHolderCombinder; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer; import de.tobiyas.racesandclasses.saving.PlayerSavingData; import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait; public class PlayerSkillTreeManager { /** * The set of Traits the player has selected. */ private final Map<Trait,Integer> presentTraits = new HashMap<>(); /** * The player this belongs to. */ private final RaCPlayer player; /** * The Data container to use. */ private final PlayerSavingData data; public PlayerSkillTreeManager(RaCPlayer player, PlayerSavingData data) { this.player = player; this.data = data; //Reload from data. this.reloadFromData(); } /** * Returns true if the Player has this trait. * @param trait to check * @return true if has. */ public int getLevel(Trait trait){ return presentTraits.containsKey(trait) ? presentTraits.get(trait) : 0; } /** * removes the Trait from the list of traits present. * @param trait to remove. */ public void removeTrait(Trait trait){ presentTraits.remove(trait); save(); } /** * Adds the Trait to the Player. * @param trait to add. */ public void setTraitLevel(Trait trait, int level){ presentTraits.put(trait, level); save(); } /** * Saves the Data to the Data. */ private void save(){ Map<String,Integer> skillTree = new HashMap<>(); for(Map.Entry<Trait,Integer> entry : presentTraits.entrySet()){ String name = entry.getKey().getDisplayName(); int level = entry.getValue(); if(level > 0) skillTree.put(name, level); } data.overrideSkilltree(skillTree); } /** * Gets all Traits of the Player * @return all traits. */ public Map<Trait,Integer> getTraitsWithLevels(){ return new HashMap<>(presentTraits); } /** * @return the free Skillpoints of the Player */ public int getFreeSkillpoints(){ int level = player.getLevelManager().getCurrentLevel(); int every = RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().getConfig_skillpointEveryXLevel(); int free = level / every; //Remove points for the Skills already present. for(Map.Entry<Trait,Integer> entry : presentTraits.entrySet()) { for(int i = 1; i <= entry.getValue(); i++){ free -= entry.getKey().getSkillPointCost(i); } } return Math.max(0, free); } /** * Loads the Skills from the Config.. */ private PlayerSkillTreeManager reloadFromData() { this.presentTraits.clear(); Collection<Trait> traits = TraitHolderCombinder.getAllTraitsOfPlayer(player); Map<String,Integer> skillTree = data.getSkillTree(); for(Map.Entry<String,Integer> entry : skillTree.entrySet()){ String name = entry.getKey(); int level = entry.getValue(); for(Trait trait : traits){ if(name.equalsIgnoreCase(trait.getDisplayName())){ setTraitLevel(trait, level); break; } } } return this; } /** * Clears the current Skills. */ public void clearSkills() { this.presentTraits.clear(); data.clearSkilltree(); } /** * Replaces the current skills with the new ones passed. * @param toApply the map to apply. */ public void replaceWithNew(Map<Trait, Integer> toApply) { this.presentTraits.clear(); if(toApply != null && !toApply.isEmpty()) this.presentTraits.putAll(toApply); save(); } }