Extension method for reading/writing enums in netbuffers, (untested) classes for sending files

This commit is contained in:
Regalis11
2016-02-24 15:45:45 +02:00
parent c613e5fcf8
commit 6f51c6fb33
10 changed files with 270 additions and 128 deletions
Binary file not shown.
+3
View File
@@ -131,6 +131,9 @@
<Compile Include="Source\Map\SubmarineBody.cs" /> <Compile Include="Source\Map\SubmarineBody.cs" />
<Compile Include="Source\Map\TransitionCinematic.cs" /> <Compile Include="Source\Map\TransitionCinematic.cs" />
<Compile Include="Source\Networking\BanList.cs" /> <Compile Include="Source\Networking\BanList.cs" />
<Compile Include="Source\Networking\FileStreamReceiver.cs" />
<Compile Include="Source\Networking\FileStreamSender.cs" />
<Compile Include="Source\Networking\NetBufferExtensions.cs" />
<Compile Include="Source\Networking\NetConfig.cs" /> <Compile Include="Source\Networking\NetConfig.cs" />
<Compile Include="Source\Networking\NetStats.cs" /> <Compile Include="Source\Networking\NetStats.cs" />
<Compile Include="Source\Networking\ReliableSender.cs" /> <Compile Include="Source\Networking\ReliableSender.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;
}
}
}
}
@@ -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;
}
}
}
}
+28 -26
View File
@@ -19,13 +19,13 @@ namespace Barotrauma.Networking
private bool connected; private bool connected;
private int myID; private byte myID;
private List<Client> otherClients; private List<Client> otherClients;
private string serverIP; private string serverIP;
public int ID public byte ID
{ {
get { return myID; } get { return myID; }
} }
@@ -99,7 +99,7 @@ namespace Barotrauma.Networking
NetOutgoingMessage outmsg = client.CreateMessage(); NetOutgoingMessage outmsg = client.CreateMessage();
client.Start(); client.Start();
outmsg.Write((byte)PacketTypes.Login); outmsg.WriteEnum(PacketTypes.Login);
outmsg.Write(myID); outmsg.Write(myID);
outmsg.Write(password); outmsg.Write(password);
outmsg.Write(GameMain.Version.ToString()); outmsg.Write(GameMain.Version.ToString());
@@ -221,10 +221,10 @@ namespace Barotrauma.Networking
{ {
// All manually sent messages are type of "Data" // All manually sent messages are type of "Data"
case NetIncomingMessageType.Data: case NetIncomingMessageType.Data:
byte packetType = inc.ReadByte(); byte packetType = (byte)inc.ReadEnum<PacketTypes>();
if (packetType == (byte)PacketTypes.LoggedIn) if (packetType == (byte)PacketTypes.LoggedIn)
{ {
myID = inc.ReadInt32(); myID = inc.ReadByte();
gameStarted = inc.ReadBoolean(); gameStarted = inc.ReadBoolean();
bool hasCharacter = inc.ReadBoolean(); bool hasCharacter = inc.ReadBoolean();
bool allowSpectating = inc.ReadBoolean(); bool allowSpectating = inc.ReadBoolean();
@@ -250,7 +250,7 @@ namespace Barotrauma.Networking
int existingClients = inc.ReadInt32(); int existingClients = inc.ReadInt32();
for (int i = 1; i <= existingClients; i++) 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); GameMain.NetLobbyScreen.AddPlayer(otherClient.name);
otherClients.Add(otherClient); otherClients.Add(otherClient);
@@ -262,7 +262,7 @@ namespace Barotrauma.Networking
CanStart = true; CanStart = true;
NetOutgoingMessage lobbyUpdateRequest = client.CreateMessage(); NetOutgoingMessage lobbyUpdateRequest = client.CreateMessage();
lobbyUpdateRequest.Write((byte)PacketTypes.RequestNetLobbyUpdate); lobbyUpdateRequest.WriteEnum(PacketTypes.RequestNetLobbyUpdate);
client.SendMessage(lobbyUpdateRequest, NetDeliveryMethod.ReliableUnordered); client.SendMessage(lobbyUpdateRequest, NetDeliveryMethod.ReliableUnordered);
} }
else if (packetType == (byte)PacketTypes.KickedOut) else if (packetType == (byte)PacketTypes.KickedOut)
@@ -399,7 +399,7 @@ namespace Barotrauma.Networking
message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.Unreliable); message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.Unreliable);
if (message != null) client.SendMessage(message, NetDeliveryMethod.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); if (message != null) client.SendMessage(message, NetDeliveryMethod.ReliableUnordered);
//foreach (NetworkEvent networkEvent in NetworkEvent.Events) //foreach (NetworkEvent networkEvent in NetworkEvent.Events)
@@ -445,12 +445,12 @@ namespace Barotrauma.Networking
{ {
if (inc.MessageType != NetIncomingMessageType.Data) continue; if (inc.MessageType != NetIncomingMessageType.Data) continue;
byte packetType = inc.ReadByte(); byte packetType = (byte)inc.ReadEnum<PacketTypes>();
if (packetType == (byte)PacketTypes.ReliableMessage) if (packetType == (byte)PacketTypes.ReliableMessage)
{ {
if (!reliableChannel.CheckMessage(inc)) continue; if (!reliableChannel.CheckMessage(inc)) continue;
packetType = inc.ReadByte(); packetType = (byte)inc.ReadEnum<PacketTypes>();
} }
switch (packetType) switch (packetType)
@@ -467,7 +467,7 @@ namespace Barotrauma.Networking
break; break;
case (byte)PacketTypes.PlayerJoined: 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); GameMain.NetLobbyScreen.AddPlayer(otherClient.name);
otherClients.Add(otherClient); otherClients.Add(otherClient);
@@ -476,7 +476,7 @@ namespace Barotrauma.Networking
break; break;
case (byte)PacketTypes.PlayerLeft: case (byte)PacketTypes.PlayerLeft:
int leavingID = inc.ReadInt32(); byte leavingID = inc.ReadByte();
AddChatMessage(inc.ReadString(), ChatMessageType.Server); AddChatMessage(inc.ReadString(), ChatMessageType.Server);
Client disconnectedClient = otherClients.Find(c => c.ID == leavingID); Client disconnectedClient = otherClients.Find(c => c.ID == leavingID);
@@ -510,7 +510,8 @@ namespace Barotrauma.Networking
break; break;
case (byte)PacketTypes.Chatmessage: case (byte)PacketTypes.Chatmessage:
ChatMessageType messageType = (ChatMessageType)inc.ReadByte(); ChatMessageType messageType = inc.ReadEnum<ChatMessageType>();
AddChatMessage(inc.ReadString(), messageType); AddChatMessage(inc.ReadString(), messageType);
break; break;
case (byte)PacketTypes.NetworkEvent: case (byte)PacketTypes.NetworkEvent:
@@ -595,7 +596,7 @@ namespace Barotrauma.Networking
int count = inc.ReadByte(); int count = inc.ReadByte();
for (int n = 0; n < count; n++) for (int n = 0; n < count; n++)
{ {
int id = inc.ReadInt32(); byte id = inc.ReadByte();
Character newCharacter = ReadCharacterData(inc, id == myID); Character newCharacter = ReadCharacterData(inc, id == myID);
crew.Add(newCharacter); crew.Add(newCharacter);
@@ -696,7 +697,7 @@ namespace Barotrauma.Networking
public override void Disconnect() public override void Disconnect()
{ {
NetOutgoingMessage msg = client.CreateMessage(); NetOutgoingMessage msg = client.CreateMessage();
msg.Write((byte)PacketTypes.PlayerLeft); msg.WriteEnum(PacketTypes.PlayerLeft);
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
client.Shutdown(""); client.Shutdown("");
@@ -706,8 +707,8 @@ namespace Barotrauma.Networking
public void Vote(VoteType voteType, object userData) public void Vote(VoteType voteType, object userData)
{ {
NetOutgoingMessage msg = client.CreateMessage(); NetOutgoingMessage msg = client.CreateMessage();
msg.Write((byte)PacketTypes.Vote); msg.WriteEnum(PacketTypes.Vote);
msg.Write((byte)voteType); msg.WriteEnum(voteType);
switch (voteType) switch (voteType)
{ {
@@ -728,7 +729,7 @@ namespace Barotrauma.Networking
public bool SpectateClicked(GUIButton button, object userData) public bool SpectateClicked(GUIButton button, object userData)
{ {
NetOutgoingMessage msg = client.CreateMessage(); NetOutgoingMessage msg = client.CreateMessage();
msg.Write((byte)PacketTypes.SpectateRequest); msg.WriteEnum(PacketTypes.SpectateRequest);
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
@@ -759,7 +760,8 @@ namespace Barotrauma.Networking
if (characterInfo == null) return; if (characterInfo == null) return;
NetOutgoingMessage msg = client.CreateMessage(); NetOutgoingMessage msg = client.CreateMessage();
msg.Write((byte)PacketTypes.CharacterInfo); msg.WriteEnum(PacketTypes.CharacterInfo);
msg.Write(characterInfo.Name); msg.Write(characterInfo.Name);
msg.Write(characterInfo.Gender == Gender.Male); msg.Write(characterInfo.Gender == Gender.Male);
msg.Write((byte)characterInfo.HeadSpriteId); msg.Write((byte)characterInfo.HeadSpriteId);
@@ -835,8 +837,8 @@ namespace Barotrauma.Networking
(myCharacter == null || myCharacter.IsDead)) ? ChatMessageType.Dead : ChatMessageType.Default; (myCharacter == null || myCharacter.IsDead)) ? ChatMessageType.Dead : ChatMessageType.Default;
ReliableMessage msg = reliableChannel.CreateMessage(); ReliableMessage msg = reliableChannel.CreateMessage();
msg.InnerMessage.Write((byte)PacketTypes.Chatmessage); msg.InnerMessage.WriteEnum(PacketTypes.Chatmessage);
msg.InnerMessage.Write((byte)type); msg.InnerMessage.WriteEnum(type);
msg.InnerMessage.Write(message); msg.InnerMessage.Write(message);
reliableChannel.SendMessage(msg, client.ServerConnection); reliableChannel.SendMessage(msg, client.ServerConnection);
@@ -852,18 +854,18 @@ namespace Barotrauma.Networking
switch (Rand.Int(5)) switch (Rand.Int(5))
{ {
case 0: case 0:
msg.Write((byte)PacketTypes.NetworkEvent); msg.WriteEnum(PacketTypes.NetworkEvent);
msg.Write((byte)NetworkEventType.EntityUpdate); msg.WriteEnum(NetworkEventType.EntityUpdate);
msg.Write(Rand.Int(MapEntity.mapEntityList.Count)); msg.Write(Rand.Int(MapEntity.mapEntityList.Count));
break; break;
case 1: case 1:
msg.Write((byte)PacketTypes.NetworkEvent); msg.WriteEnum(PacketTypes.NetworkEvent);
msg.Write((byte)Enum.GetNames(typeof(NetworkEventType)).Length); msg.Write((byte)Enum.GetNames(typeof(NetworkEventType)).Length);
msg.Write(Rand.Int(MapEntity.mapEntityList.Count)); msg.Write(Rand.Int(MapEntity.mapEntityList.Count));
break; break;
case 2: case 2:
msg.Write((byte)PacketTypes.NetworkEvent); msg.WriteEnum(PacketTypes.NetworkEvent);
msg.Write((byte)NetworkEventType.ComponentUpdate); msg.WriteEnum(NetworkEventType.ComponentUpdate);
msg.Write((int)Item.ItemList[Rand.Int(Item.ItemList.Count)].ID); msg.Write((int)Item.ItemList[Rand.Int(Item.ItemList.Count)].ID);
msg.Write(Rand.Int(8)); msg.Write(Rand.Int(8));
break; break;
+31 -85
View File
@@ -420,7 +420,7 @@ namespace Barotrauma.Networking
// Notify the client that they have logged in // Notify the client that they have logged in
var outmsg = server.CreateMessage(); var outmsg = server.CreateMessage();
outmsg.Write((byte)PacketTypes.LoggedIn); outmsg.WriteEnum(PacketTypes.LoggedIn);
outmsg.Write(sender.ID); outmsg.Write(sender.ID);
outmsg.Write(gameStarted); outmsg.Write(gameStarted);
outmsg.Write(gameStarted && sender.Character!=null); outmsg.Write(gameStarted && sender.Character!=null);
@@ -445,8 +445,7 @@ namespace Barotrauma.Networking
//notify other clients about the new client //notify other clients about the new client
outmsg = server.CreateMessage(); outmsg = server.CreateMessage();
outmsg.Write((byte)PacketTypes.PlayerJoined); outmsg.WriteEnum(PacketTypes.PlayerJoined);
outmsg.Write(sender.name); outmsg.Write(sender.name);
outmsg.Write(sender.ID); outmsg.Write(sender.ID);
@@ -475,20 +474,12 @@ namespace Barotrauma.Networking
Client dataSender = ConnectedClients.Find(c => c.Connection == inc.SenderConnection); Client dataSender = ConnectedClients.Find(c => c.Connection == inc.SenderConnection);
if (dataSender == null) return; if (dataSender == null) return;
byte packetType = 0; byte packetType = (byte)inc.ReadEnum<PacketTypes>();
try
{
packetType = inc.ReadByte();
}
catch
{
return;
}
if (packetType == (byte)PacketTypes.ReliableMessage) if (packetType == (byte)PacketTypes.ReliableMessage)
{ {
if (!dataSender.ReliableChannel.CheckMessage(inc)) return; if (!dataSender.ReliableChannel.CheckMessage(inc)) return;
packetType = inc.ReadByte(); packetType = (byte)inc.ReadEnum<PacketTypes>();
} }
switch (packetType) switch (packetType)
@@ -499,10 +490,9 @@ namespace Barotrauma.Networking
break; break;
case (byte)PacketTypes.Chatmessage: case (byte)PacketTypes.Chatmessage:
ChatMessageType messageType = (ChatMessageType)inc.ReadByte(); ChatMessageType messageType = inc.ReadEnum<ChatMessageType>();
string message = inc.ReadString();
SendChatMessage(message, messageType); SendChatMessage(inc.ReadString(), messageType);
break; break;
case (byte)PacketTypes.PlayerLeft: case (byte)PacketTypes.PlayerLeft:
@@ -551,7 +541,7 @@ namespace Barotrauma.Networking
private void HandleConnectionApproval(NetIncomingMessage inc) private void HandleConnectionApproval(NetIncomingMessage inc)
{ {
if (inc.ReadByte() != (byte)PacketTypes.Login) return; if (inc.ReadEnum<PacketTypes>() != PacketTypes.Login) return;
DebugConsole.NewMessage("New player has joined the server", Color.White); DebugConsole.NewMessage("New player has joined the server", Color.White);
@@ -568,11 +558,11 @@ namespace Barotrauma.Networking
return; return;
} }
int userID; byte userID;
string userPassword = "", version = "", packageName = "", packageHash = "", name = ""; string userPassword = "", version = "", packageName = "", packageHash = "", name = "";
try try
{ {
userID = inc.ReadInt32(); userID = inc.ReadByte();
userPassword = inc.ReadString(); userPassword = inc.ReadString();
version = inc.ReadString(); version = inc.ReadString();
packageName = 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) while (ConnectedClients.Find(c => c.ID == userID) != null)
{ {
userID++; userID++;
@@ -700,7 +690,7 @@ namespace Barotrauma.Networking
c.ReliableChannel.SendMessage(reliableMessage, c.Connection); c.ReliableChannel.SendMessage(reliableMessage, c.Connection);
} }
message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableLindgren, c.Connection); message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableLidgren, c.Connection);
if (message!=null) if (message!=null)
{ {
server.SendMessage(message, c.Connection, NetDeliveryMethod.ReliableUnordered); server.SendMessage(message, c.Connection, NetDeliveryMethod.ReliableUnordered);
@@ -896,7 +886,7 @@ namespace Barotrauma.Networking
private NetOutgoingMessage CreateStartMessage(int seed, Submarine selectedSub, GameModePreset selectedMode) private NetOutgoingMessage CreateStartMessage(int seed, Submarine selectedSub, GameModePreset selectedMode)
{ {
NetOutgoingMessage msg = server.CreateMessage(); NetOutgoingMessage msg = server.CreateMessage();
msg.Write((byte)PacketTypes.StartGame); msg.WriteEnum(PacketTypes.StartGame);
msg.Write(seed); msg.Write(seed);
@@ -920,7 +910,7 @@ namespace Barotrauma.Networking
if (myCharacter != null) if (myCharacter != null)
{ {
msg.Write(-1); msg.Write(0);
WriteCharacterData(msg, myCharacter.Info.Name, myCharacter); WriteCharacterData(msg, myCharacter.Info.Name, myCharacter);
} }
@@ -949,8 +939,6 @@ namespace Barotrauma.Networking
public IEnumerable<object> EndGame(string endMessage) public IEnumerable<object> EndGame(string endMessage)
{ {
//var messageBox = new GUIMessageBox("The round has ended", endMessage, 400, 300);
Character.Controlled = null; Character.Controlled = null;
myCharacter = null; myCharacter = null;
GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; GameMain.GameScreen.Cam.TargetPos = Vector2.Zero;
@@ -961,7 +949,7 @@ namespace Barotrauma.Networking
if (ConnectedClients.Count > 0) if (ConnectedClients.Count > 0)
{ {
NetOutgoingMessage msg = server.CreateMessage(); NetOutgoingMessage msg = server.CreateMessage();
msg.Write((byte)PacketTypes.EndGame); msg.WriteEnum(PacketTypes.EndGame);
msg.Write(endMessage); msg.Write(endMessage);
if (server.ConnectionsCount > 0) if (server.ConnectionsCount > 0)
@@ -987,23 +975,11 @@ namespace Barotrauma.Networking
{ {
secondsLeft -= CoroutineManager.DeltaTime; 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; yield return CoroutineStatus.Running;
} while (secondsLeft > 0.0f); } while (secondsLeft > 0.0f);
Submarine.Unload(); Submarine.Unload();
//messageBox.Close(null, null);
GameMain.NetLobbyScreen.Select(); GameMain.NetLobbyScreen.Select();
yield return CoroutineStatus.Success; yield return CoroutineStatus.Success;
@@ -1031,14 +1007,14 @@ namespace Barotrauma.Networking
Log(msg, messageColor[(int)ChatMessageType.Server]); Log(msg, messageColor[(int)ChatMessageType.Server]);
NetOutgoingMessage outmsg = server.CreateMessage(); NetOutgoingMessage outmsg = server.CreateMessage();
outmsg.Write((byte)PacketTypes.KickedOut); outmsg.WriteEnum(PacketTypes.KickedOut);
outmsg.Write(targetmsg); outmsg.Write(targetmsg);
server.SendMessage(outmsg, client.Connection, NetDeliveryMethod.ReliableUnordered, 0); server.SendMessage(outmsg, client.Connection, NetDeliveryMethod.ReliableUnordered, 0);
ConnectedClients.Remove(client); ConnectedClients.Remove(client);
outmsg = server.CreateMessage(); outmsg = server.CreateMessage();
outmsg.Write((byte)PacketTypes.PlayerLeft); outmsg.WriteEnum(PacketTypes.PlayerLeft);
outmsg.Write(client.ID); outmsg.Write(client.ID);
outmsg.Write(msg); outmsg.Write(msg);
@@ -1110,7 +1086,7 @@ namespace Barotrauma.Networking
} }
NetOutgoingMessage msg = server.CreateMessage(); NetOutgoingMessage msg = server.CreateMessage();
msg.Write((byte)PacketTypes.Traitor); msg.WriteEnum(PacketTypes.Traitor);
msg.Write(target.Info.Name); msg.Write(target.Info.Name);
if (server.Connections.Count > 0) if (server.Connections.Count > 0)
{ {
@@ -1199,7 +1175,7 @@ namespace Barotrauma.Networking
try try
{ {
NetOutgoingMessage msg = server.CreateMessage(); NetOutgoingMessage msg = server.CreateMessage();
msg.Write((byte)PacketTypes.VoteStatus); msg.WriteEnum(PacketTypes.VoteStatus);
Voting.WriteData(msg, ConnectedClients); Voting.WriteData(msg, ConnectedClients);
server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0); server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0);
@@ -1223,7 +1199,7 @@ namespace Barotrauma.Networking
if (server.Connections.Count == 0) return true; if (server.Connections.Count == 0) return true;
NetOutgoingMessage msg = server.CreateMessage(); NetOutgoingMessage msg = server.CreateMessage();
msg.Write((byte)PacketTypes.UpdateNetLobby); msg.WriteEnum(PacketTypes.UpdateNetLobby);
GameMain.NetLobbyScreen.WriteData(msg); GameMain.NetLobbyScreen.WriteData(msg);
server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0); 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) public override void SendChatMessage(string message, ChatMessageType type = ChatMessageType.Server)
{ {
List<Client> recipients = new List<Client>(); List<Client> recipients = new List<Client>();
Client targetClient = null; 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) if (targetClient != null)
{ {
recipients.Add(targetClient); recipients.Add(targetClient);
@@ -1329,8 +1275,8 @@ namespace Barotrauma.Networking
foreach (Client c in recipients) foreach (Client c in recipients)
{ {
ReliableMessage msg = c.ReliableChannel.CreateMessage(); ReliableMessage msg = c.ReliableChannel.CreateMessage();
msg.InnerMessage.Write((byte)PacketTypes.Chatmessage); msg.InnerMessage.WriteEnum(PacketTypes.Chatmessage);
msg.InnerMessage.Write((byte)type); msg.InnerMessage.WriteEnum(type);
msg.InnerMessage.Write(message); msg.InnerMessage.Write(message);
c.ReliableChannel.SendMessage(msg, c.Connection); c.ReliableChannel.SendMessage(msg, c.Connection);
@@ -1346,8 +1292,8 @@ namespace Barotrauma.Networking
try try
{ {
name = message.ReadString(); name = message.ReadString();
gender = message.ReadBoolean() ? Gender.Male : Gender.Female; gender = message.ReadBoolean() ? Gender.Male : Gender.Female;
headSpriteId = message.ReadByte(); headSpriteId = message.ReadByte();
} }
catch catch
@@ -1397,7 +1343,7 @@ namespace Barotrauma.Networking
if (items == null || !items.Any()) return; if (items == null || !items.Any()) return;
NetOutgoingMessage message = server.CreateMessage(); NetOutgoingMessage message = server.CreateMessage();
message.Write((byte)PacketTypes.NewItem); message.WriteEnum(PacketTypes.NewItem);
Item.Spawner.FillNetworkData(message, items, inventories); Item.Spawner.FillNetworkData(message, items, inventories);
@@ -1520,13 +1466,13 @@ namespace Barotrauma.Networking
switch (Rand.Int(5)) switch (Rand.Int(5))
{ {
case 0: case 0:
msg.Write((byte)PacketTypes.NetworkEvent); msg.WriteEnum(PacketTypes.NetworkEvent);
msg.Write((byte)Enum.GetNames(typeof(NetworkEventType)).Length); msg.Write(Rand.Int(Enum.GetNames(typeof(NetworkEventType)).Length));
msg.Write(Rand.Int(MapEntity.mapEntityList.Count)); msg.Write(Rand.Int(MapEntity.mapEntityList.Count));
break; break;
case 1: case 1:
msg.Write((byte)PacketTypes.NetworkEvent); msg.WriteEnum(PacketTypes.NetworkEvent);
msg.Write((byte)NetworkEventType.ComponentUpdate); msg.WriteEnum(NetworkEventType.ComponentUpdate);
msg.Write((int)Item.ItemList[Rand.Int(Item.ItemList.Count)].ID); msg.Write((int)Item.ItemList[Rand.Int(Item.ItemList.Count)].ID);
msg.Write(Rand.Int(8)); msg.Write(Rand.Int(8));
break; break;
@@ -1564,7 +1510,7 @@ namespace Barotrauma.Networking
class Client class Client
{ {
public string name; public string name;
public int ID; public byte ID;
public Character Character; public Character Character;
public CharacterInfo characterInfo; public CharacterInfo characterInfo;
@@ -1583,13 +1529,13 @@ namespace Barotrauma.Networking
public float deleteDisconnectedTimer; public float deleteDisconnectedTimer;
public Client(NetPeer server, string name, int ID) public Client(NetPeer server, string name, byte ID)
: this(name, ID) : this(name, ID)
{ {
ReliableChannel = new ReliableChannel(server); ReliableChannel = new ReliableChannel(server);
} }
public Client(string name, int ID) public Client(string name, byte ID)
{ {
this.name = name; this.name = name;
this.ID = ID; this.ID = ID;
@@ -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<TEnum>(this NetBuffer buffer)
{
return (TEnum)(object)buffer.ReadRangedInteger(0, Enum.GetValues(typeof(TEnum)).Length - 1);
}
}
}
+5 -5
View File
@@ -8,7 +8,7 @@ namespace Barotrauma.Networking
{ {
Unreliable = 0, Unreliable = 0,
ReliableChannel = 1, ReliableChannel = 1,
ReliableLindgren = 2 ReliableLidgren = 2
} }
enum NetworkEventType enum NetworkEventType
@@ -43,14 +43,14 @@ namespace Barotrauma.Networking
deliveryMethod = new NetworkEventDeliveryMethod[Enum.GetNames(typeof(NetworkEventType)).Length]; deliveryMethod = new NetworkEventDeliveryMethod[Enum.GetNames(typeof(NetworkEventType)).Length];
deliveryMethod[(int)NetworkEventType.ImportantEntityUpdate] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.ImportantEntityUpdate] = NetworkEventDeliveryMethod.ReliableChannel;
deliveryMethod[(int)NetworkEventType.ImportantComponentUpdate] = 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.SelectCharacter] = NetworkEventDeliveryMethod.ReliableChannel;
deliveryMethod[(int)NetworkEventType.ImportantComponentUpdate] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.ImportantComponentUpdate] = NetworkEventDeliveryMethod.ReliableChannel;
deliveryMethod[(int)NetworkEventType.PickItem] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.PickItem] = NetworkEventDeliveryMethod.ReliableChannel;
deliveryMethod[(int)NetworkEventType.DropItem] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.DropItem] = NetworkEventDeliveryMethod.ReliableChannel;
deliveryMethod[(int)NetworkEventType.InventoryUpdate] = 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.UpdateProperty] = NetworkEventDeliveryMethod.ReliableChannel;
deliveryMethod[(int)NetworkEventType.WallDamage] = NetworkEventDeliveryMethod.ReliableChannel; deliveryMethod[(int)NetworkEventType.WallDamage] = NetworkEventDeliveryMethod.ReliableChannel;
@@ -132,7 +132,7 @@ namespace Barotrauma.Networking
public bool FillData(NetBuffer message) public bool FillData(NetBuffer message)
{ {
message.WriteRangedInteger(0, Enum.GetValues(typeof(NetworkEventType)).Length-1, (int)eventType); message.WriteEnum(eventType);
Entity e = Entity.FindEntityByID(id); Entity e = Entity.FindEntityByID(id);
if (e == null) return false; if (e == null) return false;
@@ -189,7 +189,7 @@ namespace Barotrauma.Networking
try try
{ {
eventType = (NetworkEventType)message.ReadRangedInteger(0, Enum.GetValues(typeof(NetworkEventType)).Length-1); eventType = message.ReadEnum<NetworkEventType>();
id = message.ReadUInt16(); id = message.ReadUInt16();
} }
catch (Exception exception) catch (Exception exception)
@@ -7,7 +7,7 @@ using Lidgren.Network;
namespace Barotrauma.Networking namespace Barotrauma.Networking
{ {
enum PacketTypes enum PacketTypes : int
{ {
Unknown, Unknown,
@@ -36,6 +36,11 @@ namespace Barotrauma.Networking
SpectateRequest SpectateRequest
} }
enum ChatMessageType
{
Default, Admin, Dead, Server
}
enum VoteType enum VoteType
{ {
Unknown, Unknown,
@@ -158,7 +163,7 @@ namespace Barotrauma.Networking
if (msgBytes.Count == 0) return null; if (msgBytes.Count == 0) return null;
NetOutgoingMessage message = netPeer.CreateMessage(); NetOutgoingMessage message = netPeer.CreateMessage();
message.Write((byte)PacketTypes.NetworkEvent); message.WriteEnum(PacketTypes.NetworkEvent);
message.Write((float)NetTime.Now); message.Write((float)NetTime.Now);
@@ -311,8 +316,4 @@ namespace Barotrauma.Networking
} }
enum ChatMessageType
{
Default, Admin, Dead, Server
}
} }
@@ -94,7 +94,8 @@ namespace Barotrauma.Networking.ReliableMessages
var reliableMessage = new ReliableMessage(message, messageID); var reliableMessage = new ReliableMessage(message, messageID);
message.Write((byte)PacketTypes.ReliableMessage); message.WriteEnum(PacketTypes.ReliableMessage);
message.Write(messageID); message.Write(messageID);
if (messageBuffer.Count > NetConfig.ReliableMessageBufferSize) if (messageBuffer.Count > NetConfig.ReliableMessageBufferSize)
@@ -183,7 +184,8 @@ namespace Barotrauma.Networking.ReliableMessages
//Debug.WriteLine("Sending ack message: "+messageCount); //Debug.WriteLine("Sending ack message: "+messageCount);
NetOutgoingMessage message = sender.CreateMessage(); NetOutgoingMessage message = sender.CreateMessage();
message.Write((byte)PacketTypes.LatestMessageID); message.WriteEnum(PacketTypes.LatestMessageID);
message.Write(messageCount); message.Write(messageCount);
sender.SendMessage(message, recipient, NetDeliveryMethod.Unreliable); sender.SendMessage(message, recipient, NetDeliveryMethod.Unreliable);
@@ -242,7 +244,8 @@ namespace Barotrauma.Networking.ReliableMessages
Debug.WriteLine("rerequest "+missingMessage.ID+" (try #"+missingMessage.ResendRequestsSent+")"); Debug.WriteLine("rerequest "+missingMessage.ID+" (try #"+missingMessage.ResendRequestsSent+")");
NetOutgoingMessage resendRequest = receiver.CreateMessage(); NetOutgoingMessage resendRequest = receiver.CreateMessage();
resendRequest.Write((byte)PacketTypes.ResendRequest); resendRequest.WriteEnum(PacketTypes.ResendRequest);
resendRequest.Write(missingMessage.ID); resendRequest.Write(missingMessage.ID);
receiver.SendMessage(resendRequest, recipient, receiver.SendMessage(resendRequest, recipient,