// Decompiled with JetBrains decompiler // Type: Terraria.GameContent.NetModules.NetLiquidModule // Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null // MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83 // Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe using Microsoft.Xna.Framework; using System.Collections.Generic; using System.IO; using Terraria.Net; namespace Terraria.GameContent.NetModules { public class NetLiquidModule : NetModule { private static List _changesForPlayerCache = new List(); private static Dictionary _changesByChunkCoords = new Dictionary(); public static NetPacket Serialize(HashSet changes) { NetPacket packet = NetModule.CreatePacket(changes.Count * 6 + 2); packet.Writer.Write((ushort) changes.Count); foreach (int change in changes) { int index1 = change >> 16 & (int) ushort.MaxValue; int index2 = change & (int) ushort.MaxValue; packet.Writer.Write(change); packet.Writer.Write(Main.tile[index1, index2].liquid); packet.Writer.Write(Main.tile[index1, index2].liquidType()); } return packet; } public static NetPacket SerializeForPlayer(int playerIndex) { NetLiquidModule._changesForPlayerCache.Clear(); foreach (KeyValuePair changesByChunkCoord in NetLiquidModule._changesByChunkCoords) { if (changesByChunkCoord.Value.BroadcastingCondition(playerIndex)) NetLiquidModule._changesForPlayerCache.AddRange((IEnumerable) changesByChunkCoord.Value.DirtiedPackedTileCoords); } NetPacket packet = NetModule.CreatePacket(NetLiquidModule._changesForPlayerCache.Count * 6 + 2); packet.Writer.Write((ushort) NetLiquidModule._changesForPlayerCache.Count); foreach (int num in NetLiquidModule._changesForPlayerCache) { int index1 = num >> 16 & (int) ushort.MaxValue; int index2 = num & (int) ushort.MaxValue; packet.Writer.Write(num); packet.Writer.Write(Main.tile[index1, index2].liquid); packet.Writer.Write(Main.tile[index1, index2].liquidType()); } return packet; } public override bool Deserialize(BinaryReader reader, int userId) { int num1 = (int) reader.ReadUInt16(); for (int index1 = 0; index1 < num1; ++index1) { int num2 = reader.ReadInt32(); byte num3 = reader.ReadByte(); byte num4 = reader.ReadByte(); int index2 = num2 >> 16 & (int) ushort.MaxValue; int index3 = num2 & (int) ushort.MaxValue; Tile tile = Main.tile[index2, index3]; if (tile != null) { tile.liquid = num3; tile.liquidType((int) num4); } } return true; } public static void CreateAndBroadcastByChunk(HashSet dirtiedPackedTileCoords) { NetLiquidModule.PrepareChunks(dirtiedPackedTileCoords); NetLiquidModule.PrepareAndSendToEachPlayerSeparately(); } private static void PrepareAndSendToEachPlayerSeparately() { for (int index = 0; index < 256; ++index) { if (Netplay.Clients[index].IsConnected()) NetManager.Instance.SendToClient(NetLiquidModule.SerializeForPlayer(index), index); } } private static void BroadcastEachChunkSeparately() { foreach (KeyValuePair changesByChunkCoord in NetLiquidModule._changesByChunkCoords) NetManager.Instance.Broadcast(NetLiquidModule.Serialize(changesByChunkCoord.Value.DirtiedPackedTileCoords), new NetManager.BroadcastCondition(changesByChunkCoord.Value.BroadcastingCondition)); } private static void PrepareChunks(HashSet dirtiedPackedTileCoords) { foreach (KeyValuePair changesByChunkCoord in NetLiquidModule._changesByChunkCoords) changesByChunkCoord.Value.DirtiedPackedTileCoords.Clear(); NetLiquidModule.DistributeChangesIntoChunks(dirtiedPackedTileCoords); } private static void BroadcastAllChanges(HashSet dirtiedPackedTileCoords) => NetManager.Instance.Broadcast(NetLiquidModule.Serialize(dirtiedPackedTileCoords)); private static void DistributeChangesIntoChunks(HashSet dirtiedPackedTileCoords) { foreach (int dirtiedPackedTileCoord in dirtiedPackedTileCoords) { int x = dirtiedPackedTileCoord >> 16 & (int) ushort.MaxValue; int y = dirtiedPackedTileCoord & (int) ushort.MaxValue; Point key; key.X = Netplay.GetSectionX(x); key.Y = Netplay.GetSectionY(y); NetLiquidModule.ChunkChanges chunkChanges; if (!NetLiquidModule._changesByChunkCoords.TryGetValue(key, out chunkChanges)) { chunkChanges = new NetLiquidModule.ChunkChanges(key.X, key.Y); NetLiquidModule._changesByChunkCoords[key] = chunkChanges; } chunkChanges.DirtiedPackedTileCoords.Add(dirtiedPackedTileCoord); } } private class ChunkChanges { public HashSet DirtiedPackedTileCoords; public int ChunkX; public int ChunkY; public ChunkChanges(int x, int y) { this.ChunkX = x; this.ChunkY = y; this.DirtiedPackedTileCoords = new HashSet(); } public bool BroadcastingCondition(int clientIndex) => Netplay.Clients[clientIndex].TileSections[this.ChunkX, this.ChunkY]; } } }