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
            public override DialogB Next(Player p, ClientPacket msg)
            {
                var chest = GameObject as Chest;

                if (chest.Items.Contains(ChestItem))
                {
                    msg.ReadByte();
                    var option = msg.ReadByte();

                    switch (option)
                    {
                    case 1:
                        chest.Say(string.Format("{0} rolls need for {1}.", p.Name, ChestItem.Item.Name), 1);
                        ChestItem.Choices.Add(p, 1);
                        break;

                    case 2:
                        chest.Say(string.Format("{0} rolls greed for {1}.", p.Name, ChestItem.Item.Name), 1);
                        ChestItem.Choices.Add(p, 2);
                        break;

                    default:
                        chest.Say(string.Format("{0} passed on {1}.", p.Name, ChestItem.Item.Name), 1);
                        ChestItem.Choices.Add(p, 0);
                        break;
                    }
                }

                return(null);
            }
Beispiel #3
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 #4
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 #5
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 #6
0
        private void MsgHandler_ServerTable(Client client, ClientPacket msg)
        {
            bool mismatch = msg.ReadBoolean();
            int  serverId = msg.ReadByte();

            if (mismatch)
            {
                var p = new ServerPacket(0x56);
                p.WriteUInt16((ushort)Program.RawData.Length);
                p.Write(Program.RawData);
                client.Enqueue(p);
            }
            else
            {
                Redirection r = new Redirection();
                r.DestinationServer    = Program.GameServers[serverId].LoginServer;
                r.EncryptionParameters = client.EncryptionParams;
                r.Name         = String.Format(String.Empty, r.ID);
                r.SourceServer = this;
                client.Redirect(r);
            }
        }
Beispiel #7
0
            public override DialogB Next(Player p, ClientPacket msg)
            {
                var chest = GameObject as Chest;

                msg.ReadByte();
                var option = msg.ReadByte() - 1;

                if (option < chest.Items.Count)
                {
                    var items = new ChestItem[chest.Items.Count];
                    chest.Items.CopyTo(items);

                    var item = items[option];

                    if (item.Choices.ContainsKey(p))
                    {
                        p.Client.SendMessage("You have already rolled on that item");
                        return(null);
                    }

                    var attr = new List <string>();

                    if (item.Item is Equipment)
                    {
                        attr.Add(string.Format("Level {0} {1} {2}", Math.Max(item.Item.Level, 1),
                                               item.Item.Class, item.Item.GetType().BaseType.Name));
                    }
                    else
                    {
                        if (item.Item.Level > 1)
                        {
                            attr.Add("Level: " + item.Item.Level);
                        }
                        if (item.Item.Class != Profession.Peasant)
                        {
                            attr.Add("Class: " + item.Item.Class);
                        }
                    }

                    if (item.Item.StrMod != 0)
                    {
                        attr.Add("STR: " + item.Item.StrMod);
                    }
                    if (item.Item.IntMod != 0)
                    {
                        attr.Add("INT: " + item.Item.IntMod);
                    }
                    if (item.Item.WisMod != 0)
                    {
                        attr.Add("WIS: " + item.Item.WisMod);
                    }
                    if (item.Item.ConMod != 0)
                    {
                        attr.Add("CON: " + item.Item.ConMod);
                    }
                    if (item.Item.DexMod != 0)
                    {
                        attr.Add("DEX: " + item.Item.DexMod);
                    }
                    if (item.Item.HitMod != 0)
                    {
                        attr.Add("HIT: " + item.Item.HitMod);
                    }
                    if (item.Item.DmgMod != 0)
                    {
                        attr.Add("DMG: " + item.Item.DmgMod);
                    }
                    if (item.Item.MaximumHpMod != 0)
                    {
                        attr.Add("HP: " + item.Item.MaximumHpMod);
                    }
                    if (item.Item.MaximumMpMod != 0)
                    {
                        attr.Add("MP: " + item.Item.MaximumMpMod);
                    }
                    if (item.Item.ArmorClassMod != 0)
                    {
                        attr.Add("AC: " + item.Item.ArmorClassMod);
                    }
                    if (item.Item.MagicResistanceMod != 0)
                    {
                        attr.Add("MR: " + item.Item.MagicResistanceMod);
                    }
                    if (item.Item.MaximumAttackPowerMod != 0)
                    {
                        attr.Add(string.Format("Attack Power: {0}-{1}", item.Item.MinimumAttackPowerMod, item.Item.MaximumAttackPowerMod));
                    }
                    if (item.Item.MaximumMagicPowerMod != 0)
                    {
                        attr.Add(string.Format("Magic Power: {0}-{1}", item.Item.MinimumMagicPowerMod, item.Item.MaximumMagicPowerMod));
                    }

                    var dialog = new LootItemDialog();
                    dialog.ChestItem   = item;
                    dialog.Message     = string.Join(", ", attr);
                    dialog.CustomName  = item.Item.Name;
                    dialog.CustomImage = (ushort)(item.Item.Sprite + 0x8000);
                    return(dialog);
                }

                return(null);
            }
Beispiel #8
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);
        }
Beispiel #9
0
        private void MsgHandler_CreateB(Client client, ClientPacket msg)
        {
            if (string.IsNullOrEmpty(client.NewPlayerName) || string.IsNullOrEmpty(client.NewPlayerPassword))
            {
                return;
            }

            var com = Program.MySqlConnection.CreateCommand();

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

            if ((long)result > 0)
            {
                client.SendLoginMessage(3, "That character already exists.");
                return;
            }

            Player p = Player.Create(GameServer, client.NewPlayerName);

            com             = Program.MySqlConnection.CreateCommand();
            com.CommandText = "INSERT INTO characters VALUES (0, @name, @password, 0, @server, @creation_date, 0, "
                              + "'None', 'None', 'Peasant', 'None', 0, 0, 0, 0, 'North', 0, 0, 0, 0, 0, 0, "
                              + "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 0, 'None', '', '')"; // 50
            com.Parameters.AddWithValue("@name", client.NewPlayerName);
            com.Parameters.AddWithValue("@password", client.NewPlayerPassword);
            com.Parameters.AddWithValue("@server", GameServer.Name);
            com.Parameters.AddWithValue("@creation_date", DateTime.UtcNow);
            com.ExecuteNonQuery();

            com             = Program.MySqlConnection.CreateCommand();
            com.CommandText = "SELECT character_id FROM characters WHERE (name = @name) AND (server = @server)";
            com.Parameters.AddWithValue("@name", p.Name);
            com.Parameters.AddWithValue("@server", GameServer.Name);
            result = com.ExecuteScalar();
            p.GUID = (int)result;

            p.HairStyle = msg.ReadByte();
            p.Sex       = (Gender)msg.ReadByte();
            p.HairColor = msg.ReadUInt16();

            if ((p.HairStyle > 17) || (p.HairStyle < 1))
            {
                p.HairStyle = 1;
            }

            if ((p.Sex != Gender.Male) && (p.Sex != Gender.Female))
            {
                p.Sex = Gender.Male;
            }

            if (p.HairColor > 13)
            {
                p.HairColor = 0;
            }
            p.Loaded = true;
            p.Save();
            client.NewPlayerName     = null;
            client.NewPlayerPassword = null;

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

            Program.WriteLine("New character created: {0}", p.Name);
        }