浏览代码

BETA: Re-implementing back Freight system its still used on retail (From Dimensional Merchant) only for Freightable items (Dimensional items) mostly event ones (by me and mrTJO)

Rumen Nikiforov 14 年之前
父节点
当前提交
5a4b2fccff
共有 20 个文件被更改,包括 638 次插入48 次删除
  1. 4 0
      L2J_Server_BETA/java/com/l2jserver/Config.java
  2. 47 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/ItemHolder.java
  3. 13 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2ItemInstance.java
  4. 21 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  5. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Hero.java
  6. 120 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcFreight.java
  7. 7 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java
  8. 13 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcWarehouse.java
  9. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java
  10. 194 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPackageSend.java
  11. 49 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPackageSendableItemList.java
  12. 6 30
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/SendWareHouseWithDrawList.java
  13. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExBuySellListPacket.java
  14. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExReplyPostItemList.java
  15. 87 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PackageSendableList.java
  16. 56 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PackageToList.java
  17. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/TradeStart.java
  18. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/WareHouseDepositList.java
  19. 7 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/templates/item/L2Item.java
  20. 7 0
      L2J_Server_BETA/java/config/Character.properties

+ 4 - 0
L2J_Server_BETA/java/com/l2jserver/Config.java

@@ -151,6 +151,8 @@ public final class Config
 	public static int WAREHOUSE_SLOTS_DWARF;
 	public static int WAREHOUSE_SLOTS_NO_DWARF;
 	public static int WAREHOUSE_SLOTS_CLAN;
+	public static int ALT_FREIGHT_SLOTS;
+	public static int ALT_FREIGHT_PRIECE;
 	public static boolean ALT_GAME_KARMA_PLAYER_CAN_BE_KILLED_IN_PEACEZONE;
 	public static boolean ALT_GAME_KARMA_PLAYER_CAN_SHOP;
 	public static boolean ALT_GAME_KARMA_PLAYER_CAN_TELEPORT;
@@ -1547,6 +1549,8 @@ public final class Config
 					WAREHOUSE_SLOTS_DWARF = Integer.parseInt(Character.getProperty("MaximumWarehouseSlotsForDwarf", "120"));
 					WAREHOUSE_SLOTS_NO_DWARF = Integer.parseInt(Character.getProperty("MaximumWarehouseSlotsForNoDwarf", "100"));
 					WAREHOUSE_SLOTS_CLAN = Integer.parseInt(Character.getProperty("MaximumWarehouseSlotsForClan", "150"));
+					ALT_FREIGHT_SLOTS = Integer.parseInt(Character.getProperty("MaximumFreightSlots", "20"));
+					ALT_FREIGHT_PRIECE = Integer.parseInt(Character.getProperty("FreightPriece", "1000"));
 					ENCHANT_CHANCE_WEAPON = Integer.parseInt(Character.getProperty("EnchantChanceWeapon", "66"));
 					ENCHANT_CHANCE_ARMOR = Integer.parseInt(Character.getProperty("EnchantChanceArmor", "66"));
 					ENCHANT_CHANCE_JEWELRY = Integer.parseInt(Character.getProperty("EnchantChanceJewelry", "66"));

+ 47 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/ItemHolder.java

@@ -0,0 +1,47 @@
+/*
+ * 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 com.l2jserver.gameserver.model;
+
+/**
+ * @author UnAfraid
+ *
+ */
+public final class ItemHolder
+{
+	private final int _objectId;
+	private final long _count;
+	
+	public ItemHolder(int objectId, long count)
+	{
+		_objectId = objectId;
+		_count = count;
+	}
+	
+	public int getObjectId()
+	{
+		return _objectId;
+	}
+	
+	public long getCount()
+	{
+		return _count;
+	}
+	
+	@Override
+	public String toString()
+	{
+		return "[" + getClass().getSimpleName() + "]: objectId: " + _objectId + " count: " + _count;
+	}
+}

+ 13 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2ItemInstance.java

@@ -67,7 +67,8 @@ public final class L2ItemInstance extends L2Object
 	private static final Logger _logItems = Logger.getLogger("item");
 	
 	/** Enumeration of locations for item */
