fix: Eliminates List allocations in various places. (#2158)
This commit is contained in:
parent
6f64cddd0b
commit
4836bff5eb
23 changed files with 263 additions and 200 deletions
|
|
@ -430,8 +430,8 @@ public partial class Container : Item
|
|||
|
||||
public virtual bool TryDropItems(Mobile from, bool sendFullMessage, params ReadOnlySpan<Item> droppedItems)
|
||||
{
|
||||
var dropItems = new List<Item>();
|
||||
var stackItems = new List<ItemStackEntry>();
|
||||
using var dropItems = PooledRefQueue<Item>.Create();
|
||||
using var stackItems = PooledRefQueue<ItemStackEntry>.Create();
|
||||
|
||||
var extraItems = 0;
|
||||
var extraWeight = 0;
|
||||
|
|
@ -451,7 +451,7 @@ public partial class Container : Item
|
|||
if (item is not Container && CheckHold(from, dropped, false, false, 0, extraWeight) &&
|
||||
item.CanStackWith(dropped))
|
||||
{
|
||||
stackItems.Add(new ItemStackEntry(item, dropped));
|
||||
stackItems.Enqueue(new ItemStackEntry(item, dropped));
|
||||
extraWeight += (int)Math.Ceiling(item.Weight * (item.Amount + dropped.Amount)) -
|
||||
item.PileWeight; // extra weight delta, do not need TotalWeight as we do not have hybrid stackable container types
|
||||
stacked = true;
|
||||
|
|
@ -461,7 +461,7 @@ public partial class Container : Item
|
|||
|
||||
if (!stacked && CheckHold(from, dropped, false, true, extraItems, extraWeight))
|
||||
{
|
||||
dropItems.Add(dropped);
|
||||
dropItems.Enqueue(dropped);
|
||||
extraItems++;
|
||||
extraWeight += dropped.TotalWeight + dropped.PileWeight;
|
||||
}
|
||||
|
|
@ -469,14 +469,15 @@ public partial class Container : Item
|
|||
|
||||
if (dropItems.Count + stackItems.Count == droppedItems.Length) // All good
|
||||
{
|
||||
for (var i = 0; i < dropItems.Count; i++)
|
||||
while (dropItems.Count > 0)
|
||||
{
|
||||
DropItem(dropItems[i]);
|
||||
DropItem(dropItems.Dequeue());
|
||||
}
|
||||
|
||||
for (var i = 0; i < stackItems.Count; i++)
|
||||
while (stackItems.Count > 0)
|
||||
{
|
||||
stackItems[i].m_StackItem.StackWith(from, stackItems[i].m_DropItem, false);
|
||||
var stackItem = stackItems.Dequeue();
|
||||
stackItem.m_StackItem.StackWith(from, stackItem.m_DropItem, false);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -547,10 +547,29 @@ public class Region : IComparable<Region>, IValueLinkListNode<Region>
|
|||
public virtual bool AcceptsSpawnsFrom(Region region) =>
|
||||
AllowSpawn() && (region == this || Parent?.AcceptsSpawnsFrom(region) == true);
|
||||
|
||||
public PooledRefList<Mobile> GetPlayersPooled()
|
||||
{
|
||||
var list = PooledRefList<Mobile>.Create();
|
||||
for (var i = 0; i < Sectors?.Length; i++)
|
||||
{
|
||||
var sector = Sectors[i];
|
||||
|
||||
foreach (var ns in sector.Clients)
|
||||
{
|
||||
var player = ns.Mobile;
|
||||
if (player?.Deleted == false && player.Region.IsPartOf(this))
|
||||
{
|
||||
list.Add(ns.Mobile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<Mobile> GetPlayers()
|
||||
{
|
||||
var list = new List<Mobile>();
|
||||
|
||||
List<Mobile> list = [];
|
||||
for (var i = 0; i < Sectors?.Length; i++)
|
||||
{
|
||||
var sector = Sectors[i];
|
||||
|
|
@ -609,6 +628,25 @@ public class Region : IComparable<Region>, IValueLinkListNode<Region>
|
|||
return list;
|
||||
}
|
||||
|
||||
public PooledRefList<Mobile> GetMobilesPooled()
|
||||
{
|
||||
var list = PooledRefList<Mobile>.Create();
|
||||
for (var i = 0; i < Sectors?.Length; i++)
|
||||
{
|
||||
var sector = Sectors[i];
|
||||
|
||||
foreach (var mobile in sector.Mobiles)
|
||||
{
|
||||
if (mobile.Region.IsPartOf(this))
|
||||
{
|
||||
list.Add(mobile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public int GetMobileCount()
|
||||
{
|
||||
var count = 0;
|
||||
|
|
@ -649,6 +687,26 @@ public class Region : IComparable<Region>, IValueLinkListNode<Region>
|
|||
return list;
|
||||
}
|
||||
|
||||
public PooledRefList<Item> GetItemsPooled()
|
||||
{
|
||||
var list = PooledRefList<Item>.Create();
|
||||
|
||||
for (var i = 0; i < Sectors?.Length; i++)
|
||||
{
|
||||
var sector = Sectors[i];
|
||||
|
||||
foreach (var item in sector.Items)
|
||||
{
|
||||
if (Find(item.Location, item.Map).IsPartOf(this))
|
||||
{
|
||||
list.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public int GetItemCount()
|
||||
{
|
||||
var count = 0;
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@
|
|||
using System;
|
||||
using System.Buffers;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text;
|
||||
using Server.Buffers;
|
||||
using Server.Text;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue