예제 #1
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteByte(Action);
                switch (Action)
                {
                case ExchangeActions.Initiate:
                {
                    packet.WriteUInt32(RequestorId);
                    packet.WriteString8(RequestorName);
                }
                break;

                case ExchangeActions.QuantityPrompt:
                {
                    packet.WriteByte(ItemSlot);
                }
                break;

                case ExchangeActions.ItemUpdate:
                {
                    packet.WriteByte((byte)(Side ? 0 : 1));
                    packet.WriteByte(ItemSlot);
                    packet.WriteUInt16((ushort)(0x8000 + ItemSprite));
                    packet.WriteByte(ItemColor);
                    packet.WriteString8(ItemName);
                }
                break;

                case ExchangeActions.GoldUpdate:
                {
                    packet.WriteByte((byte)(Side ? 0 : 1));
                    packet.WriteUInt32(Gold);
                }
                break;

                case ExchangeActions.Cancel:
                {
                    packet.WriteByte((byte)(Side ? 0 : 1));
                    packet.WriteString8(CancelMessage);
                }
                break;

                case ExchangeActions.Confirm:
                {
                    packet.WriteByte((byte)(Side ? 0 : 1));
                    packet.WriteString8(ConfirmMessage);
                }
                break;
                }
                return(packet);
            }
예제 #2
0
            internal ServerPacket Packet()
            {
                ServerPacket packet   = new ServerPacket(OpCode);
                int          position = packet.Position;

                packet.WriteUInt32(TargetId);
                packet.WriteUInt32(SourceId ?? 0);
                packet.WriteUInt16((ushort)TargetAnimation);
                packet.WriteUInt16((ushort)(SourceAnimation ?? 0));
                packet.WriteInt16(Speed);
                packet.WriteInt32(0);
                return(packet);
            }
예제 #3
0
        private void PacketHandler_0x10_ClientJoin(Client client, ClientPacket packet)
        {
            var seed      = packet.ReadByte();
            var keyLength = packet.ReadByte();
            var key       = packet.Read(keyLength);
            var name      = packet.ReadString8();
            var id        = packet.ReadUInt32();

            var redirect = ExpectedConnections[id];

            if (redirect.Matches(name, key, seed))
            {
                ((IDictionary)ExpectedConnections).Remove(id);

                client.EncryptionKey  = key;
                client.EncryptionSeed = seed;

                if (redirect.Source is Lobby)
                {
                    var x60 = new ServerPacket(0x60);
                    x60.WriteByte(0x00);
                    x60.WriteUInt32(Game.NotificationCrc);
                    client.Enqueue(x60);
                }
            }
        }
예제 #4
0
파일: Client.cs 프로젝트: wren11/server
        public void Redirect(Redirect redirect)
        {
            Logger.InfoFormat("Processing redirect");
            GlobalConnectionManifest.RegisterRedirect(this, redirect);
            Logger.InfoFormat("Redirect: cid {0}", this.ConnectionId);
            //GlobalConnectionManifest.DeregisterClient(this);

            redirect.Destination.ExpectedConnections.TryAdd(redirect.Id, redirect);

            var endPoint = Socket.RemoteEndPoint as IPEndPoint;

            byte[] addressBytes = IPAddress.IsLoopback(endPoint.Address) ? IPAddress.Loopback.GetAddressBytes() : Game.IpAddress.GetAddressBytes();

            Array.Reverse(addressBytes);

            var x03 = new ServerPacket(0x03);

            x03.Write(addressBytes);
            x03.WriteUInt16((ushort)redirect.Destination.Port);
            x03.WriteByte((byte)(redirect.EncryptionKey.Length + Encoding.GetEncoding(949).GetBytes(redirect.Name).Length + 7));
            x03.WriteByte(redirect.EncryptionSeed);
            x03.WriteByte((byte)redirect.EncryptionKey.Length);
            x03.Write(redirect.EncryptionKey);
            x03.WriteString8(redirect.Name);
            x03.WriteUInt32(redirect.Id);
            Thread.Sleep(100);
            Enqueue(x03);
        }