-	public static enum ItemLocation {
+	public static enum ItemLocation 
+	{
 		VOID,
 		INVENTORY,
 		PAPERDOLL,
@@ -77,7 +78,8 @@ public final class L2ItemInstance extends L2Object
 		PET_EQUIP,
 		LEASE,
 		REFUND,
-		MAIL
+		MAIL,
+		FREIGHT
 	}
 	
 	/** ID of the owner */
@@ -482,7 +484,7 @@ public final class L2ItemInstance extends L2Object
 	 */
 	public int getLocationSlot()
 	{
-		assert _loc == ItemLocation.PAPERDOLL || _loc == ItemLocation.PET_EQUIP || _loc == ItemLocation.INVENTORY || _loc == ItemLocation.MAIL;
+		assert _loc == ItemLocation.PAPERDOLL || _loc == ItemLocation.PET_EQUIP || _loc == ItemLocation.INVENTORY || _loc == ItemLocation.MAIL || _loc == ItemLocation.FREIGHT;
 		return _locData;
 	}
 	
@@ -1152,6 +1154,7 @@ public final class L2ItemInstance extends L2Object
 			_shadowItem = item;
 		}
 		
+		@Override
 		public void run()
 		{
 			try
@@ -1518,6 +1521,7 @@ public final class L2ItemInstance extends L2Object
 			_itm = item;
 		}
 		
+		@Override
 		public final void run()
 		{
 			assert _itm.getPosition().getWorldRegion() == null;
@@ -1849,6 +1853,7 @@ public final class L2ItemInstance extends L2Object
 			_limitedItem = item;
 		}
 		
+		@Override
 		public void run()
 		{
 			try
@@ -1923,4 +1928,9 @@ public final class L2ItemInstance extends L2Object
 	{
 		return getItem().isQuestItem();
 	}
+	
+	public boolean isFreightable()
+	{
+		return getItem().isFreightable();
+	}
 }

+ 21 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -160,6 +160,7 @@ import com.l2jserver.gameserver.model.entity.Siege;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
 import com.l2jserver.gameserver.model.itemcontainer.ItemContainer;
+import com.l2jserver.gameserver.model.itemcontainer.PcFreight;
 import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
 import com.l2jserver.gameserver.model.itemcontainer.PcRefund;
 import com.l2jserver.gameserver.model.itemcontainer.PcWarehouse;
@@ -557,6 +558,7 @@ public final class L2PcInstance extends L2Playable
 	private boolean _recoTwoHoursGiven = false;
 	
 	private final PcInventory _inventory = new PcInventory(this);
+	private PcFreight _freight = new PcFreight(this);
 	private PcWarehouse _warehouse;
 	private PcRefund _refund;
 	
@@ -3182,6 +3184,14 @@ public final class L2PcInstance extends L2Playable
 		_warehouse = null;
 	}
 	
+	/** 
+	 * Return the PcFreight object of the L2PcInstance.<BR><BR> 
+	 */ 
+	public PcFreight getFreight() 
+	{ 
+		return _freight; 
+	} 
+	
 	/**
 	 * Returns true if refund list is not empty
 	 */
@@ -7302,6 +7312,7 @@ public final class L2PcInstance extends L2Playable
 			// Retrieve from the database all skills of this L2PcInstance and add them to _skills
 			// Retrieve from the database all items of this L2PcInstance and add them to _inventory
 			player.getInventory().restore();
+			player.getFreight().restore(); 
 			if (!Config.WAREHOUSE_CACHE)
 				player.getWarehouse();
 			
@@ -11879,6 +11890,16 @@ public final class L2PcInstance extends L2Playable
 		if (Config.WAREHOUSE_CACHE)
 			WarehouseCacheManager.getInstance().remCacheTask(this);
 		
+		try 
+		{ 
+			getFreight().deleteMe(); 
+		} 
+		catch (Exception e) 
+	 	{ 
+			_log.log(Level.SEVERE, "deleteMe()", e); 
+	 	} 
+
+		
 		try
 		{
 			clearRefund();

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Hero.java

@@ -739,7 +739,7 @@ public class Hero
 						}
 					}
 					
