Ver Fonte

New boolean isDepositable, true if item is allowed to be deposited in the warehouse or freight
Update of the warehouse packets and lists. Master Yogi Staff not depositable.

_DS_ há 16 anos atrás
pai
commit
210d8e5b88

+ 24 - 1
L2_GameServer/java/net/sf/l2j/gameserver/model/L2ItemInstance.java

@@ -46,6 +46,7 @@ import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 import net.sf.l2j.gameserver.skills.funcs.Func;
 import net.sf.l2j.gameserver.templates.item.L2Armor;
 import net.sf.l2j.gameserver.templates.item.L2EtcItem;
+import net.sf.l2j.gameserver.templates.item.L2EtcItemType;
 import net.sf.l2j.gameserver.templates.item.L2Item;
 import net.sf.l2j.gameserver.templates.item.L2Weapon;
 import net.sf.l2j.gameserver.util.GMAudit;
@@ -669,7 +670,29 @@ public final class L2ItemInstance extends L2Object
 	{
 		return isAugmented() ? false : _item.isSellable();
 	}
-	
+
+	/**
+	 * Returns if item can be deposited in warehouse or freight
+	 * @return boolean
+	 */
+	public boolean isDepositable(boolean isPrivateWareHouse)
+	{
+		// equipped, hero and quest items
+		if (isEquipped() || isHeroItem() || _item.getItemType() == L2EtcItemType.QUEST)
+			return false;
+		// Staff of Master Yogi
+		if (_itemId == 13539)
+			return false;
+		if (!isPrivateWareHouse)
+		{
+			// augmented not tradeable
+			if (!isTradeable() || isShadowItem())
+				return false;
+		}
+
+		return true;
+	}
+
     /**
      * Returns if item is consumable
      * @return boolean

+ 1 - 1
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/L2Npc.java

@@ -556,7 +556,7 @@ public class L2Npc extends L2Character
 		return true;
 	}
 
-	protected boolean canInteract(L2PcInstance player)
+	public boolean canInteract(L2PcInstance player)
 	{
 		// TODO: NPC busy check etc...
 

+ 2 - 7
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestPackageSend.java

@@ -29,9 +29,7 @@ import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.ItemList;
 import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
-import net.sf.l2j.gameserver.templates.item.L2EtcItemType;
 
-import static net.sf.l2j.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
 import static net.sf.l2j.gameserver.model.itemcontainer.PcInventory.ADENA_ID;
 
 /**
@@ -100,7 +98,7 @@ public final class RequestPackageSend extends L2GameClientPacket
 		L2NpcInstance manager = player.getLastFolkNPC();
 		if ((manager == null
 				|| !(manager instanceof L2WarehouseInstance)
-				|| !player.isInsideRadius(manager, INTERACTION_DISTANCE, false, false)) && !player.isGM())
+				|| !manager.canInteract(player)) && !player.isGM())
 			return;
 
 		if (warehouse instanceof PcFreight && !player.getAccessLevel().allowTransaction())
@@ -124,9 +122,6 @@ public final class RequestPackageSend extends L2GameClientPacket
 				return;
 			}
 
-			if (!item.isTradeable() || item.getItemType() == L2EtcItemType.QUEST)
-				return;
-
 			// Calculate needed adena and slots
 			if (item.getItemId() == ADENA_ID)
 				currentAdena -= i.getCount();
@@ -164,7 +159,7 @@ public final class RequestPackageSend extends L2GameClientPacket
 				continue;
 			}
 
-			if (oldItem.isHeroItem())
+			if (!oldItem.isDepositable(false))
 				continue;
 
 			// skip items from active tradelist, even for stackable

+ 1 - 9
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestPackageSendableItemList.java

@@ -14,7 +14,6 @@
  */
 package net.sf.l2j.gameserver.network.clientpackets;
 
-import net.sf.l2j.gameserver.model.L2ItemInstance;
 import net.sf.l2j.gameserver.network.serverpackets.PackageSendableList;
 
 /**
@@ -40,14 +39,7 @@ public final class RequestPackageSendableItemList extends L2GameClientPacket
 	@Override
 	public void runImpl()
 	{
-		/*
-		L2PcInstance target = (L2PcInstance) L2World.getInstance().findObject(_objectID);
-		if(target == null)
-			return;
-		*/
-		L2ItemInstance[] items = getClient().getActiveChar().getInventory().getAvailableItems(true);
-		// build list...
-		sendPacket(new PackageSendableList(items, _objectID));
+		sendPacket(new PackageSendableList(getClient().getActiveChar(), _objectID));
 	}
 
 	/**

+ 12 - 15
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/SendWareHouseDepositList.java

@@ -17,19 +17,17 @@ package net.sf.l2j.gameserver.network.clientpackets;
 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;
 import net.sf.l2j.gameserver.model.itemcontainer.ItemContainer;
+import net.sf.l2j.gameserver.model.itemcontainer.PcWarehouse;
 import net.sf.l2j.gameserver.network.SystemMessageId;
 import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.ItemList;
 import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
-import net.sf.l2j.gameserver.templates.item.L2EtcItemType;
 import net.sf.l2j.gameserver.util.IllegalPlayerAction;
 import net.sf.l2j.gameserver.util.Util;
 
@@ -54,7 +52,7 @@ public final class SendWareHouseDepositList extends L2GameClientPacket
 	@Override
 	protected void readImpl()
 	{
-		int count = readD();
+		final int count = readD();
 		if (count <= 0
 				|| count > Config.MAX_ITEM_IN_PACKET
 				|| count * BATCH_LENGTH != _buf.remaining())
@@ -82,21 +80,22 @@ public final class SendWareHouseDepositList extends L2GameClientPacket
 		if (_items == null)
 			return;
 
-		L2PcInstance player = getClient().getActiveChar();
+		final L2PcInstance player = getClient().getActiveChar();
 		if (player == null)
 			return;
 
-		ItemContainer warehouse = player.getActiveWarehouse();
+		final ItemContainer warehouse = player.getActiveWarehouse();
 		if (warehouse == null)
 			return;
+		final boolean isPrivate = warehouse instanceof PcWarehouse;
 
-		L2NpcInstance manager = player.getLastFolkNPC();
+		final L2NpcInstance manager = player.getLastFolkNPC();
 		if ((manager == null
 				|| !manager.isWarehouse()
-				|| !player.isInsideRadius(manager, L2Npc.INTERACTION_DISTANCE, false, false)) && !player.isGM())
+				|| !manager.canInteract(player)) && !player.isGM())
 			return;
 
-		if ((warehouse instanceof ClanWarehouse) && !player.getAccessLevel().allowTransaction())
+		if (!isPrivate && !player.getAccessLevel().allowTransaction())
 		{
 			player.sendMessage("Transactions are disable for your Access Level");
 			return;
@@ -113,7 +112,7 @@ public final class SendWareHouseDepositList extends L2GameClientPacket
 			return;
 
 		// Freight price from config or normal price per item slot (30)
-		long fee = _items.length * 30;
+		final long fee = _items.length * 30;
 		long currentAdena = player.getAdena();
 		int slots = 0;
 
@@ -150,7 +149,7 @@ public final class SendWareHouseDepositList extends L2GameClientPacket
 		}
 
 		// get current tradelist if any
-		TradeList trade = player.getActiveTradeList();
+		final TradeList trade = player.getActiveTradeList();
 
 		// Proceed to the transfer
 		InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate();
@@ -164,16 +163,14 @@ public final class SendWareHouseDepositList extends L2GameClientPacket
 				return;
 			}
 
-			if (oldItem.isHeroItem()
-					|| ((warehouse instanceof ClanWarehouse) && !oldItem.isTradeable())
-					|| oldItem.getItemType() == L2EtcItemType.QUEST)
+			if (!oldItem.isDepositable(isPrivate))
 				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);
+			final 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)");

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

@@ -20,10 +20,10 @@ import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.model.ClanWarehouse;
 import net.sf.l2j.gameserver.model.L2Clan;
 import net.sf.l2j.gameserver.model.L2ItemInstance;
-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;
 import net.sf.l2j.gameserver.model.itemcontainer.ItemContainer;
+import net.sf.l2j.gameserver.model.itemcontainer.PcWarehouse;
 import net.sf.l2j.gameserver.network.SystemMessageId;
 import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.ItemList;
@@ -50,7 +50,7 @@ public final class SendWareHouseWithDrawList extends L2GameClientPacket
 	@Override
 	protected void readImpl()
 	{
-		int count = readD();
+		final int count = readD();
 		if (count <= 0
 				|| count > Config.MAX_ITEM_IN_PACKET
 				|| count * BATCH_LENGTH != _buf.remaining())
@@ -78,21 +78,21 @@ public final class SendWareHouseWithDrawList extends L2GameClientPacket
 		if (_items == null)
 			return;
 
-		L2PcInstance player = getClient().getActiveChar();
+		final L2PcInstance player = getClient().getActiveChar();
 		if (player == null)
 			return;
 
-		ItemContainer warehouse = player.getActiveWarehouse();
+		final ItemContainer warehouse = player.getActiveWarehouse();
 		if (warehouse == null)
 			return;
 
-		L2NpcInstance manager = player.getLastFolkNPC();
+		final L2NpcInstance manager = player.getLastFolkNPC();
 		if ((manager == null
 				|| !manager.isWarehouse()
-				|| !player.isInsideRadius(manager, L2Npc.INTERACTION_DISTANCE, false, false)) && !player.isGM())
+				|| !manager.canInteract(player)) && !player.isGM())
 			return;
 
-		if ((warehouse instanceof ClanWarehouse) && !player.getAccessLevel().allowTransaction())
+		if (!(warehouse instanceof PcWarehouse) && !player.getAccessLevel().allowTransaction())
 		{
 			player.sendMessage("Transactions are disable for your Access Level");
 			return;
@@ -165,7 +165,7 @@ public final class SendWareHouseWithDrawList extends L2GameClientPacket
 				_log.warning("Error withdrawing a warehouse object for char " + player.getName() + " (olditem == null)");
 				return;
 			}
-			L2ItemInstance newItem = warehouse.transferItem(warehouse.getName(), i.getObjectId(), i.getCount(), player.getInventory(), player, manager);
+			final L2ItemInstance newItem = warehouse.transferItem(warehouse.getName(), i.getObjectId(), i.getCount(), player.getInventory(), player, manager);
 			if (newItem == null)
 			{
 				_log.warning("Error withdrawing a warehouse object for char " + player.getName() + " (newitem == null)");

+ 25 - 12
L2_GameServer/java/net/sf/l2j/gameserver/network/serverpackets/PackageSendableList.java

@@ -14,7 +14,9 @@
  */
 package net.sf.l2j.gameserver.network.serverpackets;
 