예제 #5
0
파일: Login.cs 프로젝트: moseleyc/server
        private void PacketHandler_0x10_ClientJoin(Client client, ClientPacket packet)
        {
            var seed      = packet.ReadByte();
            var keyLength = packet.ReadByte();
            var key       = packet.Read(keyLength);
            var name      = packet.ReadString8();
            var id        = packet.ReadUInt32();

            var redirect = ExpectedConnections[id];

            if (Game.World.WorldData.TryGetAuthInfo(name, out AuthInfo login))
            {
                login.CurrentState = UserState.Login;
                login.Save();
            }

            if (redirect.Matches(name, key, seed))
            {
                ((IDictionary)ExpectedConnections).Remove(id);

                client.EncryptionKey  = key;
                client.EncryptionSeed = seed;

                if (redirect.Source is Lobby || redirect.Source is World)
                {
                    var x60 = new ServerPacket(0x60);
                    x60.WriteByte(0x00);
                    x60.WriteUInt32(Game.NotificationCrc);
                    client.Enqueue(x60);
                }
            }
        }
예제 #6
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteUInt32(Id);

                return(packet);
            }
예제 #7
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteUInt32(UserId);
                packet.WriteByte(Animation);
                packet.WriteUInt16(Speed);

                return(packet);
            }
예제 #8
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteByte(Pane);
                packet.WriteByte(Slot);
                packet.WriteUInt32(Length);

                return(packet);
            }
예제 #9
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteUInt32(ObjId);
                packet.WriteByte(0);
                packet.WriteByte(CurrentPercent);
                packet.WriteByte(Sound ?? 0xFF);

                return(packet);
            }
예제 #10
0
        private void PacketHandler_0x00_ClientVersion(Client client, ClientPacket packet)
        {
            var x00 = new ServerPacket(0x00);

            x00.WriteByte(0x00);
            x00.WriteUInt32(Game.ServerTableCrc);
            x00.WriteByte(client.EncryptionSeed);
            x00.WriteByte((byte)client.EncryptionKey.Length);
            x00.Write(client.EncryptionKey);
            client.Enqueue(x00);
        }
예제 #11
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                Console.WriteLine(String.Format("uid: {0}, Animation: {1}, speed {2}", UserId, Animation, Speed));
                packet.WriteUInt32(UserId);
                packet.WriteByte(Animation);
                packet.WriteUInt16(Speed);

                return(packet);
            }
예제 #12
0
            // General notes about this god awful packet:

            /* Offsets:
             * 00-0F: no human body + pants
             * 10-1F: male human body + pants
             * 20-2F: female human body, no pants
             * 30-3F: male spirit + pants
             * 40-4F: female spirit, no pants
             * 50-5F: invisible male body + pants
             * 60-6F: invisible female body, no pants
             * 70-7F: male doll body + pants
             * 80-8F: male mounted body + pants
             * 90-9F: female mounted body, no pants
             * A0-FF: no human body + pants
             */

            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteUInt16(X);
                packet.WriteUInt16(Y);
                packet.WriteByte((byte)Direction);
                packet.WriteUInt32(Id);
                packet.WriteUInt16(Helmet);
                GameLog.InfoFormat($"Gender is {Gender}");
                if (!DisplayAsMonster)
                {
                    packet.WriteByte((byte)(((byte)Gender * 16) + BodySpriteOffset));
                    packet.WriteUInt16(Armor);
                    packet.WriteByte(Boots);
                    packet.WriteUInt16(Armor);
                    packet.WriteByte(Shield);
                    packet.WriteUInt16(Weapon);
                    packet.WriteByte(HairColor);
                    packet.WriteByte(BootsColor);
                    packet.WriteByte(FirstAccColor);
                    packet.WriteUInt16(FirstAcc);
                    packet.WriteByte(SecondAccColor);
                    packet.WriteUInt16(SecondAcc);
                    packet.WriteByte(ThirdAccColor);
                    packet.WriteUInt16(ThirdAcc);
                    packet.WriteByte((byte)LanternSize);
                    packet.WriteByte((byte)RestPosition);
                    packet.WriteUInt16(Overcoat);
                    packet.WriteByte(OvercoatColor);
                    packet.WriteByte((byte)SkinColor);
                    packet.WriteBoolean(Invisible);
                    packet.WriteByte(FaceShape);
                }
                else
                {
                    packet.WriteUInt16(MonsterSprite);
                    packet.WriteByte(HairColor);
                    packet.WriteByte(BootsColor);
                    // Unknown
                    packet.WriteByte(0x00);
                    packet.WriteByte(0x00);
                    packet.WriteByte(0x00);
                    packet.WriteByte(0x00);
                    packet.WriteByte(0x00);
                    packet.WriteByte(0x00);
                }
                packet.WriteByte((byte)NameStyle);
                packet.WriteString8(Name ?? string.Empty);
                packet.WriteString8(GroupName ?? string.Empty);

                return(packet);
            }
