コード例 #1
0
        private static void CheckNameExistance(Client.AuthClient client, AuthPackets.Packet packet)
        {
            string Name = Encoding.ASCII.GetString(packet.buffer, 6, 12).Replace(Encoding.ASCII.GetString(new byte[] { 0x0 }), "");

            client.Send(new AuthPackets.Packet(AuthPackets.Packet.PacketType.S2C_CheckNameExsitance, new byte[4] {
                (byte)(Database.EntityTable.NameExists(Name) ? 0x2 : 0x0), 0x0, 0x0, 0x0
            }));
        }
コード例 #2
0
        private static void CreateAccount(Client.AuthClient client, AuthPackets.Packet packet)
        {
            string Name = Encoding.ASCII.GetString(packet.buffer, 6, 12).Replace(Encoding.ASCII.GetString(new byte[] { 0x0 }), "");

            if (!Database.EntityTable.NameExists(Name) && Database.EntityTable.CreateEntity(client, Name))
            {
                client.Send(new AuthPackets.Packet(AuthPackets.Packet.PacketType.S2C_CreateAccount, new byte[4]));
            }
        }
コード例 #3
0
 public void Send(AuthPackets.Packet packet)
 {
     packet.buffer[0] = Constants.packetStartsWith;
     packet.buffer[packet.buffer.Length - 1] = Constants.packetEndsWith;
     Socket.Send(packet.buffer);
     if (Program.CapturePackets)
     {
         Console.WriteLine("Captured a packet from Server (Auth Server) Length: " + packet.buffer.Length + " Type: (" + packet.buffer[3] + "-" + packet.buffer[4] + "-" + packet.buffer[5] + ")");
     }
 }
コード例 #4
0
        private static void ReturnToServers(Client.AuthClient client, AuthPackets.Packet packet)
        {
            System.IO.MemoryStream memory = new System.IO.MemoryStream();
            System.IO.BinaryWriter writer = new System.IO.BinaryWriter(memory);
            string Username = Encoding.ASCII.GetString(packet.buffer, 10, 20).Replace(Encoding.ASCII.GetString(new byte[] { 0x0 }), "");
            uint   UID      = BitConverter.ToUInt32(packet.buffer, 6);

            client.Account = Kernel.GamePool.Values.Where(i => i.Entity.UID == UID && i.Account.Username == Username).FirstOrDefault().Account;
            Kernel.AwaitingPool[client.Account.Identifer] = client.Account;
            #region Character Info
            memory.Position += 20;
            writer.Write(client.Account.EntityID);
            writer.Write((ushort)0);
            writer.Write(client.Account.Rank);
            writer.Write(client.Account.TotalKills);
            writer.Write(client.Account.TotalDeaths);
            writer.Write(0u);
            writer.Write(StringToBytes("2D 3E F7 D5 CF 18 F7 3F"));
            writer.Write((ulong)Program.Servers.Length);
            #endregion
            #region Servers
            for (int i = 0; i < Program.Servers.Length; i++)
            {
                var Server = Program.Servers[i];
                writer.Write((ushort)(Server.serverType));
                writer.Write(Server.NoLimit);
                writer.Write(Server.MinRank);
                writer.Write(Server.MaxRank);
                memory.Position += 16;
                writer.Write((ushort)(i + 1));
                writer.Write(Encoding.ASCII.GetBytes(Server.Name));
                writer.Write(new byte[34 - Server.Name.Length]);
                writer.Write(Server.Port);
                writer.Write(Server.IPBytes);
                writer.Write(100u);
                writer.Write((ulong)((double)Kernel.GamePool.Values.Where(x => x.Account.Server == Server).Count() / (double)Server.MaxPlayers * 100d));//FF FF FF FF Should be Maintanance
            }
            #endregion
            memory.Position = 0;
            byte[] answer = new byte[memory.Length];
            memory.Read(answer, 0, answer.Length);
            writer.Close();
            memory.Close();
            client.Send(new AuthPackets.Packet(AuthPackets.Packet.PacketType.S2C_GoBackForServers, answer));
        }
コード例 #5
0
 private static void Login(Enums.LoginTypes type, Client.AuthClient client)
 {
     if (type == Enums.LoginTypes.NoError)
     {
         byte[] Buffer = new byte[800];
         var    packet = new AuthPackets.Packet(AuthPackets.Packet.PacketType.S2C_ValidAccount, Buffer);
         packet.buffer[8] = 2; packet.buffer[406] = 1;
         client.Send(packet);
         SendServers(client);
     }
     else
     {
         byte[] buff = new byte[1452];
         Writer.Write((byte)type, 2, buff);
         if (type == Enums.LoginTypes.Player_Already_Logged_In)
         {
             Writer.Write(client.Account.EntityID, 26, buff);
         }
         client.Send(new AuthPackets.Packet(AuthPackets.Packet.PacketType.S2C_DisplayError, buff));
     }
 }
