瀏覽代碼

Pet inventory limits by Kerberos

GodKratos 16 年之前
父節點
當前提交
fb3e2c4672

+ 4 - 0
L2_GameServer/java/config/NPC.properties

@@ -80,6 +80,10 @@ AllowWyvernUpgrader = False
 # Retail: 30827
 ListPetRentNpc = 30827
 
+# This will control the inventory space limit (NOT WEIGHT LIMIT).
+# Retail: 12
+MaximumSlotsForPet = 12
+
 #============================================================#
 #                         Boss                               #
 #============================================================#

+ 2 - 0
L2_GameServer/java/net/sf/l2j/Config.java

@@ -591,6 +591,7 @@ public final class Config
     public static double	RAID_MINION_RESPAWN_TIMER;
     public static float		RAID_MIN_RESPAWN_MULTIPLIER;
     public static float		RAID_MAX_RESPAWN_MULTIPLIER;
+    public static int		INVENTORY_MAXIMUM_PET;
 	
 	/** ************************************************** **/
 	/** NPC Settings -End                                  **/
@@ -1674,6 +1675,7 @@ public final class Config
 	                RAID_MIN_RESPAWN_MULTIPLIER				= Float.parseFloat(NPC.getProperty("RaidMinRespawnMultiplier", "1.0"));
 	                RAID_MAX_RESPAWN_MULTIPLIER				= Float.parseFloat(NPC.getProperty("RaidMaxRespawnMultiplier", "1.0"));
 	                RAID_MINION_RESPAWN_TIMER				= Integer.parseInt(NPC.getProperty("RaidMinionRespawnTime", "300000"));
+	                INVENTORY_MAXIMUM_PET					= Integer.parseInt(NPC.getProperty("MaximumSlotsForPet", "12"));
 	
 	            }
 	            catch (Exception e)

+ 2 - 8
L2_GameServer/java/net/sf/l2j/gameserver/model/L2Summon.java

@@ -64,7 +64,6 @@ public abstract class L2Summon extends L2PlayableInstance
     private int _attackRange = 36; //Melee range
     private boolean _follow = true;
     private boolean _previousFollowStatus = true;
-    private int _maxLoad;
 
     private int _chargedSoulShot;
     private int _chargedSpiritShot;
@@ -303,9 +302,9 @@ public abstract class L2Summon extends L2PlayableInstance
         return _pkKills;
     }
 
-    public final int getMaxLoad()
+    public int getMaxLoad()
     {
-        return _maxLoad;
+        return 0;
     }
 
     public final int getSoulShotsPerHit()
@@ -318,11 +317,6 @@ public abstract class L2Summon extends L2PlayableInstance
         return _spiritShotsPerHit;
     }
 
-    public void setMaxLoad(int maxLoad)
-    {
-        _maxLoad = maxLoad;
-    }
-
     public void setChargedSoulShot(int shotType)
     {
         _chargedSoulShot = shotType;

+ 2 - 1
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java

@@ -3414,8 +3414,9 @@ public final class L2PcInstance extends L2PlayableInstance
                 petIU.addNewItem(newItem);
 
 			((PetInventory)target).getOwner().getOwner().sendPacket(petIU);
+			getPet().getInventory().refreshWeight();
+			sendPacket(new PetInfo(getPet()));
 		}
-
 		return newItem;
 	}
 

+ 50 - 2
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PetInstance.java

@@ -86,8 +86,10 @@ public class L2PetInstance extends L2Summon
 
 	/** The Experience before the last Death Penalty */
 	private long _expBeforeDeath = 0;
+
 	private static final int FOOD_ITEM_CONSUME_COUNT = 5;
 	private static final int PET_DECAY_DELAY = 86400000; // 24 hours
+	private int _maxload;
 	
     public final L2PetData getPetData()
     {
@@ -208,6 +210,7 @@ public class L2PetInstance extends L2Summon
 
         int npcId = template.npcId;
         _mountable = L2PetDataTable.isMountable(npcId);
+        _maxload = getPetData().getPetMaxLoad();
 	}
 
     @Override
@@ -428,7 +431,16 @@ public class L2PetInstance extends L2Summon
 				getOwner().sendPacket(ActionFailed.STATIC_PACKET);
 				return;
 			}		
-			
+			if ( !_inventory.validateCapacity(target))
+			{
+				getOwner().sendPacket(new SystemMessage(SystemMessageId.YOUR_PET_CANNOT_CARRY_ANY_MORE_ITEMS));
+				return;
+			}
+			if ( !_inventory.validateWeight(target, target.getCount()))
+			{
+				getOwner().sendPacket(new SystemMessage(SystemMessageId.UNABLE_TO_PLACE_ITEM_YOUR_PET_IS_TOO_ENCUMBERED));
+				return;
+			}
 			if (target.getOwnerId() != 0 && target.getOwnerId() != getOwner().getObjectId() && !getOwner().isInLooterParty(target.getOwnerId()))
             {
                 getOwner().sendPacket(ActionFailed.STATIC_PACKET);
@@ -529,6 +541,7 @@ public class L2PetInstance extends L2Summon
 
 		if (follow)
 			followOwner();
+		getOwner().sendPacket(new PetInfo(this));
 	}
 
 	@Override