예제 #13
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteUInt32(User.Id);
                packet.WriteByte(0x01);
                packet.WriteByte(213);
                packet.WriteByte((byte)User.Class);
                packet.WriteUInt16(0);

                return(packet);
            }
예제 #14
0
            internal ServerPacket Packet()
            {
                var packet = new ServerPacket(OpCode);

                packet.WriteByte(ChatType);
                packet.WriteUInt32(TargetId);
                packet.WriteByte(LineLength);
                packet.WriteString(LineText);
                packet.WriteByte(0);
                packet.WriteByte(0);
                packet.WriteByte(0);
                return(packet);
            }
예제 #15
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteByte(0x00);
                if (Id != 0)
                {
                    packet.WriteUInt32(Id);
                    packet.WriteUInt32(SenderId == 0 ? Id : SenderId);
                    packet.WriteUInt16(AnimationId);
                    packet.WriteUInt16(SenderAnimationId == 0 ? ushort.MinValue : SenderAnimationId);
                    packet.WriteUInt16(Speed);
                    packet.WriteByte(0x00);
                }
                else
                {
                    packet.WriteUInt32(uint.MinValue);
                    packet.WriteUInt16(AnimationId);
                    packet.WriteUInt16(Speed);
                    packet.WriteUInt16(X);
                    packet.WriteUInt16(Y);
                }
                return(packet);
            }
예제 #16
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteByte(NationFlag);
                packet.WriteString8(GuildRank);
                packet.WriteByte(TitleCount);
                foreach (var id in TitleIds)
                {
                    packet.WriteByte(id);
                }
                packet.WriteByte(CurrentTitle);
                if (!IsGrouped)
                {
                    packet.WriteString8("No Group");
                }
                else
                {
                    var ret = "Group\n";
                    foreach (var member in Group.Members)
                    {
                        ret += $"{member.Name}\n";
                    }
                    packet.WriteString8(ret);
                }
                packet.WriteByte(CanGroup);
                packet.WriteByte(0x00);
                packet.WriteByte(Class);
                packet.WriteByte(0x01);
                packet.WriteByte(0x00);
                packet.WriteString8(Player.IsMaster ? "Master" : Player.Class.ToString());
                packet.WriteString8(GuildName != null ? GuildName : string.Empty);
                packet.WriteByte((byte)(Player.Legend.Count > 255 ? 255 : Player.Legend.Count));
                foreach (var mark in Player.Legend)
                {
                    packet.WriteByte((byte)mark.Icon);
                    packet.WriteByte((byte)mark.Color);
                    packet.WriteString8(mark.Prefix);
                    packet.WriteString8(mark.Text);
                }
                packet.WriteByte(0x00);
                packet.WriteUInt16(PlayerDisplay);
                packet.WriteByte(0x02);
                packet.WriteUInt32(0x00);
                packet.WriteByte(0x00);
                return(packet);
            }
예제 #17
0
            internal ServerPacket Packet()
            {
                ServerPacket packet = new ServerPacket(OpCode);

                packet.WriteByte(NationFlag);
                packet.WriteString8(GuildRank);
                packet.WriteString8(CurrentTitle);
                if (!IsGrouped)
                {
                    packet.WriteString8("Adventuring Alone");
                }
                else
                {
                    var ret = "Group members\n";
                    foreach (var member in Group.Members)
                    {
                        ret += member == Group.Founder ? $"* {member.Name}\n" : $"  {member.Name}\n";
                    }
                    ret += $"Total {Group.Members.Count}";

                    packet.WriteString8(ret);
                }
                packet.WriteBoolean(CanGroup);
                packet.WriteByte(0x00);
                packet.WriteByte(Class);
                packet.WriteByte(0x01);
                packet.WriteByte(0x00);
                packet.WriteString8(Player.IsMaster ? "Master" : Player.Class.ToString());
                packet.WriteString8(GuildName != null ? GuildName : string.Empty);
                packet.WriteByte((byte)(Player.Legend.Count > 255 ? 255 : Player.Legend.Count));
                foreach (var mark in Player.Legend)
                {
                    packet.WriteByte((byte)mark.Icon);
                    packet.WriteByte((byte)mark.Color);
                    packet.WriteString8(mark.Prefix);
                    packet.WriteString8(mark.ToString());
                }
                packet.WriteByte(0x00);
                packet.WriteUInt16(PlayerDisplay);
                packet.WriteByte(0x02);
                packet.WriteUInt32(0x00);
                packet.WriteByte(0x00);
                return(packet);
            }
