Sync with L2JServer Feb 3rd 2015.

This commit is contained in:
mobius
2015-02-03 21:11:57 +00:00
parent 9cf1a6d6e5
commit fe25f74122
169 changed files with 3379 additions and 5414 deletions

View File

@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
@@ -42,13 +43,11 @@ import com.l2jserver.gameserver.enums.Race;
import com.l2jserver.gameserver.enums.SubclassType;
import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.L2SkillLearn;
import com.l2jserver.gameserver.model.L2SkillLearn.SubClassData;
import com.l2jserver.gameserver.model.StatsSet;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.base.AcquireSkillType;
import com.l2jserver.gameserver.model.base.ClassId;
import com.l2jserver.gameserver.model.base.SocialClass;
import com.l2jserver.gameserver.model.base.SubClass;
import com.l2jserver.gameserver.model.holders.ItemHolder;
import com.l2jserver.gameserver.model.holders.PlayerSkillHolder;
import com.l2jserver.gameserver.model.holders.SkillHolder;
@@ -95,6 +94,7 @@ public final class SkillTreesData implements IXmlReader
private static final Map<Integer, L2SkillLearn> _subClassChangeSkillTree = new HashMap<>();
private static final Map<Integer, L2SkillLearn> _abilitySkillTree = new HashMap<>();
private static final Map<Integer, L2SkillLearn> _alchemySkillTree = new HashMap<>();
private static final Map<Integer, L2SkillLearn> _dualClassSkillTree = new HashMap<>();
// Other skill trees
private static final Map<Integer, L2SkillLearn> _nobleSkillTree = new HashMap<>();
private static final Map<Integer, L2SkillLearn> _heroSkillTree = new HashMap<>();
@@ -142,6 +142,7 @@ public final class SkillTreesData implements IXmlReader
_gameMasterAuraSkillTree.clear();
_raceSkillTree.clear();
_revelationSkillTree.clear();
_dualClassSkillTree.clear();
// Load files.
parseDatapackDirectory("data/skillTrees/", false);
@@ -249,9 +250,6 @@ public final class SkillTreesData implements IXmlReader
case "socialClass":
skillLearn.setSocialClass(Enum.valueOf(SocialClass.class, b.getTextContent()));
break;
case "subClassConditions":
skillLearn.addSubclassConditions(parseInteger(attrs, "slot"), parseInteger(attrs, "lvl"));
break;
case "removeSkill":
final int removeSkillId = parseInteger(attrs, "id");
skillLearn.addRemoveSkills(removeSkillId);
@@ -355,6 +353,11 @@ public final class SkillTreesData implements IXmlReader
_subClassChangeSkillTree.put(skillHashCode, skillLearn);
break;
}
case "dualClassSkillTree":
{
_dualClassSkillTree.put(skillHashCode, skillLearn);
break;
}
default:
{
LOGGER.warning(getClass().getSimpleName() + ": Unknown Skill Tree type: " + type + "!");
@@ -729,13 +732,17 @@ public final class SkillTreesData implements IXmlReader
}
final Race race = player.getRace();
final boolean isAwaken = player.isInCategory(CategoryType.AWAKEN_GROUP);
// Race skills
for (L2SkillLearn skill : getRaceSkillTree(race))
if (isAwaken)
{
if (player.getKnownSkill(skill.getSkillId()) == null)
for (L2SkillLearn skill : getRaceSkillTree(race))
{
result.add(skill);
if (player.getKnownSkill(skill.getSkillId()) == null)
{
result.add(skill);
}
}
}
@@ -746,9 +753,12 @@ public final class SkillTreesData implements IXmlReader
continue;
}
final int maxLvl = SkillData.getInstance().getMaxLevel(skill.getSkillId());
final int hashCode = SkillData.getSkillHashCode(skill.getSkillId(), maxLvl);
if (skill.isAutoGet() && (player.getLevel() >= skill.getGetLevel()))
{
final Skill oldSkill = player.getSkills().get(skill.getSkillId());
final Skill oldSkill = player.getKnownSkill(skill.getSkillId());
if (oldSkill != null)
{
if (oldSkill.getLevel() < skill.getSkillLevel())
@@ -756,7 +766,7 @@ public final class SkillTreesData implements IXmlReader
result.add(skill);
}
}
else
else if (!isAwaken || SkillTreesData.getInstance().isCurrentClassSkillNoParent(player.getClassId(), hashCode))
{
result.add(skill);
}
@@ -1033,33 +1043,35 @@ public final class SkillTreesData implements IXmlReader
final List<L2SkillLearn> result = new ArrayList<>();
for (L2SkillLearn skill : _subClassSkillTree.values())
{
if (player.getLevel() >= skill.getGetLevel())
final Skill oldSkill = player.getSkills().get(skill.getSkillId());
if (((oldSkill == null) && (skill.getSkillLevel() == 1)) || ((oldSkill != null) && (oldSkill.getLevel() == (skill.getSkillLevel() - 1))))
{
List<SubClassData> subClassConds = null;
for (SubClass subClass : player.getSubClasses().values())
{
subClassConds = skill.getSubClassConditions();
if (!subClassConds.isEmpty() && (subClass.getClassIndex() <= subClassConds.size()) && (subClass.getClassIndex() == subClassConds.get(subClass.getClassIndex() - 1).getSlot()) && (subClassConds.get(subClass.getClassIndex() - 1).getLvl() <= subClass.getLevel()))
{
final Skill oldSkill = player.getSkills().get(skill.getSkillId());
if (oldSkill != null)
{
if (oldSkill.getLevel() == (skill.getSkillLevel() - 1))
{
result.add(skill);
}
}
else if (skill.getSkillLevel() == 1)
{
result.add(skill);
}
}
}
result.add(skill);
}
}
return result;
}
/**
* Gets the available dual class skills.
* @param player the dual-class skill learning player
* @return all the available Dual-Class skills for a given {@code player} sorted by skill ID
*/
public List<L2SkillLearn> getAvailableDualClassSkills(L2PcInstance player)
{
final List<L2SkillLearn> result = new ArrayList<>();
for (L2SkillLearn skill : _dualClassSkillTree.values())
{
final Skill oldSkill = player.getSkills().get(skill.getSkillId());
if (((oldSkill == null) && (skill.getSkillLevel() == 1)) || ((oldSkill != null) && (oldSkill.getLevel() == (skill.getSkillLevel() - 1))))
{
result.add(skill);
}
}
result.sort(Comparator.comparing(L2SkillLearn::getSkillId));
return result;
}
/**
* Gets the available residential skills.
* @param residenceId the id of the Castle, Fort, Territory
@@ -1124,6 +1136,9 @@ public final class SkillTreesData implements IXmlReader
case ALCHEMY:
sl = getAlchemySkill(id, lvl);
break;
case DUALCLASS:
sl = getDualClassSkill(id, lvl);
break;
}
return sl;
}
@@ -1252,6 +1267,17 @@ public final class SkillTreesData implements IXmlReader
return _subClassSkillTree.get(SkillData.getSkillHashCode(id, lvl));
}
/**
* Gets the dual class skill.
* @param id the dual-class skill Id
* @param lvl the dual-class skill level
* @return the dual-class skill from the Dual-Class Skill Tree for a given {@code id} and {@code lvl}
*/
public L2SkillLearn getDualClassSkill(int id, int lvl)
{
return _dualClassSkillTree.get(SkillData.getSkillHashCode(id, lvl));
}
/**
* Gets the common skill.
* @param id the common skill Id.
@@ -1678,6 +1704,7 @@ public final class SkillTreesData implements IXmlReader
final String className = getClass().getSimpleName();
LOGGER.info(className + ": Loaded " + classSkillTreeCount + " Class Skills for " + _classSkillTrees.size() + " Class Skill Trees.");
LOGGER.info(className + ": Loaded " + _subClassSkillTree.size() + " Sub-Class Skills.");
LOGGER.info(className + ": Loaded " + _dualClassSkillTree.size() + " Dual-Class Skills.");
LOGGER.info(className + ": Loaded " + transferSkillTreeCount + " Transfer Skills for " + _transferSkillTrees.size() + " Transfer Skill Trees.");
LOGGER.info(className + ": Loaded " + raceSkillTreeCount + " Race skills for " + _raceSkillTree.size() + " Race Skill Trees.");
LOGGER.info(className + ": Loaded " + _fishingSkillTree.size() + " Fishing Skills, " + dwarvenOnlyFishingSkillCount + " Dwarven only Fishing Skills.");