-					for (L2ItemInstance item : player.getInventory().getAvailableItems(false, false))
+					for (L2ItemInstance item : player.getInventory().getAvailableItems(false, false, false))
 					{
 						if ((item != null) && item.isHeroItem())
 						{

+ 120 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcFreight.java

@@ -0,0 +1,120 @@
+/* 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 2, 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+package com.l2jserver.gameserver.model.itemcontainer;
+
+import java.util.List;
+
+import javolution.util.FastList;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.model.L2ItemInstance;
+import com.l2jserver.gameserver.model.L2ItemInstance.ItemLocation;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.skills.Stats;
+
+public class PcFreight extends ItemContainer
+{
+	private final L2PcInstance _owner;
+	private int _ownerId = 0;
+	
+	public PcFreight(int object_id)
+	{
+		_owner = null;
+		_ownerId = object_id;
+		restore();
+	}
+	
+	public PcFreight(L2PcInstance owner)
+	{
+		_owner = owner;
+		_ownerId = owner.getObjectId();
+	}
+	
+	@Override
+	public L2PcInstance getOwner()
+	{
+		return _owner;
+	}
+	
+	@Override
+	public ItemLocation getBaseLocation()
+	{
+		return ItemLocation.FREIGHT;
+	}
+	
+	/**
+	 * Returns the quantity of items in the inventory
+	 * @return int
+	 */
+	@Override
+	public int getSize()
+	{
+		int size = 0;
+		for (L2ItemInstance item : _items)
+		{
+			if (item.getLocation() == ItemLocation.INVENTORY)
+				size++;
+		}
+		return size;
+	}
+	
+	/**
+	 * Returns the list of items in inventory
+	 * @return L2ItemInstance : items in inventory
+	 */
+	@Override
+	public L2ItemInstance[] getItems()
+	{
+		List<L2ItemInstance> list = new FastList<L2ItemInstance>();
+		for (L2ItemInstance item : _items)
+		{
+			if (item.isFreightable())
+				list.add(item);
+		}
+		
+		return list.toArray(new L2ItemInstance[list.size()]);
+	}
+	
+	/**
+	 * Returns the item from inventory by using its <B>itemId</B>
+	 * @param itemId : int designating the ID of the item
+	 * @return L2ItemInstance designating the item or null if not found in inventory
+	 */
+	@Override
+	public L2ItemInstance getItemByItemId(int itemId)
+	{
+		for (L2ItemInstance item : _items)
+			if ((item.getItemId() == itemId) && (item.getLocation() == ItemLocation.INVENTORY))
+				return item;
+		
+		return null;
+	}
+
+	@Override
+	public int getOwnerId()
+	{
+		return _ownerId;
+	}
+	
+	@Override
+	public boolean validateCapacity(int slots)
+	{
+		int curSlots = _owner == null ? Config.ALT_FREIGHT_SLOTS : Config.ALT_FREIGHT_SLOTS + (int)_owner.getStat().calcStat(Stats.FREIGHT_LIM, 0, null, null);
+		return (getSize() + slots <= curSlots);
+	}
+}

+ 7 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java

@@ -236,12 +236,17 @@ public class PcInventory extends Inventory
 	 * Returns the list of items in inventory available for transaction
 	 * @return L2ItemInstance : items in inventory
 	 */
-	public L2ItemInstance[] getAvailableItems(boolean allowAdena, boolean allowNonTradeable)
+	public L2ItemInstance[] getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean dimensional)
 	{
 		FastList<L2ItemInstance> list = FastList.newInstance();
 		for (L2ItemInstance item : _items)
 		{
-			if (item != null && item.isAvailable(getOwner(), allowAdena, allowNonTradeable) && canManipulateWithItemId(item.getItemId()))
+			if (item == null)
+				continue;
+			else if (dimensional) 
+				if (item.getLocation() == ItemLocation.INVENTORY && item.isFreightable())
+					list.add(item);
+			else if (item.isAvailable(getOwner(), allowAdena, allowNonTradeable) && canManipulateWithItemId(item.getItemId()))
 				list.add(item);
 		}
 		

+ 13 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcWarehouse.java

@@ -29,15 +29,22 @@ public class PcWarehouse extends Warehouse
 	}
 	
 	@Override
-	public String getName() { return "Warehouse"; }
+	public String getName()
+	{
+		return "Warehouse";
+	}
 	
 	@Override
-	public L2PcInstance getOwner() { return _owner; }
+	public L2PcInstance getOwner()
+	{
+		return _owner;
+	}
+	
 	@Override
-	public ItemLocation getBaseLocation() { return ItemLocation.WAREHOUSE; }
-	public String getLocationId() { return "0"; }
-	public int getLocationId(boolean dummy) { return 0; }
-	public void setLocationId(L2PcInstance dummy) {}
+	public ItemLocation getBaseLocation()
+	{
+		return ItemLocation.WAREHOUSE;
+	}
 	
 	@Override
 	public boolean validateCapacity(int slots)

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java

