Skill enchant related work in progress.
This commit is contained in:
@@ -16,6 +16,8 @@
|
||||
*/
|
||||
package com.l2jmobius.gameserver.network.clientpackets;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
@@ -45,14 +47,26 @@ public final class RequestExEnchantSkill implements IClientIncomingPacket
|
||||
{
|
||||
private static final Logger _logEnchant = Logger.getLogger("enchant.skills");
|
||||
|
||||
private int _type; // enchant type: 0 - normal, 1 - safe, 2 - untrain, 3 - change route, 4 - 100%
|
||||
|
||||
private int _skillId;
|
||||
private int _skillLvl;
|
||||
private int _fullLvl;
|
||||
|
||||
@Override
|
||||
public boolean read(L2GameClient client, PacketReader packet)
|
||||
{
|
||||
_type = packet.readD();
|
||||
_skillId = packet.readD();
|
||||
_skillLvl = packet.readD();
|
||||
_fullLvl = packet.readD();
|
||||
if (_fullLvl < 100)
|
||||
{
|
||||
_skillLvl = _fullLvl;
|
||||
}
|
||||
else
|
||||
{
|
||||
_skillLvl = _fullLvl >> 16;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -72,19 +86,19 @@ public final class RequestExEnchantSkill implements IClientIncomingPacket
|
||||
|
||||
if (player.getClassId().level() < 3) // requires to have 3rd class quest completed
|
||||
{
|
||||
client.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_IN_THIS_CLASS_YOU_CAN_USE_CORRESPONDING_FUNCTION_WHEN_COMPLETING_THE_THIRD_CLASS_CHANGE);
|
||||
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)
|
||||
{
|
||||
client.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_SKILL_ENHANCING_FUNCTION_ON_THIS_LEVEL_YOU_CAN_USE_THE_CORRESPONDING_FUNCTION_ON_LEVELS_HIGHER_THAN_LV_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())
|
||||
{
|
||||
client.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);
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -105,133 +119,452 @@ public final class RequestExEnchantSkill implements IClientIncomingPacket
|
||||
{
|
||||
return;
|
||||
}
|
||||
final EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
||||
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||
if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl))
|
||||
final int _elvl = ((_skillLvl % 100) - 1) / 10;
|
||||
if (_type == 0) // enchant
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final int costMultiplier = Config.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 = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK;
|
||||
final L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
||||
|
||||
if (Config.ES_SP_BOOK_NEEDED && usesBook && (spb == null)) // Haven't spellbook
|
||||
final EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
||||
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||
if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl))
|
||||
{
|
||||
client.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)
|
||||
final int costMultiplier = EnchantSkillGroupsData.NORMAL_ENCHANT_COST_MULTIPLIER;
|
||||
final int requiredSp = esd.getSpCost() * costMultiplier;
|
||||
if (player.getSp() >= requiredSp)
|
||||
{
|
||||
client.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)
|
||||
{
|
||||
client.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 boolean usesBook = true;
|
||||
final int reqItemId;
|
||||
if (player.getClassId().level() == 3)
|
||||
{
|
||||
if (skill.getLevel() > 100)
|
||||
reqItemId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK_OLD;
|
||||
}
|
||||
else if (_elvl == 0)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK;
|
||||
}
|
||||
else if (_elvl == 1)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK_V2;
|
||||
}
|
||||
else
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK_V3;
|
||||
}
|
||||
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)
|
||||
{
|
||||
if (spb != null)
|
||||
final LogRecord record = new LogRecord(Level.INFO, "Success");
|
||||
record.setParameters(new Object[]
|
||||
{
|
||||
_logEnchant.info("Success, Character:" + player.getName() + " [" + player.getObjectId() + "] Account:" + player.getAccountName() + " IP:" + player.getIPAddress() + ", +" + (skill.getLevel() % 100) + " " + skill.getName() + "(" + skill.getId() + "), " + spb.getName() + "(" + spb.getCount() + ") [" + spb.getObjectId() + "], " + rate);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logEnchant.info("Success, Character:" + player.getName() + " [" + player.getObjectId() + "] Account:" + player.getAccountName() + " IP:" + player.getIPAddress() + ", +" + (skill.getLevel() % 100) + " " + skill.getName() + "(" + skill.getId() + "), " + rate);
|
||||
}
|
||||
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
|
||||
{
|
||||
if (player.getClassId().level() == 3)
|
||||
{
|
||||
player.addSkill(SkillData.getInstance().getSkill(_skillId, s.getBaseLevel()), true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (spb != null)
|
||||
final int _clvl = ((((_skillLvl % 100) - 1) / 10) * 10) + ((_skillLvl / 1000) * 1000);
|
||||
player.addSkill(SkillData.getInstance().getSkill(_skillId, _clvl), 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[]
|
||||
{
|
||||
_logEnchant.info("Success, Character:" + player.getName() + " [" + player.getObjectId() + "] Account:" + player.getAccountName() + " IP:" + player.getIPAddress() + ", " + skill.getName() + "(" + skill.getId() + "), " + spb.getName() + "(" + spb.getCount() + ") [" + spb.getObjectId() + "], " + rate);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logEnchant.info("Success, Character:" + player.getName() + " [" + player.getObjectId() + "] Account:" + player.getAccountName() + " IP:" + player.getIPAddress() + ", " + skill.getName() + "(" + skill.getId() + "), " + rate);
|
||||
}
|
||||
player,
|
||||
skill,
|
||||
spb,
|
||||
rate
|
||||
});
|
||||
record.setLoggerName("skill");
|
||||
_logEnchant.log(record);
|
||||
}
|
||||
}
|
||||
|
||||
player.addSkill(skill, true);
|
||||
client.sendPacket(ExEnchantSkillResult.valueOf(true));
|
||||
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_ENCHANT_WAS_SUCCESSFUL_S1_HAS_BEEN_ENCHANTED);
|
||||
sm.addSkillName(_skillId);
|
||||
client.sendPacket(sm);
|
||||
|
||||
if (Config.DEBUG)
|
||||
{
|
||||
_log.finer("Learned skill ID: " + _skillId + " Level: " + _skillLvl + " for " + requiredSp + " SP, " + requiredAdena + " Adena.");
|
||||
}
|
||||
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.addSkill(SkillData.getInstance().getSkill(_skillId, s.getBaseLevel()), true);
|
||||
client.sendPacket(SystemMessageId.SKILL_ENCHANT_FAILED_THE_SKILL_WILL_BE_INITIALIZED);
|
||||
client.sendPacket(ExEnchantSkillResult.valueOf(false));
|
||||
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL);
|
||||
}
|
||||
}
|
||||
else if (_type == 1) // safe enchant
|
||||
{
|
||||
final int costMultiplier = EnchantSkillGroupsData.SAFE_ENCHANT_COST_MULTIPLIER;
|
||||
final int reqItemId;
|
||||
if (player.getClassId().level() == 3)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK_OLD;
|
||||
}
|
||||
else if (_elvl == 0)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK;
|
||||
}
|
||||
else if (_elvl == 1)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK_V2;
|
||||
}
|
||||
else
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK_V3;
|
||||
}
|
||||
final EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
||||
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||
if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final int requiredSp = esd.getSpCost() * costMultiplier;
|
||||
final int requireditems = esd.getAdenaCost() * costMultiplier;
|
||||
final int rate = esd.getRate(player);
|
||||
|
||||
if (player.getSp() >= requiredSp)
|
||||
{
|
||||
final 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)
|
||||
{
|
||||
final 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));
|
||||
|
||||
final 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)
|
||||
{
|
||||
final LogRecord record = new LogRecord(Level.INFO, "Safe Fail");
|
||||
record.setParameters(new Object[]
|
||||
{
|
||||
player,
|
||||
skill,
|
||||
spb,
|
||||
rate
|
||||
});
|
||||
record.setLoggerName("skill");
|
||||
_logEnchant.log(record);
|
||||
}
|
||||
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_ENCHANT_FAILED_THE_SKILL_WILL_BE_INITIALIZED);
|
||||
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
|
||||
{
|
||||
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL));
|
||||
}
|
||||
}
|
||||
else if (_type == 2) // untrain
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (_type == 3) // change route
|
||||
{
|
||||
final int reqItemId;
|
||||
if (player.getClassId().level() == 3)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK_OLD;
|
||||
}
|
||||
else if (_elvl == 0)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK;
|
||||
}
|
||||
else if (_elvl == 1)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK_V2;
|
||||
}
|
||||
else
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK_V3;
|
||||
}
|
||||
|
||||
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||
if (beforeEnchantSkillLevel <= 1000)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final int currentEnchantLevel = beforeEnchantSkillLevel % 1000;
|
||||
if (currentEnchantLevel != (_skillLvl % 1000))
|
||||
{
|
||||
return;
|
||||
}
|
||||
final EnchantSkillHolder esd = s.getEnchantSkillHolder(_skillLvl);
|
||||
|
||||
final int requiredSp = esd.getSpCost();
|
||||
final int requireditems = esd.getAdenaCost();
|
||||
|
||||
if (player.getSp() >= requiredSp)
|
||||
{
|
||||
final L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
|
||||
if (Config.ES_SP_BOOK_NEEDED && (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 = 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;
|
||||
}
|
||||
|
||||
final int levelPenalty = Rnd.get(Math.min(4, currentEnchantLevel));
|
||||
_skillLvl -= levelPenalty;
|
||||
if ((_skillLvl % 1000) == 0)
|
||||
{
|
||||
_skillLvl = s.getBaseLevel();
|
||||
}
|
||||
|
||||
if (Config.LOG_SKILL_ENCHANTS)
|
||||
{
|
||||
if (skill.getLevel() > 100)
|
||||
final LogRecord record = new LogRecord(Level.INFO, "Route Change");
|
||||
record.setParameters(new Object[]
|
||||
{
|
||||
if (spb != null)
|
||||
{
|
||||
_logEnchant.info("Fail, Character:" + player.getName() + " [" + player.getObjectId() + "] Account:" + player.getAccountName() + " IP:" + player.getIPAddress() + ", +" + (skill.getLevel() % 100) + " " + skill.getName() + "(" + skill.getId() + "), " + spb.getName() + "(" + spb.getCount() + ") [" + spb.getObjectId() + "], " + rate);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logEnchant.info("Fail, Character:" + player.getName() + " [" + player.getObjectId() + "] Account:" + player.getAccountName() + " IP:" + player.getIPAddress() + ", +" + (skill.getLevel() % 100) + " " + skill.getName() + "(" + skill.getId() + "), " + rate);
|
||||
}
|
||||
player,
|
||||
skill,
|
||||
spb
|
||||
});
|
||||
record.setLoggerName("skill");
|
||||
_logEnchant.log(record);
|
||||
}
|
||||
|
||||
player.addSkill(SkillData.getInstance().getSkill(_skillId, _skillLvl), 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));
|
||||
|
||||
final SystemMessage sm;
|
||||
if (levelPenalty == 0)
|
||||
{
|
||||
sm = SystemMessage.getSystemMessage(SystemMessageId.ENCHANT_SKILL_ROUTE_CHANGE_WAS_SUCCESSFUL_LV_OF_ENCHANT_SKILL_S1_WILL_REMAIN);
|
||||
sm.addSkillName(_skillId);
|
||||
}
|
||||
else
|
||||
{
|
||||
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 > 1000)
|
||||
{
|
||||
sm.addInt(_skillLvl % 1000);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (spb != null)
|
||||
{
|
||||
_logEnchant.info("Fail, Character:" + player.getName() + " [" + player.getObjectId() + "] Account:" + player.getAccountName() + " IP:" + player.getIPAddress() + ", " + skill.getName() + "(" + skill.getId() + "), " + spb.getName() + "(" + spb.getCount() + ") [" + spb.getObjectId() + "], " + rate);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logEnchant.info("Fail, Character:" + player.getName() + " [" + player.getObjectId() + "] Account:" + player.getAccountName() + " IP:" + player.getIPAddress() + ", " + skill.getName() + "(" + skill.getId() + "), " + rate);
|
||||
}
|
||||
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.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL));
|
||||
}
|
||||
}
|
||||
else if (_type == 4) // 100% enchant
|
||||
{
|
||||
final int reqItemId;
|
||||
if (player.getClassId().level() == 3)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.IMMORTAL_SCROLL;
|
||||
}
|
||||
else if (_elvl == 0)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.IMMORTAL_SCROLL;
|
||||
}
|
||||
else if (_elvl == 1)
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.IMMORTAL_SCROLL_V2;
|
||||
}
|
||||
else
|
||||
{
|
||||
reqItemId = EnchantSkillGroupsData.IMMORTAL_SCROLL_V3;
|
||||
}
|
||||
final int beforeEnchantSkillLevel = player.getSkillLevel(_skillId);
|
||||
if (beforeEnchantSkillLevel != s.getMinSkillLevel(_skillLvl))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
client.sendPacket(new UserInfo(player));
|
||||
final 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)
|
||||
{
|
||||
final 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));
|
||||
final 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);
|
||||
client.sendPacket(new ExEnchantSkillInfo(_skillId, afterEnchantSkillLevel));
|
||||
client.sendPacket(new ExEnchantSkillInfoDetail(0, _skillId, afterEnchantSkillLevel + 1, player));
|
||||
player.sendPacket(new ExEnchantSkillInfo(_skillId, afterEnchantSkillLevel));
|
||||
player.sendPacket(new ExEnchantSkillInfoDetail(1, _skillId, afterEnchantSkillLevel + 1, player));
|
||||
player.updateShortCuts(_skillId, afterEnchantSkillLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
client.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -32,12 +32,21 @@ public final class RequestExEnchantSkillInfo implements IClientIncomingPacket
|
||||
{
|
||||
private int _skillId;
|
||||
private int _skillLvl;
|
||||
private int _fullLvl;
|
||||
|
||||
@Override
|
||||
public boolean read(L2GameClient client, PacketReader packet)
|
||||
{
|
||||
_skillId = packet.readD();
|
||||
_skillLvl = packet.readD();
|
||||
_fullLvl = packet.readD();
|
||||
if (_fullLvl < 100)
|
||||
{
|
||||
_skillLvl = _fullLvl;
|
||||
}
|
||||
else
|
||||
{
|
||||
_skillLvl = _fullLvl >> 16;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -78,6 +87,6 @@ public final class RequestExEnchantSkillInfo implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
client.sendPacket(new ExEnchantSkillInfo(_skillId, _skillLvl));
|
||||
activeChar.sendPacket(new ExEnchantSkillInfo(_skillId, _skillLvl));
|
||||
}
|
||||
}
|
@@ -32,13 +32,22 @@ public final class RequestExEnchantSkillInfoDetail implements IClientIncomingPac
|
||||
private int _type;
|
||||
private int _skillId;
|
||||
private int _skillLvl;
|
||||
private int _fullLvl;
|
||||
|
||||
@Override
|
||||
public boolean read(L2GameClient client, PacketReader packet)
|
||||
{
|
||||
_type = packet.readD();
|
||||
_skillId = packet.readD();
|
||||
_skillLvl = packet.readD();
|
||||
_fullLvl = packet.readD();
|
||||
if (_fullLvl < 100)
|
||||
{
|
||||
_skillLvl = _fullLvl;
|
||||
}
|
||||
else
|
||||
{
|
||||
_skillLvl = _fullLvl >> 16;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -65,7 +74,7 @@ public final class RequestExEnchantSkillInfoDetail implements IClientIncomingPac
|
||||
}
|
||||
else if (_type == 2)
|
||||
{
|
||||
reqSkillLvl = _skillLvl + 1; // untrain
|
||||
return;
|
||||
}
|
||||
else if (_type == 3)
|
||||
{
|
||||
@@ -81,7 +90,7 @@ public final class RequestExEnchantSkillInfoDetail implements IClientIncomingPac
|
||||
}
|
||||
|
||||
// if reqlvl is 100,200,.. check base skill lvl enchant
|
||||
if ((reqSkillLvl % 100) == 0)
|
||||
if ((reqSkillLvl % 1000) == 0)
|
||||
{
|
||||
final L2EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(_skillId);
|
||||
if (esl != null)
|
||||
@@ -101,13 +110,14 @@ public final class RequestExEnchantSkillInfoDetail implements IClientIncomingPac
|
||||
else if (playerSkillLvl != reqSkillLvl)
|
||||
{
|
||||
// change route is different skill lvl but same enchant
|
||||
if ((_type == 3) && ((playerSkillLvl % 100) != (_skillLvl % 100)))
|
||||
if ((_type == 3) && ((playerSkillLvl % 1000) != (_skillLvl % 1000)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// send skill enchantment detail
|
||||
client.sendPacket(new ExEnchantSkillInfoDetail(_type, _skillId, _skillLvl, activeChar));
|
||||
final ExEnchantSkillInfoDetail esd = new ExEnchantSkillInfoDetail(_type, _skillId, _skillLvl, activeChar);
|
||||
activeChar.sendPacket(esd);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user