Inventory concurrency related adjustments.

This commit is contained in:
MobiusDevelopment
2021-04-21 08:53:10 +00:00
parent 90e0eb7a94
commit c94da8603f
83 changed files with 1081 additions and 1017 deletions

View File

@@ -2296,8 +2296,7 @@ public class Attackable extends NpcInstance
crystalQTY = 0;
final ItemInstance[] inv = player.getInventory().getItems();
for (ItemInstance item : inv)
for (ItemInstance item : player.getInventory().getItems())
{
final int itemId = item.getItemId();
for (int id : SoulCrystal.SOUL_CRYSTAL_TABLE)

View File

@@ -659,9 +659,7 @@ public class PetInstance extends Summon
{
try
{
final Inventory petInventory = _inventory;
final ItemInstance[] items = petInventory.getItems();
for (ItemInstance item : items)
for (ItemInstance item : _inventory.getItems())
{
final ItemInstance giveit = item;
if (((giveit.getItem().getWeight() * giveit.getCount()) + getOwner().getInventory().getTotalWeight()) < getOwner().getMaxLoad())
@@ -754,8 +752,7 @@ public class PetInstance extends Summon
{
try
{
final ItemInstance[] items = _inventory.getItems();
for (ItemInstance item : items)
for (ItemInstance item : _inventory.getItems())
{
dropItemHere(item);
}

View File

@@ -21,7 +21,10 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import org.l2jmobius.Config;
@@ -42,12 +45,7 @@ public abstract class ItemContainer
{
protected static final Logger LOGGER = Logger.getLogger(ItemContainer.class.getName());
protected final List<ItemInstance> _items;
protected ItemContainer()
{
_items = new ArrayList<>();
}
protected final Set<ItemInstance> _items = ConcurrentHashMap.newKeySet(1);
protected abstract Creature getOwner();
@@ -75,12 +73,9 @@ public abstract class ItemContainer
* Returns the list of items in inventory
* @return ItemInstance : items in inventory
*/
public ItemInstance[] getItems()
public Collection<ItemInstance> getItems()
{
synchronized (_items)
{
return _items.toArray(new ItemInstance[_items.size()]);
}
return _items;
}
/**
@@ -495,7 +490,7 @@ public abstract class ItemContainer
* @param actor : PlayerInstance Player requesting the item destroy
* @param reference : WorldObject Object referencing current action like NPC selling item or previous item in transformation
*/
public synchronized void destroyAllItems(String process, PlayerInstance actor, WorldObject reference)
public void destroyAllItems(String process, PlayerInstance actor, WorldObject reference)
{
for (ItemInstance item : _items)
{
@@ -527,10 +522,7 @@ public abstract class ItemContainer
*/
protected void addItem(ItemInstance item)
{
synchronized (_items)
{
_items.add(item);
}
_items.add(item);
}
/**
@@ -539,10 +531,7 @@ public abstract class ItemContainer
*/
protected void removeItem(ItemInstance item)
{
synchronized (_items)
{
_items.remove(item);
}
_items.remove(item);
}
/**
@@ -577,17 +566,13 @@ public abstract class ItemContainer
*/
public void updateDatabase()
{
if (getOwner() != null)
if ((getOwner() != null) && (_items != null))
{
final List<ItemInstance> items = _items;
if (items != null)
for (ItemInstance item : _items)
{
for (ItemInstance item : items)
if (item != null)
{
if (item != null)
{
item.updateDatabase();
}
item.updateDatabase();
}
}
}

View File

@@ -17,6 +17,7 @@
package org.l2jmobius.gameserver.model.itemcontainer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -78,17 +79,17 @@ public class PlayerFreight extends ItemContainer
* @return ItemInstance : items in inventory
*/
@Override
public ItemInstance[] getItems()
public Collection<ItemInstance> getItems()
{
final List<ItemInstance> list = new ArrayList<>();
final List<ItemInstance> result = new ArrayList<>();
for (ItemInstance item : _items)
{
if ((item.getEquipSlot() == 0) || (item.getEquipSlot() == _activeLocationId))
{
list.add(item);
result.add(item);
}
}
return list.toArray(new ItemInstance[list.size()]);
return result;
}
/**

View File

@@ -16,6 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -26,7 +28,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class GMViewItemList implements IClientOutgoingPacket
{
private final ItemInstance[] _items;
private final Collection<ItemInstance> _items;
private final PlayerInstance _player;
private final String _playerName;
@@ -44,7 +46,7 @@ public class GMViewItemList implements IClientOutgoingPacket
packet.writeS(_playerName);
packet.writeD(_player.getInventoryLimit()); // inventory limit
packet.writeH(0x01); // show window ??
packet.writeH(_items.length);
packet.writeH(_items.size());
for (ItemInstance temp : _items)
{

View File

@@ -16,6 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.Item;
@@ -29,7 +31,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class GMViewWarehouseWithdrawList implements IClientOutgoingPacket
{
private final ItemInstance[] _items;
private final Collection<ItemInstance> _items;
private final String _playerName;
private final PlayerInstance _player;
private final int _money;
@@ -48,7 +50,7 @@ public class GMViewWarehouseWithdrawList implements IClientOutgoingPacket
OutgoingPackets.GM_VIEW_WAREHOUSE_WITHDRAW_LIST.writeId(packet);
packet.writeS(_playerName);
packet.writeD(_money);
packet.writeH(_items.length);
packet.writeH(_items.size());
for (ItemInstance item : _items)
{

View File

@@ -16,6 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -29,7 +31,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class ItemList implements IClientOutgoingPacket
{
private final ItemInstance[] _items;
private final Collection<ItemInstance> _items;
private final boolean _showWindow;
public ItemList(PlayerInstance player, boolean showWindow)
@@ -38,7 +40,7 @@ public class ItemList implements IClientOutgoingPacket
_showWindow = showWindow;
}
public ItemList(ItemInstance[] items, boolean showWindow)
public ItemList(Collection<ItemInstance> items, boolean showWindow)
{
_items = items;
_showWindow = showWindow;
@@ -49,7 +51,7 @@ public class ItemList implements IClientOutgoingPacket
{
OutgoingPackets.ITEM_LIST.writeId(packet);
packet.writeH(_showWindow ? 0x01 : 0x00);
packet.writeH(_items.length);
packet.writeH(_items.size());
for (ItemInstance temp : _items)
{
if ((temp == null) || (temp.getItem() == null))

View File

@@ -16,6 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PetInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -26,11 +28,11 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class PetItemList implements IClientOutgoingPacket
{
private final PetInstance _activeChar;
private final Collection<ItemInstance> _items;
public PetItemList(PetInstance character)
{
_activeChar = character;
_items = character.getInventory().getItems();
}
@Override
@@ -38,11 +40,8 @@ public class PetItemList implements IClientOutgoingPacket
{
OutgoingPackets.PET_ITEM_LIST.writeId(packet);
final ItemInstance[] items = _activeChar.getInventory().getItems();
final int count = items.length;
packet.writeH(count);
for (ItemInstance temp : items)
packet.writeH(_items.size());
for (ItemInstance temp : _items)
{
packet.writeH(temp.getItem().getType1()); // item type1
packet.writeD(temp.getObjectId());

View File

@@ -16,6 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.TradeList;
import org.l2jmobius.gameserver.model.TradeList.TradeItem;
@@ -28,7 +30,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class TradeUpdate implements IClientOutgoingPacket
{
private final ItemInstance[] _items;
private final Collection<ItemInstance> _items;
private final TradeItem[] _tradeItems;
public TradeUpdate(TradeList trade, PlayerInstance player)

View File

@@ -16,6 +16,8 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -34,7 +36,7 @@ public class WareHouseWithdrawalList implements IClientOutgoingPacket
private PlayerInstance _player;
private int _playerAdena;
private ItemInstance[] _items;
private Collection<ItemInstance> _items;
private int _whType;
public WareHouseWithdrawalList(PlayerInstance player, int type)
@@ -60,8 +62,7 @@ public class WareHouseWithdrawalList implements IClientOutgoingPacket
*/
packet.writeH(_whType);
packet.writeD(_playerAdena);
packet.writeH(_items.length);
packet.writeH(_items.size());
for (ItemInstance item : _items)
{
packet.writeH(item.getItem().getType1()); // item type1 //unconfirmed, works