From 656a6a49be5aabb8b5b6abb0ffcb0b8973ad81f6 Mon Sep 17 00:00:00 2001 From: SGKoishi Date: Sat, 10 Dec 2022 13:36:13 -0800 Subject: [PATCH] Exclude unused fields, allow tileMoss, SandSpray and SnowSpray --- TShockAPI/Handlers/SendTileRectHandler.cs | 44 +++++++++++++++++++---- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/TShockAPI/Handlers/SendTileRectHandler.cs b/TShockAPI/Handlers/SendTileRectHandler.cs index ca7634077..3ff85feaf 100644 --- a/TShockAPI/Handlers/SendTileRectHandler.cs +++ b/TShockAPI/Handlers/SendTileRectHandler.cs @@ -390,8 +390,18 @@ internal void ProcessFlowerBoots(int realX, int realY, NetTile newTile) } } - private static List _convertibleTiles = typeof(TileID.Sets.Conversion).GetFields().Select(f => (bool[])f.GetValue(null)).ToList(); - private static List _convertibleWalls = typeof(WallID.Sets.Conversion).GetFields().Select(f => (bool[])f.GetValue(null)).ToList(); + // Moss and MossBrick are not used in conversion + private static List _convertibleTiles = typeof(TileID.Sets.Conversion) + .GetFields() + .ExceptBy(new[] { nameof(TileID.Sets.Conversion.Moss), nameof(TileID.Sets.Conversion.MossBrick) }, f => f.Name) + .Select(f => (bool[])f.GetValue(null)) + .ToList(); + // PureSand is only used in WorldGen.SpreadDesertWalls, which is server side + private static List _convertibleWalls = typeof(WallID.Sets.Conversion) + .GetFields() + .ExceptBy(new[] { nameof(WallID.Sets.Conversion.PureSand) }, f => f.Name) + .Select(f => (bool[])f.GetValue(null)) + .ToList(); /// /// Updates a single tile on the server if it is a valid conversion from one tile or wall type to another (eg stone -> corrupt stone) @@ -400,22 +410,42 @@ internal void ProcessFlowerBoots(int realX, int realY, NetTile newTile) /// The NetTile containing new tile properties internal void ProcessConversionSpreads(ITile tile, NetTile newTile) { - // Update if the existing tile or wall is convertible and the new tile or wall is a valid conversion - foreach (var tileType in _convertibleTiles) + var allowTile = false; + if (Main.tileMoss[tile.type] && TileID.Sets.Conversion.Stone[newTile.Type]) { - if (tileType[tile.type] && tileType[newTile.Type]) + allowTile = true; + } + else if ((Main.tileMoss[tile.type] || TileID.Sets.Conversion.Stone[tile.type] || TileID.Sets.Conversion.Ice[tile.type] || TileID.Sets.Conversion.Sandstone[tile.type]) && + (newTile.Type == TileID.Sandstone || newTile.Type == TileID.IceBlock)) + { + // ProjectileID.SandSpray and ProjectileID.SnowSpray + allowTile = true; + } + else + { + foreach (var tileType in _convertibleTiles) { - TShock.Log.ConsoleDebug(GetString($"Bouncer / SendTileRect processing a tile conversion update - [{tile.type}] -> [{newTile.Type}]")); - UpdateServerTileState(tile, newTile, TileDataType.Tile); + if (tileType[tile.type] && tileType[newTile.Type]) + { + allowTile = true; + break; + } } } + if (allowTile) + { + TShock.Log.ConsoleDebug(GetString($"Bouncer / SendTileRect processing a tile conversion update - [{tile.type}] -> [{newTile.Type}]")); + UpdateServerTileState(tile, newTile, TileDataType.Tile); + } + foreach (var wallType in _convertibleWalls) { if (wallType[tile.wall] && wallType[newTile.Wall]) { TShock.Log.ConsoleDebug(GetString($"Bouncer / SendTileRect processing a wall conversion update - [{tile.wall}] -> [{newTile.Wall}]")); UpdateServerTileState(tile, newTile, TileDataType.Wall); + break; } } }