- File transfer improvements (switching the sub selection during transfer works, max transfer duration, waiting for transfers to finish before starting the round)
- Firesource changes (more particles with shorter lifetimes, combining bugfix) - StatusEffects can target hulls and always be active - Cyrillic character support - Saving server settings - Swapping items in inventory by dropping an item to a non-free slot
This commit is contained in:
@@ -21,7 +21,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
private string downloadFolder;
|
||||
|
||||
private FileTransferType fileType;
|
||||
private FileTransferMessageType fileType;
|
||||
|
||||
public string FileName
|
||||
{
|
||||
@@ -39,7 +39,7 @@ namespace Barotrauma.Networking
|
||||
get { return received; }
|
||||
}
|
||||
|
||||
public FileTransferType FileType
|
||||
public FileTransferMessageType FileType
|
||||
{
|
||||
get { return fileType; }
|
||||
}
|
||||
@@ -67,7 +67,7 @@ namespace Barotrauma.Networking
|
||||
get { return (float)received / (float)length; }
|
||||
}
|
||||
|
||||
public FileStreamReceiver(NetClient client, string filePath, FileTransferType fileType, OnFinished onFinished)
|
||||
public FileStreamReceiver(NetClient client, string filePath, FileTransferMessageType fileType, OnFinished onFinished)
|
||||
{
|
||||
this.client = client;
|
||||
|
||||
@@ -116,7 +116,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case (byte)FileTransferType.Submarine:
|
||||
case (byte)FileTransferMessageType.Submarine:
|
||||
if (Path.GetExtension(fileName) != ".sub")
|
||||
{
|
||||
ErrorMessage = "Wrong file extension ''" + Path.GetExtension(fileName) + "''! (Expected .sub)";
|
||||
@@ -163,9 +163,12 @@ namespace Barotrauma.Networking
|
||||
Status == FileTransferStatus.Finished ||
|
||||
Status == FileTransferStatus.Canceled) return;
|
||||
|
||||
byte transferMessageType = inc.ReadByte();
|
||||
|
||||
//int chunkLen = inc.LengthBytes;
|
||||
if (length == 0)
|
||||
{
|
||||
if (transferMessageType != (byte)FileTransferMessageType.Initiate) return;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(downloadFolder) && !Directory.Exists(downloadFolder))
|
||||
{
|
||||
@@ -174,6 +177,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
byte fileTypeByte = inc.ReadByte();
|
||||
|
||||
|
||||
length = inc.ReadUInt64();
|
||||
FileName = inc.ReadString();
|
||||
|
||||
@@ -233,7 +237,7 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
switch (fileType)
|
||||
{
|
||||
case FileTransferType.Submarine:
|
||||
case FileTransferMessageType.Submarine:
|
||||
string file = Path.Combine(downloadFolder, FileName);
|
||||
Stream stream = null;
|
||||
|
||||
@@ -255,16 +259,20 @@ namespace Barotrauma.Networking
|
||||
|
||||
try
|
||||
{
|
||||
stream.Position = 0;
|
||||
var doc = XDocument.Load(stream); //ToolBox.TryLoadXml(file);
|
||||
stream.Close();
|
||||
stream.Dispose();
|
||||
stream.Position = 0;
|
||||
var doc = XDocument.Load(stream);
|
||||
}
|
||||
catch
|
||||
{
|
||||
stream.Close();
|
||||
stream.Dispose();
|
||||
|
||||
ErrorMessage = "Failed to parse submarine file ''"+file+"''!";
|
||||
return false;
|
||||
}
|
||||
|
||||
stream.Close();
|
||||
stream.Dispose();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,13 +9,15 @@ namespace Barotrauma.Networking
|
||||
NotStarted, Sending, Receiving, Finished, Error, Canceled
|
||||
}
|
||||
|
||||
enum FileTransferType
|
||||
enum FileTransferMessageType
|
||||
{
|
||||
Unknown, Submarine, Cancel
|
||||
Unknown, Initiate, Submarine, Cancel
|
||||
}
|
||||
|
||||
class FileStreamSender : IDisposable
|
||||
{
|
||||
public static TimeSpan MaxTransferDuration = new TimeSpan(0, 2, 0);
|
||||
|
||||
private FileStream inputStream;
|
||||
private int sentOffset;
|
||||
private int chunkLen;
|
||||
@@ -24,8 +26,9 @@ namespace Barotrauma.Networking
|
||||
|
||||
float waitTimer;
|
||||
|
||||
DateTime startingTime;
|
||||
|
||||
private FileTransferType fileType;
|
||||
private FileTransferMessageType fileType;
|
||||
|
||||
public FileTransferStatus Status
|
||||
{
|
||||
@@ -39,6 +42,12 @@ namespace Barotrauma.Networking
|
||||
private set;
|
||||
}
|
||||
|
||||
public string FilePath
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public float Progress
|
||||
{
|
||||
get { return inputStream == null ? 0.0f : (float)sentOffset / (float)inputStream.Length; }
|
||||
@@ -54,30 +63,45 @@ namespace Barotrauma.Networking
|
||||
get { return inputStream == null ? 0 : inputStream.Length; }
|
||||
}
|
||||
|
||||
public static FileStreamSender Create(NetConnection conn, string fileName, FileTransferType fileType)
|
||||
public static FileStreamSender Create(NetConnection conn, string filePath, FileTransferMessageType fileType)
|
||||
{
|
||||
if (!File.Exists(fileName))
|
||||
if (!File.Exists(filePath))
|
||||
{
|
||||
DebugConsole.ThrowError("Sending a file failed. File ''"+fileName+"'' not found.");
|
||||
DebugConsole.ThrowError("Sending a file failed. File ''"+filePath+"'' not found.");
|
||||
return null;
|
||||
}
|
||||
|
||||
return new FileStreamSender(conn, fileName, fileType);
|
||||
FileStreamSender sender = null;
|
||||
|
||||
try
|
||||
{
|
||||
sender = new FileStreamSender(conn, filePath, fileType);
|
||||
}
|
||||
|
||||
catch (Exception e)
|
||||
{
|
||||
DebugConsole.ThrowError("Couldn't open file ''"+filePath+"''",e);
|
||||
}
|
||||
|
||||
return sender;
|
||||
}
|
||||
|
||||
private FileStreamSender(NetConnection conn, string fileName, FileTransferType fileType)
|
||||
private FileStreamSender(NetConnection conn, string filePath, FileTransferMessageType fileType)
|
||||
{
|
||||
connection = conn;
|
||||
inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
inputStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
chunkLen = connection.Peer.Configuration.MaximumTransmissionUnit - 100;
|
||||
tempBuffer = new byte[chunkLen];
|
||||
sentOffset = 0;
|
||||
|
||||
FileName = fileName;
|
||||
|
||||
FilePath = filePath;
|
||||
FileName = Path.GetFileName(filePath);
|
||||
|
||||
this.fileType = fileType;
|
||||
|
||||
Status = FileTransferStatus.NotStarted;
|
||||
|
||||
startingTime = DateTime.Now;
|
||||
}
|
||||
|
||||
public void Update(float deltaTime)
|
||||
@@ -87,6 +111,12 @@ namespace Barotrauma.Networking
|
||||
Status == FileTransferStatus.Error ||
|
||||
Status == FileTransferStatus.Finished) return;
|
||||
|
||||
if (DateTime.Now > startingTime + MaxTransferDuration)
|
||||
{
|
||||
CancelTransfer();
|
||||
return;
|
||||
}
|
||||
|
||||
waitTimer -= deltaTime;
|
||||
if (waitTimer > 0.0f) return;
|
||||
|
||||
@@ -105,6 +135,7 @@ namespace Barotrauma.Networking
|
||||
// first message; send length, chunk length and file name
|
||||
message = connection.Peer.CreateMessage(sendBytes + 8 + 1);
|
||||
message.Write((byte)PacketTypes.FileStream);
|
||||
message.Write((byte)FileTransferMessageType.Initiate);
|
||||
message.Write((byte)fileType);
|
||||
message.Write((ulong)inputStream.Length);
|
||||
message.Write(Path.GetFileName(inputStream.Name));
|
||||
@@ -115,12 +146,13 @@ namespace Barotrauma.Networking
|
||||
|
||||
message = connection.Peer.CreateMessage(sendBytes + 8 + 1);
|
||||
message.Write((byte)PacketTypes.FileStream);
|
||||
message.Write((byte)fileType);
|
||||
message.Write(tempBuffer, 0, sendBytes);
|
||||
|
||||
connection.SendMessage(message, NetDeliveryMethod.ReliableOrdered, 1);
|
||||
sentOffset += sendBytes;
|
||||
|
||||
waitTimer = connection.AverageRoundtripTime + 0.05f;
|
||||
waitTimer = connection.AverageRoundtripTime;
|
||||
|
||||
//Program.Output("Sent " + m_sentOffset + "/" + m_inputStream.Length + " bytes to " + m_connection);
|
||||
|
||||
|
||||
@@ -38,6 +38,11 @@ namespace Barotrauma.Networking
|
||||
get { return otherClients; }
|
||||
}
|
||||
|
||||
public string ActiveFileTransferName
|
||||
{
|
||||
get { return (fileStreamReceiver == null || fileStreamReceiver.Status == FileTransferStatus.Finished) ? "" : fileStreamReceiver.FileName; }
|
||||
}
|
||||
|
||||
public GameClient(string newName)
|
||||
{
|
||||
endRoundButton = new GUITickBox(new Rectangle(GameMain.GraphicsWidth - 170, 20, 20, 20), "End round", Alignment.TopLeft, inGameHUD);
|
||||
@@ -479,7 +484,20 @@ namespace Barotrauma.Networking
|
||||
|
||||
break;
|
||||
case (byte)PacketTypes.RequestFile:
|
||||
new GUIMessageBox("Couldn't the file from the server", "Sharing files has been disabled by the server.");
|
||||
bool accepted = inc.ReadBoolean();
|
||||
|
||||
if (!accepted)
|
||||
{
|
||||
new GUIMessageBox("File transfer canceled", inc.ReadString());
|
||||
|
||||
if (fileStreamReceiver!=null)
|
||||
{
|
||||
fileStreamReceiver.DeleteFile();
|
||||
fileStreamReceiver.Dispose();
|
||||
fileStreamReceiver = null;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
case (byte)PacketTypes.FileStream:
|
||||
if (fileStreamReceiver == null)
|
||||
@@ -710,14 +728,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (GUI.DrawButton(spriteBatch, new Rectangle((int)pos.X + 310, (int)pos.Y + 20, 100, 15), "Cancel", new Color(0.88f, 0.25f, 0.15f, 0.8f)))
|
||||
{
|
||||
fileStreamReceiver.DeleteFile();
|
||||
fileStreamReceiver.Dispose();
|
||||
fileStreamReceiver = null;
|
||||
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
msg.Write((byte)PacketTypes.RequestFile);
|
||||
msg.Write((byte)FileTransferType.Cancel);
|
||||
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||
CancelFileTransfer();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -737,28 +748,6 @@ namespace Barotrauma.Networking
|
||||
|
||||
}
|
||||
|
||||
private void OnFileReceived(FileStreamReceiver receiver)
|
||||
{
|
||||
if (receiver.Status == FileTransferStatus.Error)
|
||||
{
|
||||
new GUIMessageBox("Error while receiving file from server", receiver.ErrorMessage, 400, 350);
|
||||
receiver.DeleteFile();
|
||||
|
||||
}
|
||||
else if (receiver.Status == FileTransferStatus.Finished)
|
||||
{
|
||||
new GUIMessageBox("Download finished", "File ''"+receiver.FileName+"'' was downloaded succesfully.");
|
||||
|
||||
switch (receiver.FileType)
|
||||
{
|
||||
case FileTransferType.Submarine:
|
||||
Submarine.Preload();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fileStreamReceiver = null;
|
||||
}
|
||||
|
||||
public override void Disconnect()
|
||||
{
|
||||
@@ -770,8 +759,13 @@ namespace Barotrauma.Networking
|
||||
GameMain.NetworkMember = null;
|
||||
}
|
||||
|
||||
public void RequestFile(string file, FileTransferType fileType)
|
||||
public void RequestFile(string file, FileTransferMessageType fileType)
|
||||
{
|
||||
if (fileStreamReceiver!=null)
|
||||
{
|
||||
CancelFileTransfer();
|
||||
}
|
||||
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
msg.Write((byte)PacketTypes.RequestFile);
|
||||
msg.Write((byte)fileType);
|
||||
@@ -783,6 +777,41 @@ namespace Barotrauma.Networking
|
||||
fileStreamReceiver = new FileStreamReceiver(client, Path.Combine(Submarine.SavePath, "Downloaded"), fileType, OnFileReceived);
|
||||
}
|
||||
|
||||
private void OnFileReceived(FileStreamReceiver receiver)
|
||||
{
|
||||
if (receiver.Status == FileTransferStatus.Error)
|
||||
{
|
||||
new GUIMessageBox("Error while receiving file from server", receiver.ErrorMessage, 400, 350);
|
||||
receiver.DeleteFile();
|
||||
|
||||
}
|
||||
else if (receiver.Status == FileTransferStatus.Finished)
|
||||
{
|
||||
new GUIMessageBox("Download finished", "File ''" + receiver.FileName + "'' was downloaded succesfully.");
|
||||
|
||||
switch (receiver.FileType)
|
||||
{
|
||||
case FileTransferMessageType.Submarine:
|
||||
Submarine.Preload();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fileStreamReceiver = null;
|
||||
}
|
||||
|
||||
private void CancelFileTransfer()
|
||||
{
|
||||
fileStreamReceiver.DeleteFile();
|
||||
fileStreamReceiver.Dispose();
|
||||
fileStreamReceiver = null;
|
||||
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
msg.Write((byte)PacketTypes.RequestFile);
|
||||
msg.Write((byte)FileTransferMessageType.Cancel);
|
||||
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||
}
|
||||
|
||||
public void Vote(VoteType voteType, object userData)
|
||||
{
|
||||
NetOutgoingMessage msg = client.CreateMessage();
|
||||
|
||||
@@ -30,6 +30,7 @@ namespace Barotrauma.Networking
|
||||
private DateTime sparseUpdateTimer;
|
||||
private DateTime refreshMasterTimer;
|
||||
|
||||
private RestClient restClient;
|
||||
private bool masterServerResponded;
|
||||
|
||||
private ServerLog log;
|
||||
@@ -96,6 +97,8 @@ namespace Barotrauma.Networking
|
||||
|
||||
banList = new BanList();
|
||||
|
||||
LoadSettings();
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
|
||||
@@ -160,7 +163,10 @@ namespace Barotrauma.Networking
|
||||
|
||||
private void RegisterToMasterServer()
|
||||
{
|
||||
var client = new RestClient(NetConfig.MasterServerUrl);
|
||||
if (restClient==null)
|
||||
{
|
||||
restClient = new RestClient(NetConfig.MasterServerUrl);
|
||||
}
|
||||
|
||||
var request = new RestRequest("masterserver2.php", Method.GET);
|
||||
request.AddParameter("action", "addserver");
|
||||
@@ -171,7 +177,7 @@ namespace Barotrauma.Networking
|
||||
request.AddParameter("password", string.IsNullOrWhiteSpace(password) ? 0 : 1);
|
||||
|
||||
// execute the request
|
||||
RestResponse response = (RestResponse)client.Execute(request);
|
||||
RestResponse response = (RestResponse)restClient.Execute(request);
|
||||
|
||||
if (response.StatusCode != System.Net.HttpStatusCode.OK)
|
||||
{
|
||||
@@ -191,7 +197,10 @@ namespace Barotrauma.Networking
|
||||
|
||||
private IEnumerable<object> RefreshMaster()
|
||||
{
|
||||
var client = new RestClient(NetConfig.MasterServerUrl);
|
||||
if (restClient == null)
|
||||
{
|
||||
restClient = new RestClient(NetConfig.MasterServerUrl);
|
||||
}
|
||||
|
||||
var request = new RestRequest("masterserver2.php", Method.GET);
|
||||
request.AddParameter("action", "refreshserver");
|
||||
@@ -205,7 +214,7 @@ namespace Barotrauma.Networking
|
||||
sw.Start();
|
||||
|
||||
masterServerResponded = false;
|
||||
var restRequestHandle = client.ExecuteAsync(request, response => MasterServerCallBack(response));
|
||||
var restRequestHandle = restClient.ExecuteAsync(request, response => MasterServerCallBack(response));
|
||||
|
||||
DateTime timeOut = DateTime.Now + new TimeSpan(0, 0, 15);
|
||||
while (!masterServerResponded)
|
||||
@@ -312,40 +321,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
foreach (Client c in ConnectedClients)
|
||||
{
|
||||
if (c.FileStreamSender != null)
|
||||
{
|
||||
var clientNameBox = GameMain.NetLobbyScreen.PlayerList.FindChild(c.name);
|
||||
var clientInfo = clientNameBox.FindChild(c.FileStreamSender);
|
||||
|
||||
if (clientInfo==null)
|
||||
{
|
||||
clientInfo = new GUIFrame(new Rectangle(0,0,180,0), Color.Transparent, Alignment.TopRight, null, clientNameBox);
|
||||
clientInfo.UserData = c.FileStreamSender;
|
||||
new GUIProgressBar(new Rectangle(0, 4, 0, clientInfo.Rect.Height-8), Color.Green, GUI.Style, 0.0f, Alignment.Left, clientInfo).IsHorizontal = true;
|
||||
new GUITextBlock(new Rectangle(0,2,0,0), "", GUI.Style, Alignment.TopLeft, Alignment.Left | Alignment.CenterY, clientInfo, true, GUI.SmallFont);
|
||||
}
|
||||
else
|
||||
{
|
||||
var progressBar = clientInfo.GetChild<GUIProgressBar>();
|
||||
progressBar.BarSize = c.FileStreamSender.Progress;
|
||||
|
||||
var progressText = clientInfo.GetChild<GUITextBlock>();
|
||||
progressText.Text = c.FileStreamSender.FileName + " " +
|
||||
MathUtils.GetBytesReadable(c.FileStreamSender.Sent) + " / " + MathUtils.GetBytesReadable(c.FileStreamSender.FileSize);
|
||||
}
|
||||
|
||||
c.FileStreamSender.Update(deltaTime);
|
||||
|
||||
if (c.FileStreamSender.Status == FileTransferStatus.Finished ||
|
||||
c.FileStreamSender.Status == FileTransferStatus.Error ||
|
||||
c.FileStreamSender.Status == FileTransferStatus.Canceled)
|
||||
{
|
||||
clientNameBox.RemoveChild(clientInfo);
|
||||
|
||||
c.FileStreamSender.Dispose();
|
||||
c.FileStreamSender = null;
|
||||
}
|
||||
}
|
||||
if (c.FileStreamSender != null) UpdateFileTransfer(c, deltaTime);
|
||||
|
||||
c.ReliableChannel.Update(deltaTime);
|
||||
}
|
||||
@@ -542,20 +518,16 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (!allowFileTransfers)
|
||||
{
|
||||
var outmsg = server.CreateMessage();
|
||||
outmsg.Write((byte)PacketTypes.RequestFile);
|
||||
outmsg.Write(false);
|
||||
outmsg.Write("File downloads disabled by the server");
|
||||
server.SendMessage(outmsg, dataSender.Connection, NetDeliveryMethod.ReliableUnordered);
|
||||
SendCancelTransferMessage(dataSender, "File transfers have been disabled by the server.");
|
||||
break;
|
||||
}
|
||||
|
||||
byte fileType = inc.ReadByte();
|
||||
string fileName = fileType == (byte)FileTransferType.Cancel ? "" : inc.ReadString();
|
||||
string fileName = fileType == (byte)FileTransferMessageType.Cancel ? "" : inc.ReadString();
|
||||
|
||||
switch (fileType)
|
||||
{
|
||||
case (byte)FileTransferType.Submarine:
|
||||
case (byte)FileTransferMessageType.Submarine:
|
||||
|
||||
var requestedSubmarine = Submarine.SavedSubmarines.Find(s => s.Name == fileName);
|
||||
|
||||
@@ -565,11 +537,13 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
else
|
||||
{
|
||||
var fileStreamSender = FileStreamSender.Create(dataSender.Connection, requestedSubmarine.FilePath, FileTransferType.Submarine);
|
||||
if (dataSender.FileStreamSender != null) dataSender.FileStreamSender.CancelTransfer();
|
||||
|
||||
var fileStreamSender = FileStreamSender.Create(dataSender.Connection, requestedSubmarine.FilePath, FileTransferMessageType.Submarine);
|
||||
if (fileStreamSender != null) dataSender.FileStreamSender = fileStreamSender;
|
||||
}
|
||||
break;
|
||||
case (byte)FileTransferType.Cancel:
|
||||
case (byte)FileTransferMessageType.Cancel:
|
||||
if (dataSender.FileStreamSender != null)
|
||||
{
|
||||
dataSender.FileStreamSender.CancelTransfer();
|
||||
@@ -881,6 +855,13 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
GUIMessageBox.CloseAll();
|
||||
|
||||
if (ConnectedClients.Any(c => c.FileStreamSender != null && c.FileStreamSender.FilePath == selectedSub.FilePath))
|
||||
{
|
||||
new GUIMessageBox("Couldn't start a round",
|
||||
"Can't start a round while sending the selected submarine to clients. Cancel the transfers or wait for them to finish before starting.", 400, 400);
|
||||
yield return CoroutineStatus.Success;
|
||||
}
|
||||
|
||||
AssignJobs();
|
||||
|
||||
roundStartSeed = DateTime.Now.Millisecond;
|
||||
@@ -960,7 +941,6 @@ namespace Barotrauma.Networking
|
||||
|
||||
GameMain.GameScreen.Select();
|
||||
|
||||
|
||||
AddChatMessage("Press TAB to chat. Use ''d;'' to talk to dead players and spectators, and ''player name;'' to only send the message to a specific player.", ChatMessageType.Server);
|
||||
|
||||
yield return CoroutineStatus.Success;
|
||||
@@ -1166,6 +1146,65 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateFileTransfer(Client client, float deltaTime)
|
||||
{
|
||||
if (client.FileStreamSender == null) return;
|
||||
|
||||
var clientNameBox = GameMain.NetLobbyScreen.PlayerList.FindChild(client.name);
|
||||
var clientInfo = clientNameBox.FindChild(client.FileStreamSender);
|
||||
|
||||
if (clientInfo == null)
|
||||
{
|
||||
clientNameBox.ClearChildren();
|
||||
|
||||
clientInfo = new GUIFrame(new Rectangle(0, 0, 180, 0), Color.Transparent, Alignment.TopRight, null, clientNameBox);
|
||||
clientInfo.UserData = client.FileStreamSender;
|
||||
new GUIProgressBar(new Rectangle(0, 4, 160, clientInfo.Rect.Height - 8), Color.Green, GUI.Style, 0.0f, Alignment.Left, clientInfo).IsHorizontal = true;
|
||||
new GUITextBlock(new Rectangle(0, 2, 160, 0), "", GUI.Style, Alignment.TopLeft, Alignment.Left | Alignment.CenterY, clientInfo, true, GUI.SmallFont);
|
||||
|
||||
var cancelButton = new GUIButton(new Rectangle(20, 0, 14, 0), "X", Alignment.Right, GUI.Style, clientInfo);
|
||||
cancelButton.OnClicked = (GUIButton button, object userdata) =>
|
||||
{
|
||||
(cancelButton.Parent.UserData as FileStreamSender).CancelTransfer();
|
||||
return true;
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
var progressBar = clientInfo.GetChild<GUIProgressBar>();
|
||||
progressBar.BarSize = client.FileStreamSender.Progress;
|
||||
|
||||
var progressText = clientInfo.GetChild<GUITextBlock>();
|
||||
progressText.Text = client.FileStreamSender.FileName + " " +
|
||||
MathUtils.GetBytesReadable(client.FileStreamSender.Sent) + " / " + MathUtils.GetBytesReadable(client.FileStreamSender.FileSize);
|
||||
}
|
||||
|
||||
client.FileStreamSender.Update(deltaTime);
|
||||
|
||||
if (client.FileStreamSender.Status != FileTransferStatus.Sending &&
|
||||
client.FileStreamSender.Status != FileTransferStatus.NotStarted)
|
||||
{
|
||||
if (client.FileStreamSender.Status == FileTransferStatus.Canceled)
|
||||
{
|
||||
SendCancelTransferMessage(client, "File transfer was canceled by the server.");
|
||||
}
|
||||
|
||||
clientNameBox.RemoveChild(clientInfo);
|
||||
|
||||
client.FileStreamSender.Dispose();
|
||||
client.FileStreamSender = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void SendCancelTransferMessage(Client client, string message)
|
||||
{
|
||||
var outmsg = server.CreateMessage();
|
||||
outmsg.Write((byte)PacketTypes.RequestFile);
|
||||
outmsg.Write(false);
|
||||
outmsg.Write(message);
|
||||
server.SendMessage(outmsg, client.Connection, NetDeliveryMethod.ReliableUnordered);
|
||||
}
|
||||
|
||||
public void NewTraitor(Character traitor, Character target)
|
||||
{
|
||||
Log(traitor.Name + " is the traitor and the target is " + target.Name, Color.Cyan);
|
||||
@@ -1590,6 +1629,16 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
banList.Save();
|
||||
|
||||
|
||||
if (registeredToMaster && restClient != null)
|
||||
{
|
||||
var request = new RestRequest("masterserver2.php", Method.GET);
|
||||
request.AddParameter("action", "removeserver");
|
||||
|
||||
restClient.Execute(request);
|
||||
restClient = null;
|
||||
}
|
||||
|
||||
if (saveServerLogs)
|
||||
{
|
||||
Log("Shutting down server...", Color.Cyan);
|
||||
|
||||
@@ -3,6 +3,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Barotrauma.Networking
|
||||
{
|
||||
@@ -18,6 +19,8 @@ namespace Barotrauma.Networking
|
||||
|
||||
partial class GameServer : NetworkMember
|
||||
{
|
||||
public const string SettingsFile = "serversettings.xml";
|
||||
|
||||
public bool ShowNetStats;
|
||||
|
||||
private TimeSpan refreshMasterInterval = new TimeSpan(0, 0, 30);
|
||||
@@ -91,6 +94,66 @@ namespace Barotrauma.Networking
|
||||
|
||||
public float EndVoteRequiredRatio = 0.5f;
|
||||
|
||||
private void SaveSettings()
|
||||
{
|
||||
XDocument doc = new XDocument(new XElement("serversettings"));
|
||||
|
||||
doc.Root.Add
|
||||
(
|
||||
new XAttribute("AllowSpectating", allowSpectating),
|
||||
new XAttribute("RandomizeSeed", randomizeSeed),
|
||||
new XAttribute("EndRoundAtLevelEnd", endRoundAtLevelEnd),
|
||||
new XAttribute("AllowFileTransfers", allowFileTransfers),
|
||||
|
||||
new XAttribute("SaveServerLogs", saveServerLogs),
|
||||
new XAttribute("LinesPerLogFile", log.LinesPerFile),
|
||||
|
||||
new XAttribute("SubSelection", subSelectionMode),
|
||||
new XAttribute("ModeSelection", modeSelectionMode)
|
||||
);
|
||||
|
||||
try
|
||||
{
|
||||
doc.Save(SettingsFile);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
DebugConsole.ThrowError("Saving server settings failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadSettings()
|
||||
{
|
||||
XDocument doc = null;
|
||||
if (System.IO.File.Exists(SettingsFile))
|
||||
{
|
||||
doc = ToolBox.TryLoadXml(SettingsFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (doc == null)
|
||||
{
|
||||
doc = new XDocument(new XElement("serversettings"));
|
||||
}
|
||||
|
||||
allowSpectating = ToolBox.GetAttributeBool(doc.Root, "AllowSpectating", true);
|
||||
randomizeSeed = ToolBox.GetAttributeBool(doc.Root, "RandomizeSeed", true);
|
||||
endRoundAtLevelEnd = ToolBox.GetAttributeBool(doc.Root, "EndRoundAtLevelEnd", true);
|
||||
allowFileTransfers = ToolBox.GetAttributeBool(doc.Root, "AllowFileTransfers", true);
|
||||
|
||||
saveServerLogs = ToolBox.GetAttributeBool(doc.Root, "SaveServerLogs", true);
|
||||
log.LinesPerFile = ToolBox.GetAttributeInt(doc.Root, "LinesPerLogFile", 800);
|
||||
|
||||
subSelectionMode = SelectionMode.Manual;
|
||||
Enum.TryParse<SelectionMode>(ToolBox.GetAttributeString(doc.Root, "SubSelection", "Manual"), out subSelectionMode);
|
||||
|
||||
modeSelectionMode = SelectionMode.Manual;
|
||||
Enum.TryParse<SelectionMode>(ToolBox.GetAttributeString(doc.Root, "ModeSelection", "Manual"), out modeSelectionMode);
|
||||
}
|
||||
|
||||
private void CreateSettingsFrame()
|
||||
{
|
||||
settingsFrame = new GUIFrame(new Rectangle(0, 0, GameMain.GraphicsWidth, GameMain.GraphicsHeight), Color.Black * 0.5f);
|
||||
@@ -227,6 +290,7 @@ namespace Barotrauma.Networking
|
||||
else
|
||||
{
|
||||
settingsFrame = null;
|
||||
SaveSettings();
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -172,7 +172,7 @@ namespace Barotrauma.Networking
|
||||
message.Write((byte)msgBytes.Count);
|
||||
foreach (byte[] msgData in msgBytes)
|
||||
{
|
||||
if (msgData.Length > 255) DebugConsole.ThrowError("too large networkevent (" + msgData.Length + " bytes)");
|
||||
if (msgData.Length > 255) DebugConsole.ThrowError("Too large networkevent (" + msgData.Length + " bytes)");
|
||||
|
||||
message.Write((byte)msgData.Length);
|
||||
message.Write(msgData);
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
class ServerLog
|
||||
{
|
||||
const int LinesPerFile = 800;
|
||||
private int linesPerFile = 800;
|
||||
|
||||
public const string SavePath = "ServerLogs";
|
||||
|
||||
@@ -21,6 +21,12 @@ namespace Barotrauma.Networking
|
||||
|
||||
private Queue<ColoredText> lines;
|
||||
|
||||
public int LinesPerFile
|
||||
{
|
||||
get { return linesPerFile; }
|
||||
set { linesPerFile = Math.Max(10, linesPerFile); }
|
||||
}
|
||||
|
||||
public ServerLog(string serverName)
|
||||
{
|
||||
this.serverName = serverName;
|
||||
|
||||
Reference in New Issue
Block a user