public static ObjList ListTile(locXY loc, ObjectListFilter flags) { Span <bool> returnTypes = stackalloc bool[ObjectTypes.Count]; CreateTypeFilter(flags, returnTypes); var result = new ObjList(); var sectorLoc = new SectorLoc(loc); if ((flags & ObjectListFilter.OLC_STATIC) != 0 || GameSystems.MapSector.IsSectorLoaded(sectorLoc)) { using var lockedSector = new LockedMapSector(sectorLoc); Sector.GetSectorTileCoords(loc, out var tileX, out var tileY); var objects = lockedSector.GetObjectsAt(tileX, tileY); result.EnsureCapacity(objects.Count); foreach (var obj in objects) { if (!GameSystems.MapObject.IsHiddenByFlags(obj) && returnTypes[(int)obj.type]) { result.Add(obj); } } } else { foreach (var obj in GameSystems.Object.SpatialIndex.EnumerateInSector(sectorLoc)) { if (!obj.type.IsStatic()) { if (!obj.HasFlag(ObjectFlag.INVENTORY) && obj.GetLocation() == loc && !GameSystems.MapObject.IsHiddenByFlags(obj) && returnTypes[(int)obj.type]) { result.Add(obj); } } } } ++dword_10808CF8; return(result); }
private static void CreateTypeFilter(ObjectListFilter flags, Span <bool> typeFilter) { Debug.Assert(typeFilter.Length == ObjectTypes.Count); if (flags.HasFlag(ObjectListFilter.OLC_PORTAL)) { typeFilter[(int)ObjectType.portal] = true; } if (flags.HasFlag(ObjectListFilter.OLC_CONTAINER)) { typeFilter[(int)ObjectType.container] = true; } if (flags.HasFlag(ObjectListFilter.OLC_SCENERY)) { typeFilter[(int)ObjectType.scenery] = true; } if (flags.HasFlag(ObjectListFilter.OLC_PROJECTILE)) { typeFilter[(int)ObjectType.projectile] = true; } if (flags.HasFlag(ObjectListFilter.OLC_WEAPON)) { typeFilter[(int)ObjectType.weapon] = true; } if (flags.HasFlag(ObjectListFilter.OLC_AMMO)) { typeFilter[(int)ObjectType.ammo] = true; } if (flags.HasFlag(ObjectListFilter.OLC_ARMOR)) { typeFilter[(int)ObjectType.armor] = true; } if (flags.HasFlag(ObjectListFilter.OLC_MONEY)) { typeFilter[(int)ObjectType.money] = true; } if (flags.HasFlag(ObjectListFilter.OLC_FOOD)) { typeFilter[(int)ObjectType.food] = true; } if (flags.HasFlag(ObjectListFilter.OLC_SCROLL)) { typeFilter[(int)ObjectType.scroll] = true; } if (flags.HasFlag(ObjectListFilter.OLC_KEY)) { typeFilter[(int)ObjectType.key] = true; } if (flags.HasFlag(ObjectListFilter.OLC_BAG)) { typeFilter[(int)ObjectType.bag] = true; } if (flags.HasFlag(ObjectListFilter.OLC_WRITTEN)) { typeFilter[(int)ObjectType.written] = true; } if (flags.HasFlag(ObjectListFilter.OLC_GENERIC)) { typeFilter[(int)ObjectType.generic] = true; } if (flags.HasFlag(ObjectListFilter.OLC_PC)) { typeFilter[(int)ObjectType.pc] = true; } if (flags.HasFlag(ObjectListFilter.OLC_NPC)) { typeFilter[(int)ObjectType.npc] = true; } if (flags.HasFlag(ObjectListFilter.OLC_TRAP)) { typeFilter[(int)ObjectType.trap] = true; } }