Extension method for reading/writing enums in netbuffers, (untested) classes for sending files
This commit is contained in:
Binary file not shown.
@@ -131,6 +131,9 @@
|
||||
<Compile Include="Source\Map\SubmarineBody.cs" />
|
||||
<Compile Include="Source\Map\TransitionCinematic.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\NetStats.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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,13 +19,13 @@ namespace Barotrauma.Networking
|
||||
|
||||
private bool connected;
|
||||
|
||||
private int myID;
|
||||
private byte myID;
|
||||
|
||||
private List<Client> 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<PacketTypes>();
|
||||
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<PacketTypes>();
|
||||
|
||||
if (packetType == (byte)PacketTypes.ReliableMessage)
|
||||
{
|
||||
if (!reliableChannel.CheckMessage(inc)) continue;
|
||||
packetType = inc.ReadByte();
|
||||
packetType = (byte)inc.ReadEnum<PacketTypes>();
|
||||
}
|
||||
|
||||
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<ChatMessageType>();
|
||||
|
||||
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;
|
||||
|
||||
@@ -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<PacketTypes>();
|
||||
|
||||
if (packetType == (byte)PacketTypes.ReliableMessage)
|
||||
{
|
||||
if (!dataSender.ReliableChannel.CheckMessage(inc)) return;
|
||||
packetType = inc.ReadByte();
|
||||
packetType = (byte)inc.ReadEnum<PacketTypes>();
|
||||
}
|
||||
|
||||
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<ChatMessageType>();
|
||||
|
||||
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>() != 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<object> 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<Client> recipients = new List<Client>();
|
||||
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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<NetworkEventType>();
|
||||
id = message.ReadUInt16();
|
||||
}
|
||||
catch (Exception exception)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user