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

View File

@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
}
else
{
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId()))
for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{
playerIU.addModifiedItem(itemInstance);
}

View File

@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
}
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());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
}

View File

@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse();
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++;
}

View File

@ -331,7 +331,13 @@ public class PetInstance extends Summon
{
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;
}

View File

@ -12949,7 +12949,7 @@ public class PlayerInstance extends Playable
*/
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)
{
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8));
return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
}
public boolean havePetInvItems()

View File

@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{
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;
}

View File

@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer())
{
final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size);
return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
}
return false;
}

View File

@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
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.
@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_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.
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.
for (MultisellEntryHolder entry : list.getEntries())
if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
{
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);
_itemInfos.add(new ItemInfo(item));
if (holder.getId() == item.getId())
{
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
}
}
}
});
}
}
}

View File

@ -881,7 +881,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -916,7 +916,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -1909,7 +1909,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight()
{
long weight = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item != null) && (item.getItem() != null))
{
@ -1940,9 +1940,9 @@ public abstract class Inventory extends ItemContainer
}
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;
break;
@ -1961,9 +1961,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow)
{
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;
break;

View File

@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
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.Logger;
@ -45,7 +42,8 @@ public abstract class ItemContainer
{
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()
{
@ -77,28 +75,19 @@ public abstract class ItemContainer
}
/**
* @param filterValue
* @param filters
* @return the quantity of quest items in the inventory
*/
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory
*/
@SafeVarargs
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
public int getNonQuestSize()
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
return _items.size() - _questItemSize;
}
/**
@ -107,33 +96,7 @@ public abstract class ItemContainer
*/
public Collection<ItemInstance> getItems()
{
return getItems(i -> true);
}
/**
* 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;
return _items;
}
/**
@ -142,7 +105,7 @@ public abstract class ItemContainer
*/
public ItemInstance getItemByItemId(int itemId)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == itemId)
{
@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id
* @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)
{
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)
{
long count = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{
@ -210,7 +188,7 @@ public abstract class ItemContainer
*/
public boolean haveItemForSelfResurrection()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getItem().isAllowSelfResurrection())
{
@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -560,9 +538,12 @@ public abstract class ItemContainer
*/
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()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.ADENA_ID)
{
@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{
@ -599,7 +580,15 @@ public abstract class ItemContainer
*/
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)
{
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)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();
@ -643,7 +640,7 @@ public abstract class ItemContainer
{
if (getOwner() != null)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}

View File

@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId)
{
_messageId = messageId;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.setItemLocation(getBaseLocation(), messageId);
}
@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (wh == null)
{
@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override
public void updateDatabase()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}
@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override
public void deleteMe()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();

View File

@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{
super.restore();
// 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))
{
@ -125,7 +125,7 @@ public class PetInventory extends Inventory
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());
}

View File

@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory;
@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena;
private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner)
@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{
final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (!allowAdena && (item.getId() == ADENA_ID))
{
@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
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.
* @param itemId : ID of item
@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/
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)
{
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)
{
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)
{
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)
{
//@formatter:off
return _items.values().stream()
.filter(i -> i.isAvailable(_owner, false, false))
.map(tradeList::adjustAvailableItem)
.filter(Objects::nonNull)
.collect(Collectors.toCollection(ArrayList::new));
//@formatter:on
final List<TradeItem> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((item != null) && item.isAvailable(_owner, false, false))
{
final TradeItem adjItem = tradeList.adjustAvailableItem(item);
if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
}
/**
@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item)
{
boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId()))
for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{
if (adjItem.isEquipable())
{
@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{
final int[][] paperdoll = new int[33][4];
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);
try (ResultSet invdata = statement2.executeQuery())
ps.setInt(1, objectId);
try (ResultSet invdata = ps.executeQuery())
{
while (invdata.next())
{
@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
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
@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/
public void applyItemSkills()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.giveSkillsToOwner();
item.applyEnchantStats();

View File

@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{
try
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true);

View File

@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use
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);
if (talisman != null)
for (ItemInstance item : caster.getInventory().getItems())
{
talisman.decreaseMana(false, talisman.useSkillDisTime());
if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
}
}

View File

@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId))
for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{
iu.addItem(i);
}

View File

@ -37,7 +37,7 @@ public class BuyList extends AbstractItemPacket
_listId = list.getListId();
_list = list.getProducts();
_money = player.getAdena();
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size();
_inventorySlots = player.getInventory().getNonQuestSize();
_castleTaxRate = castleTaxRate;
}

View File

@ -16,7 +16,9 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter;
@ -30,7 +32,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class ExBuySellList extends AbstractItemPacket
{
private final Collection<ItemInstance> _sellList;
private final List<ItemInstance> _sellList = new ArrayList<>();
private Collection<ItemInstance> _refundList = null;
private final boolean _done;
private final int _inventorySlots;
@ -38,8 +40,14 @@ public class ExBuySellList extends AbstractItemPacket
public ExBuySellList(PlayerInstance player, boolean done)
{
final Summon pet = player.getPet();
_sellList = player.getInventory().getItems(item -> !item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())));
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size();
for (ItemInstance item : player.getInventory().getItems())
{
if (!item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())))
{
_sellList.add(item);
}
}
_inventorySlots = player.getInventory().getNonQuestSize();
if (player.hasRefund())
{
_refundList = player.getRefund().getItems();

View File

@ -16,7 +16,8 @@
*/
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.gameserver.model.actor.instance.PlayerInstance;
@ -29,12 +30,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExQuestItemList extends AbstractItemPacket
{
private final PlayerInstance _player;
private final Collection<ItemInstance> _items;
private final List<ItemInstance> _items = new ArrayList<>();
public ExQuestItemList(PlayerInstance player)
{
_player = player;
_items = player.getInventory().getItems(ItemInstance::isQuestItem);
for (ItemInstance item : player.getInventory().getItems())
{
if (item.isQuestItem())
{
_items.add(item);
}
}
}
@Override

View File

@ -16,7 +16,8 @@
*/
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.gameserver.model.actor.instance.PlayerInstance;
@ -25,12 +26,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket
{
private final Collection<ItemInstance> _items;
private final List<ItemInstance> _items = new ArrayList<>();
private long _price;
public ExShowBaseAttributeCancelWindow(PlayerInstance player)
{
_items = player.getInventory().getItems(ItemInstance::hasAttributes);
for (ItemInstance item : player.getInventory().getItems())
{
if (item.hasAttributes())
{
_items.add(item);
}
}
}
@Override

View File

@ -16,8 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@ -27,14 +27,20 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ItemList extends AbstractItemPacket
{
private final PlayerInstance _player;
private final List<ItemInstance> _items;
private final boolean _showWindow;
private final List<ItemInstance> _items = new ArrayList<>();
public ItemList(PlayerInstance player, boolean showWindow)
{
_player = player;
_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

View File

@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
}
else
{
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId()))
for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{
playerIU.addModifiedItem(itemInstance);
}

View File

@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
}
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());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
}

View File

@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse();
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++;
}

