Dropped PlayerClass.

This commit is contained in:
MobiusDevelopment
2019-10-22 15:47:05 +00:00
parent 6d65fd4b73
commit 0403790878
185 changed files with 2342 additions and 7804 deletions

View File

@@ -65,6 +65,7 @@ import org.l2jmobius.gameserver.data.sql.impl.CharSummonTable;
import org.l2jmobius.gameserver.data.sql.impl.ClanTable;
import org.l2jmobius.gameserver.data.xml.impl.AdminData;
import org.l2jmobius.gameserver.data.xml.impl.AttendanceRewardData;
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
import org.l2jmobius.gameserver.data.xml.impl.ClassListData;
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData;
import org.l2jmobius.gameserver.data.xml.impl.HennaData;
@@ -81,6 +82,7 @@ import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.ClanWarState;
import org.l2jmobius.gameserver.enums.ElementalType;
@@ -178,8 +180,6 @@ import org.l2jmobius.gameserver.model.actor.tasks.player.WaterTask;
import org.l2jmobius.gameserver.model.actor.templates.PlayerTemplate;
import org.l2jmobius.gameserver.model.actor.transform.Transform;
import org.l2jmobius.gameserver.model.base.ClassId;
import org.l2jmobius.gameserver.model.base.ClassLevel;
import org.l2jmobius.gameserver.model.base.PlayerClass;
import org.l2jmobius.gameserver.model.base.SubClass;
import org.l2jmobius.gameserver.model.ceremonyofchaos.CeremonyOfChaosEvent;
import org.l2jmobius.gameserver.model.clan.Clan;
@@ -2221,7 +2221,7 @@ public class PlayerInstance extends Playable
try
{
if ((getLvlJoinedAcademy() != 0) && (_clan != null) && (PlayerClass.values()[Id].getLevel() == ClassLevel.THIRD))
if ((_lvlJoinedAcademy != 0) && (_clan != null) && CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, Id))
{
if (_lvlJoinedAcademy <= 16)
{

View File

@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.base.PlayerClass;
import org.l2jmobius.gameserver.model.base.ClassId;
public class VillageMasterDElfInstance extends VillageMasterInstance
{
@@ -32,13 +32,13 @@ public class VillageMasterDElfInstance extends VillageMasterInstance
}
@Override
protected final boolean checkVillageMasterRace(PlayerClass pclass)
protected final boolean checkVillageMasterRace(ClassId pclass)
{
if (pclass == null)
{
return false;
}
return pclass.isOfRace(Race.DARK_ELF);
return pclass.getRace() == Race.DARK_ELF;
}
}

View File

@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.base.PlayerClass;
import org.l2jmobius.gameserver.model.base.ClassId;
public class VillageMasterDwarfInstance extends VillageMasterInstance
{
@@ -32,13 +32,13 @@ public class VillageMasterDwarfInstance extends VillageMasterInstance
}
@Override
protected final boolean checkVillageMasterRace(PlayerClass pclass)
protected final boolean checkVillageMasterRace(ClassId pclass)
{
if (pclass == null)
{
return false;
}
return pclass.isOfRace(Race.DWARF);
return pclass.getRace() == Race.DWARF;
}
}

View File

@@ -16,10 +16,11 @@
*/
package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.base.ClassType;
import org.l2jmobius.gameserver.model.base.PlayerClass;
import org.l2jmobius.gameserver.model.base.ClassId;
public class VillageMasterFighterInstance extends VillageMasterInstance
{
@@ -33,24 +34,24 @@ public class VillageMasterFighterInstance extends VillageMasterInstance
}
@Override
protected final boolean checkVillageMasterRace(PlayerClass pclass)
protected final boolean checkVillageMasterRace(ClassId pclass)
{
if (pclass == null)
{
return false;
}
return pclass.isOfRace(Race.HUMAN) || pclass.isOfRace(Race.ELF);
return (pclass.getRace() == Race.HUMAN) || (pclass.getRace() == Race.ELF);
}
@Override
protected final boolean checkVillageMasterTeachType(PlayerClass pclass)
protected final boolean checkVillageMasterTeachType(ClassId pclass)
{
if (pclass == null)
{
return false;
}
return pclass.isOfType(ClassType.Fighter);
return CategoryData.getInstance().isInCategory(CategoryType.FIGHTER_GROUP, pclass.getId());
}
}

View File

