Camera twitching fixes, fixed crashing when loading a sub with no hull, fixed server lobby player count only working for 0-15 players, progress on downloading subs from the server
This commit is contained in:
@@ -4,13 +4,36 @@ using System.IO;
|
||||
|
||||
namespace Barotrauma.Networking
|
||||
{
|
||||
class FileStreamReceiver
|
||||
class FileStreamReceiver : IDisposable
|
||||
{
|
||||
private NetClient s_client;
|
||||
private ulong s_length;
|
||||
private ulong s_received;
|
||||
private FileStream s_writeStream;
|
||||
private int s_timeStarted;
|
||||
public delegate void OnFinished(FileStreamReceiver fileStreamReceiver);
|
||||
private OnFinished onFinished;
|
||||
|
||||
private NetClient client;
|
||||
private ulong length;
|
||||
private ulong received;
|
||||
private FileStream writeStream;
|
||||
private int timeStarted;
|
||||
|
||||
private string filePath;
|
||||
|
||||
private FileTransferType fileType;
|
||||
|
||||
public string FileName
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public ulong FileSize
|
||||
{
|
||||
get { return length; }
|
||||
}
|
||||
|
||||
public ulong Received
|
||||
{
|
||||
get { return received; }
|
||||
}
|
||||
|
||||
public FileTransferStatus Status
|
||||
{
|
||||
@@ -24,47 +47,97 @@ namespace Barotrauma.Networking
|
||||
private set;
|
||||
}
|
||||
|
||||
public FileStreamReceiver(NetClient client)
|
||||
public float Progress
|
||||
{
|
||||
s_client = client;
|
||||
get { return length / (float)received; }
|
||||
|
||||
}
|
||||
|
||||
public FileStreamReceiver(NetClient client, string filePath, FileTransferType fileType, OnFinished onFinished)
|
||||
{
|
||||
client = client;
|
||||
|
||||
this.filePath = filePath;
|
||||
this.fileType = fileType;
|
||||
|
||||
this.onFinished = onFinished;
|
||||
|
||||
Status = FileTransferStatus.NotStarted;
|
||||
}
|
||||
|
||||
public void ReadMessage(NetIncomingMessage inc)
|
||||
{
|
||||
int chunkLen = inc.LengthBytes;
|
||||
if (s_length == 0)
|
||||
try
|
||||
{
|
||||
s_length = inc.ReadUInt64();
|
||||
string filename = inc.ReadString();
|
||||
s_writeStream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
|
||||
s_timeStarted = Environment.TickCount;
|
||||
TryReadMessage(inc);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
DebugConsole.ThrowError("Error while receiving file ''"+FileName+"''", e);
|
||||
Status = FileTransferStatus.Error;
|
||||
}
|
||||
}
|
||||
|
||||
private void TryReadMessage(NetIncomingMessage inc)
|
||||
{
|
||||
//int chunkLen = inc.LengthBytes;
|
||||
if (length == 0)
|
||||
{
|
||||
|
||||
if (!Directory.Exists(filePath))
|
||||
{
|
||||
Directory.CreateDirectory(filePath);
|
||||
}
|
||||
|
||||
byte fileTypeByte = inc.ReadByte();
|
||||
if (fileTypeByte != (byte)fileType)
|
||||
{
|
||||
Status = FileTransferStatus.Error;
|
||||
return;
|
||||
}
|
||||
|
||||
length = inc.ReadUInt64();
|
||||
FileName = inc.ReadString();
|
||||
writeStream = new FileStream(Path.Combine(filePath, FileName), FileMode.Create, FileAccess.Write, FileShare.None);
|
||||
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);
|
||||
byte[] all = inc.ReadBytes(inc.LengthBytes - inc.PositionInBytes);
|
||||
received += (ulong)all.Length;
|
||||
writeStream.Write(all, 0, all.Length);
|
||||
|
||||
int passed = Environment.TickCount - s_timeStarted;
|
||||
int passed = Environment.TickCount - timeStarted;
|
||||
float psec = passed / 1000.0f;
|
||||
|
||||
BytesPerSecond = s_received / psec;
|
||||
BytesPerSecond = received / psec;
|
||||
|
||||
Status = FileTransferStatus.Receiving;
|
||||
|
||||
if (s_received >= s_length)
|
||||
if (received >= length)
|
||||
{
|
||||
s_writeStream.Flush();
|
||||
s_writeStream.Close();
|
||||
s_writeStream.Dispose();
|
||||
|
||||
Status = FileTransferStatus.Finished;
|
||||
Status = FileTransferStatus.Finished;
|
||||
if (onFinished!=null) onFinished(this);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
writeStream.Flush();
|
||||
writeStream.Close();
|
||||
writeStream.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Lidgren.Network;
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Barotrauma.Networking
|
||||
@@ -8,7 +9,12 @@ namespace Barotrauma.Networking
|
||||
NotStarted, Sending, Receiving, Finished, Error
|
||||
}
|
||||
|
||||
class FileStreamSender
|
||||
enum FileTransferType
|
||||
{
|
||||
Unknown, Submarine
|
||||
}
|
||||
|
||||
class FileStreamSender : IDisposable
|
||||
{
|
||||
private FileStream inputStream;
|
||||
private int sentOffset;
|
||||
@@ -16,6 +22,9 @@ namespace Barotrauma.Networking
|
||||
private byte[] tempBuffer;
|
||||
private NetConnection connection;
|
||||
|
||||
|
||||
private FileTransferType fileType;
|
||||
|
||||
public FileTransferStatus Status
|
||||
{
|
||||
get;
|
||||
@@ -28,8 +37,8 @@ namespace Barotrauma.Networking
|
||||
private set;
|
||||
}
|
||||
|
||||
|
||||
public static FileStreamSender Create(NetConnection conn, string fileName)
|
||||
|
||||
public static FileStreamSender Create(NetConnection conn, string fileName, FileTransferType fileType)
|
||||
{
|
||||
if (!File.Exists(fileName))
|
||||
{
|
||||
@@ -37,19 +46,21 @@ namespace Barotrauma.Networking
|
||||
return null;
|
||||
}
|
||||
|
||||
return new FileStreamSender(conn, fileName);
|
||||
return new FileStreamSender(conn, fileName, fileType);
|
||||
}
|
||||
|
||||
private FileStreamSender(NetConnection conn, string fileName)
|
||||
private FileStreamSender(NetConnection conn, string fileName, FileTransferType fileType)
|
||||
{
|
||||
connection = conn;
|
||||
inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
chunkLen = connection.Peer.Configuration.MaximumTransmissionUnit - 20;
|
||||
chunkLen = connection.Peer.Configuration.MaximumTransmissionUnit - 100;
|
||||
tempBuffer = new byte[chunkLen];
|
||||
sentOffset = 0;
|
||||
|
||||
FileName = fileName;
|
||||
|
||||
this.fileType = fileType;
|
||||
|
||||
Status = FileTransferStatus.NotStarted;
|
||||
}
|
||||
|
||||
@@ -70,7 +81,9 @@ namespace Barotrauma.Networking
|
||||
if (sentOffset == 0)
|
||||
{
|
||||
// first message; send length, chunk length and file name
|
||||
message = connection.Peer.CreateMessage(sendBytes + 8);
|
||||
message = connection.Peer.CreateMessage(sendBytes + 8 + 1);
|
||||
message.Write((byte)PacketTypes.FileStream);
|
||||
message.Write((byte)fileType);
|
||||
message.Write((ulong)inputStream.Length);
|
||||
message.Write(Path.GetFileName(inputStream.Name));
|
||||
connection.SendMessage(message, NetDeliveryMethod.ReliableOrdered, 1);
|
||||
@@ -78,7 +91,8 @@ namespace Barotrauma.Networking
|
||||
Status = FileTransferStatus.Sending;
|
||||
}
|
||||
|
||||
message = connection.Peer.CreateMessage(sendBytes + 8);
|
||||
message = connection.Peer.CreateMessage(sendBytes + 8 + 1);
|
||||
message.Write((byte)PacketTypes.FileStream);
|
||||
message.Write(tempBuffer, 0, sendBytes);
|
||||
|
||||
connection.SendMessage(message, NetDeliveryMethod.ReliableOrdered, 1);
|
||||
@@ -88,12 +102,25 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (remaining - sendBytes <= 0)
|
||||
{
|
||||
inputStream.Close();
|
||||
inputStream.Dispose();
|
||||
inputStream = null;
|
||||
//Dispose();
|
||||
|
||||
Status = FileTransferStatus.Finished;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
inputStream.Close();
|
||||
inputStream.Dispose();
|
||||
inputStream = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ using Microsoft.Xna.Framework;
|
||||
using System.Collections.Generic;
|
||||
using Barotrauma.Networking.ReliableMessages;
|
||||
using FarseerPhysics;
|
||||
using System.IO;
|
||||
|
||||
namespace Barotrauma.Networking
|
||||
{
|
||||
@@ -15,6 +16,8 @@ namespace Barotrauma.Networking
|
||||
|
||||
private ReliableChannel reliableChannel;
|
||||
|
||||
private FileStreamReceiver fileStreamReceiver;
|
||||
|
||||
private GUITickBox endRoundButton;
|
||||
|
||||
private bool connected;
|
||||
@@ -99,7 +102,7 @@ namespace Barotrauma.Networking
|
||||
NetOutgoingMessage outmsg = client.CreateMessage();
|
||||
client.Start();
|
||||
|
||||
outmsg.WriteEnum(PacketTypes.Login);
|
||||
outmsg.Write((byte)PacketTypes.Login);
|
||||
outmsg.Write(myID);
|
||||
outmsg.Write(password);
|
||||
outmsg.Write(GameMain.Version.ToString());
|
||||
@@ -221,7 +224,7 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
// All manually sent messages are type of "Data"
|
||||
case NetIncomingMessageType.Data:
|
||||
byte packetType = (byte)inc.ReadEnum<PacketTypes>();
|
||||
byte packetType = inc.ReadByte();
|
||||
if (packetType == (byte)PacketTypes.LoggedIn)
|
||||
{
|
||||
myID = inc.ReadByte();
|
||||
@@ -262,7 +265,7 @@ namespace Barotrauma.Networking
|
||||
CanStart = true;
|
||||
|
||||
NetOutgoingMessage lobbyUpdateRequest = client.CreateMessage();
|
||||
lobbyUpdateRequest.WriteEnum(PacketTypes.RequestNetLobbyUpdate);
|
||||
lobbyUpdateRequest.Write((byte)PacketTypes.RequestNetLobbyUpdate);
|
||||
client.SendMessage(lobbyUpdateRequest, NetDeliveryMethod.ReliableUnordered);
|
||||
}
|
||||
else if (packetType == (byte)PacketTypes.KickedOut)
|
||||
@@ -445,12 +448,12 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
if (inc.MessageType != NetIncomingMessageType.Data) continue;
|
||||
|
||||
byte packetType = (byte)inc.ReadEnum<PacketTypes>();
|
||||
byte packetType = inc.ReadByte();
|
||||
|
||||
if (packetType == (byte)PacketTypes.ReliableMessage)
|
||||
{
|
||||
if (!reliableChannel.CheckMessage(inc)) continue;
|
||||
packetType = (byte)inc.ReadEnum<PacketTypes>();
|
||||
packetType = inc.ReadByte();
|
||||
}
|
||||
|
||||
switch (packetType)
|
||||
@@ -474,6 +477,22 @@ namespace Barotrauma.Networking
|
||||
|
||||
AddChatMessage(otherClient.name + " has joined the server", ChatMessageType.Server);
|
||||
|
||||
break;
|
||||
case (byte)PacketTypes.RequestFile:
|
||||
new GUIMessageBox("Couldn't the file from the server", "Sharing files has been disabled by the server.");
|
||||
break;
|
||||
case (byte)PacketTypes.FileStream:
|
||||
if (fileStreamReceiver == null)
|
||||
{
|
||||
//todo: unexpected file
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
fileStreamReceiver.ReadMessage(inc);
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
case (byte)PacketTypes.PlayerLeft:
|
||||
byte leavingID = inc.ReadByte();
|
||||
@@ -510,7 +529,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
break;
|
||||
case (byte)PacketTypes.Chatmessage:
|
||||
ChatMessageType messageType = inc.ReadEnum<ChatMessageType>();
|
||||
ChatMessageType messageType = (ChatMessageType)inc.ReadByte();
|
||||
|
||||
AddChatMessage(inc.ReadString(), messageType);
|
||||
break;
|
||||
@@ -691,24 +710,59 @@ namespace Barotrauma.Networking
|
||||
|
||||
spriteBatch.DrawString(GUI.SmallFont, "Sent bytes: " + client.Statistics.SentBytes, new Vector2(x + 10, y + 75), Color.White);
|
||||
spriteBatch.DrawString(GUI.SmallFont, "Sent packets: " + client.Statistics.SentPackets, new Vector2(x + 10, y + 90), Color.White);
|
||||
|
||||
|
||||
if (fileStreamReceiver!=null)
|
||||
{
|
||||
GUI.DrawString(spriteBatch, new Vector2(GameMain.GraphicsWidth / 2 - 100, 20), "Downloading "+fileStreamReceiver.FileName, Color.White);
|
||||
GUI.DrawString(spriteBatch, new Vector2(GameMain.GraphicsWidth / 2 - 100, 20),
|
||||
MathUtils.GetBytesReadable((long)fileStreamReceiver.Received)+" / "+MathUtils.GetBytesReadable((long)fileStreamReceiver.FileSize), Color.White);
|
||||
GUI.DrawProgressBar(spriteBatch, new Vector2(GameMain.GraphicsWidth / 2 - 100, 20), new Vector2(200, 15), fileStreamReceiver.Progress, Color.Green);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnFileReceived(FileStreamReceiver receiver)
|
||||
{
|
||||
if (receiver.Status == FileTransferStatus.Error)
|
||||
{
|
||||
|
||||
}
|
||||
else if (receiver.Status == FileTransferStatus.Finished)
|
||||
{
|
||||
new GUIMessageBox("Download finished", "File ''"+receiver.FileName+"'' was downloaded succesfully.");
|
||||
}
|
||||
|
||||
receiver.Dispose();
|
||||
fileStreamReceiver = null;
|
||||
}
|
||||
|
||||
public override void Disconnect()
|
||||
{
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
msg.WriteEnum(PacketTypes.PlayerLeft);
|
||||
msg.Write((byte)PacketTypes.PlayerLeft);
|
||||
|
||||
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||
client.Shutdown("");
|
||||
GameMain.NetworkMember = null;
|
||||
}
|
||||
|
||||
public void RequestFile(string file, FileTransferType fileType)
|
||||
{
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
msg.Write((byte)PacketTypes.RequestFile);
|
||||
msg.Write((byte)fileType);
|
||||
|
||||
msg.Write(file);
|
||||
|
||||
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||
|
||||
fileStreamReceiver = new FileStreamReceiver(client, Path.Combine(Submarine.SavePath, "Downloaded"), fileType, OnFileReceived);
|
||||
}
|
||||
|
||||
public void Vote(VoteType voteType, object userData)
|
||||
{
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
msg.WriteEnum(PacketTypes.Vote);
|
||||
msg.WriteEnum(voteType);
|
||||
msg.Write((byte)PacketTypes.Vote);
|
||||
msg.Write((byte)voteType);
|
||||
|
||||
switch (voteType)
|
||||
{
|
||||
@@ -729,7 +783,7 @@ namespace Barotrauma.Networking
|
||||
public bool SpectateClicked(GUIButton button, object userData)
|
||||
{
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
msg.WriteEnum(PacketTypes.SpectateRequest);
|
||||
msg.Write((byte)PacketTypes.SpectateRequest);
|
||||
|
||||
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||
|
||||
@@ -760,7 +814,7 @@ namespace Barotrauma.Networking
|
||||
if (characterInfo == null) return;
|
||||
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
msg.WriteEnum(PacketTypes.CharacterInfo);
|
||||
msg.Write((byte)PacketTypes.CharacterInfo);
|
||||
|
||||
msg.Write(characterInfo.Name);
|
||||
msg.Write(characterInfo.Gender == Gender.Male);
|
||||
@@ -837,8 +891,8 @@ namespace Barotrauma.Networking
|
||||
(myCharacter == null || myCharacter.IsDead)) ? ChatMessageType.Dead : ChatMessageType.Default;
|
||||
|
||||
ReliableMessage msg = reliableChannel.CreateMessage();
|
||||
msg.InnerMessage.WriteEnum(PacketTypes.Chatmessage);
|
||||
msg.InnerMessage.WriteEnum(type);
|
||||
msg.InnerMessage.Write((byte)PacketTypes.Chatmessage);
|
||||
msg.InnerMessage.Write((byte)type);
|
||||
msg.InnerMessage.Write(message);
|
||||
|
||||
reliableChannel.SendMessage(msg, client.ServerConnection);
|
||||
@@ -848,41 +902,41 @@ namespace Barotrauma.Networking
|
||||
/// sends some random data to the server (can be a networkevent or just something completely random)
|
||||
/// use for debugging purposes
|
||||
/// </summary>
|
||||
public void SendRandomData()
|
||||
{
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
switch (Rand.Int(5))
|
||||
{
|
||||
case 0:
|
||||
msg.WriteEnum(PacketTypes.NetworkEvent);
|
||||
msg.WriteEnum(NetworkEventType.EntityUpdate);
|
||||
msg.Write(Rand.Int(MapEntity.mapEntityList.Count));
|
||||
break;
|
||||
case 1:
|
||||
msg.WriteEnum(PacketTypes.NetworkEvent);
|
||||
msg.Write((byte)Enum.GetNames(typeof(NetworkEventType)).Length);
|
||||
msg.Write(Rand.Int(MapEntity.mapEntityList.Count));
|
||||
break;
|
||||
case 2:
|
||||
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;
|
||||
case 3:
|
||||
msg.Write((byte)Enum.GetNames(typeof(PacketTypes)).Length);
|
||||
break;
|
||||
}
|
||||
//public void SendRandomData()
|
||||
//{
|
||||
// NetOutgoingMessage msg = client.CreateMessage();
|
||||
// switch (Rand.Int(5))
|
||||
// {
|
||||
// case 0:
|
||||
// msg.WriteEnum(PacketTypes.NetworkEvent);
|
||||
// msg.WriteEnum(NetworkEventType.EntityUpdate);
|
||||
// msg.Write(Rand.Int(MapEntity.mapEntityList.Count));
|
||||
// break;
|
||||
// case 1:
|
||||
// msg.WriteEnum(PacketTypes.NetworkEvent);
|
||||
// msg.Write((byte)Enum.GetNames(typeof(NetworkEventType)).Length);
|
||||
// msg.Write(Rand.Int(MapEntity.mapEntityList.Count));
|
||||
// break;
|
||||
// case 2:
|
||||
// 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;
|
||||
// case 3:
|
||||
// msg.Write((byte)Enum.GetNames(typeof(PacketTypes)).Length);
|
||||
// break;
|
||||
// }
|
||||
|
||||
int bitCount = Rand.Int(100);
|
||||
for (int i = 0; i<bitCount; i++)
|
||||
{
|
||||
msg.Write(Rand.Int(2)==0);
|
||||
}
|
||||
// int bitCount = Rand.Int(100);
|
||||
// for (int i = 0; i<bitCount; i++)
|
||||
// {
|
||||
// msg.Write(Rand.Int(2)==0);
|
||||
// }
|
||||
|
||||
|
||||
client.SendMessage(msg, (Rand.Int(2)==0) ? NetDeliveryMethod.ReliableOrdered : NetDeliveryMethod.Unreliable);
|
||||
}
|
||||
// client.SendMessage(msg, (Rand.Int(2)==0) ? NetDeliveryMethod.ReliableOrdered : NetDeliveryMethod.Unreliable);
|
||||
//}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,11 +162,12 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
var client = new RestClient(NetConfig.MasterServerUrl);
|
||||
|
||||
var request = new RestRequest("masterserver.php", Method.GET);
|
||||
var request = new RestRequest("masterserver2.php", Method.GET);
|
||||
request.AddParameter("action", "addserver");
|
||||
request.AddParameter("servername", name);
|
||||
request.AddParameter("serverport", Port);
|
||||
request.AddParameter("playercount", PlayerCountToByte(ConnectedClients.Count, config.MaximumConnections));
|
||||
request.AddParameter("currplayers", ConnectedClients.Count);
|
||||
request.AddParameter("maxplayers", config.MaximumConnections);
|
||||
request.AddParameter("password", string.IsNullOrWhiteSpace(password) ? 0 : 1);
|
||||
|
||||
// execute the request
|
||||
@@ -192,10 +193,11 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
var client = new RestClient(NetConfig.MasterServerUrl);
|
||||
|
||||
var request = new RestRequest("masterserver.php", Method.GET);
|
||||
var request = new RestRequest("masterserver2.php", Method.GET);
|
||||
request.AddParameter("action", "refreshserver");
|
||||
request.AddParameter("gamestarted", gameStarted ? 1 : 0);
|
||||
request.AddParameter("playercount", PlayerCountToByte(ConnectedClients.Count, config.MaximumConnections));
|
||||
request.AddParameter("currplayers", ConnectedClients.Count);
|
||||
request.AddParameter("maxplayers", config.MaximumConnections);
|
||||
|
||||
Log("Refreshing connection with master server...", Color.Cyan);
|
||||
|
||||
@@ -310,6 +312,18 @@ namespace Barotrauma.Networking
|
||||
|
||||
foreach (Client c in ConnectedClients)
|
||||
{
|
||||
if (c.FileStreamSender!=null)
|
||||
{
|
||||
c.FileStreamSender.Update();
|
||||
|
||||
if (c.FileStreamSender.Status == FileTransferStatus.Finished ||
|
||||
c.FileStreamSender.Status == FileTransferStatus.Error)
|
||||
{
|
||||
c.FileStreamSender.Dispose();
|
||||
c.FileStreamSender = null;
|
||||
}
|
||||
}
|
||||
|
||||
c.ReliableChannel.Update(deltaTime);
|
||||
}
|
||||
|
||||
@@ -420,7 +434,7 @@ namespace Barotrauma.Networking
|
||||
// Notify the client that they have logged in
|
||||
var outmsg = server.CreateMessage();
|
||||
|
||||
outmsg.WriteEnum(PacketTypes.LoggedIn);
|
||||
outmsg.Write((byte)PacketTypes.LoggedIn);
|
||||
outmsg.Write(sender.ID);
|
||||
outmsg.Write(gameStarted);
|
||||
outmsg.Write(gameStarted && sender.Character!=null);
|
||||
@@ -445,7 +459,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
//notify other clients about the new client
|
||||
outmsg = server.CreateMessage();
|
||||
outmsg.WriteEnum(PacketTypes.PlayerJoined);
|
||||
outmsg.Write((byte)PacketTypes.PlayerJoined);
|
||||
outmsg.Write(sender.name);
|
||||
outmsg.Write(sender.ID);
|
||||
|
||||
@@ -474,12 +488,12 @@ namespace Barotrauma.Networking
|
||||
Client dataSender = ConnectedClients.Find(c => c.Connection == inc.SenderConnection);
|
||||
if (dataSender == null) return;
|
||||
|
||||
byte packetType = (byte)inc.ReadEnum<PacketTypes>();
|
||||
byte packetType = inc.ReadByte();
|
||||
|
||||
if (packetType == (byte)PacketTypes.ReliableMessage)
|
||||
{
|
||||
if (!dataSender.ReliableChannel.CheckMessage(inc)) return;
|
||||
packetType = (byte)inc.ReadEnum<PacketTypes>();
|
||||
packetType = inc.ReadByte();
|
||||
}
|
||||
|
||||
switch (packetType)
|
||||
@@ -490,7 +504,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
break;
|
||||
case (byte)PacketTypes.Chatmessage:
|
||||
ChatMessageType messageType = inc.ReadEnum<ChatMessageType>();
|
||||
ChatMessageType messageType = (ChatMessageType)inc.ReadByte();
|
||||
|
||||
SendChatMessage(inc.ReadString(), messageType);
|
||||
|
||||
@@ -500,6 +514,33 @@ namespace Barotrauma.Networking
|
||||
break;
|
||||
case (byte)PacketTypes.CharacterInfo:
|
||||
ReadCharacterData(inc);
|
||||
break;
|
||||
case (byte)PacketTypes.RequestFile:
|
||||
string fileName = inc.ReadString();
|
||||
byte fileType = inc.ReadByte();
|
||||
|
||||
switch (fileType)
|
||||
{
|
||||
case (byte)FileTransferType.Submarine:
|
||||
|
||||
var requestedSubmarine = Submarine.SavedSubmarines.Find(s => s.Name == fileName);
|
||||
|
||||
if (requestedSubmarine==null)
|
||||
{
|
||||
//todo: ei voi ladata
|
||||
}
|
||||
else
|
||||
{
|
||||
var fileStreamSender = FileStreamSender.Create(dataSender.Connection, requestedSubmarine.FilePath, FileTransferType.Submarine);
|
||||
if (fileStreamSender != null) dataSender.FileStreamSender = fileStreamSender;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
DebugConsole.ThrowError("Unknown file type was requested ("+fileType+")");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
case (byte)PacketTypes.ResendRequest:
|
||||
|
||||
@@ -541,7 +582,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
private void HandleConnectionApproval(NetIncomingMessage inc)
|
||||
{
|
||||
if (inc.ReadEnum<PacketTypes>() != PacketTypes.Login) return;
|
||||
if ((PacketTypes)inc.ReadByte() != PacketTypes.Login) return;
|
||||
|
||||
DebugConsole.NewMessage("New player has joined the server", Color.White);
|
||||
|
||||
@@ -649,6 +690,8 @@ namespace Barotrauma.Networking
|
||||
UpdateCrewFrame();
|
||||
|
||||
inc.SenderConnection.Approve();
|
||||
|
||||
refreshMasterTimer = DateTime.Now;
|
||||
}
|
||||
|
||||
|
||||
@@ -886,7 +929,7 @@ namespace Barotrauma.Networking
|
||||
private NetOutgoingMessage CreateStartMessage(int seed, Submarine selectedSub, GameModePreset selectedMode)
|
||||
{
|
||||
NetOutgoingMessage msg = server.CreateMessage();
|
||||
msg.WriteEnum(PacketTypes.StartGame);
|
||||
msg.Write((byte)PacketTypes.StartGame);
|
||||
|
||||
msg.Write(seed);
|
||||
|
||||
@@ -910,7 +953,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (myCharacter != null)
|
||||
{
|
||||
msg.Write(0);
|
||||
msg.Write((byte)0);
|
||||
WriteCharacterData(msg, myCharacter.Info.Name, myCharacter);
|
||||
}
|
||||
|
||||
@@ -949,7 +992,7 @@ namespace Barotrauma.Networking
|
||||
if (ConnectedClients.Count > 0)
|
||||
{
|
||||
NetOutgoingMessage msg = server.CreateMessage();
|
||||
msg.WriteEnum(PacketTypes.EndGame);
|
||||
msg.Write((byte)PacketTypes.EndGame);
|
||||
msg.Write(endMessage);
|
||||
|
||||
if (server.ConnectionsCount > 0)
|
||||
@@ -989,7 +1032,9 @@ namespace Barotrauma.Networking
|
||||
private void DisconnectClient(NetConnection senderConnection, string msg = "", string targetmsg = "")
|
||||
{
|
||||
Client client = ConnectedClients.Find(x => x.Connection == senderConnection);
|
||||
if (client != null) DisconnectClient(client, msg, targetmsg);
|
||||
if (client == null) return;
|
||||
|
||||
DisconnectClient(client, msg, targetmsg);
|
||||
}
|
||||
|
||||
private void DisconnectClient(Client client, string msg = "", string targetmsg = "")
|
||||
@@ -1007,14 +1052,14 @@ namespace Barotrauma.Networking
|
||||
Log(msg, messageColor[(int)ChatMessageType.Server]);
|
||||
|
||||
NetOutgoingMessage outmsg = server.CreateMessage();
|
||||
outmsg.WriteEnum(PacketTypes.KickedOut);
|
||||
outmsg.Write((byte)PacketTypes.KickedOut);
|
||||
outmsg.Write(targetmsg);
|
||||
server.SendMessage(outmsg, client.Connection, NetDeliveryMethod.ReliableUnordered, 0);
|
||||
|
||||
ConnectedClients.Remove(client);
|
||||
|
||||
outmsg = server.CreateMessage();
|
||||
outmsg.WriteEnum(PacketTypes.PlayerLeft);
|
||||
outmsg.Write((byte)PacketTypes.PlayerLeft);
|
||||
outmsg.Write(client.ID);
|
||||
outmsg.Write(msg);
|
||||
|
||||
@@ -1028,6 +1073,8 @@ namespace Barotrauma.Networking
|
||||
AddChatMessage(msg, ChatMessageType.Server);
|
||||
|
||||
UpdateCrewFrame();
|
||||
|
||||
refreshMasterTimer = DateTime.Now;
|
||||
}
|
||||
|
||||
private void UpdateCrewFrame()
|
||||
@@ -1086,7 +1133,7 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
|
||||
NetOutgoingMessage msg = server.CreateMessage();
|
||||
msg.WriteEnum(PacketTypes.Traitor);
|
||||
msg.Write((byte)PacketTypes.Traitor);
|
||||
msg.Write(target.Info.Name);
|
||||
if (server.Connections.Count > 0)
|
||||
{
|
||||
@@ -1175,7 +1222,7 @@ namespace Barotrauma.Networking
|
||||
try
|
||||
{
|
||||
NetOutgoingMessage msg = server.CreateMessage();
|
||||
msg.WriteEnum(PacketTypes.VoteStatus);
|
||||
msg.Write((byte)PacketTypes.VoteStatus);
|
||||
Voting.WriteData(msg, ConnectedClients);
|
||||
|
||||
server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0);
|
||||
@@ -1199,7 +1246,7 @@ namespace Barotrauma.Networking
|
||||
if (server.Connections.Count == 0) return true;
|
||||
|
||||
NetOutgoingMessage msg = server.CreateMessage();
|
||||
msg.WriteEnum(PacketTypes.UpdateNetLobby);
|
||||
msg.Write((byte)PacketTypes.UpdateNetLobby);
|
||||
GameMain.NetLobbyScreen.WriteData(msg);
|
||||
|
||||
server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0);
|
||||
@@ -1275,8 +1322,8 @@ namespace Barotrauma.Networking
|
||||
foreach (Client c in recipients)
|
||||
{
|
||||
ReliableMessage msg = c.ReliableChannel.CreateMessage();
|
||||
msg.InnerMessage.WriteEnum(PacketTypes.Chatmessage);
|
||||
msg.InnerMessage.WriteEnum(type);
|
||||
msg.InnerMessage.Write((byte)PacketTypes.Chatmessage);
|
||||
msg.InnerMessage.Write((byte)type);
|
||||
msg.InnerMessage.Write(message);
|
||||
|
||||
c.ReliableChannel.SendMessage(msg, c.Connection);
|
||||
@@ -1343,7 +1390,7 @@ namespace Barotrauma.Networking
|
||||
if (items == null || !items.Any()) return;
|
||||
|
||||
NetOutgoingMessage message = server.CreateMessage();
|
||||
message.WriteEnum(PacketTypes.NewItem);
|
||||
message.Write((byte)PacketTypes.NewItem);
|
||||
|
||||
Item.Spawner.FillNetworkData(message, items, inventories);
|
||||
|
||||
@@ -1460,38 +1507,38 @@ namespace Barotrauma.Networking
|
||||
/// sends some random data to the clients
|
||||
/// use for debugging purposes
|
||||
/// </summary>
|
||||
public void SendRandomData()
|
||||
{
|
||||
NetOutgoingMessage msg = server.CreateMessage();
|
||||
switch (Rand.Int(5))
|
||||
{
|
||||
case 0:
|
||||
msg.WriteEnum(PacketTypes.NetworkEvent);
|
||||
msg.Write(Rand.Int(Enum.GetNames(typeof(NetworkEventType)).Length));
|
||||
msg.Write(Rand.Int(MapEntity.mapEntityList.Count));
|
||||
break;
|
||||
case 1:
|
||||
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;
|
||||
case 2:
|
||||
msg.Write((byte)Enum.GetNames(typeof(PacketTypes)).Length);
|
||||
break;
|
||||
case 3:
|
||||
msg.Write((byte)PacketTypes.UpdateNetLobby);
|
||||
break;
|
||||
}
|
||||
//public void SendRandomData()
|
||||
//{
|
||||
// NetOutgoingMessage msg = server.CreateMessage();
|
||||
// switch (Rand.Int(5))
|
||||
// {
|
||||
// case 0:
|
||||
// msg.WriteEnum(PacketTypes.NetworkEvent);
|
||||
// msg.Write(Rand.Int(Enum.GetNames(typeof(NetworkEventType)).Length));
|
||||
// msg.Write(Rand.Int(MapEntity.mapEntityList.Count));
|
||||
// break;
|
||||
// case 1:
|
||||
// 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;
|
||||
// case 2:
|
||||
// msg.Write((byte)Enum.GetNames(typeof(PacketTypes)).Length);
|
||||
// break;
|
||||
// case 3:
|
||||
// msg.Write((byte)PacketTypes.UpdateNetLobby);
|
||||
// break;
|
||||
// }
|
||||
|
||||
int bitCount = Rand.Int(100);
|
||||
for (int i = 0; i < bitCount; i++)
|
||||
{
|
||||
msg.Write(Rand.Int(2) == 0);
|
||||
}
|
||||
SendMessage(msg, (Rand.Int(2) == 0) ? NetDeliveryMethod.ReliableOrdered : NetDeliveryMethod.Unreliable, null);
|
||||
// int bitCount = Rand.Int(100);
|
||||
// for (int i = 0; i < bitCount; i++)
|
||||
// {
|
||||
// msg.Write(Rand.Int(2) == 0);
|
||||
// }
|
||||
// SendMessage(msg, (Rand.Int(2) == 0) ? NetDeliveryMethod.ReliableOrdered : NetDeliveryMethod.Unreliable, null);
|
||||
|
||||
}
|
||||
//}
|
||||
|
||||
public override void Disconnect()
|
||||
{
|
||||
@@ -1523,6 +1570,8 @@ namespace Barotrauma.Networking
|
||||
public List<JobPrefab> jobPreferences;
|
||||
public JobPrefab assignedJob;
|
||||
|
||||
public FileStreamSender FileStreamSender;
|
||||
|
||||
public bool Spectating;
|
||||
|
||||
public ReliableChannel ReliableChannel;
|
||||
|
||||
@@ -5,14 +5,14 @@ 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 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);
|
||||
}
|
||||
//public static TEnum ReadEnum<TEnum>(this NetBuffer buffer)
|
||||
//{
|
||||
// return (TEnum)(object)buffer.ReadRangedInteger(0, Enum.GetValues(typeof(TEnum)).Length - 1);
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
public bool FillData(NetBuffer message)
|
||||
{
|
||||
message.WriteEnum(eventType);
|
||||
message.Write((byte)eventType);
|
||||
|
||||
Entity e = Entity.FindEntityByID(id);
|
||||
if (e == null) return false;
|
||||
@@ -189,7 +189,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
try
|
||||
{
|
||||
eventType = message.ReadEnum<NetworkEventType>();
|
||||
eventType = (NetworkEventType)message.ReadByte();
|
||||
id = message.ReadUInt16();
|
||||
}
|
||||
catch (Exception exception)
|
||||
|
||||
@@ -7,7 +7,7 @@ using Lidgren.Network;
|
||||
|
||||
namespace Barotrauma.Networking
|
||||
{
|
||||
enum PacketTypes : int
|
||||
enum PacketTypes : byte
|
||||
{
|
||||
Unknown,
|
||||
|
||||
@@ -32,6 +32,8 @@ namespace Barotrauma.Networking
|
||||
Vote, VoteStatus,
|
||||
|
||||
ResendRequest, ReliableMessage, LatestMessageID,
|
||||
|
||||
RequestFile, FileStream,
|
||||
|
||||
SpectateRequest
|
||||
}
|
||||
@@ -163,7 +165,7 @@ namespace Barotrauma.Networking
|
||||
if (msgBytes.Count == 0) return null;
|
||||
|
||||
NetOutgoingMessage message = netPeer.CreateMessage();
|
||||
message.WriteEnum(PacketTypes.NetworkEvent);
|
||||
message.Write((byte)PacketTypes.NetworkEvent);
|
||||
|
||||
message.Write((float)NetTime.Now);
|
||||
|
||||
@@ -295,25 +297,6 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
|
||||
public virtual void Disconnect() { }
|
||||
|
||||
protected byte PlayerCountToByte(int playerCount, int maxPlayers)
|
||||
{
|
||||
byte byteVal = (byte)playerCount;
|
||||
|
||||
byteVal |= (byte)((maxPlayers - 1) << 4);
|
||||
|
||||
return byteVal;
|
||||
}
|
||||
|
||||
public static int ByteToPlayerCount(byte byteVal, out int maxPlayers)
|
||||
{
|
||||
maxPlayers = (byteVal >> 4)+1;
|
||||
|
||||
int playerCount = byteVal & (byte)((1 << 4) - 1);
|
||||
|
||||
return playerCount;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ namespace Barotrauma.Networking.ReliableMessages
|
||||
|
||||
var reliableMessage = new ReliableMessage(message, messageID);
|
||||
|
||||
message.WriteEnum(PacketTypes.ReliableMessage);
|
||||
message.Write((byte)PacketTypes.ReliableMessage);
|
||||
|
||||
message.Write(messageID);
|
||||
|
||||
@@ -184,7 +184,7 @@ namespace Barotrauma.Networking.ReliableMessages
|
||||
//Debug.WriteLine("Sending ack message: "+messageCount);
|
||||
|
||||
NetOutgoingMessage message = sender.CreateMessage();
|
||||
message.WriteEnum(PacketTypes.LatestMessageID);
|
||||
message.Write((byte)PacketTypes.LatestMessageID);
|
||||
|
||||
message.Write(messageCount);
|
||||
|
||||
@@ -244,7 +244,7 @@ namespace Barotrauma.Networking.ReliableMessages
|
||||
Debug.WriteLine("rerequest "+missingMessage.ID+" (try #"+missingMessage.ResendRequestsSent+")");
|
||||
|
||||
NetOutgoingMessage resendRequest = receiver.CreateMessage();
|
||||
resendRequest.WriteEnum(PacketTypes.ResendRequest);
|
||||
resendRequest.Write((byte)PacketTypes.ResendRequest);
|
||||
|
||||
resendRequest.Write(missingMessage.ID);
|
||||
|
||||
@@ -443,6 +443,7 @@ namespace Barotrauma.Networking.ReliableMessages
|
||||
|
||||
public void SaveInnerMessage()
|
||||
{
|
||||
innerMessage.WritePadBits();
|
||||
innerMessageBytes = innerMessage.PeekBytes(innerMessage.LengthBytes);
|
||||
//innerMessage = null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user