Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.72 KB | None | 0 0
  1. /*
  2.  * This program is free software: you can redistribute it and/or modify it under the terms of the
  3.  * GNU General Public License as published by the Free Software Foundation, either version 3 of the
  4.  * License, or (at your option) any later version.
  5.  *
  6.  * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
  7.  * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  8.  * General Public License for more details.
  9.  *
  10.  * You should have received a copy of the GNU General Public License along with this program. If
  11.  * not, see <http://www.gnu.org/licenses/>.
  12.  */
  13. package com.l2jserver.gameserver.network.clientpackets.skill;
  14.  
  15. import java.util.logging.Level;
  16. import java.util.logging.LogRecord;
  17. import java.util.logging.Logger;
  18.  
  19. import com.l2jserver.Config;
  20. import com.l2jserver.gameserver.SingleTaskQueue;
  21. import com.l2jserver.gameserver.datatables.SkillTable;
  22. import com.l2jserver.gameserver.datatables.SkillTreeTable;
  23. import com.l2jserver.gameserver.model.L2EnchantSkillLearn;
  24. import com.l2jserver.gameserver.model.L2ItemInstance;
  25. import com.l2jserver.gameserver.model.L2ShortCut;
  26. import com.l2jserver.gameserver.model.L2Skill;
  27. import com.l2jserver.gameserver.model.L2EnchantSkillLearn.EnchantSkillDetail;
  28. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  29. import com.l2jserver.gameserver.network.SystemMessageId;
  30. import com.l2jserver.gameserver.network.SystemMessageId2;
  31. import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
  32. import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
  33. import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillInfo;
  34. import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillInfoDetail;
  35. import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillResult;
  36. import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
  37. import com.l2jserver.gameserver.network.serverpackets.ItemList;
  38. import com.l2jserver.gameserver.network.serverpackets.ShortCutInit;
  39. import com.l2jserver.gameserver.network.serverpackets.ShortCutRegister;
  40. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  41. import com.l2jserver.gameserver.network.serverpackets.UserInfo;
  42. import com.l2jserver.util.StringUtil;
  43. import com.l2jserver.util.Rnd;
  44.  
  45. /**
  46.  * based on previous version by -Wooden-
  47.  *
  48.  * @author Probe
  49.  *
  50.  */
  51. public final class RequestExEnchantSkill extends L2GameClientPacket
  52. {
  53.    
  54.     private static final String _C__D0_07_REQUESTEXENCHANTSKILL = "[C] D0:07 RequestExEnchantSkill";
  55.     protected static final Logger _log = Logger.getLogger(RequestAquireSkill.class.getName());
  56.     protected static final Logger _logEnchant = Logger.getLogger("enchant");
  57.     private int _skillId;
  58.     private int _skillLvl;
  59.    
  60.     @Override
  61.     protected void readImpl()
  62.     {
  63.         _skillId = readD();
  64.         _skillLvl = readD();
  65.     }
  66.    
  67.     @Override
  68.     protected void runImpl()
  69.     {
  70.         L2PcInstance player = getClient().getActiveChar();
  71.         if (player == null)
  72.         {
  73.             return;
  74.         }
  75.        
  76.         if (player.isInCombat())
  77.         {
  78.             return;
  79.         }
  80.        
  81.         // requires to have 3rd class quest completed
  82.         if (player.getClassId().level() < 3)
  83.         {
  84.             player.sendPacket(SystemMessageId2.YOU_CANNOT_USE_SKILL_ENCHANT_IN_THIS_CLASS);
  85.             return;
  86.         }
  87.        
  88.         if (player.getLevel() < 76)
  89.         {
  90.             player.sendPacket(SystemMessageId2.YOU_CANNOT_USE_SKILL_ENCHANT_ON_THIS_LEVEL);
  91.             return;
  92.         }
  93.        
  94.         if (!player.isAllowedToEnchantSkills())
  95.         {
  96.             player.sendPacket(SystemMessageId2.YOU_CANNOT_USE_SKILL_ENCHANT_ATTACKING_TRANSFORMED_BOAT);
  97.             return;
  98.         }
  99.        
  100.         SingleTaskQueue.getInstance().addTask(new Task(player, _skillId, _skillLvl));
  101.     }
  102.    
  103.     @Override
  104.     public String getType()
  105.     {
  106.         return _C__D0_07_REQUESTEXENCHANTSKILL;
  107.     }
  108.    
  109.     static class Task implements Runnable
  110.     {
  111.        
  112.         private final L2PcInstance player;
  113.         private final int skillId;
  114.         private final int skillLvl;
  115.        
  116.         Task(final L2PcInstance player, final int skillId, final int skillLvl)
  117.         {
  118.             this.player = player;
  119.             this.skillId = skillId;
  120.             this.skillLvl = skillLvl;
  121.         }
  122.        
  123.         @Override
  124.         public void run()
  125.         {
  126.             L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);
  127.            
  128.             if (skill == null)
  129.             {
  130.                 return;
  131.             }
  132.            
  133.             boolean linked = false;
  134.             L2Skill _linkedSkill = null;
  135.            
  136.             if (player.getLinkedSkills() != null && !player.getLinkedSkills().isEmpty())
  137.             {
  138.                 for (L2Skill linkedSkill : player.getLinkedSkills())
  139.                 {
  140.                     if (linkedSkill.getId() == skillId)
  141.                     {
  142.                         linked = true;
  143.                         _linkedSkill = linkedSkill;
  144.                         break;
  145.                     }
  146.                 }
  147.             }
  148.            
  149.             final int costMultiplier = skill.getEnchantCostMultiplier();
  150.             final int reqItemId = SkillTreeTable.NORMAL_ENCHANT_BOOK;
  151.            
  152.             final L2EnchantSkillLearn s = SkillTreeTable.getInstance().getSkillEnchantmentBySkillId(skillId);
  153.            
  154.             if (s == null)
  155.             {
  156.                 return;
  157.             }
  158.            
  159.             EnchantSkillDetail esd = s.getEnchantSkillDetail(skillLvl);
  160.            
  161.             if (esd == null)
  162.             {
  163.                 return;
  164.             }
  165.            
  166.             if (player.getSkillLevel(skillId) != esd.getMinSkillLevel())
  167.             {
  168.                 return;
  169.             }
  170.            
  171.             int requiredSp = esd.getSpCost(player.getClassId().isMage()) * costMultiplier * SkillTreeTable.NORMAL_ENCHANT_COST_MULTIPLIER;
  172.             final int requiredAdena = (int) (esd.getAdenaCost() * costMultiplier * Config.RATE_ADENA_ENCHANT_SKILL);
  173.             final int enchantMode = esd.getEnchantMode();
  174.             final int rate = SkillTreeTable.getInstance().getEnchantSkillRate(player, skillLvl, enchantMode);
  175.             boolean enchantSuccess = false;
  176.             int newLevel;
  177.            
  178.             if (player.getSp() >= requiredSp)
  179.             {
  180.                 if (player.getAdena() >= requiredAdena)
  181.                 {
  182.                     // only first lvl requires book
  183.                     final boolean usesBook = skillLvl % 100 == 1; // 101, 201, 301 ...
  184.                     final L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
  185.                    
  186.                     if (Config.ES_SP_BOOK_NEEDED && usesBook)
  187.                     {
  188.                         // Haven't spellbook
  189.                         if (spb == null)
  190.                         {
  191.                             player.sendPacket(SystemMessageId.YOU_DONT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
  192.                             return;
  193.                         }
  194.                     }
  195.                    
  196.                     player.getStat().removeSp(requiredSp);
  197.                     player.reduceAdena("Consume", requiredAdena, player, false);
  198.                    
  199.                     if (Config.ES_SP_BOOK_NEEDED && usesBook)
  200.                     {
  201.                         player.destroyItem("Consume", spb.getObjectId(), 1, player, true);
  202.                     }
  203.                    
  204.                     // ok. Destroy ONE copy of the book
  205.                     if (Rnd.get(100) <= rate)
  206.                     {
  207.                         if (Config.LOG_SKILL_ENCHANTS)
  208.                         {
  209.                             final LogRecord record = new LogRecord(Level.INFO, "Success");
  210.                             record.setParameters(new Object[] { player, skill, spb, rate });
  211.                             record.setLoggerName("skill");
  212.                             _logEnchant.log(record);
  213.                         }
  214.                        
  215.                         if (linked && _linkedSkill != null)
  216.                         {
  217.                             player.removeSkillLinked(_linkedSkill);
  218.                         }
  219.                        
  220.                         player.addSkill(skill, true, linked);
  221.                        
  222.                         newLevel = skill.getLevel();
  223.                        
  224.                         if (_log.isLoggable(Level.FINE))
  225.                         {
  226.                             _log.fine(StringUtil.concat("Learned skill ID: ", String.valueOf(skillId), " Level: ", String.valueOf(skillLvl), " for ", String.valueOf(requiredSp), " SP, "));
  227.                         }
  228.                        
  229.                         player.sendPacket(new UserInfo(player));
  230.                         player.sendPacket(new ExBrExtraUserInfo(player));
  231.                        
  232.                         final SystemMessage sm = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCEEDED_IN_ENCHANTING_THE_SKILL_S1);
  233.                         sm.addSkillName(skillId);
  234.                         player.sendPacket(sm);
  235.                         enchantSuccess = true;
  236.                     }
  237.                     else
  238.                     {
  239.                         newLevel = SkillTable.getSkillLevelCount(skill.getId());
  240.                         skill = SkillTable.getInstance().getInfo(skillId, newLevel);
  241.                        
  242.                         if (linked && _linkedSkill != null)
  243.                         {
  244.                             player.removeSkillLinked(_linkedSkill);
  245.                         }
  246.                        
  247.                         player.addSkill(skill, true, linked);
  248.                        
  249.                         final int route = esd.getLevel() / 100;
  250.                         newLevel = route * 100 + 1;
  251.                         esd = s.getEnchantSkillDetail(newLevel);
  252.                        
  253.                         requiredSp = esd.getSpCost(player.getClassId().isMage()) * costMultiplier * SkillTreeTable.NORMAL_ENCHANT_COST_MULTIPLIER;
  254.                        
  255.                         player.sendSkillList();
  256.                         player.sendPacket(SystemMessageId.YOU_HAVE_FAILED_TO_ENCHANT_THE_SKILL_S1);
  257.                        
  258.                         if (Config.LOG_SKILL_ENCHANTS)
  259.                         {
  260.                             final LogRecord record = new LogRecord(Level.INFO, "Fail");
  261.                             record.setParameters(new Object[] { player, skill, spb, rate });
  262.                             record.setLoggerName("skill");
  263.                             _logEnchant.log(record);
  264.                         }
  265.                     }
  266.                     // update packets info as retail
  267.                     player.sendPacket(new InventoryUpdate());
  268.                     player.sendPacket(new ItemList(player, false));
  269.                     player.sendPacket(new ShortCutInit(player));
  270.                     player.sendPacket(ExEnchantSkillResult.valueOf(enchantSuccess));
  271.                     player.sendPacket(new ExEnchantSkillInfo(skill));
  272.                     player.sendPacket(new ExEnchantSkillInfoDetail(enchantMode, skillId, newLevel, requiredSp, rate));
  273.                    
  274.                     player.sendSkillList();
  275.                     updateSkillShortcuts();
  276.                    
  277.                 }
  278.                 else
  279.                 {
  280.                     player.sendPacket(SystemMessageId.YOU_DONT_HAVE_ALL_OF_THE_ITEMS_NEEDED_TO_ENCHANT_THAT_SKILL);
  281.                 }
  282.             }
  283.             else
  284.             {
  285.                 player.sendPacket(SystemMessageId.YOU_DONT_HAVE_ENOUGH_SP_TO_ENCHANT_THAT_SKILL);
  286.             }
  287.         }
  288.        
  289.         private void updateSkillShortcuts()
  290.         {
  291.             // update all the shortcuts to this skill
  292.             final L2ShortCut[] allShortCuts = player.getSettingsManagement().getAllShortCuts();
  293.            
  294.             for (final L2ShortCut sc : allShortCuts)
  295.             {
  296.                 if (sc.getId() == skillId && sc.getType() == L2ShortCut.TYPE_SKILL)
  297.                 {
  298.                     final L2ShortCut newsc = new L2ShortCut(sc.getSlot(), sc.getPage(), sc.getType(), sc.getId(), player.getSkillLevel(skillId), 1);
  299.                     player.sendPacket(new ShortCutRegister(newsc));
  300.                     player.getSettingsManagement().registerShortCut(newsc);
  301.                 }
  302.             }
  303.         }
  304.     }
  305. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement