- server asks the clients whether they're ready to start a round, giving some time to load the selected sub before the round starts
- fixed joining clients not being informed about vote status or voting being enabled
This commit is contained in:
@@ -487,6 +487,17 @@ namespace Barotrauma.Networking
|
||||
|
||||
switch (packetType)
|
||||
{
|
||||
case (byte)PacketTypes.CanStartGame:
|
||||
string subName = inc.ReadString();
|
||||
string subHash = inc.ReadString();
|
||||
|
||||
if (GameMain.NetLobbyScreen.TrySelectSub(subName,subHash))
|
||||
{
|
||||
NetOutgoingMessage readyToStartMsg = client.CreateMessage();
|
||||
readyToStartMsg.Write((byte)PacketTypes.StartGame);
|
||||
client.SendMessage(readyToStartMsg, NetDeliveryMethod.ReliableUnordered);
|
||||
}
|
||||
break;
|
||||
case (byte)PacketTypes.StartGame:
|
||||
if (Screen.Selected == GameMain.GameScreen) continue;
|
||||
|
||||
|
||||
@@ -474,6 +474,8 @@ namespace Barotrauma.Networking
|
||||
//send the message to everyone except the client who just logged in
|
||||
SendMessage(outmsg, NetDeliveryMethod.ReliableUnordered, inc.SenderConnection);
|
||||
|
||||
UpdateVoteStatus();
|
||||
|
||||
AddChatMessage(sender.name + " has joined the server", ChatMessageType.Server);
|
||||
}
|
||||
}
|
||||
@@ -521,6 +523,9 @@ namespace Barotrauma.Networking
|
||||
case (byte)PacketTypes.PlayerLeft:
|
||||
DisconnectClient(inc.SenderConnection);
|
||||
break;
|
||||
case (byte)PacketTypes.StartGame:
|
||||
dataSender.ReadyToStart = true;
|
||||
break;
|
||||
case (byte)PacketTypes.CharacterInfo:
|
||||
ReadCharacterData(inc);
|
||||
break;
|
||||
@@ -871,17 +876,38 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
GameMain.NetLobbyScreen.StartButton.Enabled = false;
|
||||
|
||||
if (Voting.AllowSubVoting) yield return new WaitForSeconds(1.0f);
|
||||
NetOutgoingMessage msg = server.CreateMessage();
|
||||
msg.Write((byte)PacketTypes.CanStartGame);
|
||||
msg.Write(selectedSub.Name);
|
||||
msg.Write(selectedSub.MD5Hash.Hash);
|
||||
|
||||
while (ConnectedClients.Any(c => c.FileStreamSender != null && c.FileStreamSender.FilePath == selectedSub.FilePath))
|
||||
SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||
|
||||
ConnectedClients.ForEach(c => c.ReadyToStart = false);
|
||||
|
||||
float waitForResponseTimer = 5.0f;
|
||||
while (ConnectedClients.Any(c => !c.ReadyToStart) && waitForResponseTimer > 0.0f)
|
||||
{
|
||||
waitForResponseTimer -= CoroutineManager.UnscaledDeltaTime;
|
||||
yield return CoroutineStatus.Running;
|
||||
}
|
||||
|
||||
float fileTransferTimeOut = 60.0f;
|
||||
while (ConnectedClients.Any(c => c.FileStreamSender != null && c.FileStreamSender.FilePath == selectedSub.FilePath) && fileTransferTimeOut>0.0f)
|
||||
{
|
||||
fileTransferTimeOut -= CoroutineManager.UnscaledDeltaTime;
|
||||
|
||||
if (GUIMessageBox.MessageBoxes.Peek() == null)
|
||||
{
|
||||
new GUIMessageBox("File transfer in progress",
|
||||
"The round will be started after the submarine file has been sent to all players.", 400, 400);
|
||||
var messageBox = new GUIMessageBox("File transfer in progress",
|
||||
"The round will be started after the submarine file has been sent to all players.", new string[] {"Cancel transfer"}, 400, 400);
|
||||
messageBox.Buttons[0].UserData = ConnectedClients.Find(c => c.FileStreamSender != null && c.FileStreamSender.FilePath == selectedSub.FilePath);
|
||||
messageBox.Buttons[0].OnClicked = (button, obj) =>
|
||||
{
|
||||
(button.UserData as Client).CancelTransfer();
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(0.1f);
|
||||
}
|
||||
|
||||
GameMain.ShowLoading(StartGame(selectedSub, selectedMode), false);
|
||||
@@ -1782,6 +1808,8 @@ namespace Barotrauma.Networking
|
||||
public string version;
|
||||
public bool inGame;
|
||||
|
||||
public bool ReadyToStart;
|
||||
|
||||
private object[] votes;
|
||||
|
||||
public List<JobPrefab> jobPreferences;
|
||||
@@ -1828,5 +1856,15 @@ namespace Barotrauma.Networking
|
||||
votes[i] = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void CancelTransfer()
|
||||
{
|
||||
if (FileStreamSender == null) return;
|
||||
|
||||
FileStreamSender.CancelTransfer();
|
||||
FileStreamSender.Dispose();
|
||||
|
||||
FileStreamSender = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
RequestNetLobbyUpdate,
|
||||
|
||||
StartGame, EndGame,
|
||||
StartGame, EndGame, CanStartGame,
|
||||
|
||||
NewItem, RemoveItem,
|
||||
|
||||
|
||||
@@ -1027,8 +1027,8 @@ namespace Barotrauma
|
||||
//already downloading the selected sub file
|
||||
if (GameMain.Client.ActiveFileTransferName == subName+".sub") return false;
|
||||
|
||||
var matchingListSub = subList.children.Find(c => c.UserData != null && (c.UserData as Submarine).Name == subName);
|
||||
if (matchingListSub!=null)
|
||||
var matchingListSub = subList.children.Find(c => c.UserData != null && (c.UserData as Submarine).Name == subName) as GUITextBlock;
|
||||
if (matchingListSub != null)
|
||||
{
|
||||
subList.Select(subList.children.IndexOf(matchingListSub), true);
|
||||
}
|
||||
@@ -1043,7 +1043,9 @@ namespace Barotrauma
|
||||
}
|
||||
else if (sub.MD5Hash.Hash == null)
|
||||
{
|
||||
errorMsg = "Couldn't load submarine ''" + subName + "''. The file may be corrupted. ";
|
||||
errorMsg = "Couldn't load submarine ''" + subName + "''. The file may be corrupted. ";
|
||||
|
||||
if (matchingListSub != null) matchingListSub.TextColor = Color.Red;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user