diff --git a/Projects/Server/Network/IPacketEncoder.cs b/Projects/Server/Network/IPacketEncoder.cs
new file mode 100644
index 000000000..cecbb220d
--- /dev/null
+++ b/Projects/Server/Network/IPacketEncoder.cs
@@ -0,0 +1,25 @@
+/*************************************************************************
+ * ModernUO *
+ * Copyright 2019-2020 - ModernUO Development Team *
+ * Email: hi@modernuo.com *
+ * File: IPacketEncoder.cs *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program. If not, see . *
+ *************************************************************************/
+
+using System;
+
+namespace Server.Network
+{
+ public interface IPacketEncoder
+ {
+ void EncodeOutgoingPacket(NetState to, ref Memory seq);
+ void DecodeIncomingPacket(NetState from, ref Memory seq);
+ }
+}
diff --git a/Projects/Server/Network/NetState/NetState.ClientVersion.cs b/Projects/Server/Network/NetState/NetState.ClientVersion.cs
new file mode 100644
index 000000000..c424294ff
--- /dev/null
+++ b/Projects/Server/Network/NetState/NetState.ClientVersion.cs
@@ -0,0 +1,129 @@
+/*************************************************************************
+ * ModernUO *
+ * Copyright 2019-2020 - ModernUO Development Team *
+ * Email: hi@modernuo.com *
+ * File: NetState.ClientVersion.cs *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program. If not, see . *
+ *************************************************************************/
+
+using System.Runtime.CompilerServices;
+
+namespace Server.Network
+{
+ public partial class NetState
+ {
+ private static readonly ClientVersion m_Version400a = new ClientVersion("4.0.0a");
+ private static readonly ClientVersion m_Version407a = new ClientVersion("4.0.7a");
+ private static readonly ClientVersion m_Version500a = new ClientVersion("5.0.0a");
+ private static readonly ClientVersion m_Version502b = new ClientVersion("5.0.2b");
+ private static readonly ClientVersion m_Version6000 = new ClientVersion("6.0.0.0");
+ private static readonly ClientVersion m_Version6017 = new ClientVersion("6.0.1.7");
+ private static readonly ClientVersion m_Version60142 = new ClientVersion("6.0.14.2");
+ private static readonly ClientVersion m_Version7000 = new ClientVersion("7.0.0.0");
+ private static readonly ClientVersion m_Version7090 = new ClientVersion("7.0.9.0");
+ private static readonly ClientVersion m_Version70130 = new ClientVersion("7.0.13.0");
+ private static readonly ClientVersion m_Version70160 = new ClientVersion("7.0.16.0");
+ private static readonly ClientVersion m_Version70300 = new ClientVersion("7.0.30.0");
+ private static readonly ClientVersion m_Version70331 = new ClientVersion("7.0.33.1");
+ private static readonly ClientVersion m_Version704565 = new ClientVersion("7.0.45.65");
+ private static readonly ClientVersion m_Version70500 = new ClientVersion("7.0.50.0");
+ private static readonly ClientVersion m_Version70610 = new ClientVersion("7.0.61.0");
+
+ public ProtocolChanges ProtocolChanges { get; set; }
+ public ClientFlags Flags { get; set; }
+
+ public ClientVersion Version
+ {
+ get => m_Version;
+ set => ProtocolChanges = ProtocolChangesByVersion(m_Version = value);
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ProtocolChanges ProtocolChangesByVersion(ClientVersion version) =>
+ version switch
+ {
+ var v when v >= m_Version70610 => ProtocolChanges.Version70610,
+ var v when v >= m_Version70500 => ProtocolChanges.Version70500,
+ var v when v >= m_Version704565 => ProtocolChanges.Version704565,
+ var v when v >= m_Version70331 => ProtocolChanges.Version70331,
+ var v when v >= m_Version70300 => ProtocolChanges.Version70300,
+ var v when v >= m_Version70160 => ProtocolChanges.Version70160,
+ var v when v >= m_Version70130 => ProtocolChanges.Version70130,
+ var v when v >= m_Version7090 => ProtocolChanges.Version7090,
+ var v when v >= m_Version7000 => ProtocolChanges.Version7000,
+ var v when v >= m_Version60142 => ProtocolChanges.Version60142,
+ var v when v >= m_Version6017 => ProtocolChanges.Version6017,
+ var v when v >= m_Version6000 => ProtocolChanges.Version6000,
+ var v when v >= m_Version502b => ProtocolChanges.Version502b,
+ var v when v >= m_Version500a => ProtocolChanges.Version500a,
+ var v when v >= m_Version407a => ProtocolChanges.Version407a,
+ var v when v >= m_Version400a => ProtocolChanges.Version400a,
+ _ => ProtocolChanges.None
+ };
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool HasProtocolChanges(ProtocolChanges changes) => (ProtocolChanges & changes) != 0;
+
+ public bool NewSpellbook => HasProtocolChanges(ProtocolChanges.NewSpellbook);
+ public bool DamagePacket => HasProtocolChanges(ProtocolChanges.DamagePacket);
+ public bool Unpack => HasProtocolChanges(ProtocolChanges.Unpack);
+ public bool BuffIcon => HasProtocolChanges(ProtocolChanges.BuffIcon);
+ public bool NewHaven => HasProtocolChanges(ProtocolChanges.NewHaven);
+ public bool ContainerGridLines => HasProtocolChanges(ProtocolChanges.ContainerGridLines);
+ public bool ExtendedSupportedFeatures => HasProtocolChanges(ProtocolChanges.ExtendedSupportedFeatures);
+ public bool StygianAbyss => HasProtocolChanges(ProtocolChanges.StygianAbyss);
+ public bool HighSeas => HasProtocolChanges(ProtocolChanges.HighSeas);
+ public bool NewCharacterList => HasProtocolChanges(ProtocolChanges.NewCharacterList);
+ public bool NewCharacterCreation => HasProtocolChanges(ProtocolChanges.NewCharacterCreation);
+ public bool ExtendedStatus => HasProtocolChanges(ProtocolChanges.ExtendedStatus);
+ public bool NewMobileIncoming => HasProtocolChanges(ProtocolChanges.NewMobileIncoming);
+ public bool NewSecureTrading => HasProtocolChanges(ProtocolChanges.NewSecureTrading);
+
+ public bool IsUOTDClient =>
+ (Flags & ClientFlags.UOTD) != 0 || m_Version?.Type == ClientType.UOTD;
+
+ public bool IsSAClient => m_Version?.Type == ClientType.SA;
+
+ private ExpansionInfo m_Expansion;
+
+ public ExpansionInfo ExpansionInfo
+ {
+ get
+ {
+ if (m_Expansion != null)
+ {
+ for (var i = ExpansionInfo.Table.Length - 1; i >= 0; i--)
+ {
+ var info = ExpansionInfo.Table[i];
+
+ if (info.RequiredClient != null && Version >= info.RequiredClient || (Flags & info.ClientFlags) != 0)
+ {
+ m_Expansion = info;
+ break;
+ }
+ }
+
+ if (m_Expansion == null)
+ {
+ ExpansionInfo.GetInfo(Expansion.None);
+ }
+ }
+
+ return m_Expansion;
+ }
+ }
+
+ public bool SupportsExpansion(ExpansionInfo info, bool checkCoreExpansion = true) =>
+ info != null && (!checkCoreExpansion || (int)Core.Expansion >= info.ID) && ExpansionInfo.ID >= info.ID;
+
+ public bool SupportsExpansion(Expansion ex, bool checkCoreExpansion = true) =>
+ SupportsExpansion(ExpansionInfo.GetInfo(ex), checkCoreExpansion);
+ }
+}
diff --git a/Projects/Server/Network/NetState.cs b/Projects/Server/Network/NetState/NetState.cs
similarity index 61%
rename from Projects/Server/Network/NetState.cs
rename to Projects/Server/Network/NetState/NetState.cs
index 0ff7ec32b..e87fa9e21 100644
--- a/Projects/Server/Network/NetState.cs
+++ b/Projects/Server/Network/NetState/NetState.cs
@@ -15,82 +15,21 @@ using Server.Menus;
namespace Server.Network
{
- public interface IPacketEncoder
- {
- void EncodeOutgoingPacket(NetState to, ref Memory seq);
- void DecodeIncomingPacket(NetState from, ref Memory seq);
- }
-
public delegate void NetStateCreatedCallback(NetState ns);
- [Flags]
- public enum ProtocolChanges
- {
- NewSpellbook = 0x00000001,
- DamagePacket = 0x00000002,
- Unpack = 0x00000004,
- BuffIcon = 0x00000008,
- NewHaven = 0x00000010,
- ContainerGridLines = 0x00000020,
- ExtendedSupportedFeatures = 0x00000040,
- StygianAbyss = 0x00000080,
- HighSeas = 0x00000100,
- NewCharacterList = 0x00000200,
- NewCharacterCreation = 0x00000400,
- ExtendedStatus = 0x00000800,
- NewMobileIncoming = 0x00001000,
- NewSecureTrading = 0x00002000,
- UltimaStore = 0x00004000,
- EndlessJourney = 0x00008000,
-
- Version400a = NewSpellbook,
- Version407a = Version400a | DamagePacket,
- Version500a = Version407a | Unpack,
- Version502b = Version500a | BuffIcon,
- Version6000 = Version502b | NewHaven,
- Version6017 = Version6000 | ContainerGridLines,
- Version60142 = Version6017 | ExtendedSupportedFeatures,
- Version7000 = Version60142 | StygianAbyss,
- Version7090 = Version7000 | HighSeas,
- Version70130 = Version7090 | NewCharacterList,
- Version70160 = Version70130 | NewCharacterCreation,
- Version70300 = Version70160 | ExtendedStatus,
- Version70331 = Version70300 | NewMobileIncoming,
- Version704565 = Version70331 | NewSecureTrading,
- Version70500 = Version704565 | UltimaStore,
- Version70610 = Version70500 | EndlessJourney
- }
-
public class AsyncState
{
public AsyncState(bool paused) => Paused = paused;
public bool Paused { get; set; }
}
- public class NetState : IComparable
+ public partial class NetState : IComparable
{
private static readonly AsyncState m_PauseState = new AsyncState(true);
private static readonly AsyncState m_ResumeState = new AsyncState(false);
private static AsyncState m_AsyncState = m_ResumeState;
- private static readonly ClientVersion m_Version400a = new ClientVersion("4.0.0a");
- private static readonly ClientVersion m_Version407a = new ClientVersion("4.0.7a");
- private static readonly ClientVersion m_Version500a = new ClientVersion("5.0.0a");
- private static readonly ClientVersion m_Version502b = new ClientVersion("5.0.2b");
- private static readonly ClientVersion m_Version6000 = new ClientVersion("6.0.0.0");
- private static readonly ClientVersion m_Version6017 = new ClientVersion("6.0.1.7");
- private static readonly ClientVersion m_Version60142 = new ClientVersion("6.0.14.2");
- private static readonly ClientVersion m_Version7000 = new ClientVersion("7.0.0.0");
- private static readonly ClientVersion m_Version7090 = new ClientVersion("7.0.9.0");
- private static readonly ClientVersion m_Version70130 = new ClientVersion("7.0.13.0");
- private static readonly ClientVersion m_Version70160 = new ClientVersion("7.0.16.0");
- private static readonly ClientVersion m_Version70300 = new ClientVersion("7.0.30.0");
- private static readonly ClientVersion m_Version70331 = new ClientVersion("7.0.33.1");
- private static readonly ClientVersion m_Version704565 = new ClientVersion("7.0.45.65");
- private static readonly ClientVersion m_Version70500 = new ClientVersion("7.0.50.0");
- private static readonly ClientVersion m_Version70610 = new ClientVersion("7.0.61.0");
-
private static readonly ConcurrentQueue m_Disposed = new ConcurrentQueue();
private readonly string m_ToString;
internal int m_AuthID;
@@ -151,104 +90,6 @@ namespace Server.Network
public bool BlockAllPackets { get; set; }
- public ClientFlags Flags { get; set; }
-
- public ClientVersion Version
- {
- get => m_Version;
- set
- {
- m_Version = value;
-
- if (value >= m_Version70610)
- {
- ProtocolChanges = ProtocolChanges.Version70610;
- }
-
- if (value >= m_Version70500)
- {
- ProtocolChanges = ProtocolChanges.Version70500;
- }
-
- if (value >= m_Version704565)
- {
- ProtocolChanges = ProtocolChanges.Version704565;
- }
- else if (value >= m_Version70331)
- {
- ProtocolChanges = ProtocolChanges.Version70331;
- }
- else if (value >= m_Version70300)
- {
- ProtocolChanges = ProtocolChanges.Version70300;
- }
- else if (value >= m_Version70160)
- {
- ProtocolChanges = ProtocolChanges.Version70160;
- }
- else if (value >= m_Version70130)
- {
- ProtocolChanges = ProtocolChanges.Version70130;
- }
- else if (value >= m_Version7090)
- {
- ProtocolChanges = ProtocolChanges.Version7090;
- }
- else if (value >= m_Version7000)
- {
- ProtocolChanges = ProtocolChanges.Version7000;
- }
- else if (value >= m_Version60142)
- {
- ProtocolChanges = ProtocolChanges.Version60142;
- }
- else if (value >= m_Version6017)
- {
- ProtocolChanges = ProtocolChanges.Version6017;
- }
- else if (value >= m_Version6000)
- {
- ProtocolChanges = ProtocolChanges.Version6000;
- }
- else if (value >= m_Version502b)
- {
- ProtocolChanges = ProtocolChanges.Version502b;
- }
- else if (value >= m_Version500a)
- {
- ProtocolChanges = ProtocolChanges.Version500a;
- }
- else if (value >= m_Version407a)
- {
- ProtocolChanges = ProtocolChanges.Version407a;
- }
- else if (value >= m_Version400a)
- {
- ProtocolChanges = ProtocolChanges.Version400a;
- }
- }
- }
-
- public bool NewSpellbook => (ProtocolChanges & ProtocolChanges.NewSpellbook) != 0;
- public bool DamagePacket => (ProtocolChanges & ProtocolChanges.DamagePacket) != 0;
- public bool Unpack => (ProtocolChanges & ProtocolChanges.Unpack) != 0;
- public bool BuffIcon => (ProtocolChanges & ProtocolChanges.BuffIcon) != 0;
- public bool NewHaven => (ProtocolChanges & ProtocolChanges.NewHaven) != 0;
- public bool ContainerGridLines => (ProtocolChanges & ProtocolChanges.ContainerGridLines) != 0;
- public bool ExtendedSupportedFeatures => (ProtocolChanges & ProtocolChanges.ExtendedSupportedFeatures) != 0;
- public bool StygianAbyss => (ProtocolChanges & ProtocolChanges.StygianAbyss) != 0;
- public bool HighSeas => (ProtocolChanges & ProtocolChanges.HighSeas) != 0;
- public bool NewCharacterList => (ProtocolChanges & ProtocolChanges.NewCharacterList) != 0;
- public bool NewCharacterCreation => (ProtocolChanges & ProtocolChanges.NewCharacterCreation) != 0;
- public bool ExtendedStatus => (ProtocolChanges & ProtocolChanges.ExtendedStatus) != 0;
- public bool NewMobileIncoming => (ProtocolChanges & ProtocolChanges.NewMobileIncoming) != 0;
- public bool NewSecureTrading => (ProtocolChanges & ProtocolChanges.NewSecureTrading) != 0;
-
- public bool IsUOTDClient =>
- (Flags & ClientFlags.UOTD) != 0 || m_Version?.Type == ClientType.UOTD;
-
- public bool IsSAClient => m_Version?.Type == ClientType.SA;
-
public List Trades { get; }
public bool Seeded { get; set; }
@@ -281,28 +122,6 @@ namespace Server.Network
public bool IsDisposing => m_Disposing != 0;
- public ExpansionInfo ExpansionInfo
- {
- get
- {
- for (var i = ExpansionInfo.Table.Length - 1; i >= 0; i--)
- {
- var info = ExpansionInfo.Table[i];
-
- if (info.RequiredClient != null && Version >= info.RequiredClient || (Flags & info.ClientFlags) != 0)
- {
- return info;
- }
- }
-
- return ExpansionInfo.GetInfo(Expansion.None);
- }
- }
-
- public Expansion Expansion => (Expansion)ExpansionInfo.ID;
-
- public ProtocolChanges ProtocolChanges { get; set; }
-
public int CompareTo(NetState other) => other == null ? 1 : m_ToString.CompareTo(other.m_ToString);
public void ValidateAllTrades()
@@ -696,13 +515,5 @@ namespace Server.Network
}
}
}
-
- public bool SupportsExpansion(ExpansionInfo info, bool checkCoreExpansion = true) =>
- info != null && (!checkCoreExpansion || (int)Core.Expansion >= info.ID) && (info.RequiredClient != null
- ? Version >= info.RequiredClient
- : (Flags & info.ClientFlags) != 0);
-
- public bool SupportsExpansion(Expansion ex, bool checkCoreExpansion = true) =>
- SupportsExpansion(ExpansionInfo.GetInfo(ex), checkCoreExpansion);
}
}
diff --git a/Projects/Server/Network/NetState/ProtocolChanges.cs b/Projects/Server/Network/NetState/ProtocolChanges.cs
new file mode 100644
index 000000000..5a866dfdd
--- /dev/null
+++ b/Projects/Server/Network/NetState/ProtocolChanges.cs
@@ -0,0 +1,58 @@
+/*************************************************************************
+ * ModernUO *
+ * Copyright 2019-2020 - ModernUO Development Team *
+ * Email: hi@modernuo.com *
+ * File: ProtocolChanges.cs *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program. If not, see . *
+ *************************************************************************/
+
+using System;
+
+namespace Server.Network
+{
+ [Flags]
+ public enum ProtocolChanges
+ {
+ None = 0x00000000,
+ NewSpellbook = 0x00000001,
+ DamagePacket = 0x00000002,
+ Unpack = 0x00000004,
+ BuffIcon = 0x00000008,
+ NewHaven = 0x00000010,
+ ContainerGridLines = 0x00000020,
+ ExtendedSupportedFeatures = 0x00000040,
+ StygianAbyss = 0x00000080,
+ HighSeas = 0x00000100,
+ NewCharacterList = 0x00000200,
+ NewCharacterCreation = 0x00000400,
+ ExtendedStatus = 0x00000800,
+ NewMobileIncoming = 0x00001000,
+ NewSecureTrading = 0x00002000,
+ UltimaStore = 0x00004000,
+ EndlessJourney = 0x00008000,
+
+ Version400a = NewSpellbook,
+ Version407a = Version400a | DamagePacket,
+ Version500a = Version407a | Unpack,
+ Version502b = Version500a | BuffIcon,
+ Version6000 = Version502b | NewHaven,
+ Version6017 = Version6000 | ContainerGridLines,
+ Version60142 = Version6017 | ExtendedSupportedFeatures,
+ Version7000 = Version60142 | StygianAbyss,
+ Version7090 = Version7000 | HighSeas,
+ Version70130 = Version7090 | NewCharacterList,
+ Version70160 = Version70130 | NewCharacterCreation,
+ Version70300 = Version70160 | ExtendedStatus,
+ Version70331 = Version70300 | NewMobileIncoming,
+ Version704565 = Version70331 | NewSecureTrading,
+ Version70500 = Version704565 | UltimaStore,
+ Version70610 = Version70500 | EndlessJourney
+ }
+}