fix: Updates container searches for non-generic types (#1567)
This commit is contained in:
parent
331f24cb71
commit
3109f59d4d
9 changed files with 248 additions and 175 deletions
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue