diff --git a/src/Syroot.OnlineWorms.Server/Client.cs b/src/Syroot.OnlineWorms.Server/Client.cs index 95fac0d..867af00 100644 --- a/src/Syroot.OnlineWorms.Server/Client.cs +++ b/src/Syroot.OnlineWorms.Server/Client.cs @@ -40,29 +40,36 @@ namespace Syroot.Worms.OnlineWorms.Server // ---- METHODS (PRIVATE) -------------------------------------------------------------------------------------- - private Packet HandleConnect(ConnectQueryPacket connectPacket) + private Packet HandleConnect(ConnectQueryPacket connectPacket) => new ConnectReplyPacket { - return new ConnectReplyPacket + Unknown = _server.Name, + Unknown2 = _server.RegionName, + Version = _server.Version + }; + + private Packet HandleLogin(LoginQueryPacket loginPacket) + { + LoginPlayerInfo[] playerInfos = new LoginPlayerInfo[loginPacket.Logins.Length]; + for (int i = 0; i < loginPacket.Logins.Length; i++) { - Unknown = _server.Name, - Unknown2 = _server.RegionName, - Version = _server.Version + LoginCredentials credentials = loginPacket.Logins[i]; + playerInfos[i] = new LoginPlayerInfo + { + ID = credentials.ID, + Rank = 19 + }; + } + + return new LoginReplyPacket + { + Unknown1 = 1, + LoginResult = LoginResult.Success, + PlayerInfos = playerInfos }; } - //private Packet HandleLogin(LoginQueryPacket loginPacket) - //{ - // return new LoginReplyPacket - // { - // LoginResult = LoginResult.Success - // }; - //} - #if DEBUG - private Packet HandleRaw(RawQueryPacket rawPacket) - { - return null; - } + private Packet HandleRaw(RawQueryPacket rawPacket) => null; #endif } } \ No newline at end of file diff --git a/src/Syroot.OnlineWorms.Server/Net/PacketStream.cs b/src/Syroot.OnlineWorms.Server/Net/PacketStream.cs index a2a23d6..2fee786 100644 --- a/src/Syroot.OnlineWorms.Server/Net/PacketStream.cs +++ b/src/Syroot.OnlineWorms.Server/Net/PacketStream.cs @@ -90,7 +90,12 @@ namespace Syroot.Worms.OnlineWorms.Server.Net internal string ReadString() { - return _baseStream.ReadString(StringCoding.Int16CharCount); + return _baseStream.ReadString(StringCoding.Int16CharCount, _win949Encoding); + } + + internal byte[] ReadToEnd() + { + return _baseStream.ReadBytes((int)(Length - Position)); } internal void WriteString(string value) diff --git a/src/Syroot.OnlineWorms.Server/Net/Packets/LoginQueryPacket.cs b/src/Syroot.OnlineWorms.Server/Net/Packets/LoginQueryPacket.cs new file mode 100644 index 0000000..1aeb292 --- /dev/null +++ b/src/Syroot.OnlineWorms.Server/Net/Packets/LoginQueryPacket.cs @@ -0,0 +1,46 @@ +using System; +using System.Net; +using Syroot.BinaryData; + +namespace Syroot.Worms.OnlineWorms.Server.Net +{ + /// + /// Represents the client request for a . + /// + [Packet(0x8000)] + internal class LoginQueryPacket : Packet + { + // ---- PROPERTIES --------------------------------------------------------------------------------------------- + + internal ushort Unknown1 { get; set; } + + internal LoginCredentials[] Logins { get; set; } + + internal IPAddress ClientIP { get; set; } + + // ---- METHODS (INTERNAL) ------------------------------------------------------------------------------------- + + internal override void Deserialize(PacketStream stream) + { + Unknown1 = stream.ReadUInt16(); + Logins = new LoginCredentials[stream.ReadUInt16()]; + for (int i = 0; i < Logins.Length; i++) + { + Logins[i] = new LoginCredentials + { + ID = stream.ReadString(), + Password = stream.ReadString() + }; + } + ClientIP = IPAddress.Parse(stream.ReadString()); + } + + internal override void Serialize(PacketStream stream) => throw new NotImplementedException(); + } + + internal class LoginCredentials + { + internal string ID { get; set; } + internal string Password { get; set; } + } +} diff --git a/src/Syroot.OnlineWorms.Server/Net/Packets/LoginReplyPacket.cs b/src/Syroot.OnlineWorms.Server/Net/Packets/LoginReplyPacket.cs index 84c4a52..fd27680 100644 --- a/src/Syroot.OnlineWorms.Server/Net/Packets/LoginReplyPacket.cs +++ b/src/Syroot.OnlineWorms.Server/Net/Packets/LoginReplyPacket.cs @@ -11,7 +11,11 @@ namespace Syroot.Worms.OnlineWorms.Server.Net { // ---- PROPERTIES --------------------------------------------------------------------------------------------- - public LoginResult LoginResult { get; set; } + internal LoginResult LoginResult { get; set; } + + internal ushort Unknown1 { get; set; } + + internal LoginPlayerInfo[] PlayerInfos { get; set; } // ---- METHODS (INTERNAL) ------------------------------------------------------------------------------------- @@ -19,14 +23,28 @@ namespace Syroot.Worms.OnlineWorms.Server.Net internal override void Serialize(PacketStream stream) { - stream.WriteBoolean(LoginResult == LoginResult.Success); - stream.WriteEnum(LoginResult); + bool loginSuccessful = LoginResult == LoginResult.Success; + stream.WriteBoolean(loginSuccessful); + if (loginSuccessful) + { + stream.WriteUInt16(Unknown1); + stream.WriteUInt16((ushort)PlayerInfos.Length); + foreach (LoginPlayerInfo playerInfo in PlayerInfos) + { + stream.WriteString(playerInfo.ID); + stream.WriteUInt16(playerInfo.Rank); + } + } + else + { + stream.WriteEnum(LoginResult); + } } } internal enum LoginResult : byte { - Success, + Success = 0, IDAlreadyInUse = 3, UnqualifiedID = 4, IncorrectID = 6, @@ -37,4 +55,10 @@ namespace Syroot.Worms.OnlineWorms.Server.Net PublicAccessBanned = 12, TemporarilyBannedID = 13 } + + internal class LoginPlayerInfo + { + internal string ID { get; set; } + internal ushort Rank { get; set; } + } }