public void AddStaticThatNeedsUpdating(StaticItem item) { if (item.IsDisposed || item.Overheads.Count == 0) return; m_ActiveStatics.Add(item); }
public void Load(TileMatrixClient tileData, Map map) { // get data from the tile Matrix byte[] groundData = tileData.GetLandBlock(BlockX, BlockY); int staticLength; byte[] staticsData = tileData.GetStaticBlock(BlockX, BlockY, out staticLength); // load the ground data into the tiles. int groundDataIndex = 0; for (int i = 0; i < 64; i++) { int iTileID = groundData[groundDataIndex++] + (groundData[groundDataIndex++] << 8); int iTileZ = (sbyte)groundData[groundDataIndex++]; Ground ground = new Ground(iTileID, map); ground.Position.Set((int)BlockX * 8 + i % 8, (int)BlockY * 8 + (i / 8), iTileZ); } // load the statics data into the tiles int countStatics = staticLength / 7; int staticDataIndex = 0; for (int i = 0; i < countStatics; i++) { int iTileID = staticsData[staticDataIndex++] + (staticsData[staticDataIndex++] << 8); int iX = staticsData[staticDataIndex++]; int iY = staticsData[staticDataIndex++]; int iTileZ = (sbyte)staticsData[staticDataIndex++]; int hue = staticsData[staticDataIndex++] + (staticsData[staticDataIndex++] * 256); StaticItem item = new StaticItem(iTileID, hue, i, map); item.Position.Set((int)BlockX * 8 + iX, (int)BlockY * 8 + iY, iTileZ); } }
private void PlaceTilesIntoNewlyLoadedChunk(MapChunk chunk) { int px = Position.X; int py = Position.Y; Rectangle bounds = new Rectangle((int)chunk.ChunkX * 8, (int)chunk.ChunkY * 8, 8, 8); foreach (MultiComponentList.MultiItem item in m_Components.Items) { int x = px + item.OffsetX; int y = py + item.OffsetY; if (bounds.Contains(x, y)) { // would it be faster to get the tile from the chunk? MapTile tile = Map.GetMapTile(x, y); if (tile != null) { if (!tile.ItemExists(item.ItemID, item.OffsetZ)) { StaticItem staticItem = new StaticItem(item.ItemID, 0, 0, Map); staticItem.Position.Set(x, y, Z + item.OffsetZ); } } } } }
private void InitialLoadTiles() { int px = Position.X; int py = Position.Y; foreach (MultiComponentList.MultiItem item in m_Components.Items) { int x = px + item.OffsetX; int y = py + item.OffsetY; MapTile tile = Map.GetMapTile((uint)x, (uint)y); if (tile != null) { if (tile.ItemExists(item.ItemID, item.OffsetZ)) continue; StaticItem staticItem = new StaticItem(item.ItemID, 0, 0, Map); if (staticItem.ItemData.IsDoor) continue; staticItem.Position.Set(x, y, Z + item.OffsetZ); } } }
private static bool IsOk(bool ignoreDoors, int ourZ, int ourTop, StaticItem[] tiles, List<Item> items) { for (int i = 0; i < tiles.Length; ++i) { StaticItem check = tiles[i]; if ((check.ItemData.Flags & ImpassableSurface) != 0) // Impassable || Surface { int checkZ = (int)check.Z; int checkTop = checkZ + check.ItemData.CalcHeight; if (checkTop > ourZ && ourTop > checkZ) return false; } } for (int i = 0; i < items.Count; ++i) { Item item = items[i]; int itemID = item.ItemID & 0x3FFF; ItemData itemData = TileData.ItemData[itemID]; TileFlag flags = itemData.Flags; if ((flags & ImpassableSurface) != 0) // Impassable || Surface { if (ignoreDoors && ((flags & TileFlag.Door) != 0 || itemID == 0x692 || itemID == 0x846 || itemID == 0x873 || (itemID >= 0x6F5 && itemID <= 0x6F6))) continue; int checkZ = item.Z; int checkTop = checkZ + itemData.CalcHeight; if (checkTop > ourZ && ourTop > checkZ) return false; } } return true; }