RequestBuyProcure.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package net.sf.l2j.gameserver.clientpackets;
  16. import java.util.List;
  17. import javolution.util.FastList;
  18. import net.sf.l2j.Config;
  19. import net.sf.l2j.gameserver.datatables.ItemTable;
  20. import net.sf.l2j.gameserver.instancemanager.CastleManorManager;
  21. import net.sf.l2j.gameserver.instancemanager.CastleManorManager.CropProcure;
  22. import net.sf.l2j.gameserver.model.L2ItemInstance;
  23. import net.sf.l2j.gameserver.model.L2Manor;
  24. import net.sf.l2j.gameserver.model.L2Object;
  25. import net.sf.l2j.gameserver.model.actor.instance.L2ManorManagerInstance;
  26. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  27. import net.sf.l2j.gameserver.network.SystemMessageId;
  28. import net.sf.l2j.gameserver.serverpackets.ActionFailed;
  29. import net.sf.l2j.gameserver.serverpackets.InventoryUpdate;
  30. import net.sf.l2j.gameserver.serverpackets.StatusUpdate;
  31. import net.sf.l2j.gameserver.serverpackets.SystemMessage;
  32. import net.sf.l2j.gameserver.templates.L2Item;
  33. import net.sf.l2j.gameserver.util.Util;
  34. @SuppressWarnings("unused")
  35. public class RequestBuyProcure extends L2GameClientPacket {
  36. private static final String _C__C3_REQUESTBUYPROCURE = "[C] C3 RequestBuyProcure";
  37. private int _listId;
  38. private int _count;
  39. private int[] _items;
  40. private List<CropProcure> _procureList = new FastList<CropProcure>();
  41. @Override
  42. protected void readImpl()
  43. {
  44. _listId = readD();
  45. _count = readD();
  46. if(_count > 500) // protect server
  47. {
  48. _count = 0;
  49. return;
  50. }
  51. _items = new int[_count * 2];
  52. for (int i = 0; i < _count; i++)
  53. {
  54. long servise = readD();
  55. int itemId = readD(); _items[i * 2 + 0] = itemId;
  56. long cnt = readD();
  57. if (cnt > Integer.MAX_VALUE || cnt < 1)
  58. {
  59. _count=0; _items = null;
  60. return;
  61. }
  62. _items[i * 2 + 1] = (int)cnt;
  63. }
  64. }
  65. @Override
  66. protected void runImpl()
  67. {
  68. L2PcInstance player = getClient().getActiveChar();
  69. if (player == null) return;
  70. // Alt game - Karma punishment
  71. if (!Config.ALT_GAME_KARMA_PLAYER_CAN_SHOP && player.getKarma() > 0) return;
  72. L2Object target = player.getTarget();
  73. if(_count < 1)
  74. {
  75. sendPacket(ActionFailed.STATIC_PACKET);
  76. return;
  77. }
  78. long subTotal = 0;
  79. int tax = 0;
  80. // Check for buylist validity and calculates summary values
  81. int slots = 0;
  82. int weight = 0;
  83. L2ManorManagerInstance manor = (target instanceof L2ManorManagerInstance) ? (L2ManorManagerInstance)target : null;
  84. for (int i = 0; i < _count; i++)
  85. {
  86. int itemId = _items[i * 2 + 0];
  87. int count = _items[i * 2 + 1];
  88. int price = 0;
  89. if (count > Integer.MAX_VALUE)
  90. {
  91. Util.handleIllegalPlayerAction(player,"Warning!! Character "+player.getName()+" of account "+player.getAccountName()+" tried to purchase over "+Integer.MAX_VALUE+" items at the same time.", Config.DEFAULT_PUNISH);
  92. SystemMessage sm = new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED);
  93. sendPacket(sm);
  94. return;
  95. }
  96. L2Item template = ItemTable.getInstance().getTemplate(L2Manor.getInstance().getRewardItem(
  97. itemId,manor.getCastle().getCrop(itemId,CastleManorManager.PERIOD_CURRENT).getReward()));
  98. weight += count * template.getWeight();
  99. if (!template.isStackable()) slots += count;
  100. else if (player.getInventory().getItemByItemId(itemId) == null) slots++;
  101. }
  102. if (!player.getInventory().validateWeight(weight))
  103. {
  104. sendPacket(new SystemMessage(SystemMessageId.WEIGHT_LIMIT_EXCEEDED));
  105. return;
  106. }
  107. if (!player.getInventory().validateCapacity(slots))
  108. {
  109. sendPacket(new SystemMessage(SystemMessageId.SLOTS_FULL));
  110. return;
  111. }
  112. // Proceed the purchase
  113. InventoryUpdate playerIU = new InventoryUpdate();
  114. _procureList = manor.getCastle().getCropProcure(CastleManorManager.PERIOD_CURRENT);
  115. for (int i=0; i < _count; i++)
  116. {
  117. int itemId = _items[i * 2 + 0];
  118. int count = _items[i * 2 + 1];
  119. if (count < 0) count = 0;
  120. int rewardItemId=L2Manor.getInstance().getRewardItem(
  121. itemId,manor.getCastle().getCrop(itemId, CastleManorManager.PERIOD_CURRENT).getReward());
  122. int rewardItemCount = 1; //L2Manor.getInstance().getRewardAmount(itemId, manor.getCastle().getCropReward(itemId));
  123. rewardItemCount = count / rewardItemCount;
  124. // Add item to Inventory and adjust update packet
  125. L2ItemInstance item = player.getInventory().addItem("Manor",rewardItemId,rewardItemCount,player,manor);
  126. L2ItemInstance iteme = player.getInventory().destroyItemByItemId("Manor",itemId,count,player,manor);
  127. if (item == null || iteme == null)
  128. continue;
  129. playerIU.addRemovedItem(iteme);
  130. if (item.getCount() > rewardItemCount) playerIU.addModifiedItem(item);
  131. else playerIU.addNewItem(item);
  132. // Send Char Buy Messages
  133. SystemMessage sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
  134. sm.addItemName(item);
  135. sm.addNumber(rewardItemCount);
  136. player.sendPacket(sm);
  137. sm = null;
  138. //manor.getCastle().setCropAmount(itemId, manor.getCastle().getCrop(itemId, CastleManorManager.PERIOD_CURRENT).getAmount() - count);
  139. }
  140. // Send update packets
  141. player.sendPacket(playerIU);
  142. StatusUpdate su = new StatusUpdate(player.getObjectId());
  143. su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
  144. player.sendPacket(su);
  145. }
  146. @Override
  147. public String getType()
  148. {
  149. return _C__C3_REQUESTBUYPROCURE;
  150. }
  151. }