Ejemplo n.º 1
0
        public static void LOGIN_AUTH(MapleClient c, InPacket p)
        {
            var username = p.ReadMapleString();
            var password = p.ReadMapleString();

            var result = DatabaseHelper.Login(c, username, password);

            switch (result)
            {
            case DatabaseHelper.LoginResultCode.GenderNeeded:
                c.State = LoginStateType.WaitingForDetail;
                c.Send(LoginPacket.GenderNeeded(username));
                break;

            case DatabaseHelper.LoginResultCode.Success:
                c.State = LoginStateType.LoggedIn;
                var userLogged = new List <int>(ServerSettings.ChannelCount);
                MasterServer.Instance.ChannelServers.ForEach(x => userLogged.Add(x.UserLogged));
                c.Send(LoginPacket.AuthSuccess(username, c.Account.Id, c.Account.Gender != null && c.Account.Gender.Value));
                c.State = LoginStateType.LoggedIn;
                c.Send(LoginPacket.ServerList(userLogged.ToArray()));
                c.Send(LoginPacket.ServerListEnd());
                break;

            default:
                c.Send(LoginPacket.AuthAccountFailed((int)result));
                break;
            }
        }
Ejemplo n.º 2
0
        public static void HandleCharacterSelection(MapleClient client, InPacket iPacket)
        {
            int    characterID  = iPacket.ReadInt();
            string macAddresses = iPacket.ReadMapleString(); // TODO: Do something with these.

            LoginHandler.MigrateClient(client, characterID);
        }
Ejemplo n.º 3
0
        public static void CHECK_CHAR_NAME(MapleClient c, InPacket p)
        {
            var name     = p.ReadMapleString();
            var nameused = DatabaseHelper.CheckNameUsed(c, name);

            c.Send(LoginPacket.CharNameResponse(name, nameused));
        }
Ejemplo n.º 4
0
        public static void OnTransferFieldRequest(MapleClient client, InPacket iPacket)
        {
            byte portals = iPacket.ReadByte();

            if (portals != client.Character.Portals)
            {
                return;
            }

            int destinationID = iPacket.ReadInt();

            switch (destinationID)
            {
            case -1:
            {
                string label = iPacket.ReadMapleString();
                Portal portal;

                try
                {
                    portal = client.Character.Map.Portals[label];
                }
                catch (KeyNotFoundException)
                {
                    return;
                }

                client.Character.ChangeMap(portal.Data.DestinationMap, portal.Link.ID);
            }
            break;
            }
        }
Ejemplo n.º 5
0
        public static void OnCreateNewCharacter(MapleClient c, InPacket p)
        {
            string name = p.ReadMapleString();

            if (Database.Instance.NameAvailable(name))
            {
                Character character = new Character(name);
                character.AccountId = c.Account.AccountId;
                character.CharId    = Database.Instance.GetNewCharacterId();
                character.Level     = 1;

                character.HP    = 50;
                character.MaxHP = 50;
                character.MP    = 5;
                character.MaxMP = 5;

                character.Face      = p.ReadInt();
                character.Hair      = p.ReadInt() + p.ReadInt();
                character.SkinColor = (byte)p.ReadInt();

                int top    = p.ReadInt();
                int bottom = p.ReadInt();
                int shoes  = p.ReadInt();
                int weapon = p.ReadInt();

                character.Inventory[InventorySlot.Equipped].Items.Add(-5, new Item(top));
                character.Inventory[InventorySlot.Equipped].Items.Add(-6, new Item(bottom));
                character.Inventory[InventorySlot.Equipped].Items.Add(-7, new Item(shoes));
                character.Inventory[InventorySlot.Equipped].Items.Add(-11, new Item(weapon));

                character.Str = p.ReadByte();
                character.Dex = p.ReadByte();
                character.Int = p.ReadByte();
                character.Luk = p.ReadByte();

                c.Characters.Add(character);
                Database.Instance.Save <Character>(Database.Characters, character);

                using (OutPacket packet = new OutPacket(SendOps.CreateNewCharacterResult))
                {
                    packet.WriteByte();

                    PacketCreator.Helper.AddCharacterData(packet, character);
                    PacketCreator.Helper.AddCharaterLook(packet, character);
                    packet.WriteBool(false); //rank

                    packet.WriteZero(24);
                    c.Send(packet);
                }
            }
            else
            {
                using (OutPacket packet = new OutPacket(SendOps.CheckDuplicatedIDResult))
                {
                    packet.WriteMapleString(name);
                    packet.WriteBool(true);
                    c.Send(packet);
                }
            }
        }
Ejemplo n.º 6
0
        public static void OnGENDER_RESULT(MapleClient c, InPacket p)
        {
            var gender   = p.ReadByte();        //00 男 01女
            var username = p.ReadMapleString(); //username

            DatabaseHelper.ChangeGender(c, username, gender);
            c.Send(LoginPacket.GenderChanged(username, c.Account.Id.ToString()));
            c.Send(LoginPacket.LicenseRequest());
        }
Ejemplo n.º 7
0
        public static void OnCheckDuplicatedID(MapleClient c, InPacket p)
        {
            string name  = p.ReadMapleString();
            bool   taken = !Database.Instance.NameAvailable(name);

            using (OutPacket packet = new OutPacket(SendOps.CheckDuplicatedIDResult))
            {
                packet.WriteMapleString(name);
                packet.WriteBool(taken);
                c.Send(packet);
            }
        }
Ejemplo n.º 8
0
        public static void HandleCharacterNameCheck(MapleClient client, InPacket iPacket)
        {
            string name     = iPacket.ReadMapleString();
            bool   unusable = (long)Database.Scalar("SELECT COUNT(*) FROM `characters` WHERE `name` = @name", new MySqlParameter("name", name)) != 0;

            using (OutPacket oPacket = new OutPacket(SendOps.CheckDuplicatedIDResult))
            {
                oPacket
                .WriteMapleString(name)
                .WriteBool(unusable);

                client.Send(oPacket);
            }
        }
Ejemplo n.º 9
0
        public static void CREATE_CHAR(MapleClient c, InPacket p)
        {
            var name = p.ReadMapleString();

            var  job       = p.ReadInt();
            var  face      = p.ReadInt();
            var  hair      = p.ReadInt();
            var  hairColor = 0;
            byte skinColor;

            if (job == 0)
            {
                skinColor = 10;
            }
            else if (job == 2)
            {
                skinColor = 11;
            }
            else
            {
                skinColor = 0;
            }

            var top    = p.ReadInt();
            var bottom = p.ReadInt();
            var shoes  = p.ReadInt();
            var weapon = p.ReadInt();

            var newchar = new MapleCharacter();

            newchar.Create(c, job, top, bottom, shoes, weapon);

            if (c.Account.IsGm)
            {
                newchar.GmLevel = 1;
            }

            //newchar.WorldId = c.WorldId;
            newchar.Face   = face;
            newchar.Hair   = hair + hairColor;
            newchar.Gender = c.Account.Gender ?? false;

            newchar.Name = name;
            newchar.Skin = MapleSkinColor.GetByColorId(skinColor);



            newchar.Save();
            c.Send(LoginPacket.AddNewCharEntry(newchar, true));
        }
Ejemplo n.º 10
0
        // TODO: Handle different scenarios (ban, quiet ban, etcetera).
        public static void HandleLoginPassword(MapleClient client, InPacket iPacket)
        {
            string username = iPacket.ReadMapleString();
            string password = iPacket.ReadMapleString();

            Account account;

            using (DatabaseQuery query = Database.Query("SELECT * FROM `accounts` WHERE `username` = @username", new MySqlParameter("username", username)))
            {
                if (!query.NextRow())
                {
                    if (MasterServer.Instance.Login.AutoRegister && username == client.LastUsername && password == client.LastPassword)
                    {
                        // TODO: Auto register.
                    }
                    else
                    {
                        LoginHandler.SendLoginResult(client, LoginResult.NotRegistered);
                    }

                    return;
                }

                account = new Account(query);
            }

            if (SHACryptograph.Encrypt(SHAMode.SHA512, password + account.Salt) != account.Password)
            {
                LoginHandler.SendLoginResult(client, LoginResult.IncorrectPassword);
            }
            else
            {
                client.Account = account;

                LoginHandler.SendLoginResult(client, LoginResult.Valid);
            }
        }
Ejemplo n.º 11
0
        public static void OnChat(MapleClient client, InPacket iPacket)
        {
            string text  = iPacket.ReadMapleString();
            bool   shout = iPacket.ReadBool(); // NOTE: Used for skill macros.

            if (text.StartsWith(Constants.CommandIndiciator.ToString()))
            {
                MasterServer.Instance.Commands.Execute(client.Character, text);
            }
            else
            {
                using (OutPacket oPacket = new OutPacket(SendOps.UserChat))
                {
                    oPacket
                    .WriteInt(client.Character.ID)
                    .WriteBool(client.Character.IsGm)
                    .WriteMapleString(text)
                    .WriteBool(shout);

                    client.Character.Map.Broadcast(oPacket);
                }
            }
        }