예제 #18
0
        public void Redirect(Redirect redirect, bool isLogoff = false, int transmitDelay = 0)
        {
            GameLog.InfoFormat("Processing redirect");
            GlobalConnectionManifest.RegisterRedirect(this, redirect);
            GameLog.InfoFormat("Redirect: cid {0}", this.ConnectionId);
            GameLog.Info($"Redirect EncryptionKey is {Encoding.ASCII.GetString(redirect.EncryptionKey)}");
            if (isLogoff)
            {
                GlobalConnectionManifest.DeregisterClient(this);
            }
            redirect.Destination.ExpectedConnections.TryAdd(redirect.Id, redirect);

            var endPoint = Socket.RemoteEndPoint as IPEndPoint;

            byte[] addressBytes;

            if (Game.RedirectTarget != null)
            {
                addressBytes = Game.RedirectTarget.GetAddressBytes();
            }
            else
            {
                addressBytes = IPAddress.IsLoopback(endPoint.Address) ? IPAddress.Loopback.GetAddressBytes() : Game.IpAddress.GetAddressBytes();
            }

            Array.Reverse(addressBytes);

            var x03 = new ServerPacket(0x03);

            x03.Write(addressBytes);
            x03.WriteUInt16((ushort)redirect.Destination.Port);
            x03.WriteByte((byte)(redirect.EncryptionKey.Length + Encoding.ASCII.GetBytes(redirect.Name).Length + 7));
            x03.WriteByte(redirect.EncryptionSeed);
            x03.WriteByte((byte)redirect.EncryptionKey.Length);
            x03.Write(redirect.EncryptionKey);
            x03.WriteString8(redirect.Name);
            x03.WriteUInt32(redirect.Id);
            x03.TransmitDelay = transmitDelay == 0 ? 250 : transmitDelay;
            Enqueue(x03);
        }
예제 #19
0
파일: Login.cs 프로젝트: DomGrieco/server
        private void PacketHandler_0x10_ClientJoin(Client client, ClientPacket packet)
        {
            var seed = packet.ReadByte();
            var keyLength = packet.ReadByte();
            var key = packet.Read(keyLength);
            var name = packet.ReadString8();
            var id = packet.ReadUInt32();

            var redirect = ExpectedConnections[id];
            if (redirect.Matches(name, key, seed))
            {
                ((IDictionary)ExpectedConnections).Remove(id);

                client.EncryptionKey = key;
                client.EncryptionSeed = seed;

                if (redirect.Source is Lobby)
                {
                    var x60 = new ServerPacket(0x60);
                    x60.WriteByte(0x00);
                    x60.WriteUInt32(Game.NotificationCrc);
                    client.Enqueue(x60);
                }
            }

        }
예제 #20
0
파일: World.cs 프로젝트: saroque/server
        private void PacketHandler_0x7B_RequestMetafile(Object obj, ClientPacket packet)
        {
            var user = (User) obj;
            var all = packet.ReadBoolean();

            if (all)
            {
                var x6F = new ServerPacket(0x6F);
                x6F.WriteBoolean(all);
                x6F.WriteUInt16((ushort) Metafiles.Count);
                foreach (var metafile in Metafiles.Values)
                {
                    x6F.WriteString8(metafile.Name);
                    x6F.WriteUInt32(metafile.Checksum);
                }
                user.Enqueue(x6F);
            }
            else
            {
                var name = packet.ReadString8();
                if (Metafiles.ContainsKey(name))
                {
                    var file = Metafiles[name];

                    var x6F = new ServerPacket(0x6F);
                    x6F.WriteBoolean(all);
                    x6F.WriteString8(file.Name);
                    x6F.WriteUInt32(file.Checksum);
                    x6F.WriteUInt16((ushort) file.Data.Length);
                    x6F.Write(file.Data);
                    user.Enqueue(x6F);
                }
            }
        }
