diff --git a/.vs/Subsurface_Solution/v14/.suo b/.vs/Subsurface_Solution/v14/.suo index 667c418dc..ed6b50012 100644 Binary files a/.vs/Subsurface_Solution/v14/.suo and b/.vs/Subsurface_Solution/v14/.suo differ diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 3b5a9a494..f8a142aa3 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -131,6 +131,9 @@ + + + diff --git a/Subsurface/Source/Networking/FileStreamReceiver.cs b/Subsurface/Source/Networking/FileStreamReceiver.cs new file mode 100644 index 000000000..45cfbe9e1 --- /dev/null +++ b/Subsurface/Source/Networking/FileStreamReceiver.cs @@ -0,0 +1,70 @@ +using Lidgren.Network; +using System; +using System.IO; + +namespace Barotrauma.Networking +{ + class FileStreamReceiver + { + private NetClient s_client; + private ulong s_length; + private ulong s_received; + private FileStream s_writeStream; + private int s_timeStarted; + + public FileTransferStatus Status + { + get; + private set; + } + + public float BytesPerSecond + { + get; + private set; + } + + public FileStreamReceiver(NetClient client) + { + s_client = client; + + Status = FileTransferStatus.NotStarted; + } + + public void ReadMessage(NetIncomingMessage inc) + { + int chunkLen = inc.LengthBytes; + if (s_length == 0) + { + s_length = inc.ReadUInt64(); + string filename = inc.ReadString(); + s_writeStream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); + s_timeStarted = Environment.TickCount; + + Status = FileTransferStatus.NotStarted; + + return; + } + + byte[] all = inc.ReadBytes(inc.LengthBytes); + s_received += (ulong)all.Length; + s_writeStream.Write(all, 0, all.Length); + + int passed = Environment.TickCount - s_timeStarted; + float psec = passed / 1000.0f; + + BytesPerSecond = s_received / psec; + + Status = FileTransferStatus.Receiving; + + if (s_received >= s_length) + { + s_writeStream.Flush(); + s_writeStream.Close(); + s_writeStream.Dispose(); + + Status = FileTransferStatus.Finished; + } + } + } +} diff --git a/Subsurface/Source/Networking/FileStreamSender.cs b/Subsurface/Source/Networking/FileStreamSender.cs new file mode 100644 index 000000000..7eaf60a97 --- /dev/null +++ b/Subsurface/Source/Networking/FileStreamSender.cs @@ -0,0 +1,99 @@ +using Lidgren.Network; +using System.IO; + +namespace Barotrauma.Networking +{ + enum FileTransferStatus + { + NotStarted, Sending, Receiving, Finished, Error + } + + class FileStreamSender + { + private FileStream inputStream; + private int sentOffset; + private int chunkLen; + private byte[] tempBuffer; + private NetConnection connection; + + public FileTransferStatus Status + { + get; + private set; + } + + public string FileName + { + get; + private set; + } + + + public static FileStreamSender Create(NetConnection conn, string fileName) + { + if (!File.Exists(fileName)) + { + DebugConsole.ThrowError("Sending a file failed. File ''"+fileName+"'' not found."); + return null; + } + + return new FileStreamSender(conn, fileName); + } + + private FileStreamSender(NetConnection conn, string fileName) + { + connection = conn; + inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + chunkLen = connection.Peer.Configuration.MaximumTransmissionUnit - 20; + tempBuffer = new byte[chunkLen]; + sentOffset = 0; + + FileName = fileName; + + Status = FileTransferStatus.NotStarted; + } + + public void Update() + { + if (inputStream == null) return; + + if (!connection.CanSendImmediately(NetDeliveryMethod.ReliableOrdered, 1)) return; + + // send another part of the file! + long remaining = inputStream.Length - sentOffset; + int sendBytes = (remaining > chunkLen ? chunkLen : (int)remaining); + + // just assume we can read the whole thing in one Read() + inputStream.Read(tempBuffer, 0, sendBytes); + + NetOutgoingMessage message; + if (sentOffset == 0) + { + // first message; send length, chunk length and file name + message = connection.Peer.CreateMessage(sendBytes + 8); + message.Write((ulong)inputStream.Length); + message.Write(Path.GetFileName(inputStream.Name)); + connection.SendMessage(message, NetDeliveryMethod.ReliableOrdered, 1); + + Status = FileTransferStatus.Sending; + } + + message = connection.Peer.CreateMessage(sendBytes + 8); + message.Write(tempBuffer, 0, sendBytes); + + connection.SendMessage(message, NetDeliveryMethod.ReliableOrdered, 1); + sentOffset += sendBytes; + + //Program.Output("Sent " + m_sentOffset + "/" + m_inputStream.Length + " bytes to " + m_connection); + + if (remaining - sendBytes <= 0) + { + inputStream.Close(); + inputStream.Dispose(); + inputStream = null; + + Status = FileTransferStatus.Finished; + } + } + } +} diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 37da2044d..63ad27adb 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -19,13 +19,13 @@ namespace Barotrauma.Networking private bool connected; - private int myID; + private byte myID; private List otherClients; private string serverIP; - public int ID + public byte ID { get { return myID; } } @@ -99,7 +99,7 @@ namespace Barotrauma.Networking NetOutgoingMessage outmsg = client.CreateMessage(); client.Start(); - outmsg.Write((byte)PacketTypes.Login); + outmsg.WriteEnum(PacketTypes.Login); outmsg.Write(myID); outmsg.Write(password); outmsg.Write(GameMain.Version.ToString()); @@ -221,10 +221,10 @@ namespace Barotrauma.Networking { // All manually sent messages are type of "Data" case NetIncomingMessageType.Data: - byte packetType = inc.ReadByte(); + byte packetType = (byte)inc.ReadEnum(); if (packetType == (byte)PacketTypes.LoggedIn) { - myID = inc.ReadInt32(); + myID = inc.ReadByte(); gameStarted = inc.ReadBoolean(); bool hasCharacter = inc.ReadBoolean(); bool allowSpectating = inc.ReadBoolean(); @@ -250,7 +250,7 @@ namespace Barotrauma.Networking int existingClients = inc.ReadInt32(); for (int i = 1; i <= existingClients; i++) { - Client otherClient = new Client(inc.ReadString(), inc.ReadInt32()); + Client otherClient = new Client(inc.ReadString(), inc.ReadByte()); GameMain.NetLobbyScreen.AddPlayer(otherClient.name); otherClients.Add(otherClient); @@ -262,7 +262,7 @@ namespace Barotrauma.Networking CanStart = true; NetOutgoingMessage lobbyUpdateRequest = client.CreateMessage(); - lobbyUpdateRequest.Write((byte)PacketTypes.RequestNetLobbyUpdate); + lobbyUpdateRequest.WriteEnum(PacketTypes.RequestNetLobbyUpdate); client.SendMessage(lobbyUpdateRequest, NetDeliveryMethod.ReliableUnordered); } else if (packetType == (byte)PacketTypes.KickedOut) @@ -399,7 +399,7 @@ namespace Barotrauma.Networking message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.Unreliable); if (message != null) client.SendMessage(message, NetDeliveryMethod.Unreliable); - message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableLindgren); + message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableLidgren); if (message != null) client.SendMessage(message, NetDeliveryMethod.ReliableUnordered); //foreach (NetworkEvent networkEvent in NetworkEvent.Events) @@ -445,12 +445,12 @@ namespace Barotrauma.Networking { if (inc.MessageType != NetIncomingMessageType.Data) continue; - byte packetType = inc.ReadByte(); + byte packetType = (byte)inc.ReadEnum(); if (packetType == (byte)PacketTypes.ReliableMessage) { if (!reliableChannel.CheckMessage(inc)) continue; - packetType = inc.ReadByte(); + packetType = (byte)inc.ReadEnum(); } switch (packetType) @@ -467,7 +467,7 @@ namespace Barotrauma.Networking break; case (byte)PacketTypes.PlayerJoined: - Client otherClient = new Client(inc.ReadString(), inc.ReadInt32()); + Client otherClient = new Client(inc.ReadString(), inc.ReadByte()); GameMain.NetLobbyScreen.AddPlayer(otherClient.name); otherClients.Add(otherClient); @@ -476,7 +476,7 @@ namespace Barotrauma.Networking break; case (byte)PacketTypes.PlayerLeft: - int leavingID = inc.ReadInt32(); + byte leavingID = inc.ReadByte(); AddChatMessage(inc.ReadString(), ChatMessageType.Server); Client disconnectedClient = otherClients.Find(c => c.ID == leavingID); @@ -510,7 +510,8 @@ namespace Barotrauma.Networking break; case (byte)PacketTypes.Chatmessage: - ChatMessageType messageType = (ChatMessageType)inc.ReadByte(); + ChatMessageType messageType = inc.ReadEnum(); + AddChatMessage(inc.ReadString(), messageType); break; case (byte)PacketTypes.NetworkEvent: @@ -595,7 +596,7 @@ namespace Barotrauma.Networking int count = inc.ReadByte(); for (int n = 0; n < count; n++) { - int id = inc.ReadInt32(); + byte id = inc.ReadByte(); Character newCharacter = ReadCharacterData(inc, id == myID); crew.Add(newCharacter); @@ -696,7 +697,7 @@ namespace Barotrauma.Networking public override void Disconnect() { NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.PlayerLeft); + msg.WriteEnum(PacketTypes.PlayerLeft); client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); client.Shutdown(""); @@ -706,8 +707,8 @@ namespace Barotrauma.Networking public void Vote(VoteType voteType, object userData) { NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.Vote); - msg.Write((byte)voteType); + msg.WriteEnum(PacketTypes.Vote); + msg.WriteEnum(voteType); switch (voteType) { @@ -728,8 +729,8 @@ namespace Barotrauma.Networking public bool SpectateClicked(GUIButton button, object userData) { NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.SpectateRequest); - + msg.WriteEnum(PacketTypes.SpectateRequest); + client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); if (button != null) button.Enabled = false; @@ -759,7 +760,8 @@ namespace Barotrauma.Networking if (characterInfo == null) return; NetOutgoingMessage msg = client.CreateMessage(); - msg.Write((byte)PacketTypes.CharacterInfo); + msg.WriteEnum(PacketTypes.CharacterInfo); + msg.Write(characterInfo.Name); msg.Write(characterInfo.Gender == Gender.Male); msg.Write((byte)characterInfo.HeadSpriteId); @@ -835,8 +837,8 @@ namespace Barotrauma.Networking (myCharacter == null || myCharacter.IsDead)) ? ChatMessageType.Dead : ChatMessageType.Default; ReliableMessage msg = reliableChannel.CreateMessage(); - msg.InnerMessage.Write((byte)PacketTypes.Chatmessage); - msg.InnerMessage.Write((byte)type); + msg.InnerMessage.WriteEnum(PacketTypes.Chatmessage); + msg.InnerMessage.WriteEnum(type); msg.InnerMessage.Write(message); reliableChannel.SendMessage(msg, client.ServerConnection); @@ -852,18 +854,18 @@ namespace Barotrauma.Networking switch (Rand.Int(5)) { case 0: - msg.Write((byte)PacketTypes.NetworkEvent); - msg.Write((byte)NetworkEventType.EntityUpdate); + msg.WriteEnum(PacketTypes.NetworkEvent); + msg.WriteEnum(NetworkEventType.EntityUpdate); msg.Write(Rand.Int(MapEntity.mapEntityList.Count)); break; case 1: - msg.Write((byte)PacketTypes.NetworkEvent); + msg.WriteEnum(PacketTypes.NetworkEvent); msg.Write((byte)Enum.GetNames(typeof(NetworkEventType)).Length); msg.Write(Rand.Int(MapEntity.mapEntityList.Count)); break; case 2: - msg.Write((byte)PacketTypes.NetworkEvent); - msg.Write((byte)NetworkEventType.ComponentUpdate); + msg.WriteEnum(PacketTypes.NetworkEvent); + msg.WriteEnum(NetworkEventType.ComponentUpdate); msg.Write((int)Item.ItemList[Rand.Int(Item.ItemList.Count)].ID); msg.Write(Rand.Int(8)); break; diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index cab9f5e7f..97d47323f 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -420,7 +420,7 @@ namespace Barotrauma.Networking // Notify the client that they have logged in var outmsg = server.CreateMessage(); - outmsg.Write((byte)PacketTypes.LoggedIn); + outmsg.WriteEnum(PacketTypes.LoggedIn); outmsg.Write(sender.ID); outmsg.Write(gameStarted); outmsg.Write(gameStarted && sender.Character!=null); @@ -445,8 +445,7 @@ namespace Barotrauma.Networking //notify other clients about the new client outmsg = server.CreateMessage(); - outmsg.Write((byte)PacketTypes.PlayerJoined); - + outmsg.WriteEnum(PacketTypes.PlayerJoined); outmsg.Write(sender.name); outmsg.Write(sender.ID); @@ -475,20 +474,12 @@ namespace Barotrauma.Networking Client dataSender = ConnectedClients.Find(c => c.Connection == inc.SenderConnection); if (dataSender == null) return; - byte packetType = 0; - try - { - packetType = inc.ReadByte(); - } - catch - { - return; - } + byte packetType = (byte)inc.ReadEnum(); if (packetType == (byte)PacketTypes.ReliableMessage) { if (!dataSender.ReliableChannel.CheckMessage(inc)) return; - packetType = inc.ReadByte(); + packetType = (byte)inc.ReadEnum(); } switch (packetType) @@ -499,10 +490,9 @@ namespace Barotrauma.Networking break; case (byte)PacketTypes.Chatmessage: - ChatMessageType messageType = (ChatMessageType)inc.ReadByte(); - string message = inc.ReadString(); - - SendChatMessage(message, messageType); + ChatMessageType messageType = inc.ReadEnum(); + + SendChatMessage(inc.ReadString(), messageType); break; case (byte)PacketTypes.PlayerLeft: @@ -551,7 +541,7 @@ namespace Barotrauma.Networking private void HandleConnectionApproval(NetIncomingMessage inc) { - if (inc.ReadByte() != (byte)PacketTypes.Login) return; + if (inc.ReadEnum() != PacketTypes.Login) return; DebugConsole.NewMessage("New player has joined the server", Color.White); @@ -568,11 +558,11 @@ namespace Barotrauma.Networking return; } - int userID; + byte userID; string userPassword = "", version = "", packageName = "", packageHash = "", name = ""; try { - userID = inc.ReadInt32(); + userID = inc.ReadByte(); userPassword = inc.ReadString(); version = inc.ReadString(); packageName = inc.ReadString(); @@ -644,7 +634,7 @@ namespace Barotrauma.Networking } } - userID = Rand.Range(1, 1000000); + userID = (byte)Rand.Range(1, 255); while (ConnectedClients.Find(c => c.ID == userID) != null) { userID++; @@ -700,7 +690,7 @@ namespace Barotrauma.Networking c.ReliableChannel.SendMessage(reliableMessage, c.Connection); } - message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableLindgren, c.Connection); + message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableLidgren, c.Connection); if (message!=null) { server.SendMessage(message, c.Connection, NetDeliveryMethod.ReliableUnordered); @@ -896,7 +886,7 @@ namespace Barotrauma.Networking private NetOutgoingMessage CreateStartMessage(int seed, Submarine selectedSub, GameModePreset selectedMode) { NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.StartGame); + msg.WriteEnum(PacketTypes.StartGame); msg.Write(seed); @@ -920,7 +910,7 @@ namespace Barotrauma.Networking if (myCharacter != null) { - msg.Write(-1); + msg.Write(0); WriteCharacterData(msg, myCharacter.Info.Name, myCharacter); } @@ -949,8 +939,6 @@ namespace Barotrauma.Networking public IEnumerable EndGame(string endMessage) { - //var messageBox = new GUIMessageBox("The round has ended", endMessage, 400, 300); - Character.Controlled = null; myCharacter = null; GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; @@ -961,7 +949,7 @@ namespace Barotrauma.Networking if (ConnectedClients.Count > 0) { NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.EndGame); + msg.WriteEnum(PacketTypes.EndGame); msg.Write(endMessage); if (server.ConnectionsCount > 0) @@ -987,23 +975,11 @@ namespace Barotrauma.Networking { secondsLeft -= CoroutineManager.DeltaTime; - //float camAngle = (float)((DateTime.Now - endTime).TotalSeconds / endPreviewLength) * MathHelper.TwoPi; - //Vector2 offset = (new Vector2( - // (float)Math.Cos(camAngle) * (Submarine.Borders.Width / 2.0f), - // (float)Math.Sin(camAngle) * (Submarine.Borders.Height / 2.0f))); - - //GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.Position + offset * 0.8f; - //Game1.GameScreen.Cam.MoveCamera((float)deltaTime); - - //messageBox.Text = endMessage + "\nReturning to lobby in " + (int)secondsLeft + " s"; - yield return CoroutineStatus.Running; } while (secondsLeft > 0.0f); Submarine.Unload(); - - //messageBox.Close(null, null); - + GameMain.NetLobbyScreen.Select(); yield return CoroutineStatus.Success; @@ -1031,14 +1007,14 @@ namespace Barotrauma.Networking Log(msg, messageColor[(int)ChatMessageType.Server]); NetOutgoingMessage outmsg = server.CreateMessage(); - outmsg.Write((byte)PacketTypes.KickedOut); + outmsg.WriteEnum(PacketTypes.KickedOut); outmsg.Write(targetmsg); server.SendMessage(outmsg, client.Connection, NetDeliveryMethod.ReliableUnordered, 0); ConnectedClients.Remove(client); outmsg = server.CreateMessage(); - outmsg.Write((byte)PacketTypes.PlayerLeft); + outmsg.WriteEnum(PacketTypes.PlayerLeft); outmsg.Write(client.ID); outmsg.Write(msg); @@ -1110,7 +1086,7 @@ namespace Barotrauma.Networking } NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.Traitor); + msg.WriteEnum(PacketTypes.Traitor); msg.Write(target.Info.Name); if (server.Connections.Count > 0) { @@ -1199,7 +1175,7 @@ namespace Barotrauma.Networking try { NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.VoteStatus); + msg.WriteEnum(PacketTypes.VoteStatus); Voting.WriteData(msg, ConnectedClients); server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0); @@ -1223,7 +1199,7 @@ namespace Barotrauma.Networking if (server.Connections.Count == 0) return true; NetOutgoingMessage msg = server.CreateMessage(); - msg.Write((byte)PacketTypes.UpdateNetLobby); + msg.WriteEnum(PacketTypes.UpdateNetLobby); GameMain.NetLobbyScreen.WriteData(msg); server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0); @@ -1255,8 +1231,6 @@ namespace Barotrauma.Networking public override void SendChatMessage(string message, ChatMessageType type = ChatMessageType.Server) { - - List recipients = new List(); Client targetClient = null; @@ -1282,34 +1256,6 @@ namespace Barotrauma.Networking } } - //remove the ''name: '' part - //string[] words = message.Split(':'); - //string[] newMessage = ((string[])words.Skip(1)); - - - - //if (words.Length > 2 && words[1].FirstOrDefault()=='/' && type==ChatMessageType.Server) - //{ - // if (words[1] == "/dead" || words[1] == "/d") - // { - // type = ChatMessageType.Dead; - // } - // else - // { - // targetClient = ConnectedClients.Find(c => - // words[1] == "/" + c.name.ToLower() || - // c.Character != null && words[1] == "/" + c.Character.Name.ToLower()); - - // if (targetClient==null) - // { - // AddChatMessage("Player ''"+words[1].Replace("/", "")+"'' not found!", ChatMessageType.Admin); - // return; - // } - // } - - // message = words[0] + " " + string.Join(" ", words, 2, words.Length - 2); - //} - if (targetClient != null) { recipients.Add(targetClient); @@ -1329,8 +1275,8 @@ namespace Barotrauma.Networking foreach (Client c in recipients) { ReliableMessage msg = c.ReliableChannel.CreateMessage(); - msg.InnerMessage.Write((byte)PacketTypes.Chatmessage); - msg.InnerMessage.Write((byte)type); + msg.InnerMessage.WriteEnum(PacketTypes.Chatmessage); + msg.InnerMessage.WriteEnum(type); msg.InnerMessage.Write(message); c.ReliableChannel.SendMessage(msg, c.Connection); @@ -1346,8 +1292,8 @@ namespace Barotrauma.Networking try { - name = message.ReadString(); - gender = message.ReadBoolean() ? Gender.Male : Gender.Female; + name = message.ReadString(); + gender = message.ReadBoolean() ? Gender.Male : Gender.Female; headSpriteId = message.ReadByte(); } catch @@ -1397,7 +1343,7 @@ namespace Barotrauma.Networking if (items == null || !items.Any()) return; NetOutgoingMessage message = server.CreateMessage(); - message.Write((byte)PacketTypes.NewItem); + message.WriteEnum(PacketTypes.NewItem); Item.Spawner.FillNetworkData(message, items, inventories); @@ -1520,13 +1466,13 @@ namespace Barotrauma.Networking switch (Rand.Int(5)) { case 0: - msg.Write((byte)PacketTypes.NetworkEvent); - msg.Write((byte)Enum.GetNames(typeof(NetworkEventType)).Length); + msg.WriteEnum(PacketTypes.NetworkEvent); + msg.Write(Rand.Int(Enum.GetNames(typeof(NetworkEventType)).Length)); msg.Write(Rand.Int(MapEntity.mapEntityList.Count)); break; case 1: - msg.Write((byte)PacketTypes.NetworkEvent); - msg.Write((byte)NetworkEventType.ComponentUpdate); + msg.WriteEnum(PacketTypes.NetworkEvent); + msg.WriteEnum(NetworkEventType.ComponentUpdate); msg.Write((int)Item.ItemList[Rand.Int(Item.ItemList.Count)].ID); msg.Write(Rand.Int(8)); break; @@ -1564,7 +1510,7 @@ namespace Barotrauma.Networking class Client { public string name; - public int ID; + public byte ID; public Character Character; public CharacterInfo characterInfo; @@ -1583,13 +1529,13 @@ namespace Barotrauma.Networking public float deleteDisconnectedTimer; - public Client(NetPeer server, string name, int ID) + public Client(NetPeer server, string name, byte ID) : this(name, ID) { ReliableChannel = new ReliableChannel(server); } - public Client(string name, int ID) + public Client(string name, byte ID) { this.name = name; this.ID = ID; diff --git a/Subsurface/Source/Networking/NetBufferExtensions.cs b/Subsurface/Source/Networking/NetBufferExtensions.cs new file mode 100644 index 000000000..0bec997fb --- /dev/null +++ b/Subsurface/Source/Networking/NetBufferExtensions.cs @@ -0,0 +1,18 @@ +using Lidgren.Network; +using System; + +namespace Barotrauma.Networking +{ + static class NetBufferExtensions + { + public static void WriteEnum(this NetBuffer buffer, Enum value) + { + buffer.WriteRangedInteger(0, Enum.GetValues(value.GetType()).Length - 1, Convert.ToInt32(value)); + } + + public static TEnum ReadEnum(this NetBuffer buffer) + { + return (TEnum)(object)buffer.ReadRangedInteger(0, Enum.GetValues(typeof(TEnum)).Length - 1); + } + } +} diff --git a/Subsurface/Source/Networking/NetworkEvent.cs b/Subsurface/Source/Networking/NetworkEvent.cs index 35f468f1b..9f98d3c68 100644 --- a/Subsurface/Source/Networking/NetworkEvent.cs +++ b/Subsurface/Source/Networking/NetworkEvent.cs @@ -8,7 +8,7 @@ namespace Barotrauma.Networking { Unreliable = 0, ReliableChannel = 1, - ReliableLindgren = 2 + ReliableLidgren = 2 } enum NetworkEventType @@ -43,14 +43,14 @@ namespace Barotrauma.Networking deliveryMethod = new NetworkEventDeliveryMethod[Enum.GetNames(typeof(NetworkEventType)).Length]; deliveryMethod[(int)NetworkEventType.ImportantEntityUpdate] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.ImportantComponentUpdate] = NetworkEventDeliveryMethod.ReliableChannel; - deliveryMethod[(int)NetworkEventType.KillCharacter] = NetworkEventDeliveryMethod.ReliableLindgren; + deliveryMethod[(int)NetworkEventType.KillCharacter] = NetworkEventDeliveryMethod.ReliableLidgren; deliveryMethod[(int)NetworkEventType.SelectCharacter] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.ImportantComponentUpdate] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.PickItem] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.DropItem] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.InventoryUpdate] = NetworkEventDeliveryMethod.ReliableChannel; - deliveryMethod[(int)NetworkEventType.ItemFixed] = NetworkEventDeliveryMethod.ReliableLindgren; + deliveryMethod[(int)NetworkEventType.ItemFixed] = NetworkEventDeliveryMethod.ReliableLidgren; deliveryMethod[(int)NetworkEventType.UpdateProperty] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.WallDamage] = NetworkEventDeliveryMethod.ReliableChannel; @@ -132,7 +132,7 @@ namespace Barotrauma.Networking public bool FillData(NetBuffer message) { - message.WriteRangedInteger(0, Enum.GetValues(typeof(NetworkEventType)).Length-1, (int)eventType); + message.WriteEnum(eventType); Entity e = Entity.FindEntityByID(id); if (e == null) return false; @@ -189,7 +189,7 @@ namespace Barotrauma.Networking try { - eventType = (NetworkEventType)message.ReadRangedInteger(0, Enum.GetValues(typeof(NetworkEventType)).Length-1); + eventType = message.ReadEnum(); id = message.ReadUInt16(); } catch (Exception exception) diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index 4e7d727f4..72c83b042 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -7,7 +7,7 @@ using Lidgren.Network; namespace Barotrauma.Networking { - enum PacketTypes + enum PacketTypes : int { Unknown, @@ -36,6 +36,11 @@ namespace Barotrauma.Networking SpectateRequest } + enum ChatMessageType + { + Default, Admin, Dead, Server + } + enum VoteType { Unknown, @@ -158,7 +163,7 @@ namespace Barotrauma.Networking if (msgBytes.Count == 0) return null; NetOutgoingMessage message = netPeer.CreateMessage(); - message.Write((byte)PacketTypes.NetworkEvent); + message.WriteEnum(PacketTypes.NetworkEvent); message.Write((float)NetTime.Now); @@ -311,8 +316,4 @@ namespace Barotrauma.Networking } - enum ChatMessageType - { - Default, Admin, Dead, Server - } } diff --git a/Subsurface/Source/Networking/ReliableSender.cs b/Subsurface/Source/Networking/ReliableSender.cs index 3bd660632..b90244522 100644 --- a/Subsurface/Source/Networking/ReliableSender.cs +++ b/Subsurface/Source/Networking/ReliableSender.cs @@ -94,7 +94,8 @@ namespace Barotrauma.Networking.ReliableMessages var reliableMessage = new ReliableMessage(message, messageID); - message.Write((byte)PacketTypes.ReliableMessage); + message.WriteEnum(PacketTypes.ReliableMessage); + message.Write(messageID); if (messageBuffer.Count > NetConfig.ReliableMessageBufferSize) @@ -183,7 +184,8 @@ namespace Barotrauma.Networking.ReliableMessages //Debug.WriteLine("Sending ack message: "+messageCount); NetOutgoingMessage message = sender.CreateMessage(); - message.Write((byte)PacketTypes.LatestMessageID); + message.WriteEnum(PacketTypes.LatestMessageID); + message.Write(messageCount); sender.SendMessage(message, recipient, NetDeliveryMethod.Unreliable); @@ -242,7 +244,8 @@ namespace Barotrauma.Networking.ReliableMessages Debug.WriteLine("rerequest "+missingMessage.ID+" (try #"+missingMessage.ResendRequestsSent+")"); NetOutgoingMessage resendRequest = receiver.CreateMessage(); - resendRequest.Write((byte)PacketTypes.ResendRequest); + resendRequest.WriteEnum(PacketTypes.ResendRequest); + resendRequest.Write(missingMessage.ID); receiver.SendMessage(resendRequest, recipient,