private static void HandleNameVoucher(GameSession session, PacketReader packet, Item item) { string newName = packet.ReadUnicodeString(); string oldName = session.Player.Name; session.Player.Name = newName; session.Player.Inventory.ConsumeItem(session, item.Uid, 1); session.Send(CharacterListPacket.NameChanged(session.Player.CharacterId, newName)); // Update name on socials foreach (Club club in session.Player.Clubs) { club.BroadcastPacketClub(ClubPacket.UpdateMemberName(oldName, newName, session.Player.CharacterId)); if (club.LeaderCharacterId == session.Player.CharacterId) { club.LeaderName = newName; } } if (session.Player.Guild is not null) { session.Player.Guild?.BroadcastPacketGuild(GuildPacket.UpdateMemberName(oldName, newName)); if (session.Player.Guild.LeaderCharacterId == session.Player.CharacterId) { session.Player.Guild.LeaderName = newName; } } session.Player.Party?.BroadcastPacketParty(PartyPacket.UpdatePlayer(session.Player)); // TODO: Needs to redirect player to character selection screen after pop-up }
public void CharacterListPacket_Initialization() { const OutgoingPacketType ExpectedPacketType = OutgoingPacketType.CharacterList; const ushort ExpectedPremiumDays = 7; ExceptionAssert.Throws <ArgumentException>(() => new CharacterListPacket(null, ExpectedPremiumDays), "Value cannot be null. (Parameter 'characters')"); var expectedCharList = new List <CharacterInfo>() { new CharacterInfo() { Name = "Char 1", Ip = IPAddress.Loopback.GetAddressBytes(), Port = 123, World = "Fibula" }, new CharacterInfo() { Name = "Char 2", Ip = IPAddress.Any.GetAddressBytes(), Port = 321, World = "Fibula 2" }, }; var packet = new CharacterListPacket(expectedCharList, ExpectedPremiumDays); Assert.AreEqual(ExpectedPacketType, packet.PacketType, $"Expected {nameof(packet.PacketType)} to match {ExpectedPacketType}."); Assert.IsNotNull(packet.Characters); CollectionAssert.AreEqual(expectedCharList, packet.Characters.ToArray(), $"Expected {nameof(packet.Characters)} to match {expectedCharList}."); Assert.AreEqual(ExpectedPremiumDays, packet.PremiumDaysLeft, $"Expected {nameof(packet.PremiumDaysLeft)} to match {ExpectedPremiumDays}."); }
private void GameEnter() //TODO move this to player class { CharacterChoosePacket ccp = (CharacterChoosePacket)ReadPacket(new CharacterChoosePacket()); _log.Info(ccp.Index.ToString(CultureInfo.InvariantCulture)); //TODO Save characters in class CharacterDAO chrMgr = new CharacterDAO(Server.ServerInstance.Database); AccountDAO accMgr = new AccountDAO(Server.ServerInstance.Database); int accountID = accMgr.GetAccountID(AccountName); Character[] chars = chrMgr.GetCharactersByAccount(accountID); CharacterListPacket clp = new CharacterListPacket(chars, accMgr.GetAccountEmpire(accountID)); //TODO Everything wrong down here //inventario -> SendPacket(new InventoryItemsPacket()); //stats SendPacket(new CharacterStatsPacket(chars[ccp.Index])); //TODO Check index //unknown 1 ReadBuffer(8); //entity spawn SendPacket(new EntitySpawnPacket(chars[ccp.Index])); LauncherNamePacket lnp = new LauncherNamePacket(); ReadPacket(lnp); }
public static PacketWriter Join(Player player) { PacketWriter pWriter = PacketWriter.Of(SendOp.PARTY); pWriter.Write(PartyPacketMode.Join); CharacterListPacket.WriteCharacter(player, pWriter); pWriter.WriteInt(); pWriter.WriteSkills(player); pWriter.WriteLong(); return(pWriter); }
/// <summary> /// Sends the login window. /// </summary> /// <param name="remainingPremiumDays">The remaining premium days.</param> /// <param name="userName">The user name.</param> /// <param name="password">The password.</param> /// <param name="characters">The characters.</param> /// <param name="worlds">The worlds.</param> /// <param name="messageOfTheDay">The message of the day.</param> public void SendLoginWindow(int remainingPremiumDays, string userName, string password, ICollection <ICharacterSpawn> characters, ICollection <World> worlds, INotification messageOfTheDay) { NetworkMessage message = new NetworkMessage(Xtea); MessageOfTheDayPacket.Add(message, messageOfTheDay); SessionKeyPacket.Add(message, userName, password); CharacterListPacket.Add(message, worlds, characters); PremiumDaysPacket.Add(message, remainingPremiumDays); Send(message); }
public static PacketWriter UpdateGroupMembers(Player member, Player invitee, GroupChat groupChat) { PacketWriter pWriter = PacketWriter.Of(SendOp.GROUP_CHAT); pWriter.Write(GroupChatPacketMode.UpdateGroupMembers); pWriter.WriteInt(groupChat.Id); pWriter.WriteUnicodeString(member.Name); pWriter.WriteByte(0x1); CharacterListPacket.WriteCharacter(invitee, pWriter); return(pWriter); }
public static void HandleNameVoucher(GameSession session, PacketReader packet, Item item) { string characterName = packet.ReadUnicodeString(); session.Player.Name = characterName; InventoryController.Consume(session, item.Uid, 1); session.Send(CharacterListPacket.NameChanged(session.Player.CharacterId, characterName)); // TODO: Needs to redirect player to character selection screen after pop-up }
private void HandleDelete(LoginSession session, PacketReader packet) { long deleteCharId = packet.ReadLong(); if (!DatabaseManager.DeleteCharacter(DatabaseManager.GetCharacter(deleteCharId))) { throw new ArgumentException("Could not delete character"); } session.Send(CharacterListPacket.DeleteCharacter(deleteCharId)); Logger.Info($"Deleting {deleteCharId}"); }
public static PacketWriter UpdatePlayer(Player player) { PacketWriter pWriter = PacketWriter.Of(SendOp.PARTY); pWriter.Write(PartyPacketMode.UpdatePlayer); pWriter.WriteLong(player.CharacterId); CharacterListPacket.WriteCharacter(player, pWriter); WritePartyDungeonInfo(pWriter); return(pWriter); }
private void HandleDelete(LoginSession session, PacketReader packet) { long characterId = packet.ReadLong(); if (!DatabaseManager.Characters.SetCharacterDeleted(characterId)) { Logger.Error("Could not delete character"); return; } session.Send(CharacterListPacket.DeleteCharacter(characterId)); Logger.Info($"Character id {characterId} deleted!"); }
public static PacketWriter LoginNotice(Player player) { PacketWriter pWriter = PacketWriter.Of(SendOp.PARTY); pWriter.Write(PartyPacketMode.LoginNotice); CharacterListPacket.WriteCharacter(player, pWriter); pWriter.WriteLong(); pWriter.WriteInt(); pWriter.WriteShort(); pWriter.WriteByte(); return(pWriter); }
public override void Handle(LoginSession session, PacketReader packet) { session.Send(BannerListPacket.SetBanner()); session.Send(ServerListPacket.SetServers(ServerName, ServerIPs)); List <Player> characters = DatabaseManager.GetAccountCharacters(session.AccountId); session.Send(CharacterListPacket.SetMax(4, 6)); session.Send(CharacterListPacket.StartList()); // Send each character data session.Send(CharacterListPacket.AddEntries(characters)); session.Send(CharacterListPacket.EndList()); }
public static PacketWriter Update(GroupChat groupChat) { PacketWriter pWriter = PacketWriter.Of(SendOp.GROUP_CHAT); pWriter.Write(GroupChatPacketMode.Update); pWriter.WriteInt(groupChat.Id); pWriter.WriteByte((byte)groupChat.Members.Count); foreach (Player member in groupChat.Members) { pWriter.WriteByte(0x1); CharacterListPacket.WriteCharacter(member, pWriter); } return(pWriter); }
public override void Handle(LoginSession session, PacketReader packet) { byte mode = packet.ReadByte(); string username = packet.ReadUnicodeString(); string password = packet.ReadUnicodeString(); // Hash the password with BCrypt string passwordHash = BCrypt.Net.BCrypt.HashPassword(password); // TODO: Change authenticate to return bool and add packet for wrong password Account account = DatabaseManager.Authenticate(username, password); // Auto add new accounts if (account == default) { account = new Account(username, passwordHash); } Logger.Debug($"Logging in with account ID: {account.Id}"); session.AccountId = account.Id; switch (mode) { case 1: PacketWriter pWriter = PacketWriter.Of(SendOp.NPS_INFO); pWriter.WriteLong(); pWriter.WriteUnicodeString(account.Username); session.Send(pWriter); List <Banner> banners = DatabaseManager.GetBanners(); session.Send(BannerListPacket.SetBanner(banners)); session.Send(ServerListPacket.SetServers(ServerName, ServerIPs)); break; case 2: List <Player> characters = DatabaseManager.GetAccountCharacters(session.AccountId); Logger.Debug($"Initializing login with account id: {session.AccountId}"); session.Send(LoginResultPacket.InitLogin(session.AccountId)); session.Send(UgcPacket.SetEndpoint("http://127.0.0.1/ws.asmx?wsdl", "http://127.0.0.1")); session.Send(CharacterListPacket.SetMax(account.CharacterSlots)); session.Send(CharacterListPacket.StartList()); // Send each character data session.Send(CharacterListPacket.AddEntries(characters)); session.Send(CharacterListPacket.EndList()); break; } }
public override void Handle(LoginSession session, PacketReader packet) { byte mode = packet.ReadByte(); string user = packet.ReadUnicodeString(); string pass = packet.ReadUnicodeString(); logger.Debug($"Logging in with user:{user} pass:{pass}"); // TODO: From this user/pass lookup we should be able to find the accountId if (string.IsNullOrEmpty(user) && string.IsNullOrEmpty(pass)) { //session.AccountId = StaticAccountStorage.DEFAULT_ACCOUNT; logger.Info($"No user and password provide logging in with root account "); } else { logger.Info($"Success, with any string in user and pass"); //session.AccountId = StaticAccountStorage.SECONDARY_ACCOUNT; } switch (mode) { case 1: session.Send(PacketWriter.Of(SendOp.NPS_INFO).WriteLong().WriteUnicodeString("")); session.Send(BannerListPacket.SetBanner()); session.Send(ServerListPacket.SetServers(serverName, serverIps)); break; case 2: List <Player> characters = new List <Player>(); /* * foreach (long characterId in accountStorage.ListCharacters(session.AccountId)) { * characters.Add(accountStorage.GetCharacter(characterId)); * }*/ Console.WriteLine("Initializing login with " + session.AccountId); session.Send(LoginResultPacket.InitLogin(session.AccountId)); session.Send(UgcPacket.SetEndpoint("http://127.0.0.1/ws.asmx?wsdl", "http://127.0.0.1")); session.Send(CharacterListPacket.SetMax(4, 6)); session.Send(CharacterListPacket.StartList()); // Send each character data session.Send(CharacterListPacket.AddEntries(characters)); session.Send(CharacterListPacket.EndList()); break; } }
public override void Handle(LoginSession session, PacketReader packet) { byte mode = packet.ReadByte(); string username = packet.ReadUnicodeString(); string password = packet.ReadUnicodeString(); Account account = DatabaseManager.GetAccount(username, password); // Auto add new accounts if (account == default) { account = new Account(GuidGenerator.Long(), username, password); if (!DatabaseManager.Insert(account)) { throw new ArgumentException("Could not create account"); } } Logger.Debug($"Logging in with account ID: {account.Id}"); session.AccountId = account.Id; switch (mode) { case 1: PacketWriter pWriter = PacketWriter.Of(SendOp.NPS_INFO); pWriter.WriteLong(); pWriter.WriteUnicodeString(""); session.Send(pWriter); session.Send(BannerListPacket.SetBanner()); session.Send(ServerListPacket.SetServers(ServerName, ServerIPs)); break; case 2: List <Player> characters = DatabaseManager.GetAccountCharacters(session.AccountId); Logger.Debug($"Initializing login with account id: {session.AccountId}"); session.Send(LoginResultPacket.InitLogin(session.AccountId)); session.Send(UgcPacket.SetEndpoint("http://127.0.0.1/ws.asmx?wsdl", "http://127.0.0.1")); session.Send(CharacterListPacket.SetMax(4, 6)); session.Send(CharacterListPacket.StartList()); // Send each character data session.Send(CharacterListPacket.AddEntries(characters)); session.Send(CharacterListPacket.EndList()); break; } }
private void SendCharacterList(ClientConnection client, SubPacket packet) { List <Character> characterList = Database.GetCharacters(client.currentUserId); if (characterList.Count > 8) { Program.Log.Error("Warning, got more than 8 characters. List truncated, check DB for issues."); } CharacterListPacket characterlistPacket = new CharacterListPacket(0, characterList); List <SubPacket> subPackets = characterlistPacket.BuildPackets(); BasePacket basePacket = BasePacket.CreatePacket(subPackets, true, false); BasePacket.EncryptPacket(client.blowfish, basePacket); client.QueuePacket(basePacket); }
public override void Handle(LoginSession session, PacketReader packet) { session.Send(BannerListPacket.SetBanner()); session.Send(ServerListPacket.SetServers(serverName, serverIps)); List<Player> characters = new List<Player>(); /* foreach (long characterId in accountStorage.ListCharacters(session.AccountId)) { characters.Add(accountStorage.GetCharacter(characterId)); }*/ session.Send(CharacterListPacket.SetMax(4, 6)); session.Send(CharacterListPacket.StartList()); // Send each character data session.Send(CharacterListPacket.AddEntries(characters)); session.Send(CharacterListPacket.EndList()); }
private void SendCharacters(LoginSession session, Account account) { string serverIp = Environment.GetEnvironmentVariable("IP"); string webServerPort = Environment.GetEnvironmentVariable("WEB_PORT"); string url = $"http://{serverIp}:{webServerPort}"; List <Player> characters = DatabaseManager.Characters.FindAllByAccountId(session.AccountId); Logger.Debug("Initializing login with account id: {session.AccountId}", session.AccountId); session.Send(LoginResultPacket.InitLogin(session.AccountId)); session.Send(UgcPacket.SetEndpoint($"{url}/ws.asmx?wsdl", url)); session.Send(CharacterListPacket.SetMax(account.CharacterSlots)); session.Send(CharacterListPacket.StartList()); // Send each character data session.Send(CharacterListPacket.AddEntries(characters)); session.Send(CharacterListPacket.EndList()); }
public override void Handle(LoginSession session, PacketReader packet) { byte mode = packet.ReadByte(); string username = packet.ReadUnicodeString(); string pass = packet.ReadUnicodeString(); Logger.Debug($"Logging in with username: '******' pass: '******'"); // TODO: From this user/pass lookup we should be able to find the accountId if (string.IsNullOrEmpty(username) && string.IsNullOrEmpty(pass)) { // send error / account credentials not found } session.AccountId = AccountStorage.DEFAULT_ACCOUNT_ID; switch (mode) { case 1: PacketWriter pWriter = PacketWriter.Of(SendOp.NPS_INFO); pWriter.WriteLong(); pWriter.WriteUnicodeString(""); session.Send(pWriter); session.Send(BannerListPacket.SetBanner()); session.Send(ServerListPacket.SetServers(ServerName, ServerIPs)); break; case 2: List <Player> characters = new List <Player>(); foreach (long characterId in AccountStorage.ListCharacters(session.AccountId)) { characters.Add(AccountStorage.GetCharacter(characterId)); } Logger.Debug($"Initializing login with account id: {session.AccountId}"); session.Send(LoginResultPacket.InitLogin(session.AccountId)); session.Send(UgcPacket.SetEndpoint("http://127.0.0.1/ws.asmx?wsdl", "http://127.0.0.1")); session.Send(CharacterListPacket.SetMax(4, 6)); session.Send(CharacterListPacket.StartList()); // Send each character data session.Send(CharacterListPacket.AddEntries(characters)); session.Send(CharacterListPacket.EndList()); break; } }
public override void Handle(LoginSession session, PacketReader packet) { List <Banner> banners = DatabaseManager.Banners.FindAllBanners(); session.Send(BannerListPacket.SetBanner(banners)); session.Send(ServerListPacket.SetServers(ServerName, ServerIPs)); List <Player> characters = DatabaseManager.Characters.FindAllByAccountId(session.AccountId); Account account = DatabaseManager.Accounts.FindById(session.AccountId); session.Send(CharacterListPacket.SetMax(account.CharacterSlots)); session.Send(CharacterListPacket.StartList()); // Send each character data session.Send(CharacterListPacket.AddEntries(characters)); session.Send(CharacterListPacket.EndList()); }
//Server - 캐릭터 리스트 수신 public void CharacterList(DataPacket packet) { Debug.Log("캐릭터 리스트 수신"); CharacterListPacket characterListPacket = new CharacterListPacket(packet.msg); CharacterList characterList = characterListPacket.GetData(); uiManager.SelectUIManager.CharacterList = characterList; if (SceneChanger.Instance.CurrentScene == SceneChanger.SceneName.LoadingScene) { SceneChanger.Instance.LoadingCheck[(int)SceneChanger.SelectLoadingData.CharacterList] = true; } else { uiManager.SelectUIManager.SetCharacter(); } }
public void SendCharacterList(string motd, ushort premiumDays, IEnumerable <CharacterListItem> chars) { NetworkMessage message = new NetworkMessage(); if (motd != string.Empty) { MessageOfTheDayPacket.Add( message, motd ); } CharacterListPacket.Add( message, chars, premiumDays ); Send(message); }
//캐릭터 리스트 요청 public void RequestCharacterList(DataPacket packet) { Console.WriteLine(packet.client.RemoteEndPoint.ToString() + "캐릭터 리스트 요청"); string id = loginUser[packet.client]; UserData userData = database.GetUserData(id); CharacterList characterList = new CharacterList(userData.HeroData); CharacterListPacket characterListPacket = new CharacterListPacket(characterList); characterListPacket.SetPacketId((int)ServerPacketId.CharacterList); byte[] msg = CreatePacket(characterListPacket); packet = new DataPacket(msg, packet.client); lock (sendLock) { sendMsgs.Enqueue(packet); } }
private void VerifyAuth() { GameAuthorizationPacket gap = (GameAuthorizationPacket)ReadPacket(new GameAuthorizationPacket()); _log.Info(gap.Username); _log.Info(gap.SessionID.ToString(CultureInfo.InvariantCulture)); if (AuthService.CheckSession(gap.Username, gap.SessionID)) { AccountName = gap.Username; AuthService.SendSessionAction(gap.Username, SessionAction.Login); //TODO Save characters in class CharacterDAO chrMgr = new CharacterDAO(Server.ServerInstance.Database); AccountDAO accMgr = new AccountDAO(Server.ServerInstance.Database); int accountID = accMgr.GetAccountID(gap.Username); CharacterListPacket clp = new CharacterListPacket(chrMgr.GetCharactersByAccount(accountID), accMgr.GetAccountEmpire(accountID)); SendPacket(clp); } else { Disconnect("Invalid session"); } }
public static PacketWriter Create(Party party, bool joinNotice) { PacketWriter pWriter = PacketWriter.Of(SendOp.PARTY); pWriter.Write(PartyPacketMode.Create); pWriter.WriteBool(joinNotice); pWriter.WriteInt(party.Id); pWriter.WriteLong(party.Leader.CharacterId); pWriter.WriteByte((byte)party.Members.Count); foreach (Player member in party.Members) { pWriter.WriteBool(!member.Session.Connected()); CharacterListPacket.WriteCharacter(member, pWriter); WritePartyDungeonInfo(pWriter); } pWriter.WriteByte(); // is in dungeon? might be a bool. pWriter.WriteInt(); //dungeonid for "enter dungeon" pWriter.WriteByte(); pWriter.WriteByte(); pWriter.WriteByte(); return(pWriter); }
/// <summary> /// /// </summary> /// <param name="client"></param> /// <param name="packet"></param> /// <param name="messageNumber"></param> public void Parse(Client client, ref byte[] packet, uint messageNumber) { #region Setup... MemoryStream m_stream = new MemoryStream(packet); BinaryReader m_reader = new BinaryReader(m_stream); string encryptedPassword; int encPasswordLength; LoginWrong nb = new LoginWrong(); CheckLogin cbl = new CheckLogin(); CharacterName char_name = new CharacterName(); #endregion switch (messageNumber) { case 0x22: SaltAuthentication salt = new SaltAuthentication(); // Username and version info m_stream.Position = 24; client.accountName = Encoding.ASCII.GetString(m_reader.ReadBytes(40)).TrimEnd(char.MinValue); client.clientVersion = Encoding.ASCII.GetString(m_reader.ReadBytes(20)).TrimEnd(char.MinValue); m_reader.Close(); m_stream.Dispose(); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Client '" + client.accountName + "' connected using version '" + client.clientVersion + "'"); Console.ResetColor(); // Send Authentication Salt to client salt.SendPacket(client, out client.serverSalt); break; case 0x25: // Username and encrypted password m_stream.Position = 20; string loginAccountName = Encoding.ASCII.GetString(m_reader.ReadBytes(40)).TrimEnd(char.MinValue); encPasswordLength = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()) - 1; // Login Key is Null Terminated. We do not need this Null Terminator. encryptedPassword = Encoding.ASCII.GetString(m_reader.ReadBytes(encPasswordLength)); m_reader.Close(); m_stream.Dispose(); if (cbl.IsLoginAllowed(client, loginAccountName) == false) { /* * Account name not found or client banned/otherwise not permitted on the server * Note, this is done here not in the above packet (0x22), even though we have * the username or the client will complain. Also a security measure as you can * not tell if an account name is correct or not, only if both the username and * password are correct. * * We also double check that the Account Name is the same as origionally sent * or there could be a possibility to log in with someone elses account. * */ Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Client '" + client.accountName + "' banned, not a valid username, or sent a malformed Authentication Packet"); Console.ResetColor(); client.Send(ref nb.wrongbyte); client.Server.DisconnectClient(client); break; } if (cbl.IsLoginCorrect(client, encryptedPassword) == false) { // Username/Password Incorrect Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Client '" + client.accountName + "' failed Authentication."); Console.ResetColor(); client.Send(ref nb.wrongbyte); client.Server.DisconnectClient(client); break; } else { // All's well, send CharacterList Packet CharacterListPacket charlist = new CharacterListPacket(); charlist.SendPacket(client, client.accountName); } break; case 0x16: // Player selected a character and client sends us selected characters ID m_stream.Position = 20; int selectedCharID = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); m_reader.Close(); m_stream.Dispose(); if (cbl.IsCharacterOnAccount(client, selectedCharID) == false) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Client '" + client.accountName + "' tried to log in as CharID " + selectedCharID + " but it is not on their account!"); Console.ResetColor(); // NV: Is this really what we want to send? Should find out sometime... client.Send(ref nb.wrongbyte); client.Server.DisconnectClient(client); break; } if (OnlineChars.IsOnline(selectedCharID) == true) { Console.WriteLine("Client '" + client.accountName + "' is trying to login, but the requested character is already logged in."); client.Send(ref nb.wrongbyte); client.Server.DisconnectClient(client); break; } OnlineChars.SetOnline(selectedCharID); IPAddress tempIP; if (IPAddress.TryParse(ConfigReadWrite.Instance.CurrentConfig.ZoneIP, out tempIP) == false) { IPHostEntry zoneHost = Dns.GetHostEntry(ConfigReadWrite.Instance.CurrentConfig.ZoneIP); foreach (IPAddress ip in zoneHost.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { tempIP = ip; break; } } } byte[] ZoneIP = tempIP.GetAddressBytes(); byte[] ZonePort = BitConverter.GetBytes(Convert.ToInt32(ConfigReadWrite.Instance.CurrentConfig.ZonePort)); Byte[] pkt = new byte[] { 0xDF, 0xDF, 0x00, 0x01, 0x00, 0x01, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x61, 0x5B, // Server ID 0x00, 0x00, 0x00, 0x17, packet[20], packet[21], packet[22], packet[23], // character ID ZoneIP[0], ZoneIP[1], ZoneIP[2], ZoneIP[3], ZonePort[1], ZonePort[0], 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; client.Send(ref pkt); break; case 0x55: /* player ask for 'suggest name'; server sends 'random' name. */ m_stream.Position = 28; char_name.GetRandomName(client, IPAddress.NetworkToHostOrder(m_reader.ReadInt32())); break; case 0xf: /* client created new character */ Int32 character_id; bool start_in_sl = false; char_name.m_accountName = client.accountName; /* start reading packet */ m_stream.Position = 65; /* name length */ int m_name_len = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); /* name (as byte array) */ char_name.m_name = Encoding.ASCII.GetString(m_reader.ReadBytes(m_name_len)); /* breed */ char_name.m_breed = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); /* gender */ char_name.m_gender = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); /* profession */ char_name.m_profession = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); /* level (should always be 0 )*/ char_name.m_level = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); /* lets skip some stuff */ int skip_len = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); m_stream.Position += (skip_len + 8); /* head mesh */ char_name.m_headmesh = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); /* monster scale */ char_name.m_monsterscale = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); /* fatness */ char_name.m_fatness = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); /* start in SL? */ int sl = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); if (sl == 1) { start_in_sl = true; } /* close reader and stream */ m_reader.Close(); m_stream.Dispose(); /* now you got the data.. * do whatever you have to do with it * but please.. in some other class :) */ /* check name against database * * if name exist, return 0. * if name doesnt exist, creates default char setup and returns character_id * */ character_id = char_name.CheckAgainstDB(); if (character_id < 1) { char_name.SendNameInUse(client); } else { char_name.SendNameToStartPF(client, start_in_sl, character_id); } /* reply will work only if character creation * works, so its disabled for now and should be * handled in other class in /Packets/<class name> */ break; case 0x14: /* client deletes char */ Int32 uid; /* start reading packet */ m_stream.Position = 20; uid = IPAddress.NetworkToHostOrder(m_reader.ReadInt32()); char_name.DeleteChar(client, uid); break; default: client.Server.Warning(client, "Client sent unknown message {0}", messageNumber.ToString()); break; } }
public void HandleCreate(LoginSession session, PacketReader packet) { byte gender = packet.ReadByte(); //packet.ReadShort(); // const? // var jobCode = (Job)packet.ReadShort(); Job job = (Job)packet.ReadShort(); string name = packet.ReadUnicodeString(); SkinColor skinColor = packet.Read <SkinColor>(); //packet.ReadShort(); // const? packet.Skip(2); Dictionary <ItemSlot, Item> equips = new Dictionary <ItemSlot, Item>(); Logger.Info($"Creating character: {name}, gender: {gender}, skinColor: {skinColor}, job: {job}"); int equipCount = packet.ReadByte(); for (int i = 0; i < equipCount; i++) { uint id = packet.ReadUInt(); string typeStr = packet.ReadUnicodeString(); if (!Enum.TryParse(typeStr, out ItemSlot type)) { throw new ArgumentException($"Unknown equip type: {typeStr}"); } EquipColor equipColor = packet.Read <EquipColor>(); int colorIndex = packet.ReadInt(); switch (type) { case ItemSlot.HR: // Hair // Hair Length/Position float backLength = BitConverter.ToSingle(packet.Read(4), 0); byte[] backPositionArray = packet.Read(24); float frontLength = BitConverter.ToSingle(packet.Read(4), 0); byte[] frontPositionArray = packet.Read(24); equips.Add(ItemSlot.HR, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, HairD = new HairData(backLength, frontLength, backPositionArray, frontPositionArray), Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.FA: // Face equips.Add(ItemSlot.FA, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.FD: // Face Decoration byte[] faceDecoration = packet.Read(16); // Face decoration position equips.Add(ItemSlot.FD, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, FaceDecorationD = faceDecoration, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.CL: // Clothes equips.Add(ItemSlot.CL, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.PA: // Pants equips.Add(ItemSlot.PA, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.SH: // Shoes equips.Add(ItemSlot.SH, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.ER: // Ear // Assign ER equips.Add(ItemSlot.ER, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; } Logger.Info($" > {type} - id: {id}, color: {equipColor}, colorIndex: {colorIndex}"); } packet.ReadInt(); // const? (4) // Check if name is in use (currently just on local account) bool taken = false; foreach (Player character in AccountStorage.Characters.Values) { if (character.Name.ToLower().Equals(name.ToLower())) { taken = true; } } if (taken) { session.Send(ResponseCharCreatePacket.NameTaken()); return; } // Create new player object Player newCharacter = Player.NewCharacter(gender, job, name, skinColor, equips); // Add player object to account storage AccountStorage.AddCharacter(newCharacter); // Send updated CHAR_MAX_COUNT session.Send(CharacterListPacket.SetMax(4, 6)); // Send CHARACTER_LIST for new character only (append) session.Send(CharacterListPacket.AppendEntry(newCharacter)); }
public void HandleCreate(LoginSession session, PacketReader packet) { byte gender = packet.ReadByte(); Job job = (Job)packet.ReadShort(); string name = packet.ReadUnicodeString(); SkinColor skinColor = packet.Read <SkinColor>(); packet.Skip(2); Dictionary <ItemSlot, Item> cosmetics = new Dictionary <ItemSlot, Item>(); Logger.Info($"Creating character: {name}, gender: {gender}, skinColor: {skinColor}, job: {job}"); int equipCount = packet.ReadByte(); for (int i = 0; i < equipCount; i++) { uint id = packet.ReadUInt(); string typeStr = packet.ReadUnicodeString(); if (!Enum.TryParse(typeStr, out ItemSlot type)) { throw new ArgumentException($"Unknown equip type: {typeStr}"); } EquipColor equipColor = packet.Read <EquipColor>(); switch (type) { case ItemSlot.HR: // Hair // Hair Length/Position float backLength = BitConverter.ToSingle(packet.Read(4), 0); CoordF backPositionCoord = packet.Read <CoordF>(); CoordF backPositionRotation = packet.Read <CoordF>(); float frontLength = BitConverter.ToSingle(packet.Read(4), 0); CoordF frontPositionCoord = packet.Read <CoordF>(); CoordF frontPositionRotation = packet.Read <CoordF>(); cosmetics.Add(ItemSlot.HR, new Item(Convert.ToInt32(id)) { Color = equipColor, HairData = new HairData(backLength, frontLength, backPositionCoord, backPositionRotation, frontPositionCoord, frontPositionRotation), IsTemplate = false, IsEquipped = true }); break; case ItemSlot.FA: // Face cosmetics.Add(ItemSlot.FA, new Item(Convert.ToInt32(id)) { Color = equipColor, IsTemplate = false, IsEquipped = true }); break; case ItemSlot.FD: // Face Decoration byte[] faceDecoration = packet.Read(16); // Face decoration position cosmetics.Add(ItemSlot.FD, new Item(Convert.ToInt32(id)) { Color = equipColor, FaceDecorationData = faceDecoration, IsTemplate = false, IsEquipped = true }); break; case ItemSlot.CL: // Clothes cosmetics.Add(ItemSlot.CL, new Item(Convert.ToInt32(id)) { Color = equipColor, IsTemplate = false, IsEquipped = true }); break; case ItemSlot.PA: // Pants cosmetics.Add(ItemSlot.PA, new Item(Convert.ToInt32(id)) { Color = equipColor, IsTemplate = false, IsEquipped = true }); break; case ItemSlot.SH: // Shoes cosmetics.Add(ItemSlot.SH, new Item(Convert.ToInt32(id)) { Color = equipColor, IsTemplate = false, IsEquipped = true }); break; case ItemSlot.ER: // Ear // Assign ER cosmetics.Add(ItemSlot.ER, new Item(Convert.ToInt32(id)) { Color = equipColor, IsTemplate = false, IsEquipped = true }); break; } Logger.Info($" > {type} - id: {id}, color: {equipColor}"); } packet.ReadInt(); // const? (4) if (DatabaseManager.NameExists(name)) { session.Send(ResponseCharCreatePacket.NameTaken()); return; } Player newCharacter = new Player(session.AccountId, name, gender, job, skinColor); foreach (Item item in cosmetics.Values) { item.Owner = newCharacter; } newCharacter.Inventory.Cosmetics = cosmetics; DatabaseManager.UpdateCharacter(newCharacter); // Send updated CHAR_MAX_COUNT session.Send(CharacterListPacket.SetMax(4, 6)); // Send CHARACTER_LIST for new character only (append) session.Send(CharacterListPacket.AppendEntry(newCharacter)); }
/* * private void HandleCreate(LoginSession session, PacketReader packet) { * byte gender = packet.ReadByte(); * var jobCode = (JobCode) packet.ReadShort(); * var jobType = (JobType) ((int) jobCode * 10); * string name = packet.ReadUnicodeString(); * long accountId = session.AccountId; * // Temporary fake validation for testing * if (name.Length < 4) { * session.Send(ResponseCharCreatePacket.NameTaken()); * return; * } * * var skinColor = packet.Read<SkinColor>(); * packet.Skip(2); // Unknown * * logger.Info($"Creating character:{name}, gender:{gender}, skinColor:{skinColor}"); * var newCharacter = Character.NewCharacter(gender, jobType, name); * * using UserStorage.Request request = userStorage.Context(); * newCharacter.Id = request.CreateCharacter(newCharacter); * newCharacter.SkinColor = skinColor; * * int equipCount = packet.ReadByte(); * for (int i = 0; i < equipCount; i++) { * int id = packet.ReadInt(); * string typeStr = packet.ReadUnicodeString(); * if (!Enum.TryParse(typeStr, out EquipSlot slot)) { * throw new ArgumentException($"Unknown equip type: {typeStr}"); * } * * Item equip = ItemFactory.Create(id); * equip.Slot = (short) slot; * //equip.Appearance.ReadFrom(packet); * //InventoryType type = equip.InventoryType == InventoryType.Outfit * // ? InventoryType.OutfitEquip * // : InventoryType.GearEquip; * //long ownerId = InventoryState.GetOwnerId(newCharacter.Id, type); * //long itemId = request.CreateItem(ownerId, equip); * //bool result = player.GearEquip.TryPutSlot(equip, (short) slot); * //logger.Info($" > {slot} - id:{id}, color:{equip.Appearance.Color} | {itemId}"); * * logger.Info($">{slot} - id:{id}, color:not define"); * } * * packet.Skip(4); // Unknown * * session.Send(CharacterListPacket.SetMax(4, 6)); * * Character player = request.GetCharacter(newCharacter.Id); * //session.Send(CharacterListPacket.AppendEntry(player)); * // There is a bug in the client at causes a lag spike here CxxException [STATUS_ACCESS_VIOLATION] 6F465F6C * } * * private void HandleDelete(LoginSession session, PacketReader packet) { * long characterId = packet.ReadLong(); * * using (UserStorage.Request request = userStorage.Context()) { * Character character = request.GetCharacter(characterId); * if (character.Level < 20) { * request.DeleteCharacter(characterId); * request.Commit(); * * session.Send(CharacterListPacket.DeleteEntry(characterId)); * } else { * session.Send(CharacterListPacket.DeletePending(characterId, * DateTimeOffset.UtcNow.AddDays(1).ToUnixTimeSeconds())); * } * } * } */ private void HandleCancelDelete(LoginSession session, PacketReader packet) { long characterId = packet.ReadLong(); session.Send(CharacterListPacket.CancelDelete(characterId)); }