View File

@ -331,7 +331,13 @@ public class PetInstance extends Summon
{
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;
}

View File

@ -12956,7 +12956,7 @@ public class PlayerInstance extends Playable
*/
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)
{
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8));
return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
}
public boolean havePetInvItems()

View File

@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{
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;
}

View File

@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer())
{
final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size);
return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
}
return false;
}

View File

@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
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.
@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_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.
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.
for (MultisellEntryHolder entry : list.getEntries())
if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
{
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);
_itemInfos.add(new ItemInfo(item));
if (holder.getId() == item.getId())
{
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
}
}
}
});
}
}
}

View File

@ -887,7 +887,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -922,7 +922,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -1915,7 +1915,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight()
{
long weight = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item != null) && (item.getItem() != null))
{
@ -1946,9 +1946,9 @@ public abstract class Inventory extends ItemContainer
}
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;
break;
@ -1967,9 +1967,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow)
{
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;
break;

View File

@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
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.Logger;
@ -45,7 +42,8 @@ public abstract class ItemContainer
{
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()
{
@ -77,28 +75,19 @@ public abstract class ItemContainer
}
/**
* @param filterValue
* @param filters
* @return the quantity of quest items in the inventory
*/
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory
*/
@SafeVarargs
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
public int getNonQuestSize()
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
return _items.size() - _questItemSize;
}
/**
@ -107,33 +96,7 @@ public abstract class ItemContainer
*/
public Collection<ItemInstance> getItems()
{
return getItems(i -> true);
}
/**
* 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;
return _items;
}
/**
@ -142,7 +105,7 @@ public abstract class ItemContainer
*/
public ItemInstance getItemByItemId(int itemId)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == itemId)
{
@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id
* @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)
{
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)
{
long count = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{
@ -210,7 +188,7 @@ public abstract class ItemContainer
*/
public boolean haveItemForSelfResurrection()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getItem().isAllowSelfResurrection())
{
@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -560,9 +538,12 @@ public abstract class ItemContainer
*/
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()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.ADENA_ID)
{
@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{
@ -599,7 +580,15 @@ public abstract class ItemContainer
*/
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)
{
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)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();
@ -643,7 +640,7 @@ public abstract class ItemContainer
{
if (getOwner() != null)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}

View File

@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId)
{
_messageId = messageId;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.setItemLocation(getBaseLocation(), messageId);
}
@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (wh == null)
{
@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override
public void updateDatabase()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}
@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override
public void deleteMe()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();

View File

@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{
super.restore();
// 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))
{
@ -125,7 +125,7 @@ public class PetInventory extends Inventory
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());
}

View File

@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory;
@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena;
private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner)
@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{
final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (!allowAdena && (item.getId() == ADENA_ID))
{
@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
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.
* @param itemId : ID of item
@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/
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)
{
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)
{
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)
{
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)
{
//@formatter:off
return _items.values().stream()
.filter(i -> i.isAvailable(_owner, false, false))
.map(tradeList::adjustAvailableItem)
.filter(Objects::nonNull)
.collect(Collectors.toCollection(ArrayList::new));
//@formatter:on
final List<TradeItem> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((item != null) && item.isAvailable(_owner, false, false))
{
final TradeItem adjItem = tradeList.adjustAvailableItem(item);
if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
}
/**
@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item)
{
boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId()))
for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{
if (adjItem.isEquipable())
{
@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{
final int[][] paperdoll = new int[33][4];
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);
try (ResultSet invdata = statement2.executeQuery())
ps.setInt(1, objectId);
try (ResultSet invdata = ps.executeQuery())
{
while (invdata.next())
{
@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
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
@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/
public void applyItemSkills()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.giveSkillsToOwner();
item.applyEnchantStats();

View File

@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{
try
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true);

View File

@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use
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);
if (talisman != null)
for (ItemInstance item : caster.getInventory().getItems())
{
talisman.decreaseMana(false, talisman.useSkillDisTime());
if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
}
}

View File

@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId))
for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{
iu.addItem(i);
}

View File

@ -37,7 +37,7 @@ public class BuyList extends AbstractItemPacket
_listId = list.getListId();
_list = list.getProducts();
_money = player.getAdena();
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size();
_inventorySlots = player.getInventory().getNonQuestSize();
_castleTaxRate = castleTaxRate;
}

View File

@ -16,7 +16,9 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter;
@ -30,7 +32,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class ExBuySellList extends AbstractItemPacket
{
private final Collection<ItemInstance> _sellList;
private final List<ItemInstance> _sellList = new ArrayList<>();
private Collection<ItemInstance> _refundList = null;
private final boolean _done;
private final int _inventorySlots;
@ -38,8 +40,14 @@ public class ExBuySellList extends AbstractItemPacket
public ExBuySellList(PlayerInstance player, boolean done)
{
final Summon pet = player.getPet();
_sellList = player.getInventory().getItems(item -> !item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())));
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size();
for (ItemInstance item : player.getInventory().getItems())
{
if (!item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())))
{
_sellList.add(item);
}
}
_inventorySlots = player.getInventory().getNonQuestSize();
if (player.hasRefund())
{
_refundList = player.getRefund().getItems();

View File

@ -16,7 +16,8 @@
*/
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.gameserver.model.actor.instance.PlayerInstance;
@ -29,12 +30,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExQuestItemList extends AbstractItemPacket
{
private final PlayerInstance _player;
private final Collection<ItemInstance> _items;
private final List<ItemInstance> _items = new ArrayList<>();
public ExQuestItemList(PlayerInstance player)
{
_player = player;
_items = player.getInventory().getItems(ItemInstance::isQuestItem);
for (ItemInstance item : player.getInventory().getItems())
{
if (item.isQuestItem())
{
_items.add(item);
}
}
}
@Override

View File

@ -16,7 +16,8 @@
*/
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.gameserver.model.actor.instance.PlayerInstance;
@ -25,12 +26,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket
{
private final Collection<ItemInstance> _items;
private final List<ItemInstance> _items = new ArrayList<>();
private long _price;
public ExShowBaseAttributeCancelWindow(PlayerInstance player)
{
_items = player.getInventory().getItems(ItemInstance::hasAttributes);
for (ItemInstance item : player.getInventory().getItems())
{
if (item.hasAttributes())
{
_items.add(item);
}
}
}
@Override

View File

@ -16,8 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@ -27,14 +27,20 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ItemList extends AbstractItemPacket
{
private final PlayerInstance _player;
private final List<ItemInstance> _items;
private final boolean _showWindow;
private final List<ItemInstance> _items = new ArrayList<>();
public ItemList(PlayerInstance player, boolean showWindow)
{
_player = player;
_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

View File

@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
}
else
{
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId()))
for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{
playerIU.addModifiedItem(itemInstance);
}

View File

@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
}
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());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
}

View File

@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse();
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++;
}

