Auto remove, skilltree and AcquireSkillList fixes.

Contributed by rocknowx.
This commit is contained in:
MobiusDev
2015-11-10 08:52:13 +00:00
parent 4c37092c3a
commit c4988df6a0
39 changed files with 76 additions and 43 deletions

View File

@ -653,6 +653,11 @@ public final class SkillTreesData implements IXmlReader
return getAvailableSkills(player, classId, includeByFs, includeAutoGet, player);
}
public List<L2SkillLearn> getAvailableSkillsList(L2PcInstance player, ClassId classId, boolean includeByFs, boolean includeAutoGet)
{
return getAvailableSkillsList(player, classId, includeByFs, includeAutoGet, player);
}
/**
* Gets the available skills.
* @param player the learning skill player
@ -715,6 +720,56 @@ public final class SkillTreesData implements IXmlReader
return result;
}
private List<L2SkillLearn> getAvailableSkillsList(L2PcInstance player, ClassId classId, boolean includeByFs, boolean includeAutoGet, ISkillsHolder holder)
{
final List<L2SkillLearn> result = new LinkedList<>();
final Map<Integer, L2SkillLearn> skills = getCompleteClassSkillTree(classId);
if (skills.isEmpty())
{
// The Skill Tree for this class is undefined.
LOGGER.warning(getClass().getSimpleName() + ": Skilltree for class " + classId + " is not defined!");
return result;
}
final boolean isAwaken = player.isInCategory(CategoryType.AWAKEN_GROUP);
for (Entry<Integer, L2SkillLearn> entry : skills.entrySet())
{
final L2SkillLearn skill = entry.getValue();
// Skill level doesn't exist.
if (SkillData.getInstance().getMaxLevel(skill.getSkillId()) < skill.getSkillLevel())
{
continue;
}
if (((skill.getSkillId() == CommonSkill.DIVINE_INSPIRATION.getId()) && (!Config.AUTO_LEARN_DIVINE_INSPIRATION && includeAutoGet) && !player.isGM()) || (!includeAutoGet && skill.isAutoGet()) || (!includeByFs && skill.isLearnedByFS()) || isRemoveSkill(classId, skill.getSkillId()))
{
continue;
}
if (isAwaken && !isCurrentClassSkillNoParent(classId, entry.getKey()))
{
continue;
}
final Skill oldSkill = holder.getKnownSkill(skill.getSkillId());
if (oldSkill != null)
{
if (oldSkill.getLevel() == (skill.getSkillLevel() - 1))
{
result.add(skill);
}
}
else if (skill.getSkillLevel() == 1)
{
result.add(skill);
}
}
return result;
}
public Collection<Skill> getAllAvailableSkills(L2PcInstance player, ClassId classId, boolean includeByFs, boolean includeAutoGet)
{
// Get available skills
@ -1463,11 +1518,20 @@ public final class SkillTreesData implements IXmlReader
for (Skill skill : player.getAllSkills())
{
final int maxLvl = SkillData.getInstance().getMaxLevel(skill.getId());
final int Lvl_cur = skill.getLevel();
final int hashCode = SkillData.getSkillHashCode(skill.getId(), maxLvl);
final int hash_cur = SkillData.getSkillHashCode(skill.getId(), Lvl_cur); // must in parent class
final int hash_curx = SkillData.getSkillHashCode(skill.getId(), Lvl_cur + 1); // some skill not update maxlvl in stats
if (!isCurrentClassSkillNoParent(player.getClassId(), hashCode) && !isRemoveSkill(player.getClassId(), skill.getId()))
final int _classlv = player.getClassId().level();
ClassId _classId = player.getClassId();
for (int i = 0; i < _classlv; i++)
{
player.removeSkill(skill, true, true);
_classId = _classId.getParent();
if (isCurrentClassSkillNoParent(_classId, hash_cur) && (!isCurrentClassSkillNoParent(player.getClassId(), hashCode) && !isCurrentClassSkillNoParent(player.getClassId(), hash_curx)) && !isRemoveSkill(player.getClassId(), skill.getId()))
{
player.removeSkill(skill, true, true);
}
}
}
}

View File

@ -2657,7 +2657,7 @@ public final class L2PcInstance extends L2Playable
// Remove skills if required.
for (Skill sk : getSkills().values())
{
final L2SkillLearn s = SkillTreesData.getInstance().getSkillLearn(sk.getId(), sk.getLevel(), this);
final L2SkillLearn s = SkillTreesData.getInstance().getSkillLearn(sk.getId(), 1, this);
if ((s != null) && !s.getRemoveSkills().isEmpty())
{
s.getRemoveSkills().forEach(skillId ->

View File

@ -40,8 +40,7 @@ public class AcquireSkillList extends L2GameServerPacket
public AcquireSkillList(L2PcInstance activeChar)
{
_activeChar = activeChar;
_learnable = SkillTreesData.getInstance().getAvailableSkills(activeChar, activeChar.getClassId(), false, false);
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(activeChar, activeChar.getClassId(), false, false));
_learnable = SkillTreesData.getInstance().getAvailableSkillsList(activeChar, activeChar.getClassId(), false, false);
}
@Override