Beispiel #1
0
        private void MsgHandler_CreateA(Client client, ClientPacket msg)
        {
            string name     = msg.ReadString(msg.ReadByte()).ToLower();
            string password = msg.ReadString(msg.ReadByte());
            string email    = msg.ReadString(msg.ReadByte());

            var com = Program.MySqlConnection.CreateCommand();

            com.CommandText = "SELECT COUNT(*) FROM characters WHERE (name = @name) AND (server = @server)";
            com.Parameters.AddWithValue("@name", name);
            com.Parameters.AddWithValue("@server", GameServer.Name);
            var result = com.ExecuteScalar();

            if ((long)result > 0)
            {
                client.SendLoginMessage(3, "That name is unavailable.");
                return;
            }

            foreach (var str in RESERVED_STRINGS)
            {
                if (name.Contains(str))
                {
                    client.SendLoginMessage(3, "That name is unavailable.");
                    return;
                }
            }

            if (!GameServer.AllowCreate)
            {
                client.SendLoginMessage(3, "Character creation is currently disabled.");
                return;
            }

            for (int i = 0; i < name.Length; i++)
            {
                if (!ALLOWED_CHARACTERS.Contains(name[i]))
                {
                    client.SendLoginMessage(3, "Character names may only contain letters.");
                    return;
                }
            }

            if ((name.Length < 4) || (name.Length > 12))
            {
                client.SendLoginMessage(3, "Character names must be 4 to 12 letters long.");
                return;
            }

            if ((password.Length < 4) || (password.Length > 8))
            {
                client.SendLoginMessage(5, "Passwords must be 4 to 8 characters long.");
                return;
            }

            client.NewPlayerName     = name;
            client.NewPlayerPassword = password;

            client.SendLoginMessage(0, "\0");
        }
Beispiel #2
0
        private void MsgHandler_ChangePassword(Client client, ClientPacket msg)
        {
            var name        = msg.ReadString(msg.ReadByte());
            var oldPassword = msg.ReadString(msg.ReadByte());
            var newPassword = msg.ReadString(msg.ReadByte());

            var character_id = 0;
            var password     = String.Empty;
            var exists       = false;

            var com = Program.MySqlConnection.CreateCommand();

            com.CommandText = "SELECT characters.character_id, characters.password "
                              + "FROM characters "
                              + "WHERE (characters.name = @name) AND (characters.server = @server)";
            com.Parameters.AddWithValue("@name", name);
            com.Parameters.AddWithValue("@server", GameServer.Name);
            var reader = com.ExecuteReader();

            if (reader.Read())
            {
                character_id = reader.GetInt32(0);
                password     = reader.GetString(1);
                exists       = true;
            }
            reader.Close();

            if (!exists)
            {
                client.SendLoginMessage(14, "That character does not exist.");
                return;
            }

            if (oldPassword != password)
            {
                client.SendLoginMessage(14, "Incorrect password.");
                return;
            }

            com             = Program.MySqlConnection.CreateCommand();
            com.CommandText = "UPDATE characters SET characters.password=@password WHERE characters.character_id=@character_id";
            com.Parameters.AddWithValue("@password", newPassword);
            com.Parameters.AddWithValue("@character_id", character_id);

            if (com.ExecuteNonQuery() < 0)
            {
                client.SendLoginMessage(14, "Unknown error.");
                return;
            }

            client.SendLoginMessage(0, "\0");
        }
Beispiel #3
0
 private void MsgHandler_RequestMetafile(Client client, ClientPacket msg)
 {
     if (!msg.ReadBoolean())
     {
         string fileName = msg.ReadString(msg.ReadByte());
         if (GameServer.MetafileDatabase.ContainsKey(fileName))
         {
             var p = new ServerPacket(0x6F);
             p.WriteByte(0);
             p.WriteString8(fileName);
             p.WriteUInt32(GameServer.MetafileDatabase[fileName].Checksum);
             p.WriteUInt16((ushort)GameServer.MetafileDatabase[fileName].RawData.Length);
             p.Write(GameServer.MetafileDatabase[fileName].RawData);
             client.Enqueue(p);
         }
     }
     else
     {
         var p = new ServerPacket(0x6F);
         p.WriteByte(1);
         p.WriteUInt16((ushort)GameServer.MetafileDatabase.Count);
         foreach (var kvp in GameServer.MetafileDatabase)
         {
             p.WriteString8(kvp.Value.Name);
             p.WriteUInt32(kvp.Value.Checksum);
         }
         client.Enqueue(p);
     }
 }
