Fixed restoration of dualclass skills.

This commit is contained in:
MobiusDevelopment
2021-10-20 17:41:51 +00:00
parent ebfc7864ee
commit 0b36e63016
33 changed files with 373 additions and 90 deletions

View File

@@ -217,6 +217,7 @@ public class Joachim extends AbstractNpcAI
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(getNpcHtmlMessage(player, npc, "34513-07.html"));
SkillTreeData.getInstance().cleanSkillUponChangeClass(player);
player.restoreDualSkills();
player.sendPacket(new AcquireSkillList(player));
player.sendSkillList();
player.broadcastUserInfo();

View File

@@ -169,6 +169,7 @@ public class Hardin extends AbstractNpcAI
}
}
}
player.restoreDualSkills();
player.store(false);
player.broadcastUserInfo();
player.sendSkillList();

View File

@@ -594,6 +594,7 @@ public class Raina extends AbstractNpcAI
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(getNpcHtmlMessage(player, npc, "reawakenSuccess.html"));
SkillTreeData.getInstance().cleanSkillUponChangeClass(player);
player.restoreDualSkills();
player.sendPacket(new AcquireSkillList(player));
player.sendSkillList();
giveItems(player, getCloakId(player), 1);
@@ -633,6 +634,7 @@ public class Raina extends AbstractNpcAI
player.sendPacket(SystemMessageId.THE_NEW_SUBCLASS_S1_HAS_BEEN_ADDED_CONGRATS);
player.sendPacket(getNpcHtmlMessage(player, npc, "addSuccess.html"));
SkillTreeData.getInstance().cleanSkillUponChangeClass(player);
player.restoreDualSkills();
player.sendPacket(new AcquireSkillList(player));
player.sendSkillList();
giveItems(player, getPowerItemId(player), 1);

View File

@@ -7390,18 +7390,19 @@ public class PlayerInstance extends Playable
storeSkill(newSkill, oldSkill, -1);
if (CommonUtil.contains(DUAL_CLASS_SKILLS, newSkill.getId()))
{
final List<Skill> dualClassSkills = getVariables().getList(KNOWN_DUAL_SKILLS_VAR, Skill.class, new ArrayList<>());
for (Skill dualSkill : dualClassSkills)
// Old system compatibility.
if (getVariables().getString(KNOWN_DUAL_SKILLS_VAR, "").contains("("))
{
if (dualSkill.getId() == newSkill.getId())
getVariables().set(KNOWN_DUAL_SKILLS_VAR, "");
for (int skillId : DUAL_CLASS_SKILLS)
{
dualClassSkills.remove(dualSkill);
break;
removeSkill(skillId);
}
}
dualClassSkills.add(newSkill);
getVariables().set(KNOWN_DUAL_SKILLS_VAR, dualClassSkills);
final Map<Integer, Integer> knownSkills = getVariables().getIntegerMap(KNOWN_DUAL_SKILLS_VAR);
knownSkills.put(newSkill.getId(), newSkill.getLevel());
getVariables().setIntegerMap(KNOWN_DUAL_SKILLS_VAR, knownSkills);
}
}
return oldSkill;
@@ -7596,11 +7597,35 @@ public class PlayerInstance extends Playable
}
// Learn known dualclass skills.
restoreDualSkills();
}
/**
* Learn known dualclass skills.
*/
public void restoreDualSkills()
{
if (isDualClassActive() || !isSubClassActive())
{
final List<Skill> dualClassSkills = new ArrayList<>(getVariables().getList(KNOWN_DUAL_SKILLS_VAR, Skill.class, Collections.emptyList()));
for (Skill skill : dualClassSkills)
// Old system compatibility.
if (getVariables().getString(KNOWN_DUAL_SKILLS_VAR, "").contains("("))
{
getVariables().set(KNOWN_DUAL_SKILLS_VAR, "");
for (int skillId : DUAL_CLASS_SKILLS)
{
removeSkill(skillId);
}
}
final Map<Integer, Integer> knownSkills = getVariables().getIntegerMap(KNOWN_DUAL_SKILLS_VAR);
if (knownSkills.isEmpty())
{
return;
}
for (Entry<Integer, Integer> entry : knownSkills.entrySet())
{
final Skill skill = SkillData.getInstance().getSkill(entry.getKey(), entry.getValue());
removeSkill(skill);
addSkill(skill, true);
}