View File

@ -331,7 +331,13 @@ public class PetInstance extends Summon
{
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;
}

View File

@ -12958,7 +12958,7 @@ public class PlayerInstance extends Playable
*/
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)
{
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8));
return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
}
public boolean havePetInvItems()

View File

@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{
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;
}

View File

@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer())
{
final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size);
return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
}
return false;
}

View File

@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
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.
@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_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.
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.
for (MultisellEntryHolder entry : list.getEntries())
if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
{
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);
_itemInfos.add(new ItemInfo(item));
if (holder.getId() == item.getId())
{
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
}
}
}
});
}
}
}

View File

@ -887,7 +887,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -922,7 +922,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -1915,7 +1915,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight()
{
long weight = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item != null) && (item.getItem() != null))
{
@ -1946,9 +1946,9 @@ public abstract class Inventory extends ItemContainer
}
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;
break;
@ -1967,9 +1967,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow)
{
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;
break;

View File

@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
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.Logger;
@ -45,7 +42,8 @@ public abstract class ItemContainer
{
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()
{
@ -77,28 +75,19 @@ public abstract class ItemContainer
}
/**
* @param filterValue
* @param filters
* @return the quantity of quest items in the inventory
*/
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory
*/
@SafeVarargs
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
public int getNonQuestSize()
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
return _items.size() - _questItemSize;
}
/**
@ -107,33 +96,7 @@ public abstract class ItemContainer
*/
public Collection<ItemInstance> getItems()
{
return getItems(i -> true);
}
/**
* 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;
return _items;
}
/**
@ -142,7 +105,7 @@ public abstract class ItemContainer
*/
public ItemInstance getItemByItemId(int itemId)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == itemId)
{
@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id
* @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)
{
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)
{
long count = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{
@ -210,7 +188,7 @@ public abstract class ItemContainer
*/
public boolean haveItemForSelfResurrection()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getItem().isAllowSelfResurrection())
{
@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -560,9 +538,12 @@ public abstract class ItemContainer
*/
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()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.ADENA_ID)
{
@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{
@ -599,7 +580,15 @@ public abstract class ItemContainer
*/
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)
{
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)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();
@ -643,7 +640,7 @@ public abstract class ItemContainer
{
if (getOwner() != null)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}

View File

@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId)
{
_messageId = messageId;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.setItemLocation(getBaseLocation(), messageId);
}
@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (wh == null)
{
@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override
public void updateDatabase()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}
@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override
public void deleteMe()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();

View File

@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{
super.restore();
// 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))
{
@ -125,7 +125,7 @@ public class PetInventory extends Inventory
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());
}

View File

@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory;
@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena;
private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner)
@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{
final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (!allowAdena && (item.getId() == ADENA_ID))
{
@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
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.
* @param itemId : ID of item
@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/
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)
{
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)
{
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)
{
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)
{
//@formatter:off
return _items.values().stream()
.filter(i -> i.isAvailable(_owner, false, false))
.map(tradeList::adjustAvailableItem)
.filter(Objects::nonNull)
.collect(Collectors.toCollection(ArrayList::new));
//@formatter:on
final List<TradeItem> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((item != null) && item.isAvailable(_owner, false, false))
{
final TradeItem adjItem = tradeList.adjustAvailableItem(item);
if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
}
/**
@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item)
{
boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId()))
for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{
if (adjItem.isEquipable())
{
@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{
final int[][] paperdoll = new int[33][4];
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);
try (ResultSet invdata = statement2.executeQuery())
ps.setInt(1, objectId);
try (ResultSet invdata = ps.executeQuery())
{
while (invdata.next())
{
@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
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
@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/
public void applyItemSkills()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.giveSkillsToOwner();
item.applyEnchantStats();

View File

@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{
try
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true);

View File

@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use
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);
if (talisman != null)
for (ItemInstance item : caster.getInventory().getItems())
{
talisman.decreaseMana(false, talisman.useSkillDisTime());
if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
}
}

View File

@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId))
for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{
iu.addItem(i);
}

View File

@ -37,7 +37,7 @@ public class BuyList extends AbstractItemPacket
_listId = list.getListId();
_list = list.getProducts();
_money = player.getAdena();
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size();
_inventorySlots = player.getInventory().getNonQuestSize();
_castleTaxRate = castleTaxRate;
}

View File

@ -16,7 +16,9 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter;
@ -30,7 +32,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class ExBuySellList extends AbstractItemPacket
{
private final Collection<ItemInstance> _sellList;
private final List<ItemInstance> _sellList = new ArrayList<>();
private Collection<ItemInstance> _refundList = null;
private final boolean _done;
private final int _inventorySlots;
@ -38,8 +40,14 @@ public class ExBuySellList extends AbstractItemPacket
public ExBuySellList(PlayerInstance player, boolean done)
{
final Summon pet = player.getPet();
_sellList = player.getInventory().getItems(item -> !item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())));
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size();
for (ItemInstance item : player.getInventory().getItems())
{
if (!item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())))
{
_sellList.add(item);
}
}
_inventorySlots = player.getInventory().getNonQuestSize();
if (player.hasRefund())
{
_refundList = player.getRefund().getItems();

View File

@ -16,7 +16,8 @@
*/
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.gameserver.model.actor.instance.PlayerInstance;
@ -29,12 +30,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExQuestItemList extends AbstractItemPacket
{
private final PlayerInstance _player;
private final Collection<ItemInstance> _items;
private final List<ItemInstance> _items = new ArrayList<>();
public ExQuestItemList(PlayerInstance player)
{
_player = player;
_items = player.getInventory().getItems(ItemInstance::isQuestItem);
for (ItemInstance item : player.getInventory().getItems())
{
if (item.isQuestItem())
{
_items.add(item);
}
}
}
@Override

View File

@ -16,7 +16,8 @@
*/
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.gameserver.model.actor.instance.PlayerInstance;
@ -25,12 +26,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket
{
private final Collection<ItemInstance> _items;
private final List<ItemInstance> _items = new ArrayList<>();
private long _price;
public ExShowBaseAttributeCancelWindow(PlayerInstance player)
{
_items = player.getInventory().getItems(ItemInstance::hasAttributes);
for (ItemInstance item : player.getInventory().getItems())
{
if (item.hasAttributes())
{
_items.add(item);
}
}
}
@Override

View File

@ -16,8 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@ -27,14 +27,20 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ItemList extends AbstractItemPacket
{
private final PlayerInstance _player;
private final List<ItemInstance> _items;
private final boolean _showWindow;
private final List<ItemInstance> _items = new ArrayList<>();
public ItemList(PlayerInstance player, boolean showWindow)
{
_player = player;
_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

View File

@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
}
else
{
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId()))
for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{
playerIU.addModifiedItem(itemInstance);
}

View File

@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
}
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());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
}

View File

@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse();
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++;
}

