From 6f51c6fb3360b354a024220f03c7b222d5082043 Mon Sep 17 00:00:00 2001 From: Regalis11 Date: Wed, 24 Feb 2016 15:45:45 +0200 Subject: [PATCH] Extension method for reading/writing enums in netbuffers, (untested) classes for sending files --- .vs/Subsurface_Solution/v14/.suo | Bin 783360 -> 783360 bytes Subsurface/Barotrauma.csproj | 3 + .../Source/Networking/FileStreamReceiver.cs | 70 ++++++++++ .../Source/Networking/FileStreamSender.cs | 99 +++++++++++++++ Subsurface/Source/Networking/GameClient.cs | 56 ++++---- Subsurface/Source/Networking/GameServer.cs | 120 +++++------------- .../Source/Networking/NetBufferExtensions.cs | 18 +++ Subsurface/Source/Networking/NetworkEvent.cs | 10 +- Subsurface/Source/Networking/NetworkMember.cs | 13 +- .../Source/Networking/ReliableSender.cs | 9 +- 10 files changed, 270 insertions(+), 128 deletions(-) create mode 100644 Subsurface/Source/Networking/FileStreamReceiver.cs create mode 100644 Subsurface/Source/Networking/FileStreamSender.cs create mode 100644 Subsurface/Source/Networking/NetBufferExtensions.cs diff --git a/.vs/Subsurface_Solution/v14/.suo b/.vs/Subsurface_Solution/v14/.suo index 667c418dc6b217e2d45c5aea5b86dd1f4c034c5b..ed6b500123b5ba500aa295eeb895aaa634c6dab4 100644 GIT binary patch delta 11897 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 delta 11008 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 COa>hQ 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,