(3dc4135ce) v0.9.5.1
This commit is contained in:
@@ -9,6 +9,7 @@ namespace Barotrauma.Networking
|
||||
struct TempClient
|
||||
{
|
||||
public string Name;
|
||||
public string PreferredJob;
|
||||
public UInt16 NameID;
|
||||
public UInt64 SteamID;
|
||||
public byte ID;
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace Barotrauma
|
||||
Item.ReadSpawnData(message, true);
|
||||
break;
|
||||
case (byte)SpawnableType.Character:
|
||||
Character.ReadSpawnData(message, true);
|
||||
Character.ReadSpawnData(message);
|
||||
break;
|
||||
default:
|
||||
DebugConsole.ThrowError("Received invalid entity spawn message (unknown spawnable type)");
|
||||
|
||||
@@ -164,8 +164,8 @@ namespace Barotrauma.Networking
|
||||
|
||||
private Dictionary<FileTransferType, string> downloadFolders = new Dictionary<FileTransferType, string>()
|
||||
{
|
||||
{ FileTransferType.Submarine, "Submarines/Downloaded" },
|
||||
{ FileTransferType.CampaignSave, "Data/Saves/Multiplayer" }
|
||||
{ FileTransferType.Submarine, SaveUtil.SubmarineDownloadFolder },
|
||||
{ FileTransferType.CampaignSave, SaveUtil.CampaignDownloadFolder }
|
||||
};
|
||||
|
||||
public List<FileTransferIn> ActiveTransfers
|
||||
|
||||
@@ -29,8 +29,14 @@ namespace Barotrauma.Networking
|
||||
|
||||
public void SetName(string value)
|
||||
{
|
||||
value = value.Replace(":", "").Replace(";", "");
|
||||
if (string.IsNullOrEmpty(value)) { return; }
|
||||
name = value.Replace(":", "").Replace(";", "");
|
||||
name = value;
|
||||
nameId++;
|
||||
}
|
||||
|
||||
public void ForceNameAndJobUpdate()
|
||||
{
|
||||
nameId++;
|
||||
}
|
||||
|
||||
@@ -265,9 +271,9 @@ namespace Barotrauma.Networking
|
||||
private void ConnectToServer(object endpoint, string hostName)
|
||||
{
|
||||
chatBox.InputBox.Enabled = false;
|
||||
if (GameMain.NetLobbyScreen?.TextBox != null)
|
||||
if (GameMain.NetLobbyScreen?.ChatInput != null)
|
||||
{
|
||||
GameMain.NetLobbyScreen.TextBox.Enabled = false;
|
||||
GameMain.NetLobbyScreen.ChatInput.Enabled = false;
|
||||
}
|
||||
|
||||
serverName = hostName;
|
||||
@@ -334,7 +340,7 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
SteamManager.Instance.User.ClearRichPresence();
|
||||
SteamManager.Instance.User.SetRichPresence("status", "Playing on " + serverName);
|
||||
SteamManager.Instance.User.SetRichPresence("connect", "-connect \"" + serverName.Replace("\"","\\\"") + "\" " + serverEndpoint);
|
||||
SteamManager.Instance.User.SetRichPresence("connect", "-connect \"" + serverName.Replace("\"", "\\\"") + "\" " + serverEndpoint);
|
||||
}
|
||||
|
||||
canStart = true;
|
||||
@@ -348,9 +354,9 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
|
||||
chatBox.InputBox.Enabled = true;
|
||||
if (GameMain.NetLobbyScreen?.TextBox != null)
|
||||
if (GameMain.NetLobbyScreen?.ChatInput != null)
|
||||
{
|
||||
GameMain.NetLobbyScreen.TextBox.Enabled = true;
|
||||
GameMain.NetLobbyScreen.ChatInput.Enabled = true;
|
||||
}
|
||||
};
|
||||
clientPeer.OnRequestPassword = (int salt, int retries) =>
|
||||
@@ -370,9 +376,9 @@ namespace Barotrauma.Networking
|
||||
DebugConsole.ThrowError("Couldn't connect to " + endpoint.ToString() + ". Error message: " + e.Message);
|
||||
Disconnect();
|
||||
chatBox.InputBox.Enabled = true;
|
||||
if (GameMain.NetLobbyScreen?.TextBox != null)
|
||||
if (GameMain.NetLobbyScreen?.ChatInput != null)
|
||||
{
|
||||
GameMain.NetLobbyScreen.TextBox.Enabled = true;
|
||||
GameMain.NetLobbyScreen.ChatInput.Enabled = true;
|
||||
}
|
||||
GameMain.ServerListScreen.Select();
|
||||
return;
|
||||
@@ -630,11 +636,14 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (IsServerOwner && connected && !connectCancelled)
|
||||
{
|
||||
if (GameMain.ServerChildProcess?.HasExited ?? true)
|
||||
if (GameMain.WindowActive)
|
||||
{
|
||||
Disconnect();
|
||||
var msgBox = new GUIMessageBox(TextManager.Get("ConnectionLost"), TextManager.Get("ServerProcessClosed"));
|
||||
msgBox.Buttons[0].OnClicked += ReturnToPreviousMenu;
|
||||
if (GameMain.ServerChildProcess?.HasExited ?? true)
|
||||
{
|
||||
Disconnect();
|
||||
var msgBox = new GUIMessageBox(TextManager.Get("ConnectionLost"), TextManager.Get("ServerProcessClosed"));
|
||||
msgBox.Buttons[0].OnClicked += ReturnToPreviousMenu;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -747,7 +756,7 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
saveFiles.Add(inc.ReadString());
|
||||
}
|
||||
GameMain.NetLobbyScreen.CampaignSetupUI = MultiPlayerCampaign.StartCampaignSetup(serverSubmarines, saveFiles);
|
||||
MultiPlayerCampaign.StartCampaignSetup(saveFiles);
|
||||
break;
|
||||
case ServerPacketHeader.PERMISSIONS:
|
||||
ReadPermissions(inc);
|
||||
@@ -768,7 +777,12 @@ namespace Barotrauma.Networking
|
||||
SteamAchievementManager.CheatsEnabled = cheatsEnabled;
|
||||
if (cheatsEnabled)
|
||||
{
|
||||
new GUIMessageBox(TextManager.Get("CheatsEnabledTitle"), TextManager.Get("CheatsEnabledDescription"));
|
||||
var cheatMessageBox = new GUIMessageBox(TextManager.Get("CheatsEnabledTitle"), TextManager.Get("CheatsEnabledDescription"));
|
||||
cheatMessageBox.Buttons[0].OnClicked += (btn, userdata) =>
|
||||
{
|
||||
DebugConsole.TextBox.Select();
|
||||
return true;
|
||||
};
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -778,6 +792,9 @@ namespace Barotrauma.Networking
|
||||
case ServerPacketHeader.TRAITOR_MESSAGE:
|
||||
ReadTraitorMessage(inc);
|
||||
break;
|
||||
case ServerPacketHeader.MISSION:
|
||||
GameMain.GameSession.Mission?.ClientRead(inc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -958,16 +975,13 @@ namespace Barotrauma.Networking
|
||||
switch(messageType) {
|
||||
case TraitorMessageType.Objective:
|
||||
var isTraitor = !string.IsNullOrEmpty(message);
|
||||
SpawnAsTraitor = isTraitor;
|
||||
TraitorFirstObjective = message;
|
||||
if (Character != null)
|
||||
{
|
||||
Character.IsTraitor = isTraitor;
|
||||
Character.TraitorCurrentObjective = message;
|
||||
}
|
||||
else
|
||||
{
|
||||
SpawnAsTraitor = isTraitor;
|
||||
TraitorFirstObjective = message;
|
||||
}
|
||||
break;
|
||||
case TraitorMessageType.Console:
|
||||
GameMain.Client.AddChatMessage(ChatMessage.Create("", message, ChatMessageType.Console, null));
|
||||
@@ -1153,6 +1167,21 @@ namespace Barotrauma.Networking
|
||||
GameMain.NetLobbyScreen.SelectedSub.MD5Hash?.Hash != subHash)
|
||||
{
|
||||
string errorMsg = "Failed to select submarine \"" + subName + "\" (hash: " + subHash + ").";
|
||||
if (GameMain.NetLobbyScreen.SelectedSub == null)
|
||||
{
|
||||
errorMsg += "\n" + "SelectedSub is null";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GameMain.NetLobbyScreen.SelectedSub.Name != subName)
|
||||
{
|
||||
errorMsg += "\n" + "Name mismatch: " + GameMain.NetLobbyScreen.SelectedSub.Name + " != " + subName;
|
||||
}
|
||||
if (GameMain.NetLobbyScreen.SelectedSub.MD5Hash?.Hash != subHash)
|
||||
{
|
||||
errorMsg += "\n" + "Hash mismatch: " + GameMain.NetLobbyScreen.SelectedSub.MD5Hash?.Hash + " != " + subHash;
|
||||
}
|
||||
}
|
||||
DebugConsole.ThrowError(errorMsg);
|
||||
GameAnalyticsManager.AddErrorEventOnce("GameClient.StartGame:FailedToSelectSub" + subName, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg);
|
||||
CoroutineManager.StartCoroutine(EndGame(""));
|
||||
@@ -1316,6 +1345,7 @@ namespace Barotrauma.Networking
|
||||
UInt64 steamId = inc.ReadUInt64();
|
||||
UInt16 nameId = inc.ReadUInt16();
|
||||
string name = inc.ReadString();
|
||||
string preferredJob = inc.ReadString();
|
||||
UInt16 characterID = inc.ReadUInt16();
|
||||
bool muted = inc.ReadBoolean();
|
||||
bool allowKicking = inc.ReadBoolean();
|
||||
@@ -1327,6 +1357,7 @@ namespace Barotrauma.Networking
|
||||
NameID = nameId,
|
||||
SteamID = steamId,
|
||||
Name = name,
|
||||
PreferredJob = preferredJob,
|
||||
CharacterID = characterID,
|
||||
Muted = muted,
|
||||
AllowKicking = allowKicking
|
||||
@@ -1353,9 +1384,11 @@ namespace Barotrauma.Networking
|
||||
GameMain.NetLobbyScreen.AddPlayer(existingClient);
|
||||
}
|
||||
existingClient.NameID = tc.NameID;
|
||||
existingClient.PreferredJob = tc.PreferredJob;
|
||||
existingClient.Character = null;
|
||||
existingClient.Muted = tc.Muted;
|
||||
existingClient.AllowKicking = tc.AllowKicking;
|
||||
GameMain.NetLobbyScreen.SetPlayerNameAndJobPreference(existingClient);
|
||||
if (tc.CharacterID > 0)
|
||||
{
|
||||
existingClient.Character = Entity.FindEntityByID(tc.CharacterID) as Character;
|
||||
@@ -1443,7 +1476,7 @@ namespace Barotrauma.Networking
|
||||
bool allowSpectating = inc.ReadBoolean();
|
||||
|
||||
YesNoMaybe traitorsEnabled = (YesNoMaybe)inc.ReadRangedInteger(0, 2);
|
||||
int missionTypeIndex = inc.ReadRangedInteger(0, Enum.GetValues(typeof(MissionType)).Length - 1);
|
||||
MissionType missionType = (MissionType)inc.ReadRangedInteger(0, (int)MissionType.All);
|
||||
int modeIndex = inc.ReadByte();
|
||||
|
||||
string levelSeed = inc.ReadString();
|
||||
@@ -1461,7 +1494,11 @@ namespace Barotrauma.Networking
|
||||
ReadWriteMessage settingsBuf = new ReadWriteMessage();
|
||||
settingsBuf.Write(settingsData, 0, settingsLen); settingsBuf.BitPosition = 0;
|
||||
serverSettings.ClientRead(settingsBuf);
|
||||
|
||||
if (!IsServerOwner)
|
||||
{
|
||||
ServerInfo info = GameMain.ServerListScreen.UpdateServerInfoWithServerSettings(serverEndpoint, serverSettings);
|
||||
GameMain.ServerListScreen.AddToRecentServers(info);
|
||||
}
|
||||
|
||||
GameMain.NetLobbyScreen.LastUpdateID = updateID;
|
||||
|
||||
@@ -1475,7 +1512,7 @@ namespace Barotrauma.Networking
|
||||
GameMain.NetLobbyScreen.TrySelectSub(selectShuttleName, selectShuttleHash, GameMain.NetLobbyScreen.ShuttleList.ListBox);
|
||||
|
||||
GameMain.NetLobbyScreen.SetTraitorsEnabled(traitorsEnabled);
|
||||
GameMain.NetLobbyScreen.SetMissionType(missionTypeIndex);
|
||||
GameMain.NetLobbyScreen.SetMissionType(missionType);
|
||||
|
||||
if (!allowModeVoting) GameMain.NetLobbyScreen.SelectMode(modeIndex);
|
||||
|
||||
@@ -1649,6 +1686,15 @@ namespace Barotrauma.Networking
|
||||
outmsg.Write(LastClientListUpdateID);
|
||||
outmsg.Write(nameId);
|
||||
outmsg.Write(name);
|
||||
var jobPreferences = GameMain.NetLobbyScreen.JobPreferences;
|
||||
if (jobPreferences.Count > 0)
|
||||
{
|
||||
outmsg.Write(jobPreferences[0].First.Identifier);
|
||||
}
|
||||
else
|
||||
{
|
||||
outmsg.Write("");
|
||||
}
|
||||
|
||||
var campaign = GameMain.GameSession?.GameMode as MultiPlayerCampaign;
|
||||
if (campaign == null || campaign.LastSaveID == 0)
|
||||
@@ -1722,7 +1768,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
public void SendChatMessage(ChatMessage msg)
|
||||
{
|
||||
if (clientPeer.ServerConnection == null) return;
|
||||
if (clientPeer?.ServerConnection == null) { return; }
|
||||
lastQueueChatMsgID++;
|
||||
msg.NetStateID = lastQueueChatMsgID;
|
||||
chatMsgQueue.Add(msg);
|
||||
@@ -1730,7 +1776,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
public void SendChatMessage(string message, ChatMessageType type = ChatMessageType.Default)
|
||||
{
|
||||
if (clientPeer.ServerConnection == null) return;
|
||||
if (clientPeer?.ServerConnection == null) { return; }
|
||||
|
||||
ChatMessage chatMessage = ChatMessage.Create(
|
||||
gameStarted && myCharacter != null ? myCharacter.Name : name,
|
||||
@@ -1809,19 +1855,6 @@ namespace Barotrauma.Networking
|
||||
subElement.GetChild<GUITextBlock>().TextColor = new Color(subElement.GetChild<GUITextBlock>().TextColor, 1.0f);
|
||||
subElement.UserData = newSub;
|
||||
subElement.ToolTip = newSub.Description;
|
||||
|
||||
GUIButton infoButton = subElement.GetChild<GUIButton>();
|
||||
if (infoButton == null)
|
||||
{
|
||||
int buttonSize = (int)(subElement.Rect.Height * 0.8f);
|
||||
infoButton = new GUIButton(new RectTransform(new Point(buttonSize), subElement.RectTransform, Anchor.CenterLeft) { AbsoluteOffset = new Point((int)(buttonSize * 0.2f), 0) }, "?");
|
||||
}
|
||||
infoButton.UserData = newSub;
|
||||
infoButton.OnClicked = (component, userdata) =>
|
||||
{
|
||||
((Submarine)userdata).CreatePreviewWindow(new GUIMessageBox("", "", new Vector2(0.25f, 0.25f), new Point(500, 400)));
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
if (GameMain.NetLobbyScreen.FailedSelectedSub != null &&
|
||||
@@ -1850,9 +1883,12 @@ namespace Barotrauma.Networking
|
||||
string subPath = Path.Combine(SaveUtil.TempPath, gameSessionDoc.Root.GetAttributeString("submarine", "")) + ".sub";
|
||||
GameMain.GameSession.Submarine = new Submarine(subPath, "");
|
||||
}
|
||||
|
||||
SaveUtil.LoadGame(GameMain.GameSession.SavePath, GameMain.GameSession);
|
||||
GameMain.GameSession?.Submarine?.CheckSubsLeftBehind();
|
||||
if (GameMain.GameSession?.Submarine?.Name != null)
|
||||
{
|
||||
GameMain.NetLobbyScreen.TryDisplayCampaignSubmarine(GameMain.GameSession.Submarine);
|
||||
}
|
||||
campaign.LastSaveID = campaign.PendingSaveID;
|
||||
|
||||
DebugConsole.Log("Campaign save received, save ID " + campaign.LastSaveID);
|
||||
@@ -1940,6 +1976,8 @@ namespace Barotrauma.Networking
|
||||
GameMain.ServerChildProcess = null;
|
||||
}
|
||||
|
||||
characterInfo?.Remove();
|
||||
|
||||
VoipClient?.Dispose();
|
||||
VoipClient = null;
|
||||
GameMain.Client = null;
|
||||
@@ -1963,7 +2001,8 @@ namespace Barotrauma.Networking
|
||||
msg.Write((byte)count);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
msg.Write(jobPreferences[i].Identifier);
|
||||
msg.Write(jobPreferences[i].First.Identifier);
|
||||
msg.Write((byte)jobPreferences[i].Second);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2137,6 +2176,8 @@ namespace Barotrauma.Networking
|
||||
|
||||
public void SetupNewCampaign(Submarine sub, string saveName, string mapSeed)
|
||||
{
|
||||
GameMain.NetLobbyScreen.CampaignSetupFrame.Visible = false;
|
||||
|
||||
saveName = Path.GetFileNameWithoutExtension(saveName);
|
||||
|
||||
IWriteMessage msg = new WriteOnlyMessage();
|
||||
@@ -2149,12 +2190,12 @@ namespace Barotrauma.Networking
|
||||
msg.Write(sub.MD5Hash.Hash);
|
||||
|
||||
clientPeer.Send(msg, DeliveryMethod.Reliable);
|
||||
|
||||
GameMain.NetLobbyScreen.CampaignSetupUI = null;
|
||||
}
|
||||
|
||||
public void SetupLoadCampaign(string saveName)
|
||||
{
|
||||
GameMain.NetLobbyScreen.CampaignSetupFrame.Visible = false;
|
||||
|
||||
IWriteMessage msg = new WriteOnlyMessage();
|
||||
msg.Write((byte)ClientPacketHeader.CAMPAIGN_SETUP_INFO);
|
||||
|
||||
@@ -2162,8 +2203,6 @@ namespace Barotrauma.Networking
|
||||
msg.Write(saveName);
|
||||
|
||||
clientPeer.Send(msg, DeliveryMethod.Reliable);
|
||||
|
||||
GameMain.NetLobbyScreen.CampaignSetupUI = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -2278,7 +2317,11 @@ namespace Barotrauma.Networking
|
||||
|
||||
SendChatMessage(message);
|
||||
|
||||
textBox.Deselect();
|
||||
if (textBox.DeselectAfterMessage)
|
||||
{
|
||||
textBox.Deselect();
|
||||
}
|
||||
|
||||
textBox.Text = "";
|
||||
|
||||
return true;
|
||||
@@ -2292,6 +2335,7 @@ namespace Barotrauma.Networking
|
||||
Screen.Selected == GameMain.GameScreen)
|
||||
{
|
||||
inGameHUD.AddToGUIUpdateList();
|
||||
GameMain.NetLobbyScreen.FileTransferFrame?.AddToGUIUpdateList();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2305,7 +2349,7 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
else if (Screen.Selected == GameMain.NetLobbyScreen)
|
||||
{
|
||||
msgBox = GameMain.NetLobbyScreen.TextBox;
|
||||
msgBox = GameMain.NetLobbyScreen.ChatInput;
|
||||
}
|
||||
|
||||
if (gameStarted && Screen.Selected == GameMain.GameScreen)
|
||||
@@ -2358,46 +2402,26 @@ namespace Barotrauma.Networking
|
||||
public virtual void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch)
|
||||
{
|
||||
if (GUI.DisableHUD || GUI.DisableUpperHUD) return;
|
||||
|
||||
|
||||
if (fileReceiver != null && fileReceiver.ActiveTransfers.Count > 0)
|
||||
{
|
||||
Vector2 downloadBarSize = new Vector2(250, 35) * GUI.Scale;
|
||||
Vector2 pos = new Vector2(GameMain.NetLobbyScreen.InfoFrame.Rect.X, GameMain.GraphicsHeight - downloadBarSize.Y - 5);
|
||||
|
||||
GUI.DrawRectangle(spriteBatch, new Rectangle(
|
||||
(int)pos.X,
|
||||
(int)pos.Y,
|
||||
(int)(fileReceiver.ActiveTransfers.Count * (downloadBarSize.X + 10)),
|
||||
(int)downloadBarSize.Y),
|
||||
Color.Black * 0.8f, true);
|
||||
|
||||
for (int i = 0; i < fileReceiver.ActiveTransfers.Count; i++)
|
||||
{
|
||||
var transfer = fileReceiver.ActiveTransfers[i];
|
||||
|
||||
GUI.DrawString(spriteBatch,
|
||||
pos,
|
||||
ToolBox.LimitString(TextManager.GetWithVariable("DownloadingFile", "[filename]", transfer.FileName), GUI.SmallFont, (int)downloadBarSize.X),
|
||||
Color.White, null, 0, GUI.SmallFont);
|
||||
GUI.DrawProgressBar(spriteBatch, new Vector2(pos.X, -pos.Y - downloadBarSize.Y / 2), new Vector2(downloadBarSize.X * 0.7f, downloadBarSize.Y / 2), transfer.Progress, Color.Green);
|
||||
GUI.DrawString(spriteBatch, pos + new Vector2(5, downloadBarSize.Y / 2),
|
||||
MathUtils.GetBytesReadable((long)transfer.Received) + " / " + MathUtils.GetBytesReadable((long)transfer.FileSize),
|
||||
Color.White, null, 0, GUI.SmallFont);
|
||||
|
||||
if (GUI.DrawButton(spriteBatch, new Rectangle(
|
||||
(int)(pos.X + downloadBarSize.X * 0.7f), (int)(pos.Y + downloadBarSize.Y / 2),
|
||||
(int)(downloadBarSize.X * 0.3f), (int)(downloadBarSize.Y / 2)),
|
||||
TextManager.Get("Cancel"), new Color(0.47f, 0.13f, 0.15f, 0.08f)))
|
||||
{
|
||||
CancelFileTransfer(transfer);
|
||||
fileReceiver.StopTransfer(transfer);
|
||||
}
|
||||
|
||||
pos.X += (downloadBarSize.X + 10);
|
||||
}
|
||||
var transfer = fileReceiver.ActiveTransfers.First();
|
||||
GameMain.NetLobbyScreen.FileTransferFrame.Visible = true;
|
||||
GameMain.NetLobbyScreen.FileTransferTitle.Text =
|
||||
ToolBox.LimitString(
|
||||
TextManager.GetWithVariable("DownloadingFile", "[filename]", transfer.FileName),
|
||||
GameMain.NetLobbyScreen.FileTransferTitle.Font,
|
||||
GameMain.NetLobbyScreen.FileTransferTitle.Rect.Width);
|
||||
GameMain.NetLobbyScreen.FileTransferProgressBar.BarSize = transfer.Progress;
|
||||
GameMain.NetLobbyScreen.FileTransferProgressText.Text =
|
||||
MathUtils.GetBytesReadable((long)transfer.Received) + " / " + MathUtils.GetBytesReadable((long)transfer.FileSize);
|
||||
}
|
||||
|
||||
if (!gameStarted || Screen.Selected != GameMain.GameScreen) return;
|
||||
else
|
||||
{
|
||||
GameMain.NetLobbyScreen.FileTransferFrame.Visible = false;
|
||||
}
|
||||
|
||||
if (!gameStarted || Screen.Selected != GameMain.GameScreen) { return; }
|
||||
|
||||
inGameHUD.DrawManually(spriteBatch);
|
||||
|
||||
|
||||
@@ -169,7 +169,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
outMsg.Write(GameMain.Version.ToString());
|
||||
|
||||
IEnumerable<ContentPackage> mpContentPackages = GameMain.SelectedPackages.Where(cp => cp.HasMultiplayerIncompatibleContent);
|
||||
IEnumerable<ContentPackage> mpContentPackages = GameMain.SelectedPackages.Where(cp => cp.HasMultiplayerIncompatibleContent && !cp.NeedsRestart);
|
||||
outMsg.WriteVariableInt32(mpContentPackages.Count());
|
||||
foreach (ContentPackage contentPackage in mpContentPackages)
|
||||
{
|
||||
|
||||
+1
-1
@@ -202,7 +202,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
outMsg.Write(GameMain.Version.ToString());
|
||||
|
||||
IEnumerable<ContentPackage> mpContentPackages = GameMain.SelectedPackages.Where(cp => cp.HasMultiplayerIncompatibleContent);
|
||||
IEnumerable<ContentPackage> mpContentPackages = GameMain.SelectedPackages.Where(cp => cp.HasMultiplayerIncompatibleContent && !cp.NeedsRestart);
|
||||
outMsg.WriteVariableUInt32((UInt32)mpContentPackages.Count());
|
||||
foreach (ContentPackage contentPackage in mpContentPackages)
|
||||
{
|
||||
|
||||
@@ -3,6 +3,8 @@ using Microsoft.Xna.Framework;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Barotrauma.Networking
|
||||
{
|
||||
@@ -10,8 +12,11 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
public string IP;
|
||||
public string Port;
|
||||
public string QueryPort;
|
||||
|
||||
public UInt64 LobbyID;
|
||||
public UInt64 OwnerID;
|
||||
public bool OwnerVerified;
|
||||
|
||||
public string ServerName;
|
||||
public string ServerMessage;
|
||||
@@ -30,12 +35,22 @@ namespace Barotrauma.Networking
|
||||
public SelectionMode? SubSelectionMode;
|
||||
public bool? AllowSpectating;
|
||||
public bool? VoipEnabled;
|
||||
public bool? KarmaEnabled;
|
||||
public bool? FriendlyFireEnabled;
|
||||
public bool? AllowRespawn;
|
||||
public YesNoMaybe? TraitorsEnabled;
|
||||
public string GameMode;
|
||||
public PlayStyle? PlayStyle;
|
||||
|
||||
public bool Recent;
|
||||
public bool Favorite;
|
||||
|
||||
public bool? RespondedToSteamQuery = null;
|
||||
|
||||
public Facepunch.Steamworks.SteamFriend SteamFriend;
|
||||
public Facepunch.Steamworks.ISteamMatchmakingPingResponse MatchmakingPingResponse;
|
||||
public int? PingHQuery;
|
||||
|
||||
public string GameVersion;
|
||||
public List<string> ContentPackageNames
|
||||
{
|
||||
@@ -85,59 +100,100 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (frame == null) return;
|
||||
|
||||
var previewContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 1.0f), frame.RectTransform, Anchor.Center))
|
||||
var previewContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 1.0f), frame.RectTransform, Anchor.Center))
|
||||
{
|
||||
Stretch = true
|
||||
};
|
||||
|
||||
var columnContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.5f), previewContainer.RectTransform))
|
||||
var titleContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.035f), previewContainer.RectTransform), true)
|
||||
{
|
||||
Color = Color.White * 0.2f
|
||||
};
|
||||
|
||||
var title = new GUITextBlock(new RectTransform(new Vector2(0.9f, 0.0f), titleContainer.RectTransform, Anchor.CenterLeft), ServerName, font: GUI.LargeFont)
|
||||
{
|
||||
ToolTip = ServerName
|
||||
};
|
||||
title.Text = ToolBox.LimitString(title.Text, title.Font, title.Rect.Width);
|
||||
|
||||
title.Padding = new Vector4(10, 0, 0, 10);
|
||||
|
||||
GUITickBox favoriteTickBox = new GUITickBox(new RectTransform(new Vector2(0.9f, 0.85f), titleContainer.RectTransform, Anchor.CenterRight, scaleBasis: ScaleBasis.BothHeight) { RelativeOffset = new Vector2(0.0f, 0.1f) }, "", null, "GUIServerListFavoriteTickBox")
|
||||
{
|
||||
Selected = Favorite,
|
||||
ToolTip = TextManager.Get(Favorite ? "removefromfavorites" : "addtofavorites"),
|
||||
OnSelected = (tickbox) =>
|
||||
{
|
||||
if (tickbox.Selected)
|
||||
{
|
||||
GameMain.ServerListScreen.AddToFavoriteServers(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
GameMain.ServerListScreen.RemoveFromFavoriteServers(this);
|
||||
}
|
||||
tickbox.ToolTip = TextManager.Get(tickbox.Selected ? "removefromfavorites" : "addtofavorites");
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), previewContainer.RectTransform),
|
||||
TextManager.AddPunctuation(':', TextManager.Get("ServerListVersion"), string.IsNullOrEmpty(GameVersion) ? TextManager.Get("Unknown") : GameVersion));
|
||||
|
||||
PlayStyle playStyle = PlayStyle ?? Networking.PlayStyle.Serious;
|
||||
|
||||
Sprite playStyleBannerSprite = GameMain.ServerListScreen.PlayStyleBanners[(int)playStyle];
|
||||
float playStyleBannerAspectRatio = playStyleBannerSprite.SourceRect.Width / (playStyleBannerSprite.SourceRect.Height * 0.65f);
|
||||
var playStyleBanner = new GUIImage(new RectTransform(new Vector2(1.0f, 1.0f / playStyleBannerAspectRatio), previewContainer.RectTransform, Anchor.TopCenter, scaleBasis: ScaleBasis.BothWidth),
|
||||
playStyleBannerSprite, null, true);
|
||||
|
||||
var playStyleName = new GUITextBlock(new RectTransform(new Vector2(0.15f, 0.0f), playStyleBanner.RectTransform) { RelativeOffset = new Vector2(0.01f, 0.06f) },
|
||||
TextManager.AddPunctuation(':', TextManager.Get("serverplaystyle"), TextManager.Get("servertag."+ playStyle)), textColor: Color.White,
|
||||
font: GUI.SmallFont, textAlignment: Alignment.Center,
|
||||
color: GameMain.ServerListScreen.PlayStyleColors[(int)playStyle], style: "GUISlopedHeader");
|
||||
playStyleName.RectTransform.NonScaledSize = (playStyleName.Font.MeasureString(playStyleName.Text) + new Vector2(20, 5) * GUI.Scale).ToPoint();
|
||||
playStyleName.RectTransform.IsFixedSize = true;
|
||||
|
||||
|
||||
var columnContainer = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.45f), previewContainer.RectTransform), isHorizontal: true)
|
||||
{
|
||||
Stretch = true
|
||||
};
|
||||
|
||||
// Left column -------------------------------------------------------------------------------
|
||||
var leftColumnHolder = new GUILayoutGroup(new RectTransform(new Vector2(0.75f, 1.0f), columnContainer.RectTransform), childAnchor: Anchor.Center)
|
||||
{
|
||||
Stretch = true
|
||||
};
|
||||
|
||||
var leftColumn = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 1.0f), leftColumnHolder.RectTransform))
|
||||
{
|
||||
Stretch = true
|
||||
};
|
||||
|
||||
float elementHeight = 0.075f;
|
||||
|
||||
var title = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), columnContainer.RectTransform), ServerName, font: GUI.LargeFont);
|
||||
title.Text = ToolBox.LimitString(title.Text, title.Font, title.Rect.Width);
|
||||
// Spacing
|
||||
new GUIFrame(new RectTransform(new Vector2(1.0f, 0.025f), leftColumn.RectTransform), style: null);
|
||||
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), columnContainer.RectTransform),
|
||||
TextManager.AddPunctuation(':', TextManager.Get("ServerListVersion"), string.IsNullOrEmpty(GameVersion) ? TextManager.Get("Unknown") : GameVersion));
|
||||
var serverMsg = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.3f), leftColumn.RectTransform)) { ScrollBarVisible = true };
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), serverMsg.Content.RectTransform), ServerMessage, font: GUI.SmallFont, wrap: true) { CanBeFocused = false };
|
||||
|
||||
// left column -----------------------------------------------------------------------------
|
||||
|
||||
//new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), columnLeft.RectTransform), IP + ":" + Port);
|
||||
|
||||
var serverMsg = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.5f), columnContainer.RectTransform)) { ScrollBarVisible = true };
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), serverMsg.Content.RectTransform), ServerMessage, wrap: true) { CanBeFocused = false };
|
||||
|
||||
// right column -----------------------------------------------------------------------------
|
||||
|
||||
/*var playerCount = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), columnRight.RectTransform), TextManager.Get("ServerListPlayers"));
|
||||
new GUITextBlock(new RectTransform(Vector2.One, playerCount.RectTransform), PlayerCount + "/" + MaxPlayers, textAlignment: Alignment.Right);
|
||||
|
||||
|
||||
new GUITickBox(new RectTransform(new Vector2(1, elementHeight), columnRight.RectTransform), "Round running")
|
||||
{
|
||||
Selected = GameStarted,
|
||||
CanBeFocused = false
|
||||
};*/
|
||||
|
||||
var gameMode = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), columnContainer.RectTransform), TextManager.Get("GameMode"));
|
||||
var gameMode = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), leftColumn.RectTransform), TextManager.Get("GameMode"));
|
||||
new GUITextBlock(new RectTransform(Vector2.One, gameMode.RectTransform),
|
||||
TextManager.Get(string.IsNullOrEmpty(GameMode) ? "Unknown" : "GameMode." + GameMode, returnNull: true) ?? GameMode,
|
||||
textAlignment: Alignment.Right);
|
||||
|
||||
var traitors = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), columnContainer.RectTransform), TextManager.Get("Traitors"));
|
||||
/*var traitors = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), bodyContainer.RectTransform), TextManager.Get("Traitors"));
|
||||
new GUITextBlock(new RectTransform(Vector2.One, traitors.RectTransform), TextManager.Get(!TraitorsEnabled.HasValue ? "Unknown" : TraitorsEnabled.Value.ToString()), textAlignment: Alignment.Right);*/
|
||||
|
||||
new GUITextBlock(new RectTransform(Vector2.One, traitors.RectTransform), TextManager.Get(!TraitorsEnabled.HasValue ? "Unknown" : TraitorsEnabled.Value.ToString()), textAlignment: Alignment.Right);
|
||||
|
||||
var subSelection = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), columnContainer.RectTransform), TextManager.Get("ServerListSubSelection"));
|
||||
var subSelection = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), leftColumn.RectTransform), TextManager.Get("ServerListSubSelection"));
|
||||
new GUITextBlock(new RectTransform(Vector2.One, subSelection.RectTransform), TextManager.Get(!SubSelectionMode.HasValue ? "Unknown" : SubSelectionMode.Value.ToString()), textAlignment: Alignment.Right);
|
||||
|
||||
var modeSelection = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), columnContainer.RectTransform), TextManager.Get("ServerListModeSelection"));
|
||||
var modeSelection = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), leftColumn.RectTransform), TextManager.Get("ServerListModeSelection"));
|
||||
new GUITextBlock(new RectTransform(Vector2.One, modeSelection.RectTransform), TextManager.Get(!ModeSelectionMode.HasValue ? "Unknown" : ModeSelectionMode.Value.ToString()), textAlignment: Alignment.Right);
|
||||
|
||||
var allowSpectating = new GUITickBox(new RectTransform(new Vector2(1, elementHeight), columnContainer.RectTransform), TextManager.Get("ServerListAllowSpectating"))
|
||||
var allowSpectating = new GUITickBox(new RectTransform(new Vector2(1, elementHeight), leftColumn.RectTransform), TextManager.Get("ServerListAllowSpectating"))
|
||||
{
|
||||
CanBeFocused = false
|
||||
};
|
||||
@@ -146,7 +202,7 @@ namespace Barotrauma.Networking
|
||||
else
|
||||
allowSpectating.Selected = AllowSpectating.Value;
|
||||
|
||||
var allowRespawn = new GUITickBox(new RectTransform(new Vector2(1, elementHeight), columnContainer.RectTransform), TextManager.Get("ServerSettingsAllowRespawning"))
|
||||
var allowRespawn = new GUITickBox(new RectTransform(new Vector2(1, elementHeight), leftColumn.RectTransform), TextManager.Get("ServerSettingsAllowRespawning"))
|
||||
{
|
||||
CanBeFocused = false
|
||||
};
|
||||
@@ -155,16 +211,16 @@ namespace Barotrauma.Networking
|
||||
else
|
||||
allowRespawn.Selected = AllowRespawn.Value;
|
||||
|
||||
var voipEnabledTickBox = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), columnContainer.RectTransform), TextManager.Get("serversettingsvoicechatenabled"))
|
||||
/*var voipEnabledTickBox = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), bodyContainer.RectTransform), TextManager.Get("serversettingsvoicechatenabled"))
|
||||
{
|
||||
CanBeFocused = false
|
||||
};
|
||||
if (!VoipEnabled.HasValue)
|
||||
new GUITextBlock(new RectTransform(new Vector2(0.8f, 0.8f), voipEnabledTickBox.Box.RectTransform, Anchor.Center), "?", textAlignment: Alignment.Center);
|
||||
else
|
||||
voipEnabledTickBox.Selected = VoipEnabled.Value;
|
||||
voipEnabledTickBox.Selected = VoipEnabled.Value;*/
|
||||
|
||||
var usingWhiteList = new GUITickBox(new RectTransform(new Vector2(1, elementHeight), columnContainer.RectTransform), TextManager.Get("ServerListUsingWhitelist"))
|
||||
var usingWhiteList = new GUITickBox(new RectTransform(new Vector2(1, elementHeight), leftColumn.RectTransform), TextManager.Get("ServerListUsingWhitelist"))
|
||||
{
|
||||
CanBeFocused = false
|
||||
};
|
||||
@@ -174,15 +230,15 @@ namespace Barotrauma.Networking
|
||||
usingWhiteList.Selected = UsingWhiteList.Value;
|
||||
|
||||
|
||||
columnContainer.RectTransform.SizeChanged += () =>
|
||||
leftColumn.RectTransform.SizeChanged += () =>
|
||||
{
|
||||
GUITextBlock.AutoScaleAndNormalize(allowSpectating.TextBlock, allowRespawn.TextBlock, voipEnabledTickBox.TextBlock, usingWhiteList.TextBlock);
|
||||
GUITextBlock.AutoScaleAndNormalize(allowSpectating.TextBlock, allowRespawn.TextBlock, usingWhiteList.TextBlock);
|
||||
};
|
||||
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), columnContainer.RectTransform),
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), leftColumn.RectTransform),
|
||||
TextManager.Get("ServerListContentPackages"));
|
||||
|
||||
var contentPackageList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.3f), columnContainer.RectTransform)) { ScrollBarVisible = true };
|
||||
var contentPackageList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.2f), leftColumn.RectTransform)) { ScrollBarVisible = true };
|
||||
if (ContentPackageNames.Count == 0)
|
||||
{
|
||||
new GUITextBlock(new RectTransform(Vector2.One, contentPackageList.Content.RectTransform), TextManager.Get("Unknown"), textAlignment: Alignment.Center)
|
||||
@@ -231,7 +287,7 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
if (availableWorkshopUrls.Count > 0)
|
||||
{
|
||||
var workshopBtn = new GUIButton(new RectTransform(new Vector2(1.0f, 0.1f), columnContainer.RectTransform), TextManager.Get("ServerListSubscribeMissingPackages"))
|
||||
var workshopBtn = new GUIButton(new RectTransform(new Vector2(1.0f, 0.1f), leftColumn.RectTransform), TextManager.Get("ServerListSubscribeMissingPackages"))
|
||||
{
|
||||
ToolTip = TextManager.Get(SteamManager.IsInitialized ? "ServerListSubscribeMissingPackagesTooltip" : "ServerListSubscribeMissingPackagesTooltipNoSteam"),
|
||||
Enabled = SteamManager.IsInitialized,
|
||||
@@ -246,12 +302,237 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
}
|
||||
|
||||
// Spacing
|
||||
new GUIFrame(new RectTransform(new Vector2(1.0f, 0.02f), leftColumn.RectTransform), style: null);
|
||||
|
||||
// Right column ------------------------------------------------------------------------------
|
||||
|
||||
var rightColumnBackground = new GUIFrame(new RectTransform(new Vector2(0.2f, 1.0f), columnContainer.RectTransform), style: null)
|
||||
{
|
||||
Color = Color.Black * 0.25f
|
||||
};
|
||||
|
||||
var rightColumn = new GUILayoutGroup(new RectTransform(new Vector2(0.95f, 1.0f), rightColumnBackground.RectTransform, Anchor.Center));
|
||||
|
||||
// playstyle tags -----------------------------------------------------------------------------
|
||||
|
||||
var playStyleTags = GetPlayStyleTags();
|
||||
foreach (string tag in playStyleTags)
|
||||
{
|
||||
if (!GameMain.ServerListScreen.PlayStyleIcons.ContainsKey(tag)) { continue; }
|
||||
|
||||
new GUIImage(new RectTransform(Vector2.One, rightColumn.RectTransform, scaleBasis: ScaleBasis.BothWidth),
|
||||
GameMain.ServerListScreen.PlayStyleIcons[tag], scaleToFit: true)
|
||||
{
|
||||
ToolTip = TextManager.Get("servertagdescription." + tag),
|
||||
Color = GameMain.ServerListScreen.PlayStyleIconColors[tag]
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/*var playerCount = new GUITextBlock(new RectTransform(new Vector2(1.0f, elementHeight), columnRight.RectTransform), TextManager.Get("ServerListPlayers"));
|
||||
new GUITextBlock(new RectTransform(Vector2.One, playerCount.RectTransform), PlayerCount + "/" + MaxPlayers, textAlignment: Alignment.Right);
|
||||
|
||||
|
||||
new GUITickBox(new RectTransform(new Vector2(1, elementHeight), columnRight.RectTransform), "Round running")
|
||||
{
|
||||
Selected = GameStarted,
|
||||
CanBeFocused = false
|
||||
};*/
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
foreach (GUIComponent c in columnContainer.Children)
|
||||
foreach (GUIComponent c in leftColumn.Children)
|
||||
{
|
||||
if (c is GUITextBlock textBlock) textBlock.Padding = Vector4.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<string> GetPlayStyleTags()
|
||||
{
|
||||
List<string> tags = new List<string>();
|
||||
if (KarmaEnabled.HasValue)
|
||||
{
|
||||
tags.Add(KarmaEnabled.Value ? "karma.true" : "karma.false");
|
||||
}
|
||||
if (TraitorsEnabled.HasValue)
|
||||
{
|
||||
tags.Add(TraitorsEnabled.Value == YesNoMaybe.Maybe ?
|
||||
"traitors.maybe" :
|
||||
(TraitorsEnabled.Value == YesNoMaybe.Yes ? "traitors.true" : "traitors.false"));
|
||||
}
|
||||
if (VoipEnabled.HasValue)
|
||||
{
|
||||
tags.Add(VoipEnabled.Value ? "voip.true" : "voip.false");
|
||||
}
|
||||
if (FriendlyFireEnabled.HasValue)
|
||||
{
|
||||
tags.Add(FriendlyFireEnabled.Value ? "friendlyfire.true" : "friendlyfire.false");
|
||||
}
|
||||
if (ContentPackageNames.Count > 0)
|
||||
{
|
||||
tags.Add(ContentPackageNames.Count > 1 || ContentPackageNames[0] != GameMain.VanillaContent?.Name ? "modded.true" : "modded.false");
|
||||
}
|
||||
return tags;
|
||||
}
|
||||
|
||||
public static ServerInfo FromXElement(XElement element)
|
||||
{
|
||||
ServerInfo info = new ServerInfo()
|
||||
{
|
||||
ServerName = element.GetAttributeString("ServerName", ""),
|
||||
ServerMessage = element.GetAttributeString("ServerMessage", ""),
|
||||
IP = element.GetAttributeString("IP", ""),
|
||||
Port = element.GetAttributeString("Port", ""),
|
||||
QueryPort = element.GetAttributeString("QueryPort", ""),
|
||||
OwnerID = element.GetAttributeSteamID("OwnerID",0)
|
||||
};
|
||||
|
||||
info.RespondedToSteamQuery = null;
|
||||
|
||||
info.GameMode = element.GetAttributeString("GameMode", "");
|
||||
info.GameVersion = element.GetAttributeString("GameVersion", "");
|
||||
info.MaxPlayers = element.GetAttributeInt("MaxPlayers", 0);
|
||||
|
||||
if (Enum.TryParse(element.GetAttributeString("PlayStyle", ""), out PlayStyle playStyleTemp)) { info.PlayStyle = playStyleTemp; }
|
||||
if (bool.TryParse(element.GetAttributeString("UsingWhiteList", ""), out bool whitelistTemp)) { info.UsingWhiteList = whitelistTemp; }
|
||||
if (Enum.TryParse(element.GetAttributeString("TraitorsEnabled", ""), out YesNoMaybe traitorsTemp)) { info.TraitorsEnabled = traitorsTemp; }
|
||||
if (Enum.TryParse(element.GetAttributeString("SubSelectionMode", ""), out SelectionMode subSelectionTemp)) { info.SubSelectionMode = subSelectionTemp; }
|
||||
if (Enum.TryParse(element.GetAttributeString("ModeSelectionMode", ""), out SelectionMode modeSelectionTemp)) { info.ModeSelectionMode = subSelectionTemp; }
|
||||
if (bool.TryParse(element.GetAttributeString("VoipEnabled", ""), out bool voipTemp)) { info.VoipEnabled = voipTemp; }
|
||||
if (bool.TryParse(element.GetAttributeString("KarmaEnabled", ""), out bool karmaTemp)) { info.KarmaEnabled = karmaTemp; }
|
||||
if (bool.TryParse(element.GetAttributeString("FriendlyFireEnabled", ""), out bool friendlyFireTemp)) { info.FriendlyFireEnabled = friendlyFireTemp; }
|
||||
|
||||
info.HasPassword = element.GetAttributeBool("HasPassword", false);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
public void QueryLiveInfo(Action<Networking.ServerInfo> onServerRulesReceived)
|
||||
{
|
||||
if (!SteamManager.IsInitialized) { return; }
|
||||
|
||||
if (int.TryParse(QueryPort, out _))
|
||||
{
|
||||
if (PingHQuery != null)
|
||||
{
|
||||
SteamManager.Instance.ServerList.CancelHQuery(PingHQuery.Value);
|
||||
PingHQuery = null;
|
||||
}
|
||||
|
||||
MatchmakingPingResponse = new Facepunch.Steamworks.ISteamMatchmakingPingResponse(
|
||||
SteamManager.Instance.Client,
|
||||
(server) =>
|
||||
{
|
||||
ServerName = server.Name;
|
||||
RespondedToSteamQuery = true;
|
||||
PlayerCount = server.Players;
|
||||
MaxPlayers = server.MaxPlayers;
|
||||
HasPassword = server.Passworded;
|
||||
PingChecked = true;
|
||||
Ping = server.Ping;
|
||||
LobbyID = 0;
|
||||
server.FetchRules();
|
||||
server.OnReceivedRules += (bool received) => { SteamManager.OnReceivedRules(server, this, received); onServerRulesReceived?.Invoke(this); };
|
||||
},
|
||||
() =>
|
||||
{
|
||||
RespondedToSteamQuery = false;
|
||||
});
|
||||
|
||||
PingHQuery = SteamManager.Instance.ServerList.HQueryPing(MatchmakingPingResponse, IPAddress.Parse(IP), int.Parse(QueryPort));
|
||||
}
|
||||
else if (OwnerID != 0)
|
||||
{
|
||||
if (SteamFriend == null)
|
||||
{
|
||||
SteamFriend = SteamManager.Instance.Friends.Get(OwnerID);
|
||||
}
|
||||
if (LobbyID == 0)
|
||||
{
|
||||
SteamFriend.Refresh();
|
||||
if (SteamFriend.IsPlayingThisGame && SteamFriend.ServerLobbyId != 0)
|
||||
{
|
||||
LobbyID = SteamFriend.ServerLobbyId;
|
||||
SteamManager.Instance.LobbyList.SetManualLobbyDataCallback(LobbyID, (lobby) =>
|
||||
{
|
||||
SteamManager.Instance.LobbyList.SetManualLobbyDataCallback(LobbyID, null);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(lobby.GetData("haspassword"))) { return; }
|
||||
bool.TryParse(lobby.GetData("haspassword"), out bool hasPassword);
|
||||
int.TryParse(lobby.GetData("playercount"), out int currPlayers);
|
||||
int.TryParse(lobby.GetData("maxplayernum"), out int maxPlayers);
|
||||
//UInt64.TryParse(lobby.GetData("connectsteamid"), out ulong connectSteamId);
|
||||
string ip = lobby.GetData("hostipaddress");
|
||||
UInt64 ownerId = SteamManager.SteamIDStringToUInt64(lobby.GetData("lobbyowner"));
|
||||
|
||||
if (OwnerID != ownerId) { return; }
|
||||
|
||||
if (string.IsNullOrWhiteSpace(ip)) { ip = ""; }
|
||||
|
||||
ServerName = lobby.Name;
|
||||
Port = "";
|
||||
QueryPort = "";
|
||||
IP = ip;
|
||||
PlayerCount = currPlayers;
|
||||
MaxPlayers = maxPlayers;
|
||||
HasPassword = hasPassword;
|
||||
RespondedToSteamQuery = true;
|
||||
LobbyID = lobby.LobbyID;
|
||||
OwnerID = ownerId;
|
||||
PingChecked = false;
|
||||
OwnerVerified = true;
|
||||
SteamManager.AssignLobbyDataToServerInfo(lobby, this);
|
||||
|
||||
onServerRulesReceived?.Invoke(this);
|
||||
});
|
||||
SteamManager.Instance.LobbyList.RequestLobbyData(LobbyID);
|
||||
}
|
||||
else
|
||||
{
|
||||
RespondedToSteamQuery = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public XElement ToXElement()
|
||||
{
|
||||
if (OwnerID == 0 && string.IsNullOrEmpty(Port))
|
||||
{
|
||||
return null; //can't save this one since it's not set up correctly
|
||||
}
|
||||
|
||||
XElement element = new XElement("ServerInfo");
|
||||
|
||||
element.SetAttributeValue("ServerName", ServerName);
|
||||
element.SetAttributeValue("ServerMessage", ServerMessage);
|
||||
if (OwnerID == 0)
|
||||
{
|
||||
element.SetAttributeValue("IP", IP);
|
||||
element.SetAttributeValue("Port", Port);
|
||||
element.SetAttributeValue("QueryPort", QueryPort);
|
||||
}
|
||||
else
|
||||
{
|
||||
element.SetAttributeValue("OwnerID", SteamManager.SteamIDUInt64ToString(OwnerID));
|
||||
}
|
||||
|
||||
element.SetAttributeValue("GameMode", GameMode ?? "");
|
||||
element.SetAttributeValue("GameVersion", GameVersion ?? "");
|
||||
element.SetAttributeValue("MaxPlayers", MaxPlayers);
|
||||
if (PlayStyle.HasValue) { element.SetAttributeValue("PlayStyle", PlayStyle.Value.ToString()); }
|
||||
if (UsingWhiteList.HasValue) { element.SetAttributeValue("UsingWhiteList", UsingWhiteList.Value.ToString()); }
|
||||
if (TraitorsEnabled.HasValue) { element.SetAttributeValue("TraitorsEnabled", TraitorsEnabled.Value.ToString()); }
|
||||
if (SubSelectionMode.HasValue) { element.SetAttributeValue("SubSelectionMode", SubSelectionMode.Value.ToString()); }
|
||||
if (ModeSelectionMode.HasValue) { element.SetAttributeValue("ModeSelectionMode", ModeSelectionMode.Value.ToString()); }
|
||||
if (VoipEnabled.HasValue) { element.SetAttributeValue("VoipEnabled", VoipEnabled.Value.ToString()); }
|
||||
if (KarmaEnabled.HasValue) { element.SetAttributeValue("KarmaEnabled", KarmaEnabled.Value.ToString()); }
|
||||
if (FriendlyFireEnabled.HasValue) { element.SetAttributeValue("FriendlyFireEnabled", FriendlyFireEnabled.Value.ToString()); }
|
||||
element.SetAttributeValue("HasPassword", HasPassword.ToString());
|
||||
|
||||
return element;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,10 @@ namespace Barotrauma.Networking
|
||||
y += 20;
|
||||
}
|
||||
|
||||
GUITextBlock.AutoScaleAndNormalize(tickBoxes.Select(t => t.TextBlock));
|
||||
tickBoxes.Last().TextBlock.RectTransform.SizeChanged += () =>
|
||||
{
|
||||
GUITextBlock.AutoScaleAndNormalize(tickBoxes.Select(t => t.TextBlock));
|
||||
};
|
||||
|
||||
var currLines = lines.ToList();
|
||||
|
||||
@@ -81,26 +84,76 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (listBox.BarScroll == 0.0f || listBox.BarScroll == 1.0f) listBox.BarScroll = 1.0f;
|
||||
|
||||
GUIButton closeButton = new GUIButton(new RectTransform(new Vector2(0.25f, 0.05f), innerFrame.RectTransform, Anchor.BottomRight) { RelativeOffset = new Vector2(0.02f, 0.03f) }, TextManager.Get("Close"));
|
||||
closeButton.OnClicked = (button, userData) =>
|
||||
GUIButton closeButton = new GUIButton(new RectTransform(new Vector2(0.25f, 0.05f), innerFrame.RectTransform, Anchor.BottomRight) { RelativeOffset = new Vector2(0.02f, 0.03f) }, TextManager.Get("Close"))
|
||||
{
|
||||
LogFrame = null;
|
||||
return true;
|
||||
OnClicked = (button, userData) =>
|
||||
{
|
||||
LogFrame = null;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
msgFilter = "";
|
||||
}
|
||||
|
||||
public void AssignLogFrame(GUIListBox inListBox, GUIComponent tickBoxContainer, GUITextBox searchBox)
|
||||
{
|
||||
searchBox.OnTextChanged += (textBox, text) =>
|
||||
{
|
||||
msgFilter = text;
|
||||
FilterMessages();
|
||||
return true;
|
||||
};
|
||||
|
||||
tickBoxContainer.ClearChildren();
|
||||
|
||||
List<GUITickBox> tickBoxes = new List<GUITickBox>();
|
||||
foreach (MessageType msgType in Enum.GetValues(typeof(MessageType)))
|
||||
{
|
||||
var tickBox = new GUITickBox(new RectTransform(new Point(tickBoxContainer.Rect.Width, 16), tickBoxContainer.RectTransform), TextManager.Get("ServerLog." + messageTypeName[(int)msgType]), font: GUI.SmallFont)
|
||||
{
|
||||
Selected = true,
|
||||
TextColor = messageColor[(int)msgType],
|
||||
OnSelected = (GUITickBox tb) =>
|
||||
{
|
||||
msgTypeHidden[(int)msgType] = !tb.Selected;
|
||||
FilterMessages();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
tickBox.Selected = !msgTypeHidden[(int)msgType];
|
||||
tickBoxes.Add(tickBox);
|
||||
}
|
||||
tickBoxes.Last().TextBlock.RectTransform.SizeChanged += () =>
|
||||
{
|
||||
GUITextBlock.AutoScaleAndNormalize(tickBoxes.Select(t => t.TextBlock));
|
||||
};
|
||||
|
||||
inListBox.ClearChildren();
|
||||
listBox = inListBox;
|
||||
|
||||
var currLines = lines.ToList();
|
||||
foreach (LogMessage line in currLines)
|
||||
{
|
||||
AddLine(line);
|
||||
}
|
||||
FilterMessages();
|
||||
|
||||
listBox.UpdateScrollBarSize();
|
||||
}
|
||||
|
||||
private void AddLine(LogMessage line)
|
||||
{
|
||||
float prevSize = listBox.BarSize;
|
||||
|
||||
var textBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), listBox.Content.RectTransform),
|
||||
line.Text, wrap: true, font: GUI.SmallFont);
|
||||
textBlock.TextColor = messageColor[(int)line.Type];
|
||||
textBlock.Visible = !msgTypeHidden[(int)line.Type];
|
||||
textBlock.CanBeFocused = false;
|
||||
textBlock.UserData = line;
|
||||
var textBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), listBox.Content.RectTransform),
|
||||
line.Text, wrap: true, font: GUI.SmallFont)
|
||||
{
|
||||
TextColor = messageColor[(int)line.Type],
|
||||
Visible = !msgTypeHidden[(int)line.Type],
|
||||
CanBeFocused = false,
|
||||
UserData = line
|
||||
};
|
||||
|
||||
if ((prevSize == 1.0f && listBox.BarScroll == 0.0f) || (prevSize < 1.0f && listBox.BarScroll == 1.0f)) listBox.BarScroll = 1.0f;
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ namespace Barotrauma.Networking
|
||||
scrollBar.BarScrollValue = (float)value;
|
||||
}
|
||||
}
|
||||
else if (GUIComponent is GUIRadioButtonGroup radioButtonGroup) radioButtonGroup.Selected = (Enum)value;
|
||||
else if (GUIComponent is GUIRadioButtonGroup radioButtonGroup) radioButtonGroup.Selected = (int)value;
|
||||
else if (GUIComponent is GUIDropDown dropdown) dropdown.SelectItem(value);
|
||||
else if (GUIComponent is GUINumberInput numInput)
|
||||
{
|
||||
@@ -147,7 +147,7 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
}
|
||||
|
||||
public void ClientAdminWrite(NetFlags dataToSend, int missionType = 0, float? levelDifficulty = null, bool? autoRestart = null, int traitorSetting = 0, int botCount = 0, int botSpawnMode = 0, bool? useRespawnShuttle = null)
|
||||
public void ClientAdminWrite(NetFlags dataToSend, int? missionTypeOr = null, int? missionTypeAnd = null, float? levelDifficulty = null, bool? autoRestart = null, int traitorSetting = 0, int botCount = 0, int botSpawnMode = 0, bool? useRespawnShuttle = null)
|
||||
{
|
||||
if (!GameMain.Client.HasPermission(Networking.ClientPermissions.ManageSettings)) return;
|
||||
|
||||
@@ -200,7 +200,8 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (dataToSend.HasFlag(NetFlags.Misc))
|
||||
{
|
||||
outMsg.Write((byte)(missionType + 1));
|
||||
outMsg.WriteRangedInteger(missionTypeOr ?? (int)Barotrauma.MissionType.None, 0, (int)Barotrauma.MissionType.All);
|
||||
outMsg.WriteRangedInteger(missionTypeAnd ?? (int)Barotrauma.MissionType.All, 0, (int)Barotrauma.MissionType.All);
|
||||
outMsg.Write((byte)(traitorSetting + 1));
|
||||
outMsg.Write((byte)(botCount + 1));
|
||||
outMsg.Write((byte)(botSpawnMode + 1));
|
||||
@@ -330,7 +331,30 @@ namespace Barotrauma.Networking
|
||||
};
|
||||
|
||||
//***********************************************
|
||||
|
||||
|
||||
// Play Style Selection
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), serverTab.RectTransform), TextManager.Get("ServerSettingsPlayStyle"));
|
||||
var playStyleSelection = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.16f), serverTab.RectTransform))
|
||||
{
|
||||
AutoHideScrollBar = true,
|
||||
UseGridLayout = true
|
||||
};
|
||||
|
||||
List<GUITickBox> playStyleTickBoxes = new List<GUITickBox>();
|
||||
GUIRadioButtonGroup selectionPlayStyle = new GUIRadioButtonGroup();
|
||||
foreach (PlayStyle playStyle in Enum.GetValues(typeof(PlayStyle)))
|
||||
{
|
||||
var selectionTick = new GUITickBox(new RectTransform(new Vector2(0.32f, 0.49f), playStyleSelection.Content.RectTransform), TextManager.Get("servertag." + playStyle), font: GUI.SmallFont, style: "GUIRadioButton")
|
||||
{
|
||||
ToolTip = TextManager.Get("servertagdescription." + playStyle)
|
||||
};
|
||||
selectionPlayStyle.AddRadioButton((int)playStyle, selectionTick);
|
||||
playStyleTickBoxes.Add(selectionTick);
|
||||
}
|
||||
GetPropertyData("PlayStyle").AssignGUIComponent(selectionPlayStyle);
|
||||
GUITextBlock.AutoScaleAndNormalize(playStyleTickBoxes.Select(t => t.TextBlock));
|
||||
|
||||
// Sub Selection
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), serverTab.RectTransform), TextManager.Get("ServerSettingsSubSelection"));
|
||||
var selectionFrame = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.05f), serverTab.RectTransform), isHorizontal: true)
|
||||
{
|
||||
@@ -341,12 +365,13 @@ namespace Barotrauma.Networking
|
||||
GUIRadioButtonGroup selectionMode = new GUIRadioButtonGroup();
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
var selectionTick = new GUITickBox(new RectTransform(new Vector2(0.3f, 1.0f), selectionFrame.RectTransform), TextManager.Get(((SelectionMode)i).ToString()), font: GUI.SmallFont);
|
||||
selectionMode.AddRadioButton((SelectionMode)i, selectionTick);
|
||||
var selectionTick = new GUITickBox(new RectTransform(new Vector2(0.3f, 1.0f), selectionFrame.RectTransform), TextManager.Get(((SelectionMode)i).ToString()), font: GUI.SmallFont, style: "GUIRadioButton");
|
||||
selectionMode.AddRadioButton(i, selectionTick);
|
||||
}
|
||||
DebugConsole.NewMessage(SubSelectionMode.ToString(), Color.White);
|
||||
GetPropertyData("SubSelectionMode").AssignGUIComponent(selectionMode);
|
||||
|
||||
// Mode Selection
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), serverTab.RectTransform), TextManager.Get("ServerSettingsModeSelection"));
|
||||
selectionFrame = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.05f), serverTab.RectTransform), isHorizontal: true)
|
||||
{
|
||||
@@ -357,8 +382,8 @@ namespace Barotrauma.Networking
|
||||
selectionMode = new GUIRadioButtonGroup();
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
var selectionTick = new GUITickBox(new RectTransform(new Vector2(0.3f, 1.0f), selectionFrame.RectTransform), TextManager.Get(((SelectionMode)i).ToString()), font: GUI.SmallFont);
|
||||
selectionMode.AddRadioButton((SelectionMode)i, selectionTick);
|
||||
var selectionTick = new GUITickBox(new RectTransform(new Vector2(0.3f, 1.0f), selectionFrame.RectTransform), TextManager.Get(((SelectionMode)i).ToString()), font: GUI.SmallFont, style: "GUIRadioButton");
|
||||
selectionMode.AddRadioButton(i, selectionTick);
|
||||
}
|
||||
GetPropertyData("ModeSelectionMode").AssignGUIComponent(selectionMode);
|
||||
|
||||
@@ -715,6 +740,18 @@ namespace Barotrauma.Networking
|
||||
RelativeSpacing = 0.02f
|
||||
};
|
||||
|
||||
var allowFriendlyFire = new GUITickBox(new RectTransform(new Vector2(1.0f, 0.05f), antigriefingTab.RectTransform),
|
||||
TextManager.Get("ServerSettingsAllowFriendlyFire"));
|
||||
GetPropertyData("AllowFriendlyFire").AssignGUIComponent(allowFriendlyFire);
|
||||
|
||||
var allowRewiring = new GUITickBox(new RectTransform(new Vector2(1.0f, 0.05f), antigriefingTab.RectTransform),
|
||||
TextManager.Get("ServerSettingsAllowRewiring"));
|
||||
GetPropertyData("AllowRewiring").AssignGUIComponent(allowRewiring);
|
||||
|
||||
var allowDisguises = new GUITickBox(new RectTransform(new Vector2(1.0f, 0.05f), antigriefingTab.RectTransform),
|
||||
TextManager.Get("ServerSettingsAllowDisguises"));
|
||||
GetPropertyData("AllowDisguises").AssignGUIComponent(allowDisguises);
|
||||
|
||||
var voteKickBox = new GUITickBox(new RectTransform(new Vector2(1.0f, 0.05f), antigriefingTab.RectTransform), TextManager.Get("ServerSettingsAllowVoteKick"));
|
||||
GetPropertyData("AllowVoteKick").AssignGUIComponent(voteKickBox);
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ namespace Barotrauma.Steam
|
||||
public Facepunch.Steamworks.Auth Auth => client?.Auth;
|
||||
public Facepunch.Steamworks.Lobby Lobby => client?.Lobby;
|
||||
public Facepunch.Steamworks.LobbyList LobbyList => client?.LobbyList;
|
||||
public Facepunch.Steamworks.ServerList ServerList => client?.ServerList;
|
||||
public Facepunch.Steamworks.Client Client => client;
|
||||
|
||||
private SteamManager()
|
||||
{
|
||||
@@ -75,7 +77,8 @@ namespace Barotrauma.Steam
|
||||
Joining,
|
||||
Joined
|
||||
}
|
||||
private static UInt64 lobbyID = 0;
|
||||
|
||||
public static UInt64 LobbyID { get; private set; } = 0;
|
||||
private static LobbyState lobbyState = LobbyState.NotConnected;
|
||||
private static string lobbyIP = "";
|
||||
private static Thread lobbyIPRetrievalThread;
|
||||
@@ -167,7 +170,7 @@ namespace Barotrauma.Steam
|
||||
lobbyIPRetrievalThread.Start();
|
||||
|
||||
lobbyState = LobbyState.Owner;
|
||||
lobbyID = instance.client.Lobby.CurrentLobby;
|
||||
LobbyID = instance.client.Lobby.CurrentLobby;
|
||||
UpdateLobby(serverSettings);
|
||||
};
|
||||
if (lobbyState != LobbyState.NotConnected) { return; }
|
||||
@@ -192,16 +195,16 @@ namespace Barotrauma.Steam
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
var contentPackages = GameMain.Config.SelectedContentPackages.Where(cp => cp.HasMultiplayerIncompatibleContent);
|
||||
|
||||
|
||||
instance.client.Lobby.Name = serverSettings.ServerName;
|
||||
instance.client.Lobby.Owner = Steam.SteamManager.GetSteamID();
|
||||
instance.client.Lobby.MaxMembers = serverSettings.MaxPlayers+10;
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("playercount", (GameMain.Client?.ConnectedClients?.Count??0).ToString());
|
||||
instance.client.Lobby.Owner = GetSteamID();
|
||||
instance.client.Lobby.MaxMembers = serverSettings.MaxPlayers + 10;
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("playercount", (GameMain.Client?.ConnectedClients?.Count ?? 0).ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("maxplayernum", serverSettings.MaxPlayers.ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("hostipaddress", lobbyIP);
|
||||
//instance.client.Lobby.CurrentLobbyData.SetData("connectsteamid", Steam.SteamManager.GetSteamID().ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("lobbyowner", SteamIDUInt64ToString(GetSteamID()));
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("haspassword", serverSettings.HasPassword.ToString());
|
||||
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("message", serverSettings.ServerMessageText);
|
||||
@@ -216,9 +219,12 @@ namespace Barotrauma.Steam
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("voicechatenabled", serverSettings.VoiceChatEnabled.ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("allowspectating", serverSettings.AllowSpectating.ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("allowrespawn", serverSettings.AllowRespawn.ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("karmaenabled", serverSettings.KarmaEnabled.ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("friendlyfireenabled", serverSettings.AllowFriendlyFire.ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("traitors", serverSettings.TraitorsEnabled.ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("gamestarted", GameMain.Client.GameStarted.ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("gamemode", GameMain.NetLobbyScreen?.SelectedMode?.Identifier??"");
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("playstyle", serverSettings.PlayStyle.ToString());
|
||||
instance.client.Lobby.CurrentLobbyData.SetData("gamemode", GameMain.NetLobbyScreen?.SelectedMode?.Identifier ?? "");
|
||||
|
||||
DebugConsole.Log("Lobby updated!");
|
||||
}
|
||||
@@ -232,7 +238,7 @@ namespace Barotrauma.Steam
|
||||
lobbyIPRetrievalThread = null;
|
||||
|
||||
instance.client.Lobby.Leave();
|
||||
lobbyID = 0;
|
||||
LobbyID = 0;
|
||||
lobbyIP = "";
|
||||
lobbyState = LobbyState.NotConnected;
|
||||
|
||||
@@ -242,7 +248,7 @@ namespace Barotrauma.Steam
|
||||
public static void JoinLobby(UInt64 id, bool joinServer)
|
||||
{
|
||||
if (instance.client.Lobby.CurrentLobby == id) { return; }
|
||||
if (lobbyID == id) { return; }
|
||||
if (LobbyID == id) { return; }
|
||||
instance.client.Lobby.OnLobbyJoined = (success) =>
|
||||
{
|
||||
try
|
||||
@@ -253,7 +259,7 @@ namespace Barotrauma.Steam
|
||||
return;
|
||||
}
|
||||
lobbyState = LobbyState.Joined;
|
||||
lobbyID = instance.client.Lobby.CurrentLobby;
|
||||
LobbyID = instance.client.Lobby.CurrentLobby;
|
||||
if (joinServer)
|
||||
{
|
||||
GameMain.Instance.ConnectLobby = 0;
|
||||
@@ -267,7 +273,7 @@ namespace Barotrauma.Steam
|
||||
}
|
||||
};
|
||||
lobbyState = LobbyState.Joining;
|
||||
lobbyID = id;
|
||||
LobbyID = id;
|
||||
instance.client.Lobby.Join(id);
|
||||
}
|
||||
|
||||
@@ -314,9 +320,11 @@ namespace Barotrauma.Steam
|
||||
query.OnUpdate = () => { UpdateServerQuery(query, onServerFound, onServerRulesReceived, includeUnresponsive: true); };
|
||||
query.OnFinished = onFinished;
|
||||
|
||||
#if !DEBUG
|
||||
var localQuery = instance.client.ServerList.Local(filter);
|
||||
localQuery.OnUpdate = () => { UpdateServerQuery(localQuery, onServerFound, onServerRulesReceived, includeUnresponsive: true); };
|
||||
localQuery.OnFinished = onFinished;
|
||||
#endif
|
||||
|
||||
instance.client.LobbyList.OnLobbiesUpdated = () => { UpdateLobbyQuery(onServerFound, onServerRulesReceived, onFinished); };
|
||||
instance.client.LobbyList.Refresh();
|
||||
@@ -382,6 +390,7 @@ namespace Barotrauma.Steam
|
||||
bool.TryParse(lobby.GetData("haspassword"), out bool hasPassword);
|
||||
int.TryParse(lobby.GetData("playercount"), out int currPlayers);
|
||||
int.TryParse(lobby.GetData("maxplayernum"), out int maxPlayers);
|
||||
UInt64 ownerId = SteamIDStringToUInt64(lobby.GetData("lobbyowner"));
|
||||
//UInt64.TryParse(lobby.GetData("connectsteamid"), out ulong connectSteamId);
|
||||
string ip = lobby.GetData("hostipaddress");
|
||||
if (string.IsNullOrWhiteSpace(ip)) { ip = ""; }
|
||||
@@ -390,41 +399,17 @@ namespace Barotrauma.Steam
|
||||
{
|
||||
ServerName = lobby.Name,
|
||||
Port = "",
|
||||
QueryPort = "",
|
||||
IP = ip,
|
||||
PlayerCount = currPlayers,
|
||||
MaxPlayers = maxPlayers,
|
||||
HasPassword = hasPassword,
|
||||
RespondedToSteamQuery = true,
|
||||
LobbyID = lobby.LobbyID
|
||||
LobbyID = lobby.LobbyID,
|
||||
OwnerID = ownerId
|
||||
};
|
||||
serverInfo.PingChecked = false;
|
||||
serverInfo.ServerMessage = lobby.GetData("message");
|
||||
serverInfo.GameVersion = lobby.GetData("version");
|
||||
|
||||
serverInfo.ContentPackageNames.AddRange(lobby.GetData("contentpackage").Split(','));
|
||||
serverInfo.ContentPackageHashes.AddRange(lobby.GetData("contentpackagehash").Split(','));
|
||||
serverInfo.ContentPackageWorkshopUrls.AddRange(lobby.GetData("contentpackageurl").Split(','));
|
||||
|
||||
serverInfo.UsingWhiteList = lobby.GetData("usingwhitelist") == "True";
|
||||
SelectionMode selectionMode;
|
||||
if (Enum.TryParse(lobby.GetData("modeselectionmode"), out selectionMode)) serverInfo.ModeSelectionMode = selectionMode;
|
||||
if (Enum.TryParse(lobby.GetData("subselectionmode"), out selectionMode)) serverInfo.SubSelectionMode = selectionMode;
|
||||
|
||||
serverInfo.AllowSpectating = lobby.GetData("allowspectating") == "True";
|
||||
serverInfo.AllowRespawn = lobby.GetData("allowrespawn") == "True";
|
||||
serverInfo.VoipEnabled = lobby.GetData("voicechatenabled") == "True";
|
||||
if (Enum.TryParse(lobby.GetData("traitors"), out YesNoMaybe traitorsEnabled)) serverInfo.TraitorsEnabled = traitorsEnabled;
|
||||
|
||||
serverInfo.GameStarted = lobby.GetData("gamestarted") == "True";
|
||||
serverInfo.GameMode = lobby.GetData("gamemode");
|
||||
|
||||
if (serverInfo.ContentPackageNames.Count != serverInfo.ContentPackageHashes.Count ||
|
||||
serverInfo.ContentPackageHashes.Count != serverInfo.ContentPackageWorkshopUrls.Count)
|
||||
{
|
||||
//invalid contentpackage info
|
||||
serverInfo.ContentPackageNames.Clear();
|
||||
serverInfo.ContentPackageHashes.Clear();
|
||||
}
|
||||
AssignLobbyDataToServerInfo(lobby, serverInfo);
|
||||
|
||||
onServerFound(serverInfo);
|
||||
//onServerRulesReceived(serverInfo);
|
||||
@@ -433,6 +418,47 @@ namespace Barotrauma.Steam
|
||||
onFinished();
|
||||
}
|
||||
|
||||
public static void AssignLobbyDataToServerInfo(LobbyList.Lobby lobby, ServerInfo serverInfo)
|
||||
{
|
||||
serverInfo.ServerMessage = lobby.GetData("message");
|
||||
serverInfo.GameVersion = lobby.GetData("version");
|
||||
|
||||
serverInfo.ContentPackageNames.AddRange(lobby.GetData("contentpackage").Split(','));
|
||||
serverInfo.ContentPackageHashes.AddRange(lobby.GetData("contentpackagehash").Split(','));
|
||||
serverInfo.ContentPackageWorkshopUrls.AddRange(lobby.GetData("contentpackageurl").Split(','));
|
||||
|
||||
serverInfo.UsingWhiteList = getLobbyBool("usingwhitelist");
|
||||
SelectionMode selectionMode;
|
||||
if (Enum.TryParse(lobby.GetData("modeselectionmode"), out selectionMode)) { serverInfo.ModeSelectionMode = selectionMode; }
|
||||
if (Enum.TryParse(lobby.GetData("subselectionmode"), out selectionMode)) { serverInfo.SubSelectionMode = selectionMode; }
|
||||
|
||||
serverInfo.AllowSpectating = getLobbyBool("allowspectating");
|
||||
serverInfo.AllowRespawn = getLobbyBool("allowrespawn");
|
||||
serverInfo.VoipEnabled = getLobbyBool("voicechatenabled");
|
||||
serverInfo.KarmaEnabled = getLobbyBool("karmaenabled");
|
||||
serverInfo.FriendlyFireEnabled = getLobbyBool("friendlyfireenabled");
|
||||
if (Enum.TryParse(lobby.GetData("traitors"), out YesNoMaybe traitorsEnabled)) { serverInfo.TraitorsEnabled = traitorsEnabled; }
|
||||
|
||||
serverInfo.GameStarted = lobby.GetData("gamestarted") == "True";
|
||||
serverInfo.GameMode = lobby.GetData("gamemode");
|
||||
if (Enum.TryParse(lobby.GetData("playstyle"), out PlayStyle playStyle)) serverInfo.PlayStyle = playStyle;
|
||||
|
||||
if (serverInfo.ContentPackageNames.Count != serverInfo.ContentPackageHashes.Count ||
|
||||
serverInfo.ContentPackageHashes.Count != serverInfo.ContentPackageWorkshopUrls.Count)
|
||||
{
|
||||
//invalid contentpackage info
|
||||
serverInfo.ContentPackageNames.Clear();
|
||||
serverInfo.ContentPackageHashes.Clear();
|
||||
}
|
||||
|
||||
bool? getLobbyBool(string key)
|
||||
{
|
||||
string data = lobby.GetData(key);
|
||||
if (string.IsNullOrEmpty(data)) { return null; }
|
||||
return data == "True" || data == "true";
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateServerQuery(ServerList.Request query, Action<Networking.ServerInfo> onServerFound, Action<Networking.ServerInfo> onServerRulesReceived, bool includeUnresponsive)
|
||||
{
|
||||
IEnumerable<ServerList.Server> servers = includeUnresponsive ?
|
||||
@@ -459,6 +485,7 @@ namespace Barotrauma.Steam
|
||||
{
|
||||
ServerName = s.Name,
|
||||
Port = s.ConnectionPort.ToString(),
|
||||
QueryPort = s.QueryPort.ToString(),
|
||||
IP = s.Address.ToString(),
|
||||
PlayerCount = s.Players,
|
||||
MaxPlayers = s.MaxPlayers,
|
||||
@@ -472,60 +499,72 @@ namespace Barotrauma.Steam
|
||||
{
|
||||
s.FetchRules();
|
||||
}
|
||||
s.OnReceivedRules += (bool rulesReceived) =>
|
||||
{
|
||||
if (!rulesReceived || s.Rules == null) { return; }
|
||||
|
||||
if (s.Rules.ContainsKey("message")) serverInfo.ServerMessage = s.Rules["message"];
|
||||
if (s.Rules.ContainsKey("version")) serverInfo.GameVersion = s.Rules["version"];
|
||||
|
||||
if (s.Rules.ContainsKey("playercount"))
|
||||
{
|
||||
if (int.TryParse(s.Rules["playercount"], out int playerCount)) serverInfo.PlayerCount = playerCount;
|
||||
}
|
||||
|
||||
if (s.Rules.ContainsKey("contentpackage")) serverInfo.ContentPackageNames.AddRange(s.Rules["contentpackage"].Split(','));
|
||||
if (s.Rules.ContainsKey("contentpackagehash")) serverInfo.ContentPackageHashes.AddRange(s.Rules["contentpackagehash"].Split(','));
|
||||
if (s.Rules.ContainsKey("contentpackageurl")) serverInfo.ContentPackageWorkshopUrls.AddRange(s.Rules["contentpackageurl"].Split(','));
|
||||
|
||||
if (s.Rules.ContainsKey("usingwhitelist")) serverInfo.UsingWhiteList = s.Rules["usingwhitelist"] == "True";
|
||||
if (s.Rules.ContainsKey("modeselectionmode"))
|
||||
{
|
||||
if (Enum.TryParse(s.Rules["modeselectionmode"], out SelectionMode selectionMode)) serverInfo.ModeSelectionMode = selectionMode;
|
||||
}
|
||||
if (s.Rules.ContainsKey("subselectionmode"))
|
||||
{
|
||||
if (Enum.TryParse(s.Rules["subselectionmode"], out SelectionMode selectionMode)) serverInfo.SubSelectionMode = selectionMode;
|
||||
}
|
||||
if (s.Rules.ContainsKey("allowspectating")) serverInfo.AllowSpectating = s.Rules["allowspectating"] == "True";
|
||||
if (s.Rules.ContainsKey("allowrespawn")) serverInfo.AllowRespawn = s.Rules["allowrespawn"] == "True";
|
||||
if (s.Rules.ContainsKey("voicechatenabled")) serverInfo.VoipEnabled = s.Rules["voicechatenabled"] == "True";
|
||||
if (s.Rules.ContainsKey("traitors"))
|
||||
{
|
||||
if (Enum.TryParse(s.Rules["traitors"], out YesNoMaybe traitorsEnabled)) serverInfo.TraitorsEnabled = traitorsEnabled;
|
||||
}
|
||||
|
||||
if (s.Rules.ContainsKey("gamestarted")) serverInfo.GameStarted = s.Rules["gamestarted"] == "True";
|
||||
|
||||
if (s.Rules.ContainsKey("gamemode"))
|
||||
{
|
||||
serverInfo.GameMode = s.Rules["gamemode"];
|
||||
}
|
||||
if (serverInfo.ContentPackageNames.Count != serverInfo.ContentPackageHashes.Count ||
|
||||
serverInfo.ContentPackageHashes.Count != serverInfo.ContentPackageWorkshopUrls.Count)
|
||||
{
|
||||
//invalid contentpackage info
|
||||
serverInfo.ContentPackageNames.Clear();
|
||||
serverInfo.ContentPackageHashes.Clear();
|
||||
}
|
||||
onServerRulesReceived(serverInfo);
|
||||
};
|
||||
s.OnReceivedRules += (bool received) => { OnReceivedRules(s, serverInfo, received); onServerRulesReceived(serverInfo); };
|
||||
|
||||
onServerFound(serverInfo);
|
||||
}
|
||||
query.Responded.Clear();
|
||||
}
|
||||
|
||||
public static void OnReceivedRules(ServerList.Server s, ServerInfo serverInfo, bool rulesReceived)
|
||||
{
|
||||
if (!rulesReceived || s.Rules == null) { return; }
|
||||
|
||||
if (s.Rules.ContainsKey("message")) serverInfo.ServerMessage = s.Rules["message"];
|
||||
if (s.Rules.ContainsKey("version")) serverInfo.GameVersion = s.Rules["version"];
|
||||
|
||||
if (s.Rules.ContainsKey("playercount"))
|
||||
{
|
||||
if (int.TryParse(s.Rules["playercount"], out int playerCount)) serverInfo.PlayerCount = playerCount;
|
||||
}
|
||||
|
||||
serverInfo.ContentPackageNames.Clear();
|
||||
serverInfo.ContentPackageHashes.Clear();
|
||||
serverInfo.ContentPackageWorkshopUrls.Clear();
|
||||
if (s.Rules.ContainsKey("contentpackage")) serverInfo.ContentPackageNames.AddRange(s.Rules["contentpackage"].Split(','));
|
||||
if (s.Rules.ContainsKey("contentpackagehash")) serverInfo.ContentPackageHashes.AddRange(s.Rules["contentpackagehash"].Split(','));
|
||||
if (s.Rules.ContainsKey("contentpackageurl")) serverInfo.ContentPackageWorkshopUrls.AddRange(s.Rules["contentpackageurl"].Split(','));
|
||||
|
||||
if (s.Rules.ContainsKey("usingwhitelist")) serverInfo.UsingWhiteList = s.Rules["usingwhitelist"] == "True";
|
||||
if (s.Rules.ContainsKey("modeselectionmode"))
|
||||
{
|
||||
if (Enum.TryParse(s.Rules["modeselectionmode"], out SelectionMode selectionMode)) serverInfo.ModeSelectionMode = selectionMode;
|
||||
}
|
||||
if (s.Rules.ContainsKey("subselectionmode"))
|
||||
{
|
||||
if (Enum.TryParse(s.Rules["subselectionmode"], out SelectionMode selectionMode)) serverInfo.SubSelectionMode = selectionMode;
|
||||
}
|
||||
if (s.Rules.ContainsKey("allowspectating")) serverInfo.AllowSpectating = s.Rules["allowspectating"] == "True";
|
||||
if (s.Rules.ContainsKey("allowrespawn")) serverInfo.AllowRespawn = s.Rules["allowrespawn"] == "True";
|
||||
if (s.Rules.ContainsKey("voicechatenabled")) serverInfo.VoipEnabled = s.Rules["voicechatenabled"] == "True";
|
||||
if (s.Rules.ContainsKey("karmaenabled")) serverInfo.KarmaEnabled = s.Rules["karmaenabled"] == "True";
|
||||
if (s.Rules.ContainsKey("friendlyfireenabled")) serverInfo.FriendlyFireEnabled = s.Rules["friendlyfireenabled"] == "True";
|
||||
if (s.Rules.ContainsKey("traitors"))
|
||||
{
|
||||
if (Enum.TryParse(s.Rules["traitors"], out YesNoMaybe traitorsEnabled)) serverInfo.TraitorsEnabled = traitorsEnabled;
|
||||
}
|
||||
|
||||
if (s.Rules.ContainsKey("gamestarted")) serverInfo.GameStarted = s.Rules["gamestarted"] == "True";
|
||||
|
||||
if (s.Rules.ContainsKey("gamemode"))
|
||||
{
|
||||
serverInfo.GameMode = s.Rules["gamemode"];
|
||||
}
|
||||
|
||||
if (s.Rules.ContainsKey("playstyle"))
|
||||
{
|
||||
if (Enum.TryParse(s.Rules["playstyle"], out PlayStyle playStyle)) serverInfo.PlayStyle = playStyle;
|
||||
}
|
||||
|
||||
if (serverInfo.ContentPackageNames.Count != serverInfo.ContentPackageHashes.Count ||
|
||||
serverInfo.ContentPackageHashes.Count != serverInfo.ContentPackageWorkshopUrls.Count)
|
||||
{
|
||||
//invalid contentpackage info
|
||||
serverInfo.ContentPackageNames.Clear();
|
||||
serverInfo.ContentPackageHashes.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
private static bool ValidateServerInfo(ServerList.Server server)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(server.Name)) { return false; }
|
||||
|
||||
@@ -26,7 +26,13 @@ namespace Barotrauma.Networking
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
|
||||
public double LastAmplitude
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public float Gain
|
||||
{
|
||||
get { return GameMain.Config?.MicrophoneVolume ?? 1.0f; }
|
||||
@@ -191,6 +197,7 @@ namespace Barotrauma.Networking
|
||||
double dB = Math.Min(20 * Math.Log10(maxAmplitude), 0.0);
|
||||
|
||||
LastdB = dB;
|
||||
LastAmplitude = maxAmplitude;
|
||||
|
||||
bool allowEnqueue = false;
|
||||
if (GameMain.WindowActive)
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Barotrauma
|
||||
allowSubVoting = value;
|
||||
GameMain.NetLobbyScreen.SubList.Enabled = value ||
|
||||
(GameMain.Client != null && GameMain.Client.HasPermission(ClientPermissions.SelectSub));
|
||||
GameMain.NetLobbyScreen.InfoFrame.FindChild("subvotes", true).Visible = value;
|
||||
GameMain.NetLobbyScreen.Frame.FindChild("subvotes", true).Visible = value;
|
||||
|
||||
UpdateVoteTexts(null, VoteType.Sub);
|
||||
GameMain.NetLobbyScreen.SubList.Deselect();
|
||||
@@ -33,7 +33,7 @@ namespace Barotrauma
|
||||
value ||
|
||||
(GameMain.Client != null && GameMain.Client.HasPermission(ClientPermissions.SelectMode));
|
||||
|
||||
GameMain.NetLobbyScreen.InfoFrame.FindChild("modevotes", true).Visible = value;
|
||||
GameMain.NetLobbyScreen.Frame.FindChild("modevotes", true).Visible = value;
|
||||
|
||||
//gray out modes that can't be voted
|
||||
foreach (GUITextBlock comp in GameMain.NetLobbyScreen.ModeList.Content.Children)
|
||||
|
||||
Reference in New Issue
Block a user