-Added getDualClassLevel() for skill learn packet and dual skill that learned if player have needed main & dual class level.

-Update AcquireSkillList packet.
-Added skill Dual Maximum Hp to skill tree for all awaken classes.
-Fixed a bug when changing class skills to learn stay from previous class until relogin.

Contributed by NviX.
This commit is contained in:
MobiusDev
2015-07-24 20:05:28 +00:00
parent 6d92b97a62
commit f483f9bec5
43 changed files with 201 additions and 17 deletions

View File

@ -623,7 +623,7 @@ public final class SkillTreesData implements IXmlReader
final Map<Integer, L2SkillLearn> skills = getCompleteClassSkillTree(classId);
for (L2SkillLearn skill : skills.values())
{
if ((skill.getSkillId() == CommonSkill.DIVINE_INSPIRATION.getId()) || skill.isAutoGet() || skill.isLearnedByFS() || (skill.getGetLevel() > player.getLevel()))
if ((skill.getSkillId() == CommonSkill.DIVINE_INSPIRATION.getId()) || skill.isAutoGet() || skill.isLearnedByFS() || (skill.getGetLevel() > player.getLevel()) || (skill.getDualClassLevel() > player.getDualClassLevel()))
{
continue;
}
@ -690,7 +690,7 @@ public final class SkillTreesData implements IXmlReader
continue;
}
if (player.getLevel() >= skill.getGetLevel())
if ((player.getLevel() >= skill.getGetLevel()) && (player.getDualClassLevel() >= skill.getDualClassLevel()))
{
final Skill oldSkill = holder.getKnownSkill(skill.getSkillId());
if (oldSkill != null)
@ -769,7 +769,7 @@ public final class SkillTreesData implements IXmlReader
final int maxLvl = SkillData.getInstance().getMaxLevel(skill.getSkillId());
final int hashCode = SkillData.getSkillHashCode(skill.getSkillId(), maxLvl);
if (skill.isAutoGet() && (player.getLevel() >= skill.getGetLevel()))
if (skill.isAutoGet() && ((player.getLevel() >= skill.getGetLevel()) && (player.getDualClassLevel() >= skill.getDualClassLevel())))
{
final Skill oldSkill = player.getKnownSkill(skill.getSkillId());
if (oldSkill != null)
@ -805,7 +805,7 @@ public final class SkillTreesData implements IXmlReader
continue;
}
if (skill.isLearnedByNpc() && (player.getLevel() >= skill.getGetLevel()))
if (skill.isLearnedByNpc() && ((player.getLevel() >= skill.getGetLevel()) && (player.getDualClassLevel() >= skill.getDualClassLevel())))
{
final Skill oldSkill = player.getSkills().get(skill.getSkillId());
if (oldSkill != null)
@ -858,7 +858,7 @@ public final class SkillTreesData implements IXmlReader
for (L2SkillLearn skill : _alchemySkillTree.values())
{
if (skill.isLearnedByNpc() && (player.getLevel() >= skill.getGetLevel()))
if (skill.isLearnedByNpc() && ((player.getLevel() >= skill.getGetLevel()) && (player.getDualClassLevel() >= skill.getDualClassLevel())))
{
final Skill oldSkill = player.getSkills().get(skill.getSkillId());
@ -941,7 +941,7 @@ public final class SkillTreesData implements IXmlReader
final Race race = player.getRace();
for (L2SkillLearn skill : _transformSkillTree.values())
{
if ((player.getLevel() >= skill.getGetLevel()) && (skill.getRaces().isEmpty() || skill.getRaces().contains(race)))
if (((player.getLevel() >= skill.getGetLevel()) && (player.getDualClassLevel() >= skill.getDualClassLevel())) && (skill.getRaces().isEmpty() || skill.getRaces().contains(race)))
{
final Skill oldSkill = player.getSkills().get(skill.getSkillId());
if (oldSkill != null)
@ -1342,9 +1342,9 @@ public final class SkillTreesData implements IXmlReader
{
for (L2SkillLearn s : skillTree.values())
{
if (player.getLevel() < s.getGetLevel())
if ((player.getLevel() < s.getGetLevel()) || (player.getDualClassLevel() < s.getDualClassLevel()))
{
if ((minLevel == 0) || (minLevel > s.getGetLevel()))
if ((minLevel == 0) || ((minLevel > s.getGetLevel()) && (minLevel > s.getDualClassLevel())))
{
minLevel = s.getGetLevel();
}
@ -1372,7 +1372,7 @@ public final class SkillTreesData implements IXmlReader
{
continue;
}
if (minLevelForNewSkill <= skill.getGetLevel())
if ((minLevelForNewSkill <= skill.getGetLevel()) && (minLevelForNewSkill <= skill.getDualClassLevel()))
{
final Skill oldSkill = player.getKnownSkill(skill.getSkillId());
if (oldSkill != null)

View File

@ -39,6 +39,7 @@ public final class L2SkillLearn
private final int _skillId;
private final int _skillLvl;
private final int _getLevel;
private final int _getDualClassLevel;
private final boolean _autoGet;
private final int _levelUpSp;
private final List<ItemHolder> _requiredItems = new ArrayList<>();
@ -61,6 +62,7 @@ public final class L2SkillLearn
_skillId = set.getInt("skillId");
_skillLvl = set.getInt("skillLvl");
_getLevel = set.getInt("getLevel");
_getDualClassLevel = set.getInt("getDualClassLevel", 0);
_autoGet = set.getBoolean("autoGet", false);
_levelUpSp = set.getInt("levelUpSp", 0);
_residenceSkill = set.getBoolean("residenceSkill", false);
@ -100,6 +102,14 @@ public final class L2SkillLearn
return _getLevel;
}
/**
* @return the minimum dual class level required to acquire this skill.
*/
public int getDualClassLevel()
{
return _getDualClassLevel;
}
/**
* @return the amount of SP/Clan Reputation to acquire this skill.
*/

View File

@ -1204,6 +1204,24 @@ public final class L2PcInstance extends L2Playable
return getStat().getLevel();
}
/**
* @return dual class level
**/
public final int getDualClassLevel()
{
if (hasDualClass())
{
for (SubClass subClass : getSubClasses().values())
{
if (subClass.isDualClass())
{
return subClass.getLevel();
}
}
}
return 0;
}
@Override
public double getLevelMod()
{

View File

@ -54,7 +54,7 @@ public class AcquireSkillList extends L2GameServerPacket
writeH(skill.getSkillLevel());
writeQ(skill.getLevelUpSp());
writeC(skill.getGetLevel());
writeC(0x00); // Dual Class Level Required
writeC(skill.getDualClassLevel());
writeC(skill.getRequiredItems().size());
for (ItemHolder item : skill.getRequiredItems())
{