@@ -559,10 +559,10 @@ public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>,
 						// RequestSkillCoolTime
 						break;
 					case 0xa7:
-						//msg = new RequestPackageSendableItemList();
+						msg = new RequestPackageSendableItemList();
 						break;
 					case 0xa8:
-						//msg = new RequestPackageSend();
+						msg = new RequestPackageSend();
 						break;
 					case 0xa9:
 						msg = new RequestBlock();

+ 194 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPackageSend.java

@@ -0,0 +1,194 @@
+/*
+ * 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 com.l2jserver.gameserver.network.clientpackets;
+
+import java.util.logging.Level;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.model.L2ItemInstance;
+import com.l2jserver.gameserver.model.ItemHolder;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.itemcontainer.ItemContainer;
+import com.l2jserver.gameserver.model.itemcontainer.PcFreight;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
+import com.l2jserver.gameserver.network.serverpackets.ItemList;
+import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.gameserver.util.Util;
+
+/**
+ * @author -Wooden-
+ * @author UnAfraid
+ * Thanks mrTJO
+ */
+public class RequestPackageSend extends L2GameClientPacket
+{
+	private final String _C_9F_REQUESTPACKAGESEND = "[C] 9F RequestPackageSend";
+	private ItemHolder _items[] = null;
+	private int _objectId;
+	private int _count;
+	
+	@Override
+	protected void readImpl()
+	{
+		_objectId = readD();
+		_count = readD();
+		_items = new ItemHolder[_count];
+		for (int i = 0; i < _count; i++)
+		{
+			int objId = readD();
+			long cnt = readQ();
+			if (objId < 1 || cnt < 0)
+			{
+				_items = null;
+				return;
+			}
+			
+			_items[i] = new ItemHolder(objId, cnt);
+		}
+	}
+	
+	@Override
+	protected void runImpl()
+	{
+		if (_items == null)
+			return;
+		
+		final L2PcInstance player = getClient().getActiveChar();
+		if (player == null)
+			return;
+		
+		if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("deposit"))
+		{
+			player.sendMessage("You depositing items too fast.");
+			return;
+		}
+		
+		player.setActiveWarehouse(new PcFreight(_objectId));
+		
+		final ItemContainer warehouse = player.getActiveWarehouse();
+		if (warehouse == null)
+			return;
+		
+		L2Npc manager = player.getLastFolkNPC();
+		if ((manager == null || !player.isInsideRadius(manager, L2NpcInstance.INTERACTION_DISTANCE, false, false)) && !player.isGM())
+			return;
+		
+		if (player.getActiveEnchantItem() != null)
+		{
+			Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to use enchant Exploit!", Config.DEFAULT_PUNISH);
+			return;
+		}
+		
+		// Alt game - Karma punishment
+		if (!Config.ALT_GAME_KARMA_PLAYER_CAN_USE_WAREHOUSE && player.getKarma() > 0)
+			return;
+		
+		// Freight price from config or normal price per item slot (30)
+		int fee = _count * Config.ALT_FREIGHT_PRIECE; //Config.ALT_GAME_FREIGHT_PRICE;
+		double currentAdena = player.getAdena();
+		int slots = 0;
+		
+		for (ItemHolder i : _items)
+		{
+			// Check validity of requested item
+			L2ItemInstance item = player.checkItemManipulation(i.getObjectId(), i.getCount(), "deposit");
+			if (item == null)
+			{
+				_log.log(Level.WARNING, "Error depositing a warehouse object for char " + player.getName() + " (validity check)");
+				return;
+			}
+			
+			if (!item.isFreightable())
+				return;
+			
+			// Calculate needed adena and slots
+			if (item.getItemId() == 57)
+				currentAdena -= i.getCount();
+			else if (!item.isStackable())
+				slots += i.getCount();
+			else if (warehouse.getItemByItemId(item.getItemId()) == null)
+				slots++;
+		}
+		
+		// Item Max Limit Check
+		if (!warehouse.validateCapacity(slots))
+		{
+			sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED));
+			return;
+		}
+		
+		// Check if enough adena and charge the fee
+		if (currentAdena < fee || !player.reduceAdena(warehouse.getName(), fee, manager, false))
+		{
+			sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_NOT_ENOUGH_ADENA));
+			return;
+		}
+		
+		// get current tradelist if any
+		if (player.getActiveTradeList() != null)
+			return;
+		
+		// Proceed to the transfer
+		InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate();
+		for (ItemHolder i : _items)
+		{
+			// Check validity of requested item
+			L2ItemInstance oldItem = player.checkItemManipulation(i.getObjectId(), i.getCount(), "deposit");
+			if (oldItem == null)
+			{
+				_log.log(Level.WARNING, "Error depositing a warehouse object for char " + player.getName() + " (olditem == null)");
+				return;
+			}
+			
+			L2ItemInstance newItem = player.getInventory().transferItem("Trade", i.getObjectId(), i.getCount(), warehouse, player, null);
+			if (newItem == null)
+			{
+				_log.log(Level.WARNING, "Error depositing a warehouse object for char " + player.getName() + " (newitem == null)");
+				continue;
+			}
+			
+			if (playerIU != null)
+			{
+				if (oldItem.getCount() > 0 && oldItem != newItem)
+					playerIU.addModifiedItem(oldItem);
+				else
+					playerIU.addRemovedItem(oldItem);
+			}
+		}
+		
+		warehouse.deleteMe();
+		
+		// Send updated item list to the player
+		if (playerIU != null)
+			player.sendPacket(playerIU);
+		else
+			player.sendPacket(new ItemList(player, false));
+		
+		// Update current load status on player
+		StatusUpdate su = new StatusUpdate(player);
+		su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
+		player.sendPacket(su);
+	}
+	
+	@Override
+	public String getType()
+	{
+		return _C_9F_REQUESTPACKAGESEND;
+	}
+}

