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; } }
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); }
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)); }
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; } }
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); } } }
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()); }
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); } }
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); } }
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)); }
// 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); } }
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); } } }
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); } } }
public static void ERROR_LOG(MapleClient c, InPacket p) { Console.WriteLine($"错误信息:{p.ReadMapleString()}"); }
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); } }