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
    }
예제 #2
0
        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}.");
        }
예제 #3
0
        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);
        }
예제 #4
0
    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);
    }
예제 #5
0
        /// <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);
        }
예제 #6
0
    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);
    }
예제 #7
0
        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}");
        }
예제 #9
0
    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!");
    }
예제 #11
0
    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());
        }
예제 #13
0
    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);
    }
예제 #14
0
        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;
            }
        }
예제 #15
0
        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;
            }
        }
예제 #16
0
        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());
        }
예제 #20
0
        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());
        }
예제 #22
0
    //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();
        }
    }
예제 #23
0
        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);
        }
예제 #24
0
    //캐릭터 리스트 요청
    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);
        }
    }
예제 #25
0
        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");
            }
        }
예제 #26
0
    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);
    }
예제 #27
0
파일: Parser.cs 프로젝트: semirs1991/CellAO
        /// <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));
        }
예제 #30
0
        /*
         * 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));
        }