Beispiel #4
0
        private void MsgHandler_ClientJoin(Client client, ClientPacket msg)
        {
            byte seed = msg.ReadByte();

            byte[] key  = msg.Read(msg.ReadByte());
            string name = msg.ReadString(msg.ReadByte());
            uint   id   = msg.ReadUInt32();

            Encryption.Parameters encryptionParameters = new Encryption.Parameters(key, seed);

            if (ExpectedRedirects.ContainsKey(id) && (ExpectedRedirects[id] != null))
            {
                Redirection r = ExpectedRedirects[id];
                if ((r.Name == name) && r.EncryptionParameters.Matches(encryptionParameters))
                {
                    if (r.SourceServer == Program.LobbyServer || r.SourceServer is LoginServer)
                    {
                        var p = new ServerPacket(0x60);
                        p.WriteByte(0x00);
                        p.WriteUInt32(Notification.Checksum);
                        client.Enqueue(p);

                        var packet = new ServerPacket(0x6F);
                        packet.WriteByte(1);
                        packet.WriteUInt16((ushort)GameServer.MetafileDatabase.Count);
                        foreach (var kvp in GameServer.MetafileDatabase)
                        {
                            packet.WriteString8(kvp.Value.Name);
                            packet.WriteUInt32(kvp.Value.Checksum);
                        }
                        client.Enqueue(packet);
                    }
                }
            }
        }
Beispiel #5
0
        private void MsgHandler_Login(Client client, ClientPacket msg)
        {
            var name      = msg.ReadString(msg.ReadByte());
            var password1 = msg.ReadString(msg.ReadByte());

            var accountid  = 0;
            var password2  = String.Empty;
            var gamemaster = AdminRights.None;
            var active     = false;
            var exists     = false;

            var com = Program.MySqlConnection.CreateCommand();

            com.CommandText = "SELECT characters.acct_id, characters.password, characters.gm, accounts.active "
                              + "FROM characters "
                              + "LEFT JOIN accounts "
                              + "ON characters.acct_id = accounts.acct_id "
                              + "WHERE (characters.name = @name) AND (characters.server = @server)";
            com.Parameters.AddWithValue("@name", name);
            com.Parameters.AddWithValue("@server", GameServer.Name);
            var reader = com.ExecuteReader();

            if (reader.Read())
            {
                accountid  = reader.GetInt32(0);
                password2  = reader.GetString(1);
                gamemaster = (AdminRights)Enum.Parse(typeof(AdminRights), reader.GetString(2));
                active     = (!reader.IsDBNull(3) && reader.GetBoolean(3));
                exists     = true;
            }
            reader.Close();

            if (!GameServer.AllowLogin)
            {
                client.SendLoginMessage(14, "The game server is currently closed.");
                return;
            }

            if (!exists)
            {
                client.SendLoginMessage(14, "That character does not exist.");
                return;
            }

            if (password1 != password2)
            {
                client.SendLoginMessage(14, "Incorrect password.");
                return;
            }

            if (accountid == 0)
            {
                client.SendLoginMessage(14, "Please register your character at game.wewladh.com");
                return;
            }

            if (!active)
            {
                client.SendLoginMessage(14, "Your account has been locked.");
                return;
            }

            foreach (Client c in GameServer.Clients)
            {
                if ((c.Player != null) && c.Player.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase))
                {
                    c.Connected = false;
                    client.SendLoginMessage(14, "Your character is already playing.");
                    return;
                }
                if ((c.Player != null) && (accountid != 0) && (c.Player.AccountID == accountid))
                {
                    c.Connected = false;
                    client.SendLoginMessage(14, "Your account is already playing.");
                    return;
                }
            }

            if (Program.RunningSlowly)
            {
                client.SendLoginMessage(14, "The game server is busy right now. Please try again.");
                return;
            }

            client.SendLoginMessage(0, "\0");

            var p = new ServerPacket(0x22);

            p.WriteByte(0x00);
            client.Enqueue(p);

            foreach (var message in File.ReadAllLines(GameServer.DataPath + "\\login.txt"))
            {
                client.SendMessage(message);
            }

            var r = new Redirection();

            r.DestinationServer    = GameServer;
            r.EncryptionParameters = client.EncryptionParams;
            r.Name         = name;
            r.SourceServer = this;
            client.Redirect(r);
        }