Advertisement
Guest User

Untitled

a guest
Dec 10th, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.26 KB | None | 0 0
  1. package l2f.gameserver.network.clientpackets;
  2.  
  3. import l2f.commons.math.SafeMath;
  4. import l2f.commons.configuration.Config;
  5. import l2f.gameserver.model.Creature;
  6. import l2f.gameserver.model.Player;
  7. import l2f.gameserver.model.items.ItemInstance;
  8. import l2f.gameserver.model.items.TradeItem;
  9. import l2f.gameserver.network.serverpackets.components.CustomMessage;
  10. import l2f.gameserver.network.serverpackets.components.SystemMsg;
  11. import l2f.gameserver.utils.TradeHelper;
  12. import org.apache.commons.lang3.ArrayUtils;
  13.  
  14. import java.util.ArrayList;
  15. import java.util.List;
  16.  
  17. public class RequestPrivateStoreBuySellList extends L2GameClientPacket
  18. {
  19. private int _buyerId, _count;
  20. private int[] _items; // object id
  21. private long[] _itemQ; // count
  22. private long[] _itemP; // price
  23.  
  24. @Override
  25. protected void readImpl()
  26. {
  27. _buyerId = readD();
  28. _count = readD();
  29.  
  30. if (_count * 28 > _buf.remaining() || _count > Short.MAX_VALUE || _count < 1)
  31. {
  32. _count = 0;
  33. return;
  34. }
  35.  
  36. _items = new int[_count];
  37. _itemQ = new long[_count];
  38. _itemP = new long[_count];
  39.  
  40. for (int i = 0; i < _count; i++)
  41. {
  42. _items[i] = readD();
  43. readD(); //itemId
  44. readH();
  45. readH();
  46. _itemQ[i] = readQ();
  47. _itemP[i] = readQ();
  48.  
  49. if (_itemQ[i] < 1 || _itemP[i] < 1 || ArrayUtils.indexOf(_items, _items[i]) < i)
  50. {
  51. _count = 0;
  52. break;
  53. }
  54. }
  55. }
  56.  
  57. @Override
  58. protected void runImpl()
  59. {
  60. Player seller = getClient().getActiveChar();
  61. if (seller == null || _count == 0)
  62. return;
  63.  
  64. if (seller.isActionsDisabled() || seller.isBlocked() || !Config.ALLOW_PRIVATE_STORES)
  65. {
  66. seller.sendActionFailed();
  67. return;
  68. }
  69.  
  70. if (seller.isInStoreMode())
  71. {
  72. seller.sendPacket(SystemMsg.WHILE_OPERATING_A_PRIVATE_STORE_OR_WORKSHOP_YOU_CANNOT_DISCARD_DESTROY_OR_TRADE_AN_ITEM);
  73. return;
  74. }
  75.  
  76. if (seller.isInTrade())
  77. {
  78. seller.sendActionFailed();
  79. return;
  80. }
  81.  
  82. if (seller.isFishing())
  83. {
  84. seller.sendPacket(SystemMsg.YOU_CANNOT_DO_THAT_WHILE_FISHING_2);
  85. return;
  86. }
  87.  
  88. if (!seller.getPlayerAccess().UseTrade)
  89. {
  90. seller.sendPacket(SystemMsg.SOME_LINEAGE_II_FEATURES_HAVE_BEEN_LIMITED_FOR_FREE_TRIALS_____);
  91. return;
  92. }
  93.  
  94. Player buyer = (Player) seller.getVisibleObject(_buyerId);
  95. if (buyer == null || buyer.getPrivateStoreType() != Player.STORE_PRIVATE_BUY || !seller.isInRangeZ(buyer, Creature.INTERACTION_DISTANCE))
  96. {
  97. seller.sendPacket(SystemMsg.THE_ATTEMPT_TO_SELL_HAS_FAILED);
  98. seller.sendActionFailed();
  99. return;
  100. }
  101.  
  102. List<TradeItem> buyList = buyer.getBuyList();
  103. if (buyList.isEmpty())
  104. {
  105. seller.sendPacket(SystemMsg.THE_ATTEMPT_TO_SELL_HAS_FAILED);
  106. seller.sendActionFailed();
  107. return;
  108. }
  109.  
  110. List<TradeItem> sellList = new ArrayList<TradeItem>();
  111.  
  112. long totalCost = 0;
  113. int slots = 0;
  114. long weight = 0;
  115.  
  116. buyer.getInventory().writeLock();
  117. seller.getInventory().writeLock();
  118. try
  119. {
  120. loop: for(int i = 0; i < _count; i++)
  121. {
  122. int objectId = _items[i];
  123. long count = _itemQ[i];
  124. long price = _itemP[i];
  125.  
  126. ItemInstance item = seller.getInventory().getItemByObjectId(objectId);
  127. if (item == null || item.getCount() < count || !item.canBeTraded(seller))
  128. break loop;
  129.  
  130. TradeItem si = null;
  131.  
  132. for (TradeItem bi : buyList)
  133. if (bi.getItemId() == item.getItemId())
  134. if (bi.getOwnersPrice() == price)
  135. {
  136. if (count > bi.getCount())
  137. break loop;
  138.  
  139. totalCost = SafeMath.addAndCheck(totalCost, SafeMath.mulAndCheck(count, price));
  140. weight = SafeMath.addAndCheck(weight, SafeMath.mulAndCheck(count, item.getTemplate().getWeight()));
  141. if (!item.isStackable() || buyer.getInventory().getItemByItemId(item.getItemId()) == null)
  142. slots++;
  143.  
  144. si = new TradeItem();
  145. si.setObjectId(objectId);
  146. si.setItemId(item.getItemId());
  147. si.setCount(count);
  148. si.setOwnersPrice(price);
  149.  
  150. sellList.add(si);
  151. break;
  152. }
  153. }
  154. }
  155. catch (ArithmeticException ae)
  156. {
  157. //TODO audit
  158. sellList.clear();
  159. seller.sendPacket(SystemMsg.YOU_HAVE_EXCEEDED_THE_QUANTITY_THAT_CAN_BE_INPUTTED);
  160. return;
  161. }
  162. finally
  163. {
  164. try
  165. {
  166. if (sellList.size() != _count)
  167. {
  168. seller.sendPacket(SystemMsg.THE_ATTEMPT_TO_SELL_HAS_FAILED);
  169. seller.sendActionFailed();
  170. return;
  171. }
  172.  
  173. if (!buyer.getInventory().validateWeight(weight))
  174. {
  175. buyer.sendPacket(SystemMsg.YOU_HAVE_EXCEEDED_THE_WEIGHT_LIMIT);
  176. seller.sendPacket(SystemMsg.THE_ATTEMPT_TO_SELL_HAS_FAILED);
  177. seller.sendActionFailed();
  178. return;
  179. }
  180.  
  181. if (!buyer.getInventory().validateCapacity(slots))
  182. {
  183. buyer.sendPacket(SystemMsg.YOUR_INVENTORY_IS_FULL);
  184. seller.sendPacket(SystemMsg.THE_ATTEMPT_TO_SELL_HAS_FAILED);
  185. seller.sendActionFailed();
  186. return;
  187. }
  188.  
  189. if (!buyer.reduceAdena(totalCost, "Private Store Buy from" + seller.toString()))
  190. {
  191. buyer.sendPacket(SystemMsg.YOU_DO_NOT_HAVE_ENOUGH_ADENA);
  192. seller.sendPacket(SystemMsg.THE_ATTEMPT_TO_SELL_HAS_FAILED);
  193. seller.sendActionFailed();
  194. return;
  195. }
  196.  
  197. ItemInstance item;
  198. for (TradeItem si : sellList)
  199. {
  200. item = seller.getInventory().removeItemByObjectId(si.getObjectId(), si.getCount(), "Private Store Sell to " + buyer.toString());
  201. for (TradeItem bi : buyList)
  202. if (bi.getItemId() == si.getItemId())
  203. if (bi.getOwnersPrice() == si.getOwnersPrice())
  204. {
  205. bi.setCount(bi.getCount() - si.getCount());
  206. if (bi.getCount() < 1L)
  207. buyList.remove(bi);
  208. break;
  209. }
  210. buyer.getInventory().addItem(item, "Private Store Buy from " + seller.toString());
  211. TradeHelper.purchaseItem(buyer, seller, si);
  212. }
  213.  
  214. long tax = TradeHelper.getTax(seller, totalCost);
  215. if (tax > 0)
  216. {
  217. totalCost -= tax;
  218. seller.sendMessage(new CustomMessage("trade.HavePaidTax", seller).addNumber(tax));
  219. }
  220.  
  221. seller.addAdena(totalCost, "Private Store Sell to " + buyer.toString());
  222. buyer.saveTradeList();
  223. }
  224. finally
  225. {
  226. seller.getInventory().writeUnlock();
  227. buyer.getInventory().writeUnlock();
  228. }
  229. }
  230.  
  231. if (buyList.isEmpty())
  232. TradeHelper.cancelStore(buyer);
  233.  
  234. seller.sendChanges();
  235. buyer.sendChanges();
  236.  
  237. seller.sendActionFailed();
  238. }
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement