Dropped PlayerClass.
This commit is contained in:
+115
-172
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package ai.areas.TalkingIsland.Raina;
|
||||
|
||||
import static org.l2jmobius.gameserver.model.base.ClassLevel.THIRD;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
@@ -25,7 +23,9 @@ import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
@@ -37,8 +37,6 @@ import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
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.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -68,45 +66,37 @@ public class Raina extends AbstractNpcAI
|
||||
private static final int RAINA = 33491;
|
||||
// Items
|
||||
private static final int SUBCLASS_CERTIFICATE = 30433;
|
||||
private static final int CHAOS_POMANDER_DUAL_CLASS = 37375;
|
||||
private static final int ABELIUS_POWER = 32264;
|
||||
private static final int SAPYROS_POWER = 32265;
|
||||
private static final int ASHAGEN_POWER = 32266;
|
||||
private static final int CRANIGG_POWER = 32267;
|
||||
private static final int SOLTKREIG_POWER = 32268;
|
||||
private static final int NAVIAROPE_POWER = 32269;
|
||||
private static final int LEISTER_POWER = 32270;
|
||||
private static final int LAKCIS_POWER = 32271;
|
||||
private static final int CHAOS_POMANDER = 37375;
|
||||
// Misc
|
||||
private static final Set<PlayerClass> mainSubclassSet;
|
||||
private static final Set<PlayerClass> neverSubclassed = EnumSet.of(PlayerClass.Overlord, PlayerClass.Warsmith);
|
||||
private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(PlayerClass.DarkAvenger, PlayerClass.Paladin, PlayerClass.TempleKnight, PlayerClass.ShillienKnight);
|
||||
private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(PlayerClass.TreasureHunter, PlayerClass.AbyssWalker, PlayerClass.Plainswalker);
|
||||
private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(PlayerClass.Hawkeye, PlayerClass.SilverRanger, PlayerClass.PhantomRanger);
|
||||
private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(PlayerClass.Warlock, PlayerClass.ElementalSummoner, PlayerClass.PhantomSummoner);
|
||||
private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(PlayerClass.Sorceror, PlayerClass.Spellsinger, PlayerClass.Spellhowler);
|
||||
private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
|
||||
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<PlayerClass> subclasses = PlayerClass.getSet(null, THIRD);
|
||||
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(PlayerClass.DarkAvenger, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.Paladin, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TempleKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.ShillienKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TreasureHunter, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.AbyssWalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Plainswalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Hawkeye, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.SilverRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.PhantomRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.Warlock, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.ElementalSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.PhantomSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.Sorceror, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellsinger, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellhowler, subclasseSet5);
|
||||
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);
|
||||
}
|
||||
|
||||
private static final Map<CategoryType, Integer> classCloak = new HashMap<>();
|
||||
@@ -122,17 +112,30 @@ public class Raina extends AbstractNpcAI
|
||||
classCloak.put(CategoryType.SIXTH_EOLH_GROUP, 30317); // Laksis Cloak Grade
|
||||
}
|
||||
|
||||
private static final List<PlayerClass> dualClassList = new ArrayList<>();
|
||||
private static final Map<CategoryType, Integer> powerItem = new HashMap<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.sigelPhoenixKnight, PlayerClass.sigelHellKnight, PlayerClass.sigelEvasTemplar, PlayerClass.sigelShilenTemplar));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.tyrrDuelist, PlayerClass.tyrrDreadnought, PlayerClass.tyrrTitan, PlayerClass.tyrrGrandKhavatari, PlayerClass.tyrrDoombringer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.othellAdventurer, PlayerClass.othellWindRider, PlayerClass.othellGhostHunter, PlayerClass.othellFortuneSeeker));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.yulSagittarius, PlayerClass.yulMoonlightSentinel, PlayerClass.yulGhostSentinel, PlayerClass.yulTrickster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.feohArchmage, PlayerClass.feohSoultaker, PlayerClass.feohMysticMuse, PlayerClass.feoStormScreamer, PlayerClass.feohSoulHound));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.issHierophant, PlayerClass.issSwordMuse, PlayerClass.issSpectralDancer, PlayerClass.issDoomcryer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.wynnArcanaLord, PlayerClass.wynnElementalMaster, PlayerClass.wynnSpectralMaster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.aeoreCardinal, PlayerClass.aeoreEvaSaint, PlayerClass.aeoreShillienSaint));
|
||||
powerItem.put(CategoryType.SIXTH_SIGEL_GROUP, 32264); // Abelius Power
|
||||
powerItem.put(CategoryType.SIXTH_TIR_GROUP, 32265); // Sapyros Power
|
||||
powerItem.put(CategoryType.SIXTH_OTHEL_GROUP, 32266); // Ashagen Power
|
||||
powerItem.put(CategoryType.SIXTH_YR_GROUP, 32267); // Cranigg Power
|
||||
powerItem.put(CategoryType.SIXTH_FEOH_GROUP, 32268); // Soltkreig Power
|
||||
powerItem.put(CategoryType.SIXTH_WYNN_GROUP, 32269); // Naviarope Power
|
||||
powerItem.put(CategoryType.SIXTH_IS_GROUP, 32270); // Leister Power
|
||||
powerItem.put(CategoryType.SIXTH_EOLH_GROUP, 32271); // Laksis Power
|
||||
}
|
||||
|
||||
private static final List<ClassId> dualClassList = new ArrayList<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(ClassId.SIGEL_PHOENIX_KNIGHT, ClassId.SIGEL_HELL_KNIGHT, ClassId.SIGEL_EVA_TEMPLAR, ClassId.SIGEL_SHILLIEN_TEMPLAR));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.TYRR_DUELIST, ClassId.TYRR_DREADNOUGHT, ClassId.TYRR_TITAN, ClassId.TYRR_GRAND_KHAVATARI, ClassId.TYRR_DOOMBRINGER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.OTHELL_ADVENTURER, ClassId.OTHELL_WIND_RIDER, ClassId.OTHELL_GHOST_HUNTER, ClassId.OTHELL_FORTUNE_SEEKER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.YUL_SAGITTARIUS, ClassId.YUL_MOONLIGHT_SENTINEL, ClassId.YUL_GHOST_SENTINEL, ClassId.YUL_TRICKSTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.FEOH_ARCHMAGE, ClassId.FEOH_SOULTAKER, ClassId.FEOH_MYSTIC_MUSE, ClassId.FEOH_STORM_SCREAMER, ClassId.FEOH_SOUL_HOUND));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.ISS_HIEROPHANT, ClassId.ISS_SWORD_MUSE, ClassId.ISS_SPECTRAL_DANCER, ClassId.ISS_DOOMCRYER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.WYNN_ARCANA_LORD, ClassId.WYNN_ELEMENTAL_MASTER, ClassId.WYNN_SPECTRAL_MASTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.AEORE_CARDINAL, ClassId.AEORE_EVA_SAINT, ClassId.AEORE_SHILLIEN_SAINT));
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
@@ -193,7 +196,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
else
|
||||
{
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassList.html");
|
||||
|
||||
@@ -202,11 +205,11 @@ public class Raina extends AbstractNpcAI
|
||||
break;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"0\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -327,11 +330,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addDualClassErtheiaList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -348,7 +351,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -376,7 +379,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -412,11 +415,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenClassList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -516,7 +519,7 @@ public class Raina extends AbstractNpcAI
|
||||
case 2: // Remove (change) subclass list
|
||||
{
|
||||
final int subclassIndex = event.getReply();
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "removeSubclassList.html");
|
||||
|
||||
@@ -525,11 +528,11 @@ public class Raina extends AbstractNpcAI
|
||||
return;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"3\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -581,13 +584,13 @@ public class Raina extends AbstractNpcAI
|
||||
case 5: // Reawaken (change dual class)
|
||||
{
|
||||
final int classId = event.getReply();
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal())))
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass()))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -617,9 +620,9 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getCloakId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -638,7 +641,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -652,68 +655,34 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getPowerItemId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addPowerItem(PlayerInstance player)
|
||||
{
|
||||
int itemId = ABELIUS_POWER; // Sigel
|
||||
if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
itemId = SAPYROS_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
itemId = ASHAGEN_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
itemId = CRANIGG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
itemId = SOLTKREIG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
itemId = NAVIAROPE_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
itemId = LEISTER_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
itemId = LAKCIS_POWER;
|
||||
}
|
||||
giveItems(player, itemId, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of available subclasses Base class and already used subclasses removed
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private Set<PlayerClass> getAvailableSubClasses(PlayerInstance player)
|
||||
private Set<ClassId> getAvailableSubClasses(PlayerInstance player)
|
||||
{
|
||||
final int currentBaseId = player.getBaseClass();
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
final int baseClassId = (baseCID.level() > 2) ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs != null) && !availSubs.isEmpty())
|
||||
{
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
// scan for already used subclasses
|
||||
final int availClassId = pclass.ordinal();
|
||||
final int availClassId = pclass.getId();
|
||||
final ClassId cid = ClassId.getClassId(availClassId);
|
||||
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
@@ -722,7 +691,7 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
if (subId.equalsOrChildOf(cid))
|
||||
{
|
||||
availSubs.remove(pclass);
|
||||
availSubs.remove(cid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -745,11 +714,11 @@ public class Raina extends AbstractNpcAI
|
||||
*/
|
||||
private boolean isValidNewSubClass(PlayerInstance player, int classId)
|
||||
{
|
||||
final ClassId cid = ClassId.values()[classId];
|
||||
final ClassId cid = ClassId.getClassId(classId);
|
||||
ClassId subClassId;
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
{
|
||||
subClassId = ClassId.values()[subList.getClassId()];
|
||||
subClassId = ClassId.getClassId(subList.getClassId());
|
||||
|
||||
if (subClassId.equalsOrChildOf(cid))
|
||||
{
|
||||
@@ -762,8 +731,8 @@ public class Raina extends AbstractNpcAI
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
|
||||
// we need 2nd occupation ID
|
||||
final int baseClassId = baseCID.level() > 2 ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs == null) || availSubs.isEmpty())
|
||||
{
|
||||
@@ -771,9 +740,9 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
if (pclass.ordinal() == classId)
|
||||
if (pclass.getId() == classId)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
@@ -796,29 +765,29 @@ public class Raina extends AbstractNpcAI
|
||||
return leveled;
|
||||
}
|
||||
|
||||
public List<PlayerClass> getAvailableDualclasses(PlayerInstance player)
|
||||
public List<ClassId> getAvailableDualclasses(PlayerInstance player)
|
||||
{
|
||||
final List<PlayerClass> dualClasses = new ArrayList<>();
|
||||
final List<ClassId> dualClasses = new ArrayList<>();
|
||||
|
||||
for (PlayerClass playerClass : PlayerClass.values())
|
||||
for (ClassId ClassId : ClassId.values())
|
||||
{
|
||||
if (!playerClass.isOfRace(Race.ERTHEIA) && playerClass.isOfLevel(ClassLevel.AWAKEN) && (playerClass.ordinal() != player.getClassId().getId()))
|
||||
if ((ClassId.getRace() != Race.ERTHEIA) && CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, ClassId.getId()) && (ClassId.getId() != player.getClassId().getId()))
|
||||
{
|
||||
dualClasses.add(playerClass);
|
||||
dualClasses.add(ClassId);
|
||||
}
|
||||
}
|
||||
return dualClasses;
|
||||
}
|
||||
|
||||
private List<PlayerClass> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
private List<ClassId> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
{
|
||||
final List<PlayerClass> tempList = new ArrayList<>();
|
||||
final List<ClassId> tempList = new ArrayList<>();
|
||||
final int baseClassId = player.getBaseClass();
|
||||
final int dualClassId = player.getClassId().getId();
|
||||
|
||||
for (PlayerClass temp : dualClassList)
|
||||
for (ClassId temp : dualClassList)
|
||||
{
|
||||
if ((temp.ordinal() != baseClassId) && (temp.ordinal() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.ordinal())))
|
||||
if ((temp.getId() != baseClassId) && (temp.getId() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.getId())))
|
||||
{
|
||||
tempList.add(temp);
|
||||
}
|
||||
@@ -826,40 +795,43 @@ public class Raina extends AbstractNpcAI
|
||||
return tempList;
|
||||
}
|
||||
|
||||
public Set<PlayerClass> getSubclasses(PlayerInstance player, int classId)
|
||||
public final Set<ClassId> getSubclasses(PlayerInstance player, int classId)
|
||||
{
|
||||
Set<PlayerClass> subclasses = null;
|
||||
final PlayerClass pClass = PlayerClass.values()[classId];
|
||||
Set<ClassId> subclasses = null;
|
||||
final ClassId pClass = ClassId.getClassId(classId);
|
||||
|
||||
if ((pClass.getLevel() == THIRD) || (pClass.getLevel() == ClassLevel.FOURTH))
|
||||
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, classId) || (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, classId)))
|
||||
{
|
||||
subclasses = EnumSet.copyOf(mainSubclassSet);
|
||||
subclasses.remove(pClass);
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.ERTHEIA, THIRD));
|
||||
|
||||
// Ertheia classes cannot be subclassed and only Kamael can take Kamael classes as subclasses.
|
||||
for (ClassId cid : ClassId.values())
|
||||
{
|
||||
if ((cid.getRace() == Race.ERTHEIA) || ((cid.getRace() == Race.KAMAEL) && (player.getRace() != Race.KAMAEL)))
|
||||
{
|
||||
subclasses.remove(cid);
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getRace() == Race.KAMAEL)
|
||||
{
|
||||
if (player.getAppearance().isFemale())
|
||||
{
|
||||
subclasses.remove(PlayerClass.femaleSoulbreaker);
|
||||
subclasses.remove(ClassId.MALE_SOULBREAKER);
|
||||
}
|
||||
else
|
||||
{
|
||||
subclasses.remove(PlayerClass.maleSoulbreaker);
|
||||
subclasses.remove(ClassId.FEMALE_SOULBREAKER);
|
||||
}
|
||||
|
||||
if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
|
||||
{
|
||||
subclasses.remove(PlayerClass.inspector);
|
||||
subclasses.remove(ClassId.INSPECTOR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only Kamael can take Kamael classes as subclasses.
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.KAMAEL, THIRD));
|
||||
}
|
||||
|
||||
final Set<PlayerClass> unavailableClasses = subclassSetMap.get(pClass);
|
||||
Set<ClassId> unavailableClasses = subclassSetMap.get(pClass);
|
||||
|
||||
if (unavailableClasses != null)
|
||||
{
|
||||
@@ -870,9 +842,9 @@ public class Raina extends AbstractNpcAI
|
||||
if (subclasses != null)
|
||||
{
|
||||
final ClassId currClassId = ClassId.getClassId(player.getClassId().getId());
|
||||
for (PlayerClass tempClass : subclasses)
|
||||
for (ClassId tempClass : subclasses)
|
||||
{
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.ordinal());
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.getId());
|
||||
|
||||
if (currClassId.equalsOrChildOf(tempClassId))
|
||||
{
|
||||
@@ -908,41 +880,12 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
private int getCloakId(PlayerInstance player)
|
||||
{
|
||||
CategoryType catType = null;
|
||||
return classCloak.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
if (player.isInCategory(CategoryType.SIXTH_SIGEL_GROUP))
|
||||
private int getPowerItemId(PlayerInstance player)
|
||||
{
|
||||
catType = CategoryType.SIXTH_SIGEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_TIR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_OTHEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_YR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_FEOH_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_IS_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_WYNN_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_EOLH_GROUP;
|
||||
}
|
||||
return classCloak.get(catType);
|
||||
return powerItem.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
|
||||
+1
-2
@@ -34,7 +34,6 @@ import org.l2jmobius.gameserver.instancemanager.MentorManager;
|
||||
import org.l2jmobius.gameserver.model.Mentee;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.entity.Message;
|
||||
import org.l2jmobius.gameserver.model.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -151,7 +150,7 @@ public class MentorGuide extends AbstractNpcAI implements IXmlReader
|
||||
|
||||
if (event.equalsIgnoreCase("exchange"))
|
||||
{
|
||||
if (hasQuestItems(player, MENTEE_CERT) && (player.getLevel() >= MAX_LEVEL) && (player.getClassId().level() == ClassLevel.AWAKEN.ordinal()))
|
||||
if (hasQuestItems(player, MENTEE_CERT) && (player.getLevel() >= MAX_LEVEL) && player.isAwakenedClass())
|
||||
{
|
||||
takeItems(player, MENTEE_CERT, 1);
|
||||
giveItems(player, DIPLOMA, 40);
|
||||
|
||||
+1
-2
@@ -20,7 +20,6 @@ import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -120,7 +119,7 @@ public class Q00491_InNominePatris extends Quest
|
||||
}
|
||||
case State.CREATED:
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33649-01.htm" : "33649-00.html");
|
||||
htmltext = (player.isAwakenedClass() ? "33649-01.htm" : "33649-00.html");
|
||||
break;
|
||||
}
|
||||
case State.STARTED:
|
||||
|
||||
Vendored
+6
-7
@@ -19,7 +19,6 @@ package quests.Q10370_MenacingTimes;
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -155,7 +154,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
{
|
||||
case ORVEN:
|
||||
{
|
||||
if ((player.getRace() == Race.HUMAN) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.HUMAN) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30857-01.htm";
|
||||
}
|
||||
@@ -167,7 +166,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case WINONIN:
|
||||
{
|
||||
if ((player.getRace() == Race.ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30856-01.htm";
|
||||
}
|
||||
@@ -179,7 +178,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case OLTRAN:
|
||||
{
|
||||
if ((player.getRace() == Race.DARK_ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DARK_ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30862-01.htm";
|
||||
}
|
||||
@@ -191,7 +190,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case LADANZA:
|
||||
{
|
||||
if ((player.getRace() == Race.ORC) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ORC) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30865-01.htm";
|
||||
}
|
||||
@@ -203,7 +202,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case FERRIS:
|
||||
{
|
||||
if ((player.getRace() == Race.DWARF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DWARF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30847-01.htm";
|
||||
}
|
||||
@@ -215,7 +214,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case BROME:
|
||||
{
|
||||
if ((player.getRace() == Race.KAMAEL) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.KAMAEL) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "32221-01.htm";
|
||||
}
|
||||
|
||||
Vendored
+1
-2
@@ -19,7 +19,6 @@ package quests.Q10371_GraspThyPower;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -103,7 +102,7 @@ public class Q10371_GraspThyPower extends Quest
|
||||
{
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
if ((qs.isCreated()) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((qs.isCreated()) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "33648-01.htm";
|
||||
}
|
||||
|
||||
+1
-2
@@ -18,7 +18,6 @@ package quests.Q10372_PurgatoryVolvere;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -126,7 +125,7 @@ public class Q10372_PurgatoryVolvere extends Quest
|
||||
{
|
||||
if (npc.getId() == GERKENSHTEIN)
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33648-01.htm" : "complete.htm");
|
||||
htmltext = (player.isAwakenedClass() ? "33648-01.htm" : "complete.htm");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10374_ThatPlaceSuccubus;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -110,7 +111,7 @@ public class Q10374_ThatPlaceSuccubus extends Quest
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10375_SuccubusDisciples;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -106,7 +107,7 @@ public class Q10375_SuccubusDisciples extends Quest
|
||||
htmltext = getAlreadyCompletedMsg(player);
|
||||
}
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
+1
-2
@@ -21,7 +21,6 @@ import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -157,7 +156,7 @@ public class Q10376_BloodyGoodTime extends Quest
|
||||
{
|
||||
case State.CREATED:
|
||||
{
|
||||
if (((player.getClassId().level() != ClassLevel.AWAKEN.ordinal()) && (player.getRace() != Race.ERTHEIA)))
|
||||
if (!player.isAwakenedClass() && (player.getRace() != Race.ERTHEIA))
|
||||
{
|
||||
return "32140-01.htm";
|
||||
}
|
||||
|
||||
+7
-3
@@ -63,6 +63,7 @@ import org.l2jmobius.gameserver.data.sql.impl.CharNameTable;
|
||||
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.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;
|
||||
@@ -175,8 +176,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;
|
||||
@@ -2334,7 +2333,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
try
|
||||
{
|
||||
if ((getLvlJoinedAcademy() != 0) && (_clan != null) && (PlayerClass.values()[Id].getLevel() == ClassLevel.THIRD))
|
||||
if ((getLvlJoinedAcademy() != 0) && (_clan != null) && CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, Id))
|
||||
{
|
||||
if (_lvlJoinedAcademy <= 16)
|
||||
{
|
||||
@@ -9782,6 +9781,11 @@ public class PlayerInstance extends Playable
|
||||
return _classIndex > 0;
|
||||
}
|
||||
|
||||
public boolean isAwakenedClass()
|
||||
{
|
||||
return isInCategory(CategoryType.SIXTH_CLASS_GROUP);
|
||||
}
|
||||
|
||||
public void setDualClass(int classIndex)
|
||||
{
|
||||
if (isSubClassActive())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -1,256 +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.EnumSet;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
|
||||
/**
|
||||
* @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 Race _race;
|
||||
private ClassLevel _level;
|
||||
private ClassType _type;
|
||||
|
||||
private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
|
||||
{
|
||||
_race = race;
|
||||
_level = pLevel;
|
||||
_type = pType;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
+115
-172
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package ai.areas.TalkingIsland.Raina;
|
||||
|
||||
import static org.l2jmobius.gameserver.model.base.ClassLevel.THIRD;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
@@ -25,7 +23,9 @@ import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
@@ -37,8 +37,6 @@ import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
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.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -68,45 +66,37 @@ public class Raina extends AbstractNpcAI
|
||||
private static final int RAINA = 33491;
|
||||
// Items
|
||||
private static final int SUBCLASS_CERTIFICATE = 30433;
|
||||
private static final int CHAOS_POMANDER_DUAL_CLASS = 37375;
|
||||
private static final int ABELIUS_POWER = 32264;
|
||||
private static final int SAPYROS_POWER = 32265;
|
||||
private static final int ASHAGEN_POWER = 32266;
|
||||
private static final int CRANIGG_POWER = 32267;
|
||||
private static final int SOLTKREIG_POWER = 32268;
|
||||
private static final int NAVIAROPE_POWER = 32269;
|
||||
private static final int LEISTER_POWER = 32270;
|
||||
private static final int LAKCIS_POWER = 32271;
|
||||
private static final int CHAOS_POMANDER = 37375;
|
||||
// Misc
|
||||
private static final Set<PlayerClass> mainSubclassSet;
|
||||
private static final Set<PlayerClass> neverSubclassed = EnumSet.of(PlayerClass.Overlord, PlayerClass.Warsmith);
|
||||
private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(PlayerClass.DarkAvenger, PlayerClass.Paladin, PlayerClass.TempleKnight, PlayerClass.ShillienKnight);
|
||||
private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(PlayerClass.TreasureHunter, PlayerClass.AbyssWalker, PlayerClass.Plainswalker);
|
||||
private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(PlayerClass.Hawkeye, PlayerClass.SilverRanger, PlayerClass.PhantomRanger);
|
||||
private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(PlayerClass.Warlock, PlayerClass.ElementalSummoner, PlayerClass.PhantomSummoner);
|
||||
private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(PlayerClass.Sorceror, PlayerClass.Spellsinger, PlayerClass.Spellhowler);
|
||||
private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
|
||||
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<PlayerClass> subclasses = PlayerClass.getSet(null, THIRD);
|
||||
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(PlayerClass.DarkAvenger, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.Paladin, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TempleKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.ShillienKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TreasureHunter, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.AbyssWalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Plainswalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Hawkeye, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.SilverRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.PhantomRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.Warlock, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.ElementalSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.PhantomSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.Sorceror, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellsinger, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellhowler, subclasseSet5);
|
||||
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);
|
||||
}
|
||||
|
||||
private static final Map<CategoryType, Integer> classCloak = new HashMap<>();
|
||||
@@ -122,17 +112,30 @@ public class Raina extends AbstractNpcAI
|
||||
classCloak.put(CategoryType.SIXTH_EOLH_GROUP, 30317); // Laksis Cloak Grade
|
||||
}
|
||||
|
||||
private static final List<PlayerClass> dualClassList = new ArrayList<>();
|
||||
private static final Map<CategoryType, Integer> powerItem = new HashMap<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.sigelPhoenixKnight, PlayerClass.sigelHellKnight, PlayerClass.sigelEvasTemplar, PlayerClass.sigelShilenTemplar));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.tyrrDuelist, PlayerClass.tyrrDreadnought, PlayerClass.tyrrTitan, PlayerClass.tyrrGrandKhavatari, PlayerClass.tyrrDoombringer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.othellAdventurer, PlayerClass.othellWindRider, PlayerClass.othellGhostHunter, PlayerClass.othellFortuneSeeker));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.yulSagittarius, PlayerClass.yulMoonlightSentinel, PlayerClass.yulGhostSentinel, PlayerClass.yulTrickster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.feohArchmage, PlayerClass.feohSoultaker, PlayerClass.feohMysticMuse, PlayerClass.feoStormScreamer, PlayerClass.feohSoulHound));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.issHierophant, PlayerClass.issSwordMuse, PlayerClass.issSpectralDancer, PlayerClass.issDoomcryer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.wynnArcanaLord, PlayerClass.wynnElementalMaster, PlayerClass.wynnSpectralMaster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.aeoreCardinal, PlayerClass.aeoreEvaSaint, PlayerClass.aeoreShillienSaint));
|
||||
powerItem.put(CategoryType.SIXTH_SIGEL_GROUP, 32264); // Abelius Power
|
||||
powerItem.put(CategoryType.SIXTH_TIR_GROUP, 32265); // Sapyros Power
|
||||
powerItem.put(CategoryType.SIXTH_OTHEL_GROUP, 32266); // Ashagen Power
|
||||
powerItem.put(CategoryType.SIXTH_YR_GROUP, 32267); // Cranigg Power
|
||||
powerItem.put(CategoryType.SIXTH_FEOH_GROUP, 32268); // Soltkreig Power
|
||||
powerItem.put(CategoryType.SIXTH_WYNN_GROUP, 32269); // Naviarope Power
|
||||
powerItem.put(CategoryType.SIXTH_IS_GROUP, 32270); // Leister Power
|
||||
powerItem.put(CategoryType.SIXTH_EOLH_GROUP, 32271); // Laksis Power
|
||||
}
|
||||
|
||||
private static final List<ClassId> dualClassList = new ArrayList<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(ClassId.SIGEL_PHOENIX_KNIGHT, ClassId.SIGEL_HELL_KNIGHT, ClassId.SIGEL_EVA_TEMPLAR, ClassId.SIGEL_SHILLIEN_TEMPLAR));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.TYRR_DUELIST, ClassId.TYRR_DREADNOUGHT, ClassId.TYRR_TITAN, ClassId.TYRR_GRAND_KHAVATARI, ClassId.TYRR_DOOMBRINGER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.OTHELL_ADVENTURER, ClassId.OTHELL_WIND_RIDER, ClassId.OTHELL_GHOST_HUNTER, ClassId.OTHELL_FORTUNE_SEEKER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.YUL_SAGITTARIUS, ClassId.YUL_MOONLIGHT_SENTINEL, ClassId.YUL_GHOST_SENTINEL, ClassId.YUL_TRICKSTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.FEOH_ARCHMAGE, ClassId.FEOH_SOULTAKER, ClassId.FEOH_MYSTIC_MUSE, ClassId.FEOH_STORM_SCREAMER, ClassId.FEOH_SOUL_HOUND));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.ISS_HIEROPHANT, ClassId.ISS_SWORD_MUSE, ClassId.ISS_SPECTRAL_DANCER, ClassId.ISS_DOOMCRYER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.WYNN_ARCANA_LORD, ClassId.WYNN_ELEMENTAL_MASTER, ClassId.WYNN_SPECTRAL_MASTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.AEORE_CARDINAL, ClassId.AEORE_EVA_SAINT, ClassId.AEORE_SHILLIEN_SAINT));
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
@@ -193,7 +196,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
else
|
||||
{
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassList.html");
|
||||
|
||||
@@ -202,11 +205,11 @@ public class Raina extends AbstractNpcAI
|
||||
break;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"0\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -327,11 +330,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addDualClassErtheiaList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -348,7 +351,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -376,7 +379,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -412,11 +415,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenClassList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -516,7 +519,7 @@ public class Raina extends AbstractNpcAI
|
||||
case 2: // Remove (change) subclass list
|
||||
{
|
||||
final int subclassIndex = event.getReply();
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "removeSubclassList.html");
|
||||
|
||||
@@ -525,11 +528,11 @@ public class Raina extends AbstractNpcAI
|
||||
return;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"3\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -581,13 +584,13 @@ public class Raina extends AbstractNpcAI
|
||||
case 5: // Reawaken (change dual class)
|
||||
{
|
||||
final int classId = event.getReply();
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal())))
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass()))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -617,9 +620,9 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getCloakId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -638,7 +641,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -652,68 +655,34 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getPowerItemId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addPowerItem(PlayerInstance player)
|
||||
{
|
||||
int itemId = ABELIUS_POWER; // Sigel
|
||||
if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
itemId = SAPYROS_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
itemId = ASHAGEN_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
itemId = CRANIGG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
itemId = SOLTKREIG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
itemId = NAVIAROPE_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
itemId = LEISTER_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
itemId = LAKCIS_POWER;
|
||||
}
|
||||
giveItems(player, itemId, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of available subclasses Base class and already used subclasses removed
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private Set<PlayerClass> getAvailableSubClasses(PlayerInstance player)
|
||||
private Set<ClassId> getAvailableSubClasses(PlayerInstance player)
|
||||
{
|
||||
final int currentBaseId = player.getBaseClass();
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
final int baseClassId = (baseCID.level() > 2) ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs != null) && !availSubs.isEmpty())
|
||||
{
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
// scan for already used subclasses
|
||||
final int availClassId = pclass.ordinal();
|
||||
final int availClassId = pclass.getId();
|
||||
final ClassId cid = ClassId.getClassId(availClassId);
|
||||
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
@@ -722,7 +691,7 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
if (subId.equalsOrChildOf(cid))
|
||||
{
|
||||
availSubs.remove(pclass);
|
||||
availSubs.remove(cid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -745,11 +714,11 @@ public class Raina extends AbstractNpcAI
|
||||
*/
|
||||
private boolean isValidNewSubClass(PlayerInstance player, int classId)
|
||||
{
|
||||
final ClassId cid = ClassId.values()[classId];
|
||||
final ClassId cid = ClassId.getClassId(classId);
|
||||
ClassId subClassId;
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
{
|
||||
subClassId = ClassId.values()[subList.getClassId()];
|
||||
subClassId = ClassId.getClassId(subList.getClassId());
|
||||
|
||||
if (subClassId.equalsOrChildOf(cid))
|
||||
{
|
||||
@@ -762,8 +731,8 @@ public class Raina extends AbstractNpcAI
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
|
||||
// we need 2nd occupation ID
|
||||
final int baseClassId = baseCID.level() > 2 ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs == null) || availSubs.isEmpty())
|
||||
{
|
||||
@@ -771,9 +740,9 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
if (pclass.ordinal() == classId)
|
||||
if (pclass.getId() == classId)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
@@ -796,29 +765,29 @@ public class Raina extends AbstractNpcAI
|
||||
return leveled;
|
||||
}
|
||||
|
||||
public List<PlayerClass> getAvailableDualclasses(PlayerInstance player)
|
||||
public List<ClassId> getAvailableDualclasses(PlayerInstance player)
|
||||
{
|
||||
final List<PlayerClass> dualClasses = new ArrayList<>();
|
||||
final List<ClassId> dualClasses = new ArrayList<>();
|
||||
|
||||
for (PlayerClass playerClass : PlayerClass.values())
|
||||
for (ClassId ClassId : ClassId.values())
|
||||
{
|
||||
if (!playerClass.isOfRace(Race.ERTHEIA) && playerClass.isOfLevel(ClassLevel.AWAKEN) && (playerClass.ordinal() != player.getClassId().getId()))
|
||||
if ((ClassId.getRace() != Race.ERTHEIA) && CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, ClassId.getId()) && (ClassId.getId() != player.getClassId().getId()))
|
||||
{
|
||||
dualClasses.add(playerClass);
|
||||
dualClasses.add(ClassId);
|
||||
}
|
||||
}
|
||||
return dualClasses;
|
||||
}
|
||||
|
||||
private List<PlayerClass> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
private List<ClassId> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
{
|
||||
final List<PlayerClass> tempList = new ArrayList<>();
|
||||
final List<ClassId> tempList = new ArrayList<>();
|
||||
final int baseClassId = player.getBaseClass();
|
||||
final int dualClassId = player.getClassId().getId();
|
||||
|
||||
for (PlayerClass temp : dualClassList)
|
||||
for (ClassId temp : dualClassList)
|
||||
{
|
||||
if ((temp.ordinal() != baseClassId) && (temp.ordinal() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.ordinal())))
|
||||
if ((temp.getId() != baseClassId) && (temp.getId() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.getId())))
|
||||
{
|
||||
tempList.add(temp);
|
||||
}
|
||||
@@ -826,40 +795,43 @@ public class Raina extends AbstractNpcAI
|
||||
return tempList;
|
||||
}
|
||||
|
||||
public Set<PlayerClass> getSubclasses(PlayerInstance player, int classId)
|
||||
public final Set<ClassId> getSubclasses(PlayerInstance player, int classId)
|
||||
{
|
||||
Set<PlayerClass> subclasses = null;
|
||||
final PlayerClass pClass = PlayerClass.values()[classId];
|
||||
Set<ClassId> subclasses = null;
|
||||
final ClassId pClass = ClassId.getClassId(classId);
|
||||
|
||||
if ((pClass.getLevel() == THIRD) || (pClass.getLevel() == ClassLevel.FOURTH))
|
||||
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, classId) || (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, classId)))
|
||||
{
|
||||
subclasses = EnumSet.copyOf(mainSubclassSet);
|
||||
subclasses.remove(pClass);
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.ERTHEIA, THIRD));
|
||||
|
||||
// Ertheia classes cannot be subclassed and only Kamael can take Kamael classes as subclasses.
|
||||
for (ClassId cid : ClassId.values())
|
||||
{
|
||||
if ((cid.getRace() == Race.ERTHEIA) || ((cid.getRace() == Race.KAMAEL) && (player.getRace() != Race.KAMAEL)))
|
||||
{
|
||||
subclasses.remove(cid);
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getRace() == Race.KAMAEL)
|
||||
{
|
||||
if (player.getAppearance().isFemale())
|
||||
{
|
||||
subclasses.remove(PlayerClass.femaleSoulbreaker);
|
||||
subclasses.remove(ClassId.MALE_SOULBREAKER);
|
||||
}
|
||||
else
|
||||
{
|
||||
subclasses.remove(PlayerClass.maleSoulbreaker);
|
||||
subclasses.remove(ClassId.FEMALE_SOULBREAKER);
|
||||
}
|
||||
|
||||
if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
|
||||
{
|
||||
subclasses.remove(PlayerClass.inspector);
|
||||
subclasses.remove(ClassId.INSPECTOR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only Kamael can take Kamael classes as subclasses.
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.KAMAEL, THIRD));
|
||||
}
|
||||
|
||||
final Set<PlayerClass> unavailableClasses = subclassSetMap.get(pClass);
|
||||
Set<ClassId> unavailableClasses = subclassSetMap.get(pClass);
|
||||
|
||||
if (unavailableClasses != null)
|
||||
{
|
||||
@@ -870,9 +842,9 @@ public class Raina extends AbstractNpcAI
|
||||
if (subclasses != null)
|
||||
{
|
||||
final ClassId currClassId = ClassId.getClassId(player.getClassId().getId());
|
||||
for (PlayerClass tempClass : subclasses)
|
||||
for (ClassId tempClass : subclasses)
|
||||
{
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.ordinal());
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.getId());
|
||||
|
||||
if (currClassId.equalsOrChildOf(tempClassId))
|
||||
{
|
||||
@@ -908,41 +880,12 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
private int getCloakId(PlayerInstance player)
|
||||
{
|
||||
CategoryType catType = null;
|
||||
return classCloak.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
if (player.isInCategory(CategoryType.SIXTH_SIGEL_GROUP))
|
||||
private int getPowerItemId(PlayerInstance player)
|
||||
{
|
||||
catType = CategoryType.SIXTH_SIGEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_TIR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_OTHEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_YR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_FEOH_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_IS_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_WYNN_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_EOLH_GROUP;
|
||||
}
|
||||
return classCloak.get(catType);
|
||||
return powerItem.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
|
||||
+1
-2
@@ -34,7 +34,6 @@ import org.l2jmobius.gameserver.instancemanager.MentorManager;
|
||||
import org.l2jmobius.gameserver.model.Mentee;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.entity.Message;
|
||||
import org.l2jmobius.gameserver.model.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -151,7 +150,7 @@ public class MentorGuide extends AbstractNpcAI implements IXmlReader
|
||||
|
||||
if (event.equalsIgnoreCase("exchange"))
|
||||
{
|
||||
if (hasQuestItems(player, MENTEE_CERT) && (player.getLevel() >= MAX_LEVEL) && (player.getClassId().level() == ClassLevel.AWAKEN.ordinal()))
|
||||
if (hasQuestItems(player, MENTEE_CERT) && (player.getLevel() >= MAX_LEVEL) && player.isAwakenedClass())
|
||||
{
|
||||
takeItems(player, MENTEE_CERT, 1);
|
||||
giveItems(player, DIPLOMA, 40);
|
||||
|
||||
+1
-2
@@ -20,7 +20,6 @@ import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -120,7 +119,7 @@ public class Q00491_InNominePatris extends Quest
|
||||
}
|
||||
case State.CREATED:
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33649-01.htm" : "33649-00.html");
|
||||
htmltext = (player.isAwakenedClass() ? "33649-01.htm" : "33649-00.html");
|
||||
break;
|
||||
}
|
||||
case State.STARTED:
|
||||
|
||||
+6
-7
@@ -19,7 +19,6 @@ package quests.Q10370_MenacingTimes;
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -155,7 +154,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
{
|
||||
case ORVEN:
|
||||
{
|
||||
if ((player.getRace() == Race.HUMAN) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.HUMAN) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30857-01.htm";
|
||||
}
|
||||
@@ -167,7 +166,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case WINONIN:
|
||||
{
|
||||
if ((player.getRace() == Race.ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30856-01.htm";
|
||||
}
|
||||
@@ -179,7 +178,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case OLTRAN:
|
||||
{
|
||||
if ((player.getRace() == Race.DARK_ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DARK_ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30862-01.htm";
|
||||
}
|
||||
@@ -191,7 +190,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case LADANZA:
|
||||
{
|
||||
if ((player.getRace() == Race.ORC) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ORC) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30865-01.htm";
|
||||
}
|
||||
@@ -203,7 +202,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case FERRIS:
|
||||
{
|
||||
if ((player.getRace() == Race.DWARF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DWARF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30847-01.htm";
|
||||
}
|
||||
@@ -215,7 +214,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case BROME:
|
||||
{
|
||||
if ((player.getRace() == Race.KAMAEL) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.KAMAEL) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "32221-01.htm";
|
||||
}
|
||||
|
||||
+1
-2
@@ -19,7 +19,6 @@ package quests.Q10371_GraspThyPower;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -103,7 +102,7 @@ public class Q10371_GraspThyPower extends Quest
|
||||
{
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
if ((qs.isCreated()) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((qs.isCreated()) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "33648-01.htm";
|
||||
}
|
||||
|
||||
+1
-2
@@ -18,7 +18,6 @@ package quests.Q10372_PurgatoryVolvere;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -126,7 +125,7 @@ public class Q10372_PurgatoryVolvere extends Quest
|
||||
{
|
||||
if (npc.getId() == GERKENSHTEIN)
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33648-01.htm" : "complete.htm");
|
||||
htmltext = (player.isAwakenedClass() ? "33648-01.htm" : "complete.htm");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10374_ThatPlaceSuccubus;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -110,7 +111,7 @@ public class Q10374_ThatPlaceSuccubus extends Quest
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10375_SuccubusDisciples;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -106,7 +107,7 @@ public class Q10375_SuccubusDisciples extends Quest
|
||||
htmltext = getAlreadyCompletedMsg(player);
|
||||
}
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
+1
-2
@@ -21,7 +21,6 @@ import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -157,7 +156,7 @@ public class Q10376_BloodyGoodTime extends Quest
|
||||
{
|
||||
case State.CREATED:
|
||||
{
|
||||
if (((player.getClassId().level() != ClassLevel.AWAKEN.ordinal()) && (player.getRace() != Race.ERTHEIA)))
|
||||
if (!player.isAwakenedClass() && (player.getRace() != Race.ERTHEIA))
|
||||
{
|
||||
return "32140-01.htm";
|
||||
}
|
||||
|
||||
+7
-3
@@ -64,6 +64,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;
|
||||
@@ -176,8 +177,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;
|
||||
@@ -2340,7 +2339,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
try
|
||||
{
|
||||
if ((getLvlJoinedAcademy() != 0) && (_clan != null) && (PlayerClass.values()[Id].getLevel() == ClassLevel.THIRD))
|
||||
if ((getLvlJoinedAcademy() != 0) && (_clan != null) && CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, Id))
|
||||
{
|
||||
if (_lvlJoinedAcademy <= 16)
|
||||
{
|
||||
@@ -9789,6 +9788,11 @@ public class PlayerInstance extends Playable
|
||||
return _classIndex > 0;
|
||||
}
|
||||
|
||||
public boolean isAwakenedClass()
|
||||
{
|
||||
return isInCategory(CategoryType.SIXTH_CLASS_GROUP);
|
||||
}
|
||||
|
||||
public void setDualClass(int classIndex)
|
||||
{
|
||||
if (isSubClassActive())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -1,256 +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.EnumSet;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
|
||||
/**
|
||||
* @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 Race _race;
|
||||
private ClassLevel _level;
|
||||
private ClassType _type;
|
||||
|
||||
private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
|
||||
{
|
||||
_race = race;
|
||||
_level = pLevel;
|
||||
_type = pType;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
+115
-172
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package ai.areas.TalkingIsland.Raina;
|
||||
|
||||
import static org.l2jmobius.gameserver.model.base.ClassLevel.THIRD;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
@@ -25,7 +23,9 @@ import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
@@ -37,8 +37,6 @@ import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
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.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -68,45 +66,37 @@ public class Raina extends AbstractNpcAI
|
||||
private static final int RAINA = 33491;
|
||||
// Items
|
||||
private static final int SUBCLASS_CERTIFICATE = 30433;
|
||||
private static final int CHAOS_POMANDER_DUAL_CLASS = 37375;
|
||||
private static final int ABELIUS_POWER = 32264;
|
||||
private static final int SAPYROS_POWER = 32265;
|
||||
private static final int ASHAGEN_POWER = 32266;
|
||||
private static final int CRANIGG_POWER = 32267;
|
||||
private static final int SOLTKREIG_POWER = 32268;
|
||||
private static final int NAVIAROPE_POWER = 32269;
|
||||
private static final int LEISTER_POWER = 32270;
|
||||
private static final int LAKCIS_POWER = 32271;
|
||||
private static final int CHAOS_POMANDER = 37375;
|
||||
// Misc
|
||||
private static final Set<PlayerClass> mainSubclassSet;
|
||||
private static final Set<PlayerClass> neverSubclassed = EnumSet.of(PlayerClass.Overlord, PlayerClass.Warsmith);
|
||||
private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(PlayerClass.DarkAvenger, PlayerClass.Paladin, PlayerClass.TempleKnight, PlayerClass.ShillienKnight);
|
||||
private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(PlayerClass.TreasureHunter, PlayerClass.AbyssWalker, PlayerClass.Plainswalker);
|
||||
private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(PlayerClass.Hawkeye, PlayerClass.SilverRanger, PlayerClass.PhantomRanger);
|
||||
private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(PlayerClass.Warlock, PlayerClass.ElementalSummoner, PlayerClass.PhantomSummoner);
|
||||
private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(PlayerClass.Sorceror, PlayerClass.Spellsinger, PlayerClass.Spellhowler);
|
||||
private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
|
||||
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<PlayerClass> subclasses = PlayerClass.getSet(null, THIRD);
|
||||
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(PlayerClass.DarkAvenger, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.Paladin, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TempleKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.ShillienKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TreasureHunter, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.AbyssWalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Plainswalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Hawkeye, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.SilverRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.PhantomRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.Warlock, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.ElementalSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.PhantomSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.Sorceror, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellsinger, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellhowler, subclasseSet5);
|
||||
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);
|
||||
}
|
||||
|
||||
private static final Map<CategoryType, Integer> classCloak = new HashMap<>();
|
||||
@@ -122,17 +112,30 @@ public class Raina extends AbstractNpcAI
|
||||
classCloak.put(CategoryType.SIXTH_EOLH_GROUP, 30317); // Laksis Cloak Grade
|
||||
}
|
||||
|
||||
private static final List<PlayerClass> dualClassList = new ArrayList<>();
|
||||
private static final Map<CategoryType, Integer> powerItem = new HashMap<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.sigelPhoenixKnight, PlayerClass.sigelHellKnight, PlayerClass.sigelEvasTemplar, PlayerClass.sigelShilenTemplar));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.tyrrDuelist, PlayerClass.tyrrDreadnought, PlayerClass.tyrrTitan, PlayerClass.tyrrGrandKhavatari, PlayerClass.tyrrDoombringer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.othellAdventurer, PlayerClass.othellWindRider, PlayerClass.othellGhostHunter, PlayerClass.othellFortuneSeeker));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.yulSagittarius, PlayerClass.yulMoonlightSentinel, PlayerClass.yulGhostSentinel, PlayerClass.yulTrickster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.feohArchmage, PlayerClass.feohSoultaker, PlayerClass.feohMysticMuse, PlayerClass.feoStormScreamer, PlayerClass.feohSoulHound));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.issHierophant, PlayerClass.issSwordMuse, PlayerClass.issSpectralDancer, PlayerClass.issDoomcryer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.wynnArcanaLord, PlayerClass.wynnElementalMaster, PlayerClass.wynnSpectralMaster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.aeoreCardinal, PlayerClass.aeoreEvaSaint, PlayerClass.aeoreShillienSaint));
|
||||
powerItem.put(CategoryType.SIXTH_SIGEL_GROUP, 32264); // Abelius Power
|
||||
powerItem.put(CategoryType.SIXTH_TIR_GROUP, 32265); // Sapyros Power
|
||||
powerItem.put(CategoryType.SIXTH_OTHEL_GROUP, 32266); // Ashagen Power
|
||||
powerItem.put(CategoryType.SIXTH_YR_GROUP, 32267); // Cranigg Power
|
||||
powerItem.put(CategoryType.SIXTH_FEOH_GROUP, 32268); // Soltkreig Power
|
||||
powerItem.put(CategoryType.SIXTH_WYNN_GROUP, 32269); // Naviarope Power
|
||||
powerItem.put(CategoryType.SIXTH_IS_GROUP, 32270); // Leister Power
|
||||
powerItem.put(CategoryType.SIXTH_EOLH_GROUP, 32271); // Laksis Power
|
||||
}
|
||||
|
||||
private static final List<ClassId> dualClassList = new ArrayList<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(ClassId.SIGEL_PHOENIX_KNIGHT, ClassId.SIGEL_HELL_KNIGHT, ClassId.SIGEL_EVA_TEMPLAR, ClassId.SIGEL_SHILLIEN_TEMPLAR));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.TYRR_DUELIST, ClassId.TYRR_DREADNOUGHT, ClassId.TYRR_TITAN, ClassId.TYRR_GRAND_KHAVATARI, ClassId.TYRR_DOOMBRINGER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.OTHELL_ADVENTURER, ClassId.OTHELL_WIND_RIDER, ClassId.OTHELL_GHOST_HUNTER, ClassId.OTHELL_FORTUNE_SEEKER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.YUL_SAGITTARIUS, ClassId.YUL_MOONLIGHT_SENTINEL, ClassId.YUL_GHOST_SENTINEL, ClassId.YUL_TRICKSTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.FEOH_ARCHMAGE, ClassId.FEOH_SOULTAKER, ClassId.FEOH_MYSTIC_MUSE, ClassId.FEOH_STORM_SCREAMER, ClassId.FEOH_SOUL_HOUND));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.ISS_HIEROPHANT, ClassId.ISS_SWORD_MUSE, ClassId.ISS_SPECTRAL_DANCER, ClassId.ISS_DOOMCRYER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.WYNN_ARCANA_LORD, ClassId.WYNN_ELEMENTAL_MASTER, ClassId.WYNN_SPECTRAL_MASTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.AEORE_CARDINAL, ClassId.AEORE_EVA_SAINT, ClassId.AEORE_SHILLIEN_SAINT));
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
@@ -193,7 +196,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
else
|
||||
{
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassList.html");
|
||||
|
||||
@@ -202,11 +205,11 @@ public class Raina extends AbstractNpcAI
|
||||
break;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"0\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -327,11 +330,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addDualClassErtheiaList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -348,7 +351,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -376,7 +379,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -412,11 +415,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenClassList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -516,7 +519,7 @@ public class Raina extends AbstractNpcAI
|
||||
case 2: // Remove (change) subclass list
|
||||
{
|
||||
final int subclassIndex = event.getReply();
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "removeSubclassList.html");
|
||||
|
||||
@@ -525,11 +528,11 @@ public class Raina extends AbstractNpcAI
|
||||
return;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"3\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -581,13 +584,13 @@ public class Raina extends AbstractNpcAI
|
||||
case 5: // Reawaken (change dual class)
|
||||
{
|
||||
final int classId = event.getReply();
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal())))
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass()))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -617,9 +620,9 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getCloakId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -638,7 +641,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -652,68 +655,34 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getPowerItemId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addPowerItem(PlayerInstance player)
|
||||
{
|
||||
int itemId = ABELIUS_POWER; // Sigel
|
||||
if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
itemId = SAPYROS_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
itemId = ASHAGEN_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
itemId = CRANIGG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
itemId = SOLTKREIG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
itemId = NAVIAROPE_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
itemId = LEISTER_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
itemId = LAKCIS_POWER;
|
||||
}
|
||||
giveItems(player, itemId, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of available subclasses Base class and already used subclasses removed
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private Set<PlayerClass> getAvailableSubClasses(PlayerInstance player)
|
||||
private Set<ClassId> getAvailableSubClasses(PlayerInstance player)
|
||||
{
|
||||
final int currentBaseId = player.getBaseClass();
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
final int baseClassId = (baseCID.level() > 2) ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs != null) && !availSubs.isEmpty())
|
||||
{
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
// scan for already used subclasses
|
||||
final int availClassId = pclass.ordinal();
|
||||
final int availClassId = pclass.getId();
|
||||
final ClassId cid = ClassId.getClassId(availClassId);
|
||||
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
@@ -722,7 +691,7 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
if (subId.equalsOrChildOf(cid))
|
||||
{
|
||||
availSubs.remove(pclass);
|
||||
availSubs.remove(cid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -745,11 +714,11 @@ public class Raina extends AbstractNpcAI
|
||||
*/
|
||||
private boolean isValidNewSubClass(PlayerInstance player, int classId)
|
||||
{
|
||||
final ClassId cid = ClassId.values()[classId];
|
||||
final ClassId cid = ClassId.getClassId(classId);
|
||||
ClassId subClassId;
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
{
|
||||
subClassId = ClassId.values()[subList.getClassId()];
|
||||
subClassId = ClassId.getClassId(subList.getClassId());
|
||||
|
||||
if (subClassId.equalsOrChildOf(cid))
|
||||
{
|
||||
@@ -762,8 +731,8 @@ public class Raina extends AbstractNpcAI
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
|
||||
// we need 2nd occupation ID
|
||||
final int baseClassId = baseCID.level() > 2 ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs == null) || availSubs.isEmpty())
|
||||
{
|
||||
@@ -771,9 +740,9 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
if (pclass.ordinal() == classId)
|
||||
if (pclass.getId() == classId)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
@@ -796,29 +765,29 @@ public class Raina extends AbstractNpcAI
|
||||
return leveled;
|
||||
}
|
||||
|
||||
public List<PlayerClass> getAvailableDualclasses(PlayerInstance player)
|
||||
public List<ClassId> getAvailableDualclasses(PlayerInstance player)
|
||||
{
|
||||
final List<PlayerClass> dualClasses = new ArrayList<>();
|
||||
final List<ClassId> dualClasses = new ArrayList<>();
|
||||
|
||||
for (PlayerClass playerClass : PlayerClass.values())
|
||||
for (ClassId ClassId : ClassId.values())
|
||||
{
|
||||
if (!playerClass.isOfRace(Race.ERTHEIA) && playerClass.isOfLevel(ClassLevel.AWAKEN) && (playerClass.ordinal() != player.getClassId().getId()))
|
||||
if ((ClassId.getRace() != Race.ERTHEIA) && CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, ClassId.getId()) && (ClassId.getId() != player.getClassId().getId()))
|
||||
{
|
||||
dualClasses.add(playerClass);
|
||||
dualClasses.add(ClassId);
|
||||
}
|
||||
}
|
||||
return dualClasses;
|
||||
}
|
||||
|
||||
private List<PlayerClass> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
private List<ClassId> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
{
|
||||
final List<PlayerClass> tempList = new ArrayList<>();
|
||||
final List<ClassId> tempList = new ArrayList<>();
|
||||
final int baseClassId = player.getBaseClass();
|
||||
final int dualClassId = player.getClassId().getId();
|
||||
|
||||
for (PlayerClass temp : dualClassList)
|
||||
for (ClassId temp : dualClassList)
|
||||
{
|
||||
if ((temp.ordinal() != baseClassId) && (temp.ordinal() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.ordinal())))
|
||||
if ((temp.getId() != baseClassId) && (temp.getId() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.getId())))
|
||||
{
|
||||
tempList.add(temp);
|
||||
}
|
||||
@@ -826,40 +795,43 @@ public class Raina extends AbstractNpcAI
|
||||
return tempList;
|
||||
}
|
||||
|
||||
public Set<PlayerClass> getSubclasses(PlayerInstance player, int classId)
|
||||
public final Set<ClassId> getSubclasses(PlayerInstance player, int classId)
|
||||
{
|
||||
Set<PlayerClass> subclasses = null;
|
||||
final PlayerClass pClass = PlayerClass.values()[classId];
|
||||
Set<ClassId> subclasses = null;
|
||||
final ClassId pClass = ClassId.getClassId(classId);
|
||||
|
||||
if ((pClass.getLevel() == THIRD) || (pClass.getLevel() == ClassLevel.FOURTH))
|
||||
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, classId) || (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, classId)))
|
||||
{
|
||||
subclasses = EnumSet.copyOf(mainSubclassSet);
|
||||
subclasses.remove(pClass);
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.ERTHEIA, THIRD));
|
||||
|
||||
// Ertheia classes cannot be subclassed and only Kamael can take Kamael classes as subclasses.
|
||||
for (ClassId cid : ClassId.values())
|
||||
{
|
||||
if ((cid.getRace() == Race.ERTHEIA) || ((cid.getRace() == Race.KAMAEL) && (player.getRace() != Race.KAMAEL)))
|
||||
{
|
||||
subclasses.remove(cid);
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getRace() == Race.KAMAEL)
|
||||
{
|
||||
if (player.getAppearance().isFemale())
|
||||
{
|
||||
subclasses.remove(PlayerClass.femaleSoulbreaker);
|
||||
subclasses.remove(ClassId.MALE_SOULBREAKER);
|
||||
}
|
||||
else
|
||||
{
|
||||
subclasses.remove(PlayerClass.maleSoulbreaker);
|
||||
subclasses.remove(ClassId.FEMALE_SOULBREAKER);
|
||||
}
|
||||
|
||||
if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
|
||||
{
|
||||
subclasses.remove(PlayerClass.inspector);
|
||||
subclasses.remove(ClassId.INSPECTOR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only Kamael can take Kamael classes as subclasses.
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.KAMAEL, THIRD));
|
||||
}
|
||||
|
||||
final Set<PlayerClass> unavailableClasses = subclassSetMap.get(pClass);
|
||||
Set<ClassId> unavailableClasses = subclassSetMap.get(pClass);
|
||||
|
||||
if (unavailableClasses != null)
|
||||
{
|
||||
@@ -870,9 +842,9 @@ public class Raina extends AbstractNpcAI
|
||||
if (subclasses != null)
|
||||
{
|
||||
final ClassId currClassId = ClassId.getClassId(player.getClassId().getId());
|
||||
for (PlayerClass tempClass : subclasses)
|
||||
for (ClassId tempClass : subclasses)
|
||||
{
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.ordinal());
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.getId());
|
||||
|
||||
if (currClassId.equalsOrChildOf(tempClassId))
|
||||
{
|
||||
@@ -908,41 +880,12 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
private int getCloakId(PlayerInstance player)
|
||||
{
|
||||
CategoryType catType = null;
|
||||
return classCloak.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
if (player.isInCategory(CategoryType.SIXTH_SIGEL_GROUP))
|
||||
private int getPowerItemId(PlayerInstance player)
|
||||
{
|
||||
catType = CategoryType.SIXTH_SIGEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_TIR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_OTHEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_YR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_FEOH_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_IS_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_WYNN_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_EOLH_GROUP;
|
||||
}
|
||||
return classCloak.get(catType);
|
||||
return powerItem.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
|
||||
+1
-2
@@ -34,7 +34,6 @@ import org.l2jmobius.gameserver.instancemanager.MentorManager;
|
||||
import org.l2jmobius.gameserver.model.Mentee;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.entity.Message;
|
||||
import org.l2jmobius.gameserver.model.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -151,7 +150,7 @@ public class MentorGuide extends AbstractNpcAI implements IXmlReader
|
||||
|
||||
if (event.equalsIgnoreCase("exchange"))
|
||||
{
|
||||
if (hasQuestItems(player, MENTEE_CERT) && (player.getLevel() >= MAX_LEVEL) && (player.getClassId().level() == ClassLevel.AWAKEN.ordinal()))
|
||||
if (hasQuestItems(player, MENTEE_CERT) && (player.getLevel() >= MAX_LEVEL) && player.isAwakenedClass())
|
||||
{
|
||||
takeItems(player, MENTEE_CERT, 1);
|
||||
giveItems(player, DIPLOMA, 40);
|
||||
|
||||
L2J_Mobius_3.0_Helios/dist/game/data/scripts/quests/Q00491_InNominePatris/Q00491_InNominePatris.java
Vendored
+1
-2
@@ -20,7 +20,6 @@ import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -120,7 +119,7 @@ public class Q00491_InNominePatris extends Quest
|
||||
}
|
||||
case State.CREATED:
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33649-01.htm" : "33649-00.html");
|
||||
htmltext = (player.isAwakenedClass() ? "33649-01.htm" : "33649-00.html");
|
||||
break;
|
||||
}
|
||||
case State.STARTED:
|
||||
|
||||
Vendored
+6
-7
@@ -19,7 +19,6 @@ package quests.Q10370_MenacingTimes;
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -155,7 +154,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
{
|
||||
case ORVEN:
|
||||
{
|
||||
if ((player.getRace() == Race.HUMAN) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.HUMAN) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30857-01.htm";
|
||||
}
|
||||
@@ -167,7 +166,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case WINONIN:
|
||||
{
|
||||
if ((player.getRace() == Race.ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30856-01.htm";
|
||||
}
|
||||
@@ -179,7 +178,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case OLTRAN:
|
||||
{
|
||||
if ((player.getRace() == Race.DARK_ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DARK_ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30862-01.htm";
|
||||
}
|
||||
@@ -191,7 +190,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case LADANZA:
|
||||
{
|
||||
if ((player.getRace() == Race.ORC) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ORC) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30865-01.htm";
|
||||
}
|
||||
@@ -203,7 +202,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case FERRIS:
|
||||
{
|
||||
if ((player.getRace() == Race.DWARF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DWARF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30847-01.htm";
|
||||
}
|
||||
@@ -215,7 +214,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case BROME:
|
||||
{
|
||||
if ((player.getRace() == Race.KAMAEL) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.KAMAEL) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "32221-01.htm";
|
||||
}
|
||||
|
||||
Vendored
+1
-2
@@ -19,7 +19,6 @@ package quests.Q10371_GraspThyPower;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -103,7 +102,7 @@ public class Q10371_GraspThyPower extends Quest
|
||||
{
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
if ((qs.isCreated()) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((qs.isCreated()) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "33648-01.htm";
|
||||
}
|
||||
|
||||
+1
-2
@@ -18,7 +18,6 @@ package quests.Q10372_PurgatoryVolvere;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -126,7 +125,7 @@ public class Q10372_PurgatoryVolvere extends Quest
|
||||
{
|
||||
if (npc.getId() == GERKENSHTEIN)
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33648-01.htm" : "complete.htm");
|
||||
htmltext = (player.isAwakenedClass() ? "33648-01.htm" : "complete.htm");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10374_ThatPlaceSuccubus;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -110,7 +111,7 @@ public class Q10374_ThatPlaceSuccubus extends Quest
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10375_SuccubusDisciples;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -106,7 +107,7 @@ public class Q10375_SuccubusDisciples extends Quest
|
||||
htmltext = getAlreadyCompletedMsg(player);
|
||||
}
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
L2J_Mobius_3.0_Helios/dist/game/data/scripts/quests/Q10376_BloodyGoodTime/Q10376_BloodyGoodTime.java
Vendored
+1
-2
@@ -21,7 +21,6 @@ import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -157,7 +156,7 @@ public class Q10376_BloodyGoodTime extends Quest
|
||||
{
|
||||
case State.CREATED:
|
||||
{
|
||||
if (((player.getClassId().level() != ClassLevel.AWAKEN.ordinal()) && (player.getRace() != Race.ERTHEIA)))
|
||||
if (!player.isAwakenedClass() && (player.getRace() != Race.ERTHEIA))
|
||||
{
|
||||
return "32140-01.htm";
|
||||
}
|
||||
|
||||
+7
-3
@@ -64,6 +64,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;
|
||||
@@ -177,8 +178,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;
|
||||
@@ -2342,7 +2341,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
try
|
||||
{
|
||||
if ((getLvlJoinedAcademy() != 0) && (_clan != null) && (PlayerClass.values()[Id].getLevel() == ClassLevel.THIRD))
|
||||
if ((getLvlJoinedAcademy() != 0) && (_clan != null) && CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, Id))
|
||||
{
|
||||
if (_lvlJoinedAcademy <= 16)
|
||||
{
|
||||
@@ -9791,6 +9790,11 @@ public class PlayerInstance extends Playable
|
||||
return _classIndex > 0;
|
||||
}
|
||||
|
||||
public boolean isAwakenedClass()
|
||||
{
|
||||
return isInCategory(CategoryType.SIXTH_CLASS_GROUP);
|
||||
}
|
||||
|
||||
public void setDualClass(int classIndex)
|
||||
{
|
||||
if (isSubClassActive())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -1,256 +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.EnumSet;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
|
||||
/**
|
||||
* @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 Race _race;
|
||||
private ClassLevel _level;
|
||||
private ClassType _type;
|
||||
|
||||
private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
|
||||
{
|
||||
_race = race;
|
||||
_level = pLevel;
|
||||
_type = pType;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
+115
-172
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package ai.areas.TalkingIsland.Raina;
|
||||
|
||||
import static org.l2jmobius.gameserver.model.base.ClassLevel.THIRD;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
@@ -25,7 +23,9 @@ import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
@@ -37,8 +37,6 @@ import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
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.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -68,45 +66,37 @@ public class Raina extends AbstractNpcAI
|
||||
private static final int RAINA = 33491;
|
||||
// Items
|
||||
private static final int SUBCLASS_CERTIFICATE = 30433;
|
||||
private static final int CHAOS_POMANDER_DUAL_CLASS = 37375;
|
||||
private static final int ABELIUS_POWER = 32264;
|
||||
private static final int SAPYROS_POWER = 32265;
|
||||
private static final int ASHAGEN_POWER = 32266;
|
||||
private static final int CRANIGG_POWER = 32267;
|
||||
private static final int SOLTKREIG_POWER = 32268;
|
||||
private static final int NAVIAROPE_POWER = 32269;
|
||||
private static final int LEISTER_POWER = 32270;
|
||||
private static final int LAKCIS_POWER = 32271;
|
||||
private static final int CHAOS_POMANDER = 37375;
|
||||
// Misc
|
||||
private static final Set<PlayerClass> mainSubclassSet;
|
||||
private static final Set<PlayerClass> neverSubclassed = EnumSet.of(PlayerClass.Overlord, PlayerClass.Warsmith);
|
||||
private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(PlayerClass.DarkAvenger, PlayerClass.Paladin, PlayerClass.TempleKnight, PlayerClass.ShillienKnight);
|
||||
private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(PlayerClass.TreasureHunter, PlayerClass.AbyssWalker, PlayerClass.Plainswalker);
|
||||
private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(PlayerClass.Hawkeye, PlayerClass.SilverRanger, PlayerClass.PhantomRanger);
|
||||
private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(PlayerClass.Warlock, PlayerClass.ElementalSummoner, PlayerClass.PhantomSummoner);
|
||||
private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(PlayerClass.Sorceror, PlayerClass.Spellsinger, PlayerClass.Spellhowler);
|
||||
private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
|
||||
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<PlayerClass> subclasses = PlayerClass.getSet(null, THIRD);
|
||||
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(PlayerClass.DarkAvenger, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.Paladin, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TempleKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.ShillienKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TreasureHunter, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.AbyssWalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Plainswalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Hawkeye, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.SilverRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.PhantomRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.Warlock, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.ElementalSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.PhantomSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.Sorceror, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellsinger, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellhowler, subclasseSet5);
|
||||
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);
|
||||
}
|
||||
|
||||
private static final Map<CategoryType, Integer> classCloak = new HashMap<>();
|
||||
@@ -122,17 +112,30 @@ public class Raina extends AbstractNpcAI
|
||||
classCloak.put(CategoryType.SIXTH_EOLH_GROUP, 30317); // Laksis Cloak Grade
|
||||
}
|
||||
|
||||
private static final List<PlayerClass> dualClassList = new ArrayList<>();
|
||||
private static final Map<CategoryType, Integer> powerItem = new HashMap<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.sigelPhoenixKnight, PlayerClass.sigelHellKnight, PlayerClass.sigelEvasTemplar, PlayerClass.sigelShilenTemplar));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.tyrrDuelist, PlayerClass.tyrrDreadnought, PlayerClass.tyrrTitan, PlayerClass.tyrrGrandKhavatari, PlayerClass.tyrrDoombringer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.othellAdventurer, PlayerClass.othellWindRider, PlayerClass.othellGhostHunter, PlayerClass.othellFortuneSeeker));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.yulSagittarius, PlayerClass.yulMoonlightSentinel, PlayerClass.yulGhostSentinel, PlayerClass.yulTrickster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.feohArchmage, PlayerClass.feohSoultaker, PlayerClass.feohMysticMuse, PlayerClass.feoStormScreamer, PlayerClass.feohSoulHound));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.issHierophant, PlayerClass.issSwordMuse, PlayerClass.issSpectralDancer, PlayerClass.issDoomcryer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.wynnArcanaLord, PlayerClass.wynnElementalMaster, PlayerClass.wynnSpectralMaster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.aeoreCardinal, PlayerClass.aeoreEvaSaint, PlayerClass.aeoreShillienSaint));
|
||||
powerItem.put(CategoryType.SIXTH_SIGEL_GROUP, 32264); // Abelius Power
|
||||
powerItem.put(CategoryType.SIXTH_TIR_GROUP, 32265); // Sapyros Power
|
||||
powerItem.put(CategoryType.SIXTH_OTHEL_GROUP, 32266); // Ashagen Power
|
||||
powerItem.put(CategoryType.SIXTH_YR_GROUP, 32267); // Cranigg Power
|
||||
powerItem.put(CategoryType.SIXTH_FEOH_GROUP, 32268); // Soltkreig Power
|
||||
powerItem.put(CategoryType.SIXTH_WYNN_GROUP, 32269); // Naviarope Power
|
||||
powerItem.put(CategoryType.SIXTH_IS_GROUP, 32270); // Leister Power
|
||||
powerItem.put(CategoryType.SIXTH_EOLH_GROUP, 32271); // Laksis Power
|
||||
}
|
||||
|
||||
private static final List<ClassId> dualClassList = new ArrayList<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(ClassId.SIGEL_PHOENIX_KNIGHT, ClassId.SIGEL_HELL_KNIGHT, ClassId.SIGEL_EVA_TEMPLAR, ClassId.SIGEL_SHILLIEN_TEMPLAR));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.TYRR_DUELIST, ClassId.TYRR_DREADNOUGHT, ClassId.TYRR_TITAN, ClassId.TYRR_GRAND_KHAVATARI, ClassId.TYRR_DOOMBRINGER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.OTHELL_ADVENTURER, ClassId.OTHELL_WIND_RIDER, ClassId.OTHELL_GHOST_HUNTER, ClassId.OTHELL_FORTUNE_SEEKER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.YUL_SAGITTARIUS, ClassId.YUL_MOONLIGHT_SENTINEL, ClassId.YUL_GHOST_SENTINEL, ClassId.YUL_TRICKSTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.FEOH_ARCHMAGE, ClassId.FEOH_SOULTAKER, ClassId.FEOH_MYSTIC_MUSE, ClassId.FEOH_STORM_SCREAMER, ClassId.FEOH_SOUL_HOUND));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.ISS_HIEROPHANT, ClassId.ISS_SWORD_MUSE, ClassId.ISS_SPECTRAL_DANCER, ClassId.ISS_DOOMCRYER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.WYNN_ARCANA_LORD, ClassId.WYNN_ELEMENTAL_MASTER, ClassId.WYNN_SPECTRAL_MASTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.AEORE_CARDINAL, ClassId.AEORE_EVA_SAINT, ClassId.AEORE_SHILLIEN_SAINT));
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
@@ -193,7 +196,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
else
|
||||
{
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassList.html");
|
||||
|
||||
@@ -202,11 +205,11 @@ public class Raina extends AbstractNpcAI
|
||||
break;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"0\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -327,11 +330,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addDualClassErtheiaList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -348,7 +351,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -376,7 +379,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -412,11 +415,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenClassList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -516,7 +519,7 @@ public class Raina extends AbstractNpcAI
|
||||
case 2: // Remove (change) subclass list
|
||||
{
|
||||
final int subclassIndex = event.getReply();
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "removeSubclassList.html");
|
||||
|
||||
@@ -525,11 +528,11 @@ public class Raina extends AbstractNpcAI
|
||||
return;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"3\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -581,13 +584,13 @@ public class Raina extends AbstractNpcAI
|
||||
case 5: // Reawaken (change dual class)
|
||||
{
|
||||
final int classId = event.getReply();
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal())))
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass()))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -617,9 +620,9 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getCloakId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -638,7 +641,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -652,68 +655,34 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getPowerItemId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addPowerItem(PlayerInstance player)
|
||||
{
|
||||
int itemId = ABELIUS_POWER; // Sigel
|
||||
if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
itemId = SAPYROS_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
itemId = ASHAGEN_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
itemId = CRANIGG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
itemId = SOLTKREIG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
itemId = NAVIAROPE_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
itemId = LEISTER_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
itemId = LAKCIS_POWER;
|
||||
}
|
||||
giveItems(player, itemId, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of available subclasses Base class and already used subclasses removed
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private Set<PlayerClass> getAvailableSubClasses(PlayerInstance player)
|
||||
private Set<ClassId> getAvailableSubClasses(PlayerInstance player)
|
||||
{
|
||||
final int currentBaseId = player.getBaseClass();
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
final int baseClassId = (baseCID.level() > 2) ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs != null) && !availSubs.isEmpty())
|
||||
{
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
// scan for already used subclasses
|
||||
final int availClassId = pclass.ordinal();
|
||||
final int availClassId = pclass.getId();
|
||||
final ClassId cid = ClassId.getClassId(availClassId);
|
||||
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
@@ -722,7 +691,7 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
if (subId.equalsOrChildOf(cid))
|
||||
{
|
||||
availSubs.remove(pclass);
|
||||
availSubs.remove(cid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -745,11 +714,11 @@ public class Raina extends AbstractNpcAI
|
||||
*/
|
||||
private boolean isValidNewSubClass(PlayerInstance player, int classId)
|
||||
{
|
||||
final ClassId cid = ClassId.values()[classId];
|
||||
final ClassId cid = ClassId.getClassId(classId);
|
||||
ClassId subClassId;
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
{
|
||||
subClassId = ClassId.values()[subList.getClassId()];
|
||||
subClassId = ClassId.getClassId(subList.getClassId());
|
||||
|
||||
if (subClassId.equalsOrChildOf(cid))
|
||||
{
|
||||
@@ -762,8 +731,8 @@ public class Raina extends AbstractNpcAI
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
|
||||
// we need 2nd occupation ID
|
||||
final int baseClassId = baseCID.level() > 2 ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs == null) || availSubs.isEmpty())
|
||||
{
|
||||
@@ -771,9 +740,9 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
if (pclass.ordinal() == classId)
|
||||
if (pclass.getId() == classId)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
@@ -796,29 +765,29 @@ public class Raina extends AbstractNpcAI
|
||||
return leveled;
|
||||
}
|
||||
|
||||
public List<PlayerClass> getAvailableDualclasses(PlayerInstance player)
|
||||
public List<ClassId> getAvailableDualclasses(PlayerInstance player)
|
||||
{
|
||||
final List<PlayerClass> dualClasses = new ArrayList<>();
|
||||
final List<ClassId> dualClasses = new ArrayList<>();
|
||||
|
||||
for (PlayerClass playerClass : PlayerClass.values())
|
||||
for (ClassId ClassId : ClassId.values())
|
||||
{
|
||||
if (!playerClass.isOfRace(Race.ERTHEIA) && playerClass.isOfLevel(ClassLevel.AWAKEN) && (playerClass.ordinal() != player.getClassId().getId()))
|
||||
if ((ClassId.getRace() != Race.ERTHEIA) && CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, ClassId.getId()) && (ClassId.getId() != player.getClassId().getId()))
|
||||
{
|
||||
dualClasses.add(playerClass);
|
||||
dualClasses.add(ClassId);
|
||||
}
|
||||
}
|
||||
return dualClasses;
|
||||
}
|
||||
|
||||
private List<PlayerClass> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
private List<ClassId> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
{
|
||||
final List<PlayerClass> tempList = new ArrayList<>();
|
||||
final List<ClassId> tempList = new ArrayList<>();
|
||||
final int baseClassId = player.getBaseClass();
|
||||
final int dualClassId = player.getClassId().getId();
|
||||
|
||||
for (PlayerClass temp : dualClassList)
|
||||
for (ClassId temp : dualClassList)
|
||||
{
|
||||
if ((temp.ordinal() != baseClassId) && (temp.ordinal() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.ordinal())))
|
||||
if ((temp.getId() != baseClassId) && (temp.getId() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.getId())))
|
||||
{
|
||||
tempList.add(temp);
|
||||
}
|
||||
@@ -826,40 +795,43 @@ public class Raina extends AbstractNpcAI
|
||||
return tempList;
|
||||
}
|
||||
|
||||
public Set<PlayerClass> getSubclasses(PlayerInstance player, int classId)
|
||||
public final Set<ClassId> getSubclasses(PlayerInstance player, int classId)
|
||||
{
|
||||
Set<PlayerClass> subclasses = null;
|
||||
final PlayerClass pClass = PlayerClass.values()[classId];
|
||||
Set<ClassId> subclasses = null;
|
||||
final ClassId pClass = ClassId.getClassId(classId);
|
||||
|
||||
if ((pClass.getLevel() == THIRD) || (pClass.getLevel() == ClassLevel.FOURTH))
|
||||
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, classId) || (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, classId)))
|
||||
{
|
||||
subclasses = EnumSet.copyOf(mainSubclassSet);
|
||||
subclasses.remove(pClass);
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.ERTHEIA, THIRD));
|
||||
|
||||
// Ertheia classes cannot be subclassed and only Kamael can take Kamael classes as subclasses.
|
||||
for (ClassId cid : ClassId.values())
|
||||
{
|
||||
if ((cid.getRace() == Race.ERTHEIA) || ((cid.getRace() == Race.KAMAEL) && (player.getRace() != Race.KAMAEL)))
|
||||
{
|
||||
subclasses.remove(cid);
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getRace() == Race.KAMAEL)
|
||||
{
|
||||
if (player.getAppearance().isFemale())
|
||||
{
|
||||
subclasses.remove(PlayerClass.femaleSoulbreaker);
|
||||
subclasses.remove(ClassId.MALE_SOULBREAKER);
|
||||
}
|
||||
else
|
||||
{
|
||||
subclasses.remove(PlayerClass.maleSoulbreaker);
|
||||
subclasses.remove(ClassId.FEMALE_SOULBREAKER);
|
||||
}
|
||||
|
||||
if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
|
||||
{
|
||||
subclasses.remove(PlayerClass.inspector);
|
||||
subclasses.remove(ClassId.INSPECTOR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only Kamael can take Kamael classes as subclasses.
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.KAMAEL, THIRD));
|
||||
}
|
||||
|
||||
final Set<PlayerClass> unavailableClasses = subclassSetMap.get(pClass);
|
||||
Set<ClassId> unavailableClasses = subclassSetMap.get(pClass);
|
||||
|
||||
if (unavailableClasses != null)
|
||||
{
|
||||
@@ -870,9 +842,9 @@ public class Raina extends AbstractNpcAI
|
||||
if (subclasses != null)
|
||||
{
|
||||
final ClassId currClassId = ClassId.getClassId(player.getClassId().getId());
|
||||
for (PlayerClass tempClass : subclasses)
|
||||
for (ClassId tempClass : subclasses)
|
||||
{
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.ordinal());
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.getId());
|
||||
|
||||
if (currClassId.equalsOrChildOf(tempClassId))
|
||||
{
|
||||
@@ -908,41 +880,12 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
private int getCloakId(PlayerInstance player)
|
||||
{
|
||||
CategoryType catType = null;
|
||||
return classCloak.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
if (player.isInCategory(CategoryType.SIXTH_SIGEL_GROUP))
|
||||
private int getPowerItemId(PlayerInstance player)
|
||||
{
|
||||
catType = CategoryType.SIXTH_SIGEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_TIR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_OTHEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_YR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_FEOH_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_IS_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_WYNN_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_EOLH_GROUP;
|
||||
}
|
||||
return classCloak.get(catType);
|
||||
return powerItem.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
|
||||
+1
-2
@@ -34,7 +34,6 @@ import org.l2jmobius.gameserver.instancemanager.MentorManager;
|
||||
import org.l2jmobius.gameserver.model.Mentee;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.entity.Message;
|
||||
import org.l2jmobius.gameserver.model.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -151,7 +150,7 @@ public class MentorGuide extends AbstractNpcAI implements IXmlReader
|
||||
|
||||
if (event.equalsIgnoreCase("exchange"))
|
||||
{
|
||||
if (hasQuestItems(player, MENTEE_CERT) && (player.getLevel() >= MAX_LEVEL) && (player.getClassId().level() == ClassLevel.AWAKEN.ordinal()))
|
||||
if (hasQuestItems(player, MENTEE_CERT) && (player.getLevel() >= MAX_LEVEL) && player.isAwakenedClass())
|
||||
{
|
||||
takeItems(player, MENTEE_CERT, 1);
|
||||
giveItems(player, DIPLOMA, 40);
|
||||
|
||||
+1
-2
@@ -20,7 +20,6 @@ import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -120,7 +119,7 @@ public class Q00491_InNominePatris extends Quest
|
||||
}
|
||||
case State.CREATED:
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33649-01.htm" : "33649-00.html");
|
||||
htmltext = (player.isAwakenedClass() ? "33649-01.htm" : "33649-00.html");
|
||||
break;
|
||||
}
|
||||
case State.STARTED:
|
||||
|
||||
+6
-7
@@ -19,7 +19,6 @@ package quests.Q10370_MenacingTimes;
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -155,7 +154,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
{
|
||||
case ORVEN:
|
||||
{
|
||||
if ((player.getRace() == Race.HUMAN) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.HUMAN) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30857-01.htm";
|
||||
}
|
||||
@@ -167,7 +166,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case WINONIN:
|
||||
{
|
||||
if ((player.getRace() == Race.ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30856-01.htm";
|
||||
}
|
||||
@@ -179,7 +178,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case OLTRAN:
|
||||
{
|
||||
if ((player.getRace() == Race.DARK_ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DARK_ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30862-01.htm";
|
||||
}
|
||||
@@ -191,7 +190,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case LADANZA:
|
||||
{
|
||||
if ((player.getRace() == Race.ORC) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ORC) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30865-01.htm";
|
||||
}
|
||||
@@ -203,7 +202,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case FERRIS:
|
||||
{
|
||||
if ((player.getRace() == Race.DWARF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DWARF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30847-01.htm";
|
||||
}
|
||||
@@ -215,7 +214,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case BROME:
|
||||
{
|
||||
if ((player.getRace() == Race.KAMAEL) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.KAMAEL) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "32221-01.htm";
|
||||
}
|
||||
|
||||
+1
-2
@@ -19,7 +19,6 @@ package quests.Q10371_GraspThyPower;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -103,7 +102,7 @@ public class Q10371_GraspThyPower extends Quest
|
||||
{
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
if ((qs.isCreated()) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((qs.isCreated()) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "33648-01.htm";
|
||||
}
|
||||
|
||||
+1
-2
@@ -18,7 +18,6 @@ package quests.Q10372_PurgatoryVolvere;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -126,7 +125,7 @@ public class Q10372_PurgatoryVolvere extends Quest
|
||||
{
|
||||
if (npc.getId() == GERKENSHTEIN)
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33648-01.htm" : "complete.htm");
|
||||
htmltext = (player.isAwakenedClass() ? "33648-01.htm" : "complete.htm");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10374_ThatPlaceSuccubus;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -110,7 +111,7 @@ public class Q10374_ThatPlaceSuccubus extends Quest
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10375_SuccubusDisciples;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -106,7 +107,7 @@ public class Q10375_SuccubusDisciples extends Quest
|
||||
htmltext = getAlreadyCompletedMsg(player);
|
||||
}
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
+1
-2
@@ -21,7 +21,6 @@ import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -157,7 +156,7 @@ public class Q10376_BloodyGoodTime extends Quest
|
||||
{
|
||||
case State.CREATED:
|
||||
{
|
||||
if (((player.getClassId().level() != ClassLevel.AWAKEN.ordinal()) && (player.getRace() != Race.ERTHEIA)))
|
||||
if (!player.isAwakenedClass() && (player.getRace() != Race.ERTHEIA))
|
||||
{
|
||||
return "32140-01.htm";
|
||||
}
|
||||
|
||||
+5
@@ -9781,6 +9781,11 @@ public class PlayerInstance extends Playable
|
||||
return _classIndex > 0;
|
||||
}
|
||||
|
||||
public boolean isAwakenedClass()
|
||||
{
|
||||
return isInCategory(CategoryType.SIXTH_CLASS_GROUP);
|
||||
}
|
||||
|
||||
public void setDualClass(int classIndex)
|
||||
{
|
||||
if (isSubClassActive())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
-256
@@ -1,256 +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.EnumSet;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
|
||||
/**
|
||||
* @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 Race _race;
|
||||
private ClassLevel _level;
|
||||
private ClassType _type;
|
||||
|
||||
private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
|
||||
{
|
||||
_race = race;
|
||||
_level = pLevel;
|
||||
_type = pType;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
+115
-172
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package ai.areas.TalkingIsland.Raina;
|
||||
|
||||
import static org.l2jmobius.gameserver.model.base.ClassLevel.THIRD;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
@@ -25,7 +23,9 @@ import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
@@ -37,8 +37,6 @@ import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
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.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -68,45 +66,37 @@ public class Raina extends AbstractNpcAI
|
||||
private static final int RAINA = 33491;
|
||||
// Items
|
||||
private static final int SUBCLASS_CERTIFICATE = 30433;
|
||||
private static final int CHAOS_POMANDER_DUAL_CLASS = 37375;
|
||||
private static final int ABELIUS_POWER = 32264;
|
||||
private static final int SAPYROS_POWER = 32265;
|
||||
private static final int ASHAGEN_POWER = 32266;
|
||||
private static final int CRANIGG_POWER = 32267;
|
||||
private static final int SOLTKREIG_POWER = 32268;
|
||||
private static final int NAVIAROPE_POWER = 32269;
|
||||
private static final int LEISTER_POWER = 32270;
|
||||
private static final int LAKCIS_POWER = 32271;
|
||||
private static final int CHAOS_POMANDER = 37375;
|
||||
// Misc
|
||||
private static final Set<PlayerClass> mainSubclassSet;
|
||||
private static final Set<PlayerClass> neverSubclassed = EnumSet.of(PlayerClass.Overlord, PlayerClass.Warsmith);
|
||||
private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(PlayerClass.DarkAvenger, PlayerClass.Paladin, PlayerClass.TempleKnight, PlayerClass.ShillienKnight);
|
||||
private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(PlayerClass.TreasureHunter, PlayerClass.AbyssWalker, PlayerClass.Plainswalker);
|
||||
private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(PlayerClass.Hawkeye, PlayerClass.SilverRanger, PlayerClass.PhantomRanger);
|
||||
private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(PlayerClass.Warlock, PlayerClass.ElementalSummoner, PlayerClass.PhantomSummoner);
|
||||
private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(PlayerClass.Sorceror, PlayerClass.Spellsinger, PlayerClass.Spellhowler);
|
||||
private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
|
||||
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<PlayerClass> subclasses = PlayerClass.getSet(null, THIRD);
|
||||
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(PlayerClass.DarkAvenger, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.Paladin, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TempleKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.ShillienKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TreasureHunter, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.AbyssWalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Plainswalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Hawkeye, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.SilverRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.PhantomRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.Warlock, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.ElementalSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.PhantomSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.Sorceror, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellsinger, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellhowler, subclasseSet5);
|
||||
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);
|
||||
}
|
||||
|
||||
private static final Map<CategoryType, Integer> classCloak = new HashMap<>();
|
||||
@@ -122,17 +112,30 @@ public class Raina extends AbstractNpcAI
|
||||
classCloak.put(CategoryType.SIXTH_EOLH_GROUP, 30317); // Laksis Cloak Grade
|
||||
}
|
||||
|
||||
private static final List<PlayerClass> dualClassList = new ArrayList<>();
|
||||
private static final Map<CategoryType, Integer> powerItem = new HashMap<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.sigelPhoenixKnight, PlayerClass.sigelHellKnight, PlayerClass.sigelEvasTemplar, PlayerClass.sigelShilenTemplar));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.tyrrDuelist, PlayerClass.tyrrDreadnought, PlayerClass.tyrrTitan, PlayerClass.tyrrGrandKhavatari, PlayerClass.tyrrDoombringer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.othellAdventurer, PlayerClass.othellWindRider, PlayerClass.othellGhostHunter, PlayerClass.othellFortuneSeeker));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.yulSagittarius, PlayerClass.yulMoonlightSentinel, PlayerClass.yulGhostSentinel, PlayerClass.yulTrickster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.feohArchmage, PlayerClass.feohSoultaker, PlayerClass.feohMysticMuse, PlayerClass.feoStormScreamer, PlayerClass.feohSoulHound));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.issHierophant, PlayerClass.issSwordMuse, PlayerClass.issSpectralDancer, PlayerClass.issDoomcryer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.wynnArcanaLord, PlayerClass.wynnElementalMaster, PlayerClass.wynnSpectralMaster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.aeoreCardinal, PlayerClass.aeoreEvaSaint, PlayerClass.aeoreShillienSaint));
|
||||
powerItem.put(CategoryType.SIXTH_SIGEL_GROUP, 32264); // Abelius Power
|
||||
powerItem.put(CategoryType.SIXTH_TIR_GROUP, 32265); // Sapyros Power
|
||||
powerItem.put(CategoryType.SIXTH_OTHEL_GROUP, 32266); // Ashagen Power
|
||||
powerItem.put(CategoryType.SIXTH_YR_GROUP, 32267); // Cranigg Power
|
||||
powerItem.put(CategoryType.SIXTH_FEOH_GROUP, 32268); // Soltkreig Power
|
||||
powerItem.put(CategoryType.SIXTH_WYNN_GROUP, 32269); // Naviarope Power
|
||||
powerItem.put(CategoryType.SIXTH_IS_GROUP, 32270); // Leister Power
|
||||
powerItem.put(CategoryType.SIXTH_EOLH_GROUP, 32271); // Laksis Power
|
||||
}
|
||||
|
||||
private static final List<ClassId> dualClassList = new ArrayList<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(ClassId.SIGEL_PHOENIX_KNIGHT, ClassId.SIGEL_HELL_KNIGHT, ClassId.SIGEL_EVA_TEMPLAR, ClassId.SIGEL_SHILLIEN_TEMPLAR));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.TYRR_DUELIST, ClassId.TYRR_DREADNOUGHT, ClassId.TYRR_TITAN, ClassId.TYRR_GRAND_KHAVATARI, ClassId.TYRR_DOOMBRINGER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.OTHELL_ADVENTURER, ClassId.OTHELL_WIND_RIDER, ClassId.OTHELL_GHOST_HUNTER, ClassId.OTHELL_FORTUNE_SEEKER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.YUL_SAGITTARIUS, ClassId.YUL_MOONLIGHT_SENTINEL, ClassId.YUL_GHOST_SENTINEL, ClassId.YUL_TRICKSTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.FEOH_ARCHMAGE, ClassId.FEOH_SOULTAKER, ClassId.FEOH_MYSTIC_MUSE, ClassId.FEOH_STORM_SCREAMER, ClassId.FEOH_SOUL_HOUND));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.ISS_HIEROPHANT, ClassId.ISS_SWORD_MUSE, ClassId.ISS_SPECTRAL_DANCER, ClassId.ISS_DOOMCRYER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.WYNN_ARCANA_LORD, ClassId.WYNN_ELEMENTAL_MASTER, ClassId.WYNN_SPECTRAL_MASTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.AEORE_CARDINAL, ClassId.AEORE_EVA_SAINT, ClassId.AEORE_SHILLIEN_SAINT));
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
@@ -193,7 +196,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
else
|
||||
{
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassList.html");
|
||||
|
||||
@@ -202,11 +205,11 @@ public class Raina extends AbstractNpcAI
|
||||
break;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"0\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -327,11 +330,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addDualClassErtheiaList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -348,7 +351,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -376,7 +379,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -412,11 +415,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenClassList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -516,7 +519,7 @@ public class Raina extends AbstractNpcAI
|
||||
case 2: // Remove (change) subclass list
|
||||
{
|
||||
final int subclassIndex = event.getReply();
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "removeSubclassList.html");
|
||||
|
||||
@@ -525,11 +528,11 @@ public class Raina extends AbstractNpcAI
|
||||
return;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"3\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -581,13 +584,13 @@ public class Raina extends AbstractNpcAI
|
||||
case 5: // Reawaken (change dual class)
|
||||
{
|
||||
final int classId = event.getReply();
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal())))
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass()))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -617,9 +620,9 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getCloakId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -638,7 +641,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -652,68 +655,34 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getPowerItemId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addPowerItem(PlayerInstance player)
|
||||
{
|
||||
int itemId = ABELIUS_POWER; // Sigel
|
||||
if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
itemId = SAPYROS_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
itemId = ASHAGEN_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
itemId = CRANIGG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
itemId = SOLTKREIG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
itemId = NAVIAROPE_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
itemId = LEISTER_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
itemId = LAKCIS_POWER;
|
||||
}
|
||||
giveItems(player, itemId, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of available subclasses Base class and already used subclasses removed
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private Set<PlayerClass> getAvailableSubClasses(PlayerInstance player)
|
||||
private Set<ClassId> getAvailableSubClasses(PlayerInstance player)
|
||||
{
|
||||
final int currentBaseId = player.getBaseClass();
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
final int baseClassId = (baseCID.level() > 2) ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs != null) && !availSubs.isEmpty())
|
||||
{
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
// scan for already used subclasses
|
||||
final int availClassId = pclass.ordinal();
|
||||
final int availClassId = pclass.getId();
|
||||
final ClassId cid = ClassId.getClassId(availClassId);
|
||||
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
@@ -722,7 +691,7 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
if (subId.equalsOrChildOf(cid))
|
||||
{
|
||||
availSubs.remove(pclass);
|
||||
availSubs.remove(cid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -745,11 +714,11 @@ public class Raina extends AbstractNpcAI
|
||||
*/
|
||||
private boolean isValidNewSubClass(PlayerInstance player, int classId)
|
||||
{
|
||||
final ClassId cid = ClassId.values()[classId];
|
||||
final ClassId cid = ClassId.getClassId(classId);
|
||||
ClassId subClassId;
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
{
|
||||
subClassId = ClassId.values()[subList.getClassId()];
|
||||
subClassId = ClassId.getClassId(subList.getClassId());
|
||||
|
||||
if (subClassId.equalsOrChildOf(cid))
|
||||
{
|
||||
@@ -762,8 +731,8 @@ public class Raina extends AbstractNpcAI
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
|
||||
// we need 2nd occupation ID
|
||||
final int baseClassId = baseCID.level() > 2 ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs == null) || availSubs.isEmpty())
|
||||
{
|
||||
@@ -771,9 +740,9 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
if (pclass.ordinal() == classId)
|
||||
if (pclass.getId() == classId)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
@@ -796,29 +765,29 @@ public class Raina extends AbstractNpcAI
|
||||
return leveled;
|
||||
}
|
||||
|
||||
public List<PlayerClass> getAvailableDualclasses(PlayerInstance player)
|
||||
public List<ClassId> getAvailableDualclasses(PlayerInstance player)
|
||||
{
|
||||
final List<PlayerClass> dualClasses = new ArrayList<>();
|
||||
final List<ClassId> dualClasses = new ArrayList<>();
|
||||
|
||||
for (PlayerClass playerClass : PlayerClass.values())
|
||||
for (ClassId ClassId : ClassId.values())
|
||||
{
|
||||
if (!playerClass.isOfRace(Race.ERTHEIA) && playerClass.isOfLevel(ClassLevel.AWAKEN) && (playerClass.ordinal() != player.getClassId().getId()))
|
||||
if ((ClassId.getRace() != Race.ERTHEIA) && CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, ClassId.getId()) && (ClassId.getId() != player.getClassId().getId()))
|
||||
{
|
||||
dualClasses.add(playerClass);
|
||||
dualClasses.add(ClassId);
|
||||
}
|
||||
}
|
||||
return dualClasses;
|
||||
}
|
||||
|
||||
private List<PlayerClass> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
private List<ClassId> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
{
|
||||
final List<PlayerClass> tempList = new ArrayList<>();
|
||||
final List<ClassId> tempList = new ArrayList<>();
|
||||
final int baseClassId = player.getBaseClass();
|
||||
final int dualClassId = player.getClassId().getId();
|
||||
|
||||
for (PlayerClass temp : dualClassList)
|
||||
for (ClassId temp : dualClassList)
|
||||
{
|
||||
if ((temp.ordinal() != baseClassId) && (temp.ordinal() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.ordinal())))
|
||||
if ((temp.getId() != baseClassId) && (temp.getId() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.getId())))
|
||||
{
|
||||
tempList.add(temp);
|
||||
}
|
||||
@@ -826,40 +795,43 @@ public class Raina extends AbstractNpcAI
|
||||
return tempList;
|
||||
}
|
||||
|
||||
public Set<PlayerClass> getSubclasses(PlayerInstance player, int classId)
|
||||
public final Set<ClassId> getSubclasses(PlayerInstance player, int classId)
|
||||
{
|
||||
Set<PlayerClass> subclasses = null;
|
||||
final PlayerClass pClass = PlayerClass.values()[classId];
|
||||
Set<ClassId> subclasses = null;
|
||||
final ClassId pClass = ClassId.getClassId(classId);
|
||||
|
||||
if ((pClass.getLevel() == THIRD) || (pClass.getLevel() == ClassLevel.FOURTH))
|
||||
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, classId) || (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, classId)))
|
||||
{
|
||||
subclasses = EnumSet.copyOf(mainSubclassSet);
|
||||
subclasses.remove(pClass);
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.ERTHEIA, THIRD));
|
||||
|
||||
// Ertheia classes cannot be subclassed and only Kamael can take Kamael classes as subclasses.
|
||||
for (ClassId cid : ClassId.values())
|
||||
{
|
||||
if ((cid.getRace() == Race.ERTHEIA) || ((cid.getRace() == Race.KAMAEL) && (player.getRace() != Race.KAMAEL)))
|
||||
{
|
||||
subclasses.remove(cid);
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getRace() == Race.KAMAEL)
|
||||
{
|
||||
if (player.getAppearance().isFemale())
|
||||
{
|
||||
subclasses.remove(PlayerClass.femaleSoulbreaker);
|
||||
subclasses.remove(ClassId.MALE_SOULBREAKER);
|
||||
}
|
||||
else
|
||||
{
|
||||
subclasses.remove(PlayerClass.maleSoulbreaker);
|
||||
subclasses.remove(ClassId.FEMALE_SOULBREAKER);
|
||||
}
|
||||
|
||||
if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
|
||||
{
|
||||
subclasses.remove(PlayerClass.inspector);
|
||||
subclasses.remove(ClassId.INSPECTOR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only Kamael can take Kamael classes as subclasses.
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.KAMAEL, THIRD));
|
||||
}
|
||||
|
||||
final Set<PlayerClass> unavailableClasses = subclassSetMap.get(pClass);
|
||||
Set<ClassId> unavailableClasses = subclassSetMap.get(pClass);
|
||||
|
||||
if (unavailableClasses != null)
|
||||
{
|
||||
@@ -870,9 +842,9 @@ public class Raina extends AbstractNpcAI
|
||||
if (subclasses != null)
|
||||
{
|
||||
final ClassId currClassId = ClassId.getClassId(player.getClassId().getId());
|
||||
for (PlayerClass tempClass : subclasses)
|
||||
for (ClassId tempClass : subclasses)
|
||||
{
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.ordinal());
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.getId());
|
||||
|
||||
if (currClassId.equalsOrChildOf(tempClassId))
|
||||
{
|
||||
@@ -908,41 +880,12 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
private int getCloakId(PlayerInstance player)
|
||||
{
|
||||
CategoryType catType = null;
|
||||
return classCloak.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
if (player.isInCategory(CategoryType.SIXTH_SIGEL_GROUP))
|
||||
private int getPowerItemId(PlayerInstance player)
|
||||
{
|
||||
catType = CategoryType.SIXTH_SIGEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_TIR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_OTHEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_YR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_FEOH_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_IS_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_WYNN_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_EOLH_GROUP;
|
||||
}
|
||||
return classCloak.get(catType);
|
||||
return powerItem.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
|
||||
+1
-2
@@ -20,7 +20,6 @@ import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -120,7 +119,7 @@ public class Q00491_InNominePatris extends Quest
|
||||
}
|
||||
case State.CREATED:
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33649-01.htm" : "33649-00.html");
|
||||
htmltext = (player.isAwakenedClass() ? "33649-01.htm" : "33649-00.html");
|
||||
break;
|
||||
}
|
||||
case State.STARTED:
|
||||
|
||||
+6
-7
@@ -19,7 +19,6 @@ package quests.Q10370_MenacingTimes;
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -155,7 +154,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
{
|
||||
case ORVEN:
|
||||
{
|
||||
if ((player.getRace() == Race.HUMAN) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.HUMAN) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30857-01.htm";
|
||||
}
|
||||
@@ -167,7 +166,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case WINONIN:
|
||||
{
|
||||
if ((player.getRace() == Race.ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30856-01.htm";
|
||||
}
|
||||
@@ -179,7 +178,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case OLTRAN:
|
||||
{
|
||||
if ((player.getRace() == Race.DARK_ELF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DARK_ELF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30862-01.htm";
|
||||
}
|
||||
@@ -191,7 +190,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case LADANZA:
|
||||
{
|
||||
if ((player.getRace() == Race.ORC) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.ORC) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30865-01.htm";
|
||||
}
|
||||
@@ -203,7 +202,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case FERRIS:
|
||||
{
|
||||
if ((player.getRace() == Race.DWARF) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.DWARF) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "30847-01.htm";
|
||||
}
|
||||
@@ -215,7 +214,7 @@ public class Q10370_MenacingTimes extends Quest
|
||||
}
|
||||
case BROME:
|
||||
{
|
||||
if ((player.getRace() == Race.KAMAEL) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((player.getRace() == Race.KAMAEL) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "32221-01.htm";
|
||||
}
|
||||
|
||||
+1
-2
@@ -19,7 +19,6 @@ package quests.Q10371_GraspThyPower;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -103,7 +102,7 @@ public class Q10371_GraspThyPower extends Quest
|
||||
{
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
if ((qs.isCreated()) && (player.getClassId().level() == ClassLevel.FOURTH.ordinal()))
|
||||
if ((qs.isCreated()) && player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "33648-01.htm";
|
||||
}
|
||||
|
||||
+1
-2
@@ -18,7 +18,6 @@ package quests.Q10372_PurgatoryVolvere;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.model.quest.State;
|
||||
@@ -126,7 +125,7 @@ public class Q10372_PurgatoryVolvere extends Quest
|
||||
{
|
||||
if (npc.getId() == GERKENSHTEIN)
|
||||
{
|
||||
htmltext = ((player.getClassId().level() == ClassLevel.FOURTH.ordinal()) ? "33648-01.htm" : "complete.htm");
|
||||
htmltext = (player.isAwakenedClass() ? "33648-01.htm" : "complete.htm");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10374_ThatPlaceSuccubus;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -110,7 +111,7 @@ public class Q10374_ThatPlaceSuccubus extends Quest
|
||||
final QuestState qs = getQuestState(player, true);
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,11 +16,12 @@
|
||||
*/
|
||||
package quests.Q10375_SuccubusDisciples;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -106,7 +107,7 @@ public class Q10375_SuccubusDisciples extends Quest
|
||||
htmltext = getAlreadyCompletedMsg(player);
|
||||
}
|
||||
|
||||
if ((npc.getId() == ZENYA) && (player.getClassId().level() == ClassLevel.THIRD.ordinal()))
|
||||
if ((npc.getId() == ZENYA) && !CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
|
||||
{
|
||||
return "noClass.html";
|
||||
}
|
||||
|
||||
+1
-2
@@ -21,7 +21,6 @@ import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassLevel;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
@@ -157,7 +156,7 @@ public class Q10376_BloodyGoodTime extends Quest
|
||||
{
|
||||
case State.CREATED:
|
||||
{
|
||||
if (((player.getClassId().level() != ClassLevel.AWAKEN.ordinal()) && (player.getRace() != Race.ERTHEIA)))
|
||||
if (!player.isAwakenedClass() && (player.getRace() != Race.ERTHEIA))
|
||||
{
|
||||
return "32140-01.htm";
|
||||
}
|
||||
|
||||
+5
@@ -9767,6 +9767,11 @@ public class PlayerInstance extends Playable
|
||||
return _classIndex > 0;
|
||||
}
|
||||
|
||||
public boolean isAwakenedClass()
|
||||
{
|
||||
return isInCategory(CategoryType.SIXTH_CLASS_GROUP);
|
||||
}
|
||||
|
||||
public void setDualClass(int classIndex)
|
||||
{
|
||||
if (isSubClassActive())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -1,256 +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.EnumSet;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
|
||||
/**
|
||||
* @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 Race _race;
|
||||
private ClassLevel _level;
|
||||
private ClassType _type;
|
||||
|
||||
private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
|
||||
{
|
||||
_race = race;
|
||||
_level = pLevel;
|
||||
_type = pType;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
+115
-172
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package ai.areas.TalkingIsland.Raina;
|
||||
|
||||
import static org.l2jmobius.gameserver.model.base.ClassLevel.THIRD;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
@@ -25,7 +23,9 @@ import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
@@ -37,8 +37,6 @@ import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
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.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -68,45 +66,37 @@ public class Raina extends AbstractNpcAI
|
||||
private static final int RAINA = 33491;
|
||||
// Items
|
||||
private static final int SUBCLASS_CERTIFICATE = 30433;
|
||||
private static final int CHAOS_POMANDER_DUAL_CLASS = 37375;
|
||||
private static final int ABELIUS_POWER = 32264;
|
||||
private static final int SAPYROS_POWER = 32265;
|
||||
private static final int ASHAGEN_POWER = 32266;
|
||||
private static final int CRANIGG_POWER = 32267;
|
||||
private static final int SOLTKREIG_POWER = 32268;
|
||||
private static final int NAVIAROPE_POWER = 32269;
|
||||
private static final int LEISTER_POWER = 32270;
|
||||
private static final int LAKCIS_POWER = 32271;
|
||||
private static final int CHAOS_POMANDER = 37375;
|
||||
// Misc
|
||||
private static final Set<PlayerClass> mainSubclassSet;
|
||||
private static final Set<PlayerClass> neverSubclassed = EnumSet.of(PlayerClass.Overlord, PlayerClass.Warsmith);
|
||||
private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(PlayerClass.DarkAvenger, PlayerClass.Paladin, PlayerClass.TempleKnight, PlayerClass.ShillienKnight);
|
||||
private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(PlayerClass.TreasureHunter, PlayerClass.AbyssWalker, PlayerClass.Plainswalker);
|
||||
private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(PlayerClass.Hawkeye, PlayerClass.SilverRanger, PlayerClass.PhantomRanger);
|
||||
private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(PlayerClass.Warlock, PlayerClass.ElementalSummoner, PlayerClass.PhantomSummoner);
|
||||
private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(PlayerClass.Sorceror, PlayerClass.Spellsinger, PlayerClass.Spellhowler);
|
||||
private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
|
||||
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<PlayerClass> subclasses = PlayerClass.getSet(null, THIRD);
|
||||
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(PlayerClass.DarkAvenger, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.Paladin, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TempleKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.ShillienKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TreasureHunter, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.AbyssWalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Plainswalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Hawkeye, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.SilverRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.PhantomRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.Warlock, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.ElementalSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.PhantomSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.Sorceror, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellsinger, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellhowler, subclasseSet5);
|
||||
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);
|
||||
}
|
||||
|
||||
private static final Map<CategoryType, Integer> classCloak = new HashMap<>();
|
||||
@@ -122,17 +112,30 @@ public class Raina extends AbstractNpcAI
|
||||
classCloak.put(CategoryType.SIXTH_EOLH_GROUP, 30317); // Laksis Cloak Grade
|
||||
}
|
||||
|
||||
private static final List<PlayerClass> dualClassList = new ArrayList<>();
|
||||
private static final Map<CategoryType, Integer> powerItem = new HashMap<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.sigelPhoenixKnight, PlayerClass.sigelHellKnight, PlayerClass.sigelEvasTemplar, PlayerClass.sigelShilenTemplar));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.tyrrDuelist, PlayerClass.tyrrDreadnought, PlayerClass.tyrrTitan, PlayerClass.tyrrGrandKhavatari, PlayerClass.tyrrDoombringer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.othellAdventurer, PlayerClass.othellWindRider, PlayerClass.othellGhostHunter, PlayerClass.othellFortuneSeeker));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.yulSagittarius, PlayerClass.yulMoonlightSentinel, PlayerClass.yulGhostSentinel, PlayerClass.yulTrickster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.feohArchmage, PlayerClass.feohSoultaker, PlayerClass.feohMysticMuse, PlayerClass.feoStormScreamer, PlayerClass.feohSoulHound));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.issHierophant, PlayerClass.issSwordMuse, PlayerClass.issSpectralDancer, PlayerClass.issDoomcryer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.wynnArcanaLord, PlayerClass.wynnElementalMaster, PlayerClass.wynnSpectralMaster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.aeoreCardinal, PlayerClass.aeoreEvaSaint, PlayerClass.aeoreShillienSaint));
|
||||
powerItem.put(CategoryType.SIXTH_SIGEL_GROUP, 32264); // Abelius Power
|
||||
powerItem.put(CategoryType.SIXTH_TIR_GROUP, 32265); // Sapyros Power
|
||||
powerItem.put(CategoryType.SIXTH_OTHEL_GROUP, 32266); // Ashagen Power
|
||||
powerItem.put(CategoryType.SIXTH_YR_GROUP, 32267); // Cranigg Power
|
||||
powerItem.put(CategoryType.SIXTH_FEOH_GROUP, 32268); // Soltkreig Power
|
||||
powerItem.put(CategoryType.SIXTH_WYNN_GROUP, 32269); // Naviarope Power
|
||||
powerItem.put(CategoryType.SIXTH_IS_GROUP, 32270); // Leister Power
|
||||
powerItem.put(CategoryType.SIXTH_EOLH_GROUP, 32271); // Laksis Power
|
||||
}
|
||||
|
||||
private static final List<ClassId> dualClassList = new ArrayList<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(ClassId.SIGEL_PHOENIX_KNIGHT, ClassId.SIGEL_HELL_KNIGHT, ClassId.SIGEL_EVA_TEMPLAR, ClassId.SIGEL_SHILLIEN_TEMPLAR));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.TYRR_DUELIST, ClassId.TYRR_DREADNOUGHT, ClassId.TYRR_TITAN, ClassId.TYRR_GRAND_KHAVATARI, ClassId.TYRR_DOOMBRINGER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.OTHELL_ADVENTURER, ClassId.OTHELL_WIND_RIDER, ClassId.OTHELL_GHOST_HUNTER, ClassId.OTHELL_FORTUNE_SEEKER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.YUL_SAGITTARIUS, ClassId.YUL_MOONLIGHT_SENTINEL, ClassId.YUL_GHOST_SENTINEL, ClassId.YUL_TRICKSTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.FEOH_ARCHMAGE, ClassId.FEOH_SOULTAKER, ClassId.FEOH_MYSTIC_MUSE, ClassId.FEOH_STORM_SCREAMER, ClassId.FEOH_SOUL_HOUND));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.ISS_HIEROPHANT, ClassId.ISS_SWORD_MUSE, ClassId.ISS_SPECTRAL_DANCER, ClassId.ISS_DOOMCRYER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.WYNN_ARCANA_LORD, ClassId.WYNN_ELEMENTAL_MASTER, ClassId.WYNN_SPECTRAL_MASTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.AEORE_CARDINAL, ClassId.AEORE_EVA_SAINT, ClassId.AEORE_SHILLIEN_SAINT));
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
@@ -193,7 +196,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
else
|
||||
{
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassList.html");
|
||||
|
||||
@@ -202,11 +205,11 @@ public class Raina extends AbstractNpcAI
|
||||
break;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"0\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -327,11 +330,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addDualClassErtheiaList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -348,7 +351,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -376,7 +379,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -412,11 +415,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenClassList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -516,7 +519,7 @@ public class Raina extends AbstractNpcAI
|
||||
case 2: // Remove (change) subclass list
|
||||
{
|
||||
final int subclassIndex = event.getReply();
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "removeSubclassList.html");
|
||||
|
||||
@@ -525,11 +528,11 @@ public class Raina extends AbstractNpcAI
|
||||
return;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"3\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -581,13 +584,13 @@ public class Raina extends AbstractNpcAI
|
||||
case 5: // Reawaken (change dual class)
|
||||
{
|
||||
final int classId = event.getReply();
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal())))
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass()))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -617,9 +620,9 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getCloakId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -638,7 +641,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -652,68 +655,34 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getPowerItemId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addPowerItem(PlayerInstance player)
|
||||
{
|
||||
int itemId = ABELIUS_POWER; // Sigel
|
||||
if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
itemId = SAPYROS_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
itemId = ASHAGEN_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
itemId = CRANIGG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
itemId = SOLTKREIG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
itemId = NAVIAROPE_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
itemId = LEISTER_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
itemId = LAKCIS_POWER;
|
||||
}
|
||||
giveItems(player, itemId, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of available subclasses Base class and already used subclasses removed
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private Set<PlayerClass> getAvailableSubClasses(PlayerInstance player)
|
||||
private Set<ClassId> getAvailableSubClasses(PlayerInstance player)
|
||||
{
|
||||
final int currentBaseId = player.getBaseClass();
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
final int baseClassId = (baseCID.level() > 2) ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs != null) && !availSubs.isEmpty())
|
||||
{
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
// scan for already used subclasses
|
||||
final int availClassId = pclass.ordinal();
|
||||
final int availClassId = pclass.getId();
|
||||
final ClassId cid = ClassId.getClassId(availClassId);
|
||||
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
@@ -722,7 +691,7 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
if (subId.equalsOrChildOf(cid))
|
||||
{
|
||||
availSubs.remove(pclass);
|
||||
availSubs.remove(cid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -745,11 +714,11 @@ public class Raina extends AbstractNpcAI
|
||||
*/
|
||||
private boolean isValidNewSubClass(PlayerInstance player, int classId)
|
||||
{
|
||||
final ClassId cid = ClassId.values()[classId];
|
||||
final ClassId cid = ClassId.getClassId(classId);
|
||||
ClassId subClassId;
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
{
|
||||
subClassId = ClassId.values()[subList.getClassId()];
|
||||
subClassId = ClassId.getClassId(subList.getClassId());
|
||||
|
||||
if (subClassId.equalsOrChildOf(cid))
|
||||
{
|
||||
@@ -762,8 +731,8 @@ public class Raina extends AbstractNpcAI
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
|
||||
// we need 2nd occupation ID
|
||||
final int baseClassId = baseCID.level() > 2 ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs == null) || availSubs.isEmpty())
|
||||
{
|
||||
@@ -771,9 +740,9 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
if (pclass.ordinal() == classId)
|
||||
if (pclass.getId() == classId)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
@@ -796,29 +765,29 @@ public class Raina extends AbstractNpcAI
|
||||
return leveled;
|
||||
}
|
||||
|
||||
public List<PlayerClass> getAvailableDualclasses(PlayerInstance player)
|
||||
public List<ClassId> getAvailableDualclasses(PlayerInstance player)
|
||||
{
|
||||
final List<PlayerClass> dualClasses = new ArrayList<>();
|
||||
final List<ClassId> dualClasses = new ArrayList<>();
|
||||
|
||||
for (PlayerClass playerClass : PlayerClass.values())
|
||||
for (ClassId ClassId : ClassId.values())
|
||||
{
|
||||
if (!playerClass.isOfRace(Race.ERTHEIA) && playerClass.isOfLevel(ClassLevel.AWAKEN) && (playerClass.ordinal() != player.getClassId().getId()))
|
||||
if ((ClassId.getRace() != Race.ERTHEIA) && CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, ClassId.getId()) && (ClassId.getId() != player.getClassId().getId()))
|
||||
{
|
||||
dualClasses.add(playerClass);
|
||||
dualClasses.add(ClassId);
|
||||
}
|
||||
}
|
||||
return dualClasses;
|
||||
}
|
||||
|
||||
private List<PlayerClass> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
private List<ClassId> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
{
|
||||
final List<PlayerClass> tempList = new ArrayList<>();
|
||||
final List<ClassId> tempList = new ArrayList<>();
|
||||
final int baseClassId = player.getBaseClass();
|
||||
final int dualClassId = player.getClassId().getId();
|
||||
|
||||
for (PlayerClass temp : dualClassList)
|
||||
for (ClassId temp : dualClassList)
|
||||
{
|
||||
if ((temp.ordinal() != baseClassId) && (temp.ordinal() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.ordinal())))
|
||||
if ((temp.getId() != baseClassId) && (temp.getId() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.getId())))
|
||||
{
|
||||
tempList.add(temp);
|
||||
}
|
||||
@@ -826,40 +795,43 @@ public class Raina extends AbstractNpcAI
|
||||
return tempList;
|
||||
}
|
||||
|
||||
public Set<PlayerClass> getSubclasses(PlayerInstance player, int classId)
|
||||
public final Set<ClassId> getSubclasses(PlayerInstance player, int classId)
|
||||
{
|
||||
Set<PlayerClass> subclasses = null;
|
||||
final PlayerClass pClass = PlayerClass.values()[classId];
|
||||
Set<ClassId> subclasses = null;
|
||||
final ClassId pClass = ClassId.getClassId(classId);
|
||||
|
||||
if ((pClass.getLevel() == THIRD) || (pClass.getLevel() == ClassLevel.FOURTH))
|
||||
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, classId) || (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, classId)))
|
||||
{
|
||||
subclasses = EnumSet.copyOf(mainSubclassSet);
|
||||
subclasses.remove(pClass);
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.ERTHEIA, THIRD));
|
||||
|
||||
// Ertheia classes cannot be subclassed and only Kamael can take Kamael classes as subclasses.
|
||||
for (ClassId cid : ClassId.values())
|
||||
{
|
||||
if ((cid.getRace() == Race.ERTHEIA) || ((cid.getRace() == Race.KAMAEL) && (player.getRace() != Race.KAMAEL)))
|
||||
{
|
||||
subclasses.remove(cid);
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getRace() == Race.KAMAEL)
|
||||
{
|
||||
if (player.getAppearance().isFemale())
|
||||
{
|
||||
subclasses.remove(PlayerClass.femaleSoulbreaker);
|
||||
subclasses.remove(ClassId.MALE_SOULBREAKER);
|
||||
}
|
||||
else
|
||||
{
|
||||
subclasses.remove(PlayerClass.maleSoulbreaker);
|
||||
subclasses.remove(ClassId.FEMALE_SOULBREAKER);
|
||||
}
|
||||
|
||||
if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
|
||||
{
|
||||
subclasses.remove(PlayerClass.inspector);
|
||||
subclasses.remove(ClassId.INSPECTOR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only Kamael can take Kamael classes as subclasses.
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.KAMAEL, THIRD));
|
||||
}
|
||||
|
||||
final Set<PlayerClass> unavailableClasses = subclassSetMap.get(pClass);
|
||||
Set<ClassId> unavailableClasses = subclassSetMap.get(pClass);
|
||||
|
||||
if (unavailableClasses != null)
|
||||
{
|
||||
@@ -870,9 +842,9 @@ public class Raina extends AbstractNpcAI
|
||||
if (subclasses != null)
|
||||
{
|
||||
final ClassId currClassId = ClassId.getClassId(player.getClassId().getId());
|
||||
for (PlayerClass tempClass : subclasses)
|
||||
for (ClassId tempClass : subclasses)
|
||||
{
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.ordinal());
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.getId());
|
||||
|
||||
if (currClassId.equalsOrChildOf(tempClassId))
|
||||
{
|
||||
@@ -908,41 +880,12 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
private int getCloakId(PlayerInstance player)
|
||||
{
|
||||
CategoryType catType = null;
|
||||
return classCloak.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
if (player.isInCategory(CategoryType.SIXTH_SIGEL_GROUP))
|
||||
private int getPowerItemId(PlayerInstance player)
|
||||
{
|
||||
catType = CategoryType.SIXTH_SIGEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_TIR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_OTHEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_YR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_FEOH_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_IS_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_WYNN_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_EOLH_GROUP;
|
||||
}
|
||||
return classCloak.get(catType);
|
||||
return powerItem.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
|
||||
+5
@@ -9767,6 +9767,11 @@ public class PlayerInstance extends Playable
|
||||
return _classIndex > 0;
|
||||
}
|
||||
|
||||
public boolean isAwakenedClass()
|
||||
{
|
||||
return isInCategory(CategoryType.SIXTH_CLASS_GROUP);
|
||||
}
|
||||
|
||||
public void setDualClass(int classIndex)
|
||||
{
|
||||
if (isSubClassActive())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -1,256 +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.EnumSet;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
|
||||
/**
|
||||
* @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 Race _race;
|
||||
private ClassLevel _level;
|
||||
private ClassType _type;
|
||||
|
||||
private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
|
||||
{
|
||||
_race = race;
|
||||
_level = pLevel;
|
||||
_type = pType;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
+115
-172
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package ai.areas.TalkingIsland.Raina;
|
||||
|
||||
import static org.l2jmobius.gameserver.model.base.ClassLevel.THIRD;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
@@ -25,7 +23,9 @@ import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
@@ -37,8 +37,6 @@ import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
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.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -68,45 +66,37 @@ public class Raina extends AbstractNpcAI
|
||||
private static final int RAINA = 33491;
|
||||
// Items
|
||||
private static final int SUBCLASS_CERTIFICATE = 30433;
|
||||
private static final int CHAOS_POMANDER_DUAL_CLASS = 37375;
|
||||
private static final int ABELIUS_POWER = 32264;
|
||||
private static final int SAPYROS_POWER = 32265;
|
||||
private static final int ASHAGEN_POWER = 32266;
|
||||
private static final int CRANIGG_POWER = 32267;
|
||||
private static final int SOLTKREIG_POWER = 32268;
|
||||
private static final int NAVIAROPE_POWER = 32269;
|
||||
private static final int LEISTER_POWER = 32270;
|
||||
private static final int LAKCIS_POWER = 32271;
|
||||
private static final int CHAOS_POMANDER = 37375;
|
||||
// Misc
|
||||
private static final Set<PlayerClass> mainSubclassSet;
|
||||
private static final Set<PlayerClass> neverSubclassed = EnumSet.of(PlayerClass.Overlord, PlayerClass.Warsmith);
|
||||
private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(PlayerClass.DarkAvenger, PlayerClass.Paladin, PlayerClass.TempleKnight, PlayerClass.ShillienKnight);
|
||||
private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(PlayerClass.TreasureHunter, PlayerClass.AbyssWalker, PlayerClass.Plainswalker);
|
||||
private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(PlayerClass.Hawkeye, PlayerClass.SilverRanger, PlayerClass.PhantomRanger);
|
||||
private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(PlayerClass.Warlock, PlayerClass.ElementalSummoner, PlayerClass.PhantomSummoner);
|
||||
private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(PlayerClass.Sorceror, PlayerClass.Spellsinger, PlayerClass.Spellhowler);
|
||||
private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
|
||||
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<PlayerClass> subclasses = PlayerClass.getSet(null, THIRD);
|
||||
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(PlayerClass.DarkAvenger, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.Paladin, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TempleKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.ShillienKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TreasureHunter, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.AbyssWalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Plainswalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Hawkeye, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.SilverRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.PhantomRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.Warlock, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.ElementalSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.PhantomSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.Sorceror, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellsinger, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellhowler, subclasseSet5);
|
||||
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);
|
||||
}
|
||||
|
||||
private static final Map<CategoryType, Integer> classCloak = new HashMap<>();
|
||||
@@ -122,17 +112,30 @@ public class Raina extends AbstractNpcAI
|
||||
classCloak.put(CategoryType.SIXTH_EOLH_GROUP, 30317); // Laksis Cloak Grade
|
||||
}
|
||||
|
||||
private static final List<PlayerClass> dualClassList = new ArrayList<>();
|
||||
private static final Map<CategoryType, Integer> powerItem = new HashMap<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.sigelPhoenixKnight, PlayerClass.sigelHellKnight, PlayerClass.sigelEvasTemplar, PlayerClass.sigelShilenTemplar));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.tyrrDuelist, PlayerClass.tyrrDreadnought, PlayerClass.tyrrTitan, PlayerClass.tyrrGrandKhavatari, PlayerClass.tyrrDoombringer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.othellAdventurer, PlayerClass.othellWindRider, PlayerClass.othellGhostHunter, PlayerClass.othellFortuneSeeker));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.yulSagittarius, PlayerClass.yulMoonlightSentinel, PlayerClass.yulGhostSentinel, PlayerClass.yulTrickster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.feohArchmage, PlayerClass.feohSoultaker, PlayerClass.feohMysticMuse, PlayerClass.feoStormScreamer, PlayerClass.feohSoulHound));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.issHierophant, PlayerClass.issSwordMuse, PlayerClass.issSpectralDancer, PlayerClass.issDoomcryer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.wynnArcanaLord, PlayerClass.wynnElementalMaster, PlayerClass.wynnSpectralMaster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.aeoreCardinal, PlayerClass.aeoreEvaSaint, PlayerClass.aeoreShillienSaint));
|
||||
powerItem.put(CategoryType.SIXTH_SIGEL_GROUP, 32264); // Abelius Power
|
||||
powerItem.put(CategoryType.SIXTH_TIR_GROUP, 32265); // Sapyros Power
|
||||
powerItem.put(CategoryType.SIXTH_OTHEL_GROUP, 32266); // Ashagen Power
|
||||
powerItem.put(CategoryType.SIXTH_YR_GROUP, 32267); // Cranigg Power
|
||||
powerItem.put(CategoryType.SIXTH_FEOH_GROUP, 32268); // Soltkreig Power
|
||||
powerItem.put(CategoryType.SIXTH_WYNN_GROUP, 32269); // Naviarope Power
|
||||
powerItem.put(CategoryType.SIXTH_IS_GROUP, 32270); // Leister Power
|
||||
powerItem.put(CategoryType.SIXTH_EOLH_GROUP, 32271); // Laksis Power
|
||||
}
|
||||
|
||||
private static final List<ClassId> dualClassList = new ArrayList<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(ClassId.SIGEL_PHOENIX_KNIGHT, ClassId.SIGEL_HELL_KNIGHT, ClassId.SIGEL_EVA_TEMPLAR, ClassId.SIGEL_SHILLIEN_TEMPLAR));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.TYRR_DUELIST, ClassId.TYRR_DREADNOUGHT, ClassId.TYRR_TITAN, ClassId.TYRR_GRAND_KHAVATARI, ClassId.TYRR_DOOMBRINGER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.OTHELL_ADVENTURER, ClassId.OTHELL_WIND_RIDER, ClassId.OTHELL_GHOST_HUNTER, ClassId.OTHELL_FORTUNE_SEEKER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.YUL_SAGITTARIUS, ClassId.YUL_MOONLIGHT_SENTINEL, ClassId.YUL_GHOST_SENTINEL, ClassId.YUL_TRICKSTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.FEOH_ARCHMAGE, ClassId.FEOH_SOULTAKER, ClassId.FEOH_MYSTIC_MUSE, ClassId.FEOH_STORM_SCREAMER, ClassId.FEOH_SOUL_HOUND));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.ISS_HIEROPHANT, ClassId.ISS_SWORD_MUSE, ClassId.ISS_SPECTRAL_DANCER, ClassId.ISS_DOOMCRYER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.WYNN_ARCANA_LORD, ClassId.WYNN_ELEMENTAL_MASTER, ClassId.WYNN_SPECTRAL_MASTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.AEORE_CARDINAL, ClassId.AEORE_EVA_SAINT, ClassId.AEORE_SHILLIEN_SAINT));
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
@@ -193,7 +196,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
else
|
||||
{
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassList.html");
|
||||
|
||||
@@ -202,11 +205,11 @@ public class Raina extends AbstractNpcAI
|
||||
break;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"0\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -327,11 +330,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addDualClassErtheiaList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -348,7 +351,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -376,7 +379,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -412,11 +415,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenClassList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -516,7 +519,7 @@ public class Raina extends AbstractNpcAI
|
||||
case 2: // Remove (change) subclass list
|
||||
{
|
||||
final int subclassIndex = event.getReply();
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "removeSubclassList.html");
|
||||
|
||||
@@ -525,11 +528,11 @@ public class Raina extends AbstractNpcAI
|
||||
return;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"3\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -581,13 +584,13 @@ public class Raina extends AbstractNpcAI
|
||||
case 5: // Reawaken (change dual class)
|
||||
{
|
||||
final int classId = event.getReply();
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal())))
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass()))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -617,9 +620,9 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getCloakId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -638,7 +641,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -652,68 +655,34 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getPowerItemId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addPowerItem(PlayerInstance player)
|
||||
{
|
||||
int itemId = ABELIUS_POWER; // Sigel
|
||||
if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
itemId = SAPYROS_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
itemId = ASHAGEN_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
itemId = CRANIGG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
itemId = SOLTKREIG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
itemId = NAVIAROPE_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
itemId = LEISTER_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
itemId = LAKCIS_POWER;
|
||||
}
|
||||
giveItems(player, itemId, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of available subclasses Base class and already used subclasses removed
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private Set<PlayerClass> getAvailableSubClasses(PlayerInstance player)
|
||||
private Set<ClassId> getAvailableSubClasses(PlayerInstance player)
|
||||
{
|
||||
final int currentBaseId = player.getBaseClass();
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
final int baseClassId = (baseCID.level() > 2) ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs != null) && !availSubs.isEmpty())
|
||||
{
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
// scan for already used subclasses
|
||||
final int availClassId = pclass.ordinal();
|
||||
final int availClassId = pclass.getId();
|
||||
final ClassId cid = ClassId.getClassId(availClassId);
|
||||
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
@@ -722,7 +691,7 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
if (subId.equalsOrChildOf(cid))
|
||||
{
|
||||
availSubs.remove(pclass);
|
||||
availSubs.remove(cid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -745,11 +714,11 @@ public class Raina extends AbstractNpcAI
|
||||
*/
|
||||
private boolean isValidNewSubClass(PlayerInstance player, int classId)
|
||||
{
|
||||
final ClassId cid = ClassId.values()[classId];
|
||||
final ClassId cid = ClassId.getClassId(classId);
|
||||
ClassId subClassId;
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
{
|
||||
subClassId = ClassId.values()[subList.getClassId()];
|
||||
subClassId = ClassId.getClassId(subList.getClassId());
|
||||
|
||||
if (subClassId.equalsOrChildOf(cid))
|
||||
{
|
||||
@@ -762,8 +731,8 @@ public class Raina extends AbstractNpcAI
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
|
||||
// we need 2nd occupation ID
|
||||
final int baseClassId = baseCID.level() > 2 ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs == null) || availSubs.isEmpty())
|
||||
{
|
||||
@@ -771,9 +740,9 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
if (pclass.ordinal() == classId)
|
||||
if (pclass.getId() == classId)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
@@ -796,29 +765,29 @@ public class Raina extends AbstractNpcAI
|
||||
return leveled;
|
||||
}
|
||||
|
||||
public List<PlayerClass> getAvailableDualclasses(PlayerInstance player)
|
||||
public List<ClassId> getAvailableDualclasses(PlayerInstance player)
|
||||
{
|
||||
final List<PlayerClass> dualClasses = new ArrayList<>();
|
||||
final List<ClassId> dualClasses = new ArrayList<>();
|
||||
|
||||
for (PlayerClass playerClass : PlayerClass.values())
|
||||
for (ClassId ClassId : ClassId.values())
|
||||
{
|
||||
if (!playerClass.isOfRace(Race.ERTHEIA) && playerClass.isOfLevel(ClassLevel.AWAKEN) && (playerClass.ordinal() != player.getClassId().getId()))
|
||||
if ((ClassId.getRace() != Race.ERTHEIA) && CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, ClassId.getId()) && (ClassId.getId() != player.getClassId().getId()))
|
||||
{
|
||||
dualClasses.add(playerClass);
|
||||
dualClasses.add(ClassId);
|
||||
}
|
||||
}
|
||||
return dualClasses;
|
||||
}
|
||||
|
||||
private List<PlayerClass> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
private List<ClassId> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
{
|
||||
final List<PlayerClass> tempList = new ArrayList<>();
|
||||
final List<ClassId> tempList = new ArrayList<>();
|
||||
final int baseClassId = player.getBaseClass();
|
||||
final int dualClassId = player.getClassId().getId();
|
||||
|
||||
for (PlayerClass temp : dualClassList)
|
||||
for (ClassId temp : dualClassList)
|
||||
{
|
||||
if ((temp.ordinal() != baseClassId) && (temp.ordinal() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.ordinal())))
|
||||
if ((temp.getId() != baseClassId) && (temp.getId() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.getId())))
|
||||
{
|
||||
tempList.add(temp);
|
||||
}
|
||||
@@ -826,40 +795,43 @@ public class Raina extends AbstractNpcAI
|
||||
return tempList;
|
||||
}
|
||||
|
||||
public Set<PlayerClass> getSubclasses(PlayerInstance player, int classId)
|
||||
public final Set<ClassId> getSubclasses(PlayerInstance player, int classId)
|
||||
{
|
||||
Set<PlayerClass> subclasses = null;
|
||||
final PlayerClass pClass = PlayerClass.values()[classId];
|
||||
Set<ClassId> subclasses = null;
|
||||
final ClassId pClass = ClassId.getClassId(classId);
|
||||
|
||||
if ((pClass.getLevel() == THIRD) || (pClass.getLevel() == ClassLevel.FOURTH))
|
||||
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, classId) || (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, classId)))
|
||||
{
|
||||
subclasses = EnumSet.copyOf(mainSubclassSet);
|
||||
subclasses.remove(pClass);
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.ERTHEIA, THIRD));
|
||||
|
||||
// Ertheia classes cannot be subclassed and only Kamael can take Kamael classes as subclasses.
|
||||
for (ClassId cid : ClassId.values())
|
||||
{
|
||||
if ((cid.getRace() == Race.ERTHEIA) || ((cid.getRace() == Race.KAMAEL) && (player.getRace() != Race.KAMAEL)))
|
||||
{
|
||||
subclasses.remove(cid);
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getRace() == Race.KAMAEL)
|
||||
{
|
||||
if (player.getAppearance().isFemale())
|
||||
{
|
||||
subclasses.remove(PlayerClass.femaleSoulbreaker);
|
||||
subclasses.remove(ClassId.MALE_SOULBREAKER);
|
||||
}
|
||||
else
|
||||
{
|
||||
subclasses.remove(PlayerClass.maleSoulbreaker);
|
||||
subclasses.remove(ClassId.FEMALE_SOULBREAKER);
|
||||
}
|
||||
|
||||
if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
|
||||
{
|
||||
subclasses.remove(PlayerClass.inspector);
|
||||
subclasses.remove(ClassId.INSPECTOR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only Kamael can take Kamael classes as subclasses.
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.KAMAEL, THIRD));
|
||||
}
|
||||
|
||||
final Set<PlayerClass> unavailableClasses = subclassSetMap.get(pClass);
|
||||
Set<ClassId> unavailableClasses = subclassSetMap.get(pClass);
|
||||
|
||||
if (unavailableClasses != null)
|
||||
{
|
||||
@@ -870,9 +842,9 @@ public class Raina extends AbstractNpcAI
|
||||
if (subclasses != null)
|
||||
{
|
||||
final ClassId currClassId = ClassId.getClassId(player.getClassId().getId());
|
||||
for (PlayerClass tempClass : subclasses)
|
||||
for (ClassId tempClass : subclasses)
|
||||
{
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.ordinal());
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.getId());
|
||||
|
||||
if (currClassId.equalsOrChildOf(tempClassId))
|
||||
{
|
||||
@@ -908,41 +880,12 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
private int getCloakId(PlayerInstance player)
|
||||
{
|
||||
CategoryType catType = null;
|
||||
return classCloak.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
if (player.isInCategory(CategoryType.SIXTH_SIGEL_GROUP))
|
||||
private int getPowerItemId(PlayerInstance player)
|
||||
{
|
||||
catType = CategoryType.SIXTH_SIGEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_TIR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_OTHEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_YR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_FEOH_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_IS_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_WYNN_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_EOLH_GROUP;
|
||||
}
|
||||
return classCloak.get(catType);
|
||||
return powerItem.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
|
||||
+5
@@ -9773,6 +9773,11 @@ public class PlayerInstance extends Playable
|
||||
return _classIndex > 0;
|
||||
}
|
||||
|
||||
public boolean isAwakenedClass()
|
||||
{
|
||||
return isInCategory(CategoryType.SIXTH_CLASS_GROUP);
|
||||
}
|
||||
|
||||
public void setDualClass(int classIndex)
|
||||
{
|
||||
if (isSubClassActive())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -1,256 +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.EnumSet;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
|
||||
/**
|
||||
* @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 Race _race;
|
||||
private ClassLevel _level;
|
||||
private ClassType _type;
|
||||
|
||||
private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
|
||||
{
|
||||
_race = race;
|
||||
_level = pLevel;
|
||||
_type = pType;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
+115
-172
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package ai.areas.TalkingIsland.Raina;
|
||||
|
||||
import static org.l2jmobius.gameserver.model.base.ClassLevel.THIRD;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
@@ -25,7 +23,9 @@ import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
@@ -37,8 +37,6 @@ import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
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.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
@@ -65,45 +63,37 @@ public class Raina extends AbstractNpcAI
|
||||
private static final int RAINA = 33491;
|
||||
// Items
|
||||
private static final int SUBCLASS_CERTIFICATE = 30433;
|
||||
private static final int CHAOS_POMANDER_DUAL_CLASS = 37375;
|
||||
private static final int ABELIUS_POWER = 32264;
|
||||
private static final int SAPYROS_POWER = 32265;
|
||||
private static final int ASHAGEN_POWER = 32266;
|
||||
private static final int CRANIGG_POWER = 32267;
|
||||
private static final int SOLTKREIG_POWER = 32268;
|
||||
private static final int NAVIAROPE_POWER = 32269;
|
||||
private static final int LEISTER_POWER = 32270;
|
||||
private static final int LAKCIS_POWER = 32271;
|
||||
private static final int CHAOS_POMANDER = 37375;
|
||||
// Misc
|
||||
private static final Set<PlayerClass> mainSubclassSet;
|
||||
private static final Set<PlayerClass> neverSubclassed = EnumSet.of(PlayerClass.Overlord, PlayerClass.Warsmith);
|
||||
private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(PlayerClass.DarkAvenger, PlayerClass.Paladin, PlayerClass.TempleKnight, PlayerClass.ShillienKnight);
|
||||
private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(PlayerClass.TreasureHunter, PlayerClass.AbyssWalker, PlayerClass.Plainswalker);
|
||||
private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(PlayerClass.Hawkeye, PlayerClass.SilverRanger, PlayerClass.PhantomRanger);
|
||||
private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(PlayerClass.Warlock, PlayerClass.ElementalSummoner, PlayerClass.PhantomSummoner);
|
||||
private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(PlayerClass.Sorceror, PlayerClass.Spellsinger, PlayerClass.Spellhowler);
|
||||
private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
|
||||
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<PlayerClass> subclasses = PlayerClass.getSet(null, THIRD);
|
||||
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(PlayerClass.DarkAvenger, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.Paladin, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TempleKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.ShillienKnight, subclasseSet1);
|
||||
subclassSetMap.put(PlayerClass.TreasureHunter, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.AbyssWalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Plainswalker, subclasseSet2);
|
||||
subclassSetMap.put(PlayerClass.Hawkeye, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.SilverRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.PhantomRanger, subclasseSet3);
|
||||
subclassSetMap.put(PlayerClass.Warlock, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.ElementalSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.PhantomSummoner, subclasseSet4);
|
||||
subclassSetMap.put(PlayerClass.Sorceror, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellsinger, subclasseSet5);
|
||||
subclassSetMap.put(PlayerClass.Spellhowler, subclasseSet5);
|
||||
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);
|
||||
}
|
||||
|
||||
private static final Map<CategoryType, Integer> classCloak = new HashMap<>();
|
||||
@@ -119,17 +109,30 @@ public class Raina extends AbstractNpcAI
|
||||
classCloak.put(CategoryType.SIXTH_EOLH_GROUP, 30317); // Laksis Cloak Grade
|
||||
}
|
||||
|
||||
private static final List<PlayerClass> dualClassList = new ArrayList<>();
|
||||
private static final Map<CategoryType, Integer> powerItem = new HashMap<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.sigelPhoenixKnight, PlayerClass.sigelHellKnight, PlayerClass.sigelEvasTemplar, PlayerClass.sigelShilenTemplar));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.tyrrDuelist, PlayerClass.tyrrDreadnought, PlayerClass.tyrrTitan, PlayerClass.tyrrGrandKhavatari, PlayerClass.tyrrDoombringer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.othellAdventurer, PlayerClass.othellWindRider, PlayerClass.othellGhostHunter, PlayerClass.othellFortuneSeeker));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.yulSagittarius, PlayerClass.yulMoonlightSentinel, PlayerClass.yulGhostSentinel, PlayerClass.yulTrickster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.feohArchmage, PlayerClass.feohSoultaker, PlayerClass.feohMysticMuse, PlayerClass.feoStormScreamer, PlayerClass.feohSoulHound));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.issHierophant, PlayerClass.issSwordMuse, PlayerClass.issSpectralDancer, PlayerClass.issDoomcryer));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.wynnArcanaLord, PlayerClass.wynnElementalMaster, PlayerClass.wynnSpectralMaster));
|
||||
dualClassList.addAll(Arrays.asList(PlayerClass.aeoreCardinal, PlayerClass.aeoreEvaSaint, PlayerClass.aeoreShillienSaint));
|
||||
powerItem.put(CategoryType.SIXTH_SIGEL_GROUP, 32264); // Abelius Power
|
||||
powerItem.put(CategoryType.SIXTH_TIR_GROUP, 32265); // Sapyros Power
|
||||
powerItem.put(CategoryType.SIXTH_OTHEL_GROUP, 32266); // Ashagen Power
|
||||
powerItem.put(CategoryType.SIXTH_YR_GROUP, 32267); // Cranigg Power
|
||||
powerItem.put(CategoryType.SIXTH_FEOH_GROUP, 32268); // Soltkreig Power
|
||||
powerItem.put(CategoryType.SIXTH_WYNN_GROUP, 32269); // Naviarope Power
|
||||
powerItem.put(CategoryType.SIXTH_IS_GROUP, 32270); // Leister Power
|
||||
powerItem.put(CategoryType.SIXTH_EOLH_GROUP, 32271); // Laksis Power
|
||||
}
|
||||
|
||||
private static final List<ClassId> dualClassList = new ArrayList<>();
|
||||
static
|
||||
{
|
||||
dualClassList.addAll(Arrays.asList(ClassId.SIGEL_PHOENIX_KNIGHT, ClassId.SIGEL_HELL_KNIGHT, ClassId.SIGEL_EVA_TEMPLAR, ClassId.SIGEL_SHILLIEN_TEMPLAR));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.TYRR_DUELIST, ClassId.TYRR_DREADNOUGHT, ClassId.TYRR_TITAN, ClassId.TYRR_GRAND_KHAVATARI, ClassId.TYRR_DOOMBRINGER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.OTHELL_ADVENTURER, ClassId.OTHELL_WIND_RIDER, ClassId.OTHELL_GHOST_HUNTER, ClassId.OTHELL_FORTUNE_SEEKER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.YUL_SAGITTARIUS, ClassId.YUL_MOONLIGHT_SENTINEL, ClassId.YUL_GHOST_SENTINEL, ClassId.YUL_TRICKSTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.FEOH_ARCHMAGE, ClassId.FEOH_SOULTAKER, ClassId.FEOH_MYSTIC_MUSE, ClassId.FEOH_STORM_SCREAMER, ClassId.FEOH_SOUL_HOUND));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.ISS_HIEROPHANT, ClassId.ISS_SWORD_MUSE, ClassId.ISS_SPECTRAL_DANCER, ClassId.ISS_DOOMCRYER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.WYNN_ARCANA_LORD, ClassId.WYNN_ELEMENTAL_MASTER, ClassId.WYNN_SPECTRAL_MASTER));
|
||||
dualClassList.addAll(Arrays.asList(ClassId.AEORE_CARDINAL, ClassId.AEORE_EVA_SAINT, ClassId.AEORE_SHILLIEN_SAINT));
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
@@ -190,7 +193,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
else
|
||||
{
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassList.html");
|
||||
|
||||
@@ -199,11 +202,11 @@ public class Raina extends AbstractNpcAI
|
||||
break;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"0\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -324,11 +327,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addDualClassErtheiaList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=6&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -345,7 +348,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || (player.getLevel() < 85) || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -373,7 +376,7 @@ public class Raina extends AbstractNpcAI
|
||||
{
|
||||
htmltext = "noSummon.html";
|
||||
}
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
|
||||
else if (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass())
|
||||
{
|
||||
htmltext = "reawakenNoDual.html";
|
||||
}
|
||||
@@ -409,11 +412,11 @@ public class Raina extends AbstractNpcAI
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenClassList.html");
|
||||
|
||||
for (PlayerClass dualClasses : getDualClasses(player, cType))
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.ordinal()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.ordinal() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=5&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
@@ -513,7 +516,7 @@ public class Raina extends AbstractNpcAI
|
||||
case 2: // Remove (change) subclass list
|
||||
{
|
||||
final int subclassIndex = event.getReply();
|
||||
final Set<PlayerClass> availSubs = getAvailableSubClasses(player);
|
||||
final Set<ClassId> availSubs = getAvailableSubClasses(player);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "removeSubclassList.html");
|
||||
|
||||
@@ -522,11 +525,11 @@ public class Raina extends AbstractNpcAI
|
||||
return;
|
||||
}
|
||||
|
||||
for (PlayerClass subClass : availSubs)
|
||||
for (ClassId subClass : availSubs)
|
||||
{
|
||||
if (subClass != null)
|
||||
{
|
||||
final int classId = subClass.ordinal();
|
||||
final int classId = subClass.getId();
|
||||
final int npcStringId = 11170000 + classId;
|
||||
sb.append("<fstring p1=\"3\" p2=\"" + classId + "\">" + npcStringId + "</fstring>");
|
||||
}
|
||||
@@ -578,13 +581,13 @@ public class Raina extends AbstractNpcAI
|
||||
case 5: // Reawaken (change dual class)
|
||||
{
|
||||
final int classId = event.getReply();
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal())))
|
||||
if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || !player.isAwakenedClass()))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -614,9 +617,9 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getCloakId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -639,7 +642,7 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -653,68 +656,34 @@ public class Raina extends AbstractNpcAI
|
||||
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
addPowerItem(player);
|
||||
takeItems(player, CHAOS_POMANDER_DUAL_CLASS, -1);
|
||||
giveItems(player, CHAOS_POMANDER_DUAL_CLASS, 2);
|
||||
giveItems(player, getPowerItemId(player), 1);
|
||||
takeItems(player, CHAOS_POMANDER, -1);
|
||||
giveItems(player, CHAOS_POMANDER, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addPowerItem(PlayerInstance player)
|
||||
{
|
||||
int itemId = ABELIUS_POWER; // Sigel
|
||||
if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
itemId = SAPYROS_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
itemId = ASHAGEN_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
itemId = CRANIGG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
itemId = SOLTKREIG_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
itemId = NAVIAROPE_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
itemId = LEISTER_POWER;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
itemId = LAKCIS_POWER;
|
||||
}
|
||||
giveItems(player, itemId, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns list of available subclasses Base class and already used subclasses removed
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private Set<PlayerClass> getAvailableSubClasses(PlayerInstance player)
|
||||
private Set<ClassId> getAvailableSubClasses(PlayerInstance player)
|
||||
{
|
||||
final int currentBaseId = player.getBaseClass();
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
final int baseClassId = (baseCID.level() > 2) ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs != null) && !availSubs.isEmpty())
|
||||
{
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
// scan for already used subclasses
|
||||
final int availClassId = pclass.ordinal();
|
||||
final int availClassId = pclass.getId();
|
||||
final ClassId cid = ClassId.getClassId(availClassId);
|
||||
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
@@ -723,7 +692,7 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
if (subId.equalsOrChildOf(cid))
|
||||
{
|
||||
availSubs.remove(pclass);
|
||||
availSubs.remove(cid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -747,11 +716,11 @@ public class Raina extends AbstractNpcAI
|
||||
*/
|
||||
private boolean isValidNewSubClass(PlayerInstance player, int classId)
|
||||
{
|
||||
final ClassId cid = ClassId.values()[classId];
|
||||
final ClassId cid = ClassId.getClassId(classId);
|
||||
ClassId subClassId;
|
||||
for (SubClass subList : player.getSubClasses().values())
|
||||
{
|
||||
subClassId = ClassId.values()[subList.getClassId()];
|
||||
subClassId = ClassId.getClassId(subList.getClassId());
|
||||
|
||||
if (subClassId.equalsOrChildOf(cid))
|
||||
{
|
||||
@@ -764,8 +733,8 @@ public class Raina extends AbstractNpcAI
|
||||
final ClassId baseCID = ClassId.getClassId(currentBaseId);
|
||||
|
||||
// we need 2nd occupation ID
|
||||
final int baseClassId = baseCID.level() > 2 ? baseCID.getParent().ordinal() : currentBaseId;
|
||||
final Set<PlayerClass> availSubs = getSubclasses(player, baseClassId);
|
||||
final int baseClassId = (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.FIFTH_CLASS_GROUP, baseCID.getId()) || CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, baseCID.getId())) ? baseCID.getParent().getId() : currentBaseId;
|
||||
final Set<ClassId> availSubs = getSubclasses(player, baseClassId);
|
||||
|
||||
if ((availSubs == null) || availSubs.isEmpty())
|
||||
{
|
||||
@@ -773,9 +742,9 @@ public class Raina extends AbstractNpcAI
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (PlayerClass pclass : availSubs)
|
||||
for (ClassId pclass : availSubs)
|
||||
{
|
||||
if (pclass.ordinal() == classId)
|
||||
if (pclass.getId() == classId)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
@@ -798,29 +767,29 @@ public class Raina extends AbstractNpcAI
|
||||
return leveled;
|
||||
}
|
||||
|
||||
public List<PlayerClass> getAvailableDualclasses(PlayerInstance player)
|
||||
public List<ClassId> getAvailableDualclasses(PlayerInstance player)
|
||||
{
|
||||
final List<PlayerClass> dualClasses = new ArrayList<>();
|
||||
final List<ClassId> dualClasses = new ArrayList<>();
|
||||
|
||||
for (PlayerClass playerClass : PlayerClass.values())
|
||||
for (ClassId ClassId : ClassId.values())
|
||||
{
|
||||
if (!playerClass.isOfRace(Race.ERTHEIA) && playerClass.isOfLevel(ClassLevel.AWAKEN) && (playerClass.ordinal() != player.getClassId().getId()))
|
||||
if ((ClassId.getRace() != Race.ERTHEIA) && CategoryData.getInstance().isInCategory(CategoryType.SIXTH_CLASS_GROUP, ClassId.getId()) && (ClassId.getId() != player.getClassId().getId()))
|
||||
{
|
||||
dualClasses.add(playerClass);
|
||||
dualClasses.add(ClassId);
|
||||
}
|
||||
}
|
||||
return dualClasses;
|
||||
}
|
||||
|
||||
private List<PlayerClass> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
private List<ClassId> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
{
|
||||
final List<PlayerClass> tempList = new ArrayList<>();
|
||||
final List<ClassId> tempList = new ArrayList<>();
|
||||
final int baseClassId = player.getBaseClass();
|
||||
final int dualClassId = player.getClassId().getId();
|
||||
|
||||
for (PlayerClass temp : dualClassList)
|
||||
for (ClassId temp : dualClassList)
|
||||
{
|
||||
if ((temp.ordinal() != baseClassId) && (temp.ordinal() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.ordinal())))
|
||||
if ((temp.getId() != baseClassId) && (temp.getId() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.getId())))
|
||||
{
|
||||
tempList.add(temp);
|
||||
}
|
||||
@@ -828,40 +797,43 @@ public class Raina extends AbstractNpcAI
|
||||
return tempList;
|
||||
}
|
||||
|
||||
public Set<PlayerClass> getSubclasses(PlayerInstance player, int classId)
|
||||
public final Set<ClassId> getSubclasses(PlayerInstance player, int classId)
|
||||
{
|
||||
Set<PlayerClass> subclasses = null;
|
||||
final PlayerClass pClass = PlayerClass.values()[classId];
|
||||
Set<ClassId> subclasses = null;
|
||||
final ClassId pClass = ClassId.getClassId(classId);
|
||||
|
||||
if ((pClass.getLevel() == THIRD) || (pClass.getLevel() == ClassLevel.FOURTH))
|
||||
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, classId) || (CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, classId)))
|
||||
{
|
||||
subclasses = EnumSet.copyOf(mainSubclassSet);
|
||||
subclasses.remove(pClass);
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.ERTHEIA, THIRD));
|
||||
|
||||
// Ertheia classes cannot be subclassed and only Kamael can take Kamael classes as subclasses.
|
||||
for (ClassId cid : ClassId.values())
|
||||
{
|
||||
if ((cid.getRace() == Race.ERTHEIA) || ((cid.getRace() == Race.KAMAEL) && (player.getRace() != Race.KAMAEL)))
|
||||
{
|
||||
subclasses.remove(cid);
|
||||
}
|
||||
}
|
||||
|
||||
if (player.getRace() == Race.KAMAEL)
|
||||
{
|
||||
if (player.getAppearance().isFemale())
|
||||
{
|
||||
subclasses.remove(PlayerClass.femaleSoulbreaker);
|
||||
subclasses.remove(ClassId.MALE_SOULBREAKER);
|
||||
}
|
||||
else
|
||||
{
|
||||
subclasses.remove(PlayerClass.maleSoulbreaker);
|
||||
subclasses.remove(ClassId.FEMALE_SOULBREAKER);
|
||||
}
|
||||
|
||||
if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
|
||||
{
|
||||
subclasses.remove(PlayerClass.inspector);
|
||||
subclasses.remove(ClassId.INSPECTOR);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only Kamael can take Kamael classes as subclasses.
|
||||
subclasses.removeAll(PlayerClass.getSet(Race.KAMAEL, THIRD));
|
||||
}
|
||||
|
||||
final Set<PlayerClass> unavailableClasses = subclassSetMap.get(pClass);
|
||||
Set<ClassId> unavailableClasses = subclassSetMap.get(pClass);
|
||||
|
||||
if (unavailableClasses != null)
|
||||
{
|
||||
@@ -872,9 +844,9 @@ public class Raina extends AbstractNpcAI
|
||||
if (subclasses != null)
|
||||
{
|
||||
final ClassId currClassId = ClassId.getClassId(player.getClassId().getId());
|
||||
for (PlayerClass tempClass : subclasses)
|
||||
for (ClassId tempClass : subclasses)
|
||||
{
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.ordinal());
|
||||
final ClassId tempClassId = ClassId.getClassId(tempClass.getId());
|
||||
|
||||
if (currClassId.equalsOrChildOf(tempClassId))
|
||||
{
|
||||
@@ -910,41 +882,12 @@ public class Raina extends AbstractNpcAI
|
||||
|
||||
private int getCloakId(PlayerInstance player)
|
||||
{
|
||||
CategoryType catType = null;
|
||||
return classCloak.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
if (player.isInCategory(CategoryType.SIXTH_SIGEL_GROUP))
|
||||
private int getPowerItemId(PlayerInstance player)
|
||||
{
|
||||
catType = CategoryType.SIXTH_SIGEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_TIR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_TIR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_OTHEL_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_OTHEL_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_YR_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_YR_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_FEOH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_FEOH_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_IS_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_IS_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_WYNN_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_WYNN_GROUP;
|
||||
}
|
||||
else if (player.isInCategory(CategoryType.SIXTH_EOLH_GROUP))
|
||||
{
|
||||
catType = CategoryType.SIXTH_EOLH_GROUP;
|
||||
}
|
||||
return classCloak.get(catType);
|
||||
return powerItem.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
|
||||
+5
@@ -9729,6 +9729,11 @@ public class PlayerInstance extends Playable
|
||||
return _classIndex > 0;
|
||||
}
|
||||
|
||||
public boolean isAwakenedClass()
|
||||
{
|
||||
return isInCategory(CategoryType.SIXTH_CLASS_GROUP);
|
||||
}
|
||||
|
||||
public void setDualClass(int classIndex)
|
||||
{
|
||||
if (isSubClassActive())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
-256
@@ -1,256 +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.EnumSet;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
|
||||
/**
|
||||
* @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 Race _race;
|
||||
private ClassLevel _level;
|
||||
private ClassType _type;
|
||||
|
||||
private PlayerClass(Race race, ClassType pType, ClassLevel pLevel)
|
||||
{
|
||||
_race = race;
|
||||
_level = pLevel;
|
||||
_type = pType;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
+3
-1
@@ -18,8 +18,10 @@ package org.l2jmobius.gameserver.model.actor.instance;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.cache.HtmCache;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.ClassListData;
|
||||
import org.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
||||
import org.l2jmobius.gameserver.model.base.ClassId;
|
||||
@@ -404,7 +406,7 @@ public class ClassMasterInstance extends MerchantInstance
|
||||
|
||||
player.broadcastUserInfo();
|
||||
|
||||
if (Config.CLASS_MASTER_SETTINGS.isAllowed(player.getClassId().level() + 1) && Config.ALTERNATE_CLASS_MASTER && (((player.getClassId().level() == 1) && (player.getLevel() >= 40)) || ((player.getClassId().level() == 2) && (player.getLevel() >= 76))))
|
||||
if (Config.CLASS_MASTER_SETTINGS.isAllowed(player.getClassId().level() + 1) && Config.ALTERNATE_CLASS_MASTER && (((player.getClassId().level() == 1) && (player.getLevel() >= 40)) || (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()) && (player.getLevel() >= 76))))
|
||||
{
|
||||
showQuestionMark(player);
|
||||
}
|
||||
|
||||
+3
-3
@@ -65,6 +65,7 @@ import org.l2jmobius.gameserver.data.sql.impl.CharNameTable;
|
||||
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.CategoryData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.ClassListData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.EnchantSkillGroupsData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData;
|
||||
@@ -80,6 +81,7 @@ import org.l2jmobius.gameserver.data.xml.impl.SendMessageLocalisationData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillTreesData;
|
||||
import org.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.HtmlActionScope;
|
||||
import org.l2jmobius.gameserver.enums.IllegalActionPunishmentType;
|
||||
@@ -175,8 +177,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.clan.Clan;
|
||||
import org.l2jmobius.gameserver.model.clan.ClanMember;
|
||||
@@ -2243,7 +2243,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
try
|
||||
{
|
||||
if ((_lvlJoinedAcademy != 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)
|
||||
{
|
||||
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
+7
-6
@@ -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());
|
||||
}
|
||||
}
|
||||
+115
-20
@@ -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;
|
||||
@@ -37,7 +42,6 @@ import org.l2jmobius.gameserver.model.SkillLearn;
|
||||
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;
|
||||
@@ -65,6 +69,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
|
||||
@@ -361,7 +396,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
|
||||
@@ -383,9 +418,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());
|
||||
}
|
||||
@@ -628,9 +663,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)
|
||||
@@ -751,7 +786,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();
|
||||
@@ -761,7 +796,7 @@ public class VillageMasterInstance extends NpcInstance
|
||||
final int baseClassId;
|
||||
if (baseCID.level() > 2)
|
||||
{
|
||||
baseClassId = baseCID.getParent().ordinal();
|
||||
baseClassId = baseCID.getParent().getId();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -774,13 +809,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))
|
||||
@@ -790,7 +825,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;
|
||||
@@ -811,6 +846,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
|
||||
@@ -846,23 +941,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;
|
||||
@@ -871,12 +966,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;
|
||||
}
|
||||
@@ -888,7 +983,7 @@ public class VillageMasterInstance extends NpcInstance
|
||||
*/
|
||||
public boolean checkVillageMaster(int classId)
|
||||
{
|
||||
return checkVillageMaster(PlayerClass.values()[classId]);
|
||||
return checkVillageMaster(ClassId.getClassId(classId));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -896,7 +991,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)
|
||||
{
|
||||
|
||||
+3
-3
@@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
|
||||
import org.l2jmobius.Config;
|
||||
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;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
|
||||
public class VillageMasterKamaelInstance extends VillageMasterInstance
|
||||
@@ -75,13 +75,13 @@ public class VillageMasterKamaelInstance extends VillageMasterInstance
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final boolean checkVillageMasterRace(PlayerClass pclass)
|
||||
protected final boolean checkVillageMasterRace(ClassId pclass)
|
||||
{
|
||||
if (pclass == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return pclass.isOfRace(Race.KAMAEL);
|
||||
return pclass.getRace() == Race.KAMAEL;
|
||||
}
|
||||
}
|
||||
+7
-6
@@ -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());
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
+7
-6
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
|
||||
*/
|
||||
public enum ClassLevel
|
||||
{
|
||||
FIRST,
|
||||
SECOND,
|
||||
THIRD,
|
||||
FOURTH
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -1,341 +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),
|
||||
|
||||
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<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
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user