+import javolution.util.FastList;
 import net.sf.l2j.gameserver.model.L2ItemInstance;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 
 /**
  *
@@ -24,13 +26,21 @@ import net.sf.l2j.gameserver.model.L2ItemInstance;
 public class PackageSendableList extends L2GameServerPacket
 {
 	private static final String _S__C3_PACKAGESENDABLELIST = "[S] d2 PackageSendableList";
-	private L2ItemInstance[] _items;
-	private int _playerObjId;
+	private final int _targetPlayerObjId;
+	private final long _playerAdena;
+	private final FastList<L2ItemInstance> _items;
 
-	public PackageSendableList(L2ItemInstance[] items, int playerObjId)
+	public PackageSendableList(L2PcInstance player, int targetPlayerObjId)
 	{
-		_items = items;
-		_playerObjId = playerObjId;
+		_targetPlayerObjId = targetPlayerObjId;
+		_playerAdena = player.getAdena();
+
+		_items = new FastList<L2ItemInstance>();
+		for (L2ItemInstance temp : player.getInventory().getAvailableItems(true))
+		{
+			if (temp != null && temp.isDepositable(false))
+				_items.add(temp);
+		}
 	}
 
 	/**
@@ -42,9 +52,9 @@ public class PackageSendableList extends L2GameServerPacket
 	{
 		writeC(0xd2);
 
-		writeD(_playerObjId);
-		writeQ(getClient().getActiveChar().getAdena());
-		writeD(_items.length);
+		writeD(_targetPlayerObjId);
+		writeQ(_playerAdena);
+		writeD(_items.size());
 		for(L2ItemInstance item : _items) // format inside the for taken from SellList part use should be about the same
 		{
 			writeH(item.getItem().getType1());
@@ -61,11 +71,14 @@ public class PackageSendableList extends L2GameServerPacket
 			//T1
 			writeH(item.getAttackElementType());
 			writeH(item.getAttackElementPower());
-			for (byte i = 0; i < 6; i++)
-			{
-				writeH(item.getElementDefAttr(i));
-			}
+			writeH(item.getElementDefAttr((byte)0));
+			writeH(item.getElementDefAttr((byte)1));
+			writeH(item.getElementDefAttr((byte)2));
+			writeH(item.getElementDefAttr((byte)3));
+			writeH(item.getElementDefAttr((byte)4));
+			writeH(item.getElementDefAttr((byte)5));
 		}
+		_items.clear();
 	}
 
 	/**

+ 22 - 30
L2_GameServer/java/net/sf/l2j/gameserver/network/serverpackets/WareHouseDepositList.java

@@ -34,34 +34,24 @@ public final class WareHouseDepositList extends L2GameServerPacket
 	public static final int FREIGHT = 1;
 	private static Logger _log = Logger.getLogger(WareHouseDepositList.class.getName());
 	private static final String _S__53_WAREHOUSEDEPOSITLIST = "[S] 41 WareHouseDepositList";
-	private L2PcInstance _activeChar;
-	private long _playerAdena;
-	private FastList<L2ItemInstance> _items;
-	private int _whType;
-	
+	private final long _playerAdena;
+	private final FastList<L2ItemInstance> _items;
+	private final int _whType;
+
 	public WareHouseDepositList(L2PcInstance player, int type)
 	{
-		_activeChar = player;
 		_whType = type;
-		_playerAdena = _activeChar.getAdena();
+		_playerAdena = player.getAdena();
 		_items = new FastList<L2ItemInstance>();
-		
-		for (L2ItemInstance temp : _activeChar.getInventory().getAvailableItems(true))
-			_items.add(temp);
-		
-		// non-tradeable, augmented and shadow items can be stored in private wh
-		if (_whType == PRIVATE)
+
+		final boolean isPrivate = _whType == PRIVATE; 
+		for (L2ItemInstance temp : player.getInventory().getAvailableItems(true))
 		{
-			for (L2ItemInstance temp : player.getInventory().getItems())
-			{
-				if (temp != null && !temp.isEquipped()
-						&& (temp.isShadowItem() || temp.isAugmented() || !temp.isTradeable())
-						&& temp.getItem().getType2() != 3) // exclude quest items
-					_items.add(temp);
-			}
+			if (temp != null && temp.isDepositable(isPrivate))
+				_items.add(temp);
 		}
 	}
-	
+
 	@Override
 	protected final void writeImpl()
 	{
@@ -72,11 +62,11 @@ public final class WareHouseDepositList extends L2GameServerPacket
 		* 0x04-Warehouse */
 		writeH(_whType);
 		writeQ(_playerAdena);
-		int count = _items.size();
+		final int count = _items.size();
 		if (Config.DEBUG)
 			_log.fine("count:" + count);
 		writeH(count);
-		
+
 		for (L2ItemInstance item : _items)
 		{
 			writeH(item.getItem().getType1());
@@ -97,20 +87,22 @@ public final class WareHouseDepositList extends L2GameServerPacket
 			}
 			else
 				writeQ(0x00);
-			
+
 			writeH(item.getAttackElementType());
 			writeH(item.getAttackElementPower());
-			for (byte i = 0; i < 6; i++)
-			{
-				writeH(item.getElementDefAttr(i));
-			}
-			
+			writeH(item.getElementDefAttr((byte)0));
+			writeH(item.getElementDefAttr((byte)1));
+			writeH(item.getElementDefAttr((byte)2));
+			writeH(item.getElementDefAttr((byte)3));
+			writeH(item.getElementDefAttr((byte)4));
+			writeH(item.getElementDefAttr((byte)5));
 			writeD(item.getMana());
 			// T2
 			writeD(item.isTimeLimitedItem() ? (int) (item.getRemainingTime()/1000) : -1);
 		}
+		_items.clear();
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see net.sf.l2j.gameserver.serverpackets.ServerBasePacket#getType()
 	 */