diff --git a/Scripts/Multis/ComponentVerification.cs b/Scripts/Multis/ComponentVerification.cs index 1d1e9795d..4776fc885 100644 --- a/Scripts/Multis/ComponentVerification.cs +++ b/Scripts/Multis/ComponentVerification.cs @@ -45,7 +45,7 @@ namespace Server.Multis if (val == -1) return false; - return (val == 0 || (ExpansionInfo.CurrentExpansion.CustomHousingFlag & val) != 0); + return (val == 0 || ((uint)ExpansionInfo.CoreExpansion.CustomHousingFlag & val) != 0); } private int[] CreateTable(int length) diff --git a/Server/ExpansionInfo.cs b/Server/ExpansionInfo.cs index 4134d440c..8616a2902 100644 --- a/Server/ExpansionInfo.cs +++ b/Server/ExpansionInfo.cs @@ -12,7 +12,7 @@ namespace Server { public enum Expansion { - None, + None = 0, T2A, UOR, UOTD, @@ -22,7 +22,7 @@ namespace Server ML, SA, HS, - TOL + TOL } [Flags] @@ -41,7 +41,7 @@ namespace Server } [Flags] - public enum FeatureFlags + public enum FeatureFlags : uint { None = 0x00000000, T2A = 0x00000001, @@ -55,7 +55,7 @@ namespace Server EigthAge = 0x00000100, NinthAge = 0x00000200, /* Crystal/Shadow Custom House Tiles */ TenthAge = 0x00000400, - InceasedStorage = 0x00000800, /* Increased Housing/Bank Storage */ + IncreasedStorage = 0x00000800, /* Increased Housing/Bank Storage */ SeventhCharacterSlot = 0x00001000, RoleplayFaces = 0x00002000, TrialAccount = 0x00004000, @@ -64,10 +64,9 @@ namespace Server HS = 0x00020000, Gothic = 0x00040000, Rustic = 0x00080000, - Jungle = 0x100000, - Shadowguard = 0x200000, - TOL = 0x400000, - + Jungle = 0x00100000, + Shadowguard = 0x00200000, + TOL = 0x00400000, ExpansionNone = None, ExpansionT2A = T2A, @@ -79,7 +78,7 @@ namespace Server ExpansionML = ExpansionSE | ML | NinthAge, ExpansionSA = ExpansionML | SA | Gothic | Rustic, ExpansionHS = ExpansionSA | HS, - ExpansionTOL = ExpansionHS | TOL | Jungle | Shadowguard + ExpansionTOL = ExpansionHS | TOL | Jungle | Shadowguard } [Flags] @@ -113,92 +112,159 @@ namespace Server ExpansionML = ExpansionSE | ML, ExpansionSA = ExpansionML, ExpansionHS = ExpansionSA, - ExpansionTOL = ExpansionHS + ExpansionTOL = ExpansionHS + } + + [Flags] + public enum HousingFlags : uint + { + None = 0x0, + AOS = 0x10, + SE = 0x40, + ML = 0x80, + Crystal = 0x200, + SA = 0x10000, + HS = 0x20000, + Gothic = 0x40000, + Rustic = 0x80000, + Jungle = 0x100000, + Shadowguard = 0x200000, + TOL = 0x400000, + + HousingAOS = AOS, + HousingSE = HousingAOS | SE, + HousingML = HousingSE | ML | Crystal, + HousingSA = HousingML | SA | Gothic | Rustic, + HousingHS = HousingSA | HS, + HousingTOL = HousingHS | TOL | Jungle | Shadowguard } public class ExpansionInfo { - public static ExpansionInfo[] Table { get { return m_Table; } } + public static ExpansionInfo CoreExpansion { get { return GetInfo(Core.Expansion); } } - private static readonly ExpansionInfo[] m_Table = new[] + public static ExpansionInfo[] Table { get; private set; } + + static ExpansionInfo() { - new ExpansionInfo(0, "None", ClientFlags.None, FeatureFlags.ExpansionNone, CharacterListFlags.ExpansionNone, 0x0000), - new ExpansionInfo( - 1, "The Second Age", ClientFlags.Felucca, FeatureFlags.ExpansionT2A, CharacterListFlags.ExpansionT2A, 0x0000), - new ExpansionInfo( - 2, "Renaissance", ClientFlags.Trammel, FeatureFlags.ExpansionUOR, CharacterListFlags.ExpansionUOR, 0x0000), - new ExpansionInfo( - 3, "Third Dawn", ClientFlags.Ilshenar, FeatureFlags.ExpansionUOTD, CharacterListFlags.ExpansionUOTD, 0x0000), - new ExpansionInfo( - 4, "Blackthorn's Revenge", ClientFlags.Ilshenar, FeatureFlags.ExpansionLBR, CharacterListFlags.ExpansionLBR, 0x0000) - , - new ExpansionInfo( - 5, "Age of Shadows", ClientFlags.Malas, FeatureFlags.ExpansionAOS, CharacterListFlags.ExpansionAOS, 0x0000), - new ExpansionInfo( - 6, "Samurai Empire", ClientFlags.Tokuno, FeatureFlags.ExpansionSE, CharacterListFlags.ExpansionSE, 0x00C0), - // 0x20 | 0x80 - new ExpansionInfo( - 7, "Mondain's Legacy", new ClientVersion("5.0.0a"), FeatureFlags.ExpansionML, CharacterListFlags.ExpansionML, 0x02C0) - , // 0x20 | 0x80 | 0x200 - new ExpansionInfo( - 8, "Stygian Abyss", ClientFlags.TerMur, FeatureFlags.ExpansionSA, CharacterListFlags.ExpansionSA, 0xD02C0), - // 0x20 | 0x80 | 0x200 | 0x10000 | 0x40000 | 0x80000 - new ExpansionInfo( - 9, "High Seas", new ClientVersion("7.0.9.0"), FeatureFlags.ExpansionHS, CharacterListFlags.ExpansionHS, 0xD02C0), - // 0x20 | 0x80 | 0x200 | 0x10000 | 0x40000 | 0x80000 - new ExpansionInfo( - 10, "Time of Legends", new ClientVersion("7.0.45.65"), FeatureFlags.ExpansionTOL, CharacterListFlags.ExpansionTOL, 0x4060FB) - // 0x20 | 0x80 | 0x200 | 0x10000 | 0x40000 | 0x100000 | 0x200000 | 0x400000 - }; - - private readonly string m_Name; - private readonly int m_ID; - private readonly int m_CustomHousingFlag; - - private readonly ClientFlags m_ClientFlags; - private readonly FeatureFlags m_SupportedFeatures; - private readonly CharacterListFlags m_CharListFlags; - - private readonly ClientVersion m_RequiredClient; // Used as an alternative to the flags - - public string Name { get { return m_Name; } } - public int ID { get { return m_ID; } } - public ClientFlags ClientFlags { get { return m_ClientFlags; } } - public FeatureFlags SupportedFeatures { get { return m_SupportedFeatures; } } - public CharacterListFlags CharacterListFlags { get { return m_CharListFlags; } } - public int CustomHousingFlag { get { return m_CustomHousingFlag; } } - public ClientVersion RequiredClient { get { return m_RequiredClient; } } - - public ExpansionInfo( - int id, - string name, - ClientFlags clientFlags, - FeatureFlags supportedFeatures, - CharacterListFlags charListFlags, - int customHousingFlag) - { - m_Name = name; - m_ID = id; - m_ClientFlags = clientFlags; - m_SupportedFeatures = supportedFeatures; - m_CharListFlags = charListFlags; - m_CustomHousingFlag = customHousingFlag; + Table = new[] + { + new ExpansionInfo( + 0, + "None", + ClientFlags.None, + FeatureFlags.ExpansionNone, + CharacterListFlags.ExpansionNone, + HousingFlags.None), + new ExpansionInfo( + 1, + "The Second Age", + ClientFlags.Felucca, + FeatureFlags.ExpansionT2A, + CharacterListFlags.ExpansionT2A, + HousingFlags.None), + new ExpansionInfo( + 2, + "Renaissance", + ClientFlags.Trammel, + FeatureFlags.ExpansionUOR, + CharacterListFlags.ExpansionUOR, + HousingFlags.None), + new ExpansionInfo( + 3, + "Third Dawn", + ClientFlags.Ilshenar, + FeatureFlags.ExpansionUOTD, + CharacterListFlags.ExpansionUOTD, + HousingFlags.None), + new ExpansionInfo( + 4, + "Blackthorn's Revenge", + ClientFlags.Ilshenar, + FeatureFlags.ExpansionLBR, + CharacterListFlags.ExpansionLBR, + HousingFlags.None), + new ExpansionInfo( + 5, + "Age of Shadows", + ClientFlags.Malas, + FeatureFlags.ExpansionAOS, + CharacterListFlags.ExpansionAOS, + HousingFlags.HousingAOS), + new ExpansionInfo( + 6, + "Samurai Empire", + ClientFlags.Tokuno, + FeatureFlags.ExpansionSE, + CharacterListFlags.ExpansionSE, + HousingFlags.HousingSE), + new ExpansionInfo( + 7, + "Mondain's Legacy", + new ClientVersion("5.0.0a"), + FeatureFlags.ExpansionML, + CharacterListFlags.ExpansionML, + HousingFlags.HousingML), + new ExpansionInfo( + 8, + "Stygian Abyss", + ClientFlags.TerMur, + FeatureFlags.ExpansionSA, + CharacterListFlags.ExpansionSA, + HousingFlags.HousingSA), + new ExpansionInfo( + 9, + "High Seas", + new ClientVersion("7.0.9.0"), + FeatureFlags.ExpansionHS, + CharacterListFlags.ExpansionHS, + HousingFlags.HousingHS), + new ExpansionInfo( + 10, + "Time of Legends", + new ClientVersion("7.0.45.65"), + FeatureFlags.ExpansionTOL, + CharacterListFlags.ExpansionTOL, + HousingFlags.HousingTOL) + }; } - public ExpansionInfo( - int id, - string name, - ClientVersion requiredClient, - FeatureFlags supportedFeatures, - CharacterListFlags charListFlags, - int customHousingFlag) + public static FeatureFlags GetFeatures(Expansion ex) { - m_Name = name; - m_ID = id; - m_SupportedFeatures = supportedFeatures; - m_CharListFlags = charListFlags; - m_CustomHousingFlag = customHousingFlag; - m_RequiredClient = requiredClient; + var info = GetInfo(ex); + + if (info != null) + { + return info.SupportedFeatures; + } + + switch (ex) + { + case Expansion.None: + return FeatureFlags.ExpansionNone; + case Expansion.T2A: + return FeatureFlags.ExpansionT2A; + case Expansion.UOR: + return FeatureFlags.ExpansionUOR; + case Expansion.UOTD: + return FeatureFlags.ExpansionUOTD; + case Expansion.LBR: + return FeatureFlags.ExpansionLBR; + case Expansion.AOS: + return FeatureFlags.ExpansionAOS; + case Expansion.SE: + return FeatureFlags.ExpansionSE; + case Expansion.ML: + return FeatureFlags.ExpansionML; + case Expansion.SA: + return FeatureFlags.ExpansionSA; + case Expansion.HS: + return FeatureFlags.ExpansionHS; + case Expansion.TOL: + return FeatureFlags.ExpansionTOL; + } + + return FeatureFlags.ExpansionNone; } public static ExpansionInfo GetInfo(Expansion ex) @@ -208,21 +274,67 @@ namespace Server public static ExpansionInfo GetInfo(int ex) { - int v = ex; + var v = ex; - if (v < 0 || v >= m_Table.Length) + if (v < 0 || v >= Table.Length) { v = 0; } - return m_Table[v]; + return Table[v]; } - public static ExpansionInfo CurrentExpansion { get { return GetInfo(Core.Expansion); } } + public int ID { get; private set; } + public string Name { get; set; } + + public ClientFlags ClientFlags { get; set; } + public FeatureFlags SupportedFeatures { get; set; } + public CharacterListFlags CharacterListFlags { get; set; } + public ClientVersion RequiredClient { get; set; } + public HousingFlags CustomHousingFlag { get; set; } + + public ExpansionInfo( + int id, + string name, + ClientFlags clientFlags, + FeatureFlags supportedFeatures, + CharacterListFlags charListFlags, + HousingFlags customHousingFlag) + : this(id, name, supportedFeatures, charListFlags, customHousingFlag) + { + ClientFlags = clientFlags; + } + + public ExpansionInfo( + int id, + string name, + ClientVersion requiredClient, + FeatureFlags supportedFeatures, + CharacterListFlags charListFlags, + HousingFlags customHousingFlag) + : this(id, name, supportedFeatures, charListFlags, customHousingFlag) + { + RequiredClient = requiredClient; + } + + private ExpansionInfo( + int id, + string name, + FeatureFlags supportedFeatures, + CharacterListFlags charListFlags, + HousingFlags customHousingFlag) + { + ID = id; + Name = name; + + SupportedFeatures = supportedFeatures; + CharacterListFlags = charListFlags; + CustomHousingFlag = customHousingFlag; + } public override string ToString() { - return m_Name; + return Name; } } } \ No newline at end of file diff --git a/Server/Network/Packets.cs b/Server/Network/Packets.cs index 434a30fa0..c9cd412f4 100644 --- a/Server/Network/Packets.cs +++ b/Server/Network/Packets.cs @@ -3157,7 +3157,7 @@ m_Stream.Write( (int) renderMode ); public SupportedFeatures(NetState ns) : base(0xB9, ns.ExtendedSupportedFeatures ? 5 : 3) { - FeatureFlags flags = ExpansionInfo.CurrentExpansion.SupportedFeatures; + FeatureFlags flags = ExpansionInfo.CoreExpansion.SupportedFeatures; flags |= m_AdditionalFlags; @@ -4540,7 +4540,7 @@ m_Stream.Write( (int) renderMode ); m_Stream.Write(0); } - CharacterListFlags flags = ExpansionInfo.CurrentExpansion.CharacterListFlags; + CharacterListFlags flags = ExpansionInfo.CoreExpansion.CharacterListFlags; if (count > 6) { @@ -4644,7 +4644,7 @@ m_Stream.Write( (int) renderMode ); m_Stream.WriteAsciiFixed(ci.Building, 31); } - CharacterListFlags flags = ExpansionInfo.CurrentExpansion.CharacterListFlags; + CharacterListFlags flags = ExpansionInfo.CoreExpansion.CharacterListFlags; if (count > 6) {