GOODPower

Untitled

Mar 18th, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.07 KB | None | 0 0
  1. package l2p.gameserver.clientpackets;
  2.  
  3.  
  4. import l2p.commons.dao.JdbcEntityState;
  5. import l2p.commons.util.Rnd;
  6. import l2p.gameserver.Config;
  7. import l2p.gameserver.data.xml.holder.EnchantItemHolder;
  8. import l2p.gameserver.model.Player;
  9. import l2p.gameserver.model.items.ItemInstance;
  10. import l2p.gameserver.model.items.PcInventory;
  11. import l2p.gameserver.serverpackets.components.SystemMsg;
  12. import l2p.gameserver.serverpackets.EnchantResult;
  13. import l2p.gameserver.serverpackets.InventoryUpdate;
  14. import l2p.gameserver.serverpackets.MagicSkillUse;
  15. import l2p.gameserver.templates.item.ItemTemplate;
  16. import l2p.gameserver.templates.item.support.EnchantScroll;
  17. import l2p.gameserver.utils.ItemFunctions;
  18. import l2p.gameserver.utils.Log;
  19.  
  20. public class RequestEnchantItem extends L2GameClientPacket
  21. {
  22.     private int _objectId, _catalystObjId;
  23.  
  24.     @Override
  25.     protected void readImpl()
  26.     {
  27.         _objectId = readD();
  28.         _catalystObjId = readD();
  29.     }
  30.  
  31.     @Override
  32.     protected void runImpl()
  33.     {
  34.         Player player = getClient().getActiveChar();
  35.         if(player == null)
  36.             return;
  37.  
  38.         if(player.isActionsDisabled())
  39.         {
  40.             player.setEnchantScroll(null);
  41.             player.sendActionFailed();
  42.             return;
  43.         }
  44.  
  45.         if(player.isInTrade())
  46.         {
  47.             player.setEnchantScroll(null);
  48.             player.sendActionFailed();
  49.             return;
  50.         }
  51.  
  52.         if(player.isInStoreMode())
  53.         {
  54.             player.setEnchantScroll(null);
  55.             player.sendPacket(EnchantResult.CANCEL);
  56.             player.sendPacket(SystemMsg.YOU_CANNOT_ENCHANT_WHILE_OPERATING_A_PRIVATE_STORE_OR_PRIVATE_WORKSHOP);
  57.             player.sendActionFailed();
  58.             return;
  59.         }
  60.  
  61.         PcInventory inventory = player.getInventory();
  62.         inventory.writeLock();
  63.         try
  64.         {
  65.             ItemInstance item = inventory.getItemByObjectId(_objectId);
  66.             ItemInstance catalyst = _catalystObjId > 0 ? inventory.getItemByObjectId(_catalystObjId) : null;
  67.             ItemInstance scroll = player.getEnchantScroll();
  68.  
  69.             if(item == null || scroll == null)
  70.             {
  71.                 player.sendActionFailed();
  72.                 return;
  73.             }
  74.  
  75.             EnchantScroll enchantScroll = EnchantItemHolder.getInstance().getEnchantScroll(scroll.getItemId());
  76.             if(enchantScroll == null)
  77.             {
  78.                 doEnchantOld(player, item, scroll, catalyst);
  79.                 return;
  80.             }
  81.  
  82.             if(enchantScroll.getMaxEnchant() != -1 && item.getEnchantLevel() >= enchantScroll.getMaxEnchant())
  83.             {
  84.                 player.sendPacket(EnchantResult.CANCEL);
  85.                 player.sendPacket(SystemMsg.INAPPROPRIATE_ENCHANT_CONDITIONS);
  86.                 player.sendActionFailed();
  87.                 return;
  88.             }
  89.  
  90.             if(enchantScroll.getItems().size() > 0)
  91.             {
  92.                 if(!enchantScroll.getItems().contains(item.getItemId()))
  93.                 {
  94.                     player.sendPacket(EnchantResult.CANCEL);
  95.                     player.sendPacket(SystemMsg.DOES_NOT_FIT_STRENGTHENING_CONDITIONS_OF_THE_SCROLL);
  96.                     player.sendActionFailed();
  97.                     return;
  98.                 }
  99.             }
  100.             else
  101.             {
  102.                 if(!enchantScroll.getGrades().contains(item.getCrystalType()))
  103.                 {
  104.                     player.sendPacket(EnchantResult.CANCEL);
  105.                     player.sendPacket(SystemMsg.DOES_NOT_FIT_STRENGTHENING_CONDITIONS_OF_THE_SCROLL);
  106.                     player.sendActionFailed();
  107.                     return;
  108.                 }
  109.             }
  110.  
  111.             if(!item.canBeEnchanted(false))
  112.             {
  113.                 player.sendPacket(EnchantResult.CANCEL);
  114.                 player.sendPacket(SystemMsg.INAPPROPRIATE_ENCHANT_CONDITIONS);
  115.                 player.sendActionFailed();
  116.                 return;
  117.             }
  118.  
  119.             if(!inventory.destroyItem(scroll, 1L) || catalyst != null && !inventory.destroyItem(catalyst, 1L))
  120.             {
  121.                 player.sendPacket(EnchantResult.CANCEL);
  122.                 player.sendActionFailed();
  123.                 return;
  124.             }
  125.  
  126.             boolean equipped = false;
  127.             if(equipped = item.isEquipped())
  128.                 inventory.unEquipItem(item);
  129.  
  130.             int safeEnchantLevel = item.getTemplate().getBodyPart() == ItemTemplate.SLOT_FULL_ARMOR ? 4 : 3;
  131.  
  132.             int chance = enchantScroll.getChance();
  133.             if(item.getEnchantLevel() < safeEnchantLevel)
  134.                 chance = 100;
  135.  
  136.             if(Rnd.chance(chance))
  137.             {
  138.                 item.setEnchantLevel(item.getEnchantLevel() + 1);
  139.                 item.setJdbcState(JdbcEntityState.UPDATED);
  140.                 item.update();
  141.  
  142.                 if(equipped)
  143.                     inventory.equipItem(item);
  144.  
  145.                 player.sendPacket(new InventoryUpdate().addModifiedItem(item));
  146.  
  147.                 player.sendPacket(EnchantResult.SUCESS);
  148.  
  149.                 if(enchantScroll.isHasVisualEffect() && item.getEnchantLevel() > 3)
  150.                     player.broadcastPacket(new MagicSkillUse(player, player, 5965, 1, 500, 1500));
  151.             }
  152.             else
  153.             {
  154.                 switch(enchantScroll.getResultType())
  155.                 {
  156.                     case CRYSTALS:
  157.                         if(item.isEquipped())
  158.                         player.sendDisarmMessage(item);
  159.  
  160.                         Log.LogItem(player, Log.EnchantFail, item);
  161.  
  162.                         if(!inventory.destroyItem(item, 1L))
  163.                         {
  164.                             player.sendActionFailed();
  165.                             return;
  166.                         }
  167.  
  168.                         int crystalId = item.getCrystalType().cry;
  169.                         if(crystalId > 0 && item.getTemplate().getCrystalCount() > 0)
  170.                         {
  171.                             int crystalAmount = (int) (item.getTemplate().getCrystalCount() * 0.87);
  172.                             if(item.getEnchantLevel() > 3)
  173.                                 crystalAmount += item.getTemplate().getCrystalCount() * 0.25 * (item.getEnchantLevel() - 3);
  174.                             if(crystalAmount < 1)
  175.                                 crystalAmount = 1;
  176.  
  177.                             player.sendPacket(new EnchantResult(1, crystalId, crystalAmount));
  178.                             ItemFunctions.addItem(player, crystalId, crystalAmount, true);
  179.                         }
  180.                         else
  181.                             player.sendPacket(EnchantResult.FAILED_NO_CRYSTALS);
  182.  
  183.                         if(enchantScroll.isHasVisualEffect())
  184.                             player.broadcastPacket(new MagicSkillUse(player, player, 5949, 1, 500, 1500));
  185.                         break;
  186.                     case DROP_ENCHANT:
  187.                         item.setEnchantLevel(0);
  188.                         item.setJdbcState(JdbcEntityState.UPDATED);
  189.                         item.update();
  190.  
  191.                         if(equipped)
  192.                             inventory.equipItem(item);
  193.  
  194.                         player.sendPacket(new InventoryUpdate().addModifiedItem(item));
  195.                         player.sendPacket(SystemMsg.THE_BLESSED_ENCHANT_FAILED);
  196.                         player.sendPacket(EnchantResult.BLESSED_FAILED);
  197.                         break;
  198.                     case NOTHING:
  199.                         player.sendPacket(EnchantResult.ANCIENT_FAILED);
  200.                         break;
  201.                 }
  202.             }
  203.         }
  204.         finally
  205.         {
  206.             inventory.writeUnlock();
  207.  
  208.             player.setEnchantScroll(null);
  209.             player.updateStats();
  210.         }
  211.     }
  212.  
  213.     @Deprecated
  214.     private static void doEnchantOld(Player player, ItemInstance item, ItemInstance scroll, ItemInstance catalyst)
  215.     {
  216.         PcInventory inventory = player.getInventory();
  217.         // Затычка, ибо клиент криво обрабатывает RequestExTryToPutEnchantSupportItem
  218.         if(!ItemFunctions.checkCatalyst(item, catalyst))
  219.             catalyst = null;
  220.  
  221.         if(!item.canBeEnchanted(true))
  222.         {
  223.             player.sendPacket(EnchantResult.CANCEL);
  224.             player.sendPacket(SystemMsg.INAPPROPRIATE_ENCHANT_CONDITIONS);
  225.             player.sendActionFailed();
  226.             return;
  227.         }
  228.  
  229.         int crystalId = ItemFunctions.getEnchantCrystalId(item, scroll, catalyst);
  230.  
  231.         if(crystalId == -1)
  232.         {
  233.             player.sendPacket(EnchantResult.CANCEL);
  234.             player.sendPacket(SystemMsg.DOES_NOT_FIT_STRENGTHENING_CONDITIONS_OF_THE_SCROLL);
  235.             player.sendActionFailed();
  236.             return;
  237.         }
  238.  
  239.         int scrollId = scroll.getItemId();
  240.  
  241.         if(scrollId == 13540 && item.getItemId() != 13539)
  242.         {
  243.             player.sendPacket(EnchantResult.CANCEL);
  244.             player.sendPacket(SystemMsg.DOES_NOT_FIT_STRENGTHENING_CONDITIONS_OF_THE_SCROLL);
  245.             player.sendActionFailed();
  246.             return;
  247.         }
  248.  
  249.         // ольф 21580(21581/21582)
  250.         if((scrollId == 21581 || scrollId == 21582) && item.getItemId() != 21580)
  251.         {
  252.             player.sendPacket(EnchantResult.CANCEL);
  253.             player.sendPacket(SystemMsg.DOES_NOT_FIT_STRENGTHENING_CONDITIONS_OF_THE_SCROLL);
  254.             player.sendActionFailed();
  255.             return;
  256.         }
  257.  
  258.         // TODO: [pchayka] временный хардкод до улучения системы описания свитков заточки
  259.         if(ItemFunctions.isDestructionWpnEnchantScroll(scrollId) && item.getEnchantLevel() >= 15 || ItemFunctions.isDestructionArmEnchantScroll(scrollId) && item.getEnchantLevel() >= 6)
  260.         {
  261.             player.sendPacket(EnchantResult.CANCEL);
  262.             player.sendPacket(SystemMsg.DOES_NOT_FIT_STRENGTHENING_CONDITIONS_OF_THE_SCROLL);
  263.             player.sendActionFailed();
  264.             return;
  265.         }
  266.  
  267.         boolean fail = false;
  268.         switch(item.getItemId())
  269.         {
  270.             case 13539:
  271.                 if(item.getEnchantLevel() >= Config.ENCHANT_MAX_MASTER_YOGI_STAFF)
  272.                     fail = true;
  273.                 break;
  274.             case 21580:
  275.             if(item.getEnchantLevel() >= 9)
  276.                 fail = true;
  277.             break;
  278.             default:
  279.                 if(item.getEnchantLevel() >= Config.ENCHANT_MAX)
  280.                     fail = true;
  281.                 break;
  282.  
  283.         }
  284.  
  285.         if(!inventory.destroyItem(scroll, 1L) || catalyst != null && !inventory.destroyItem(catalyst, 1L))
  286.         {
  287.             player.sendPacket(EnchantResult.CANCEL);
  288.             player.sendActionFailed();
  289.             return;
  290.         }
  291.  
  292.         if(fail)
  293.         {
  294.             player.sendPacket(EnchantResult.CANCEL);
  295.             player.sendPacket(SystemMsg.INAPPROPRIATE_ENCHANT_CONDITIONS);
  296.             player.sendActionFailed();
  297.             return;
  298.         }
  299.  
  300.         int itemType = item.getTemplate().getType2();
  301.         int safeEnchantLevel = item.getTemplate().getBodyPart() == ItemTemplate.SLOT_FULL_ARMOR ? Config.SAFE_ENCHANT_FULL_BODY : Config.SAFE_ENCHANT_COMMON;
  302.  
  303.         double chance;
  304.         if(item.getEnchantLevel() < safeEnchantLevel)
  305.             chance = 100;
  306.         else if(itemType == ItemTemplate.TYPE2_WEAPON)
  307.         {
  308.             chance = ItemFunctions.isCrystallEnchantScroll(scrollId) ? Config.ENCHANT_CHANCE_CRYSTAL_WEAPON : Config.ENCHANT_CHANCE_WEAPON;
  309.             /*int itemGrade = item.getTemplate().getItemGrade().cry;
  310.                             //TODO: Добавить флаг на is_mage_weapon и раскомминтить
  311.                             WeaponTemplate wepToEnchant = (WeaponTemplate) item.getTemplate();
  312.                             boolean magewep = (itemGrade >= ItemTemplate.CRYSTAL_C) && (wepToEnchant.getPDamage() - wepToEnchant.getMDamage() <= wepToEnchant.getPDamage() * 0.4D);
  313.                             if(magewep)
  314.                                 //TODO шанс сверить с оффовскими сурсами...
  315.                                 chance *= 0.67; // Шанс заточки магического оружия равняется 2/3 шанса заточки воинского оружия.*/
  316.         }
  317.         else if(itemType == ItemTemplate.TYPE2_SHIELD_ARMOR)
  318.             chance = ItemFunctions.isCrystallEnchantScroll(scrollId) ? Config.ENCHANT_CHANCE_CRYSTAL_ARMOR : Config.ENCHANT_CHANCE_ARMOR;
  319.         else if(itemType == ItemTemplate.TYPE2_ACCESSORY)
  320.             chance = ItemFunctions.isCrystallEnchantScroll(scrollId) ? Config.ENCHANT_CHANCE_CRYSTAL_ACCESSORY : Config.ENCHANT_CHANCE_ACCESSORY;
  321.         else
  322.         {
  323.             player.sendPacket(EnchantResult.CANCEL);
  324.             player.sendActionFailed();
  325.             return;
  326.         }
  327.  
  328.         if(ItemFunctions.isDivineEnchantScroll(scrollId)) // Item Mall divine
  329.             chance = 100;
  330.         else if(ItemFunctions.isItemMallEnchantScroll(scrollId)) // Item Mall normal/ancient
  331.             chance += 10;
  332.  
  333.         if(catalyst != null)
  334.             chance += ItemFunctions.getCatalystPower(catalyst.getItemId());
  335.  
  336.         if(scrollId == 13540)
  337.             chance = item.getEnchantLevel() < Config.SAFE_ENCHANT_MASTER_YOGI_STAFF ? 100 : Config.ENCHANT_CHANCE_MASTER_YOGI_STAFF;
  338.         else if(scrollId == 21581 || scrollId == 21582)
  339.             chance = item.getEnchantLevel() < 3 ? 100 : Config.ENCHANT_CHANCE_CRYSTAL_ARMOR;
  340.  
  341.         boolean equipped = false;
  342.         if(equipped = item.isEquipped())
  343.             inventory.unEquipItem(item);
  344.         if(Rnd.chance(chance))
  345.         {
  346.             item.setEnchantLevel(item.getEnchantLevel() + 1);
  347.             item.setJdbcState(JdbcEntityState.UPDATED);
  348.             item.update();
  349.  
  350.             if(equipped)
  351.                 inventory.equipItem(item);
  352.  
  353.             player.sendPacket(new InventoryUpdate().addModifiedItem(item));
  354.  
  355.             player.sendPacket(EnchantResult.SUCESS);
  356.  
  357.             if(scrollId == 13540 && item.getEnchantLevel() > 3 || Config.SHOW_ENCHANT_EFFECT_RESULT)
  358.                 player.broadcastPacket(new MagicSkillUse(player, player, 5965, 1, 500, 1500));
  359.         }
  360.         else if(ItemFunctions.isBlessedEnchantScroll(scrollId)) // фейл, но заточка блесед
  361.         {
  362.             item.setEnchantLevel(Config.SAFE_ENCHANT_MASTER_YOGI_STAFF);
  363.             item.setJdbcState(JdbcEntityState.UPDATED);
  364.             item.update();
  365.  
  366.             if(equipped)
  367.                 inventory.equipItem(item);
  368.  
  369.             player.sendPacket(new InventoryUpdate().addModifiedItem(item));
  370.             player.sendPacket(SystemMsg.THE_BLESSED_ENCHANT_FAILED);
  371.             player.sendPacket(EnchantResult.BLESSED_FAILED);
  372.         }
  373.         else if(ItemFunctions.isAncientEnchantScroll(scrollId) || ItemFunctions.isDestructionWpnEnchantScroll(scrollId) || ItemFunctions.isDestructionArmEnchantScroll(scrollId)) // фейл, но заточка ancient или destruction
  374.             player.sendPacket(EnchantResult.ANCIENT_FAILED);
  375.         else
  376.         // фейл, разбиваем вещь
  377.         {
  378.             if(item.isEquipped())
  379.                 player.sendDisarmMessage(item);
  380.  
  381.             Log.LogItem(player, Log.EnchantFail, item);
  382.  
  383.             if(!inventory.destroyItem(item, 1L))
  384.             {
  385.                 //TODO audit
  386.                 player.sendActionFailed();
  387.                 return;
  388.             }
  389.  
  390.             if(crystalId > 0 && item.getTemplate().getCrystalCount() > 0)
  391.             {
  392.                 int crystalAmount = (int) (item.getTemplate().getCrystalCount() * 0.87);
  393.                 if(item.getEnchantLevel() > 3)
  394.                     crystalAmount += item.getTemplate().getCrystalCount() * 0.25 * (item.getEnchantLevel() - 3);
  395.                 if(crystalAmount < 1)
  396.                     crystalAmount = 1;
  397.  
  398.                 player.sendPacket(new EnchantResult(1, crystalId, crystalAmount));
  399.                 ItemFunctions.addItem(player, crystalId, crystalAmount, true);
  400.             }
  401.             else
  402.                 player.sendPacket(EnchantResult.FAILED_NO_CRYSTALS);
  403.  
  404.             if(scrollId == 13540 || Config.SHOW_ENCHANT_EFFECT_RESULT)
  405.                 player.broadcastPacket(new MagicSkillUse(player, player, 5949, 1, 500, 1500));
  406.         }
  407.     }
  408. }
Advertisement
Add Comment
Please, Sign In to add comment