/*
* 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.Config;
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);
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);
}
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)
{
if (player.getRace() != Race.KAMAEL)
{
subclasses = EnumSet.copyOf(mainSubclassSet);
subclasses.remove(this);
switch (player.getRace())
{
case ELF:
subclasses.removeAll(getSet(Race.DARK_ELF, Third));
break;
case DARK_ELF:
subclasses.removeAll(getSet(Race.ELF, Third));
break;
}
subclasses.removeAll(getSet(Race.KAMAEL, Third));
Set unavailableClasses = subclassSetMap.get(this);
if (unavailableClasses != null)
{
subclasses.removeAll(unavailableClasses);
}
}
else
{
subclasses = getSet(Race.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 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;
}
}