+ 49 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestPackageSendableItemList.java

@@ -0,0 +1,49 @@
+/*
+ * 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 com.l2jserver.gameserver.network.clientpackets;
+
+import com.l2jserver.gameserver.model.L2ItemInstance;
+import com.l2jserver.gameserver.network.serverpackets.PackageSendableList;
+
+/**
+ * @author -Wooden-
+ * @author UnAfraid
+ * Thanks mrTJO
+ */
+public class RequestPackageSendableItemList extends L2GameClientPacket
+{
+	
+	private static final String _C_9E_REQUESTPACKAGESENDABLEITEMLIST = "[C] 9E RequestPackageSendableItemList";
+	private int _objectID;
+	
+	@Override
+	protected void readImpl()
+	{
+		_objectID = readD();
+	}
+	
+	@Override
+	public void runImpl()
+	{
+		L2ItemInstance[] items = getClient().getActiveChar().getInventory().getAvailableItems(true, false, true);
+		sendPacket(new PackageSendableList(items, _objectID));
+	}
+	
+	@Override
+	public String getType()
+	{
+		return _C_9E_REQUESTPACKAGESENDABLEITEMLIST;
+	}
+}

+ 6 - 30
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/SendWareHouseWithDrawList.java

@@ -14,12 +14,11 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import java.util.logging.Logger;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.model.ClanWarehouse;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ItemInstance;
+import com.l2jserver.gameserver.model.ItemHolder;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.itemcontainer.ItemContainer;
@@ -42,11 +41,10 @@ import com.l2jserver.gameserver.util.Util;
 public final class SendWareHouseWithDrawList extends L2GameClientPacket
 {
 	private static final String _C__32_SENDWAREHOUSEWITHDRAWLIST = "[C] 32 SendWareHouseWithDrawList";
-	private static Logger _log = Logger.getLogger(SendWareHouseWithDrawList.class.getName());
 	
 	private static final int BATCH_LENGTH = 12; // length of the one item
 	
-	private WarehouseItem _items[] = null;
+	private ItemHolder _items[] = null;
 	
 	@Override
 	protected void readImpl()
@@ -59,7 +57,7 @@ public final class SendWareHouseWithDrawList extends L2GameClientPacket
 			return;
 		}
 		
-		_items = new WarehouseItem[count];
+		_items = new ItemHolder[count];
 		for (int i=0; i < count; i++)
 		{
 			int objId = readD();
@@ -69,7 +67,7 @@ public final class SendWareHouseWithDrawList extends L2GameClientPacket
 				_items = null;
 				return;
 			}
