I try to adapt shops packets. SetPrivateStoreListBuy is one of them, and I got stupid issue with it. _items stays null with the current code, and for so, blocks at the current part of code :
Code: Select all
if (_items == null) { player.setPrivateStoreType(L2PcInstance.STORE_PRIVATE_NONE); player.broadcastUserInfo(); player.sendPacket(new PrivateStoreManageListBuy(player)); return; }
Code: Select all
/* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */package net.sf.l2j.gameserver.network.clientpackets; import net.sf.l2j.Config;import net.sf.l2j.gameserver.model.TradeList;import net.sf.l2j.gameserver.model.actor.L2Character;import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;import net.sf.l2j.gameserver.network.SystemMessageId;import net.sf.l2j.gameserver.network.serverpackets.PrivateStoreManageListBuy;import net.sf.l2j.gameserver.network.serverpackets.PrivateStoreMsgBuy;import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;import net.sf.l2j.gameserver.taskmanager.AttackStanceTaskManager; public final class SetPrivateStoreListBuy extends L2GameClientPacket{ private static final int BATCH_LENGTH = 12; // length of one item private Item[] _items = null; @Override protected void readImpl() { int count = readD(); if (count < 1 || count > Config.MAX_ITEM_IN_PACKET || count * BATCH_LENGTH != _buf.remaining()) return; _items = new Item[count]; for (int i = 0; i < count; i++) { int itemId = readD(); readH(); //TODO analyse this readH(); //TODO analyse this long cnt = readD(); int price = readD(); if (itemId < 1 || cnt < 1 || price < 0) { _items = null; return; } _items[i] = new Item(itemId, (int)cnt, price); } } @Override protected void runImpl() { L2PcInstance player = getClient().getActiveChar(); if (player == null) return; if (_items == null) { player.setPrivateStoreType(L2PcInstance.STORE_PRIVATE_NONE); player.broadcastUserInfo(); player.sendPacket(new PrivateStoreManageListBuy(player)); return; } if (!player.getAccessLevel().allowTransaction()) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); return; } if (AttackStanceTaskManager.getInstance().getAttackStanceTask(player) || (player.isCastingNow() || player.isCastingSimultaneouslyNow()) || player.isInDuel()) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT)); player.sendPacket(new PrivateStoreManageListBuy(player)); return; } if (player.isInsideZone(L2Character.ZONE_NOSTORE)) { player.sendPacket(new SystemMessage(SystemMessageId.NO_PRIVATE_STORE_HERE)); player.sendPacket(new PrivateStoreManageListBuy(player)); return; } TradeList tradeList = player.getBuyList(); tradeList.clear(); // Check maximum number of allowed slots for pvt shops if (_items.length > player.getPrivateBuyStoreLimit()) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED)); player.sendPacket(new PrivateStoreManageListBuy(player)); return; } int totalCost = 0; for (Item i : _items) { if (!i.addToTradeList(tradeList)) { player.sendPacket(new SystemMessage(SystemMessageId.EXCEEDED_THE_MAXIMUM)); player.sendPacket(new PrivateStoreManageListBuy(player)); return; } totalCost += i.getCost(); if (totalCost > Integer.MAX_VALUE) { player.sendPacket(new SystemMessage(SystemMessageId.EXCEEDED_THE_MAXIMUM)); player.sendPacket(new PrivateStoreManageListBuy(player)); return; } } // Check for available funds if (totalCost > player.getAdena()) { player.sendPacket(new SystemMessage(SystemMessageId.THE_PURCHASE_PRICE_IS_HIGHER_THAN_MONEY)); player.sendPacket(new PrivateStoreManageListBuy(player)); return; } player.sitDown(); player.setPrivateStoreType(L2PcInstance.STORE_PRIVATE_BUY); player.broadcastUserInfo(); player.broadcastPacket(new PrivateStoreMsgBuy(player)); } private static class Item { private final int _itemId, _count, _price; public Item(int id, int num, int pri) { _itemId = id; _count = num; _price = pri; } public boolean addToTradeList(TradeList list) { if ((Integer.MAX_VALUE / _count) < _price) return false; list.addItemByItemId(_itemId, _count, _price); return true; } public long getCost() { return _count * _price; } } @Override public String getType() { return "[C] 91 SetPrivateStoreListBuy"; }}
But the _items section stays null. If I remove the null check I got a NPE (that sounds logical, but that just to say it really blocks on that section).
Here are the others versions of that code : Interlude | Current unstable
Pastebin of my current version : http://pastebin.com/VUnHrk2j
Ty in advance if you find anything

Tk.
PS : I tested with one item/multiple items, and with different quantities aswell. The _lists still stay null. But packet is correctly send with the good infos.