|
@@ -17,7 +17,6 @@ package com.l2jserver.gameserver.model.itemcontainer;
|
|
|
import java.sql.Connection;
|
|
|
import java.sql.PreparedStatement;
|
|
|
import java.sql.ResultSet;
|
|
|
-import java.util.List;
|
|
|
import java.util.logging.Level;
|
|
|
|
|
|
import javolution.util.FastList;
|
|
@@ -30,6 +29,7 @@ import com.l2jserver.gameserver.model.L2ItemInstance.ItemLocation;
|
|
|
import com.l2jserver.gameserver.model.TradeList;
|
|
|
import com.l2jserver.gameserver.model.TradeList.TradeItem;
|
|
|
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
|
|
+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;
|
|
@@ -711,38 +711,70 @@ public class PcInventory extends Inventory
|
|
|
return paperdoll;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- public boolean validateCapacity(L2ItemInstance item)
|
|
|
+ /**
|
|
|
+ * @param itemList the items that needs to be validated.
|
|
|
+ * @param sendMessage if {@code true} will send a message of inventory full.
|
|
|
+ * @param sendSkillMessage if {@code true} will send a message of skill not available.
|
|
|
+ * @return {@code true} if the inventory isn't full after taking new items and items weight add to current load doesn't exceed max weight load.
|
|
|
+ */
|
|
|
+ public boolean checkInventorySlotsAndWeight(FastList<L2Item> itemList, boolean sendMessage, boolean sendSkillMessage)
|
|
|
{
|
|
|
- int slots = 0;
|
|
|
-
|
|
|
- if (!(item.isStackable() && getItemByItemId(item.getItemId()) != null) && item.getItemType() != L2EtcItemType.HERB)
|
|
|
- slots++;
|
|
|
+ int lootWeight = 0;
|
|
|
+ int requiredSlots = 0;
|
|
|
+ if (itemList != null)
|
|
|
+ {
|
|
|
+ for (L2Item item : itemList)
|
|
|
+ {
|
|
|
+ //If the item is not stackable or is stackable and not present in inventory, will need a slot.
|
|
|
+ if (!item.isStackable() || (getInventoryItemCount(item.getItemId(), -1) <= 0))
|
|
|
+ {
|
|
|
+ requiredSlots++;
|
|
|
+ }
|
|
|
+ lootWeight += item.getWeight();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- return validateCapacity(slots, item.isQuestItem());
|
|
|
+ boolean inventoryStatusOK = validateCapacity(requiredSlots) && validateWeight(lootWeight);
|
|
|
+ if (!inventoryStatusOK && sendMessage)
|
|
|
+ {
|
|
|
+ _owner.sendPacket(SystemMessageId.SLOTS_FULL);
|
|
|
+ if (sendSkillMessage)
|
|
|
+ {
|
|
|
+ _owner.sendPacket(SystemMessageId.WEIGHT_EXCEEDED_SKILL_UNAVAILABLE);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return inventoryStatusOK;
|
|
|
}
|
|
|
|
|
|
- @Deprecated
|
|
|
- public boolean validateCapacity(List<L2ItemInstance> items)
|
|
|
+ /**
|
|
|
+ * If the item is not stackable or is stackable and not present in inventory, will need a slot.
|
|
|
+ * @param item the item to validate.
|
|
|
+ * @return {@code true} if there is enough room to add the item inventory.
|
|
|
+ */
|
|
|
+ public boolean validateCapacity(L2ItemInstance item)
|
|
|
{
|
|
|
int slots = 0;
|
|
|
-
|
|
|
- for (L2ItemInstance item : items)
|
|
|
- if (!(item.isStackable() && getItemByItemId(item.getItemId()) != null))
|
|
|
- slots++;
|
|
|
-
|
|
|
- return validateCapacity(slots);
|
|
|
+ if (!item.isStackable() || (getInventoryItemCount(item.getItemId(), -1) <= 0) || (item.getItemType() != L2EtcItemType.HERB))
|
|
|
+ {
|
|
|
+ slots++;
|
|
|
+ }
|
|
|
+ return validateCapacity(slots, item.isQuestItem());
|
|
|
}
|
|
|
|
|
|
- public boolean validateCapacityByItemId(int ItemId)
|
|
|
+ /**
|
|
|
+ * If the item is not stackable or is stackable and not present in inventory, will need a slot.
|
|
|
+ * @param itemId the item Id for the item to validate.
|
|
|
+ * @return {@code true} if there is enough room to add the item inventory.
|
|
|
+ */
|
|
|
+ public boolean validateCapacityByItemId(int itemId)
|
|
|
{
|
|
|
int slots = 0;
|
|
|
- L2Item item = ItemTable.getInstance().getTemplate(ItemId);
|
|
|
- L2ItemInstance invItem = getItemByItemId(ItemId);
|
|
|
- if (!(invItem != null && invItem.isStackable()))
|
|
|
+ final L2ItemInstance invItem = getItemByItemId(itemId);
|
|
|
+ if ((invItem == null) || !invItem.isStackable())
|
|
|
+ {
|
|
|
slots++;
|
|
|
-
|
|
|
- return validateCapacity(slots, item.isQuestItem());
|
|
|
+ }
|
|
|
+ return validateCapacity(slots, ItemTable.getInstance().getTemplate(itemId).isQuestItem());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -762,8 +794,11 @@ public class PcInventory extends Inventory
|
|
|
@Override
|
|
|
public boolean validateWeight(int weight)
|
|
|
{
|
|
|
- if (_owner.isGM() && _owner.getAccessLevel().allowTransaction())
|
|
|
- return true; // disable weight check for GM
|
|
|
+ // Disable weight check for GMs.
|
|
|
+ if (_owner.isGM() && _owner.getDietMode() && _owner.getAccessLevel().allowTransaction())
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
return (_totalWeight + weight <= _owner.getMaxLoad());
|
|
|
}
|
|
|
|