コード例 #6
0
        public static void Process(Client.AuthClient client, AuthPackets.Packet packet)
        {
            if (packet.CorrectPacket)
            {
                switch (packet.packetType)
                {
                case AuthPackets.Packet.PacketType.C2S_Login:
                    var Username    = Encoding.ASCII.GetString(packet.buffer, 16, 20).Replace(Encoding.ASCII.GetString(new byte[] { 0x0 }), "");
                    var Password    = Encoding.ASCII.GetString(packet.buffer, 37, 20).Replace(Encoding.ASCII.GetString(new byte[] { 0x0 }), "");
                    var CFArugments = Encoding.ASCII.GetString(packet.buffer, 145, 12).Replace(Encoding.ASCII.GetString(new byte[] { 0x0 }), "");
                    var MacAddress  = Encoding.ASCII.GetString(packet.buffer, 407, 12).Replace(Encoding.ASCII.GetString(new byte[] { 0x0 }), "");
                    client.Account = new Database.AccountTable(Username)
                    {
                        IP = client.Socket.IP
                    };
                    client.Account.Identifer = Encoding.ASCII.GetString(packet.buffer, 77, 32).Replace(Encoding.ASCII.GetString(new byte[] { 0x0 }), "");
                    if (client.Account.exists && client.Account.Password == Password && !Kernel.GamePool.ContainsKey(client.Account.EntityID))
                    {
                        Kernel.AwaitingPool[client.Account.Identifer] = client.Account;
                        Login(Enums.LoginTypes.NoError, client);
                    }
                    else if (client.Account.exists && client.Account.Password == Password && Kernel.GamePool.ContainsKey(client.Account.EntityID))
                    {
                        Login(Enums.LoginTypes.Player_Already_Logged_In, client);
                    }
                    else
                    {
                        Login(Enums.LoginTypes.Unknown_Username_Or_Password, client);
                    }
                    break;

                case AuthPackets.Packet.PacketType.C2S_AccountAlreadyLoggedOn:
                    if (client.Account != null)
                    {
                        var player = Kernel.GamePool.Values.Where(i => i.Account.EntityID == client.Account.EntityID).FirstOrDefault();
                        player.Disconnect();
                        packet = new AuthPackets.Packet(AuthPackets.Packet.PacketType.S2C_PlayerHasBeenLoggedOut, new byte[0]);
                        client.Send(packet);
                    }
                    break;

                case AuthPackets.Packet.PacketType.C2S_LoginToGameServer_Step1:
                    byte ServerNumber = packet.buffer[6];
                    client.Account.Server = Program.Servers[ServerNumber - 1];
                    SendNewGUID(client);
                    break;

                case AuthPackets.Packet.PacketType.C2S_LoginToGameServer_Step2:
                    while (true)
                    {
                        if (Kernel.GamePool.ContainsKey(client.Account.EntityID) && Kernel.GamePool[client.Account.EntityID].Entity.FullyLoaded)
                        {
                            var ans = new AuthPackets.Packet(AuthPackets.Packet.PacketType.S2C_LoginToGameServer_Step2, new byte[4] {
                                1, 0, 0, 0
                            });
                            client.Send(ans);
                            break;
                        }
                        else
                        {
                            System.Threading.Thread.Sleep(10);
                        }
                    }
                    break;

                case AuthPackets.Packet.PacketType.C2S_GoBackForServers:
                    ReturnToServers(client, packet);
                    break;

                case AuthPackets.Packet.PacketType.C2S_CheckNameExsitance:
                    CheckNameExistance(client, packet);
                    break;

                case AuthPackets.Packet.PacketType.C2S_CreateAccount:
                    CreateAccount(client, packet);
                    break;

                case AuthPackets.Packet.PacketType.C2S_Exit:
                    //Send a Packet To Confirm Exit
                    packet.buffer[4] = 12;
                    client.Send(packet);
                    client.Disconnect();
                    break;

                case AuthPackets.Packet.PacketType.Unknown:
                    if (Program.CaptureUnknownPackets)
                    {
                        Console.WriteLine("Unknown Packet! =>  (" + packet.buffer[3] + "-" + packet.buffer[4] + "-" + packet.buffer[5] + ")");
                    }
                    break;
                }
            }
            else
            {
                Console.WriteLine("Incorrent Packet Structure! =>  (" + packet.buffer[3] + "-" + packet.buffer[4] + "-" + packet.buffer[5] + ")");
            }
        }