-			_items[i] = new WarehouseItem(objId, cnt);
+			_items[i] = new ItemHolder(objId, cnt);
 		}
 	}
 	
@@ -128,7 +126,7 @@ public final class SendWareHouseWithDrawList extends L2GameClientPacket
 		int weight = 0;
 		int slots = 0;
 		
-		for (WarehouseItem i : _items)
+		for (ItemHolder i : _items)
 		{
 			// Calculate needed slots
 			L2ItemInstance item = warehouse.getItemByObjectId(i.getObjectId());
@@ -164,7 +162,7 @@ public final class SendWareHouseWithDrawList extends L2GameClientPacket
 		
 		// Proceed to the transfer
 		InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate();
-		for (WarehouseItem i : _items)
+		for (ItemHolder i : _items)
 		{
 			L2ItemInstance oldItem = warehouse.getItemByObjectId(i.getObjectId());
 			if (oldItem == null || oldItem.getCount() < i.getCount())
@@ -200,28 +198,6 @@ public final class SendWareHouseWithDrawList extends L2GameClientPacket
 		player.sendPacket(su);
 	}
 	
-	private static class WarehouseItem
-	{
-		private final int _objectId;
-		private final long _count;
-		
-		public WarehouseItem(int id, long num)
-		{
-			_objectId = id;
-			_count = num;
-		}
-		
-		public int getObjectId()
-		{
-			return _objectId;
-		}
-		
-		public long getCount()
-		{
-			return _count;
-		}
-	}
-	
 	/* (non-Javadoc)
 	 * @see com.l2jserver.gameserver.clientpackets.ClientBasePacket#getType()
 	 */

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExBuySellListPacket.java

@@ -45,7 +45,7 @@ public class ExBuySellListPacket extends L2GameServerPacket
 				continue;
 			_buyList.add(item);
 		}
-		_sellList = player.getInventory().getAvailableItems(false, false);
+		_sellList = player.getInventory().getAvailableItems(false, false, false);
 		if (player.hasRefund())
 			_refundList = player.getRefund().getItems();
 		_done = done;

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExReplyPostItemList.java

@@ -30,7 +30,7 @@ public class ExReplyPostItemList extends L2GameServerPacket
 	public ExReplyPostItemList(L2PcInstance activeChar)
 	{
 		_activeChar = activeChar;
-		_itemList = _activeChar.getInventory().getAvailableItems(true, false);
+		_itemList = _activeChar.getInventory().getAvailableItems(true, false, false);
 	}
 	
 	/* (non-Javadoc)

+ 87 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PackageSendableList.java

@@ -0,0 +1,87 @@
+/*
+ * 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 com.l2jserver.gameserver.network.serverpackets;
+
+import com.l2jserver.gameserver.model.L2ItemInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author -Wooden-
+ * @author UnAfraid
+ * Thanks mrTJO
+ */
+public class PackageSendableList extends L2GameServerPacket
+{
+	private static final String _S__D2_PACKAGESENDABLELIST = "[S] D2 PackageSendableList";
+	private final L2ItemInstance[] _items;
+	private final int _playerObjId;
+	
+	public PackageSendableList(L2ItemInstance[] items, int playerObjId)
+	{
+		_items = items;
+		_playerObjId = playerObjId;
+	}
+	
+
+	@Override
+	protected void writeImpl()
+	{
+		L2PcInstance activeChar = getClient().getActiveChar();
+		if (activeChar == null)
+			return;
+		
+		
+		writeC(0xD2);
+		writeD(_playerObjId);
+		writeQ(activeChar.getAdena());
+		writeD(_items.length);
+		for (L2ItemInstance item : _items)
+		{
+			writeD(item.getObjectId()); // This is not the real object id of the item!
+			writeD(item.getItemId());
+			writeD(item.getLocationSlot());
+			writeQ(item.getCount());
+			writeH(item.getItem().getType2());
+			writeH(item.getCustomType1());
+			writeH(item.isEquipped() ? 0x01 : 0x00);
+			writeD(item.getItem().getBodyPart());
+			writeH(item.getEnchantLevel());
+			writeH(item.getCustomType2());
+			if (item.isAugmented())
+				writeD(item.getAugmentation().getAugmentationId());
+			else
+				writeD(0x00);
+			writeD(item.getMana());
+			writeD(item.isTimeLimitedItem() ? (int) (item.getRemainingTime() / 1000) : -9999);
+			writeH(item.getAttackElementType());
+			writeH(item.getAttackElementPower());
+			for (byte i = 0; i < 6; i++)
+			{
+				writeH(item.getElementDefAttr(i));
+			}
+			// Enchant Effects
+			writeH(0x00);
+			writeH(0x00);
+			writeH(0x00);
+			writeD(item.getObjectId()); // object id THE REAL ONE
+		}
+	}
+	
+	@Override
+	public String getType()
+	{
+		return _S__D2_PACKAGESENDABLELIST;
+	}
+}

+ 56 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PackageToList.java

@@ -0,0 +1,56 @@
+/*
+ * 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 com.l2jserver.gameserver.network.serverpackets;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javolution.util.FastMap;
+
+/**
+ * @author -Wooden-
+ * @author UnAfraid
+ * Thanks mrTJO
+ */
+public class PackageToList extends L2GameServerPacket
+{
+	private final String _S__C8_PACKAGETOLIST = "[S] C8 PackageToList";
+	
+	private final Map<Integer,String> _players = new FastMap<Integer, String>();
+
+	public PackageToList(Map<Integer, String> chars)
+	{
+		_players.putAll(chars);
+	}
+	
+	@Override
+	protected void writeImpl()
+	{
+		writeC(0xC8);
+		writeD(_players.size());
+		for (Entry<Integer,String> entry : _players.entrySet())
+		{
+			writeD(entry.getKey());
+			writeS(entry.getValue());
+		}
+	}
+
+	@Override
+	public String getType()
+	{
+		return _S__C8_PACKAGETOLIST;
+	}
+	
+}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/TradeStart.java

@@ -32,7 +32,7 @@ public final class TradeStart extends L2GameServerPacket
 	public TradeStart(L2PcInstance player)
 	{
 		_activeChar = player;
-		_itemList = _activeChar.getInventory().getAvailableItems(true, (_activeChar.isGM() && Config.GM_TRADE_RESTRICTED_ITEMS));
+		_itemList = _activeChar.getInventory().getAvailableItems(true, (_activeChar.isGM() && Config.GM_TRADE_RESTRICTED_ITEMS), false);
 	}
 	
 	@Override

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/WareHouseDepositList.java

@@ -46,7 +46,7 @@ public final class WareHouseDepositList extends L2GameServerPacket
 		_items = new FastList<L2ItemInstance>();
 		
 		final boolean isPrivate = _whType == PRIVATE;
-		for (L2ItemInstance temp : player.getInventory().getAvailableItems(true, isPrivate))
+		for (L2ItemInstance temp : player.getInventory().getAvailableItems(true, isPrivate, false))
 		{
 			if (temp != null && temp.isDepositable(isPrivate))
 				_items.add(temp);

+ 7 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/templates/item/L2Item.java

@@ -174,6 +174,7 @@ public abstract class L2Item
 	private final boolean _tradeable;
 	private final boolean _depositable;
 	private final boolean _questItem;
+	private final boolean _freightable;
 	private final boolean _common;
 	private final boolean _heroItem;
 	private final boolean _pvpItem;
@@ -218,6 +219,7 @@ public abstract class L2Item
 		_tradeable = set.getBool("is_tradable", true);
 		_depositable = set.getBool("is_depositable", true);
 		_questItem = set.getBool("is_questitem", false);
+		_freightable = set.getBool("is_freightable", false);
 		
 		//_immediate_effect - herb
 		_ex_immediate_effect = set.getInteger("ex_immediate_effect", 0) > 0;
@@ -898,6 +900,11 @@ public abstract class L2Item
 	{
 		return _questItem;
 	}
+	
+	public boolean isFreightable()
+	{
+		return _freightable;
+	}
 
 	/**
 	 * Returns the name of the item

+ 7 - 0
L2J_Server_BETA/java/config/Character.properties

@@ -311,6 +311,13 @@ MaximumWarehouseSlotsForDwarf = 120
 MaximumWarehouseSlotsForNoDwarf = 100
 MaximumWarehouseSlotsForClan = 200
 
+# Freight
+# Maximum items that can be placed in Freight
+# Default: 20
+MaximumFreightSlots = 20
+# The priece for each item that's deposited
+# Default: 1000
+FreightPriece = 1000
 
 # ---------------------------------------------------------------------------
 # Enchanting