Ejemplo n.º 12
0
        public static void HandleCharacterCreation(MapleClient client, InPacket iPacket)
        {
            string name      = iPacket.ReadMapleString();
            int    jobType   = iPacket.ReadInt();
            int    face      = iPacket.ReadInt();
            int    hair      = iPacket.ReadInt();
            int    hairColor = iPacket.ReadInt();
            byte   skin      = (byte)iPacket.ReadInt();
            int    topID     = iPacket.ReadInt();
            int    bottomID  = iPacket.ReadInt();
            int    shoesID   = iPacket.ReadInt();
            int    weaponID  = iPacket.ReadInt();
            Gender gender    = (Gender)iPacket.ReadByte();

            bool error = false;

            // TODO: Validate name, beauty and equipment before creating the character.

            int id = Database.InsertAndReturnIdentifier("INSERT INTO `characters` (account_id, world_id, name, gender, skin, face, hair) " +
                                                        "VALUES (@account_id, @world_id, @name, @gender, @skin, @face, @hair)",
                                                        new MySqlParameter("account_id", client.Account.ID),
                                                        new MySqlParameter("world_id", client.World),
                                                        new MySqlParameter("name", name),
                                                        new MySqlParameter("gender", gender),
                                                        new MySqlParameter("skin", skin),
                                                        new MySqlParameter("face", face),
                                                        new MySqlParameter("hair", hair));

            // TODO: Validate the default equipment statistics. I'm pretty sure some of them are untradable.

            Database.Execute("INSERT INTO `items` (character_id, inventory, slot, maple_id, weapon_defense) " +
                             "VALUES (@character_id, 0, -5, @maple_id, 3)",
                             new MySqlParameter("character_id", id),
                             new MySqlParameter("maple_id", topID));

            Database.Execute("INSERT INTO `items` (character_id, inventory, slot, maple_id, weapon_defense) " +
                             "VALUES (@character_id, 0, -6, @maple_id, 2)",
                             new MySqlParameter("character_id", id),
                             new MySqlParameter("maple_id", bottomID));

            Database.Execute("INSERT INTO `items` (character_id, inventory, slot, maple_id, slots, weapon_defense) " +
                             "VALUES (@character_id, 0, -7, @maple_id, 5, 3)",
                             new MySqlParameter("character_id", id),
                             new MySqlParameter("maple_id", shoesID));

            Database.Execute("INSERT INTO `items` (character_id, inventory, slot, maple_id, slots, weapon_attack) " +
                             "VALUES (@character_id, 0, -11, @maple_id, 7, 17)",
                             new MySqlParameter("character_id", id),
                             new MySqlParameter("maple_id", weaponID));

            // TODO: Add beginner's guide (based on job).

            using (DatabaseQuery query = Database.Query("SELECT * FROM characters WHERE `character_id` = @character_id", new MySqlParameter("character_id", id)))
            {
                query.NextRow();

                using (OutPacket oPacket = new OutPacket(SendOps.CreateNewCharacterResult))
                {
                    oPacket.WriteBool(error);

                    LoginHandler.AddCharacterEntry(oPacket, query);

                    client.Send(oPacket);
                }
            }
        }
Ejemplo n.º 13
0
 public static void ERROR_LOG(MapleClient c, InPacket p)
 {
     Console.WriteLine($"错误信息:{p.ReadMapleString()}");
 }
Ejemplo n.º 14
0
        public static void OnCheckPassword(MapleClient c, InPacket p)
        {
            string user = p.ReadMapleString().Trim();
            string pass = p.ReadMapleString();

            //byte[] machineId = p.ReadBytes(0x10);
            //int gameRoomCode = p.ReadInt();
            //byte gameStartMode = p.ReadByte();
            //bool adminClient = p.ReadBool();

            byte loginResult = MasterServer.Instance.LoginClient(c, user, pass);

            using (OutPacket packet = new OutPacket(SendOps.CheckPasswordResult))
            {
                packet.WriteByte(loginResult);
                packet.WriteZero(5); //v11 (1) + v12 (4)

                if (loginResult == 0)
                {
                    packet.WriteInt(c.Account.AccountId);
                    packet.WriteByte();
                    packet.WriteBool(c.Account.GM);
                    packet.WriteByte(1);
                    packet.WriteMapleString(c.Account.Username);
                    packet.WriteZero(12);
                }
                else if (loginResult == 2) //TODO : Add packet for this
                {
                    c.Close();
                    return;
                }

                packet.WriteZero(24); //padding
                c.Send(packet);
            }

            if (loginResult != 0)
            {
                return;
            }

            using (OutPacket packet = new OutPacket(SendOps.CheckUserLimitResult, 3))
            {
                packet.WriteByte(4);
                c.Send(packet);
            }

            using (OutPacket packet = new OutPacket(SendOps.WorldInformation))
            {
                byte   worldId = 0;
                string name    = Constants.WorldName;

                packet.WriteByte(worldId);
                packet.WriteMapleString(name);

                packet.WriteByte((byte)MasterServer.Instance.Channels.Length);

                int id = 1;

                foreach (var ch in MasterServer.Instance.Channels)
                {
                    packet.WriteMapleString("{0}-{1}", name, id++);
                    packet.WriteInt(ch.Load);
                    packet.WriteByte(worldId);
                    packet.WriteByte((byte)(id - 1));
                    packet.WriteByte(0x00);
                }

                c.Send(packet);
            }

            using (OutPacket packet = new OutPacket(SendOps.WorldInformation, 3))
            {
                packet.WriteByte(0xff);
                c.Send(packet);
            }
        }