View File

@ -331,7 +331,13 @@ public class PetInstance extends Summon
{
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;
}

View File

@ -12938,7 +12938,7 @@ public class PlayerInstance extends Playable
*/
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)
{
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8));
return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
}
public boolean havePetInvItems()

View File

@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{
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;
}

View File

@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer())
{
final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size);
return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
}
return false;
}

View File

@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
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.
@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_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.
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.
for (MultisellEntryHolder entry : list.getEntries())
if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
{
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);
_itemInfos.add(new ItemInfo(item));
if (holder.getId() == item.getId())
{
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
}
}
}
});
}
}
}

View File

@ -887,7 +887,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -922,7 +922,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -1915,7 +1915,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight()
{
long weight = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item != null) && (item.getItem() != null))
{
@ -1946,9 +1946,9 @@ public abstract class Inventory extends ItemContainer
}
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;
break;
@ -1967,9 +1967,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow)
{
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;
break;

View File

@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
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.Logger;
@ -45,7 +42,8 @@ public abstract class ItemContainer
{
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()
{
@ -77,28 +75,19 @@ public abstract class ItemContainer
}
/**
* @param filterValue
* @param filters
* @return the quantity of quest items in the inventory
*/
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory
*/
@SafeVarargs
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
public int getNonQuestSize()
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
return _items.size() - _questItemSize;
}
/**
@ -107,33 +96,7 @@ public abstract class ItemContainer
*/
public Collection<ItemInstance> getItems()
{
return getItems(i -> true);
}
/**
* 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;
return _items;
}
/**
@ -142,7 +105,7 @@ public abstract class ItemContainer
*/
public ItemInstance getItemByItemId(int itemId)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == itemId)
{
@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id
* @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)
{
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)
{
long count = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{
@ -210,7 +188,7 @@ public abstract class ItemContainer
*/
public boolean haveItemForSelfResurrection()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getItem().isAllowSelfResurrection())
{
@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -560,9 +538,12 @@ public abstract class ItemContainer
*/
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()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.ADENA_ID)
{
@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{
@ -599,7 +580,15 @@ public abstract class ItemContainer
*/
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)
{
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)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();
@ -643,7 +640,7 @@ public abstract class ItemContainer
{
if (getOwner() != null)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}

View File

@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId)
{
_messageId = messageId;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.setItemLocation(getBaseLocation(), messageId);
}
@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (wh == null)
{
@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override
public void updateDatabase()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}
@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override
public void deleteMe()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();

View File

@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{
super.restore();
// 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))
{
@ -125,7 +125,7 @@ public class PetInventory extends Inventory
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());
}

View File

@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory;
@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena;
private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner)
@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{
final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (!allowAdena && (item.getId() == ADENA_ID))
{
@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
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.
* @param itemId : ID of item
@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/
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)
{
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)
{
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)
{
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)
{
//@formatter:off
return _items.values().stream()
.filter(i -> i.isAvailable(_owner, false, false))
.map(tradeList::adjustAvailableItem)
.filter(Objects::nonNull)
.collect(Collectors.toCollection(ArrayList::new));
//@formatter:on
final List<TradeItem> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((item != null) && item.isAvailable(_owner, false, false))
{
final TradeItem adjItem = tradeList.adjustAvailableItem(item);
if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
}
/**
@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item)
{
boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId()))
for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{
if (adjItem.isEquipable())
{
@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{
final int[][] paperdoll = new int[33][4];
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);
try (ResultSet invdata = statement2.executeQuery())
ps.setInt(1, objectId);
try (ResultSet invdata = ps.executeQuery())
{
while (invdata.next())
{
@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
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
@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/
public void applyItemSkills()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.giveSkillsToOwner();
item.applyEnchantStats();

View File

@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{
try
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true);

View File

@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use
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);
if (talisman != null)
for (ItemInstance item : caster.getInventory().getItems())
{
talisman.decreaseMana(false, talisman.useSkillDisTime());
if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
}
}

View File

@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId))
for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{
iu.addItem(i);
}

View File

@ -37,7 +37,7 @@ public class BuyList extends AbstractItemPacket
_listId = list.getListId();
_list = list.getProducts();
_money = player.getAdena();
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size();
_inventorySlots = player.getInventory().getNonQuestSize();
_castleTaxRate = castleTaxRate;
}

View File

@ -16,7 +16,9 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter;
@ -30,7 +32,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class ExBuySellList extends AbstractItemPacket
{
private final Collection<ItemInstance> _sellList;
private final List<ItemInstance> _sellList = new ArrayList<>();
private Collection<ItemInstance> _refundList = null;
private final boolean _done;
private final int _inventorySlots;
@ -38,8 +40,14 @@ public class ExBuySellList extends AbstractItemPacket
public ExBuySellList(PlayerInstance player, boolean done)
{
final Summon pet = player.getPet();
_sellList = player.getInventory().getItems(item -> !item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())));
_inventorySlots = player.getInventory().getItems(item -> !item.isQuestItem()).size();
for (ItemInstance item : player.getInventory().getItems())
{
if (!item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId())))
{
_sellList.add(item);
}
}
_inventorySlots = player.getInventory().getNonQuestSize();
if (player.hasRefund())
{
_refundList = player.getRefund().getItems();

View File

@ -16,7 +16,8 @@
*/
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.gameserver.model.actor.instance.PlayerInstance;
@ -29,12 +30,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExQuestItemList extends AbstractItemPacket
{
private final PlayerInstance _player;
private final Collection<ItemInstance> _items;
private final List<ItemInstance> _items = new ArrayList<>();
public ExQuestItemList(PlayerInstance player)
{
_player = player;
_items = player.getInventory().getItems(ItemInstance::isQuestItem);
for (ItemInstance item : player.getInventory().getItems())
{
if (item.isQuestItem())
{
_items.add(item);
}
}
}
@Override

View File

@ -16,7 +16,8 @@
*/
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.gameserver.model.actor.instance.PlayerInstance;
@ -25,12 +26,18 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ExShowBaseAttributeCancelWindow implements IClientOutgoingPacket
{
private final Collection<ItemInstance> _items;
private final List<ItemInstance> _items = new ArrayList<>();
private long _price;
public ExShowBaseAttributeCancelWindow(PlayerInstance player)
{
_items = player.getInventory().getItems(ItemInstance::hasAttributes);
for (ItemInstance item : player.getInventory().getItems())
{
if (item.hasAttributes())
{
_items.add(item);
}
}
}
@Override

View File

@ -16,8 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@ -27,14 +27,20 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class ItemList extends AbstractItemPacket
{
private final PlayerInstance _player;
private final List<ItemInstance> _items;
private final boolean _showWindow;
private final List<ItemInstance> _items = new ArrayList<>();
public ItemList(PlayerInstance player, boolean showWindow)
{
_player = player;
_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

View File

@ -138,7 +138,7 @@ public class RestorationRandom extends AbstractEffect
}
else
{
for (ItemInstance itemInstance : player.getInventory().getItemsByItemId(entry.getKey().getId()))
for (ItemInstance itemInstance : player.getInventory().getAllItemsByItemId(entry.getKey().getId()))
{
playerIU.addModifiedItem(itemInstance);
}

View File

@ -47,7 +47,7 @@ public class OpEncumberedSkillCondition implements ISkillCondition
}
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());
return (currentSlotsPercent >= _slotsPercent) && (currentWeightPercent >= _weightPercent);
}

View File

@ -393,7 +393,7 @@ public class CastleManorManager implements IXmlReader, IStorable
final ItemContainer cwh = owner.getWarehouse();
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++;
}

View File

@ -332,7 +332,13 @@ public class PetInstance extends Summon
{
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;
}

View File

@ -12925,7 +12925,7 @@ public class PlayerInstance extends Playable
*/
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)
{
return (_inventory.getSize(item -> !item.isQuestItem() || includeQuestInv) <= (getInventoryLimit() * 0.8));
return (includeQuestInv ? _inventory.getSize() : _inventory.getNonQuestSize()) <= (getInventoryLimit() * 0.8);
}
public boolean havePetInvItems()

View File

@ -42,7 +42,7 @@ public class ConditionPlayerInvSize extends Condition
{
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;
}

View File

@ -44,7 +44,7 @@ public class ConditionTargetInvSize extends Condition
if ((effected != null) && effected.isPlayer())
{
final PlayerInstance target = effected.getActingPlayer();
return target.getInventory().getSize(i -> !i.isQuestItem()) <= (target.getInventoryLimit() - _size);
return target.getInventory().getNonQuestSize() <= (target.getInventoryLimit() - _size);
}
return false;
}

