Removal of enhanced inventory methods.

This commit is contained in:
MobiusDevelopment
2021-04-20 22:20:41 +00:00
parent 210717c77f
commit 1b68632161
425 changed files with 4564 additions and 3177 deletions
@@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
} }
else else
{ {
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId())) for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{ {
playerIU.addModifiedItem(itemInstance); playerIU.addModifiedItem(itemInstance);
} }
@@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
} }
final PlayerInstance player = caster.getActingPlayer(); final PlayerInstance player = caster.getActingPlayer();
final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getSize(item -> !item.isQuestItem())); final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getNonQuestSize());
final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad()); final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent); return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
} }
@@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse(); final ItemContainer cwh = owner.getWarehouse();
for (CropProcure crop : _procureNext.get(castleId)) for (CropProcure crop : _procureNext.get(castleId))
{ {
if ((crop.getStartAmount() > 0) && (cwh.getItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null)) if ((crop.getStartAmount() > 0) && (cwh.getAllItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null))
{ {
slots++; slots++;
} }
@@ -331,7 +331,13 @@ public class PetInstance extends Summon
{ {
if (_inventory != null) if (_inventory != null)
{ {
return _inventory.getItems(item -> (item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND)).stream().findAny().orElse(null); for (ItemInstance item : _inventory.getItems())
{
if ((item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND))
{
return item;
}
}
} }
return null; return null;
} }
@@ -12949,7 +12949,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder90(boolean includeQuestInv) public boolean isInventoryUnder90(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.9)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.9);
} }
/** /**
@@ -12959,7 +12959,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder80(boolean includeQuestInv) public boolean isInventoryUnder80(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
} }
public boolean havePetInvItems() public boolean havePetInvItems()
@@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{ {
if (effector.getActingPlayer() != null) if (effector.getActingPlayer() != null)
{ {
return effector.getActingPlayer().getInventory().getSize(i -> !i.isQuestItem()) <= (effector.getActingPlayer().getInventoryLimit() - _size); return effector.getActingPlayer().getInventory().getNonQuestSize() <= (effector.getActingPlayer().getInventoryLimit() - _size);
} }
return true; return true;
} }
@@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer()) if ((effected != null) && effected.isPlayer())
{ {
final PlayerInstance target = effected.getActingPlayer(); final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size); return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
} }
return false; return false;
} }
@@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer; import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
/** /**
* A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction. * A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction.
@@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_itemInfos = new ArrayList<>(); _itemInfos = new ArrayList<>();
// Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list. // Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list.
inventory.getItems(item -> !item.isEquipped() && (item.isArmor() || item.isWeapon())).forEach(item -> for (ItemInstance item : inventory.getItems())
{ {
// Check ingredients of each entry to see if it's an entry we'd like to include. if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
for (MultisellEntryHolder entry : list.getEntries())
{ {
for (ItemChanceHolder holder : entry.getIngredients()) // Check ingredients of each entry to see if it's an entry we'd like to include.
for (MultisellEntryHolder entry : list.getEntries())
{ {
if (holder.getId() == item.getId()) for (ItemChanceHolder holder : entry.getIngredients())
{ {
_entries.add(entry); if (holder.getId() == item.getId())
_itemInfos.add(new ItemInfo(item)); {
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
} }
} }
} }
}); }
} }
} }
@@ -881,7 +881,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -916,7 +916,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -1909,7 +1909,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight() protected void refreshWeight()
{ {
long weight = 0; long weight = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item != null) && (item.getItem() != null)) if ((item != null) && (item.getItem() != null))
{ {
@@ -1940,9 +1940,9 @@ public abstract class Inventory extends ItemContainer
} }
ItemInstance arrow = null; ItemInstance arrow = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.ARROW)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.ARROW) && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()))
{ {
arrow = item; arrow = item;
break; break;
@@ -1961,9 +1961,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow) public ItemInstance findBoltForCrossBow(Item crossbow)
{ {
ItemInstance bolt = null; ItemInstance bolt = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.BOLT)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.BOLT) && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()))
{ {
bolt = item; bolt = item;
break; break;
@@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -45,7 +42,8 @@ public abstract class ItemContainer
{ {
protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName()); protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName());
protected final Map<Integer, ItemInstance> _items = new ConcurrentHashMap<>(); protected final List<ItemInstance> _items = new ArrayList<>(1);
private int _questItemSize = 0;
protected ItemContainer() protected ItemContainer()
{ {
@@ -77,28 +75,19 @@ public abstract class ItemContainer
} }
/** /**
* @param filterValue * @return the quantity of quest items in the inventory
* @param filters */
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory * @return the quantity of items in the inventory
*/ */
@SafeVarargs public int getNonQuestSize()
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{ {
Predicate<ItemInstance> filter = filterValue; return _items.size() - _questItemSize;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
} }
/** /**
@@ -107,33 +96,7 @@ public abstract class ItemContainer
*/ */
public Collection<ItemInstance> getItems() public Collection<ItemInstance> getItems()
{ {
return getItems(i -> true); return _items;
}
/**
* Gets the items in inventory filtered by filter.
* @param filterValue the filter
* @param filters multiple filters
* @return the filtered items in inventory
*/
@SafeVarargs
public final Collection<ItemInstance> getItems(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -142,7 +105,7 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByItemId(int itemId) public ItemInstance getItemByItemId(int itemId)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == itemId) if (item.getId() == itemId)
{ {
@@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id * @param itemId the item Id
* @return the items list from inventory by using its itemId * @return the items list from inventory by using its itemId
*/ */
public Collection<ItemInstance> getItemsByItemId(int itemId) public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{ {
return getItems(i -> i.getId() == itemId); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if (itemId == item.getId())
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -167,7 +138,14 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByObjectId(int objectId) public ItemInstance getItemByObjectId(int objectId)
{ {
return _items.get(objectId); for (ItemInstance item : _items)
{
if (objectId == item.getObjectId())
{
return item;
}
}
return null;
} }
/** /**
@@ -191,7 +169,7 @@ public abstract class ItemContainer
public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped) public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped)
{ {
long count = 0; long count = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped())) if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{ {
@@ -210,7 +188,7 @@ public abstract class ItemContainer
*/ */
public boolean haveItemForSelfResurrection() public boolean haveItemForSelfResurrection()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getItem().isAllowSelfResurrection()) if (item.getItem().isAllowSelfResurrection())
{ {
@@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -560,9 +538,12 @@ public abstract class ItemContainer
*/ */
public void destroyAllItems(String process, PlayerInstance actor, Object reference) public void destroyAllItems(String process, PlayerInstance actor, Object reference)
{ {
for (ItemInstance item : _items.values()) synchronized (_items)
{ {
destroyItem(process, item, actor, reference); for (ItemInstance item : _items)
{
destroyItem(process, item, actor, reference);
}
} }
} }
@@ -571,7 +552,7 @@ public abstract class ItemContainer
*/ */
public long getAdena() public long getAdena()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.ADENA_ID) if (item.getId() == Inventory.ADENA_ID)
{ {
@@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets() public long getBeautyTickets()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.BEAUTY_TICKET_ID) if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{ {
@@ -599,7 +580,15 @@ public abstract class ItemContainer
*/ */
protected void addItem(ItemInstance item) protected void addItem(ItemInstance item)
{ {
_items.put(item.getObjectId(), item); synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize++;
}
_items.add(item);
}
} }
/** /**
@@ -609,7 +598,15 @@ public abstract class ItemContainer
*/ */
protected boolean removeItem(ItemInstance item) protected boolean removeItem(ItemInstance item)
{ {
return _items.remove(item.getObjectId()) != null; synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize--;
}
return _items.remove(item);
}
} }
/** /**
@@ -626,7 +623,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -643,7 +640,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId) public void setNewMessageId(int messageId)
{ {
_messageId = messageId; _messageId = messageId;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.setItemLocation(getBaseLocation(), messageId); item.setItemLocation(getBaseLocation(), messageId);
} }
@@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh) public void returnToWh(ItemContainer wh)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (wh == null) if (wh == null)
{ {
@@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override @Override
public void updateDatabase() public void updateDatabase()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override @Override
public void deleteMe() public void deleteMe()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{ {
super.restore(); super.restore();
// check for equipped items from other pets // check for equipped items from other pets
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false)) if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false))
{ {
@@ -125,7 +125,7 @@ public class PetInventory extends Inventory
public void transferItemsToOwner() public void transferItemsToOwner()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner()); getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner());
} }
@@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
@@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena; private ItemInstance _adena;
private ItemInstance _ancientAdena; private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets; private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null; private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE; private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner) public PlayerInventory(PlayerInstance owner)
@@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable) public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{ {
final List<ItemInstance> list = new ArrayList<>(); final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (!allowAdena && (item.getId() == ADENA_ID)) if (!allowAdena && (item.getId() == ADENA_ID))
{ {
@@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
return list; return list;
} }
/**
* @param itemId
* @return
*/
public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{
return getAllItemsByItemId(itemId, true);
}
/** /**
* Returns the list of all items in inventory that have a given item id. * Returns the list of all items in inventory that have a given item id.
* @param itemId : ID of item * @param itemId : ID of item
@@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -196,7 +191,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (i.getEnchantLevel() == enchantment) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (item.getEnchantLevel() == enchantment) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -207,18 +210,24 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable) public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable)
{ {
return getItems(i -> final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{ {
if (!i.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(i.getId())) if (!item.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(item.getId()))
{ {
return false; continue;
} }
else if (feightable) else if (feightable)
{ {
return (i.getItemLocation() == ItemLocation.INVENTORY) && i.isFreightable(); if ((item.getItemLocation() == ItemLocation.INVENTORY) && item.isFreightable())
{
result.add(item);
}
continue;
} }
return true; result.add(item);
}); }
return result;
} }
/** /**
@@ -228,13 +237,19 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<TradeItem> getAvailableItems(TradeList tradeList) public Collection<TradeItem> getAvailableItems(TradeList tradeList)
{ {
//@formatter:off final List<TradeItem> result = new ArrayList<>();
return _items.values().stream() for (ItemInstance item : _items)
.filter(i -> i.isAvailable(_owner, false, false)) {
.map(tradeList::adjustAvailableItem) if ((item != null) && item.isAvailable(_owner, false, false))
.filter(Objects::nonNull) {
.collect(Collectors.toCollection(ArrayList::new)); final TradeItem adjItem = tradeList.adjustAvailableItem(item);
//@formatter:on if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
} }
/** /**
@@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item) public void adjustAvailableItem(TradeItem item)
{ {
boolean notAllEquipped = false; boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId())) for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{ {
if (adjItem.isEquipable()) if (adjItem.isEquipable())
{ {
@@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{ {
final int[][] paperdoll = new int[33][4]; final int[][] paperdoll = new int[33][4];
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement2 = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'")) PreparedStatement ps = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'"))
{ {
statement2.setInt(1, objectId); ps.setInt(1, objectId);
try (ResultSet invdata = statement2.executeQuery()) try (ResultSet invdata = ps.executeQuery())
{ {
while (invdata.next()) while (invdata.next())
{ {
@@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
public boolean validateCapacity(long slots, boolean questItem) public boolean validateCapacity(long slots, boolean questItem)
{ {
return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getSize(item -> item.isQuestItem()) + slots) <= _owner.getQuestInventoryLimit() : (getSize(item -> !item.isQuestItem()) + slots) <= _owner.getInventoryLimit(); return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getQuestSize() + slots) <= _owner.getQuestInventoryLimit() : (getNonQuestSize() + slots) <= _owner.getInventoryLimit();
} }
@Override @Override
@@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/ */
public void applyItemSkills() public void applyItemSkills()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.giveSkillsToOwner(); item.giveSkillsToOwner();
item.applyEnchantStats(); item.applyEnchantStats();
@@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{ {
try try
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null); ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true); item.updateDatabase(true);
@@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use // Reduce talisman mana on skill use
if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO)) if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO))
{ {
final ItemInstance talisman = caster.getInventory().getItems(i -> i.getId() == _skill.getReferenceItemId(), ItemInstance::isEquipped).stream().findAny().orElse(null); for (ItemInstance item : caster.getInventory().getItems())
if (talisman != null)
{ {
talisman.decreaseMana(false, talisman.useSkillDisTime()); if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
} }
} }
@@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg); player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate(); final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item); iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId)) for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{ {
iu.addItem(i); iu.addItem(i);
} }
@@ -37,7 +37,7 @@ public class BuyList extends AbstractItemPacket
_listId = list.getListId(); _listId = list.getListId();
_list = list.getProducts(); _list = list.getProducts();
_money = player.getAdena(); _money = player.getAdena();
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size(); _inventorySlots = player.getInventory().getNonQuestSize();
_castleTaxRate = castleTaxRate; _castleTaxRate = castleTaxRate;
} }
@@ -16,7 +16,9 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
@@ -30,7 +32,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/ */
public class ExBuySellList extends AbstractItemPacket public class ExBuySellList extends AbstractItemPacket
{ {
private final Collection<ItemInstance> _sellList; private final List<ItemInstance> _sellList = new ArrayList<>();
private Collection<ItemInstance> _refundList = null; private Collection<ItemInstance> _refundList = null;
private final boolean _done; private final boolean _done;
private final int _inventorySlots; private final int _inventorySlots;
@@ -38,8 +40,14 @@ public class ExBuySellList extends AbstractItemPacket
public ExBuySellList(PlayerInstance player, boolean done) public ExBuySellList(PlayerInstance player, boolean done)
{ {
final Summon pet = player.getPet(); final Summon pet = player.getPet();
_sellList = player.getInventory().getItems(item -> !item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId()))); for (ItemInstance item : player.getInventory().getItems())
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size(); {
if (!item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())))
{
_sellList.add(item);
}
}
_inventorySlots = player.getInventory().getNonQuestSize();
if (player.hasRefund()) if (player.hasRefund())
{ {
_refundList = player.getRefund().getItems(); _refundList = player.getRefund().getItems();
@@ -16,7 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection; import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -29,12 +30,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExQuestItemList extends AbstractItemPacket public class ExQuestItemList extends AbstractItemPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final Collection<ItemInstance> _items; private final List<ItemInstance> _items = new ArrayList<>();
public ExQuestItemList(PlayerInstance player) public ExQuestItemList(PlayerInstance player)
{ {
_player = player; _player = player;
_items = player.getInventory().getItems(ItemInstance::isQuestItem); for (ItemInstance item : player.getInventory().getItems())
{
if (item.isQuestItem())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -16,7 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection; import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -25,12 +26,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket
{ {
private final Collection<ItemInstance> _items; private final List<ItemInstance> _items = new ArrayList<>();
private long _price; private long _price;
public ExShowBaseAttributeCancelWindow(PlayerInstance player) public ExShowBaseAttributeCancelWindow(PlayerInstance player)
{ {
_items = player.getInventory().getItems(ItemInstance::hasAttributes); for (ItemInstance item : player.getInventory().getItems())
{
if (item.hasAttributes())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -16,8 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -27,14 +27,20 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ItemList extends AbstractItemPacket public class ItemList extends AbstractItemPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final List<ItemInstance> _items;
private final boolean _showWindow; private final boolean _showWindow;
private final List<ItemInstance> _items = new ArrayList<>();
public ItemList(PlayerInstance player, boolean showWindow) public ItemList(PlayerInstance player, boolean showWindow)
{ {
_player = player; _player = player;
_showWindow = showWindow; _showWindow = showWindow;
_items = player.getInventory().getItems(item -> !item.isQuestItem()).stream().collect(Collectors.toList()); for (ItemInstance item : player.getInventory().getItems())
{
if (!item.isQuestItem())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
} }
else else
{ {
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId())) for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{ {
playerIU.addModifiedItem(itemInstance); playerIU.addModifiedItem(itemInstance);
} }
@@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
} }
final PlayerInstance player = caster.getActingPlayer(); final PlayerInstance player = caster.getActingPlayer();
final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getSize(item -> !item.isQuestItem())); final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getNonQuestSize());
final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad()); final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent); return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
} }
@@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse(); final ItemContainer cwh = owner.getWarehouse();
for (CropProcure crop : _procureNext.get(castleId)) for (CropProcure crop : _procureNext.get(castleId))
{ {
if ((crop.getStartAmount() > 0) && (cwh.getItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null)) if ((crop.getStartAmount() > 0) && (cwh.getAllItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null))
{ {
slots++; slots++;
} }
@@ -331,7 +331,13 @@ public class PetInstance extends Summon
{ {
if (_inventory != null) if (_inventory != null)
{ {
return _inventory.getItems(item -> (item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND)).stream().findAny().orElse(null); for (ItemInstance item : _inventory.getItems())
{
if ((item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND))
{
return item;
}
}
} }
return null; return null;
} }
@@ -12956,7 +12956,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder90(boolean includeQuestInv) public boolean isInventoryUnder90(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.9)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.9);
} }
/** /**
@@ -12966,7 +12966,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder80(boolean includeQuestInv) public boolean isInventoryUnder80(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
} }
public boolean havePetInvItems() public boolean havePetInvItems()
@@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{ {
if (effector.getActingPlayer() != null) if (effector.getActingPlayer() != null)
{ {
return effector.getActingPlayer().getInventory().getSize(i -> !i.isQuestItem()) <= (effector.getActingPlayer().getInventoryLimit() - _size); return effector.getActingPlayer().getInventory().getNonQuestSize() <= (effector.getActingPlayer().getInventoryLimit() - _size);
} }
return true; return true;
} }
@@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer()) if ((effected != null) && effected.isPlayer())
{ {
final PlayerInstance target = effected.getActingPlayer(); final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size); return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
} }
return false; return false;
} }
@@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer; import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
/** /**
* A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction. * A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction.
@@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_itemInfos = new ArrayList<>(); _itemInfos = new ArrayList<>();
// Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list. // Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list.
inventory.getItems(item -> !item.isEquipped() && (item.isArmor() || item.isWeapon())).forEach(item -> for (ItemInstance item : inventory.getItems())
{ {
// Check ingredients of each entry to see if it's an entry we'd like to include. if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
for (MultisellEntryHolder entry : list.getEntries())
{ {
for (ItemChanceHolder holder : entry.getIngredients()) // Check ingredients of each entry to see if it's an entry we'd like to include.
for (MultisellEntryHolder entry : list.getEntries())
{ {
if (holder.getId() == item.getId()) for (ItemChanceHolder holder : entry.getIngredients())
{ {
_entries.add(entry); if (holder.getId() == item.getId())
_itemInfos.add(new ItemInfo(item)); {
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
} }
} }
} }
}); }
} }
} }
@@ -887,7 +887,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -922,7 +922,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -1915,7 +1915,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight() protected void refreshWeight()
{ {
long weight = 0; long weight = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item != null) && (item.getItem() != null)) if ((item != null) && (item.getItem() != null))
{ {
@@ -1946,9 +1946,9 @@ public abstract class Inventory extends ItemContainer
} }
ItemInstance arrow = null; ItemInstance arrow = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.ARROW)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.ARROW) && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()))
{ {
arrow = item; arrow = item;
break; break;
@@ -1967,9 +1967,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow) public ItemInstance findBoltForCrossBow(Item crossbow)
{ {
ItemInstance bolt = null; ItemInstance bolt = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.BOLT)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.BOLT) && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()))
{ {
bolt = item; bolt = item;
break; break;
@@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -45,7 +42,8 @@ public abstract class ItemContainer
{ {
protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName()); protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName());
protected final Map<Integer, ItemInstance> _items = new ConcurrentHashMap<>(); protected final List<ItemInstance> _items = new ArrayList<>(1);
private int _questItemSize = 0;
protected ItemContainer() protected ItemContainer()
{ {
@@ -77,28 +75,19 @@ public abstract class ItemContainer
} }
/** /**
* @param filterValue * @return the quantity of quest items in the inventory
* @param filters */
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory * @return the quantity of items in the inventory
*/ */
@SafeVarargs public int getNonQuestSize()
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{ {
Predicate<ItemInstance> filter = filterValue; return _items.size() - _questItemSize;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
} }
/** /**
@@ -107,33 +96,7 @@ public abstract class ItemContainer
*/ */
public Collection<ItemInstance> getItems() public Collection<ItemInstance> getItems()
{ {
return getItems(i -> true); return _items;
}
/**
* Gets the items in inventory filtered by filter.
* @param filterValue the filter
* @param filters multiple filters
* @return the filtered items in inventory
*/
@SafeVarargs
public final Collection<ItemInstance> getItems(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -142,7 +105,7 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByItemId(int itemId) public ItemInstance getItemByItemId(int itemId)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == itemId) if (item.getId() == itemId)
{ {
@@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id * @param itemId the item Id
* @return the items list from inventory by using its itemId * @return the items list from inventory by using its itemId
*/ */
public Collection<ItemInstance> getItemsByItemId(int itemId) public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{ {
return getItems(i -> i.getId() == itemId); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if (itemId == item.getId())
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -167,7 +138,14 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByObjectId(int objectId) public ItemInstance getItemByObjectId(int objectId)
{ {
return _items.get(objectId); for (ItemInstance item : _items)
{
if (objectId == item.getObjectId())
{
return item;
}
}
return null;
} }
/** /**
@@ -191,7 +169,7 @@ public abstract class ItemContainer
public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped) public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped)
{ {
long count = 0; long count = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped())) if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{ {
@@ -210,7 +188,7 @@ public abstract class ItemContainer
*/ */
public boolean haveItemForSelfResurrection() public boolean haveItemForSelfResurrection()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getItem().isAllowSelfResurrection()) if (item.getItem().isAllowSelfResurrection())
{ {
@@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -560,9 +538,12 @@ public abstract class ItemContainer
*/ */
public void destroyAllItems(String process, PlayerInstance actor, Object reference) public void destroyAllItems(String process, PlayerInstance actor, Object reference)
{ {
for (ItemInstance item : _items.values()) synchronized (_items)
{ {
destroyItem(process, item, actor, reference); for (ItemInstance item : _items)
{
destroyItem(process, item, actor, reference);
}
} }
} }
@@ -571,7 +552,7 @@ public abstract class ItemContainer
*/ */
public long getAdena() public long getAdena()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.ADENA_ID) if (item.getId() == Inventory.ADENA_ID)
{ {
@@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets() public long getBeautyTickets()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.BEAUTY_TICKET_ID) if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{ {
@@ -599,7 +580,15 @@ public abstract class ItemContainer
*/ */
protected void addItem(ItemInstance item) protected void addItem(ItemInstance item)
{ {
_items.put(item.getObjectId(), item); synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize++;
}
_items.add(item);
}
} }
/** /**
@@ -609,7 +598,15 @@ public abstract class ItemContainer
*/ */
protected boolean removeItem(ItemInstance item) protected boolean removeItem(ItemInstance item)
{ {
return _items.remove(item.getObjectId()) != null; synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize--;
}
return _items.remove(item);
}
} }
/** /**
@@ -626,7 +623,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -643,7 +640,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId) public void setNewMessageId(int messageId)
{ {
_messageId = messageId; _messageId = messageId;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.setItemLocation(getBaseLocation(), messageId); item.setItemLocation(getBaseLocation(), messageId);
} }
@@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh) public void returnToWh(ItemContainer wh)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (wh == null) if (wh == null)
{ {
@@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override @Override
public void updateDatabase() public void updateDatabase()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override @Override
public void deleteMe() public void deleteMe()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{ {
super.restore(); super.restore();
// check for equipped items from other pets // check for equipped items from other pets
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false)) if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false))
{ {
@@ -125,7 +125,7 @@ public class PetInventory extends Inventory
public void transferItemsToOwner() public void transferItemsToOwner()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner()); getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner());
} }
@@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
@@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena; private ItemInstance _adena;
private ItemInstance _ancientAdena; private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets; private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null; private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE; private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner) public PlayerInventory(PlayerInstance owner)
@@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable) public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{ {
final List<ItemInstance> list = new ArrayList<>(); final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (!allowAdena && (item.getId() == ADENA_ID)) if (!allowAdena && (item.getId() == ADENA_ID))
{ {
@@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
return list; return list;
} }
/**
* @param itemId
* @return
*/
public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{
return getAllItemsByItemId(itemId, true);
}
/** /**
* Returns the list of all items in inventory that have a given item id. * Returns the list of all items in inventory that have a given item id.
* @param itemId : ID of item * @param itemId : ID of item
@@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -196,7 +191,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (i.getEnchantLevel() == enchantment) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (item.getEnchantLevel() == enchantment) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -207,18 +210,24 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable) public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable)
{ {
return getItems(i -> final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{ {
if (!i.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(i.getId())) if (!item.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(item.getId()))
{ {
return false; continue;
} }
else if (feightable) else if (feightable)
{ {
return (i.getItemLocation() == ItemLocation.INVENTORY) && i.isFreightable(); if ((item.getItemLocation() == ItemLocation.INVENTORY) && item.isFreightable())
{
result.add(item);
}
continue;
} }
return true; result.add(item);
}); }
return result;
} }
/** /**
@@ -228,13 +237,19 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<TradeItem> getAvailableItems(TradeList tradeList) public Collection<TradeItem> getAvailableItems(TradeList tradeList)
{ {
//@formatter:off final List<TradeItem> result = new ArrayList<>();
return _items.values().stream() for (ItemInstance item : _items)
.filter(i -> i.isAvailable(_owner, false, false)) {
.map(tradeList::adjustAvailableItem) if ((item != null) && item.isAvailable(_owner, false, false))
.filter(Objects::nonNull) {
.collect(Collectors.toCollection(ArrayList::new)); final TradeItem adjItem = tradeList.adjustAvailableItem(item);
//@formatter:on if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
} }
/** /**
@@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item) public void adjustAvailableItem(TradeItem item)
{ {
boolean notAllEquipped = false; boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId())) for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{ {
if (adjItem.isEquipable()) if (adjItem.isEquipable())
{ {
@@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{ {
final int[][] paperdoll = new int[33][4]; final int[][] paperdoll = new int[33][4];
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement2 = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'")) PreparedStatement ps = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'"))
{ {
statement2.setInt(1, objectId); ps.setInt(1, objectId);
try (ResultSet invdata = statement2.executeQuery()) try (ResultSet invdata = ps.executeQuery())
{ {
while (invdata.next()) while (invdata.next())
{ {
@@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
public boolean validateCapacity(long slots, boolean questItem) public boolean validateCapacity(long slots, boolean questItem)
{ {
return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getSize(item -> item.isQuestItem()) + slots) <= _owner.getQuestInventoryLimit() : (getSize(item -> !item.isQuestItem()) + slots) <= _owner.getInventoryLimit(); return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getQuestSize() + slots) <= _owner.getQuestInventoryLimit() : (getNonQuestSize() + slots) <= _owner.getInventoryLimit();
} }
@Override @Override
@@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/ */
public void applyItemSkills() public void applyItemSkills()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.giveSkillsToOwner(); item.giveSkillsToOwner();
item.applyEnchantStats(); item.applyEnchantStats();
@@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{ {
try try
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null); ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true); item.updateDatabase(true);
@@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use // Reduce talisman mana on skill use
if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO)) if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO))
{ {
final ItemInstance talisman = caster.getInventory().getItems(i -> i.getId() == _skill.getReferenceItemId(), ItemInstance::isEquipped).stream().findAny().orElse(null); for (ItemInstance item : caster.getInventory().getItems())
if (talisman != null)
{ {
talisman.decreaseMana(false, talisman.useSkillDisTime()); if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
} }
} }
@@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg); player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate(); final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item); iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId)) for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{ {
iu.addItem(i); iu.addItem(i);
} }
@@ -37,7 +37,7 @@ public class BuyList extends AbstractItemPacket
_listId = list.getListId(); _listId = list.getListId();
_list = list.getProducts(); _list = list.getProducts();
_money = player.getAdena(); _money = player.getAdena();
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size(); _inventorySlots = player.getInventory().getNonQuestSize();
_castleTaxRate = castleTaxRate; _castleTaxRate = castleTaxRate;
} }
@@ -16,7 +16,9 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
@@ -30,7 +32,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/ */
public class ExBuySellList extends AbstractItemPacket public class ExBuySellList extends AbstractItemPacket
{ {
private final Collection<ItemInstance> _sellList; private final List<ItemInstance> _sellList = new ArrayList<>();
private Collection<ItemInstance> _refundList = null; private Collection<ItemInstance> _refundList = null;
private final boolean _done; private final boolean _done;
private final int _inventorySlots; private final int _inventorySlots;
@@ -38,8 +40,14 @@ public class ExBuySellList extends AbstractItemPacket
public ExBuySellList(PlayerInstance player, boolean done) public ExBuySellList(PlayerInstance player, boolean done)
{ {
final Summon pet = player.getPet(); final Summon pet = player.getPet();
_sellList = player.getInventory().getItems(item -> !item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId()))); for (ItemInstance item : player.getInventory().getItems())
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size(); {
if (!item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())))
{
_sellList.add(item);
}
}
_inventorySlots = player.getInventory().getNonQuestSize();
if (player.hasRefund()) if (player.hasRefund())
{ {
_refundList = player.getRefund().getItems(); _refundList = player.getRefund().getItems();
@@ -16,7 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection; import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -29,12 +30,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExQuestItemList extends AbstractItemPacket public class ExQuestItemList extends AbstractItemPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final Collection<ItemInstance> _items; private final List<ItemInstance> _items = new ArrayList<>();
public ExQuestItemList(PlayerInstance player) public ExQuestItemList(PlayerInstance player)
{ {
_player = player; _player = player;
_items = player.getInventory().getItems(ItemInstance::isQuestItem); for (ItemInstance item : player.getInventory().getItems())
{
if (item.isQuestItem())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -16,7 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection; import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -25,12 +26,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket
{ {
private final Collection<ItemInstance> _items; private final List<ItemInstance> _items = new ArrayList<>();
private long _price; private long _price;
public ExShowBaseAttributeCancelWindow(PlayerInstance player) public ExShowBaseAttributeCancelWindow(PlayerInstance player)
{ {
_items = player.getInventory().getItems(ItemInstance::hasAttributes); for (ItemInstance item : player.getInventory().getItems())
{
if (item.hasAttributes())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -16,8 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -27,14 +27,20 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ItemList extends AbstractItemPacket public class ItemList extends AbstractItemPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final List<ItemInstance> _items;
private final boolean _showWindow; private final boolean _showWindow;
private final List<ItemInstance> _items = new ArrayList<>();
public ItemList(PlayerInstance player, boolean showWindow) public ItemList(PlayerInstance player, boolean showWindow)
{ {
_player = player; _player = player;
_showWindow = showWindow; _showWindow = showWindow;
_items = player.getInventory().getItems(item -> !item.isQuestItem()).stream().collect(Collectors.toList()); for (ItemInstance item : player.getInventory().getItems())
{
if (!item.isQuestItem())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
} }
else else
{ {
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId())) for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{ {
playerIU.addModifiedItem(itemInstance); playerIU.addModifiedItem(itemInstance);
} }
@@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
} }
final PlayerInstance player = caster.getActingPlayer(); final PlayerInstance player = caster.getActingPlayer();
final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getSize(item -> !item.isQuestItem())); final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getNonQuestSize());
final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad()); final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent); return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
} }
@@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse(); final ItemContainer cwh = owner.getWarehouse();
for (CropProcure crop : _procureNext.get(castleId)) for (CropProcure crop : _procureNext.get(castleId))
{ {
if ((crop.getStartAmount() > 0) && (cwh.getItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null)) if ((crop.getStartAmount() > 0) && (cwh.getAllItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null))
{ {
slots++; slots++;
} }
@@ -331,7 +331,13 @@ public class PetInstance extends Summon
{ {
if (_inventory != null) if (_inventory != null)
{ {
return _inventory.getItems(item -> (item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND)).stream().findAny().orElse(null); for (ItemInstance item : _inventory.getItems())
{
if ((item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND))
{
return item;
}
}
} }
return null; return null;
} }
@@ -12958,7 +12958,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder90(boolean includeQuestInv) public boolean isInventoryUnder90(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.9)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.9);
} }
/** /**
@@ -12968,7 +12968,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder80(boolean includeQuestInv) public boolean isInventoryUnder80(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
} }
public boolean havePetInvItems() public boolean havePetInvItems()
@@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{ {
if (effector.getActingPlayer() != null) if (effector.getActingPlayer() != null)
{ {
return effector.getActingPlayer().getInventory().getSize(i -> !i.isQuestItem()) <= (effector.getActingPlayer().getInventoryLimit() - _size); return effector.getActingPlayer().getInventory().getNonQuestSize() <= (effector.getActingPlayer().getInventoryLimit() - _size);
} }
return true; return true;
} }
@@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer()) if ((effected != null) && effected.isPlayer())
{ {
final PlayerInstance target = effected.getActingPlayer(); final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size); return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
} }
return false; return false;
} }
@@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer; import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
/** /**
* A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction. * A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction.
@@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_itemInfos = new ArrayList<>(); _itemInfos = new ArrayList<>();
// Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list. // Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list.
inventory.getItems(item -> !item.isEquipped() && (item.isArmor() || item.isWeapon())).forEach(item -> for (ItemInstance item : inventory.getItems())
{ {
// Check ingredients of each entry to see if it's an entry we'd like to include. if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
for (MultisellEntryHolder entry : list.getEntries())
{ {
for (ItemChanceHolder holder : entry.getIngredients()) // Check ingredients of each entry to see if it's an entry we'd like to include.
for (MultisellEntryHolder entry : list.getEntries())
{ {
if (holder.getId() == item.getId()) for (ItemChanceHolder holder : entry.getIngredients())
{ {
_entries.add(entry); if (holder.getId() == item.getId())
_itemInfos.add(new ItemInfo(item)); {
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
} }
} }
} }
}); }
} }
} }
@@ -887,7 +887,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -922,7 +922,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -1915,7 +1915,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight() protected void refreshWeight()
{ {
long weight = 0; long weight = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item != null) && (item.getItem() != null)) if ((item != null) && (item.getItem() != null))
{ {
@@ -1946,9 +1946,9 @@ public abstract class Inventory extends ItemContainer
} }
ItemInstance arrow = null; ItemInstance arrow = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.ARROW)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.ARROW) && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()))
{ {
arrow = item; arrow = item;
break; break;
@@ -1967,9 +1967,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow) public ItemInstance findBoltForCrossBow(Item crossbow)
{ {
ItemInstance bolt = null; ItemInstance bolt = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.BOLT)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.BOLT) && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()))
{ {
bolt = item; bolt = item;
break; break;
@@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -45,7 +42,8 @@ public abstract class ItemContainer
{ {
protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName()); protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName());
protected final Map<Integer, ItemInstance> _items = new ConcurrentHashMap<>(); protected final List<ItemInstance> _items = new ArrayList<>(1);
private int _questItemSize = 0;
protected ItemContainer() protected ItemContainer()
{ {
@@ -77,28 +75,19 @@ public abstract class ItemContainer
} }
/** /**
* @param filterValue * @return the quantity of quest items in the inventory
* @param filters */
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory * @return the quantity of items in the inventory
*/ */
@SafeVarargs public int getNonQuestSize()
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{ {
Predicate<ItemInstance> filter = filterValue; return _items.size() - _questItemSize;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
} }
/** /**
@@ -107,33 +96,7 @@ public abstract class ItemContainer
*/ */
public Collection<ItemInstance> getItems() public Collection<ItemInstance> getItems()
{ {
return getItems(i -> true); return _items;
}
/**
* Gets the items in inventory filtered by filter.
* @param filterValue the filter
* @param filters multiple filters
* @return the filtered items in inventory
*/
@SafeVarargs
public final Collection<ItemInstance> getItems(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -142,7 +105,7 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByItemId(int itemId) public ItemInstance getItemByItemId(int itemId)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == itemId) if (item.getId() == itemId)
{ {
@@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id * @param itemId the item Id
* @return the items list from inventory by using its itemId * @return the items list from inventory by using its itemId
*/ */
public Collection<ItemInstance> getItemsByItemId(int itemId) public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{ {
return getItems(i -> i.getId() == itemId); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if (itemId == item.getId())
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -167,7 +138,14 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByObjectId(int objectId) public ItemInstance getItemByObjectId(int objectId)
{ {
return _items.get(objectId); for (ItemInstance item : _items)
{
if (objectId == item.getObjectId())
{
return item;
}
}
return null;
} }
/** /**
@@ -191,7 +169,7 @@ public abstract class ItemContainer
public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped) public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped)
{ {
long count = 0; long count = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped())) if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{ {
@@ -210,7 +188,7 @@ public abstract class ItemContainer
*/ */
public boolean haveItemForSelfResurrection() public boolean haveItemForSelfResurrection()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getItem().isAllowSelfResurrection()) if (item.getItem().isAllowSelfResurrection())
{ {
@@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -560,9 +538,12 @@ public abstract class ItemContainer
*/ */
public void destroyAllItems(String process, PlayerInstance actor, Object reference) public void destroyAllItems(String process, PlayerInstance actor, Object reference)
{ {
for (ItemInstance item : _items.values()) synchronized (_items)
{ {
destroyItem(process, item, actor, reference); for (ItemInstance item : _items)
{
destroyItem(process, item, actor, reference);
}
} }
} }
@@ -571,7 +552,7 @@ public abstract class ItemContainer
*/ */
public long getAdena() public long getAdena()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.ADENA_ID) if (item.getId() == Inventory.ADENA_ID)
{ {
@@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets() public long getBeautyTickets()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.BEAUTY_TICKET_ID) if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{ {
@@ -599,7 +580,15 @@ public abstract class ItemContainer
*/ */
protected void addItem(ItemInstance item) protected void addItem(ItemInstance item)
{ {
_items.put(item.getObjectId(), item); synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize++;
}
_items.add(item);
}
} }
/** /**
@@ -609,7 +598,15 @@ public abstract class ItemContainer
*/ */
protected boolean removeItem(ItemInstance item) protected boolean removeItem(ItemInstance item)
{ {
return _items.remove(item.getObjectId()) != null; synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize--;
}
return _items.remove(item);
}
} }
/** /**
@@ -626,7 +623,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -643,7 +640,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId) public void setNewMessageId(int messageId)
{ {
_messageId = messageId; _messageId = messageId;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.setItemLocation(getBaseLocation(), messageId); item.setItemLocation(getBaseLocation(), messageId);
} }
@@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh) public void returnToWh(ItemContainer wh)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (wh == null) if (wh == null)
{ {
@@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override @Override
public void updateDatabase() public void updateDatabase()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override @Override
public void deleteMe() public void deleteMe()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{ {
super.restore(); super.restore();
// check for equipped items from other pets // check for equipped items from other pets
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false)) if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false))
{ {
@@ -125,7 +125,7 @@ public class PetInventory extends Inventory
public void transferItemsToOwner() public void transferItemsToOwner()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner()); getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner());
} }
@@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
@@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena; private ItemInstance _adena;
private ItemInstance _ancientAdena; private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets; private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null; private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE; private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner) public PlayerInventory(PlayerInstance owner)
@@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable) public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{ {
final List<ItemInstance> list = new ArrayList<>(); final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (!allowAdena && (item.getId() == ADENA_ID)) if (!allowAdena && (item.getId() == ADENA_ID))
{ {
@@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
return list; return list;
} }
/**
* @param itemId
* @return
*/
public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{
return getAllItemsByItemId(itemId, true);
}
/** /**
* Returns the list of all items in inventory that have a given item id. * Returns the list of all items in inventory that have a given item id.
* @param itemId : ID of item * @param itemId : ID of item
@@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -196,7 +191,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (i.getEnchantLevel() == enchantment) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (item.getEnchantLevel() == enchantment) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -207,18 +210,24 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable) public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable)
{ {
return getItems(i -> final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{ {
if (!i.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(i.getId())) if (!item.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(item.getId()))
{ {
return false; continue;
} }
else if (feightable) else if (feightable)
{ {
return (i.getItemLocation() == ItemLocation.INVENTORY) && i.isFreightable(); if ((item.getItemLocation() == ItemLocation.INVENTORY) && item.isFreightable())
{
result.add(item);
}
continue;
} }
return true; result.add(item);
}); }
return result;
} }
/** /**
@@ -228,13 +237,19 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<TradeItem> getAvailableItems(TradeList tradeList) public Collection<TradeItem> getAvailableItems(TradeList tradeList)
{ {
//@formatter:off final List<TradeItem> result = new ArrayList<>();
return _items.values().stream() for (ItemInstance item : _items)
.filter(i -> i.isAvailable(_owner, false, false)) {
.map(tradeList::adjustAvailableItem) if ((item != null) && item.isAvailable(_owner, false, false))
.filter(Objects::nonNull) {
.collect(Collectors.toCollection(ArrayList::new)); final TradeItem adjItem = tradeList.adjustAvailableItem(item);
//@formatter:on if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
} }
/** /**
@@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item) public void adjustAvailableItem(TradeItem item)
{ {
boolean notAllEquipped = false; boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId())) for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{ {
if (adjItem.isEquipable()) if (adjItem.isEquipable())
{ {
@@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{ {
final int[][] paperdoll = new int[33][4]; final int[][] paperdoll = new int[33][4];
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement2 = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'")) PreparedStatement ps = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'"))
{ {
statement2.setInt(1, objectId); ps.setInt(1, objectId);
try (ResultSet invdata = statement2.executeQuery()) try (ResultSet invdata = ps.executeQuery())
{ {
while (invdata.next()) while (invdata.next())
{ {
@@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
public boolean validateCapacity(long slots, boolean questItem) public boolean validateCapacity(long slots, boolean questItem)
{ {
return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getSize(item -> item.isQuestItem()) + slots) <= _owner.getQuestInventoryLimit() : (getSize(item -> !item.isQuestItem()) + slots) <= _owner.getInventoryLimit(); return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getQuestSize() + slots) <= _owner.getQuestInventoryLimit() : (getNonQuestSize() + slots) <= _owner.getInventoryLimit();
} }
@Override @Override
@@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/ */
public void applyItemSkills() public void applyItemSkills()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.giveSkillsToOwner(); item.giveSkillsToOwner();
item.applyEnchantStats(); item.applyEnchantStats();
@@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{ {
try try
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null); ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true); item.updateDatabase(true);
@@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use // Reduce talisman mana on skill use
if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO)) if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO))
{ {
final ItemInstance talisman = caster.getInventory().getItems(i -> i.getId() == _skill.getReferenceItemId(), ItemInstance::isEquipped).stream().findAny().orElse(null); for (ItemInstance item : caster.getInventory().getItems())
if (talisman != null)
{ {
talisman.decreaseMana(false, talisman.useSkillDisTime()); if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
} }
} }
@@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg); player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate(); final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item); iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId)) for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{ {
iu.addItem(i); iu.addItem(i);
} }
@@ -37,7 +37,7 @@ public class BuyList extends AbstractItemPacket
_listId = list.getListId(); _listId = list.getListId();
_list = list.getProducts(); _list = list.getProducts();
_money = player.getAdena(); _money = player.getAdena();
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size(); _inventorySlots = player.getInventory().getNonQuestSize();
_castleTaxRate = castleTaxRate; _castleTaxRate = castleTaxRate;
} }
@@ -16,7 +16,9 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
@@ -30,7 +32,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/ */
public class ExBuySellList extends AbstractItemPacket public class ExBuySellList extends AbstractItemPacket
{ {
private final Collection<ItemInstance> _sellList; private final List<ItemInstance> _sellList = new ArrayList<>();
private Collection<ItemInstance> _refundList = null; private Collection<ItemInstance> _refundList = null;
private final boolean _done; private final boolean _done;
private final int _inventorySlots; private final int _inventorySlots;
@@ -38,8 +40,14 @@ public class ExBuySellList extends AbstractItemPacket
public ExBuySellList(PlayerInstance player, boolean done) public ExBuySellList(PlayerInstance player, boolean done)
{ {
final Summon pet = player.getPet(); final Summon pet = player.getPet();
_sellList = player.getInventory().getItems(item -> !item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId()))); for (ItemInstance item : player.getInventory().getItems())
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size(); {
if (!item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())))
{
_sellList.add(item);
}
}
_inventorySlots = player.getInventory().getNonQuestSize();
if (player.hasRefund()) if (player.hasRefund())
{ {
_refundList = player.getRefund().getItems(); _refundList = player.getRefund().getItems();
@@ -16,7 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection; import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -29,12 +30,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExQuestItemList extends AbstractItemPacket public class ExQuestItemList extends AbstractItemPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final Collection<ItemInstance> _items; private final List<ItemInstance> _items = new ArrayList<>();
public ExQuestItemList(PlayerInstance player) public ExQuestItemList(PlayerInstance player)
{ {
_player = player; _player = player;
_items = player.getInventory().getItems(ItemInstance::isQuestItem); for (ItemInstance item : player.getInventory().getItems())
{
if (item.isQuestItem())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -16,7 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection; import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -25,12 +26,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket
{ {
private final Collection<ItemInstance> _items; private final List<ItemInstance> _items = new ArrayList<>();
private long _price; private long _price;
public ExShowBaseAttributeCancelWindow(PlayerInstance player) public ExShowBaseAttributeCancelWindow(PlayerInstance player)
{ {
_items = player.getInventory().getItems(ItemInstance::hasAttributes); for (ItemInstance item : player.getInventory().getItems())
{
if (item.hasAttributes())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -16,8 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -27,14 +27,20 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ItemList extends AbstractItemPacket public class ItemList extends AbstractItemPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final List<ItemInstance> _items;
private final boolean _showWindow; private final boolean _showWindow;
private final List<ItemInstance> _items = new ArrayList<>();
public ItemList(PlayerInstance player, boolean showWindow) public ItemList(PlayerInstance player, boolean showWindow)
{ {
_player = player; _player = player;
_showWindow = showWindow; _showWindow = showWindow;
_items = player.getInventory().getItems(item -> !item.isQuestItem()).stream().collect(Collectors.toList()); for (ItemInstance item : player.getInventory().getItems())
{
if (!item.isQuestItem())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
} }
else else
{ {
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId())) for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{ {
playerIU.addModifiedItem(itemInstance); playerIU.addModifiedItem(itemInstance);
} }
@@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
} }
final PlayerInstance player = caster.getActingPlayer(); final PlayerInstance player = caster.getActingPlayer();
final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getSize(item -> !item.isQuestItem())); final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getNonQuestSize());
final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad()); final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent); return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
} }
@@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse(); final ItemContainer cwh = owner.getWarehouse();
for (CropProcure crop : _procureNext.get(castleId)) for (CropProcure crop : _procureNext.get(castleId))
{ {
if ((crop.getStartAmount() > 0) && (cwh.getItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null)) if ((crop.getStartAmount() > 0) && (cwh.getAllItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null))
{ {
slots++; slots++;
} }
@@ -331,7 +331,13 @@ public class PetInstance extends Summon
{ {
if (_inventory != null) if (_inventory != null)
{ {
return _inventory.getItems(item -> (item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND)).stream().findAny().orElse(null); for (ItemInstance item : _inventory.getItems())
{
if ((item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND))
{
return item;
}
}
} }
return null; return null;
} }
@@ -12938,7 +12938,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder90(boolean includeQuestInv) public boolean isInventoryUnder90(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.9)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.9);
} }
/** /**
@@ -12948,7 +12948,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder80(boolean includeQuestInv) public boolean isInventoryUnder80(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
} }
public boolean havePetInvItems() public boolean havePetInvItems()
@@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{ {
if (effector.getActingPlayer() != null) if (effector.getActingPlayer() != null)
{ {
return effector.getActingPlayer().getInventory().getSize(i -> !i.isQuestItem()) <= (effector.getActingPlayer().getInventoryLimit() - _size); return effector.getActingPlayer().getInventory().getNonQuestSize() <= (effector.getActingPlayer().getInventoryLimit() - _size);
} }
return true; return true;
} }
@@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer()) if ((effected != null) && effected.isPlayer())
{ {
final PlayerInstance target = effected.getActingPlayer(); final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size); return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
} }
return false; return false;
} }
@@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer; import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
/** /**
* A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction. * A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction.
@@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_itemInfos = new ArrayList<>(); _itemInfos = new ArrayList<>();
// Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list. // Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list.
inventory.getItems(item -> !item.isEquipped() && (item.isArmor() || item.isWeapon())).forEach(item -> for (ItemInstance item : inventory.getItems())
{ {
// Check ingredients of each entry to see if it's an entry we'd like to include. if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
for (MultisellEntryHolder entry : list.getEntries())
{ {
for (ItemChanceHolder holder : entry.getIngredients()) // Check ingredients of each entry to see if it's an entry we'd like to include.
for (MultisellEntryHolder entry : list.getEntries())
{ {
if (holder.getId() == item.getId()) for (ItemChanceHolder holder : entry.getIngredients())
{ {
_entries.add(entry); if (holder.getId() == item.getId())
_itemInfos.add(new ItemInfo(item)); {
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
} }
} }
} }
}); }
} }
} }
@@ -887,7 +887,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -922,7 +922,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -1915,7 +1915,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight() protected void refreshWeight()
{ {
long weight = 0; long weight = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item != null) && (item.getItem() != null)) if ((item != null) && (item.getItem() != null))
{ {
@@ -1946,9 +1946,9 @@ public abstract class Inventory extends ItemContainer
} }
ItemInstance arrow = null; ItemInstance arrow = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.ARROW)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.ARROW) && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()))
{ {
arrow = item; arrow = item;
break; break;
@@ -1967,9 +1967,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow) public ItemInstance findBoltForCrossBow(Item crossbow)
{ {
ItemInstance bolt = null; ItemInstance bolt = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.BOLT)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.BOLT) && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()))
{ {
bolt = item; bolt = item;
break; break;
@@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -45,7 +42,8 @@ public abstract class ItemContainer
{ {
protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName()); protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName());
protected final Map<Integer, ItemInstance> _items = new ConcurrentHashMap<>(); protected final List<ItemInstance> _items = new ArrayList<>(1);
private int _questItemSize = 0;
protected ItemContainer() protected ItemContainer()
{ {
@@ -77,28 +75,19 @@ public abstract class ItemContainer
} }
/** /**
* @param filterValue * @return the quantity of quest items in the inventory
* @param filters */
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory * @return the quantity of items in the inventory
*/ */
@SafeVarargs public int getNonQuestSize()
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{ {
Predicate<ItemInstance> filter = filterValue; return _items.size() - _questItemSize;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
} }
/** /**
@@ -107,33 +96,7 @@ public abstract class ItemContainer
*/ */
public Collection<ItemInstance> getItems() public Collection<ItemInstance> getItems()
{ {
return getItems(i -> true); return _items;
}
/**
* Gets the items in inventory filtered by filter.
* @param filterValue the filter
* @param filters multiple filters
* @return the filtered items in inventory
*/
@SafeVarargs
public final Collection<ItemInstance> getItems(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -142,7 +105,7 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByItemId(int itemId) public ItemInstance getItemByItemId(int itemId)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == itemId) if (item.getId() == itemId)
{ {
@@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id * @param itemId the item Id
* @return the items list from inventory by using its itemId * @return the items list from inventory by using its itemId
*/ */
public Collection<ItemInstance> getItemsByItemId(int itemId) public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{ {
return getItems(i -> i.getId() == itemId); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if (itemId == item.getId())
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -167,7 +138,14 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByObjectId(int objectId) public ItemInstance getItemByObjectId(int objectId)
{ {
return _items.get(objectId); for (ItemInstance item : _items)
{
if (objectId == item.getObjectId())
{
return item;
}
}
return null;
} }
/** /**
@@ -191,7 +169,7 @@ public abstract class ItemContainer
public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped) public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped)
{ {
long count = 0; long count = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped())) if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{ {
@@ -210,7 +188,7 @@ public abstract class ItemContainer
*/ */
public boolean haveItemForSelfResurrection() public boolean haveItemForSelfResurrection()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getItem().isAllowSelfResurrection()) if (item.getItem().isAllowSelfResurrection())
{ {
@@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -560,9 +538,12 @@ public abstract class ItemContainer
*/ */
public void destroyAllItems(String process, PlayerInstance actor, Object reference) public void destroyAllItems(String process, PlayerInstance actor, Object reference)
{ {
for (ItemInstance item : _items.values()) synchronized (_items)
{ {
destroyItem(process, item, actor, reference); for (ItemInstance item : _items)
{
destroyItem(process, item, actor, reference);
}
} }
} }
@@ -571,7 +552,7 @@ public abstract class ItemContainer
*/ */
public long getAdena() public long getAdena()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.ADENA_ID) if (item.getId() == Inventory.ADENA_ID)
{ {
@@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets() public long getBeautyTickets()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.BEAUTY_TICKET_ID) if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{ {
@@ -599,7 +580,15 @@ public abstract class ItemContainer
*/ */
protected void addItem(ItemInstance item) protected void addItem(ItemInstance item)
{ {
_items.put(item.getObjectId(), item); synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize++;
}
_items.add(item);
}
} }
/** /**
@@ -609,7 +598,15 @@ public abstract class ItemContainer
*/ */
protected boolean removeItem(ItemInstance item) protected boolean removeItem(ItemInstance item)
{ {
return _items.remove(item.getObjectId()) != null; synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize--;
}
return _items.remove(item);
}
} }
/** /**
@@ -626,7 +623,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -643,7 +640,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId) public void setNewMessageId(int messageId)
{ {
_messageId = messageId; _messageId = messageId;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.setItemLocation(getBaseLocation(), messageId); item.setItemLocation(getBaseLocation(), messageId);
} }
@@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh) public void returnToWh(ItemContainer wh)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (wh == null) if (wh == null)
{ {
@@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override @Override
public void updateDatabase() public void updateDatabase()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override @Override
public void deleteMe() public void deleteMe()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{ {
super.restore(); super.restore();
// check for equipped items from other pets // check for equipped items from other pets
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false)) if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false))
{ {
@@ -125,7 +125,7 @@ public class PetInventory extends Inventory
public void transferItemsToOwner() public void transferItemsToOwner()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner()); getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner());
} }
@@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
@@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena; private ItemInstance _adena;
private ItemInstance _ancientAdena; private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets; private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null; private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE; private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner) public PlayerInventory(PlayerInstance owner)
@@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable) public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{ {
final List<ItemInstance> list = new ArrayList<>(); final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (!allowAdena && (item.getId() == ADENA_ID)) if (!allowAdena && (item.getId() == ADENA_ID))
{ {
@@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
return list; return list;
} }
/**
* @param itemId
* @return
*/
public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{
return getAllItemsByItemId(itemId, true);
}
/** /**
* Returns the list of all items in inventory that have a given item id. * Returns the list of all items in inventory that have a given item id.
* @param itemId : ID of item * @param itemId : ID of item
@@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -196,7 +191,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (i.getEnchantLevel() == enchantment) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (item.getEnchantLevel() == enchantment) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -207,18 +210,24 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable) public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable)
{ {
return getItems(i -> final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{ {
if (!i.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(i.getId())) if (!item.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(item.getId()))
{ {
return false; continue;
} }
else if (feightable) else if (feightable)
{ {
return (i.getItemLocation() == ItemLocation.INVENTORY) && i.isFreightable(); if ((item.getItemLocation() == ItemLocation.INVENTORY) && item.isFreightable())
{
result.add(item);
}
continue;
} }
return true; result.add(item);
}); }
return result;
} }
/** /**
@@ -228,13 +237,19 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<TradeItem> getAvailableItems(TradeList tradeList) public Collection<TradeItem> getAvailableItems(TradeList tradeList)
{ {
//@formatter:off final List<TradeItem> result = new ArrayList<>();
return _items.values().stream() for (ItemInstance item : _items)
.filter(i -> i.isAvailable(_owner, false, false)) {
.map(tradeList::adjustAvailableItem) if ((item != null) && item.isAvailable(_owner, false, false))
.filter(Objects::nonNull) {
.collect(Collectors.toCollection(ArrayList::new)); final TradeItem adjItem = tradeList.adjustAvailableItem(item);
//@formatter:on if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
} }
/** /**
@@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item) public void adjustAvailableItem(TradeItem item)
{ {
boolean notAllEquipped = false; boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId())) for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{ {
if (adjItem.isEquipable()) if (adjItem.isEquipable())
{ {
@@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{ {
final int[][] paperdoll = new int[33][4]; final int[][] paperdoll = new int[33][4];
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement2 = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'")) PreparedStatement ps = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'"))
{ {
statement2.setInt(1, objectId); ps.setInt(1, objectId);
try (ResultSet invdata = statement2.executeQuery()) try (ResultSet invdata = ps.executeQuery())
{ {
while (invdata.next()) while (invdata.next())
{ {
@@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
public boolean validateCapacity(long slots, boolean questItem) public boolean validateCapacity(long slots, boolean questItem)
{ {
return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getSize(item -> item.isQuestItem()) + slots) <= _owner.getQuestInventoryLimit() : (getSize(item -> !item.isQuestItem()) + slots) <= _owner.getInventoryLimit(); return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getQuestSize() + slots) <= _owner.getQuestInventoryLimit() : (getNonQuestSize() + slots) <= _owner.getInventoryLimit();
} }
@Override @Override
@@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/ */
public void applyItemSkills() public void applyItemSkills()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.giveSkillsToOwner(); item.giveSkillsToOwner();
item.applyEnchantStats(); item.applyEnchantStats();
@@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{ {
try try
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null); ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true); item.updateDatabase(true);
@@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use // Reduce talisman mana on skill use
if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO)) if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO))
{ {
final ItemInstance talisman = caster.getInventory().getItems(i -> i.getId() == _skill.getReferenceItemId(), ItemInstance::isEquipped).stream().findAny().orElse(null); for (ItemInstance item : caster.getInventory().getItems())
if (talisman != null)
{ {
talisman.decreaseMana(false, talisman.useSkillDisTime()); if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
} }
} }
@@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg); player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate(); final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item); iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId)) for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{ {
iu.addItem(i); iu.addItem(i);
} }
@@ -37,7 +37,7 @@ public class BuyList extends AbstractItemPacket
_listId = list.getListId(); _listId = list.getListId();
_list = list.getProducts(); _list = list.getProducts();
_money = player.getAdena(); _money = player.getAdena();
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size(); _inventorySlots = player.getInventory().getNonQuestSize();
_castleTaxRate = castleTaxRate; _castleTaxRate = castleTaxRate;
} }
@@ -16,7 +16,9 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
@@ -30,7 +32,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/ */
public class ExBuySellList extends AbstractItemPacket public class ExBuySellList extends AbstractItemPacket
{ {
private final Collection<ItemInstance> _sellList; private final List<ItemInstance> _sellList = new ArrayList<>();
private Collection<ItemInstance> _refundList = null; private Collection<ItemInstance> _refundList = null;
private final boolean _done; private final boolean _done;
private final int _inventorySlots; private final int _inventorySlots;
@@ -38,8 +40,14 @@ public class ExBuySellList extends AbstractItemPacket
public ExBuySellList(PlayerInstance player, boolean done) public ExBuySellList(PlayerInstance player, boolean done)
{ {
final Summon pet = player.getPet(); final Summon pet = player.getPet();
_sellList = player.getInventory().getItems(item -> !item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId()))); for (ItemInstance item : player.getInventory().getItems())
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size(); {
if (!item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())))
{
_sellList.add(item);
}
}
_inventorySlots = player.getInventory().getNonQuestSize();
if (player.hasRefund()) if (player.hasRefund())
{ {
_refundList = player.getRefund().getItems(); _refundList = player.getRefund().getItems();
@@ -16,7 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection; import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -29,12 +30,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExQuestItemList extends AbstractItemPacket public class ExQuestItemList extends AbstractItemPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final Collection<ItemInstance> _items; private final List<ItemInstance> _items = new ArrayList<>();
public ExQuestItemList(PlayerInstance player) public ExQuestItemList(PlayerInstance player)
{ {
_player = player; _player = player;
_items = player.getInventory().getItems(ItemInstance::isQuestItem); for (ItemInstance item : player.getInventory().getItems())
{
if (item.isQuestItem())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -16,7 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection; import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -25,12 +26,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket
{ {
private final Collection<ItemInstance> _items; private final List<ItemInstance> _items = new ArrayList<>();
private long _price; private long _price;
public ExShowBaseAttributeCancelWindow(PlayerInstance player) public ExShowBaseAttributeCancelWindow(PlayerInstance player)
{ {
_items = player.getInventory().getItems(ItemInstance::hasAttributes); for (ItemInstance item : player.getInventory().getItems())
{
if (item.hasAttributes())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -16,8 +16,8 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -27,14 +27,20 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ItemList extends AbstractItemPacket public class ItemList extends AbstractItemPacket
{ {
private final PlayerInstance _player; private final PlayerInstance _player;
private final List<ItemInstance> _items;
private final boolean _showWindow; private final boolean _showWindow;
private final List<ItemInstance> _items = new ArrayList<>();
public ItemList(PlayerInstance player, boolean showWindow) public ItemList(PlayerInstance player, boolean showWindow)
{ {
_player = player; _player = player;
_showWindow = showWindow; _showWindow = showWindow;
_items = player.getInventory().getItems(item -> !item.isQuestItem()).stream().collect(Collectors.toList()); for (ItemInstance item : player.getInventory().getItems())
{
if (!item.isQuestItem())
{
_items.add(item);
}
}
} }
@Override @Override
@@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
} }
else else
{ {
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId())) for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{ {
playerIU.addModifiedItem(itemInstance); playerIU.addModifiedItem(itemInstance);
} }
@@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
} }
final PlayerInstance player = caster.getActingPlayer(); final PlayerInstance player = caster.getActingPlayer();
final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getSize(item -> !item.isQuestItem())); final int currentSlotsPercent = calcPercent(player.getInventoryLimit(), player.getInventory().getNonQuestSize());
final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad()); final int currentWeightPercent = calcPercent(player.getMaxLoad(), player.getCurrentLoad());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent); return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
} }
@@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse(); final ItemContainer cwh = owner.getWarehouse();
for (CropProcure crop : _procureNext.get(castleId)) for (CropProcure crop : _procureNext.get(castleId))
{ {
if ((crop.getStartAmount() > 0) && (cwh.getItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null)) if ((crop.getStartAmount() > 0) && (cwh.getAllItemsByItemId(getSeedByCrop(crop.getId()).getMatureId()) == null))
{ {
slots++; slots++;
} }
@@ -332,7 +332,13 @@ public class PetInstance extends Summon
{ {
if (_inventory != null) if (_inventory != null)
{ {
return _inventory.getItems(item -> (item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND)).stream().findAny().orElse(null); for (ItemInstance item : _inventory.getItems())
{
if ((item.getItemLocation() == ItemLocation.PET_EQUIP) && (item.getItem().getBodyPart() == Item.SLOT_R_HAND))
{
return item;
}
}
} }
return null; return null;
} }
@@ -12925,7 +12925,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder90(boolean includeQuestInv) public boolean isInventoryUnder90(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.9)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.9);
} }
/** /**
@@ -12935,7 +12935,7 @@ public class PlayerInstance extends Playable
*/ */
public boolean isInventoryUnder80(boolean includeQuestInv) public boolean isInventoryUnder80(boolean includeQuestInv)
{ {
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8)); return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
} }
public boolean havePetInvItems() public boolean havePetInvItems()
@@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{ {
if (effector.getActingPlayer() != null) if (effector.getActingPlayer() != null)
{ {
return effector.getActingPlayer().getInventory().getSize(i -> !i.isQuestItem()) <= (effector.getActingPlayer().getInventoryLimit() - _size); return effector.getActingPlayer().getInventory().getNonQuestSize() <= (effector.getActingPlayer().getInventoryLimit() - _size);
} }
return true; return true;
} }
@@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer()) if ((effected != null) && effected.isPlayer())
{ {
final PlayerInstance target = effected.getActingPlayer(); final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size); return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
} }
return false; return false;
} }
@@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory; import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer; import org.l2jmobius.gameserver.model.itemcontainer.ItemContainer;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
/** /**
* A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction. * A modified version of {@link MultisellListHolder} that may include altered data of the original and other dynamic data resulted from players' interraction.
@@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_itemInfos = new ArrayList<>(); _itemInfos = new ArrayList<>();
// Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list. // Only do the match up on equippable items that are not currently equipped. For each appropriate item, produce a set of entries for the multisell list.
inventory.getItems(item -> !item.isEquipped() && (item.isArmor() || item.isWeapon())).forEach(item -> for (ItemInstance item : inventory.getItems())
{ {
// Check ingredients of each entry to see if it's an entry we'd like to include. if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
for (MultisellEntryHolder entry : list.getEntries())
{ {
for (ItemChanceHolder holder : entry.getIngredients()) // Check ingredients of each entry to see if it's an entry we'd like to include.
for (MultisellEntryHolder entry : list.getEntries())
{ {
if (holder.getId() == item.getId()) for (ItemChanceHolder holder : entry.getIngredients())
{ {
_entries.add(entry); if (holder.getId() == item.getId())
_itemInfos.add(new ItemInfo(item)); {
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
} }
} }
} }
}); }
} }
} }
@@ -932,7 +932,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -967,7 +967,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -1962,7 +1962,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight() protected void refreshWeight()
{ {
long weight = 0; long weight = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item != null) && (item.getItem() != null)) if ((item != null) && (item.getItem() != null))
{ {
@@ -1993,9 +1993,9 @@ public abstract class Inventory extends ItemContainer
} }
ItemInstance arrow = null; ItemInstance arrow = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.ARROW)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.ARROW) && (item.getItem().getCrystalTypePlus() == bow.getCrystalTypePlus()))
{ {
arrow = item; arrow = item;
break; break;
@@ -2014,9 +2014,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow) public ItemInstance findBoltForCrossBow(Item crossbow)
{ {
ItemInstance bolt = null; ItemInstance bolt = null;
for (ItemInstance item : getItems()) for (ItemInstance item : _items)
{ {
if (item.isEtcItem() && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()) && (item.getEtcItem().getItemType() == EtcItemType.BOLT)) if (item.isEtcItem() && (item.getEtcItem().getItemType() == EtcItemType.BOLT) && (item.getItem().getCrystalTypePlus() == crossbow.getCrystalTypePlus()))
{ {
bolt = item; bolt = item;
break; break;
@@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -45,7 +42,8 @@ public abstract class ItemContainer
{ {
protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName()); protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName());
protected final Map<Integer, ItemInstance> _items = new ConcurrentHashMap<>(); protected final List<ItemInstance> _items = new ArrayList<>(1);
private int _questItemSize = 0;
protected ItemContainer() protected ItemContainer()
{ {
@@ -77,28 +75,19 @@ public abstract class ItemContainer
} }
/** /**
* @param filterValue * @return the quantity of quest items in the inventory
* @param filters */
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory * @return the quantity of items in the inventory
*/ */
@SafeVarargs public int getNonQuestSize()
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{ {
Predicate<ItemInstance> filter = filterValue; return _items.size() - _questItemSize;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
} }
/** /**
@@ -107,33 +96,7 @@ public abstract class ItemContainer
*/ */
public Collection<ItemInstance> getItems() public Collection<ItemInstance> getItems()
{ {
return getItems(i -> true); return _items;
}
/**
* Gets the items in inventory filtered by filter.
* @param filterValue the filter
* @param filters multiple filters
* @return the filtered items in inventory
*/
@SafeVarargs
public final Collection<ItemInstance> getItems(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -142,7 +105,7 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByItemId(int itemId) public ItemInstance getItemByItemId(int itemId)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == itemId) if (item.getId() == itemId)
{ {
@@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id * @param itemId the item Id
* @return the items list from inventory by using its itemId * @return the items list from inventory by using its itemId
*/ */
public Collection<ItemInstance> getItemsByItemId(int itemId) public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{ {
return getItems(i -> i.getId() == itemId); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if (itemId == item.getId())
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -167,7 +138,14 @@ public abstract class ItemContainer
*/ */
public ItemInstance getItemByObjectId(int objectId) public ItemInstance getItemByObjectId(int objectId)
{ {
return _items.get(objectId); for (ItemInstance item : _items)
{
if (objectId == item.getObjectId())
{
return item;
}
}
return null;
} }
/** /**
@@ -191,7 +169,7 @@ public abstract class ItemContainer
public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped) public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped)
{ {
long count = 0; long count = 0;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped())) if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{ {
@@ -210,7 +188,7 @@ public abstract class ItemContainer
*/ */
public boolean haveItemForSelfResurrection() public boolean haveItemForSelfResurrection()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getItem().isAllowSelfResurrection()) if (item.getItem().isAllowSelfResurrection())
{ {
@@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item) synchronized (item)
{ {
if (!_items.containsKey(item.getObjectId())) if (!_items.contains(item))
{ {
return null; return null;
} }
@@ -560,9 +538,12 @@ public abstract class ItemContainer
*/ */
public void destroyAllItems(String process, PlayerInstance actor, Object reference) public void destroyAllItems(String process, PlayerInstance actor, Object reference)
{ {
for (ItemInstance item : _items.values()) synchronized (_items)
{ {
destroyItem(process, item, actor, reference); for (ItemInstance item : _items)
{
destroyItem(process, item, actor, reference);
}
} }
} }
@@ -571,7 +552,7 @@ public abstract class ItemContainer
*/ */
public long getAdena() public long getAdena()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.ADENA_ID) if (item.getId() == Inventory.ADENA_ID)
{ {
@@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets() public long getBeautyTickets()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.getId() == Inventory.BEAUTY_TICKET_ID) if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{ {
@@ -599,7 +580,15 @@ public abstract class ItemContainer
*/ */
protected void addItem(ItemInstance item) protected void addItem(ItemInstance item)
{ {
_items.put(item.getObjectId(), item); synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize++;
}
_items.add(item);
}
} }
/** /**
@@ -609,7 +598,15 @@ public abstract class ItemContainer
*/ */
protected boolean removeItem(ItemInstance item) protected boolean removeItem(ItemInstance item)
{ {
return _items.remove(item.getObjectId()) != null; synchronized (_items)
{
if (item.isQuestItem())
{
_questItemSize--;
}
return _items.remove(item);
}
} }
/** /**
@@ -626,7 +623,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -643,7 +640,7 @@ public abstract class ItemContainer
{ {
if (getOwner() != null) if (getOwner() != null)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId) public void setNewMessageId(int messageId)
{ {
_messageId = messageId; _messageId = messageId;
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.setItemLocation(getBaseLocation(), messageId); item.setItemLocation(getBaseLocation(), messageId);
} }
@@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh) public void returnToWh(ItemContainer wh)
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (wh == null) if (wh == null)
{ {
@@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override @Override
public void updateDatabase() public void updateDatabase()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
} }
@@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override @Override
public void deleteMe() public void deleteMe()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.updateDatabase(true); item.updateDatabase(true);
item.stopAllTasks(); item.stopAllTasks();
@@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{ {
super.restore(); super.restore();
// check for equipped items from other pets // check for equipped items from other pets
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false)) if (item.isEquipped() && !item.getItem().checkCondition(_owner, _owner, false))
{ {
@@ -125,7 +125,7 @@ public class PetInventory extends Inventory
public void transferItemsToOwner() public void transferItemsToOwner()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner()); getOwner().transferItem("return", item.getObjectId(), item.getCount(), getOwner().getOwner().getInventory(), getOwner().getOwner(), getOwner());
} }
@@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
@@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena; private ItemInstance _adena;
private ItemInstance _ancientAdena; private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets; private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null; private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE; private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner) public PlayerInventory(PlayerInstance owner)
@@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable) public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{ {
final List<ItemInstance> list = new ArrayList<>(); final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
if (!allowAdena && (item.getId() == ADENA_ID)) if (!allowAdena && (item.getId() == ADENA_ID))
{ {
@@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
return list; return list;
} }
/**
* @param itemId
* @return
*/
public Collection<ItemInstance> getAllItemsByItemId(int itemId)
{
return getAllItemsByItemId(itemId, true);
}
/** /**
* Returns the list of all items in inventory that have a given item id. * Returns the list of all items in inventory that have a given item id.
* @param itemId : ID of item * @param itemId : ID of item
@@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -196,7 +191,15 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped) public Collection<ItemInstance> getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped)
{ {
return getItems(i -> (i.getId() == itemId) && (i.getEnchantLevel() == enchantment) && (includeEquipped || !i.isEquipped())); final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((itemId == item.getId()) && (item.getEnchantLevel() == enchantment) && (includeEquipped || !item.isEquipped()))
{
result.add(item);
}
}
return result;
} }
/** /**
@@ -207,18 +210,24 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable) public Collection<ItemInstance> getAvailableItems(boolean allowAdena, boolean allowNonTradeable, boolean feightable)
{ {
return getItems(i -> final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{ {
if (!i.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(i.getId())) if (!item.isAvailable(_owner, allowAdena, allowNonTradeable) || !canManipulateWithItemId(item.getId()))
{ {
return false; continue;
} }
else if (feightable) else if (feightable)
{ {
return (i.getItemLocation() == ItemLocation.INVENTORY) && i.isFreightable(); if ((item.getItemLocation() == ItemLocation.INVENTORY) && item.isFreightable())
{
result.add(item);
}
continue;
} }
return true; result.add(item);
}); }
return result;
} }
/** /**
@@ -228,13 +237,19 @@ public class PlayerInventory extends Inventory
*/ */
public Collection<TradeItem> getAvailableItems(TradeList tradeList) public Collection<TradeItem> getAvailableItems(TradeList tradeList)
{ {
//@formatter:off final List<TradeItem> result = new ArrayList<>();
return _items.values().stream() for (ItemInstance item : _items)
.filter(i -> i.isAvailable(_owner, false, false)) {
.map(tradeList::adjustAvailableItem) if ((item != null) && item.isAvailable(_owner, false, false))
.filter(Objects::nonNull) {
.collect(Collectors.toCollection(ArrayList::new)); final TradeItem adjItem = tradeList.adjustAvailableItem(item);
//@formatter:on if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
} }
/** /**
@@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item) public void adjustAvailableItem(TradeItem item)
{ {
boolean notAllEquipped = false; boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId())) for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{ {
if (adjItem.isEquipable()) if (adjItem.isEquipable())
{ {
@@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{ {
final int[][] paperdoll = new int[Inventory.PAPERDOLL_TOTALSLOTS][4]; final int[][] paperdoll = new int[Inventory.PAPERDOLL_TOTALSLOTS][4];
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement2 = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'")) PreparedStatement ps = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'"))
{ {
statement2.setInt(1, objectId); ps.setInt(1, objectId);
try (ResultSet invdata = statement2.executeQuery()) try (ResultSet invdata = ps.executeQuery())
{ {
while (invdata.next()) while (invdata.next())
{ {
@@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
public boolean validateCapacity(long slots, boolean questItem) public boolean validateCapacity(long slots, boolean questItem)
{ {
return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getSize(item -> item.isQuestItem()) + slots) <= _owner.getQuestInventoryLimit() : (getSize(item -> !item.isQuestItem()) + slots) <= _owner.getInventoryLimit(); return ((slots == 0) && !Config.AUTO_LOOT_SLOT_LIMIT) || questItem ? (getQuestSize() + slots) <= _owner.getQuestInventoryLimit() : (getNonQuestSize() + slots) <= _owner.getInventoryLimit();
} }
@Override @Override
@@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/ */
public void applyItemSkills() public void applyItemSkills()
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
item.giveSkillsToOwner(); item.giveSkillsToOwner();
item.applyEnchantStats(); item.applyEnchantStats();
@@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{ {
try try
{ {
for (ItemInstance item : _items.values()) for (ItemInstance item : _items)
{ {
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null); ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true); item.updateDatabase(true);
@@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use // Reduce talisman mana on skill use
if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO)) if ((_skill.getReferenceItemId() > 0) && (ItemTable.getInstance().getTemplate(_skill.getReferenceItemId()).getBodyPart() == Item.SLOT_DECO))
{ {
final ItemInstance talisman = caster.getInventory().getItems(i -> i.getId() == _skill.getReferenceItemId(), ItemInstance::isEquipped).stream().findAny().orElse(null); for (ItemInstance item : caster.getInventory().getItems())
if (talisman != null)
{ {
talisman.decreaseMana(false, talisman.useSkillDisTime()); if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
} }
} }
@@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg); player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate(); final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item); iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId)) for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{ {
iu.addItem(i); iu.addItem(i);
} }

Some files were not shown because too many files have changed in this diff Show More