@@ -16,17 +16,22 @@
*/
package org.l2jmobius.gameserver.model.actor.instance;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.sql.impl.ClanTable;
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
import org.l2jmobius.gameserver.data.xml.impl.ClassListData;
import org.l2jmobius.gameserver.data.xml.impl.SkillTreesData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
@@ -38,7 +43,6 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.base.AcquireSkillType;
import org.l2jmobius.gameserver.model.base.ClassId;
import org.l2jmobius.gameserver.model.base.PlayerClass;
import org.l2jmobius.gameserver.model.base.SubClass;
import org.l2jmobius.gameserver.model.clan.Clan;
import org.l2jmobius.gameserver.model.clan.Clan.SubPledge;
@@ -64,6 +68,37 @@ public class VillageMasterInstance extends NpcInstance
{
private static Logger LOGGER = Logger.getLogger(VillageMasterInstance.class.getName());
private static final Set<ClassId> mainSubclassSet;
private static final Set<ClassId> neverSubclassed = EnumSet.of(ClassId.OVERLORD, ClassId.WARSMITH);
private static final Set<ClassId> subclasseSet1 = EnumSet.of(ClassId.DARK_AVENGER, ClassId.PALADIN, ClassId.TEMPLE_KNIGHT, ClassId.SHILLIEN_KNIGHT);
private static final Set<ClassId> subclasseSet2 = EnumSet.of(ClassId.TREASURE_HUNTER, ClassId.ABYSS_WALKER, ClassId.PLAINS_WALKER);
private static final Set<ClassId> subclasseSet3 = EnumSet.of(ClassId.HAWKEYE, ClassId.SILVER_RANGER, ClassId.PHANTOM_RANGER);
private static final Set<ClassId> subclasseSet4 = EnumSet.of(ClassId.WARLOCK, ClassId.ELEMENTAL_SUMMONER, ClassId.PHANTOM_SUMMONER);
private static final Set<ClassId> subclasseSet5 = EnumSet.of(ClassId.SORCERER, ClassId.SPELLSINGER, ClassId.SPELLHOWLER);
private static final EnumMap<ClassId, Set<ClassId>> subclassSetMap = new EnumMap<>(ClassId.class);
static
{
final Set<ClassId> subclasses = CategoryData.getInstance().getCategoryByType(CategoryType.THIRD_CLASS_GROUP).stream().map(ClassId::getClassId).collect(Collectors.toSet());
subclasses.removeAll(neverSubclassed);
mainSubclassSet = subclasses;
subclassSetMap.put(ClassId.DARK_AVENGER, subclasseSet1);
subclassSetMap.put(ClassId.PALADIN, subclasseSet1);
subclassSetMap.put(ClassId.TEMPLE_KNIGHT, subclasseSet1);
subclassSetMap.put(ClassId.SHILLIEN_KNIGHT, subclasseSet1);
subclassSetMap.put(ClassId.TREASURE_HUNTER, subclasseSet2);
subclassSetMap.put(ClassId.ABYSS_WALKER, subclasseSet2);
subclassSetMap.put(ClassId.PLAINS_WALKER, subclasseSet2);
subclassSetMap.put(ClassId.HAWKEYE, subclasseSet3);
subclassSetMap.put(ClassId.SILVER_RANGER, subclasseSet3);
subclassSetMap.put(ClassId.PHANTOM_RANGER, subclasseSet3);
subclassSetMap.put(ClassId.WARLOCK, subclasseSet4);
subclassSetMap.put(ClassId.ELEMENTAL_SUMMONER, subclasseSet4);
subclassSetMap.put(ClassId.PHANTOM_SUMMONER, subclasseSet4);
subclassSetMap.put(ClassId.SORCERER, subclasseSet5);
subclassSetMap.put(ClassId.SPELLSINGER, subclasseSet5);
subclassSetMap.put(ClassId.SPELLHOWLER, subclasseSet5);
}
/**
* Creates a village master.
* @param template the village master NPC template
@@ -365,7 +400,7 @@ public class VillageMasterInstance extends NpcInstance
LOGGER.warning(VillageMasterInstance.class.getName() + ": Wrong numeric values for command " + command);
}
Set<PlayerClass> subsAvailable = null;
Set<ClassId> subsAvailable = null;
switch (cmdChoice)
{
case 0: // Subclass change menu
@@ -384,9 +419,9 @@ public class VillageMasterInstance extends NpcInstance
{
html.setFile(player, "data/html/villagemaster/SubClass_Add.htm");
final StringBuilder content1 = new StringBuilder(200);
for (PlayerClass subClass : subsAvailable)
for (ClassId subClass : subsAvailable)
{
content1.append("<a action=\"bypass -h npc_%objectId%_Subclass 4 " + subClass.ordinal() + "\" msg=\"1268;" + ClassListData.getInstance().getClass(subClass.ordinal()).getClassName() + "\">" + ClassListData.getInstance().getClass(subClass.ordinal()).getClientCode() + "</a><br>");
content1.append("<a action=\"bypass -h npc_%objectId%_Subclass 4 " + subClass.getId() + "\" msg=\"1268;" + ClassListData.getInstance().getClass(subClass.getId()).getClassName() + "\">" + ClassListData.getInstance().getClass(subClass.getId()).getClientCode() + "</a><br>");
}
html.replace("%list%", content1.toString());
}
@@ -622,9 +657,9 @@ public class VillageMasterInstance extends NpcInstance
}
final StringBuilder content6 = new StringBuilder(200);
for (PlayerClass subClass : subsAvailable)
for (ClassId subClass : subsAvailable)
{
content6.append("<a action=\"bypass -h npc_%objectId%_Subclass 7 " + paramOne + " " + subClass.ordinal() + "\" msg=\"1445;\">" + ClassListData.getInstance().getClass(subClass.ordinal()).getClientCode() + "</a><br>");
content6.append("<a action=\"bypass -h npc_%objectId%_Subclass 7 " + paramOne + " " + subClass.getId() + "\" msg=\"1445;\">" + ClassListData.getInstance().getClass(subClass.getId()).getClientCode() + "</a><br>");
}
switch (paramOne)
@@ -735,7 +770,7 @@ public class VillageMasterInstance extends NpcInstance
* @param player
* @return
*/
private final Set<PlayerClass> getAvailableSubClasses(PlayerInstance player)
private final Set<ClassId> getAvailableSubClasses(PlayerInstance player)
{
// get player base class
final int currentBaseId = player.getBaseClass();
@@ -745,7 +780,7 @@ public class VillageMasterInstance extends NpcInstance
final int baseClassId;
if (baseCID.level() > 2)
{
baseClassId = baseCID.getParent().ordinal();
baseClassId = baseCID.getParent().getId();
}
else
{
@@ -758,13 +793,13 @@ public class VillageMasterInstance extends NpcInstance
* and Shillien Knight Warlocks, Elemental Summoner and Phantom Summoner Elder and Shillien Elder Swordsinger and Bladedancer Sorcerer, Spellsinger and Spellhowler Also, Kamael have a special, hidden 4 subclass, the inspector, which can only be taken if you have already completed the other
* two Kamael subclasses
*/
final Set<PlayerClass> availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player);
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
if ((availSubs != null) && !availSubs.isEmpty())
{
for (Iterator<PlayerClass> availSub = availSubs.iterator(); availSub.hasNext();)
for (Iterator<ClassId> availSub = availSubs.iterator(); availSub.hasNext();)
{
final PlayerClass pclass = availSub.next();
final ClassId pclass = availSub.next();
// check for the village master
if (!checkVillageMaster(pclass))
@@ -774,7 +809,7 @@ public class VillageMasterInstance extends NpcInstance
}
// scan for already used subclasses
final int availClassId = pclass.ordinal();
final int availClassId = pclass.getId();
final ClassId cid = ClassId.getClassId(availClassId);
SubClass prevSubClass;
ClassId subClassId;
@@ -795,6 +830,66 @@ public class VillageMasterInstance extends NpcInstance
return availSubs;
}
public final Set<ClassId> getSubclasses(PlayerInstance player, int classId)
{
Set<ClassId> subclasses = null;
final ClassId pClass = ClassId.getClassId(classId);
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, classId) || (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, classId)))
{
subclasses = EnumSet.copyOf(mainSubclassSet);
subclasses.remove(pClass);
// Kamaels can only take Kamael classes as subclasses.
for (ClassId cid : ClassId.values())
{
if ((cid.getRace() == Race.KAMAEL) && (player.getRace() != Race.KAMAEL))
{
subclasses.remove(cid);
}
}
// if (player.getRace() == Race.KAMAEL)
// {
// if (player.getAppearance().isFemale())
// {
// subclasses.remove(ClassId.FEMALE_SOULBREAKER);
// }
// else
// {
// subclasses.remove(ClassId.MALE_SOULBREAKER);
// }
//
// if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
// {
// subclasses.remove(ClassId.INSPECTOR);
// }
// }
Set<ClassId> unavailableClasses = subclassSetMap.get(pClass);
if (unavailableClasses != null)
{
subclasses.removeAll(unavailableClasses);
}
}
if (subclasses != null)
{
final ClassId currClassId = ClassId.getClassId(player.getClassId().getId());
for (ClassId tempClass : subclasses)
{
final ClassId tempClassId = ClassId.getClassId(tempClass.getId());
if (currClassId.equalsOrChildOf(tempClassId))
{
subclasses.remove(tempClass);
}
}
}
return subclasses;
}
/**
* Check new subclass classId for validity (villagemaster race/type, is not contains in previous subclasses, is contains in allowed subclasses) Base class not added into allowed subclasses.
* @param player
@@ -830,23 +925,23 @@ public class VillageMasterInstance extends NpcInstance
final int baseClassId;
if (baseCID.level() > 2)
{
baseClassId = baseCID.getParent().ordinal();
baseClassId = baseCID.getParent().getId();
}
else
{
baseClassId = currentBaseId;
}
final Set<PlayerClass> availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player);
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
if ((availSubs == null) || availSubs.isEmpty())
{
return false;
}
boolean found = false;
for (PlayerClass pclass : availSubs)
for (ClassId pclass : availSubs)
{
if (pclass.ordinal() == classId)
if (pclass.getId() == classId)
{
found = true;
break;
@@ -855,12 +950,12 @@ public class VillageMasterInstance extends NpcInstance
return found;
}
protected boolean checkVillageMasterRace(PlayerClass pclass)
protected boolean checkVillageMasterRace(ClassId pclass)
{
return true;
}
protected boolean checkVillageMasterTeachType(PlayerClass pclass)
protected boolean checkVillageMasterTeachType(ClassId pclass)
{
return true;
}
@@ -872,7 +967,7 @@ public class VillageMasterInstance extends NpcInstance
*/
public boolean checkVillageMaster(int classId)
{
return checkVillageMaster(PlayerClass.values()[classId]);
return checkVillageMaster(ClassId.getClassId(classId));
}
/**
@@ -880,7 +975,7 @@ public class VillageMasterInstance extends NpcInstance
* @param pclass
* @return
*/
public boolean checkVillageMaster(PlayerClass pclass)
public boolean checkVillageMaster(ClassId pclass)
{
if (Config.ALT_GAME_SUBCLASS_EVERYWHERE)
{

View File

@@ -16,10 +16,11 @@
*/
package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.base.ClassType;
import org.l2jmobius.gameserver.model.base.PlayerClass;
import org.l2jmobius.gameserver.model.base.ClassId;
public class VillageMasterMysticInstance extends VillageMasterInstance
{
@@ -33,24 +34,24 @@ public class VillageMasterMysticInstance extends VillageMasterInstance
}
@Override
protected final boolean checkVillageMasterRace(PlayerClass pclass)
protected final boolean checkVillageMasterRace(ClassId pclass)
{
if (pclass == null)
{
return false;
}
return pclass.isOfRace(Race.HUMAN) || pclass.isOfRace(Race.ELF);
return (pclass.getRace() == Race.HUMAN) || (pclass.getRace() == Race.ELF);
}
@Override
protected final boolean checkVillageMasterTeachType(PlayerClass pclass)
protected final boolean checkVillageMasterTeachType(ClassId pclass)
{
if (pclass == null)
{
return false;
}
return pclass.isOfType(ClassType.Mystic);
return CategoryData.getInstance().isInCategory(CategoryType.MAGE_GROUP, pclass.getId());
}
}

View File

@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.base.PlayerClass;
import org.l2jmobius.gameserver.model.base.ClassId;
public class VillageMasterOrcInstance extends VillageMasterInstance
{
@@ -32,13 +32,13 @@ public class VillageMasterOrcInstance extends VillageMasterInstance
}
@Override
protected final boolean checkVillageMasterRace(PlayerClass pclass)
protected final boolean checkVillageMasterRace(ClassId pclass)
{
if (pclass == null)
{
return false;
}
return pclass.isOfRace(Race.ORC);
return pclass.getRace() == Race.ORC;
}
}

