Bläddra i källkod

Synchronizing write access of the item containers to prevent FastList corruption.
Also fixed several NPEs.

_DS_ 15 år sedan
förälder
incheckning
8584ba7148

+ 8 - 2
L2_GameServer/java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java

@@ -545,7 +545,10 @@ public abstract class ItemContainer
 	 */
 	protected void addItem(L2ItemInstance item)
 	{
-		_items.add(item);
+		synchronized (_items)
+		{
+			_items.add(item);
+		}
 	}
 	
 	/**
@@ -554,7 +557,10 @@ public abstract class ItemContainer
 	 */
 	protected boolean removeItem(L2ItemInstance item)
 	{
-		return _items.remove(item);
+		synchronized (_items)
+		{
+			return _items.remove(item);
+		}
 	}
 	
 	/**

+ 12 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java

@@ -93,6 +93,9 @@ public class PcInventory extends Inventory
 			boolean isDuplicate = false;
 			for (L2ItemInstance litem : list)
 			{
+				if (item == null)
+					continue;
+
 				if (litem.getItemId() == item.getItemId())
 				{
 					isDuplicate = true;
@@ -120,6 +123,8 @@ public class PcInventory extends Inventory
 		List<L2ItemInstance> list = new FastList<L2ItemInstance>();
 		for (L2ItemInstance item : _items)
 		{
+			if (item == null)
+				continue;
 			if ((!allowAdena && item.getItemId() == 57))
 				continue;
 			if ((!allowAncientAdena && item.getItemId() == 5575))
@@ -157,6 +162,9 @@ public class PcInventory extends Inventory
 		List<L2ItemInstance> list = new FastList<L2ItemInstance>();
 		for (L2ItemInstance item : _items)
 		{
+			if (item == null)
+				continue;
+
 			if (item.getItemId() == itemId && (includeEquipped || !item.isEquipped()))
 				list.add(item);
 		}
@@ -184,6 +192,9 @@ public class PcInventory extends Inventory
 		List<L2ItemInstance> list = new FastList<L2ItemInstance>();
 		for (L2ItemInstance item : _items)
 		{
+			if (item == null)
+				continue;
+
 			if ((item.getItemId() == itemId) && (item.getEnchantLevel() == enchantment) && (includeEquipped || !item.isEquipped()))
 				list.add(item);
 		}
@@ -240,7 +251,7 @@ public class PcInventory extends Inventory
 	{
 		List<TradeList.TradeItem> list = new FastList<TradeList.TradeItem>();
 		for (L2ItemInstance item : _items)
-			if (item.isAvailable(getOwner(), false, false))
+			if (item != null && item.isAvailable(getOwner(), false, false))
 				{
 				TradeList.TradeItem adjItem = tradeList.adjustAvailableItem(item);
 					if (adjItem != null) list.add(adjItem);

+ 5 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/itemcontainer/PcRefund.java

@@ -60,7 +60,11 @@ public class PcRefund extends ItemContainer
 		{
 			if (getSize() > 12)
 			{
-				L2ItemInstance removedItem = _items.remove(0);
+				L2ItemInstance removedItem;
+				synchronized (_items)
+				{
+					removedItem = _items.remove(0);
+				}
 				if (removedItem != null)
 				{
 					ItemTable.getInstance().destroyItem("ClearRefund", removedItem, getOwner(), null);