@@ -614,6 +627,7 @@ public class L2PetInstance extends L2Summon
         	else petIU.addNewItem(newItem);
     		((PetInventory)target).getOwner().getOwner().sendPacket(petIU);
 		}
+    	getOwner().sendPacket(new PetInfo(this));
     	return newItem;
     }
 
@@ -979,7 +993,21 @@ public class L2PetInstance extends L2Summon
     @Override
 	public int getEvasionRate(L2Character target) { return getStat().getEvasionRate(target); }
     @Override
-	public int getRunSpeed() { return getStat().getRunSpeed(); }
+	public int getRunSpeed()
+    {
+    	int spd = getStat().getRunSpeed();
+    	
+		int weightproc = getCurrentLoad() * 1000 / getMaxLoad();
+		double weightPenalty;
+		if (weightproc < 666)
+			weightPenalty = 1;
+		else if ( weightproc < 1000)
+			weightPenalty = 0.5;
+		else
+			weightPenalty = 0;
+    	
+    	return (int)(spd*weightPenalty);
+    }
     @Override
 	public int getPAtkSpd() { return getStat().getPAtkSpd(); }
     @Override
@@ -1042,6 +1070,26 @@ public class L2PetInstance extends L2Summon
         	}
         }
     }
+    
+	public int getCurrentLoad()
+	{
+		return _inventory.getTotalWeight();
+	}
+	
+	public final void setMaxLoad(int maxLoad)
+    {
+        _maxload = maxLoad;
+    }
+    
+	@Override
+	public final int getMaxLoad()
+	{
+		return _maxload != 0 ? _maxload : 1;
+	}
+	public int getInventoryLimit()
+	{
+		return Config.INVENTORY_MAXIMUM_PET;
+	}
 }
 
 

+ 44 - 0
L2_GameServer/java/net/sf/l2j/gameserver/model/itemcontainer/PetInventory.java

@@ -14,8 +14,12 @@
  */
 package net.sf.l2j.gameserver.model.itemcontainer;
 
+import net.sf.l2j.gameserver.datatables.ItemTable;
+import net.sf.l2j.gameserver.model.L2ItemInstance;
 import net.sf.l2j.gameserver.model.L2ItemInstance.ItemLocation;
 import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
+import net.sf.l2j.gameserver.templates.item.L2EtcItemType;
+import net.sf.l2j.gameserver.templates.item.L2Item;
 
 public class PetInventory extends Inventory
 {
@@ -48,6 +52,46 @@ public class PetInventory extends Inventory
 		return id;
 	}
 
+	/**
+	 * Refresh the weight of equipment loaded
+	 */
+	@Override
+	public void refreshWeight()
+	{
+		super.refreshWeight();
+	}
+	
+    public boolean validateCapacity(L2ItemInstance item)
+    {
+        int slots = 0;
+
+        if (!(item.isStackable() && getItemByItemId(item.getItemId()) != null) && item.getItemType() != L2EtcItemType.HERB)
+        	slots++;
+
+        return validateCapacity(slots);
+    }
+    
+	@Override
+	public boolean validateCapacity(int slots)
+	{
+		return (_items.size() + slots <= _owner.getInventoryLimit());
+	}
+	
+	public boolean validateWeight(L2ItemInstance item, int count)
+	{
+		int weight = 0;
+		L2Item template = ItemTable.getInstance().getTemplate(item.getItemId());
+        if (template == null) return false;
+        weight += count * template.getWeight();
+		return validateWeight(weight);
+	}
+	
+	@Override
+	public boolean validateWeight(int weight)
+	{
+		return (_totalWeight + weight <= _owner.getMaxLoad());
+	}
+	
 	@Override
 	protected ItemLocation getBaseLocation()
     {

+ 11 - 1
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestGiveItemToPet.java

@@ -95,7 +95,17 @@ public final class RequestGiveItemToPet extends L2GameClientPacket
 		{
 			return;
 		}
-		
+		if (!pet.getInventory().validateCapacity(item))
+		{
+			pet.getOwner().sendPacket(new SystemMessage(SystemMessageId.YOUR_PET_CANNOT_CARRY_ANY_MORE_ITEMS));
+			return;
+		}
+		if (!pet.getInventory().validateWeight(item,_amount))
+		{
+			pet.getOwner().sendPacket(new SystemMessage(SystemMessageId.UNABLE_TO_PLACE_ITEM_YOUR_PET_IS_TOO_ENCUMBERED));
+			return;
+		}
+				
 		if (player.transferItem("Transfer", _objectId, _amount, pet.getInventory(), pet) == null)
 		{
 			_log.warning("Invalid item transfer request: " + pet.getName() + "(pet) --> " + player.getName());