View File

@@ -16,10 +16,11 @@
*/
package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.base.ClassType;
import org.l2jmobius.gameserver.model.base.PlayerClass;
import org.l2jmobius.gameserver.model.base.ClassId;
public class VillageMasterPriestInstance extends VillageMasterInstance
{
@@ -33,24 +34,24 @@ public class VillageMasterPriestInstance extends VillageMasterInstance
}
@Override
protected final boolean checkVillageMasterRace(PlayerClass pclass)
protected final boolean checkVillageMasterRace(ClassId pclass)
{
if (pclass == null)
{
return false;
}
return pclass.isOfRace(Race.HUMAN) || pclass.isOfRace(Race.ELF);
return (pclass.getRace() == Race.HUMAN) || (pclass.getRace() == Race.ELF);
}
@Override
protected final boolean checkVillageMasterTeachType(PlayerClass pclass)
protected final boolean checkVillageMasterTeachType(ClassId pclass)
{
if (pclass == null)
{
return false;
}
return pclass.isOfType(ClassType.Priest);
return CategoryData.getInstance().isInCategory(CategoryType.CLERIC_GROUP, pclass.getId());
}
}

View File

@@ -1,29 +0,0 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 org.l2jmobius.gameserver.model.base;
/**
* @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
*/
public enum ClassLevel
{
FIRST,
SECOND,
THIRD,
FOURTH,
AWAKEN
}

