diff --git a/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantSkillGroupsData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantSkillGroupsData.java index 54cecbe49f..918a492ed6 100644 --- a/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantSkillGroupsData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantSkillGroupsData.java @@ -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 SAFE_ENCHANT_COST_MULTIPLIER = Config.SAFE_ENCHANT_COST_MULTIPLIER; - public static final int NORMAL_ENCHANT_BOOK = 6622; - public static final int SAFE_ENCHANT_BOOK = 9627; - public static final int CHANGE_ENCHANT_BOOK = 9626; - public static final int UNTRAIN_ENCHANT_BOOK = 9625; + public static final int NORMAL_ENCHANT_BOOK_OLD = 6622; + public static final int SAFE_ENCHANT_BOOK_OLD = 9627; + public static final int CHANGE_ENCHANT_BOOK_OLD = 9626; + 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 _enchantSkillGroups = new HashMap<>(); private final Map _enchantSkillTrees = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/engines/skills/DocumentSkill.java b/trunk/java/com/l2jserver/gameserver/engines/skills/DocumentSkill.java index 891e7ba8e8..417f47b5a5 100644 --- a/trunk/java/com/l2jserver/gameserver/engines/skills/DocumentSkill.java +++ b/trunk/java/com/l2jserver/gameserver/engines/skills/DocumentSkill.java @@ -52,6 +52,7 @@ public class DocumentSkill extends DocumentBase public StatsSet[] enchsets6; public StatsSet[] enchsets7; public StatsSet[] enchsets8; + public StatsSet[] enchsets9; public int currentLevel; public List skills = new ArrayList<>(); public List currentSkills = new ArrayList<>(); @@ -147,6 +148,7 @@ public class DocumentSkill extends DocumentBase int enchantLevels6 = 0; int enchantLevels7 = 0; int enchantLevels8 = 0; + int enchantLevels9 = 0; int skillId = Integer.parseInt(attrs.getNamedItem("id").getNodeValue()); String skillName = attrs.getNamedItem("name").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())); } + if (attrs.getNamedItem("enchantGroup9") != null) + { + enchantLevels9 = EnchantSkillGroupsData.getInstance().addNewRouteForSkill(skillId, lastLvl, 9, Integer.parseInt(attrs.getNamedItem("enchantGroup9").getNodeValue())); + } _currentSkill.id = skillId; _currentSkill.name = skillName; @@ -195,6 +201,7 @@ public class DocumentSkill extends DocumentBase _currentSkill.enchsets6 = new StatsSet[enchantLevels6]; _currentSkill.enchsets7 = new StatsSet[enchantLevels7]; _currentSkill.enchsets8 = new StatsSet[enchantLevels8]; + _currentSkill.enchsets9 = new StatsSet[enchantLevels9]; for (int i = 0; i < lastLvl; i++) { @@ -273,10 +280,8 @@ public class DocumentSkill extends DocumentBase { _currentSkill.enchsets1[i] = new StatsSet(); _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("name", _currentSkill.name); - // currentSkill.enchsets1[i].set("skillType", "NOTDONE"); for (n = first; n != null; n = n.getNextSibling()) { @@ -303,11 +308,9 @@ public class DocumentSkill extends DocumentBase for (int i = 0; i < enchantLevels2; i++) { _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("level", i + 201); _currentSkill.enchsets2[i].set("name", _currentSkill.name); - // currentSkill.enchsets2[i].set("skillType", "NOTDONE"); 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"); } + 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(); 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); } @@ -1651,5 +1803,19 @@ public class DocumentSkill extends DocumentBase _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); + } + } } } \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkill.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkill.java index 90c7677f63..184f0cac6d 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkill.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkill.java @@ -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 Logger _logEnchant = Logger.getLogger("enchant"); - @SuppressWarnings("unused") - private int _type; // TODO: Fix this. + private int _type; // enchant type: 0 - normal, 1 - safe, 2 - untrain, 3 - change route, 4 - 100% private int _skillId; private int _skillLvl; @@ -105,61 +104,411 @@ public final class RequestExEnchantSkill extends L2GameClientPacket { return; } - final EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl); - final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId); - if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl)) + if (_type == 0) // enchant { - 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); + } } - - final int costMultiplier = EnchantSkillGroupsData.NORMAL_ENCHANT_COST_MULTIPLIER; - final int requiredSp = esd.getSpCost() * costMultiplier; - if (player.getSp() >= requiredSp) + else if (_type == 1) // safe enchant { - // only first lvl requires book - final boolean usesBook = (_skillLvl % 100) == 1; // 101, 201, 301 ... - final int reqItemId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK; - final L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId); + int costMultiplier = EnchantSkillGroupsData.SAFE_ENCHANT_COST_MULTIPLIER; + final int reqItemId; + if (player.getClassId().level() == 3) + { + 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); 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) + 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, requiredAdena, 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 - final int rate = esd.getRate(player); - if (Rnd.get(100) <= rate) + 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); + } + 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) { - final LogRecord record = new LogRecord(Level.INFO, "Success"); + LogRecord record = new LogRecord(Level.INFO, "Route Change"); record.setParameters(new Object[] { player, skill, - spb, - rate + spb }); record.setLoggerName("skill"); _logEnchant.log(record); @@ -168,47 +517,96 @@ public final class RequestExEnchantSkill extends L2GameClientPacket 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."); + _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 { - 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); - } + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL); + player.sendPacket(sm); + } + } + else if (_type == 4) // 100% enchant + { + int reqItemId = EnchantSkillGroupsData.IMMORTAL_SCROLL; + final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId); + if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl)) + { + return; } + 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.sendSkillList(); final int afterEnchantSkillLevel = player.getSkillLevel(_skillId); 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); } - else - { - player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL); - } } @Override @@ -216,4 +614,4 @@ public final class RequestExEnchantSkill extends L2GameClientPacket { return _C__D0_0F_REQUESTEXENCHANTSKILL; } -} +} \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillRouteChange.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillRouteChange.java deleted file mode 100644 index 02f540b73d..0000000000 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillRouteChange.java +++ /dev/null @@ -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 . - */ -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; - } -} diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillSafe.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillSafe.java deleted file mode 100644 index 41d8f744a9..0000000000 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillSafe.java +++ /dev/null @@ -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 . - */ -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; - } -} diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillUntrain.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillUntrain.java deleted file mode 100644 index 081fb6bc91..0000000000 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillUntrain.java +++ /dev/null @@ -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 . - */ -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; - } -} diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfoDetail.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfoDetail.java index 5f44006949..6ee4d96be5 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfoDetail.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfoDetail.java @@ -34,6 +34,7 @@ public class ExEnchantSkillInfoDetail extends L2GameServerPacket private static final int TYPE_SAFE_ENCHANT = 1; private static final int TYPE_UNTRAIN_ENCHANT = 2; private static final int TYPE_CHANGE_ENCHANT = 3; + private static final int TYPE_IMMORTAL_ENCHANT = 4; private int bookId = 0; private int reqCount = 0; @@ -76,13 +77,22 @@ public class ExEnchantSkillInfoDetail extends L2GameServerPacket { multi = EnchantSkillGroupsData.SAFE_ENCHANT_COST_MULTIPLIER; } - _chance = esd.getRate(ply); - _sp = esd.getSpCost(); - if (type == TYPE_UNTRAIN_ENCHANT) + if (type != TYPE_IMMORTAL_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; _skillid = skillid; _skilllvl = skilllvl; @@ -90,19 +100,51 @@ public class ExEnchantSkillInfoDetail extends L2GameServerPacket switch (type) { 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); break; 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; break; 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; break; 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; break; default: