Forráskód Böngészése

When using Warehouse Freightman, target (L2PcInstance) is not completly load (initialized), just its PcFreight. This fixes another skill's cooltime exploit and increases performance. Special thanks to vordulak who reporting and help testing this out

DrHouse 16 éve
szülő
commit
421300eb3c

+ 6 - 13
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2WarehouseInstance.java

@@ -255,18 +255,12 @@ public final class L2WarehouseInstance extends L2FolkInstance
     private void showDepositWindowFreight(L2PcInstance player, int obj_Id)
     {
         player.sendPacket(ActionFailed.STATIC_PACKET);
-        L2PcInstance destChar = L2PcInstance.load(obj_Id);
-        if (destChar == null)
-        {
-            // Something went wrong!
-            if (Config.DEBUG)
-                _log.warning("Error retrieving a target object for char " + player.getName()
-                    + " - using freight.");
-            return;
-        }
-
-        PcFreight freight = destChar.getFreight();
-    	if (Config.ALT_GAME_FREIGHTS)
+        
+        PcFreight freight = new PcFreight(null);
+        
+        freight.doQuickRestore(obj_Id);
+        
+        if (Config.ALT_GAME_FREIGHTS)
     	{
             freight.setActiveLocation(0);
     	} else
@@ -275,7 +269,6 @@ public final class L2WarehouseInstance extends L2FolkInstance
     	}
         player.setActiveWarehouse(freight);
         player.tempInvetoryDisable();
-        destChar.deleteMe();
 
         if (Config.DEBUG) _log.fine("Showing items to freight");
         player.sendPacket(new WareHouseDepositList(player, WareHouseDepositList.FREIGHT));

+ 23 - 1
L2_GameServer/java/net/sf/l2j/gameserver/model/itemcontainer/PcFreight.java

@@ -17,6 +17,7 @@ package net.sf.l2j.gameserver.model.itemcontainer;
 import java.util.List;
 
 import javolution.util.FastList;
+import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.model.L2ItemInstance;
 import net.sf.l2j.gameserver.model.L2ItemInstance.ItemLocation;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
@@ -27,6 +28,7 @@ public class PcFreight extends ItemContainer
 
     private L2PcInstance _owner;    // This is the L2PcInstance that owns this Freight;
     private int _activeLocationId;
+    private int _tempOwnerId = 0;
 
     public PcFreight(L2PcInstance owner)
     {
@@ -115,6 +117,26 @@ public class PcFreight extends ItemContainer
     @Override
 	public boolean validateCapacity(int slots)
 	{
-		return (getSize() + slots <= _owner.getFreightLimit());
+    	int cap = (_owner == null ? Config.FREIGHT_SLOTS : _owner.getFreightLimit());
+		
+    	return (getSize() + slots <= cap);
 	}
+    
+    @Override
+    public int getOwnerId()
+    {
+    	if (_owner == null)
+    		return _tempOwnerId;
+    	
+    	return super.getOwnerId();
+    }
+    
+    /**
+     * This provides support to load a new PcFreight without owner so that transactions can be done
+     */
+    public void doQuickRestore(int val)
+    {
+    	_tempOwnerId = val;
+    	restore();
+    }
 }

+ 5 - 3
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestPackageSend.java

@@ -72,11 +72,13 @@ public final class RequestPackageSend extends L2GameClientPacket
 		if (_count == -1) return;
 		L2PcInstance player = getClient().getActiveChar();
         if (player == null) return;
-        L2PcInstance target = L2PcInstance.load(_objectID);
+        //L2PcInstance target = L2PcInstance.load(_objectID);
 
         try {
 		
-        	PcFreight freight = target.getFreight();
+        	PcFreight freight = new PcFreight(null);
+        	freight.doQuickRestore(_objectID);
+        	
         	getClient().getActiveChar().setActiveWarehouse(freight);
         	ItemContainer warehouse = player.getActiveWarehouse();
         	if (warehouse == null) return;
@@ -179,7 +181,7 @@ public final class RequestPackageSend extends L2GameClientPacket
         }
         finally 
         {
-        	target.deleteMe();
+        	//target.deleteMe();
         }
 	}