View File

@@ -1,28 +0,0 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 org.l2jmobius.gameserver.model.base;
/**
* ClassType Enum
* @author Tempy
*/
public enum ClassType
{
Fighter,
Mystic,
Priest
}

View File

@@ -1,362 +0,0 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 org.l2jmobius.gameserver.model.base;
import static org.l2jmobius.gameserver.model.base.ClassLevel.FIRST;
import static org.l2jmobius.gameserver.model.base.ClassLevel.FOURTH;
import static org.l2jmobius.gameserver.model.base.ClassLevel.SECOND;
import static org.l2jmobius.gameserver.model.base.ClassLevel.THIRD;
import static org.l2jmobius.gameserver.model.base.ClassType.Fighter;
import static org.l2jmobius.gameserver.model.base.ClassType.Mystic;
import static org.l2jmobius.gameserver.model.base.ClassType.Priest;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Set;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
/**
* @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),
/*
* (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),
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),
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),
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),
tyrrDuelist(Race.HUMAN, Fighter, ClassLevel.AWAKEN),
tyrrDreadnought(Race.HUMAN, Fighter, ClassLevel.AWAKEN),
tyrrTitan(Race.ORC, Fighter, ClassLevel.AWAKEN),
tyrrGrandKhavatari(Race.ORC, Fighter, ClassLevel.AWAKEN),
tyrrMaestro(Race.DWARF, Fighter, ClassLevel.AWAKEN),
tyrrDoombringer(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),
yulSagittarius(Race.HUMAN, Fighter, ClassLevel.AWAKEN),
yulMoonlightSentinel(Race.ELF, Fighter, ClassLevel.AWAKEN),
yulGhostSentinel(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN),
yulTrickster(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),
aeoreCardinal(Race.HUMAN, Priest, ClassLevel.AWAKEN),
aeoreEvaSaint(Race.ELF, Priest, ClassLevel.AWAKEN),
aeoreShillienSaint(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 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 Race _race;
private ClassLevel _level;
private ClassType _type;
private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
static
{
final 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);
}
private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
{
_race = race;
_level = pLevel;
_type = pType;
}
public Set<PlayerClass> getAvailableSubclasses(PlayerInstance player)
{
Set<PlayerClass> 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));
final Set<PlayerClass> 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().isFemale())
{
subclasses.removeAll(EnumSet.of(maleSoulbreaker));
}
else
{
subclasses.removeAll(EnumSet.of(femaleSoulbreaker));
}
}
if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
{
subclasses.removeAll(EnumSet.of(inspector));
}
}
}
return subclasses;
}
public static EnumSet<PlayerClass> getSet(Race race, ClassLevel level)
{
final 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 boolean isOfRace(Race pRace)
{
return _race == pRace;
}
public boolean isOfType(ClassType pType)
{
return _type == pType;
}
public boolean isOfLevel(ClassLevel pLevel)
{
return _level == pLevel;
}
public ClassLevel getLevel()
{
return _level;
}
}

View File

@@ -28,7 +28,7 @@ public class SubClass
{
private static final byte _maxLevel = Config.MAX_SUBCLASS_LEVEL < ExperienceData.getInstance().getMaxLevel() ? Config.MAX_SUBCLASS_LEVEL : (byte) (ExperienceData.getInstance().getMaxLevel() - 1);
private PlayerClass _class;
private ClassId _class;
private long _exp = ExperienceData.getInstance().getExpForLevel(Config.BASE_SUBCLASS_LEVEL);
private long _sp = 0;
private byte _level = Config.BASE_SUBCLASS_LEVEL;
@@ -45,7 +45,7 @@ public class SubClass
// using the preset default values.
}
public PlayerClass getClassDefinition()
public ClassId getClassDefinition()
{
return _class;
}
@@ -91,7 +91,7 @@ public class SubClass
public void setClassId(int classId)
{
_class = PlayerClass.values()[classId];
_class = ClassId.getClassId(classId);
}
public void setExp(long expValue)