예제 #21
0
파일: Client.cs 프로젝트: DomGrieco/server
        public void Redirect(Redirect redirect)
        {
            Logger.DebugFormat("Processing redirect");
            GlobalConnectionManifest.DeregisterClient(this);

            redirect.Destination.ExpectedConnections.TryAdd(redirect.Id, redirect);

            var endPoint = Socket.RemoteEndPoint as IPEndPoint;

            byte[] addressBytes = IPAddress.IsLoopback(endPoint.Address) ? IPAddress.Loopback.GetAddressBytes() : Game.IpAddress.GetAddressBytes();

            Array.Reverse(addressBytes);

            var x03 = new ServerPacket(0x03);
            x03.Write(addressBytes);
            x03.WriteUInt16((ushort)redirect.Destination.Port);
            x03.WriteByte((byte)(redirect.EncryptionKey.Length + Encoding.GetEncoding(949).GetBytes(redirect.Name).Length + 7));
            x03.WriteByte(redirect.EncryptionSeed);
            x03.WriteByte((byte)redirect.EncryptionKey.Length);
            x03.Write(redirect.EncryptionKey);
            x03.WriteString8(redirect.Name);
            x03.WriteUInt32(redirect.Id);
            Enqueue(x03);
        }
예제 #22
0
            internal ServerPacket Packet()
            {
                var packet = new ServerPacket(OpCode);

                packet.WriteByte((byte)MerchantDialogType);
                packet.WriteByte((byte)MerchantDialogObjectType);
                packet.WriteUInt32(ObjectId);
                packet.WriteByte(0);
                packet.WriteInt16((short)Tile1);
                packet.WriteByte(0);
                packet.WriteByte(1);
                packet.WriteInt16((short)Tile1);
                packet.WriteByte(0);
                packet.WriteByte(0);
                packet.WriteString8(Name);
                packet.WriteString16(Text);
                if (MerchantDialogType == MerchantDialogType.Options)
                {
                    packet.WriteByte(Options.OptionsCount);
                    foreach (var opt in Options.Options)
                    {
                        packet.WriteString8(opt.Text);
                        packet.WriteUInt16(opt.Id);
                    }
                }
                if (MerchantDialogType == MerchantDialogType.OptionsWithArgument)
                {
                    packet.WriteString8(OptionsWithArgument.Argument);
                    packet.WriteByte(OptionsWithArgument.OptionsCount);
                    foreach (var opt in OptionsWithArgument.Options)
                    {
                        packet.WriteString8(opt.Text);
                        packet.WriteUInt16(opt.Id);
                    }
                }
                if (MerchantDialogType == MerchantDialogType.Input)
                {
                    packet.WriteUInt16(Input.Id);
                }
                if (MerchantDialogType == MerchantDialogType.InputWithArgument)
                {
                    packet.WriteString8(InputWithArgument.Argument);
                    packet.WriteUInt16(InputWithArgument.Id);
                }
                if (MerchantDialogType == MerchantDialogType.MerchantShopItems)
                {
                    packet.WriteUInt16(ShopItems.Id);
                    packet.WriteUInt16(ShopItems.ItemsCount);
                    foreach (var item in ShopItems.Items)
                    {
                        packet.WriteUInt16(item.Tile);
                        packet.WriteByte(item.Color);
                        packet.WriteUInt32(item.Price);
                        packet.WriteString8(item.Name);
                        packet.WriteString8(item.Description);
                    }
                }
                if (MerchantDialogType == MerchantDialogType.MerchantSkills)
                {
                    packet.WriteUInt16(Skills.Id);
                    packet.WriteUInt16(Skills.SkillsCount);
                    foreach (var skill in Skills.Skills)
                    {
                        packet.WriteByte(skill.IconType);
                        packet.WriteUInt16(skill.Icon);
                        packet.WriteByte(skill.Color);
                        packet.WriteString8(skill.Name);
                    }
                }
                if (MerchantDialogType == MerchantDialogType.MerchantSpells)
                {
                    packet.WriteUInt16(Spells.Id);
                    packet.WriteUInt16(Spells.SpellsCount);
                    foreach (var spell in Spells.Spells)
                    {
                        packet.WriteByte(spell.IconType);
                        packet.WriteUInt16(spell.Icon);
                        packet.WriteByte(spell.Color);
                        packet.WriteString8(spell.Name);
                    }
                }
                if (MerchantDialogType == MerchantDialogType.UserSkillBook)
                {
                    packet.WriteUInt16(UserSkills.Id);
                }
                if (MerchantDialogType == MerchantDialogType.UserSpellBook)
                {
                    packet.WriteUInt16(UserSpells.Id);
                }
                if (MerchantDialogType == MerchantDialogType.UserInventoryItems)
                {
                    packet.WriteUInt16(UserInventoryItems.Id);
                    packet.WriteByte(UserInventoryItems.InventorySlotsCount);
                    foreach (var slot in UserInventoryItems.InventorySlots)
                    {
                        packet.WriteByte(slot);
                    }
                }

                return(packet);
            }