fix: Replaces FindItem(s)ByType(s) implementation with BFS strategy (#1454)

This commit is contained in:
Stefano Merotta 2023-08-19 07:05:28 +02:00 • committed by GitHub
parent cd5fddd8d1
commit 52ca1fe686
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 135 additions and 160 deletions

View file

@ -143,7 +143,7 @@ namespace Server.Engines.Craft
{
var items = from.Backpack.FindItemsByType(resourceType);
for (var i = 0; i < items.Length; ++i)
for (var i = 0; i < items.Count; ++i)
{
resourceCount += items[i].Amount;
}
@ -187,7 +187,7 @@ namespace Server.Engines.Craft
{
var items = from.Backpack.FindItemsByType(resourceType);
for (var i = 0; i < items.Length; ++i)
for (var i = 0; i < items.Count; ++i)
{
resourceCount += items[i].Amount;
}
@ -265,7 +265,7 @@ namespace Server.Engines.Craft
{
var items = from.Backpack.FindItemsByType(subResource.ItemType);
for (var j = 0; j < items.Length; ++j)
for (var j = 0; j < items.Count; ++j)
{
resourceCount += items[j].Amount;
}

View file

@ -454,14 +454,14 @@ namespace Server.Engines.Craft
}
// TODO: Optimize allocation
var items = new Item[types.Length][];
var items = new List<Item>[types.Length];
var totals = new int[types.Length];
for (var i = 0; i < types.Length; ++i)
{
items[i] = cont.FindItemsByType(types[i]);
for (var j = 0; j < items[i].Length; ++j)
for (var j = 0; j < items[i].Count; ++j)
{
if (items[i][j] is not IHasQuantity hq)
{
@ -483,7 +483,7 @@ namespace Server.Engines.Craft
{
var need = amounts[i];
for (var j = 0; j < items[i].Length; ++j)
for (var j = 0; j < items[i].Count; ++j)
{
var item = items[i][j];
@ -534,7 +534,7 @@ namespace Server.Engines.Craft
var amount = 0;
for (var i = 0; i < items.Length; ++i)
for (var i = 0; i < items.Count; ++i)
{
if (items[i] is not IHasQuantity hq)
{

View file

@ -351,7 +351,7 @@ namespace Server.Gumps
var items = pack.FindItemsByType(TreasuresOfTokuno.LesserArtifactsTotal);
for (var i = 0; i < items.Length; i++)
for (var i = 0; i < items.Count; i++)
{
var item = items[i];
if (item is ChestOfHeirlooms heirlooms && (!heirlooms.Locked || heirlooms.TrapLevel != 10))

View file

@ -273,7 +273,7 @@ public partial class SalvageBag : Bag
var items = FindItemsByType(_clothTypes);
for (var i = 0; i < items.Length; i++)
for (var i = 0; i < items.Count; i++)
{
from.AddToBackpack(items[i]);
}

View file

@ -667,7 +667,7 @@ public abstract partial class BaseBeverage : Item, IHasQuantity
// First pass, compute total
var total = 0;
for (var i = 0; i < items.Length; ++i)
for (var i = 0; i < items.Count; ++i)
{
if (items[i] is BaseBeverage bev && bev.Content == content && !bev.IsEmpty)
{
@ -681,7 +681,7 @@ public abstract partial class BaseBeverage : Item, IHasQuantity
var need = quantity;
for (var i = 0; i < items.Length; ++i)
for (var i = 0; i < items.Count; ++i)
{
if (items[i] is not BaseBeverage bev || bev.Content != content || bev.IsEmpty)
{

View file

@ -62,7 +62,7 @@ namespace Server.Mobiles
return Math.Max(0, (int)Math.Min(int.MaxValue, balance));
}
public static int GetBalance(Mobile m, out Item[] gold, out Item[] checks)
public static int GetBalance(Mobile m, out List<Item> gold, out List<Item> checks)
{
long balance = 0;
@ -72,7 +72,7 @@ namespace Server.Mobiles
if (balance > int.MaxValue)
{
gold = checks = Array.Empty<Item>();
gold = checks = new List<Item>();
return int.MaxValue;
}
}
@ -94,7 +94,7 @@ namespace Server.Mobiles
}
else
{
gold = checks = Array.Empty<Item>();
gold = checks = new List<Item>();
}
return Math.Max(0, (int)Math.Min(int.MaxValue, balance));
@ -115,7 +115,7 @@ namespace Server.Mobiles
return false;
}
for (var i = 0; amount > 0 && i < gold.Length; ++i)
for (var i = 0; amount > 0 && i < gold.Count; ++i)
{
if (gold[i].Amount <= amount)
{
@ -129,7 +129,7 @@ namespace Server.Mobiles
}
}
for (var i = 0; amount > 0 && i < checks.Length; ++i)
for (var i = 0; amount > 0 && i < checks.Count; ++i)
{
var check = (BankCheck)checks[i];