Advertisement
Guest User

RequestEnchantItem.java

a guest
Aug 3rd, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.24 KB | None | 0 0
  1. package net.sf.l2j.gameserver.network.clientpackets;
  2.  
  3. import net.sf.l2j.commons.config.Config;
  4. import net.sf.l2j.commons.util.Rnd;
  5. import net.sf.l2j.commons.util.security.PrivateAntiBot;
  6. import net.sf.l2j.gameserver.datatables.ArmorSetsTable;
  7. import net.sf.l2j.gameserver.datatables.SkillTable;
  8. import net.sf.l2j.gameserver.model.L2Skill;
  9. import net.sf.l2j.gameserver.model.L2World;
  10. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  11. import net.sf.l2j.gameserver.model.item.ArmorSet;
  12. import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  13. import net.sf.l2j.gameserver.model.item.kind.Armor;
  14. import net.sf.l2j.gameserver.model.item.kind.Item;
  15. import net.sf.l2j.gameserver.model.item.kind.Premium;
  16. import net.sf.l2j.gameserver.model.item.kind.Weapon;
  17. import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  18. import net.sf.l2j.gameserver.network.SystemMessageId;
  19. import net.sf.l2j.gameserver.network.serverpackets.EnchantResult;
  20. import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
  21. import net.sf.l2j.gameserver.network.serverpackets.ItemList;
  22. import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;
  23. import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  24. import net.sf.l2j.gameserver.util.Util;
  25.  
  26. public final class RequestEnchantItem extends AbstractEnchantPacket
  27. {
  28.     private int _objectId = 0;
  29.    
  30.     @Override
  31.     protected void readImpl()
  32.     {
  33.         _objectId = readD();
  34.     }
  35.    
  36.     @Override
  37.     protected void runImpl()
  38.     {
  39.         final L2PcInstance activeChar = getClient().getActiveChar();
  40.         if (activeChar == null || _objectId == 0)
  41.         {
  42.             return;
  43.         }
  44.        
  45.         if (!activeChar.isOnline() || getClient().isDetached())
  46.         {
  47.             activeChar.setActiveEnchantItem(null);
  48.             return;
  49.         }
  50.        
  51.         if (activeChar.isProcessingTransaction() || activeChar.isInStoreMode())
  52.         {
  53.             activeChar.sendPacket(SystemMessageId.CANNOT_ENCHANT_WHILE_STORE);
  54.             activeChar.setActiveEnchantItem(null);
  55.             activeChar.sendPacket(EnchantResult.CANCELLED);
  56.             return;
  57.         }
  58.        
  59.         ItemInstance item = activeChar.getInventory().getItemByObjectId(_objectId);
  60.         ItemInstance scroll = activeChar.getActiveEnchantItem();
  61.        
  62.         if (item == null || scroll == null)
  63.         {
  64.             activeChar.setActiveEnchantItem(null);
  65.             activeChar.sendPacket(SystemMessageId.ENCHANT_SCROLL_CANCELLED);
  66.             activeChar.sendPacket(EnchantResult.CANCELLED);
  67.             return;
  68.         }
  69.        
  70.         if (activeChar.isPassKey())
  71.         {
  72.             activeChar.sendChatMessage("Установите/Введите пароль от персонажа.");
  73.             return;
  74.         }
  75.        
  76.         // template for scroll
  77.         EnchantScroll scrollTemplate = getEnchantScroll(scroll);
  78.         if (scrollTemplate == null)
  79.         {
  80.             return;
  81.         }
  82.        
  83.         // first validation check
  84.         if (!scrollTemplate.isValid(item) || !isEnchantable(item))
  85.         {
  86.             activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITION);
  87.             activeChar.setActiveEnchantItem(null);
  88.             activeChar.sendPacket(EnchantResult.CANCELLED);
  89.             return;
  90.         }
  91.        
  92.         if (Config.SCROLL_STACKABLE)
  93.         {
  94.             scroll = activeChar.getInventory().destroyItem("Enchant", scroll.getObjectId(), 1, activeChar, item);
  95.         }
  96.         else
  97.         {
  98.             scroll = activeChar.getInventory().destroyItem("Enchant", scroll, activeChar, item);
  99.         }
  100.         if (scroll == null)
  101.         {
  102.             activeChar.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
  103.             Util.handleIllegalPlayerAction(activeChar, activeChar.getName() + " tried to enchant without scroll.", Config.DEFAULT_PUNISH);
  104.             activeChar.setActiveEnchantItem(null);
  105.             activeChar.sendPacket(EnchantResult.CANCELLED);
  106.             return;
  107.         }
  108.        
  109.         if (activeChar.getActiveTradeList() != null)
  110.         {
  111.             activeChar.cancelActiveTrade();
  112.             activeChar.sendPacket(SystemMessageId.TRADE_ATTEMPT_FAILED);
  113.             return;
  114.         }
  115.        
  116.         synchronized (item)
  117.         {
  118.             double chance = scrollTemplate.getChance(item);
  119.            
  120.             // last validation check
  121.             if (item.getOwnerId() != activeChar.getObjectId() || !isEnchantable(item) || chance < 0)
  122.             {
  123.                 activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITION);
  124.                 activeChar.setActiveEnchantItem(null);
  125.                 activeChar.sendPacket(EnchantResult.CANCELLED);
  126.                 return;
  127.             }
  128.            
  129.             chance *= activeChar.getPremiumAttribute(Premium.MODIFIER_ENCHANT_CHANCE);
  130.            
  131.             // success
  132.             if (Rnd.get() < chance)
  133.             {
  134.                 // announce the success
  135.                 SystemMessage sm;
  136.                
  137.                 if (item.getEnchantLevel() == 0)
  138.                 {
  139.                     sm = SystemMessage.getSystemMessage(SystemMessageId.S1_SUCCESSFULLY_ENCHANTED);
  140.                     sm.addItemName(item.getItemId());
  141.                     activeChar.sendPacket(sm);
  142.                 }
  143.                 else
  144.                 {
  145.                     sm = SystemMessage.getSystemMessage(SystemMessageId.S1_S2_SUCCESSFULLY_ENCHANTED);
  146.                     sm.addNumber(item.getEnchantLevel());
  147.                     sm.addItemName(item.getItemId());
  148.                     activeChar.sendPacket(sm);
  149.                 }
  150.                
  151.                 item.setEnchantLevel(item.getEnchantLevel() + 1);
  152.                 item.updateDatabase();
  153.                
  154.                 // If item is equipped, verify the skill obtention (+4 duals, +6 armorset).
  155.                 if (item.isEquipped())
  156.                 {
  157.                     final Item it = item.getItem();
  158.                    
  159.                     // Add skill bestowed by +4 duals.
  160.                     if (it instanceof Weapon && item.getEnchantLevel() == 4)
  161.                     {
  162.                         final L2Skill enchant4Skill = ((Weapon) it).getEnchant4Skill();
  163.                         if (enchant4Skill != null)
  164.                         {
  165.                             activeChar.addSkill(enchant4Skill, false);
  166.                             activeChar.sendSkillList();
  167.                         }
  168.                     }
  169.                     // Add skill bestowed by +6 armorset.
  170.                     else if (it instanceof Armor && item.getEnchantLevel() == 6)
  171.                     {
  172.                         // Checks if player is wearing a chest item
  173.                         final ItemInstance chestItem = activeChar.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST);
  174.                         if (chestItem != null)
  175.                         {
  176.                             final ArmorSet armorSet = ArmorSetsTable.getInstance().getSet(chestItem.getItemId());
  177.                             if (armorSet != null && armorSet.isEnchanted6(activeChar)) // has all parts of set enchanted to 6 or more
  178.                             {
  179.                                 final int skillId = armorSet.getEnchant6skillId();
  180.                                 if (skillId > 0)
  181.                                 {
  182.                                     final L2Skill skill = SkillTable.getInstance().getInfo(skillId, 1);
  183.                                     if (skill != null)
  184.                                     {
  185.                                         activeChar.addSkill(skill, false);
  186.                                         activeChar.sendSkillList();
  187.                                     }
  188.                                 }
  189.                             }
  190.                         }
  191.                     }
  192.                 }
  193.                 activeChar.sendPacket(EnchantResult.SUCCESS);
  194.             }
  195.             else
  196.             {
  197.                 // Drop passive skills from items.
  198.                 if (item.isEquipped())
  199.                 {
  200.                     final Item it = item.getItem();
  201.                    
  202.                     // Remove skill bestowed by +4 duals.
  203.                     if (it instanceof Weapon && item.getEnchantLevel() >= 4)
  204.                     {
  205.                         final L2Skill enchant4Skill = ((Weapon) it).getEnchant4Skill();
  206.                         if (enchant4Skill != null)
  207.                         {
  208.                             activeChar.removeSkill(enchant4Skill, false);
  209.                             activeChar.sendSkillList();
  210.                         }
  211.                     }
  212.                     // Add skill bestowed by +6 armorset.
  213.                     else if (it instanceof Armor && item.getEnchantLevel() >= 6)
  214.                     {
  215.                         // Checks if player is wearing a chest item
  216.                         final ItemInstance chestItem = activeChar.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST);
  217.                         if (chestItem != null)
  218.                         {
  219.                             final ArmorSet armorSet = ArmorSetsTable.getInstance().getSet(chestItem.getItemId());
  220.                             if (armorSet != null && armorSet.isEnchanted6(activeChar)) // has all parts of set enchanted to 6 or more
  221.                             {
  222.                                 final int skillId = armorSet.getEnchant6skillId();
  223.                                 if (skillId > 0)
  224.                                 {
  225.                                     final L2Skill skill = SkillTable.getInstance().getInfo(skillId, 1);
  226.                                     if (skill != null)
  227.                                     {
  228.                                         activeChar.removeSkill(skill, false);
  229.                                         activeChar.sendSkillList();
  230.                                     }
  231.                                 }
  232.                             }
  233.                         }
  234.                     }
  235.                 }
  236.                
  237.                 if (scrollTemplate.isBlessed())
  238.                 {
  239.                     // blessed enchant - clear enchant value
  240.                     activeChar.sendPacket(SystemMessageId.BLESSED_ENCHANT_FAILED);
  241.                    
  242.                     item.setEnchantLevel(Config.ENCHANT_FAILED_VALUE);
  243.                     item.updateDatabase();
  244.                     activeChar.sendPacket(EnchantResult.UNSUCCESS);
  245.                 }
  246.                 else
  247.                 {
  248.                     // enchant failed, destroy item
  249.                     int crystalId = item.getItem().getCrystalItemId();
  250.                     int count = item.getCrystalCount() - (item.getItem().getCrystalCount() + 1) / 2;
  251.                     if (count < 1)
  252.                     {
  253.                         count = 1;
  254.                     }
  255.                    
  256.                     ItemInstance destroyItem = activeChar.getInventory().destroyItem("Enchant", item, activeChar, null);
  257.                     if (destroyItem == null)
  258.                     {
  259.                         // unable to destroy item, cheater ?
  260.                         Util.handleIllegalPlayerAction(activeChar, "Unable to delete item on enchant failure from player " + activeChar.getName() + ", possible cheater !", Config.DEFAULT_PUNISH);
  261.                         activeChar.setActiveEnchantItem(null);
  262.                         activeChar.sendPacket(EnchantResult.CANCELLED);
  263.                         return;
  264.                     }
  265.                    
  266.                     if (crystalId != 0)
  267.                     {
  268.                         activeChar.getInventory().addItem("Enchant", crystalId, count, activeChar, destroyItem);
  269.                         activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S).addItemName(crystalId).addItemNumber(count));
  270.                     }
  271.                    
  272.                     InventoryUpdate iu = new InventoryUpdate();
  273.                     if (destroyItem.getCount() == 0)
  274.                     {
  275.                         iu.addRemovedItem(destroyItem);
  276.                     }
  277.                     else
  278.                     {
  279.                         iu.addModifiedItem(destroyItem);
  280.                     }
  281.                    
  282.                     activeChar.sendPacket(iu);
  283.                    
  284.                     // Messages.
  285.                     if (item.getEnchantLevel() > 0)
  286.                     {
  287.                         activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ENCHANTMENT_FAILED_S1_S2_EVAPORATED).addNumber(item.getEnchantLevel()).addItemName(item.getItemId()));
  288.                     }
  289.                     else
  290.                     {
  291.                         activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ENCHANTMENT_FAILED_S1_EVAPORATED).addItemName(item.getItemId()));
  292.                     }
  293.                    
  294.                     L2World.getInstance().removeObject(destroyItem);
  295.                     if (crystalId == 0)
  296.                     {
  297.                         activeChar.sendPacket(EnchantResult.UNK_RESULT_4);
  298.                     }
  299.                     else
  300.                     {
  301.                         activeChar.sendPacket(EnchantResult.UNK_RESULT_1);
  302.                     }
  303.                    
  304.                     StatusUpdate su = new StatusUpdate(activeChar);
  305.                     su.addAttribute(StatusUpdate.CUR_LOAD, activeChar.getCurrentLoad());
  306.                     activeChar.sendPacket(su);
  307.                 }
  308.             }
  309.            
  310.             activeChar.sendPacket(new ItemList(activeChar, false));
  311.             activeChar.broadcastUserInfo();
  312.             activeChar.setActiveEnchantItem(null);
  313.             if (Rnd.get(100) <= Config.ENCHANT_BOT_CHANCE && Config.ALLOW_PRIVATE_ANTI_BOT)
  314.             {
  315.                 PrivateAntiBot.privateantibot(activeChar);
  316.             }
  317.         }
  318.     }
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement