/* * Copyright (C) 2004-2014 L2J Server * * This file is part of L2J Server. * * L2J Server 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. * * L2J Server 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 . */ package com.l2jserver.gameserver.model.base; import static com.l2jserver.gameserver.model.base.ClassLevel.FIRST; import static com.l2jserver.gameserver.model.base.ClassLevel.FOURTH; import static com.l2jserver.gameserver.model.base.ClassLevel.SECOND; import static com.l2jserver.gameserver.model.base.ClassLevel.THIRD; import static com.l2jserver.gameserver.model.base.ClassType.Fighter; import static com.l2jserver.gameserver.model.base.ClassType.Mystic; import static com.l2jserver.gameserver.model.base.ClassType.Priest; import java.util.EnumMap; import java.util.EnumSet; import java.util.Set; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; /** * @author luisantonioa */ public enum PlayerClass { HumanFighter(Race.HUMAN, Fighter, FIRST), Warrior(Race.HUMAN, Fighter, SECOND), Gladiator(Race.HUMAN, Fighter, THIRD), Warlord(Race.HUMAN, Fighter, THIRD), HumanKnight(Race.HUMAN, Fighter, SECOND), Paladin(Race.HUMAN, Fighter, THIRD), DarkAvenger(Race.HUMAN, Fighter, THIRD), Rogue(Race.HUMAN, Fighter, SECOND), TreasureHunter(Race.HUMAN, Fighter, THIRD), Hawkeye(Race.HUMAN, Fighter, THIRD), HumanMystic(Race.HUMAN, Mystic, FIRST), HumanWizard(Race.HUMAN, Mystic, SECOND), Sorceror(Race.HUMAN, Mystic, THIRD), Necromancer(Race.HUMAN, Mystic, THIRD), Warlock(Race.HUMAN, Mystic, THIRD), Cleric(Race.HUMAN, Priest, SECOND), Bishop(Race.HUMAN, Priest, THIRD), Prophet(Race.HUMAN, Priest, THIRD), ElvenFighter(Race.ELF, Fighter, FIRST), ElvenKnight(Race.ELF, Fighter, SECOND), TempleKnight(Race.ELF, Fighter, THIRD), Swordsinger(Race.ELF, Fighter, THIRD), ElvenScout(Race.ELF, Fighter, SECOND), Plainswalker(Race.ELF, Fighter, THIRD), SilverRanger(Race.ELF, Fighter, THIRD), ElvenMystic(Race.ELF, Mystic, FIRST), ElvenWizard(Race.ELF, Mystic, SECOND), Spellsinger(Race.ELF, Mystic, THIRD), ElementalSummoner(Race.ELF, Mystic, THIRD), ElvenOracle(Race.ELF, Priest, SECOND), ElvenElder(Race.ELF, Priest, THIRD), DarkElvenFighter(Race.DARK_ELF, Fighter, FIRST), PalusKnight(Race.DARK_ELF, Fighter, SECOND), ShillienKnight(Race.DARK_ELF, Fighter, THIRD), Bladedancer(Race.DARK_ELF, Fighter, THIRD), Assassin(Race.DARK_ELF, Fighter, SECOND), AbyssWalker(Race.DARK_ELF, Fighter, THIRD), PhantomRanger(Race.DARK_ELF, Fighter, THIRD), DarkElvenMystic(Race.DARK_ELF, Mystic, FIRST), DarkElvenWizard(Race.DARK_ELF, Mystic, SECOND), Spellhowler(Race.DARK_ELF, Mystic, THIRD), PhantomSummoner(Race.DARK_ELF, Mystic, THIRD), ShillienOracle(Race.DARK_ELF, Priest, SECOND), ShillienElder(Race.DARK_ELF, Priest, THIRD), OrcFighter(Race.ORC, Fighter, FIRST), OrcRaider(Race.ORC, Fighter, SECOND), Destroyer(Race.ORC, Fighter, THIRD), OrcMonk(Race.ORC, Fighter, SECOND), Tyrant(Race.ORC, Fighter, THIRD), OrcMystic(Race.ORC, Mystic, FIRST), OrcShaman(Race.ORC, Mystic, SECOND), Overlord(Race.ORC, Mystic, THIRD), Warcryer(Race.ORC, Mystic, THIRD), DwarvenFighter(Race.DWARF, Fighter, FIRST), DwarvenScavenger(Race.DWARF, Fighter, SECOND), BountyHunter(Race.DWARF, Fighter, THIRD), DwarvenArtisan(Race.DWARF, Fighter, SECOND), Warsmith(Race.DWARF, Fighter, THIRD), dummyEntry1(null, null, null), dummyEntry2(null, null, null), dummyEntry3(null, null, null), dummyEntry4(null, null, null), dummyEntry5(null, null, null), dummyEntry6(null, null, null), dummyEntry7(null, null, null), dummyEntry8(null, null, null), dummyEntry9(null, null, null), dummyEntry10(null, null, null), dummyEntry11(null, null, null), dummyEntry12(null, null, null), dummyEntry13(null, null, null), dummyEntry14(null, null, null), dummyEntry15(null, null, null), dummyEntry16(null, null, null), dummyEntry17(null, null, null), dummyEntry18(null, null, null), dummyEntry19(null, null, null), dummyEntry20(null, null, null), dummyEntry21(null, null, null), dummyEntry22(null, null, null), dummyEntry23(null, null, null), dummyEntry24(null, null, null), dummyEntry25(null, null, null), dummyEntry26(null, null, null), dummyEntry27(null, null, null), dummyEntry28(null, null, null), dummyEntry29(null, null, null), dummyEntry30(null, null, null), /* * (3rd classes) */ duelist(Race.HUMAN, Fighter, FOURTH), dreadnought(Race.HUMAN, Fighter, FOURTH), phoenixKnight(Race.HUMAN, Fighter, FOURTH), hellKnight(Race.HUMAN, Fighter, FOURTH), sagittarius(Race.HUMAN, Fighter, FOURTH), adventurer(Race.HUMAN, Fighter, FOURTH), archmage(Race.HUMAN, Mystic, FOURTH), soultaker(Race.HUMAN, Mystic, FOURTH), arcanaLord(Race.HUMAN, Mystic, FOURTH), cardinal(Race.HUMAN, Priest, FOURTH), hierophant(Race.HUMAN, Priest, FOURTH), evaTemplar(Race.ELF, Fighter, FOURTH), swordMuse(Race.ELF, Fighter, FOURTH), windRider(Race.ELF, Fighter, FOURTH), moonlightSentinel(Race.ELF, Fighter, FOURTH), mysticMuse(Race.ELF, Mystic, FOURTH), elementalMaster(Race.ELF, Mystic, FOURTH), evaSaint(Race.ELF, Priest, FOURTH), shillienTemplar(Race.DARK_ELF, Fighter, FOURTH), spectralDancer(Race.DARK_ELF, Fighter, FOURTH), ghostHunter(Race.DARK_ELF, Fighter, FOURTH), ghostSentinel(Race.DARK_ELF, Fighter, FOURTH), stormScreamer(Race.DARK_ELF, Mystic, FOURTH), spectralMaster(Race.DARK_ELF, Mystic, FOURTH), shillienSaint(Race.DARK_ELF, Priest, FOURTH), titan(Race.ORC, Fighter, FOURTH), grandKhavatari(Race.ORC, Fighter, FOURTH), dominator(Race.ORC, Mystic, FOURTH), doomcryer(Race.ORC, Mystic, FOURTH), fortuneSeeker(Race.DWARF, Fighter, FOURTH), maestro(Race.DWARF, Fighter, FOURTH), dummyEntry31(null, null, null), dummyEntry32(null, null, null), dummyEntry33(null, null, null), dummyEntry34(null, null, null), maleSoldier(Race.KAMAEL, Fighter, FIRST), femaleSoldier(Race.KAMAEL, Fighter, FIRST), trooper(Race.KAMAEL, Fighter, SECOND), warder(Race.KAMAEL, Fighter, SECOND), berserker(Race.KAMAEL, Fighter, THIRD), maleSoulbreaker(Race.KAMAEL, Fighter, THIRD), femaleSoulbreaker(Race.KAMAEL, Fighter, THIRD), arbalester(Race.KAMAEL, Fighter, THIRD), doombringer(Race.KAMAEL, Fighter, FOURTH), maleSoulhound(Race.KAMAEL, Fighter, FOURTH), femaleSoulhound(Race.KAMAEL, Fighter, FOURTH), trickster(Race.KAMAEL, Fighter, FOURTH), inspector(Race.KAMAEL, Fighter, THIRD), judicator(Race.KAMAEL, Fighter, FOURTH), dummyEntry35(null, null, null), dummyEntry36(null, null, null), sigelKnight(null, Fighter, null), tyrWarrior(null, Fighter, null), otherRogue(null, Fighter, null), yrArcher(null, Fighter, null), feohWizard(null, Mystic, null), issEnchanter(null, Priest, null), wynnSummoner(null, Mystic, null), eolhHealer(null, Priest, null), dummyEntry37(null, null, null), sigelPhoenixKnight(Race.HUMAN, Fighter, ClassLevel.AWAKEN), sigelHellKnight(Race.HUMAN, Fighter, ClassLevel.AWAKEN), sigelEvasTemplar(Race.ELF, Fighter, ClassLevel.AWAKEN), sigelShilenTemplar(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN), tyrDuelist(Race.HUMAN, Fighter, ClassLevel.AWAKEN), tyrDreadnought(Race.HUMAN, Fighter, ClassLevel.AWAKEN), tyrTitan(Race.ORC, Fighter, ClassLevel.AWAKEN), tyrGrandKhavatari(Race.ORC, Fighter, ClassLevel.AWAKEN), tyrMaestro(Race.DWARF, Fighter, ClassLevel.AWAKEN), tyrDoombringer(Race.KAMAEL, Fighter, ClassLevel.AWAKEN), othellAdventurer(Race.HUMAN, Fighter, ClassLevel.AWAKEN), othellWindRider(Race.ELF, Fighter, ClassLevel.AWAKEN), othellGhostHunter(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN), othellFortuneSeeker(Race.DWARF, Fighter, ClassLevel.AWAKEN), yrSagittarius(Race.HUMAN, Fighter, ClassLevel.AWAKEN), yrMoonlightSentinel(Race.ELF, Fighter, ClassLevel.AWAKEN), yrGhostSentinel(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN), yrTrickster(Race.KAMAEL, Fighter, ClassLevel.AWAKEN), feohArchmage(Race.HUMAN, Mystic, ClassLevel.AWAKEN), feohSoultaker(Race.HUMAN, Mystic, ClassLevel.AWAKEN), feohMysticMuse(Race.ELF, Mystic, ClassLevel.AWAKEN), feoStormScreamer(Race.DARK_ELF, Mystic, ClassLevel.AWAKEN), feohSoulHound(Race.KAMAEL, Mystic, ClassLevel.AWAKEN), // fix me issHierophant(Race.HUMAN, Priest, ClassLevel.AWAKEN), issSwordMuse(Race.ELF, Fighter, ClassLevel.AWAKEN), issSpectralDancer(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN), issDominator(Race.ORC, Priest, ClassLevel.AWAKEN), issDoomcryer(Race.ORC, Priest, ClassLevel.AWAKEN), wynnArcanaLord(Race.HUMAN, Mystic, ClassLevel.AWAKEN), wynnElementalMaster(Race.ELF, Mystic, ClassLevel.AWAKEN), wynnSpectralMaster(Race.DARK_ELF, Mystic, ClassLevel.AWAKEN), eolhCardinal(Race.HUMAN, Priest, ClassLevel.AWAKEN), eolhEvaSaint(Race.ELF, Priest, ClassLevel.AWAKEN), eolhShillienSaint(Race.DARK_ELF, Priest, ClassLevel.AWAKEN), ertheiaFighter(Race.ERTHEIA, Fighter, ClassLevel.FIRST), ertheiaWizzard(Race.ERTHEIA, Mystic, ClassLevel.FIRST), marauder(Race.ERTHEIA, Fighter, ClassLevel.THIRD), cloudBreaker(Race.ERTHEIA, Mystic, ClassLevel.THIRD), ripper(Race.ERTHEIA, Fighter, ClassLevel.FOURTH), Stratomancer(Race.ERTHEIA, Mystic, ClassLevel.FOURTH), eviscerator(Race.ERTHEIA, Fighter, ClassLevel.AWAKEN), sayhaSeer(Race.ERTHEIA, Mystic, ClassLevel.AWAKEN); private Race _race; private ClassLevel _level; private ClassType _type; private static final Set mainSubclassSet; private static final Set neverSubclassed = EnumSet.of(Overlord, Warsmith); private static final Set subclasseSet1 = EnumSet.of(DarkAvenger, Paladin, TempleKnight, ShillienKnight); private static final Set subclasseSet2 = EnumSet.of(TreasureHunter, AbyssWalker, Plainswalker); private static final Set subclasseSet3 = EnumSet.of(Hawkeye, SilverRanger, PhantomRanger); private static final Set subclasseSet4 = EnumSet.of(Warlock, ElementalSummoner, PhantomSummoner); private static final Set subclasseSet5 = EnumSet.of(Sorceror, Spellsinger, Spellhowler); private static final EnumMap> subclassSetMap = new EnumMap<>(PlayerClass.class); static { Set subclasses = getSet(null, THIRD); subclasses.removeAll(neverSubclassed); mainSubclassSet = subclasses; subclassSetMap.put(DarkAvenger, subclasseSet1); subclassSetMap.put(Paladin, subclasseSet1); subclassSetMap.put(TempleKnight, subclasseSet1); subclassSetMap.put(ShillienKnight, subclasseSet1); subclassSetMap.put(TreasureHunter, subclasseSet2); subclassSetMap.put(AbyssWalker, subclasseSet2); subclassSetMap.put(Plainswalker, subclasseSet2); subclassSetMap.put(Hawkeye, subclasseSet3); subclassSetMap.put(SilverRanger, subclasseSet3); subclassSetMap.put(PhantomRanger, subclasseSet3); subclassSetMap.put(Warlock, subclasseSet4); subclassSetMap.put(ElementalSummoner, subclasseSet4); subclassSetMap.put(PhantomSummoner, subclasseSet4); subclassSetMap.put(Sorceror, subclasseSet5); subclassSetMap.put(Spellsinger, subclasseSet5); subclassSetMap.put(Spellhowler, subclasseSet5); } private PlayerClass(Race race, ClassType pType, ClassLevel pLevel) { _race = race; _level = pLevel; _type = pType; } public final Set getAvailableSubclasses(L2PcInstance player) { Set subclasses = null; if (_level == THIRD) { subclasses = EnumSet.copyOf(mainSubclassSet); subclasses.remove(this); subclasses.removeAll(getSet(Race.ERTHEIA, THIRD)); if (player.getRace() == Race.KAMAEL) { if (player.getAppearance().getSex()) { subclasses.remove(femaleSoulbreaker); } else { subclasses.remove(maleSoulbreaker); } if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75)) { subclasses.remove(inspector); } } else { // Only Kamael can take Kamael classes as subclasses. subclasses.removeAll(getSet(Race.KAMAEL, THIRD)); } Set unavailableClasses = subclassSetMap.get(this); if (unavailableClasses != null) { subclasses.removeAll(unavailableClasses); } } return subclasses; } public static final EnumSet getSet(Race race, ClassLevel level) { EnumSet allOf = EnumSet.noneOf(PlayerClass.class); for (PlayerClass playerClass : EnumSet.allOf(PlayerClass.class)) { if ((race == null) || playerClass.isOfRace(race)) { if ((level == null) || playerClass.isOfLevel(level)) { allOf.add(playerClass); } } } return allOf; } public final boolean isOfRace(Race pRace) { return _race == pRace; } public final boolean isOfType(ClassType pType) { return _type == pType; } public final boolean isOfLevel(ClassLevel pLevel) { return _level == pLevel; } public final ClassLevel getLevel() { return _level; } }