From 3edae38d053dba5baffe915a9b1e3f007929bd10 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 15 Jun 2019 13:27:33 +0300 Subject: [PATCH] (f26b88b8c) Ignore revision number (the last digit of the version number) when determining client/server compatibility. Allows us to release hotfixes etc with a different version number without breaking compatibility. Also incremented version number to make the next version incompatible with older ones. --- .../Properties/AssemblyInfo.cs | 4 +-- .../Source/Screens/ServerListScreen.cs | 8 +++++- .../Properties/AssemblyInfo.cs | 4 +-- .../Source/Networking/GameServerLogin.cs | 7 ++--- .../Source/Networking/NetworkMember.cs | 26 ++++++++++++++++++- 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs index 8e6e3a82f..82dea8e96 100644 --- a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs +++ b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.9.0.6")] -[assembly: AssemblyFileVersion("0.9.0.6")] +[assembly: AssemblyVersion("0.9.1.0")] +[assembly: AssemblyFileVersion("0.9.1.0")] diff --git a/Barotrauma/BarotraumaClient/Source/Screens/ServerListScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/ServerListScreen.cs index b856d5940..89dd98622 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/ServerListScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/ServerListScreen.cs @@ -185,9 +185,15 @@ namespace Barotrauma if (!(child.UserData is ServerInfo)) continue; ServerInfo serverInfo = (ServerInfo)child.UserData; + Version remoteVersion = null; + if (!string.IsNullOrEmpty(serverInfo.GameVersion)) + { + Version.TryParse(serverInfo.GameVersion, out remoteVersion); + } + bool incompatible = (!serverInfo.ContentPackageHashes.Any() && serverInfo.ContentPackagesMatch(GameMain.Config.SelectedContentPackages)) || - (!string.IsNullOrEmpty(serverInfo.GameVersion) && serverInfo.GameVersion != GameMain.Version.ToString()); + (remoteVersion != null && !NetworkMember.IsCompatible(GameMain.Version, remoteVersion)); child.Visible = serverInfo.ServerName.ToLowerInvariant().Contains(searchBox.Text.ToLowerInvariant()) && diff --git a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs index 2ccbcdb86..a366a224d 100644 --- a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs +++ b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.9.0.6")] -[assembly: AssemblyFileVersion("0.9.0.6")] +[assembly: AssemblyVersion("0.9.1.0")] +[assembly: AssemblyFileVersion("0.9.1.0")] diff --git a/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs b/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs index 84a0277ff..5743da4f1 100644 --- a/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs +++ b/Barotrauma/BarotraumaServer/Source/Networking/GameServerLogin.cs @@ -339,13 +339,14 @@ namespace Barotrauma.Networking return; } - if (clVersion != GameMain.Version.ToString()) + bool? isCompatibleVersion = IsCompatible(clVersion, GameMain.Version.ToString()); + if (isCompatibleVersion.HasValue && !isCompatibleVersion.Value) { DisconnectUnauthClient(inc, unauthClient, DisconnectReason.InvalidVersion, $"DisconnectMessage.InvalidVersion~[version]={GameMain.Version.ToString()}~[clientversion]={clVersion}"); - Log(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (wrong game version)", ServerLog.MessageType.Error); - DebugConsole.NewMessage(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (wrong game version)", Color.Red); + Log(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (incompatible game version)", ServerLog.MessageType.Error); + DebugConsole.NewMessage(clName + " (" + inc.SenderConnection.RemoteEndPoint.Address.ToString() + ") couldn't join the server (incompatible game version)", Color.Red); return; } diff --git a/Barotrauma/BarotraumaShared/Source/Networking/NetworkMember.cs b/Barotrauma/BarotraumaShared/Source/Networking/NetworkMember.cs index 2730bacb3..50bf9088e 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/NetworkMember.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/NetworkMember.cs @@ -241,6 +241,30 @@ namespace Barotrauma.Networking public virtual void Update(float deltaTime) { } public virtual void Disconnect() { } - } + /// + /// Check if the two version are compatible (= if they can play together in multiplayer). + /// Returns null if compatibility could not be determined (invalid/unknown version number). + /// + public static bool? IsCompatible(string myVersion, string remoteVersion) + { + if (!Version.TryParse(myVersion, out Version myVersionNumber)) { return null; } + if (!Version.TryParse(remoteVersion, out Version remoteVersionNumber)) { return null; } + + return IsCompatible(myVersionNumber, remoteVersionNumber); + } + + /// + /// Check if the two version are compatible (= if they can play together in multiplayer). + /// + public static bool IsCompatible(Version myVersion, Version remoteVersion) + { + //major.minor.build.revision + //revision number is ignored, other values have to match + return + myVersion.Major == remoteVersion.Major && + myVersion.Minor == remoteVersion.Minor && + myVersion.Build == remoteVersion.Build; + } + } }