diff --git a/Source/Framework/Realm/ClientBuildHelper.cs b/Source/Framework/Realm/ClientBuildHelper.cs deleted file mode 100644 index ded5b0a9b..000000000 --- a/Source/Framework/Realm/ClientBuildHelper.cs +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) CypherCore All rights reserved. -// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; - -namespace Framework.ClientBuild -{ - struct ClientBuildPlatformType - { - public static int Windows = "Win".fourcc(); - public static int macOS = "Mac".fourcc(); - } - - struct ClientBuildArch - { - public static int x86 = "x86".fourcc(); - public static int x64 = "x64".fourcc(); - public static int Arm32 = "A32".fourcc(); - public static int Arm64 = "A64".fourcc(); - public static int WA32 = "WA32".fourcc(); - } - - struct ClientBuildType - { - public static int Retail = "WoW".fourcc(); - public static int RetailChina = "WoWC".fourcc(); - public static int Beta = "WoWB".fourcc(); - public static int BetaRelease = "WoWE".fourcc(); - public static int Ptr = "WoWT".fourcc(); - public static int PtrRelease = "WoWR".fourcc(); - } - - public class ClientBuildHelper - { - public static bool IsValid(string platform) - { - switch (platform) - { - case "Win": - case "Wn64": - case "WinA": - case "Mac": - case "Mc64": - case "MacA": - return true; - default: - break; - } - - return false; - } - } - - public class ClientBuildVariantId - { - public int Platform; - public int Arch; - public int Type; - } - - public class ClientBuildAuthKey - { - public static int Size = 16; - - public ClientBuildVariantId Variant; - public byte[] Key = new byte[Size]; - } - - public class ClientBuildInfo - { - public uint Build; - public uint MajorVersion; - public uint MinorVersion; - public uint BugfixVersion; - public char[] HotfixVersion = new char[4]; - public List AuthKeys = new(); - } -} diff --git a/Source/Framework/Realm/ClientBuildInfo.cs b/Source/Framework/Realm/ClientBuildInfo.cs new file mode 100644 index 000000000..b94595314 --- /dev/null +++ b/Source/Framework/Realm/ClientBuildInfo.cs @@ -0,0 +1,147 @@ +// Copyright (c) CypherCore All rights reserved. +// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using Framework.Database; +using System.Linq; + +namespace Framework.ClientBuild +{ + struct ClientBuildPlatformType + { + public static int Windows = "Win".fourcc(); + public static int macOS = "Mac".fourcc(); + } + + struct ClientBuildArch + { + public static int x86 = "x86".fourcc(); + public static int x64 = "x64".fourcc(); + public static int Arm32 = "A32".fourcc(); + public static int Arm64 = "A64".fourcc(); + public static int WA32 = "WA32".fourcc(); + } + + struct ClientBuildType + { + public static int Retail = "WoW".fourcc(); + public static int RetailChina = "WoWC".fourcc(); + public static int Beta = "WoWB".fourcc(); + public static int BetaRelease = "WoWE".fourcc(); + public static int Ptr = "WoWT".fourcc(); + public static int PtrRelease = "WoWR".fourcc(); + } + + public class ClientBuildHelper + { + static List _builds = new(); + + public static void LoadBuildInfo() + { + _builds.Clear(); + + // 0 1 2 3 4 5 6 7 + SQLResult result = DB.Login.Query("SELECT majorVersion, minorVersion, bugfixVersion, hotfixVersion, build, win64AuthSeed, mac64AuthSeed, macArmAuthSeed FROM build_info ORDER BY build ASC"); + if (!result.IsEmpty()) + { + do + { + ClientBuildInfo build = new(); + build.MajorVersion = result.Read(0); + build.MinorVersion = result.Read(1); + build.BugfixVersion = result.Read(2); + string hotfixVersion = result.Read(3); + if (!hotfixVersion.IsEmpty() && hotfixVersion.Length < build.HotfixVersion.Length) + build.HotfixVersion = hotfixVersion.ToCharArray(); + + build.Build = result.Read(4); + + string win64AuthSeedHexStr = result.Read(5); + if (win64AuthSeedHexStr.Length == ClientBuildAuthKey.Size * 2) + { + ClientBuildAuthKey buildKey = new(); + buildKey.Variant = new() { Platform = ClientBuildPlatformType.Windows, Arch = ClientBuildArch.x64, Type = ClientBuildType.Retail }; + buildKey.Key = win64AuthSeedHexStr.ToByteArray(); + build.AuthKeys.Add(buildKey); + } + + string mac64AuthSeedHexStr = result.Read(6); + if (mac64AuthSeedHexStr.Length == ClientBuildAuthKey.Size * 2) + { + ClientBuildAuthKey buildKey = new(); + buildKey.Variant = new() { Platform = ClientBuildPlatformType.macOS, Arch = ClientBuildArch.x64, Type = ClientBuildType.Retail }; + buildKey.Key = mac64AuthSeedHexStr.ToByteArray(); + build.AuthKeys.Add(buildKey); + } + + string macArmAuthSeedHexStr = result.Read(7); + if (macArmAuthSeedHexStr.Length == ClientBuildAuthKey.Size * 2) + { + ClientBuildAuthKey buildKey = new(); + buildKey.Variant = new() { Platform = ClientBuildPlatformType.macOS, Arch = ClientBuildArch.Arm64, Type = ClientBuildType.Retail }; + buildKey.Key = macArmAuthSeedHexStr.ToByteArray(); + build.AuthKeys.Add(buildKey); + } + + _builds.Add(build); + + } while (result.NextRow()); + } + } + + public static ClientBuildInfo GetBuildInfo(uint build) + { + return _builds.Find(x => x.Build == build); + } + + public static uint GetMinorMajorBugfixVersionForBuild(uint build) + { + ClientBuildInfo buildInfo = _builds.Find(p => p.Build < build); + return buildInfo != null ? (buildInfo.MajorVersion * 10000 + buildInfo.MinorVersion * 100 + buildInfo.BugfixVersion) : 0; + } + + public static bool IsValid(string platform) + { + switch (platform) + { + case "Win": + case "Wn64": + case "WinA": + case "Mac": + case "Mc64": + case "MacA": + return true; + default: + break; + } + + return false; + } + } + + public class ClientBuildVariantId + { + public int Platform; + public int Arch; + public int Type; + } + + public class ClientBuildAuthKey + { + public static int Size = 16; + + public ClientBuildVariantId Variant; + public byte[] Key = new byte[Size]; + } + + public class ClientBuildInfo + { + public uint Build; + public uint MajorVersion; + public uint MinorVersion; + public uint BugfixVersion; + public char[] HotfixVersion = new char[4]; + public List AuthKeys = new(); + } +} diff --git a/Source/Framework/Realm/RealmManager.cs b/Source/Framework/Realm/RealmManager.cs index fa8693a3f..682a187f3 100644 --- a/Source/Framework/Realm/RealmManager.cs +++ b/Source/Framework/Realm/RealmManager.cs @@ -28,66 +28,13 @@ public class RealmManager : Singleton _updateTimer = new Timer(TimeSpan.FromSeconds(updateInterval).TotalMilliseconds); _updateTimer.Elapsed += UpdateRealms; - LoadBuildInfo(); + ClientBuildHelper.LoadBuildInfo(); UpdateRealms(null, null); _updateTimer.Start(); } - void LoadBuildInfo() - { - _builds.Clear(); - - // 0 1 2 3 4 5 6 7 - SQLResult result = DB.Login.Query("SELECT majorVersion, minorVersion, bugfixVersion, hotfixVersion, build, win64AuthSeed, mac64AuthSeed, macArmAuthSeed FROM build_info ORDER BY build ASC"); - if (!result.IsEmpty()) - { - do - { - ClientBuildInfo build = new(); - build.MajorVersion = result.Read(0); - build.MinorVersion = result.Read(1); - build.BugfixVersion = result.Read(2); - string hotfixVersion = result.Read(3); - if (!hotfixVersion.IsEmpty() && hotfixVersion.Length < build.HotfixVersion.Length) - build.HotfixVersion = hotfixVersion.ToCharArray(); - - build.Build = result.Read(4); - - string win64AuthSeedHexStr = result.Read(5); - if (win64AuthSeedHexStr.Length == ClientBuildAuthKey.Size * 2) - { - ClientBuildAuthKey buildKey = new(); - buildKey.Variant = new() { Platform = ClientBuildPlatformType.Windows, Arch = ClientBuildArch.x64, Type = ClientBuildType.Retail }; - buildKey.Key = win64AuthSeedHexStr.ToByteArray(); - build.AuthKeys.Add(buildKey); - } - - string mac64AuthSeedHexStr = result.Read(6); - if (mac64AuthSeedHexStr.Length == ClientBuildAuthKey.Size * 2) - { - ClientBuildAuthKey buildKey = new(); - buildKey.Variant = new() { Platform = ClientBuildPlatformType.macOS, Arch = ClientBuildArch.x64, Type = ClientBuildType.Retail }; - buildKey.Key = mac64AuthSeedHexStr.ToByteArray(); - build.AuthKeys.Add(buildKey); - } - - string macArmAuthSeedHexStr = result.Read(7); - if (macArmAuthSeedHexStr.Length == ClientBuildAuthKey.Size * 2) - { - ClientBuildAuthKey buildKey = new(); - buildKey.Variant = new() { Platform = ClientBuildPlatformType.macOS, Arch = ClientBuildArch.Arm64, Type = ClientBuildType.Retail }; - buildKey.Key = macArmAuthSeedHexStr.ToByteArray(); - build.AuthKeys.Add(buildKey); - } - - _builds.Add(build); - - } while (result.NextRow()); - } - } - public void Close() { _updateTimer.Close(); @@ -218,21 +165,6 @@ public class RealmManager : Singleton } } - public ClientBuildInfo GetBuildInfo(uint build) - { - foreach (var clientBuild in _builds) - if (clientBuild.Build == build) - return clientBuild; - - return null; - } - - public uint GetMinorMajorBugfixVersionForBuild(uint build) - { - ClientBuildInfo buildInfo = _builds.FirstOrDefault(p => p.Build < build); - return buildInfo != null ? (buildInfo.MajorVersion * 10000 + buildInfo.MinorVersion * 100 + buildInfo.BugfixVersion) : 0; - } - void FillRealmEntry(Realm realm, uint clientBuild, AccountTypes accountSecurityLevel, RealmEntry realmEntry) { realmEntry.WowRealmAddress = (int)realm.Id.GetAddress(); @@ -245,7 +177,7 @@ public class RealmManager : Singleton realmEntry.CfgCategoriesID = realm.Timezone; ClientVersion version = new(); - ClientBuildInfo buildInfo = GetBuildInfo(realm.Build); + ClientBuildInfo buildInfo = ClientBuildHelper.GetBuildInfo(realm.Build); if (buildInfo != null) { version.Major = (int)buildInfo.MajorVersion; @@ -412,7 +344,6 @@ public class RealmManager : Singleton public ICollection GetRealms() { return _realms.Values; } List GetSubRegions() { return _subRegions; } - List _builds = new(); ConcurrentDictionary _realms = new(); Dictionary _removedRealms = new(); List _subRegions = new(); diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index b5ee77876..6bc33d9a5 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -1,6 +1,7 @@ // Copyright (c) CypherCore All rights reserved. // Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. +using Framework.ClientBuild; using Framework.Constants; using Framework.Database; using Game.Arenas; @@ -1442,7 +1443,7 @@ namespace Game.Achievements var currentRealm = Global.RealmMgr.GetCurrentRealm(); if (currentRealm == null) return false; - if (reqValue < Global.RealmMgr.GetMinorMajorBugfixVersionForBuild(currentRealm.Build)) + if (reqValue < ClientBuildHelper.GetMinorMajorBugfixVersionForBuild(currentRealm.Build)) return false; break; case ModifierTreeType.BattlePetTeamLevel: // 34 diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 112360da9..e6d9cc706 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -1,6 +1,7 @@ // Copyright (c) CypherCore All rights reserved. // Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. +using Framework.ClientBuild; using Framework.Collections; using Framework.Constants; using Framework.Database; @@ -3837,7 +3838,7 @@ namespace Game.Entities stmt.AddValue(index++, m_activePlayerData.MultiActionBars); var currentRealm = Global.RealmMgr.GetCurrentRealm(); if (currentRealm != null) - stmt.AddValue(index++, Global.RealmMgr.GetMinorMajorBugfixVersionForBuild(currentRealm.Build)); + stmt.AddValue(index++, ClientBuildHelper.GetMinorMajorBugfixVersionForBuild(currentRealm.Build)); else stmt.AddValue(index++, 0); } @@ -3998,7 +3999,7 @@ namespace Game.Entities stmt.AddValue(index++, finiteAlways(_restMgr.GetRestBonus(RestTypes.Honor))); var currentRealm = Global.RealmMgr.GetCurrentRealm(); if (currentRealm != null) - stmt.AddValue(index++, Global.RealmMgr.GetMinorMajorBugfixVersionForBuild(currentRealm.Build)); + stmt.AddValue(index++, ClientBuildHelper.GetMinorMajorBugfixVersionForBuild(currentRealm.Build)); else stmt.AddValue(index++, 0); diff --git a/Source/Game/Networking/WorldSocket.cs b/Source/Game/Networking/WorldSocket.cs index a31d353cb..94ea1dad0 100644 --- a/Source/Game/Networking/WorldSocket.cs +++ b/Source/Game/Networking/WorldSocket.cs @@ -482,7 +482,7 @@ namespace Game.Networking AccountInfo account = new(result.GetFields()); - ClientBuildInfo buildInfo = Global.RealmMgr.GetBuildInfo(account.game.Build); + ClientBuildInfo buildInfo = ClientBuildHelper.GetBuildInfo(account.game.Build); if (buildInfo == null) { SendAuthResponseError(BattlenetRpcErrorCode.BadVersion);