fix: Updates container searches for non-generic types (#1567)

This commit is contained in:
Voxpire 2023-11-23 17:29:45 +00:00 committed by GitHub
parent 331f24cb71
commit 3109f59d4d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 248 additions and 175 deletions

View file

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using Server.Collections;
using Server.Logging;
using Server.Network;
@ -27,6 +26,7 @@ public partial class Container : Item
private int m_TotalItems;
private int m_TotalWeight;
private int _version;
public Container(int itemID) : base(itemID)
{
@ -464,6 +464,18 @@ public partial class Container : Item
}
}
public override void OnItemAdded(Item item)
{
base.OnItemAdded(item);
_version++;
}
public override void OnItemRemoved(Item item)
{
base.OnItemRemoved(item);
_version++;
}
public virtual bool OnStackAttempt(Mobile from, Item stack, Item dropped) =>
CheckHold(from, dropped, true, false) && stack.StackWith(from, dropped);
@ -800,14 +812,7 @@ public partial class Container : Item
throw new ArgumentNullException(nameof(grouper));
}
using var typedItems = PooledRefList<Item>.Create();
foreach (var item in FindItems(recurse))
{
if (type.IsInstanceOfType(item))
{
typedItems.Add(item);
}
}
using var typedItems = ListItemsByType(type, recurse);
var groups = new List<List<Item>>();
var idx = 0;
@ -815,9 +820,10 @@ public partial class Container : Item
while (idx < typedItems.Count)
{
var a = typedItems[idx++];
var group = new List<Item>();
group.Add(a);
var group = new List<Item>
{
a
};
while (idx < typedItems.Count)
{
@ -920,14 +926,8 @@ public partial class Container : Item
for (var i = 0; i < types.Length; ++i)
{
var type = types[i];
using var typedItems = PooledRefList<Item>.Create();
foreach (var item in FindItems(recurse))
{
if (type.IsInstanceOfType(item))
{
typedItems.Add(item);
}
}
using var typedItems = ListItemsByType(type, recurse);
var groups = new List<List<Item>>();
var idx = 0;
@ -935,9 +935,10 @@ public partial class Container : Item
while (idx < typedItems.Count)
{
var a = typedItems[idx++];
var group = new List<Item>();
group.Add(a);
var group = new List<Item>
{
a
};
while (idx < typedItems.Count)
{
@ -1043,19 +1044,20 @@ public partial class Container : Item
for (var i = 0; i < types.Length; ++i)
{
var typedItems = CollectionsMarshal.AsSpan(FindItemsByType(types[i], recurse));
using var typedItems = ListItemsByType(types[i], recurse);
var groups = new List<List<Item>>();
var idx = 0;
while (idx < typedItems.Length)
while (idx < typedItems.Count)
{
var a = typedItems[idx++];
var group = new List<Item>();
var group = new List<Item>
{
a
};
group.Add(a);
while (idx < typedItems.Length)
while (idx < typedItems.Count)
{
var b = typedItems[idx];
var v = grouper(a, b);
@ -1146,16 +1148,19 @@ public partial class Container : Item
throw new ArgumentException("length of types and amounts must match");
}
var items = new List<Item>[types.Length];
var items = new Item[types.Length][];
var totals = new int[types.Length];
for (var i = 0; i < types.Length; ++i)
{
items[i] = FindItemsByType(types[i], recurse);
using var typedItems = ListItemsByType(types[i], recurse);
for (var j = 0; j < items[i].Count; ++j)
items[i] = new Item[typedItems.Count];
for (var j = 0; j < typedItems.Count; ++j)
{
totals[i] += items[i][j].Amount;
items[i][j] = typedItems[j];
totals[i] += typedItems[j].Amount;
}
if (totals[i] < amounts[i])
@ -1168,7 +1173,7 @@ public partial class Container : Item
{
var need = amounts[i];
for (var j = 0; j < items[i].Count; ++j)
for (var j = 0; j < items[i].Length; ++j)
{
var item = items[i][j];
@ -1201,19 +1206,19 @@ public partial class Container : Item
throw new ArgumentException("length of types and amounts must match");
}
var items = new List<Item>[types.Length];
var items = new Item[types.Length][];
var totals = new int[types.Length];
for (var i = 0; i < types.Length; ++i)
{
var itemList = items[i] = new List<Item>();
foreach (var item in FindItems())
using var typedItems = ListItemsByType(types[i], recurse);
items[i] = new Item[typedItems.Count];
for (var j = 0; j < typedItems.Count; ++j)
{
if (types[i].IsInstanceOfType(item))
{
totals[i] += item.Amount;
itemList.Add(item);
}
items[i][j] = typedItems[j];
totals[i] += typedItems[j].Amount;
}
if (totals[i] < amounts[i])
@ -1226,7 +1231,7 @@ public partial class Container : Item
{
var need = amounts[i];
for (var j = 0; j < items[i].Count; ++j)
for (var j = 0; j < items[i].Length; ++j)
{
var item = items[i][j];
@ -1255,20 +1260,17 @@ public partial class Container : Item
public bool ConsumeTotal(Type type, int amount = 1, bool recurse = true, OnItemConsumed callback = null)
{
var total = 0;
using var items = PooledRefQueue<Item>.Create();
using var typedItems = ListItemsByType(type, recurse);
// First pass, compute total
foreach (var item in FindItems(recurse))
foreach (var item in typedItems)
{
if (type.IsInstanceOfType(item))
{
items.Enqueue(item);
total += item.Amount;
total += item.Amount;
if (total >= amount)
{
break;
}
if (total >= amount)
{
break;
}
}
@ -1277,10 +1279,8 @@ public partial class Container : Item
{
var need = amount;
while (items.Count > 0)
foreach (var item in typedItems)
{
var item = items.Dequeue();
var theirAmount = item.Amount;
if (theirAmount < need)
@ -1308,6 +1308,7 @@ public partial class Container : Item
var consumed = 0;
using var toDelete = PooledRefQueue<Item>.Create();
RecurseConsumeUpTo(this, type, amount, recurse, ref consumed, toDelete);
while (toDelete.Count > 0)
@ -1368,14 +1369,7 @@ public partial class Container : Item
var best = 0;
using var typedItems = PooledRefList<Item>.Create();
foreach (var item in FindItems(recurse))
{
if (type.IsInstanceOfType(item))
{
typedItems.Add(item);
}
}
using var typedItems = ListItemsByType(type, recurse);
var groups = new List<List<Item>>();
var idx = 0;
@ -1437,12 +1431,12 @@ public partial class Container : Item
var best = 0;
var typedItems = CollectionsMarshal.AsSpan(FindItemsByType(types, recurse));
var typedItems = ListItemsByType(types, recurse);
var groups = new List<List<Item>>();
var idx = 0;
while (idx < typedItems.Length)
while (idx < typedItems.Count)
{
var a = typedItems[idx++];
var group = new List<Item>
@ -1450,7 +1444,7 @@ public partial class Container : Item
a
};
while (idx < typedItems.Length)
while (idx < typedItems.Count)
{
var b = typedItems[idx];
var v = grouper(a, b);
@ -1474,6 +1468,7 @@ public partial class Container : Item
{
var items = groups[j].ToArray();
var total = 0;
foreach (var item in items)
{
total += item.Amount;
@ -1499,19 +1494,20 @@ public partial class Container : Item
for (var i = 0; i < types.Length; ++i)
{
var typedItems = CollectionsMarshal.AsSpan(FindItemsByType(types[i], recurse));
using var typedItems = ListItemsByType(types[i], recurse);
var groups = new List<List<Item>>();
var idx = 0;
while (idx < typedItems.Length)
while (idx < typedItems.Count)
{
var a = typedItems[idx++];
var group = new List<Item>();
var group = new List<Item>
{
a
};
group.Add(a);
while (idx < typedItems.Length)
while (idx < typedItems.Count)
{
var b = typedItems[idx];
var v = grouper(a, b);
@ -1554,6 +1550,7 @@ public partial class Container : Item
public int GetAmount(Type type, bool recurse = true)
{
var total = 0;
foreach (var item in FindItems(recurse))
{
if (type.IsInstanceOfType(item))
@ -1568,6 +1565,7 @@ public partial class Container : Item
public int GetAmount(Type[] types, bool recurse = true)
{
var total = 0;
foreach (var item in FindItems(recurse))
{
if (item.InTypeList(types))
@ -1578,35 +1576,6 @@ public partial class Container : Item
return total;
}
public List<Item> FindItemsByType(Type type, bool recurse = true)
{
var items = new List<Item>();
foreach (var item in FindItems(recurse))
{
if (type.IsInstanceOfType(item))
{
items.Add(item);
}
}
return items;
}
public List<Item> FindItemsByType(Type[] types, bool recurse = true)
{
var items = new List<Item>();
foreach (var item in FindItems(recurse))
{
if (item.InTypeList(types))
{
items.Add(item);
}
}
return items;
}
public Item FindItemByType(Type type, bool recurse = true)
{
foreach (var item in FindItems(recurse))