123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- /*
- * Copyright (C) 2004-2013 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 <http://www.gnu.org/licenses/>.
- */
- package com.l2jserver.gameserver.model.base;
- import static com.l2jserver.gameserver.enums.PcRace.DarkElf;
- import static com.l2jserver.gameserver.enums.PcRace.Dwarf;
- import static com.l2jserver.gameserver.enums.PcRace.Elf;
- import static com.l2jserver.gameserver.enums.PcRace.Human;
- import static com.l2jserver.gameserver.enums.PcRace.Kamael;
- import static com.l2jserver.gameserver.enums.PcRace.Orc;
- 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.Config;
- import com.l2jserver.gameserver.enums.PcRace;
- import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
- /**
- * @author luisantonioa
- */
- public enum PlayerClass
- {
- HumanFighter(Human, Fighter, First),
- Warrior(Human, Fighter, Second),
- Gladiator(Human, Fighter, Third),
- Warlord(Human, Fighter, Third),
- HumanKnight(Human, Fighter, Second),
- Paladin(Human, Fighter, Third),
- DarkAvenger(Human, Fighter, Third),
- Rogue(Human, Fighter, Second),
- TreasureHunter(Human, Fighter, Third),
- Hawkeye(Human, Fighter, Third),
- HumanMystic(Human, Mystic, First),
- HumanWizard(Human, Mystic, Second),
- Sorceror(Human, Mystic, Third),
- Necromancer(Human, Mystic, Third),
- Warlock(Human, Mystic, Third),
- Cleric(Human, Priest, Second),
- Bishop(Human, Priest, Third),
- Prophet(Human, Priest, Third),
-
- ElvenFighter(Elf, Fighter, First),
- ElvenKnight(Elf, Fighter, Second),
- TempleKnight(Elf, Fighter, Third),
- Swordsinger(Elf, Fighter, Third),
- ElvenScout(Elf, Fighter, Second),
- Plainswalker(Elf, Fighter, Third),
- SilverRanger(Elf, Fighter, Third),
- ElvenMystic(Elf, Mystic, First),
- ElvenWizard(Elf, Mystic, Second),
- Spellsinger(Elf, Mystic, Third),
- ElementalSummoner(Elf, Mystic, Third),
- ElvenOracle(Elf, Priest, Second),
- ElvenElder(Elf, Priest, Third),
-
- DarkElvenFighter(DarkElf, Fighter, First),
- PalusKnight(DarkElf, Fighter, Second),
- ShillienKnight(DarkElf, Fighter, Third),
- Bladedancer(DarkElf, Fighter, Third),
- Assassin(DarkElf, Fighter, Second),
- AbyssWalker(DarkElf, Fighter, Third),
- PhantomRanger(DarkElf, Fighter, Third),
- DarkElvenMystic(DarkElf, Mystic, First),
- DarkElvenWizard(DarkElf, Mystic, Second),
- Spellhowler(DarkElf, Mystic, Third),
- PhantomSummoner(DarkElf, Mystic, Third),
- ShillienOracle(DarkElf, Priest, Second),
- ShillienElder(DarkElf, Priest, Third),
-
- OrcFighter(Orc, Fighter, First),
- OrcRaider(Orc, Fighter, Second),
- Destroyer(Orc, Fighter, Third),
- OrcMonk(Orc, Fighter, Second),
- Tyrant(Orc, Fighter, Third),
- OrcMystic(Orc, Mystic, First),
- OrcShaman(Orc, Mystic, Second),
- Overlord(Orc, Mystic, Third),
- Warcryer(Orc, Mystic, Third),
-
- DwarvenFighter(Dwarf, Fighter, First),
- DwarvenScavenger(Dwarf, Fighter, Second),
- BountyHunter(Dwarf, Fighter, Third),
- DwarvenArtisan(Dwarf, Fighter, Second),
- Warsmith(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(Human, Fighter, Fourth),
- dreadnought(Human, Fighter, Fourth),
- phoenixKnight(Human, Fighter, Fourth),
- hellKnight(Human, Fighter, Fourth),
- sagittarius(Human, Fighter, Fourth),
- adventurer(Human, Fighter, Fourth),
- archmage(Human, Mystic, Fourth),
- soultaker(Human, Mystic, Fourth),
- arcanaLord(Human, Mystic, Fourth),
- cardinal(Human, Priest, Fourth),
- hierophant(Human, Priest, Fourth),
-
- evaTemplar(Elf, Fighter, Fourth),
- swordMuse(Elf, Fighter, Fourth),
- windRider(Elf, Fighter, Fourth),
- moonlightSentinel(Elf, Fighter, Fourth),
- mysticMuse(Elf, Mystic, Fourth),
- elementalMaster(Elf, Mystic, Fourth),
- evaSaint(Elf, Priest, Fourth),
-
- shillienTemplar(DarkElf, Fighter, Fourth),
- spectralDancer(DarkElf, Fighter, Fourth),
- ghostHunter(DarkElf, Fighter, Fourth),
- ghostSentinel(DarkElf, Fighter, Fourth),
- stormScreamer(DarkElf, Mystic, Fourth),
- spectralMaster(DarkElf, Mystic, Fourth),
- shillienSaint(DarkElf, Priest, Fourth),
-
- titan(Orc, Fighter, Fourth),
- grandKhavatari(Orc, Fighter, Fourth),
- dominator(Orc, Mystic, Fourth),
- doomcryer(Orc, Mystic, Fourth),
-
- fortuneSeeker(Dwarf, Fighter, Fourth),
- maestro(Dwarf, Fighter, Fourth),
-
- dummyEntry31(null, null, null),
- dummyEntry32(null, null, null),
- dummyEntry33(null, null, null),
- dummyEntry34(null, null, null),
-
- maleSoldier(Kamael, Fighter, First),
- femaleSoldier(Kamael, Fighter, First),
- trooper(Kamael, Fighter, Second),
- warder(Kamael, Fighter, Second),
- berserker(Kamael, Fighter, Third),
- maleSoulbreaker(Kamael, Fighter, Third),
- femaleSoulbreaker(Kamael, Fighter, Third),
- arbalester(Kamael, Fighter, Third),
- doombringer(Kamael, Fighter, Fourth),
- maleSoulhound(Kamael, Fighter, Fourth),
- femaleSoulhound(Kamael, Fighter, Fourth),
- trickster(Kamael, Fighter, Fourth),
- inspector(Kamael, Fighter, Third),
- judicator(Kamael, Fighter, Fourth);
-
- private PcRace _race;
- private ClassLevel _level;
- private ClassType _type;
-
- private static final Set<PlayerClass> mainSubclassSet;
- private static final Set<PlayerClass> neverSubclassed = EnumSet.of(Overlord, Warsmith);
-
- private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(DarkAvenger, Paladin, TempleKnight, ShillienKnight);
- private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(TreasureHunter, AbyssWalker, Plainswalker);
- private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(Hawkeye, SilverRanger, PhantomRanger);
- private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(Warlock, ElementalSummoner, PhantomSummoner);
- private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(Sorceror, Spellsinger, Spellhowler);
-
- private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
-
- static
- {
- Set<PlayerClass> 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);
- }
-
- PlayerClass(PcRace pRace, ClassType pType, ClassLevel pLevel)
- {
- _race = pRace;
- _level = pLevel;
- _type = pType;
- }
-
- public final Set<PlayerClass> getAvailableSubclasses(L2PcInstance player)
- {
- Set<PlayerClass> subclasses = null;
-
- if (_level == Third)
- {
- if (player.getRace() != Kamael)
- {
- subclasses = EnumSet.copyOf(mainSubclassSet);
-
- subclasses.remove(this);
-
- switch (player.getRace())
- {
- case Elf:
- subclasses.removeAll(getSet(DarkElf, Third));
- break;
- case DarkElf:
- subclasses.removeAll(getSet(Elf, Third));
- break;
- }
-
- subclasses.removeAll(getSet(Kamael, Third));
-
- Set<PlayerClass> unavailableClasses = subclassSetMap.get(this);
-
- if (unavailableClasses != null)
- {
- subclasses.removeAll(unavailableClasses);
- }
-
- }
- else
- {
- subclasses = getSet(Kamael, Third);
- subclasses.remove(this);
- // Check sex, male subclasses female and vice versa
- // If server owner set MaxSubclass > 3 some kamael's cannot take 4 sub
- // So, in that situation we must skip sex check
- if (Config.MAX_SUBCLASS <= 3)
- {
- if (player.getAppearance().getSex())
- {
- subclasses.removeAll(EnumSet.of(femaleSoulbreaker));
- }
- else
- {
- subclasses.removeAll(EnumSet.of(maleSoulbreaker));
- }
- }
- if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
- {
- subclasses.removeAll(EnumSet.of(inspector));
- }
- }
- }
- return subclasses;
- }
-
- public static final EnumSet<PlayerClass> getSet(PcRace race, ClassLevel level)
- {
- EnumSet<PlayerClass> 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(PcRace 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;
- }
- }
|