View File

@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.ItemInfo;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
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.
@ -54,21 +55,24 @@ public class PreparedMultisellListHolder extends MultisellListHolder
_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.
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.
for (MultisellEntryHolder entry : list.getEntries())
if (!item.isEquipped() && (item.isArmor() || item.isWeapon()))
{
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);
_itemInfos.add(new ItemInfo(item));
if (holder.getId() == item.getId())
{
_entries.add(entry);
_itemInfos.add(new ItemInfo(item));
}
}
}
}
});
}
}
}

View File

@ -932,7 +932,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -967,7 +967,7 @@ public abstract class Inventory extends ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -1962,7 +1962,7 @@ public abstract class Inventory extends ItemContainer
protected void refreshWeight()
{
long weight = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item != null) && (item.getItem() != null))
{
@ -1993,9 +1993,9 @@ public abstract class Inventory extends ItemContainer
}
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;
break;
@ -2014,9 +2014,9 @@ public abstract class Inventory extends ItemContainer
public ItemInstance findBoltForCrossBow(Item crossbow)
{
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;
break;

View File

@ -22,9 +22,6 @@ import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
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.Logger;
@ -45,7 +42,8 @@ public abstract class ItemContainer
{
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()
{
@ -77,28 +75,19 @@ public abstract class ItemContainer
}
/**
* @param filterValue
* @param filters
* @return the quantity of quest items in the inventory
*/
public int getQuestSize()
{
return _questItemSize;
}
/**
* @return the quantity of items in the inventory
*/
@SafeVarargs
public final int getSize(Predicate<ItemInstance> filterValue, Predicate<ItemInstance>... filters)
public int getNonQuestSize()
{
Predicate<ItemInstance> filter = filterValue;
for (Predicate<ItemInstance> additionalFilter : filters)
{
filter = filter.and(additionalFilter);
}
int count = 0;
for (ItemInstance item : _items.values())
{
if (filter.test(item))
{
count++;
}
}
return count;
return _items.size() - _questItemSize;
}
/**
@ -107,33 +96,7 @@ public abstract class ItemContainer
*/
public Collection<ItemInstance> getItems()
{
return getItems(i -> true);
}
/**
* 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;
return _items;
}
/**
@ -142,7 +105,7 @@ public abstract class ItemContainer
*/
public ItemInstance getItemByItemId(int itemId)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == itemId)
{
@ -156,9 +119,17 @@ public abstract class ItemContainer
* @param itemId the item Id
* @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)
{
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)
{
long count = 0;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if ((item.getId() == itemId) && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
{
@ -210,7 +188,7 @@ public abstract class ItemContainer
*/
public boolean haveItemForSelfResurrection()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getItem().isAllowSelfResurrection())
{
@ -412,7 +390,7 @@ public abstract class ItemContainer
synchronized (item)
{
if (!_items.containsKey(item.getObjectId()))
if (!_items.contains(item))
{
return null;
}
@ -560,9 +538,12 @@ public abstract class ItemContainer
*/
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()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.ADENA_ID)
{
@ -583,7 +564,7 @@ public abstract class ItemContainer
public long getBeautyTickets()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (item.getId() == Inventory.BEAUTY_TICKET_ID)
{
@ -599,7 +580,15 @@ public abstract class ItemContainer
*/
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)
{
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)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();
@ -643,7 +640,7 @@ public abstract class ItemContainer
{
if (getOwner() != null)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}

View File

@ -67,7 +67,7 @@ public class Mail extends ItemContainer
public void setNewMessageId(int messageId)
{
_messageId = messageId;
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.setItemLocation(getBaseLocation(), messageId);
}
@ -76,7 +76,7 @@ public class Mail extends ItemContainer
public void returnToWh(ItemContainer wh)
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (wh == null)
{
@ -103,7 +103,7 @@ public class Mail extends ItemContainer
@Override
public void updateDatabase()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
}
@ -146,7 +146,7 @@ public class Mail extends ItemContainer
@Override
public void deleteMe()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.updateDatabase(true);
item.stopAllTasks();

View File

@ -114,7 +114,7 @@ public class PetInventory extends Inventory
{
super.restore();
// 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))
{
@ -125,7 +125,7 @@ public class PetInventory extends Inventory
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());
}

View File

@ -23,10 +23,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.database.DatabaseFactory;
@ -56,9 +54,7 @@ public class PlayerInventory extends Inventory
private ItemInstance _adena;
private ItemInstance _ancientAdena;
private ItemInstance _beautyTickets;
private Collection<Integer> _blockItems = null;
private InventoryBlockType _blockMode = InventoryBlockType.NONE;
public PlayerInventory(PlayerInstance owner)
@ -130,7 +126,7 @@ public class PlayerInventory extends Inventory
public Collection<ItemInstance> getUniqueItems(boolean allowAdena, boolean allowAncientAdena, boolean onlyAvailable)
{
final List<ItemInstance> list = new ArrayList<>();
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
if (!allowAdena && (item.getId() == ADENA_ID))
{
@ -157,15 +153,6 @@ public class PlayerInventory extends Inventory
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.
* @param itemId : ID of item
@ -174,7 +161,15 @@ public class PlayerInventory extends Inventory
*/
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)
{
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)
{
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)
{
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)
{
//@formatter:off
return _items.values().stream()
.filter(i -> i.isAvailable(_owner, false, false))
.map(tradeList::adjustAvailableItem)
.filter(Objects::nonNull)
.collect(Collectors.toCollection(ArrayList::new));
//@formatter:on
final List<TradeItem> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((item != null) && item.isAvailable(_owner, false, false))
{
final TradeItem adjItem = tradeList.adjustAvailableItem(item);
if (adjItem != null)
{
result.add(adjItem);
}
}
}
return result;
}
/**
@ -244,7 +259,7 @@ public class PlayerInventory extends Inventory
public void adjustAvailableItem(TradeItem item)
{
boolean notAllEquipped = false;
for (ItemInstance adjItem : getItemsByItemId(item.getItem().getId()))
for (ItemInstance adjItem : getAllItemsByItemId(item.getItem().getId()))
{
if (adjItem.isEquipable())
{
@ -726,10 +741,10 @@ public class PlayerInventory extends Inventory
{
final int[][] paperdoll = new int[Inventory.PAPERDOLL_TOTALSLOTS][4];
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);
try (ResultSet invdata = statement2.executeQuery())
ps.setInt(1, objectId);
try (ResultSet invdata = ps.executeQuery())
{
while (invdata.next())
{
@ -827,7 +842,7 @@ public class PlayerInventory extends Inventory
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
@ -939,7 +954,7 @@ public class PlayerInventory extends Inventory
*/
public void applyItemSkills()
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
item.giveSkillsToOwner();
item.applyEnchantStats();

View File

@ -85,7 +85,7 @@ public class PlayerRefund extends ItemContainer
{
try
{
for (ItemInstance item : _items.values())
for (ItemInstance item : _items)
{
ItemTable.getInstance().destroyItem("ClearRefund", item, getOwner(), null);
item.updateDatabase(true);

View File

@ -290,10 +290,13 @@ public class SkillCaster implements Runnable
// Reduce talisman mana on skill use
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);
if (talisman != null)
for (ItemInstance item : caster.getInventory().getItems())
{
talisman.decreaseMana(false, talisman.useSkillDisTime());
if (item.isEquipped() && (item.getId() == _skill.getReferenceItemId()))
{
item.decreaseMana(false, item.useSkillDisTime());
break;
}
}
}

View File

@ -85,7 +85,7 @@ public class RequestChangeAttributeItem implements IClientIncomingPacket
player.sendPacket(msg);
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item);
for (ItemInstance i : player.getInventory().getItemsByItemId(_consumeItemId))
for (ItemInstance i : player.getInventory().getAllItemsByItemId(_consumeItemId))
{
iu.addItem(i);
}

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