/* * This file is part of MyPet * * Copyright © 2011-2016 Keyle * MyPet is licensed under the GNU Lesser General Public License. * * MyPet is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MyPet is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package de.Keyle.MyPet.api.skill.skilltreeloader; import de.Keyle.MyPet.api.Configuration; import de.Keyle.MyPet.api.skill.SkillInfo; import de.Keyle.MyPet.api.skill.skilltree.SkillTree; import de.Keyle.MyPet.api.skill.skilltree.SkillTreeLevel; import de.Keyle.MyPet.api.skill.skilltree.SkillTreeMobType; import de.Keyle.MyPet.api.util.Since; import java.util.*; public abstract class SkillTreeLoader { protected static List<SkillTree> alreadyLoadedInheritance = new ArrayList<>(); public static void addDefault(SkillTreeMobType skillTreeMobType) { SkillTreeMobType defaultSkillTreeMobType = SkillTreeMobType.DEFAULT; for (String skillTreeName : defaultSkillTreeMobType.getSkillTreeNames()) { if (!skillTreeMobType.hasSkillTree(skillTreeName) && defaultSkillTreeMobType.hasSkillTree(skillTreeName)) { SkillTree newSkillTree = defaultSkillTreeMobType.getSkillTree(skillTreeName).clone(); for (SkillTreeLevel level : newSkillTree.getLevelList()) { for (SkillInfo skill : level.getSkills()) { skill.setIsInherited(true); } } skillTreeMobType.addSkillTree(newSkillTree); } } } public static void manageInheritance(SkillTreeMobType skillTreeMobType) { Map<SkillTree, SkillTree> skillTreeClones = new HashMap<>(); for (SkillTree skillTree : skillTreeMobType.getSkillTrees()) { skillTreeClones.put(skillTree, skillTree.clone()); } for (SkillTree skillTree : skillTreeMobType.getSkillTrees()) { alreadyLoadedInheritance.clear(); if (skillTree.hasInheritance()) { alreadyLoadedInheritance.add(skillTree); manageInheritance(skillTreeMobType, skillTree, skillTree, skillTreeClones, 0); } } } protected static void manageInheritance(SkillTreeMobType skillTreeMobType, SkillTree startSkillTree, SkillTree skillTree, Map<SkillTree, SkillTree> clones, int depth) { if (skillTree.hasInheritance() && depth < 20) { if (skillTreeMobType.hasSkillTree(skillTree.getInheritance())) { SkillTree skillTreeInherit = skillTreeMobType.getSkillTree(skillTree.getInheritance()); if (!alreadyLoadedInheritance.contains(skillTreeInherit)) { if (skillTreeInherit.hasInheritance() && Configuration.Skilltree.INHERIT_ALREADY_INHERITED_SKILLS) { alreadyLoadedInheritance.add(skillTreeInherit); manageInheritance(skillTreeMobType, startSkillTree, skillTreeInherit, clones, depth + 1); } else { alreadyLoadedInheritance.add(skillTreeInherit); } SkillTree skillTreeClone = clones.get(skillTreeInherit); for (SkillTreeLevel level : skillTreeClone.getLevelList()) { for (SkillInfo skill : level.getSkills()) { SkillInfo skillClone = skill.cloneSkill(); if (skillClone != null) { skillClone.setIsInherited(true); startSkillTree.addSkillToLevel(level.getLevel(), skillClone, true); } } } } } } } @Deprecated @Since("24.11.2016") public void loadSkillTrees(String configPath, String[] mobtypes) { List<String> mobtypeList = new LinkedList<>(); Collections.addAll(mobtypeList, mobtypes); loadSkillTrees(configPath, mobtypeList); } public abstract void loadSkillTrees(String configPath, List<String> mobtypes); }