fix: Changes Map.Sector.Items to link list. (#1547)
### Summary
Eliminates `IPooledEnumerable<T>` and `eable.Free()` from `Map` for items. This drastically simplifies code that iterates in range, for example:
```cs
foreach (var item in m.GetItemsInRange(5))
{
}
```
The code above no longer requires an eable and calling `Free()`.
This commit is contained in:
parent
1330c4a830
commit
24858f3989
42 changed files with 577 additions and 419 deletions
|
|
@ -1,6 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Server.Engines.Spawners;
|
||||
using Server.Items;
|
||||
|
|
@ -1502,31 +1501,32 @@ namespace Server.Multis
|
|||
}
|
||||
}
|
||||
|
||||
var eable = map.GetItemsInBounds(
|
||||
new Rectangle2D(
|
||||
p.X + newComponents.Min.X,
|
||||
p.Y + newComponents.Min.Y,
|
||||
newComponents.Width,
|
||||
newComponents.Height
|
||||
)
|
||||
var bounds = new Rectangle2D(
|
||||
p.X + newComponents.Min.X,
|
||||
p.Y + newComponents.Min.Y,
|
||||
newComponents.Width,
|
||||
newComponents.Height
|
||||
);
|
||||
|
||||
var canFit = eable.All(
|
||||
item =>
|
||||
foreach (var item in map.GetItemsInBounds(bounds))
|
||||
{
|
||||
if (item is BaseMulti || item.ItemID > TileData.MaxItemValue || item.Z < p.Z || !item.Visible)
|
||||
{
|
||||
if (item is BaseMulti || item.ItemID > TileData.MaxItemValue || item.Z < p.Z || !item.Visible)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
var x = item.X - p.X + newComponents.Min.X;
|
||||
var y = item.Y - p.Y + newComponents.Min.Y;
|
||||
|
||||
return x >= 0 && x < newComponents.Width && y >= 0 && y < newComponents.Height &&
|
||||
newComponents.Tiles[x][y].Length == 0 || Contains(item);
|
||||
continue;
|
||||
}
|
||||
);
|
||||
return canFit;
|
||||
|
||||
var x = item.X - p.X + newComponents.Min.X;
|
||||
var y = item.Y - p.Y + newComponents.Min.Y;
|
||||
|
||||
// Out of bounds, return false - cannot fit
|
||||
if ((x < 0 || x >= newComponents.Width || y < 0 || y >= newComponents.Height ||
|
||||
newComponents.Tiles[x][y].Length != 0) && !Contains(item))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public Point3D Rotate(Point3D p, int count)
|
||||
|
|
|
|||
|
|
@ -1141,6 +1141,7 @@ namespace Server.Multis
|
|||
MovingCrate.DropItem(item);
|
||||
}
|
||||
|
||||
// TODO: Convert to a ref struct enumerator
|
||||
public List<Item> GetItems()
|
||||
{
|
||||
if (Map == null || Map == Map.Internal)
|
||||
|
|
@ -1152,8 +1153,14 @@ namespace Server.Multis
|
|||
var end = new Point2D(X + Components.Max.X + 1, Y + Components.Max.Y + 1);
|
||||
var rect = new Rectangle2D(start, end);
|
||||
|
||||
var eable = Map.GetItemsInBounds(rect);
|
||||
var list = eable.Where(item => item.Movable && IsInside(item)).ToList();
|
||||
var list = new List<Item>();
|
||||
foreach (var item in Map.GetItemsInBounds(rect))
|
||||
{
|
||||
if (item.Movable && IsInside(item))
|
||||
{
|
||||
list.Add(item);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
|
@ -3653,11 +3660,14 @@ namespace Server.Multis
|
|||
}
|
||||
|
||||
var mcl = Components;
|
||||
var eable =
|
||||
map.GetItemsInBounds<Guildstone>(new Rectangle2D(X + mcl.Min.X, Y + mcl.Min.Y, mcl.Width, mcl.Height));
|
||||
var bounds = new Rectangle2D(X + mcl.Min.X, Y + mcl.Min.Y, mcl.Width, mcl.Height);
|
||||
|
||||
var item = eable.FirstOrDefault(Contains);
|
||||
return item;
|
||||
foreach (var gs in map.GetItemsInBounds<Guildstone>(bounds))
|
||||
{
|
||||
return gs;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void ResetDynamicDecay()
|
||||
|
|
|
|||
|
|
@ -142,10 +142,8 @@ namespace Server.Multis
|
|||
|
||||
items.Clear();
|
||||
|
||||
for (var i = 0; i < sector.Items.Count; ++i)
|
||||
foreach (var item in sector.Items)
|
||||
{
|
||||
var item = sector.Items[i];
|
||||
|
||||
if (item.Visible && item.X == tileX && item.Y == tileY)
|
||||
{
|
||||
items.Add(item);
|
||||
|
|
@ -366,12 +364,9 @@ namespace Server.Multis
|
|||
}
|
||||
|
||||
var sector = map.GetSector(borderPoint.X, borderPoint.Y);
|
||||
var sectorItems = sector.Items;
|
||||
|
||||
for (var j = 0; j < sectorItems.Count; ++j)
|
||||
foreach (var item in sector.Items)
|
||||
{
|
||||
var item = sectorItems[j];
|
||||
|
||||
if (item.X != borderPoint.X || item.Y != borderPoint.Y || item.Movable)
|
||||
{
|
||||
continue;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue