|  | @@ -0,0 +1,156 @@
 | 
	
		
			
				|  |  | +package com.gmail.nossr50.datatypes.skills;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import com.gmail.nossr50.mcMMO;
 | 
	
		
			
				|  |  | +import com.neetgames.mcmmo.api.SkillRegister;
 | 
	
		
			
				|  |  | +import com.neetgames.mcmmo.skill.*;
 | 
	
		
			
				|  |  | +import org.jetbrains.annotations.NotNull;
 | 
	
		
			
				|  |  | +import org.jetbrains.annotations.Nullable;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.util.HashMap;
 | 
	
		
			
				|  |  | +import java.util.HashSet;
 | 
	
		
			
				|  |  | +import java.util.Set;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Skills mcMMO is aware of are registered here
 | 
	
		
			
				|  |  | + * The skill register will be used for a few things in mcMMO
 | 
	
		
			
				|  |  | + * Removing a skill from the register doesn't mean it isn't doing anything as the register is simply for mcMMO's own awareness
 | 
	
		
			
				|  |  | + * When a player uses certain commands, such as checking their skill levels, if the skill isn't registered it won't be added to the resulting output of that command
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +public class SkillRegisterImpl implements SkillRegister {
 | 
	
		
			
				|  |  | +    //TODO: Move maps and collections to their own container
 | 
	
		
			
				|  |  | +    private final @NotNull HashMap<String, Skill> skillNameMap;
 | 
	
		
			
				|  |  | +    private final @NotNull Set<Skill> registeredSkills;
 | 
	
		
			
				|  |  | +    private final @NotNull Set<SuperSkill> superSkills;
 | 
	
		
			
				|  |  | +    private final @NotNull Set<RankedSkill> rankedSkills;
 | 
	
		
			
				|  |  | +    private final @NotNull Set<RootSkill> rootSkills; //Can include not-official root skills
 | 
	
		
			
				|  |  | +    private final @NotNull Set<RootSkill> coreRootSkills; //Only includes official root skills
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public SkillRegisterImpl() {
 | 
	
		
			
				|  |  | +        skillNameMap = new HashMap<>();
 | 
	
		
			
				|  |  | +        registeredSkills = new HashSet<>();
 | 
	
		
			
				|  |  | +        rootSkills = new HashSet<>();
 | 
	
		
			
				|  |  | +        superSkills = new HashSet<>();
 | 
	
		
			
				|  |  | +        rankedSkills = new HashSet<>();
 | 
	
		
			
				|  |  | +        coreRootSkills = new HashSet<>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //TODO: allow config to turn off certain core skills
 | 
	
		
			
				|  |  | +        registerCoreSkills();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public @Nullable Skill getSkill(@NotNull String fullyQualifiedName) {
 | 
	
		
			
				|  |  | +        return skillNameMap.get(fullyQualifiedName);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public @Nullable Skill getSkill(@NotNull SkillIdentity skillIdentity) {
 | 
	
		
			
				|  |  | +        return skillNameMap.get(skillIdentity.getFullyQualifiedName());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public @NotNull Set<SuperSkill> getSuperSkills() {
 | 
	
		
			
				|  |  | +        return superSkills;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public @NotNull Set<RankedSkill> getRankedSkills() {
 | 
	
		
			
				|  |  | +        return rankedSkills;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public @NotNull Set<RootSkill> getRootSkills() {
 | 
	
		
			
				|  |  | +        return rootSkills;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public boolean isSkillRegistered(@NotNull Skill skill) {
 | 
	
		
			
				|  |  | +        return registeredSkills.contains(skill);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void registerSkill(@NotNull Skill skill) {
 | 
	
		
			
				|  |  | +        registeredSkills.add(skill);
 | 
	
		
			
				|  |  | +        addedSkillRegisterProcessing(skill);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void registerSkill(@NotNull Skill skill, boolean override) {
 | 
	
		
			
				|  |  | +        if(isSkillRegistered(skill) && override) {
 | 
	
		
			
				|  |  | +            registeredSkills.remove(skill);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        registeredSkills.add(skill);
 | 
	
		
			
				|  |  | +        addedSkillRegisterProcessing(skill);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public @NotNull Set<Skill> getRegisteredSkills() {
 | 
	
		
			
				|  |  | +        return registeredSkills;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void postRemovalSkillRegisterProcessing(@NotNull Skill skill) {
 | 
	
		
			
				|  |  | +        removeSkillNameLookup(skill);
 | 
	
		
			
				|  |  | +        removeCollectionCache(skill);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void removeCollectionCache(@NotNull Skill skill) {
 | 
	
		
			
				|  |  | +        //Add to collections for cached lookups
 | 
	
		
			
				|  |  | +        if(skill instanceof RootSkill) {
 | 
	
		
			
				|  |  | +            rootSkills.remove(skill);
 | 
	
		
			
				|  |  | +        } else if (skill instanceof SuperSkill) {
 | 
	
		
			
				|  |  | +            superSkills.remove(skill);
 | 
	
		
			
				|  |  | +        } else if(skill instanceof RankedSkill) {
 | 
	
		
			
				|  |  | +            rankedSkills.remove( skill);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void removeSkillNameLookup(@NotNull Skill skill) {
 | 
	
		
			
				|  |  | +        skillNameMap.remove(skill.getSkillIdentity().getFullyQualifiedName());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void addedSkillRegisterProcessing(@NotNull Skill skill) {
 | 
	
		
			
				|  |  | +        addSkillNameLookup(skill);
 | 
	
		
			
				|  |  | +        addCollectionCache(skill);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void addCollectionCache(@NotNull Skill skill) {
 | 
	
		
			
				|  |  | +        //Add to various collections for cached lookups
 | 
	
		
			
				|  |  | +        if(skill instanceof CoreRootSkill) {
 | 
	
		
			
				|  |  | +            coreRootSkills.add((CoreRootSkill) skill);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if(skill instanceof RootSkill) {
 | 
	
		
			
				|  |  | +            rootSkills.add((RootSkill) skill);
 | 
	
		
			
				|  |  | +        } else if (skill instanceof SuperSkill) {
 | 
	
		
			
				|  |  | +            superSkills.add((SuperSkill) skill);
 | 
	
		
			
				|  |  | +        } else if(skill instanceof RankedSkill) {
 | 
	
		
			
				|  |  | +            rankedSkills.add((RankedSkill) skill);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void addSkillNameLookup(@NotNull Skill skill) {
 | 
	
		
			
				|  |  | +        skillNameMap.put(skill.getSkillIdentity().getFullyQualifiedName(), skill);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void unregisterSkill(@NotNull Skill skill) {
 | 
	
		
			
				|  |  | +        mcMMO.p.getLogger().info("Skill "+skill.toString()+" has been removed from the skill register.");
 | 
	
		
			
				|  |  | +        registeredSkills.remove(skill);
 | 
	
		
			
				|  |  | +        skillNameMap.remove(skill.getSkillIdentity().getFullyQualifiedName());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //Collection cache cleanup
 | 
	
		
			
				|  |  | +        postRemovalSkillRegisterProcessing(skill);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void registerCoreSkills() {
 | 
	
		
			
				|  |  | +        for(CoreRootSkill coreRootSkill : CoreSkillConstants.getImmutableCoreRootSkillSet()) {
 | 
	
		
			
				|  |  | +            mcMMO.p.getLogger().info("Registering core skill: "+coreRootSkill.getSkillName());
 | 
	
		
			
				|  |  | +            registerSkill(coreRootSkill);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public @NotNull Set<RootSkill> getCoreRootSkills() {
 | 
	
		
			
				|  |  | +        return coreRootSkills;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |