소스 검색

Items from active tradelist can't be deposited into warehouse or freighted.
Need additional retail check about possibility to open warehouse window while trade..

_DS_ 16 년 전
부모
커밋
0b4a29fa70

+ 34 - 22
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestPackageSend.java

@@ -14,13 +14,11 @@
  */
 package net.sf.l2j.gameserver.network.clientpackets;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
 import java.util.logging.Logger;
 
 import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.model.L2ItemInstance;
+import net.sf.l2j.gameserver.model.TradeList;
 import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2WarehouseInstance;
@@ -47,7 +45,7 @@ public final class RequestPackageSend extends L2GameClientPacket
 
 	private static final int BATCH_LENGTH = 12; // length of the one item
 
-	private List<Item> _items = null;
+	private Item[] _items = null;
 	private int _objectID;
 
 	@Override
@@ -61,12 +59,12 @@ public final class RequestPackageSend extends L2GameClientPacket
 		{
 			return;
 		}
-		_items = new ArrayList<Item>(count);
+		_items = new Item[count];
 		for(int i = 0; i < count; i++)
 		{
 			int id = readD(); //this is some id sent in PackageSendableList
 			long cnt = readQ();
-			_items.add(new Item(id, cnt));
+			_items[i] = new Item(id, cnt);
 		}
 	}
 
@@ -77,7 +75,7 @@ public final class RequestPackageSend extends L2GameClientPacket
 	protected
 	void runImpl()
 	{
-		if (_items == null || _items.isEmpty() || !Config.ALLOW_FREIGHT)
+		if (_items == null || !Config.ALLOW_FREIGHT)
 			return;
 
 		L2PcInstance player = getClient().getActiveChar();
@@ -112,21 +110,18 @@ public final class RequestPackageSend extends L2GameClientPacket
 		}
 
     	// Freight price from config or normal price per item slot (30)
-		long fee = _items.size() * Config.ALT_GAME_FREIGHT_PRICE;
+		long fee = _items.length * Config.ALT_GAME_FREIGHT_PRICE;
 		long currentAdena = player.getAdena();
 		int slots = 0;
 
-		Iterator<Item> iter = _items.iterator();
-		while (iter.hasNext())
+		for (Item i : _items)
 		{
-			Item i = iter.next();
 			// Check validity of requested item
-			L2ItemInstance item = player.checkItemManipulation(i.objectId, i.count, "deposit");
+			L2ItemInstance item = player.checkItemManipulation(i.getObjectId(), i.getCount(), "deposit");
 			if (item == null)
 			{
 				_log.warning("Error depositing a warehouse object for char "+player.getName()+" (validity check)");
-				iter.remove();
-				continue;
+				return;
 			}
 
 			if (!item.isTradeable() || item.getItemType() == L2EtcItemType.QUEST)
@@ -134,9 +129,9 @@ public final class RequestPackageSend extends L2GameClientPacket
 
 			// Calculate needed adena and slots
 			if (item.getItemId() == ADENA_ID)
-				currentAdena -= i.count;
+				currentAdena -= i.getCount();
 			if (!item.isStackable())
-				slots += i.count;
+				slots += i.getCount();
 			else if (warehouse.getItemByItemId(item.getItemId()) == null)
 				slots++;
 		}
@@ -155,11 +150,14 @@ public final class RequestPackageSend extends L2GameClientPacket
 			return;
 		}
 
+		// get current tradelist if any
+		TradeList trade = player.getActiveTradeList();
+
 		// Proceed to the transfer
 		InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate();
 		for (Item i : _items)
 		{
-			L2ItemInstance oldItem = player.getInventory().getItemByObjectId(i.objectId);
+			L2ItemInstance oldItem = player.getInventory().getItemByObjectId(i.getObjectId());
 			if (oldItem == null)
 			{
 				_log.warning("Error depositing a warehouse object for char "+player.getName()+" (olditem == null)");
@@ -169,7 +167,11 @@ public final class RequestPackageSend extends L2GameClientPacket
 			if (oldItem.isHeroItem())
 				continue;
 
-			L2ItemInstance newItem = player.getInventory().transferItem(warehouse.getName(), i.objectId, i.count, warehouse, player, manager);
+			// skip items from active tradelist, even for stackable
+			if (trade != null && trade.getItem(i.getObjectId()) != null)
+				continue;
+
+			L2ItemInstance newItem = player.getInventory().transferItem(warehouse.getName(), i.getObjectId(), i.getCount(), warehouse, player, manager);
 			if (newItem == null)
 			{
 				_log.warning("Error depositing a warehouse object for char "+player.getName()+" (newitem == null)");
@@ -208,13 +210,23 @@ public final class RequestPackageSend extends L2GameClientPacket
 
 	private class Item
 	{
-		final int objectId;
-		final long count;
+		private final int _objectId;
+		private final long _count;
 
 		public Item(int i, long c)
 		{
-			objectId = i;
-			count = c;
+			_objectId = i;
+			_count = c;
+		}
+
+		public int getObjectId()
+		{
+			return _objectId;
+		}
+
+		public long getCount()
+		{
+			return _count;
 		}
 	}
 }

+ 8 - 0
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/SendWareHouseDepositList.java

@@ -19,6 +19,7 @@ import java.util.logging.Logger;
 import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.model.ClanWarehouse;
 import net.sf.l2j.gameserver.model.L2ItemInstance;
+import net.sf.l2j.gameserver.model.TradeList;
 import net.sf.l2j.gameserver.model.actor.L2Npc;
 import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
@@ -148,6 +149,9 @@ public final class SendWareHouseDepositList extends L2GameClientPacket
 			return;
 		}
 
+		// get current tradelist if any
+		TradeList trade = player.getActiveTradeList();
+
 		// Proceed to the transfer
 		InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate();
 		for (WarehouseItem i : _items)
@@ -165,6 +169,10 @@ public final class SendWareHouseDepositList extends L2GameClientPacket
 					|| oldItem.getItemType() == L2EtcItemType.QUEST)
 				continue;
 
+			// skip items from active tradelist, even for stackable
+			if (trade != null && trade.getItem(i.getObjectId()) != null)
+				continue;
+
 			L2ItemInstance newItem = player.getInventory().transferItem(warehouse.getName(), i.getObjectId(), i.getCount(), warehouse, player, manager);
 			if (newItem == null)
 			{