-Added enchant9 route support for skills.
-Deleted unused client packets RequestExEnchantSkillSafe, RequestExEnchantSkillUntrain and RequestExEnchantSkillRouteChange (this is removed in Lindvior and all enchant variants are now handled in the packet RequestExEnchantSkill). -Added support for 100% enchant by using Immortal Scroll. -Enchant skills for awakened players required new spellbook (Superior Giant's Codexes). Contributed by NviX.
This commit is contained in:
@ -44,10 +44,15 @@ public class EnchantSkillGroupsData implements IXmlReader
|
|||||||
public static final int NORMAL_ENCHANT_COST_MULTIPLIER = Config.NORMAL_ENCHANT_COST_MULTIPLIER;
|
public static final int NORMAL_ENCHANT_COST_MULTIPLIER = Config.NORMAL_ENCHANT_COST_MULTIPLIER;
|
||||||
public static final int SAFE_ENCHANT_COST_MULTIPLIER = Config.SAFE_ENCHANT_COST_MULTIPLIER;
|
public static final int SAFE_ENCHANT_COST_MULTIPLIER = Config.SAFE_ENCHANT_COST_MULTIPLIER;
|
||||||
|
|
||||||
public static final int NORMAL_ENCHANT_BOOK = 6622;
|
public static final int NORMAL_ENCHANT_BOOK_OLD = 6622;
|
||||||
public static final int SAFE_ENCHANT_BOOK = 9627;
|
public static final int SAFE_ENCHANT_BOOK_OLD = 9627;
|
||||||
public static final int CHANGE_ENCHANT_BOOK = 9626;
|
public static final int CHANGE_ENCHANT_BOOK_OLD = 9626;
|
||||||
public static final int UNTRAIN_ENCHANT_BOOK = 9625;
|
public static final int UNTRAIN_ENCHANT_BOOK_OLD = 9625;
|
||||||
|
public static final int NORMAL_ENCHANT_BOOK = 30297;
|
||||||
|
public static final int SAFE_ENCHANT_BOOK = 30298;
|
||||||
|
public static final int CHANGE_ENCHANT_BOOK = 30299;
|
||||||
|
public static final int UNTRAIN_ENCHANT_BOOK = 30300;
|
||||||
|
public static final int IMMORTAL_SCROLL = 37044;
|
||||||
|
|
||||||
private final Map<Integer, L2EnchantSkillGroup> _enchantSkillGroups = new HashMap<>();
|
private final Map<Integer, L2EnchantSkillGroup> _enchantSkillGroups = new HashMap<>();
|
||||||
private final Map<Integer, L2EnchantSkillLearn> _enchantSkillTrees = new HashMap<>();
|
private final Map<Integer, L2EnchantSkillLearn> _enchantSkillTrees = new HashMap<>();
|
||||||
|
@ -52,6 +52,7 @@ public class DocumentSkill extends DocumentBase
|
|||||||
public StatsSet[] enchsets6;
|
public StatsSet[] enchsets6;
|
||||||
public StatsSet[] enchsets7;
|
public StatsSet[] enchsets7;
|
||||||
public StatsSet[] enchsets8;
|
public StatsSet[] enchsets8;
|
||||||
|
public StatsSet[] enchsets9;
|
||||||
public int currentLevel;
|
public int currentLevel;
|
||||||
public List<Skill> skills = new ArrayList<>();
|
public List<Skill> skills = new ArrayList<>();
|
||||||
public List<Skill> currentSkills = new ArrayList<>();
|
public List<Skill> currentSkills = new ArrayList<>();
|
||||||
@ -147,6 +148,7 @@ public class DocumentSkill extends DocumentBase
|
|||||||
int enchantLevels6 = 0;
|
int enchantLevels6 = 0;
|
||||||
int enchantLevels7 = 0;
|
int enchantLevels7 = 0;
|
||||||
int enchantLevels8 = 0;
|
int enchantLevels8 = 0;
|
||||||
|
int enchantLevels9 = 0;
|
||||||
int skillId = Integer.parseInt(attrs.getNamedItem("id").getNodeValue());
|
int skillId = Integer.parseInt(attrs.getNamedItem("id").getNodeValue());
|
||||||
String skillName = attrs.getNamedItem("name").getNodeValue();
|
String skillName = attrs.getNamedItem("name").getNodeValue();
|
||||||
String levels = attrs.getNamedItem("levels").getNodeValue();
|
String levels = attrs.getNamedItem("levels").getNodeValue();
|
||||||
@ -183,6 +185,10 @@ public class DocumentSkill extends DocumentBase
|
|||||||
{
|
{
|
||||||
enchantLevels8 = EnchantSkillGroupsData.getInstance().addNewRouteForSkill(skillId, lastLvl, 8, Integer.parseInt(attrs.getNamedItem("enchantGroup8").getNodeValue()));
|
enchantLevels8 = EnchantSkillGroupsData.getInstance().addNewRouteForSkill(skillId, lastLvl, 8, Integer.parseInt(attrs.getNamedItem("enchantGroup8").getNodeValue()));
|
||||||
}
|
}
|
||||||
|
if (attrs.getNamedItem("enchantGroup9") != null)
|
||||||
|
{
|
||||||
|
enchantLevels9 = EnchantSkillGroupsData.getInstance().addNewRouteForSkill(skillId, lastLvl, 9, Integer.parseInt(attrs.getNamedItem("enchantGroup9").getNodeValue()));
|
||||||
|
}
|
||||||
|
|
||||||
_currentSkill.id = skillId;
|
_currentSkill.id = skillId;
|
||||||
_currentSkill.name = skillName;
|
_currentSkill.name = skillName;
|
||||||
@ -195,6 +201,7 @@ public class DocumentSkill extends DocumentBase
|
|||||||
_currentSkill.enchsets6 = new StatsSet[enchantLevels6];
|
_currentSkill.enchsets6 = new StatsSet[enchantLevels6];
|
||||||
_currentSkill.enchsets7 = new StatsSet[enchantLevels7];
|
_currentSkill.enchsets7 = new StatsSet[enchantLevels7];
|
||||||
_currentSkill.enchsets8 = new StatsSet[enchantLevels8];
|
_currentSkill.enchsets8 = new StatsSet[enchantLevels8];
|
||||||
|
_currentSkill.enchsets9 = new StatsSet[enchantLevels9];
|
||||||
|
|
||||||
for (int i = 0; i < lastLvl; i++)
|
for (int i = 0; i < lastLvl; i++)
|
||||||
{
|
{
|
||||||
@ -273,10 +280,8 @@ public class DocumentSkill extends DocumentBase
|
|||||||
{
|
{
|
||||||
_currentSkill.enchsets1[i] = new StatsSet();
|
_currentSkill.enchsets1[i] = new StatsSet();
|
||||||
_currentSkill.enchsets1[i].set("skill_id", _currentSkill.id);
|
_currentSkill.enchsets1[i].set("skill_id", _currentSkill.id);
|
||||||
// currentSkill.enchsets1[i] = currentSkill.sets[currentSkill.sets.length-1];
|
|
||||||
_currentSkill.enchsets1[i].set("level", i + 101);
|
_currentSkill.enchsets1[i].set("level", i + 101);
|
||||||
_currentSkill.enchsets1[i].set("name", _currentSkill.name);
|
_currentSkill.enchsets1[i].set("name", _currentSkill.name);
|
||||||
// currentSkill.enchsets1[i].set("skillType", "NOTDONE");
|
|
||||||
|
|
||||||
for (n = first; n != null; n = n.getNextSibling())
|
for (n = first; n != null; n = n.getNextSibling())
|
||||||
{
|
{
|
||||||
@ -303,11 +308,9 @@ public class DocumentSkill extends DocumentBase
|
|||||||
for (int i = 0; i < enchantLevels2; i++)
|
for (int i = 0; i < enchantLevels2; i++)
|
||||||
{
|
{
|
||||||
_currentSkill.enchsets2[i] = new StatsSet();
|
_currentSkill.enchsets2[i] = new StatsSet();
|
||||||
// currentSkill.enchsets2[i] = currentSkill.sets[currentSkill.sets.length-1];
|
|
||||||
_currentSkill.enchsets2[i].set("skill_id", _currentSkill.id);
|
_currentSkill.enchsets2[i].set("skill_id", _currentSkill.id);
|
||||||
_currentSkill.enchsets2[i].set("level", i + 201);
|
_currentSkill.enchsets2[i].set("level", i + 201);
|
||||||
_currentSkill.enchsets2[i].set("name", _currentSkill.name);
|
_currentSkill.enchsets2[i].set("name", _currentSkill.name);
|
||||||
// currentSkill.enchsets2[i].set("skillType", "NOTDONE");
|
|
||||||
|
|
||||||
for (n = first; n != null; n = n.getNextSibling())
|
for (n = first; n != null; n = n.getNextSibling())
|
||||||
{
|
{
|
||||||
@ -505,6 +508,35 @@ public class DocumentSkill extends DocumentBase
|
|||||||
throw new RuntimeException("Skill id=" + skillId + " number of levels missmatch, " + enchantLevels8 + " levels expected");
|
throw new RuntimeException("Skill id=" + skillId + " number of levels missmatch, " + enchantLevels8 + " levels expected");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < enchantLevels9; i++)
|
||||||
|
{
|
||||||
|
_currentSkill.enchsets9[i] = new StatsSet();
|
||||||
|
_currentSkill.enchsets9[i].set("skill_id", _currentSkill.id);
|
||||||
|
_currentSkill.enchsets9[i].set("level", i + 901);
|
||||||
|
_currentSkill.enchsets9[i].set("name", _currentSkill.name);
|
||||||
|
|
||||||
|
for (n = first; n != null; n = n.getNextSibling())
|
||||||
|
{
|
||||||
|
if ("set".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
parseBeanSet(n, _currentSkill.enchsets9[i], _currentSkill.sets.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (n = first; n != null; n = n.getNextSibling())
|
||||||
|
{
|
||||||
|
if ("enchant9".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
parseBeanSet(n, _currentSkill.enchsets9[i], i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_currentSkill.enchsets9.length != enchantLevels9)
|
||||||
|
{
|
||||||
|
throw new RuntimeException("Skill id=" + skillId + " number of levels missmatch, " + enchantLevels9 + " levels expected");
|
||||||
|
}
|
||||||
|
|
||||||
makeSkills();
|
makeSkills();
|
||||||
for (int i = 0; i < lastLvl; i++)
|
for (int i = 0; i < lastLvl; i++)
|
||||||
{
|
{
|
||||||
@ -1518,6 +1550,126 @@ public class DocumentSkill extends DocumentBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (int i = lastLvl + enchantLevels1 + enchantLevels2 + enchantLevels3 + enchantLevels4 + enchantLevels5 + enchantLevels6 + enchantLevels7 + enchantLevels8; i < (lastLvl + enchantLevels1 + enchantLevels2 + enchantLevels3 + enchantLevels4 + enchantLevels5 + enchantLevels6 + enchantLevels7 + enchantLevels8 + enchantLevels9); i++)
|
||||||
|
{
|
||||||
|
boolean foundCond = false, foundFor = false, foundChannelingEffects = false, foundStartEffects = false, foundPveEffects = false, foundPvpEffects = false, foundEndEffects = false, foundSelfEffects = false;
|
||||||
|
_currentSkill.currentLevel = i - lastLvl - enchantLevels1 - enchantLevels2 - enchantLevels3 - enchantLevels4 - enchantLevels5 - enchantLevels6 - enchantLevels7 - enchantLevels8;
|
||||||
|
for (n = first; n != null; n = n.getNextSibling())
|
||||||
|
{
|
||||||
|
if ("enchant9cond".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
foundCond = true;
|
||||||
|
Condition condition = parseCondition(n.getFirstChild(), _currentSkill.currentSkills.get(i));
|
||||||
|
Node msg = n.getAttributes().getNamedItem("msg");
|
||||||
|
Node msgId = n.getAttributes().getNamedItem("msgId");
|
||||||
|
if ((condition != null) && (msg != null))
|
||||||
|
{
|
||||||
|
condition.setMessage(msg.getNodeValue());
|
||||||
|
}
|
||||||
|
else if ((condition != null) && (msgId != null))
|
||||||
|
{
|
||||||
|
condition.setMessageId(Integer.decode(getValue(msgId.getNodeValue(), null)));
|
||||||
|
Node addName = n.getAttributes().getNamedItem("addName");
|
||||||
|
if ((addName != null) && (Integer.decode(getValue(msgId.getNodeValue(), null)) > 0))
|
||||||
|
{
|
||||||
|
condition.addName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_currentSkill.currentSkills.get(i).attach(condition, false);
|
||||||
|
}
|
||||||
|
else if ("enchant9for".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
foundFor = true;
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i));
|
||||||
|
}
|
||||||
|
else if ("enchant9startEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
foundStartEffects = true;
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.START);
|
||||||
|
}
|
||||||
|
else if ("enchant9channelingEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
foundChannelingEffects = true;
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.CHANNELING);
|
||||||
|
}
|
||||||
|
else if ("enchant9pveEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
foundPveEffects = true;
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.PVE);
|
||||||
|
}
|
||||||
|
else if ("enchant9pvpEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
foundPvpEffects = true;
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.PVP);
|
||||||
|
}
|
||||||
|
else if ("enchant9endEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
foundEndEffects = true;
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.END);
|
||||||
|
}
|
||||||
|
else if ("enchant9selfEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
foundSelfEffects = true;
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.SELF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If none found, the enchanted skill will take effects from maxLvL of norm skill
|
||||||
|
if (!foundCond || !foundFor || !foundChannelingEffects || !foundStartEffects || !foundPveEffects || !foundPvpEffects || !foundEndEffects || !foundSelfEffects)
|
||||||
|
{
|
||||||
|
_currentSkill.currentLevel = lastLvl - 1;
|
||||||
|
for (n = first; n != null; n = n.getNextSibling())
|
||||||
|
{
|
||||||
|
if (!foundCond && "cond".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
Condition condition = parseCondition(n.getFirstChild(), _currentSkill.currentSkills.get(i));
|
||||||
|
Node msg = n.getAttributes().getNamedItem("msg");
|
||||||
|
Node msgId = n.getAttributes().getNamedItem("msgId");
|
||||||
|
if ((condition != null) && (msg != null))
|
||||||
|
{
|
||||||
|
condition.setMessage(msg.getNodeValue());
|
||||||
|
}
|
||||||
|
else if ((condition != null) && (msgId != null))
|
||||||
|
{
|
||||||
|
condition.setMessageId(Integer.decode(getValue(msgId.getNodeValue(), null)));
|
||||||
|
Node addName = n.getAttributes().getNamedItem("addName");
|
||||||
|
if ((addName != null) && (Integer.decode(getValue(msgId.getNodeValue(), null)) > 0))
|
||||||
|
{
|
||||||
|
condition.addName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_currentSkill.currentSkills.get(i).attach(condition, false);
|
||||||
|
}
|
||||||
|
else if (!foundFor && "for".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i));
|
||||||
|
}
|
||||||
|
else if (!foundStartEffects && "startEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.START);
|
||||||
|
}
|
||||||
|
else if (!foundChannelingEffects && "channelingEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.CHANNELING);
|
||||||
|
}
|
||||||
|
else if (!foundPveEffects && "pveEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.PVE);
|
||||||
|
}
|
||||||
|
else if (!foundPvpEffects && "pvpEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.PVP);
|
||||||
|
}
|
||||||
|
else if (!foundEndEffects && "endEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.END);
|
||||||
|
}
|
||||||
|
else if (!foundSelfEffects && "selfEffects".equalsIgnoreCase(n.getNodeName()))
|
||||||
|
{
|
||||||
|
parseTemplate(n, _currentSkill.currentSkills.get(i), EffectScope.SELF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
_currentSkill.skills.addAll(_currentSkill.currentSkills);
|
_currentSkill.skills.addAll(_currentSkill.currentSkills);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1651,5 +1803,19 @@ public class DocumentSkill extends DocumentBase
|
|||||||
_log.log(Level.SEVERE, "Skill id=" + set.getInt("skill_id") + "level" + set.getInt("level"), e);
|
_log.log(Level.SEVERE, "Skill id=" + set.getInt("skill_id") + "level" + set.getInt("level"), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_count = count;
|
||||||
|
for (int i = 0; i < _currentSkill.enchsets9.length; i++)
|
||||||
|
{
|
||||||
|
set = _currentSkill.enchsets9[i];
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_currentSkill.currentSkills.add(_count + i, new Skill(set));
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_log.log(Level.SEVERE, "Skill id=" + set.getInt("skill_id") + "level" + set.getInt("level"), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -48,8 +48,7 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
|
|||||||
private static final String _C__D0_0F_REQUESTEXENCHANTSKILL = "[C] D0:0F RequestExEnchantSkill";
|
private static final String _C__D0_0F_REQUESTEXENCHANTSKILL = "[C] D0:0F RequestExEnchantSkill";
|
||||||
private static final Logger _logEnchant = Logger.getLogger("enchant");
|
private static final Logger _logEnchant = Logger.getLogger("enchant");
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
private int _type; // enchant type: 0 - normal, 1 - safe, 2 - untrain, 3 - change route, 4 - 100%
|
||||||
private int _type; // TODO: Fix this.
|
|
||||||
|
|
||||||
private int _skillId;
|
private int _skillId;
|
||||||
private int _skillLvl;
|
private int _skillLvl;
|
||||||
@ -105,61 +104,411 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
if (_type == 0) // enchant
|
||||||
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
|
||||||
if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl))
|
|
||||||
{
|
{
|
||||||
return;
|
final EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
||||||
|
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||||
|
if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int costMultiplier = EnchantSkillGroupsData.NORMAL_ENCHANT_COST_MULTIPLIER;
|
||||||
|
final int requiredSp = esd.getSpCost() * costMultiplier;
|
||||||
|
if (player.getSp() >= requiredSp)
|
||||||
|
{
|
||||||
|
// only first lvl requires book
|
||||||
|
final boolean usesBook = (_skillLvl % 100) == 1; // 101, 201, 301 ...
|
||||||
|
final int reqItemId;
|
||||||
|
if (player.getClassId().level() == 3)
|
||||||
|
{
|
||||||
|
reqItemId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK_OLD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reqItemId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK;
|
||||||
|
}
|
||||||
|
final L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
||||||
|
|
||||||
|
if (Config.ES_SP_BOOK_NEEDED && usesBook && (spb == null))
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int requiredAdena = (esd.getAdenaCost() * costMultiplier);
|
||||||
|
if (player.getInventory().getAdena() < requiredAdena)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean check = player.getStat().removeExpAndSp(0, requiredSp, false);
|
||||||
|
if (Config.ES_SP_BOOK_NEEDED && usesBook)
|
||||||
|
{
|
||||||
|
check &= player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
check &= player.destroyItemByItemId("Consume", Inventory.ADENA_ID, requiredAdena, player, true);
|
||||||
|
if (!check)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ok. Destroy ONE copy of the book
|
||||||
|
final int rate = esd.getRate(player);
|
||||||
|
if (Rnd.get(100) <= rate)
|
||||||
|
{
|
||||||
|
if (Config.LOG_SKILL_ENCHANTS)
|
||||||
|
{
|
||||||
|
final LogRecord record = new LogRecord(Level.INFO, "Success");
|
||||||
|
record.setParameters(new Object[]
|
||||||
|
{
|
||||||
|
player,
|
||||||
|
skill,
|
||||||
|
spb,
|
||||||
|
rate
|
||||||
|
});
|
||||||
|
record.setLoggerName("skill");
|
||||||
|
_logEnchant.log(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
player.addSkill(skill, true);
|
||||||
|
player.sendPacket(ExEnchantSkillResult.valueOf(true));
|
||||||
|
|
||||||
|
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_ENCHANT_WAS_SUCCESSFUL_S1_HAS_BEEN_ENCHANTED);
|
||||||
|
sm.addSkillName(_skillId);
|
||||||
|
player.sendPacket(sm);
|
||||||
|
|
||||||
|
if (Config.DEBUG)
|
||||||
|
{
|
||||||
|
_log.fine("Learned skill ID: " + _skillId + " Level: " + _skillLvl + " for " + requiredSp + " SP, " + requiredAdena + " Adena.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player.addSkill(SkillData.getInstance().getSkill(_skillId, s.getBaseLevel()), true);
|
||||||
|
player.sendPacket(SystemMessageId.SKILL_ENCHANT_FAILED_THE_SKILL_WILL_BE_INITIALIZED);
|
||||||
|
player.sendPacket(ExEnchantSkillResult.valueOf(false));
|
||||||
|
|
||||||
|
if (Config.LOG_SKILL_ENCHANTS)
|
||||||
|
{
|
||||||
|
final LogRecord record = new LogRecord(Level.INFO, "Fail");
|
||||||
|
record.setParameters(new Object[]
|
||||||
|
{
|
||||||
|
player,
|
||||||
|
skill,
|
||||||
|
spb,
|
||||||
|
rate
|
||||||
|
});
|
||||||
|
record.setLoggerName("skill");
|
||||||
|
_logEnchant.log(record);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
player.sendPacket(new UserInfo(player));
|
||||||
|
player.sendSkillList();
|
||||||
|
final int afterEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||||
|
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterEnchantSkillLevel));
|
||||||
|
player.sendPacket(new ExEnchantSkillInfoDetail(0, _skillId, afterEnchantSkillLevel + 1, player));
|
||||||
|
player.updateShortCuts(_skillId, afterEnchantSkillLevel);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else if (_type == 1) // safe enchant
|
||||||
final int costMultiplier = EnchantSkillGroupsData.NORMAL_ENCHANT_COST_MULTIPLIER;
|
|
||||||
final int requiredSp = esd.getSpCost() * costMultiplier;
|
|
||||||
if (player.getSp() >= requiredSp)
|
|
||||||
{
|
{
|
||||||
// only first lvl requires book
|
int costMultiplier = EnchantSkillGroupsData.SAFE_ENCHANT_COST_MULTIPLIER;
|
||||||
final boolean usesBook = (_skillLvl % 100) == 1; // 101, 201, 301 ...
|
final int reqItemId;
|
||||||
final int reqItemId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK;
|
if (player.getClassId().level() == 3)
|
||||||
final L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
{
|
||||||
|
reqItemId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK_OLD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reqItemId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK;
|
||||||
|
}
|
||||||
|
final EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
||||||
|
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||||
|
if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (Config.ES_SP_BOOK_NEEDED && usesBook && (spb == null)) // Haven't spellbook
|
int requiredSp = esd.getSpCost() * costMultiplier;
|
||||||
|
int requireditems = esd.getAdenaCost() * costMultiplier;
|
||||||
|
int rate = esd.getRate(player);
|
||||||
|
|
||||||
|
if (player.getSp() >= requiredSp)
|
||||||
|
{
|
||||||
|
L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
||||||
|
if (spb == null)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player.getInventory().getAdena() < requireditems)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean check = player.getStat().removeExpAndSp(0, requiredSp, false);
|
||||||
|
check &= player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
|
||||||
|
|
||||||
|
check &= player.destroyItemByItemId("Consume", Inventory.ADENA_ID, requireditems, player, true);
|
||||||
|
|
||||||
|
if (!check)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Rnd.get(100) <= rate)
|
||||||
|
{
|
||||||
|
if (Config.LOG_SKILL_ENCHANTS)
|
||||||
|
{
|
||||||
|
LogRecord record = new LogRecord(Level.INFO, "Safe Success");
|
||||||
|
record.setParameters(new Object[]
|
||||||
|
{
|
||||||
|
player,
|
||||||
|
skill,
|
||||||
|
spb,
|
||||||
|
rate
|
||||||
|
});
|
||||||
|
record.setLoggerName("skill");
|
||||||
|
_logEnchant.log(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
player.addSkill(skill, true);
|
||||||
|
|
||||||
|
if (Config.DEBUG)
|
||||||
|
{
|
||||||
|
_log.fine("Learned skill ID: " + _skillId + " Level: " + _skillLvl + " for " + requiredSp + " SP, " + requireditems + " Adena.");
|
||||||
|
}
|
||||||
|
|
||||||
|
player.sendPacket(ExEnchantSkillResult.valueOf(true));
|
||||||
|
|
||||||
|
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_ENCHANT_WAS_SUCCESSFUL_S1_HAS_BEEN_ENCHANTED);
|
||||||
|
sm.addSkillName(_skillId);
|
||||||
|
player.sendPacket(sm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Config.LOG_SKILL_ENCHANTS)
|
||||||
|
{
|
||||||
|
LogRecord record = new LogRecord(Level.INFO, "Safe Fail");
|
||||||
|
record.setParameters(new Object[]
|
||||||
|
{
|
||||||
|
player,
|
||||||
|
skill,
|
||||||
|
spb,
|
||||||
|
rate
|
||||||
|
});
|
||||||
|
record.setLoggerName("skill");
|
||||||
|
_logEnchant.log(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_ENCHANT_FAILED_THE_SKILL_WILL_BE_INITIALIZED);
|
||||||
|
sm.addSkillName(_skillId);
|
||||||
|
player.sendPacket(sm);
|
||||||
|
player.sendPacket(ExEnchantSkillResult.valueOf(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
player.sendPacket(new UserInfo(player));
|
||||||
|
player.sendSkillList();
|
||||||
|
final int afterEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||||
|
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterEnchantSkillLevel));
|
||||||
|
player.sendPacket(new ExEnchantSkillInfoDetail(1, _skillId, afterEnchantSkillLevel + 1, player));
|
||||||
|
player.updateShortCuts(_skillId, afterEnchantSkillLevel);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL);
|
||||||
|
player.sendPacket(sm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_type == 2) // untrain
|
||||||
|
{
|
||||||
|
if ((_skillLvl % 100) == 0)
|
||||||
|
{
|
||||||
|
_skillLvl = s.getBaseLevel();
|
||||||
|
}
|
||||||
|
|
||||||
|
final int reqItemId;
|
||||||
|
if (player.getClassId().level() == 3)
|
||||||
|
{
|
||||||
|
reqItemId = EnchantSkillGroupsData.UNTRAIN_ENCHANT_BOOK_OLD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reqItemId = EnchantSkillGroupsData.UNTRAIN_ENCHANT_BOOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int beforeUntrainSkillLevel = player.getSkillLevel(_skillId);
|
||||||
|
if (((beforeUntrainSkillLevel - 1) != _skillLvl) && (((beforeUntrainSkillLevel % 100) != 1) || (_skillLvl != s.getBaseLevel())))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EnchantSkillHolder esd = s.getEnchantSkillHolder(beforeUntrainSkillLevel);
|
||||||
|
|
||||||
|
int requiredSp = esd.getSpCost();
|
||||||
|
int requireditems = esd.getAdenaCost();
|
||||||
|
|
||||||
|
L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
||||||
|
if (Config.ES_SP_BOOK_NEEDED)
|
||||||
|
{
|
||||||
|
if (spb == null)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player.getInventory().getAdena() < requireditems)
|
||||||
{
|
{
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int requiredAdena = (esd.getAdenaCost() * costMultiplier);
|
boolean check = true;
|
||||||
if (player.getInventory().getAdena() < requiredAdena)
|
if (Config.ES_SP_BOOK_NEEDED)
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean check = player.getStat().removeExpAndSp(0, requiredSp, false);
|
|
||||||
if (Config.ES_SP_BOOK_NEEDED && usesBook)
|
|
||||||
{
|
{
|
||||||
check &= player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
|
check &= player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
check &= player.destroyItemByItemId("Consume", Inventory.ADENA_ID, requiredAdena, player, true);
|
check &= player.destroyItemByItemId("Consume", Inventory.ADENA_ID, requireditems, player, true);
|
||||||
|
|
||||||
if (!check)
|
if (!check)
|
||||||
{
|
{
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok. Destroy ONE copy of the book
|
player.getStat().addSp((int) (requiredSp * 0.8));
|
||||||
final int rate = esd.getRate(player);
|
|
||||||
if (Rnd.get(100) <= rate)
|
if (Config.LOG_SKILL_ENCHANTS)
|
||||||
{
|
{
|
||||||
|
LogRecord record = new LogRecord(Level.INFO, "Untrain");
|
||||||
|
record.setParameters(new Object[]
|
||||||
|
{
|
||||||
|
player,
|
||||||
|
skill,
|
||||||
|
spb
|
||||||
|
});
|
||||||
|
record.setLoggerName("skill");
|
||||||
|
_logEnchant.log(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
player.addSkill(skill, true);
|
||||||
|
player.sendPacket(ExEnchantSkillResult.valueOf(true));
|
||||||
|
|
||||||
|
if (Config.DEBUG)
|
||||||
|
{
|
||||||
|
_log.fine("Learned skill ID: " + _skillId + " Level: " + _skillLvl + " for " + requiredSp + " SP, " + requireditems + " Adena.");
|
||||||
|
}
|
||||||
|
|
||||||
|
player.sendPacket(new UserInfo(player));
|
||||||
|
|
||||||
|
if (_skillLvl > 100)
|
||||||
|
{
|
||||||
|
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.UNTRAIN_OF_ENCHANT_SKILL_WAS_SUCCESSFUL_CURRENT_LEVEL_OF_ENCHANT_SKILL_S1_HAS_BEEN_DECREASED_BY_1);
|
||||||
|
sm.addSkillName(_skillId);
|
||||||
|
player.sendPacket(sm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.UNTRAIN_OF_ENCHANT_SKILL_WAS_SUCCESSFUL_CURRENT_LEVEL_OF_ENCHANT_SKILL_S1_BECAME_0_AND_ENCHANT_SKILL_WILL_BE_INITIALIZED);
|
||||||
|
sm.addSkillName(_skillId);
|
||||||
|
player.sendPacket(sm);
|
||||||
|
}
|
||||||
|
player.sendSkillList();
|
||||||
|
final int afterUntrainSkillLevel = player.getSkillLevel(_skillId);
|
||||||
|
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterUntrainSkillLevel));
|
||||||
|
player.sendPacket(new ExEnchantSkillInfoDetail(2, _skillId, afterUntrainSkillLevel - 1, player));
|
||||||
|
player.updateShortCuts(_skillId, afterUntrainSkillLevel);
|
||||||
|
}
|
||||||
|
else if (_type == 3) // change route
|
||||||
|
{
|
||||||
|
final int reqItemId;
|
||||||
|
if (player.getClassId().level() == 3)
|
||||||
|
{
|
||||||
|
reqItemId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK_OLD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reqItemId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||||
|
if (beforeEnchantSkillLevel <= 100)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentEnchantLevel = beforeEnchantSkillLevel % 100;
|
||||||
|
if (currentEnchantLevel != (_skillLvl % 100))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
||||||
|
|
||||||
|
int requiredSp = esd.getSpCost();
|
||||||
|
int requireditems = esd.getAdenaCost();
|
||||||
|
|
||||||
|
if (player.getSp() >= requiredSp)
|
||||||
|
{
|
||||||
|
L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
||||||
|
if (Config.ES_SP_BOOK_NEEDED)
|
||||||
|
{
|
||||||
|
if (spb == null)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_SKILL_ROUTE_CHANGE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player.getInventory().getAdena() < requireditems)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean check;
|
||||||
|
check = player.getStat().removeExpAndSp(0, requiredSp, false);
|
||||||
|
if (Config.ES_SP_BOOK_NEEDED)
|
||||||
|
{
|
||||||
|
check &= player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
check &= player.destroyItemByItemId("Consume", Inventory.ADENA_ID, requireditems, player, true);
|
||||||
|
|
||||||
|
if (!check)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int levelPenalty = Rnd.get(Math.min(4, currentEnchantLevel));
|
||||||
|
_skillLvl -= levelPenalty;
|
||||||
|
if ((_skillLvl % 100) == 0)
|
||||||
|
{
|
||||||
|
_skillLvl = s.getBaseLevel();
|
||||||
|
}
|
||||||
|
|
||||||
if (Config.LOG_SKILL_ENCHANTS)
|
if (Config.LOG_SKILL_ENCHANTS)
|
||||||
{
|
{
|
||||||
final LogRecord record = new LogRecord(Level.INFO, "Success");
|
LogRecord record = new LogRecord(Level.INFO, "Route Change");
|
||||||
record.setParameters(new Object[]
|
record.setParameters(new Object[]
|
||||||
{
|
{
|
||||||
player,
|
player,
|
||||||
skill,
|
skill,
|
||||||
spb,
|
spb
|
||||||
rate
|
|
||||||
});
|
});
|
||||||
record.setLoggerName("skill");
|
record.setLoggerName("skill");
|
||||||
_logEnchant.log(record);
|
_logEnchant.log(record);
|
||||||
@ -168,47 +517,96 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
|
|||||||
player.addSkill(skill, true);
|
player.addSkill(skill, true);
|
||||||
player.sendPacket(ExEnchantSkillResult.valueOf(true));
|
player.sendPacket(ExEnchantSkillResult.valueOf(true));
|
||||||
|
|
||||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_ENCHANT_WAS_SUCCESSFUL_S1_HAS_BEEN_ENCHANTED);
|
|
||||||
sm.addSkillName(_skillId);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
|
|
||||||
if (Config.DEBUG)
|
if (Config.DEBUG)
|
||||||
{
|
{
|
||||||
_log.fine("Learned skill ID: " + _skillId + " Level: " + _skillLvl + " for " + requiredSp + " SP, " + requiredAdena + " Adena.");
|
_log.fine("Learned skill ID: " + _skillId + " Level: " + _skillLvl + " for " + requiredSp + " SP, " + requireditems + " Adena.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
player.sendPacket(new UserInfo(player));
|
||||||
|
|
||||||
|
if (levelPenalty == 0)
|
||||||
|
{
|
||||||
|
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.ENCHANT_SKILL_ROUTE_CHANGE_WAS_SUCCESSFUL_LV_OF_ENCHANT_SKILL_S1_WILL_REMAIN);
|
||||||
|
sm.addSkillName(_skillId);
|
||||||
|
player.sendPacket(sm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.ENCHANT_SKILL_ROUTE_CHANGE_WAS_SUCCESSFUL_LV_OF_ENCHANT_SKILL_S1_HAS_BEEN_DECREASED_BY_S2);
|
||||||
|
sm.addSkillName(_skillId);
|
||||||
|
|
||||||
|
if (_skillLvl > 100)
|
||||||
|
{
|
||||||
|
sm.addInt(_skillLvl % 100);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sm.addInt(0);
|
||||||
|
}
|
||||||
|
player.sendPacket(sm);
|
||||||
|
}
|
||||||
|
player.sendSkillList();
|
||||||
|
final int afterEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||||
|
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterEnchantSkillLevel));
|
||||||
|
player.sendPacket(new ExEnchantSkillInfoDetail(3, _skillId, afterEnchantSkillLevel, player));
|
||||||
|
player.updateShortCuts(_skillId, afterEnchantSkillLevel);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
player.addSkill(SkillData.getInstance().getSkill(_skillId, s.getBaseLevel()), true);
|
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL);
|
||||||
player.sendPacket(SystemMessageId.SKILL_ENCHANT_FAILED_THE_SKILL_WILL_BE_INITIALIZED);
|
player.sendPacket(sm);
|
||||||
player.sendPacket(ExEnchantSkillResult.valueOf(false));
|
}
|
||||||
|
}
|
||||||
if (Config.LOG_SKILL_ENCHANTS)
|
else if (_type == 4) // 100% enchant
|
||||||
{
|
{
|
||||||
final LogRecord record = new LogRecord(Level.INFO, "Fail");
|
int reqItemId = EnchantSkillGroupsData.IMMORTAL_SCROLL;
|
||||||
record.setParameters(new Object[]
|
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||||
{
|
if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl))
|
||||||
player,
|
{
|
||||||
skill,
|
return;
|
||||||
spb,
|
|
||||||
rate
|
|
||||||
});
|
|
||||||
record.setLoggerName("skill");
|
|
||||||
_logEnchant.log(record);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
||||||
|
if (spb == null)
|
||||||
|
{
|
||||||
|
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
|
||||||
|
|
||||||
|
if (Config.LOG_SKILL_ENCHANTS)
|
||||||
|
{
|
||||||
|
LogRecord record = new LogRecord(Level.INFO, "100% Success");
|
||||||
|
record.setParameters(new Object[]
|
||||||
|
{
|
||||||
|
player,
|
||||||
|
skill,
|
||||||
|
spb,
|
||||||
|
100
|
||||||
|
});
|
||||||
|
record.setLoggerName("skill");
|
||||||
|
_logEnchant.log(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
player.addSkill(skill, true);
|
||||||
|
|
||||||
|
if (Config.DEBUG)
|
||||||
|
{
|
||||||
|
_log.fine("Learned skill ID: " + _skillId + " Level: " + _skillLvl + ".");
|
||||||
|
}
|
||||||
|
|
||||||
|
player.sendPacket(ExEnchantSkillResult.valueOf(true));
|
||||||
|
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_ENCHANT_WAS_SUCCESSFUL_S1_HAS_BEEN_ENCHANTED);
|
||||||
|
sm.addSkillName(_skillId);
|
||||||
|
player.sendPacket(sm);
|
||||||
player.sendPacket(new UserInfo(player));
|
player.sendPacket(new UserInfo(player));
|
||||||
player.sendSkillList();
|
player.sendSkillList();
|
||||||
final int afterEnchantSkillLevel = player.getSkillLevel(_skillId);
|
final int afterEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||||
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterEnchantSkillLevel));
|
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterEnchantSkillLevel));
|
||||||
player.sendPacket(new ExEnchantSkillInfoDetail(0, _skillId, afterEnchantSkillLevel + 1, player));
|
player.sendPacket(new ExEnchantSkillInfoDetail(1, _skillId, afterEnchantSkillLevel + 1, player));
|
||||||
player.updateShortCuts(_skillId, afterEnchantSkillLevel);
|
player.updateShortCuts(_skillId, afterEnchantSkillLevel);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -216,4 +614,4 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
|
|||||||
{
|
{
|
||||||
return _C__D0_0F_REQUESTEXENCHANTSKILL;
|
return _C__D0_0F_REQUESTEXENCHANTSKILL;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,225 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2004-2015 L2J Server
|
|
||||||
*
|
|
||||||
* This file is part of L2J Server.
|
|
||||||
*
|
|
||||||
* L2J Server 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.
|
|
||||||
*
|
|
||||||
* L2J Server 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 com.l2jserver.gameserver.network.clientpackets;
|
|
||||||
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.LogRecord;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import com.l2jserver.Config;
|
|
||||||
import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData;
|
|
||||||
import com.l2jserver.gameserver.datatables.SkillData;
|
|
||||||
import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder;
|
|
||||||
import com.l2jserver.gameserver.model.L2EnchantSkillLearn;
|
|
||||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
|
|
||||||
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
|
|
||||||
import com.l2jserver.gameserver.model.skills.Skill;
|
|
||||||
import com.l2jserver.gameserver.network.SystemMessageId;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillInfo;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillInfoDetail;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillResult;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.UserInfo;
|
|
||||||
import com.l2jserver.util.Rnd;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Format (ch) dd c: (id) 0xD0 h: (subid) 0x34 d: skill id d: skill lvl
|
|
||||||
* @author -Wooden-
|
|
||||||
*/
|
|
||||||
public final class RequestExEnchantSkillRouteChange extends L2GameClientPacket
|
|
||||||
{
|
|
||||||
private static final String _C__D0_34_REQUESTEXENCHANTSKILLROUTECHANGE = "[C] D0:34 RequestExEnchantSkillRouteChange";
|
|
||||||
private static final Logger _logEnchant = Logger.getLogger("enchant");
|
|
||||||
|
|
||||||
private int _skillId;
|
|
||||||
private int _skillLvl;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void readImpl()
|
|
||||||
{
|
|
||||||
_skillId = readD();
|
|
||||||
_skillLvl = readD();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void runImpl()
|
|
||||||
{
|
|
||||||
if ((_skillId <= 0) || (_skillLvl <= 0))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
L2PcInstance player = getClient().getActiveChar();
|
|
||||||
if (player == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getClassId().level() < 3) // requires to have 3rd class quest completed
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_IN_THIS_CLASS_YOU_CAN_USE_CORRESPONDING_FUNCTION_WHEN_COMPLETING_THE_THIRD_CLASS_CHANGE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getLevel() < 76)
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_ON_THIS_LEVEL_YOU_CAN_USE_THE_CORRESPONDING_FUNCTION_ON_LEVELS_HIGHER_THAN_LV_76);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player.isAllowedToEnchantSkills())
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_IN_THIS_STATE_YOU_CAN_ENHANCE_SKILLS_WHEN_NOT_IN_BATTLE_AND_CANNOT_USE_THE_FUNCTION_WHILE_TRANSFORMED_IN_BATTLE_ON_A_MOUNT_OR_WHILE_THE_SKILL_IS_ON_COOLDOWN);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Skill skill = SkillData.getInstance().getSkill(_skillId, _skillLvl);
|
|
||||||
if (skill == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int reqItemId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK;
|
|
||||||
|
|
||||||
L2EnchantSkillLearn s = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(_skillId);
|
|
||||||
if (s == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
|
||||||
// do u have this skill enchanted?
|
|
||||||
if (beforeEnchantSkillLevel <= 100)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int currentEnchantLevel = beforeEnchantSkillLevel % 100;
|
|
||||||
// is the requested level valid?
|
|
||||||
if (currentEnchantLevel != (_skillLvl % 100))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
|
||||||
|
|
||||||
int requiredSp = esd.getSpCost();
|
|
||||||
int requireditems = esd.getAdenaCost();
|
|
||||||
|
|
||||||
if (player.getSp() >= requiredSp)
|
|
||||||
{
|
|
||||||
// only first lvl requires book
|
|
||||||
L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
|
||||||
if (Config.ES_SP_BOOK_NEEDED)
|
|
||||||
{
|
|
||||||
if (spb == null)// Haven't spellbook
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_SKILL_ROUTE_CHANGE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getInventory().getAdena() < requireditems)
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean check;
|
|
||||||
check = player.getStat().removeExpAndSp(0, requiredSp, false);
|
|
||||||
if (Config.ES_SP_BOOK_NEEDED)
|
|
||||||
{
|
|
||||||
check &= player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
check &= player.destroyItemByItemId("Consume", Inventory.ADENA_ID, requireditems, player, true);
|
|
||||||
|
|
||||||
if (!check)
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int levelPenalty = Rnd.get(Math.min(4, currentEnchantLevel));
|
|
||||||
_skillLvl -= levelPenalty;
|
|
||||||
if ((_skillLvl % 100) == 0)
|
|
||||||
{
|
|
||||||
_skillLvl = s.getBaseLevel();
|
|
||||||
}
|
|
||||||
|
|
||||||
skill = SkillData.getInstance().getSkill(_skillId, _skillLvl);
|
|
||||||
|
|
||||||
if (skill != null)
|
|
||||||
{
|
|
||||||
if (Config.LOG_SKILL_ENCHANTS)
|
|
||||||
{
|
|
||||||
LogRecord record = new LogRecord(Level.INFO, "Route Change");
|
|
||||||
record.setParameters(new Object[]
|
|
||||||
{
|
|
||||||
player,
|
|
||||||
skill,
|
|
||||||
spb
|
|
||||||
});
|
|
||||||
record.setLoggerName("skill");
|
|
||||||
_logEnchant.log(record);
|
|
||||||
}
|
|
||||||
|
|
||||||
player.addSkill(skill, true);
|
|
||||||
player.sendPacket(ExEnchantSkillResult.valueOf(true));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Config.DEBUG)
|
|
||||||
{
|
|
||||||
_log.fine("Learned skill ID: " + _skillId + " Level: " + _skillLvl + " for " + requiredSp + " SP, " + requireditems + " Adena.");
|
|
||||||
}
|
|
||||||
|
|
||||||
player.sendPacket(new UserInfo(player));
|
|
||||||
|
|
||||||
if (levelPenalty == 0)
|
|
||||||
{
|
|
||||||
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.ENCHANT_SKILL_ROUTE_CHANGE_WAS_SUCCESSFUL_LV_OF_ENCHANT_SKILL_S1_WILL_REMAIN);
|
|
||||||
sm.addSkillName(_skillId);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.ENCHANT_SKILL_ROUTE_CHANGE_WAS_SUCCESSFUL_LV_OF_ENCHANT_SKILL_S1_HAS_BEEN_DECREASED_BY_S2);
|
|
||||||
sm.addSkillName(_skillId);
|
|
||||||
sm.addInt(levelPenalty);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
}
|
|
||||||
player.sendSkillList();
|
|
||||||
final int afterEnchantSkillLevel = player.getSkillLevel(_skillId);
|
|
||||||
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterEnchantSkillLevel));
|
|
||||||
player.sendPacket(new ExEnchantSkillInfoDetail(3, _skillId, afterEnchantSkillLevel, player));
|
|
||||||
player.updateShortCuts(_skillId, afterEnchantSkillLevel);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getType()
|
|
||||||
{
|
|
||||||
return _C__D0_34_REQUESTEXENCHANTSKILLROUTECHANGE;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,216 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2004-2015 L2J Server
|
|
||||||
*
|
|
||||||
* This file is part of L2J Server.
|
|
||||||
*
|
|
||||||
* L2J Server 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.
|
|
||||||
*
|
|
||||||
* L2J Server 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 com.l2jserver.gameserver.network.clientpackets;
|
|
||||||
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.LogRecord;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import com.l2jserver.Config;
|
|
||||||
import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData;
|
|
||||||
import com.l2jserver.gameserver.datatables.SkillData;
|
|
||||||
import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder;
|
|
||||||
import com.l2jserver.gameserver.model.L2EnchantSkillLearn;
|
|
||||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
|
|
||||||
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
|
|
||||||
import com.l2jserver.gameserver.model.skills.Skill;
|
|
||||||
import com.l2jserver.gameserver.network.SystemMessageId;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillInfo;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillInfoDetail;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillResult;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.UserInfo;
|
|
||||||
import com.l2jserver.util.Rnd;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Format (ch) dd c: (id) 0xD0 h: (subid) 0x32 d: skill id d: skill lvl
|
|
||||||
* @author -Wooden-
|
|
||||||
*/
|
|
||||||
public final class RequestExEnchantSkillSafe extends L2GameClientPacket
|
|
||||||
{
|
|
||||||
private static final String _C__D0_32_REQUESTEXENCHANTSKILLSAFE = "[C] D0:32 RequestExEnchantSkillSafe";
|
|
||||||
private static final Logger _logEnchant = Logger.getLogger("enchant");
|
|
||||||
|
|
||||||
private int _skillId;
|
|
||||||
private int _skillLvl;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void readImpl()
|
|
||||||
{
|
|
||||||
_skillId = readD();
|
|
||||||
_skillLvl = readD();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void runImpl()
|
|
||||||
{
|
|
||||||
if ((_skillId <= 0) || (_skillLvl <= 0))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
L2PcInstance player = getClient().getActiveChar();
|
|
||||||
if (player == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getClassId().level() < 3) // requires to have 3rd class quest completed
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_IN_THIS_CLASS_YOU_CAN_USE_CORRESPONDING_FUNCTION_WHEN_COMPLETING_THE_THIRD_CLASS_CHANGE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getLevel() < 76)
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_ON_THIS_LEVEL_YOU_CAN_USE_THE_CORRESPONDING_FUNCTION_ON_LEVELS_HIGHER_THAN_LV_76);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player.isAllowedToEnchantSkills())
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_IN_THIS_STATE_YOU_CAN_ENHANCE_SKILLS_WHEN_NOT_IN_BATTLE_AND_CANNOT_USE_THE_FUNCTION_WHILE_TRANSFORMED_IN_BATTLE_ON_A_MOUNT_OR_WHILE_THE_SKILL_IS_ON_COOLDOWN);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Skill skill = SkillData.getInstance().getSkill(_skillId, _skillLvl);
|
|
||||||
if (skill == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int costMultiplier = EnchantSkillGroupsData.SAFE_ENCHANT_COST_MULTIPLIER;
|
|
||||||
int reqItemId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK;
|
|
||||||
|
|
||||||
L2EnchantSkillLearn s = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(_skillId);
|
|
||||||
if (s == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
|
||||||
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
|
||||||
if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int requiredSp = esd.getSpCost() * costMultiplier;
|
|
||||||
int requireditems = esd.getAdenaCost() * costMultiplier;
|
|
||||||
int rate = esd.getRate(player);
|
|
||||||
|
|
||||||
if (player.getSp() >= requiredSp)
|
|
||||||
{
|
|
||||||
// No config option for safe enchant book consume
|
|
||||||
L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
|
||||||
if (spb == null)// Haven't spellbook
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getInventory().getAdena() < requireditems)
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean check = player.getStat().removeExpAndSp(0, requiredSp, false);
|
|
||||||
check &= player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
|
|
||||||
|
|
||||||
check &= player.destroyItemByItemId("Consume", Inventory.ADENA_ID, requireditems, player, true);
|
|
||||||
|
|
||||||
if (!check)
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ok. Destroy ONE copy of the book
|
|
||||||
if (Rnd.get(100) <= rate)
|
|
||||||
{
|
|
||||||
if (Config.LOG_SKILL_ENCHANTS)
|
|
||||||
{
|
|
||||||
LogRecord record = new LogRecord(Level.INFO, "Safe Success");
|
|
||||||
record.setParameters(new Object[]
|
|
||||||
{
|
|
||||||
player,
|
|
||||||
skill,
|
|
||||||
spb,
|
|
||||||
rate
|
|
||||||
});
|
|
||||||
record.setLoggerName("skill");
|
|
||||||
_logEnchant.log(record);
|
|
||||||
}
|
|
||||||
|
|
||||||
player.addSkill(skill, true);
|
|
||||||
|
|
||||||
if (Config.DEBUG)
|
|
||||||
{
|
|
||||||
_log.fine("Learned skill ID: " + _skillId + " Level: " + _skillLvl + " for " + requiredSp + " SP, " + requireditems + " Adena.");
|
|
||||||
}
|
|
||||||
|
|
||||||
player.sendPacket(ExEnchantSkillResult.valueOf(true));
|
|
||||||
|
|
||||||
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_ENCHANT_WAS_SUCCESSFUL_S1_HAS_BEEN_ENCHANTED);
|
|
||||||
sm.addSkillName(_skillId);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (Config.LOG_SKILL_ENCHANTS)
|
|
||||||
{
|
|
||||||
LogRecord record = new LogRecord(Level.INFO, "Safe Fail");
|
|
||||||
record.setParameters(new Object[]
|
|
||||||
{
|
|
||||||
player,
|
|
||||||
skill,
|
|
||||||
spb,
|
|
||||||
rate
|
|
||||||
});
|
|
||||||
record.setLoggerName("skill");
|
|
||||||
_logEnchant.log(record);
|
|
||||||
}
|
|
||||||
|
|
||||||
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_ENCHANT_FAILED_CURRENT_LEVEL_OF_ENCHANT_SKILL_S1_WILL_REMAIN_UNCHANGED);
|
|
||||||
sm.addSkillName(_skillId);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
player.sendPacket(ExEnchantSkillResult.valueOf(false));
|
|
||||||
}
|
|
||||||
|
|
||||||
player.sendPacket(new UserInfo(player));
|
|
||||||
player.sendSkillList();
|
|
||||||
final int afterEnchantSkillLevel = player.getSkillLevel(_skillId);
|
|
||||||
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterEnchantSkillLevel));
|
|
||||||
player.sendPacket(new ExEnchantSkillInfoDetail(1, _skillId, afterEnchantSkillLevel + 1, player));
|
|
||||||
player.updateShortCuts(_skillId, afterEnchantSkillLevel);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getType()
|
|
||||||
{
|
|
||||||
return _C__D0_32_REQUESTEXENCHANTSKILLSAFE;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,201 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2004-2015 L2J Server
|
|
||||||
*
|
|
||||||
* This file is part of L2J Server.
|
|
||||||
*
|
|
||||||
* L2J Server 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.
|
|
||||||
*
|
|
||||||
* L2J Server 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 com.l2jserver.gameserver.network.clientpackets;
|
|
||||||
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.LogRecord;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import com.l2jserver.Config;
|
|
||||||
import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData;
|
|
||||||
import com.l2jserver.gameserver.datatables.SkillData;
|
|
||||||
import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder;
|
|
||||||
import com.l2jserver.gameserver.model.L2EnchantSkillLearn;
|
|
||||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
|
||||||
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
|
|
||||||
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
|
|
||||||
import com.l2jserver.gameserver.model.skills.Skill;
|
|
||||||
import com.l2jserver.gameserver.network.SystemMessageId;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillInfo;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillInfoDetail;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillResult;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
|
|
||||||
import com.l2jserver.gameserver.network.serverpackets.UserInfo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Format (ch) dd c: (id) 0xD0 h: (subid) 0x33 d: skill id d: skill lvl
|
|
||||||
* @author -Wooden-
|
|
||||||
*/
|
|
||||||
public final class RequestExEnchantSkillUntrain extends L2GameClientPacket
|
|
||||||
{
|
|
||||||
private static final String _C__D0_33_REQUESTEXENCHANTSKILLUNTRAIN = "[C] D0:33 RequestExEnchantSkillUntrain";
|
|
||||||
private static final Logger _logEnchant = Logger.getLogger("enchant");
|
|
||||||
|
|
||||||
private int _skillId;
|
|
||||||
private int _skillLvl;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void readImpl()
|
|
||||||
{
|
|
||||||
_skillId = readD();
|
|
||||||
_skillLvl = readD();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void runImpl()
|
|
||||||
{
|
|
||||||
if ((_skillId <= 0) || (_skillLvl <= 0))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
L2PcInstance player = getClient().getActiveChar();
|
|
||||||
if (player == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getClassId().level() < 3) // requires to have 3rd class quest completed
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_IN_THIS_CLASS_YOU_CAN_USE_CORRESPONDING_FUNCTION_WHEN_COMPLETING_THE_THIRD_CLASS_CHANGE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getLevel() < 76)
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_ON_THIS_LEVEL_YOU_CAN_USE_THE_CORRESPONDING_FUNCTION_ON_LEVELS_HIGHER_THAN_LV_76);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player.isAllowedToEnchantSkills())
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_IN_THIS_STATE_YOU_CAN_ENHANCE_SKILLS_WHEN_NOT_IN_BATTLE_AND_CANNOT_USE_THE_FUNCTION_WHILE_TRANSFORMED_IN_BATTLE_ON_A_MOUNT_OR_WHILE_THE_SKILL_IS_ON_COOLDOWN);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
L2EnchantSkillLearn s = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(_skillId);
|
|
||||||
if (s == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((_skillLvl % 100) == 0)
|
|
||||||
{
|
|
||||||
_skillLvl = s.getBaseLevel();
|
|
||||||
}
|
|
||||||
|
|
||||||
Skill skill = SkillData.getInstance().getSkill(_skillId, _skillLvl);
|
|
||||||
if (skill == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int reqItemId = EnchantSkillGroupsData.UNTRAIN_ENCHANT_BOOK;
|
|
||||||
|
|
||||||
final int beforeUntrainSkillLevel = player.getSkillLevel(_skillId);
|
|
||||||
if (((beforeUntrainSkillLevel - 1) != _skillLvl) && (((beforeUntrainSkillLevel % 100) != 1) || (_skillLvl != s.getBaseLevel())))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
EnchantSkillHolder esd = s.getEnchantSkillHolder(beforeUntrainSkillLevel);
|
|
||||||
|
|
||||||
int requiredSp = esd.getSpCost();
|
|
||||||
int requireditems = esd.getAdenaCost();
|
|
||||||
|
|
||||||
L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
|
||||||
if (Config.ES_SP_BOOK_NEEDED)
|
|
||||||
{
|
|
||||||
if (spb == null) // Haven't spellbook
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getInventory().getAdena() < requireditems)
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean check = true;
|
|
||||||
if (Config.ES_SP_BOOK_NEEDED)
|
|
||||||
{
|
|
||||||
check &= player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
check &= player.destroyItemByItemId("Consume", Inventory.ADENA_ID, requireditems, player, true);
|
|
||||||
|
|
||||||
if (!check)
|
|
||||||
{
|
|
||||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
player.getStat().addSp((int) (requiredSp * 0.8));
|
|
||||||
|
|
||||||
if (Config.LOG_SKILL_ENCHANTS)
|
|
||||||
{
|
|
||||||
LogRecord record = new LogRecord(Level.INFO, "Untrain");
|
|
||||||
record.setParameters(new Object[]
|
|
||||||
{
|
|
||||||
player,
|
|
||||||
skill,
|
|
||||||
spb
|
|
||||||
});
|
|
||||||
record.setLoggerName("skill");
|
|
||||||
_logEnchant.log(record);
|
|
||||||
}
|
|
||||||
|
|
||||||
player.addSkill(skill, true);
|
|
||||||
player.sendPacket(ExEnchantSkillResult.valueOf(true));
|
|
||||||
|
|
||||||
if (Config.DEBUG)
|
|
||||||
{
|
|
||||||
_log.fine("Learned skill ID: " + _skillId + " Level: " + _skillLvl + " for " + requiredSp + " SP, " + requireditems + " Adena.");
|
|
||||||
}
|
|
||||||
|
|
||||||
player.sendPacket(new UserInfo(player));
|
|
||||||
|
|
||||||
if (_skillLvl > 100)
|
|
||||||
{
|
|
||||||
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.UNTRAIN_OF_ENCHANT_SKILL_WAS_SUCCESSFUL_CURRENT_LEVEL_OF_ENCHANT_SKILL_S1_HAS_BEEN_DECREASED_BY_1);
|
|
||||||
sm.addSkillName(_skillId);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.UNTRAIN_OF_ENCHANT_SKILL_WAS_SUCCESSFUL_CURRENT_LEVEL_OF_ENCHANT_SKILL_S1_BECAME_0_AND_ENCHANT_SKILL_WILL_BE_INITIALIZED);
|
|
||||||
sm.addSkillName(_skillId);
|
|
||||||
player.sendPacket(sm);
|
|
||||||
}
|
|
||||||
player.sendSkillList();
|
|
||||||
final int afterUntrainSkillLevel = player.getSkillLevel(_skillId);
|
|
||||||
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterUntrainSkillLevel));
|
|
||||||
player.sendPacket(new ExEnchantSkillInfoDetail(2, _skillId, afterUntrainSkillLevel - 1, player));
|
|
||||||
player.updateShortCuts(_skillId, afterUntrainSkillLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getType()
|
|
||||||
{
|
|
||||||
return _C__D0_33_REQUESTEXENCHANTSKILLUNTRAIN;
|
|
||||||
}
|
|
||||||
}
|
|
@ -34,6 +34,7 @@ public class ExEnchantSkillInfoDetail extends L2GameServerPacket
|
|||||||
private static final int TYPE_SAFE_ENCHANT = 1;
|
private static final int TYPE_SAFE_ENCHANT = 1;
|
||||||
private static final int TYPE_UNTRAIN_ENCHANT = 2;
|
private static final int TYPE_UNTRAIN_ENCHANT = 2;
|
||||||
private static final int TYPE_CHANGE_ENCHANT = 3;
|
private static final int TYPE_CHANGE_ENCHANT = 3;
|
||||||
|
private static final int TYPE_IMMORTAL_ENCHANT = 4;
|
||||||
|
|
||||||
private int bookId = 0;
|
private int bookId = 0;
|
||||||
private int reqCount = 0;
|
private int reqCount = 0;
|
||||||
@ -76,13 +77,22 @@ public class ExEnchantSkillInfoDetail extends L2GameServerPacket
|
|||||||
{
|
{
|
||||||
multi = EnchantSkillGroupsData.SAFE_ENCHANT_COST_MULTIPLIER;
|
multi = EnchantSkillGroupsData.SAFE_ENCHANT_COST_MULTIPLIER;
|
||||||
}
|
}
|
||||||
_chance = esd.getRate(ply);
|
if (type != TYPE_IMMORTAL_ENCHANT)
|
||||||
_sp = esd.getSpCost();
|
|
||||||
if (type == TYPE_UNTRAIN_ENCHANT)
|
|
||||||
{
|
{
|
||||||
_sp = (int) (0.8 * _sp);
|
_chance = esd.getRate(ply);
|
||||||
|
_sp = esd.getSpCost();
|
||||||
|
if (type == TYPE_UNTRAIN_ENCHANT)
|
||||||
|
{
|
||||||
|
_sp = (int) (0.8 * _sp);
|
||||||
|
}
|
||||||
|
_adenacount = esd.getAdenaCost() * multi;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_chance = 100;
|
||||||
|
_sp = 0;
|
||||||
|
_adenacount = 0;
|
||||||
}
|
}
|
||||||
_adenacount = esd.getAdenaCost() * multi;
|
|
||||||
_type = type;
|
_type = type;
|
||||||
_skillid = skillid;
|
_skillid = skillid;
|
||||||
_skilllvl = skilllvl;
|
_skilllvl = skilllvl;
|
||||||
@ -90,19 +100,51 @@ public class ExEnchantSkillInfoDetail extends L2GameServerPacket
|
|||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case TYPE_NORMAL_ENCHANT:
|
case TYPE_NORMAL_ENCHANT:
|
||||||
bookId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK;
|
if (ply.getClassId().level() == 3)
|
||||||
|
{
|
||||||
|
bookId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK_OLD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bookId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK;
|
||||||
|
}
|
||||||
reqCount = (((_skilllvl % 100) > 1) ? 0 : 1);
|
reqCount = (((_skilllvl % 100) > 1) ? 0 : 1);
|
||||||
break;
|
break;
|
||||||
case TYPE_SAFE_ENCHANT:
|
case TYPE_SAFE_ENCHANT:
|
||||||
bookId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK;
|
if (ply.getClassId().level() == 3)
|
||||||
|
{
|
||||||
|
bookId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK_OLD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bookId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK;
|
||||||
|
}
|
||||||
reqCount = 1;
|
reqCount = 1;
|
||||||
break;
|
break;
|
||||||
case TYPE_UNTRAIN_ENCHANT:
|
case TYPE_UNTRAIN_ENCHANT:
|
||||||
bookId = EnchantSkillGroupsData.UNTRAIN_ENCHANT_BOOK;
|
if (ply.getClassId().level() == 3)
|
||||||
|
{
|
||||||
|
bookId = EnchantSkillGroupsData.UNTRAIN_ENCHANT_BOOK_OLD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bookId = EnchantSkillGroupsData.UNTRAIN_ENCHANT_BOOK;
|
||||||
|
}
|
||||||
reqCount = 1;
|
reqCount = 1;
|
||||||
break;
|
break;
|
||||||
case TYPE_CHANGE_ENCHANT:
|
case TYPE_CHANGE_ENCHANT:
|
||||||
bookId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK;
|
if (ply.getClassId().level() == 3)
|
||||||
|
{
|
||||||
|
bookId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK_OLD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bookId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK;
|
||||||
|
}
|
||||||
|
reqCount = 1;
|
||||||
|
break;
|
||||||
|
case TYPE_IMMORTAL_ENCHANT:
|
||||||
|
bookId = EnchantSkillGroupsData.IMMORTAL_SCROLL;
|
||||||
reqCount = 1;
|
reqCount = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user