Ejemplo n.º 1
0
        public void HandleErrorCode(ref PacketBufferReader p)
        {
            byte code = p.ReadByte();

            PopupMessage     = ServerErrorMessages.GetError(p.ID, code);
            CurrentLoginStep = LoginSteps.PopUpMessage;
        }
Ejemplo n.º 2
0
        public static ServerListEntry Create(ref PacketBufferReader p)
        {
            ServerListEntry entry = new ServerListEntry()
            {
                Index       = p.ReadUShort(),
                Name        = p.ReadASCII(32).MakeSafe(),
                PercentFull = p.ReadByte(),
                Timezone    = p.ReadByte(),
                Address     = p.ReadUInt()
            };

            // some server sends invalid ip.
            try
            {
                entry._ipAddress = new IPAddress
                                   (
                    new byte[]
                {
                    (byte)((entry.Address >> 24) & 0xFF),
                    (byte)((entry.Address >> 16) & 0xFF),
                    (byte)((entry.Address >> 8) & 0xFF),
                    (byte)(entry.Address & 0xFF)
                }
                                   );
            }
            catch (Exception e)
            {
                Log.Error(e.ToString());
            }

            entry._pinger.PingCompleted += entry.PingerOnPingCompleted;

            return(entry);
        }
Ejemplo n.º 3
0
        public void HandleRelayServerPacket(ref PacketBufferReader p)
        {
            byte[] ip =
            {
                p.ReadByte(), p.ReadByte(), p.ReadByte(), p.ReadByte()
            };

            ushort port = p.ReadUShort();
            uint   seed = p.ReadUInt();

            NetClient.LoginSocket.Disconnect();
            EncryptionHelper.Initialize(false, seed, (ENCRYPTION_TYPE)Settings.GlobalSettings.Encryption);

            NetClient.Socket.Connect(new IPAddress(ip), port)
            .ContinueWith
            (
                t =>
            {
                if (!t.IsFaulted)
                {
                    NetClient.Socket.EnableCompression();
                    // TODO: stackalloc
                    byte[] ss = new byte[4] {
                        (byte)(seed >> 24), (byte)(seed >> 16), (byte)(seed >> 8), (byte)seed
                    };
                    NetClient.Socket.Send(ss, 4, true, true);
                    NetClient.Socket.Send(new PSecondLogin(Account, Password, seed));
                }
            },
                TaskContinuationOptions.ExecuteSynchronously
            );
        }
Ejemplo n.º 4
0
        public void UpdateCharacterList(ref PacketBufferReader p)
        {
            ParseCharacterList(ref p);

            if (CurrentLoginStep != LoginSteps.PopUpMessage)
            {
                PopupMessage = null;
            }
            CurrentLoginStep = LoginSteps.CharacterSelection;
            UIManager.GetGump <CharacterSelectionGump>()?.Dispose();

            _currentGump?.Dispose();

            UIManager.Add(_currentGump = new CharacterSelectionGump());
            if (!string.IsNullOrWhiteSpace(PopupMessage))
            {
                Gump g = null;
                g = new LoadingGump(PopupMessage, LoginButtons.OK, (but) => g.Dispose())
                {
                    IsModal = true
                };
                UIManager.Add(g);
                PopupMessage = null;
            }
        }
Ejemplo n.º 5
0
        public static PopupMenuData Parse(ref PacketBufferReader p)
        {
            ushort mode        = p.ReadUShort();
            bool   isNewCliloc = mode >= 2;
            uint   serial      = p.ReadUInt();
            byte   count       = p.ReadByte();

            PopupMenuItem[] items = new PopupMenuItem[count];

            for (int i = 0; i < count; i++)
            {
                ushort hue = 0xFFFF, replaced = 0;
                int    cliloc;
                ushort index, flags;

                if (isNewCliloc)
                {
                    cliloc = (int)p.ReadUInt();
                    index  = p.ReadUShort();
                    flags  = p.ReadUShort();
                }
                else
                {
                    index  = p.ReadUShort();
                    cliloc = p.ReadUShort() + 3000000;
                    flags  = p.ReadUShort();

                    if ((flags & 0x84) != 0)
                    {
                        p.Skip(2);
                    }

                    if ((flags & 0x40) != 0)
                    {
                        p.Skip(2);
                    }

                    if ((flags & 0x20) != 0)
                    {
                        replaced = (ushort)(p.ReadUShort());
                    }
                }

                if ((flags & 0x01) != 0)
                {
                    hue = 0x0386;
                }

                items[i] = new PopupMenuItem
                           (
                    cliloc,
                    index,
                    hue,
                    replaced,
                    flags
                           );
            }

            return(new PopupMenuData(serial, items));
        }
Ejemplo n.º 6
0
        public void ServerListReceived(ref PacketBufferReader p)
        {
            byte   flags = p.ReadByte();
            ushort count = p.ReadUShort();

            DisposeAllServerEntries();
            Servers = new ServerListEntry[count];

            for (ushort i = 0; i < count; i++)
            {
                Servers[i] = ServerListEntry.Create(ref p);
            }

            CurrentLoginStep = LoginSteps.ServerSelection;

            if (Settings.GlobalSettings.AutoLogin || Reconnect)
            {
                if (Servers.Length != 0)
                {
                    int index = GetServerIndexFromSettings();

                    SelectServer((byte)Servers[index].Index);
                }
            }
        }
Ejemplo n.º 7
0
        public void ServerListReceived(ref PacketBufferReader p)
        {
            byte   flags = p.ReadByte();
            ushort count = p.ReadUShort();

            DisposeAllServerEntries();
            Servers = new ServerListEntry[count];

            for (ushort i = 0; i < count; i++)
            {
                Servers[i] = ServerListEntry.Create(ref p);
            }

            CurrentLoginStep = LoginSteps.ServerSelection;

            if (Settings.GlobalSettings.AutoLogin || Reconnect)
            {
                if (Servers.Length != 0)
                {
                    int index = Settings.GlobalSettings.LastServerNum;

                    if (index <= 0 || index > Servers.Length)
                    {
                        Log.Warn($"Wrong server index: {index}");
                        index = 1;
                    }

                    SelectServer((byte)Servers[index - 1].Index);
                }
            }
        }
Ejemplo n.º 8
0
        public void UpdateCharacterList(ref PacketBufferReader p)
        {
            ParseCharacterList(ref p);

            CurrentLoginStep = LoginSteps.CharacterSelection;
            UIManager.GetGump <CharacterSelectionGump>()?.Dispose();

            _currentGump?.Dispose();

            UIManager.Add(_currentGump = new CharacterSelectionGump());
        }
Ejemplo n.º 9
0
        private void ParseCharacterList(ref PacketBufferReader p)
        {
            int count = p.ReadByte();
            Characters = new string[count];

            for (ushort i = 0; i < count; i++)
            {
                Characters[i] = p.ReadASCII(30).TrimEnd('\0');

                p.Skip(30);
            }
        }
Ejemplo n.º 10
0
        public void ParsePacket(ref PacketBufferReader p)
        {
            byte code = p.ReadByte();

            switch (code)
            {
            case 0:     /* first read of guild member */

                byte count = p.ReadByte();

                for (int i = 0; i < count; i++)
                {
                    AddMember(p.ReadUnicode(), p.ReadUInt());     // vengono inviati in modo diverso ora, nome, seriale
                }

                break;

            case 1:                         // questo messaggio viene inviato quando aggiungo un membro della gilda
                DeleteMember(p.ReadUInt()); // leggo il seriale
                break;
            }
        }
Ejemplo n.º 11
0
        public void ReceiveCharacterList(ref PacketBufferReader p)
        {
            ParseCharacterList(ref p);
            ParseCities(ref p);

            World.ClientFeatures.SetFlags((CharacterListFlags)p.ReadUInt());
            CurrentLoginStep = LoginSteps.CharacterSelection;

            uint charToSelect = 0;

            bool haveAnyCharacter = false;
            bool tryAutologin     = Settings.GlobalSettings.AutoLogin || Reconnect;

            for (byte i = 0; i < Characters.Length; i++)
            {
                if (Characters[i].Length > 0)
                {
                    haveAnyCharacter = true;

                    if (Characters[i] == Settings.GlobalSettings.LastCharacterName)
                    {
                        charToSelect = i;

                        break;
                    }
                }
            }

            if (tryAutologin && haveAnyCharacter)
            {
                SelectCharacter(charToSelect);
            }
            else if (!haveAnyCharacter)
            {
                StartCharCreation();
            }
        }
Ejemplo n.º 12
0
        public void ParsePacket(ref PacketBufferReader p)
        {
            byte code         = p.ReadByte();
            bool partyGiga487 = false;
            bool add          = false;
            byte count        = 0;

            switch (code)
            {
            case 1:
                add = true;

                if (!partyGiga487)
                {
                    goto case 2;     //giga487, trovo molto confuso questa parte di codice, la riscrivo.
                }
                else
                {
                    count = p.ReadByte();

                    if (count <= 1)
                    {
                    }

                    for (int i = 0; i < count; i++)
                    {
                        uint serial = p.ReadUInt();
                        //InsertPartyElement(serial, wme.Name); //inserisce l'elemento del party libero
                        Members[i] = new PartyMember(serial);
                    }
                }



                break;

            case 2:
                count = p.ReadByte();

                if (count <= 1)     //se ho 2 elementi e ne rimuovo uno
                {
                    Leader  = 0;
                    Inviter = 0;

                    for (int i = 0; i < PARTY_SIZE; i++)
                    {
                        if (Members[i] == null || Members[i].Serial == 0)
                        {
                            break;
                        }

                        BaseHealthBarGump gump = UIManager.GetGump <BaseHealthBarGump>(Members[i].Serial);


                        if (gump != null)
                        {
                            if (code == 2)
                            {
                                Members[i].Serial = 0;
                            }

                            gump.RequestUpdateContents();
                        }
                    }

                    Clear();

                    UIManager.GetGump <PartyGump>()?.RequestUpdateContents();

                    break;
                }

                Clear();

                uint to_remove = 0xFFFF_FFFF;

                if (!add)
                {
                    to_remove = p.ReadUInt();

                    UIManager.GetGump <BaseHealthBarGump>(to_remove)?.RequestUpdateContents();
                }

                bool remove_all = !add && to_remove == World.Player;
                int  done       = 0;

                for (int i = 0; i < count; i++)
                {
                    uint serial = p.ReadUInt();
                    bool remove = !add && serial == to_remove;

                    if (remove && serial == to_remove && i == 0)
                    {
                        remove_all = true;
                    }

                    if (!remove && !remove_all)
                    {
                        if (!Contains(serial))
                        {
                            Members[i] = new PartyMember(serial);
                        }

                        done++;
                    }

                    if (i == 0 && !remove && !remove_all)
                    {
                        Leader = serial;
                    }

                    BaseHealthBarGump gump = UIManager.GetGump <BaseHealthBarGump>(serial);

                    if (gump != null)
                    {
                        gump.RequestUpdateContents();
                    }
                    else
                    {
                        if (serial == World.Player)
                        {
                        }
                    }
                }

                if (done <= 1 && !add)
                {
                    for (int i = 0; i < PARTY_SIZE; i++)
                    {
                        if (Members[i] != null && SerialHelper.IsValid(Members[i].Serial))
                        {
                            uint serial = Members[i].Serial;

                            Members[i] = null;

                            UIManager.GetGump <BaseHealthBarGump>(serial)?.RequestUpdateContents();
                        }
                    }

                    Clear();
                }


                UIManager.GetGump <PartyGump>()?.RequestUpdateContents();
                NetClient.Socket.Send(new PQueryPartyPosition());
                break;

            case 3:
            case 4:     /* questo è il messaggio di chat */
                uint   ser  = p.ReadUInt();
                string name = p.ReadUnicode();

                for (int i = 0; i < PARTY_SIZE; i++)
                {
                    if (Members[i] != null && Members[i].Serial == ser)
                    {
                        MessageManager.HandleMessage
                        (
                            null,
                            name,
                            Members[i].Name,
                            ProfileManager.CurrentProfile.PartyMessageHue,
                            MessageType.Party,
                            3,
                            TextType.GUILD_ALLY
                        );

                        break;
                    }
                }

                break;

            case 7:
                Inviter = p.ReadUInt();

                if (ProfileManager.CurrentProfile.PartyInviteGump)
                {
                    UIManager.Add(new PartyInviteGump(Inviter));
                }

                break;
            }
        }
Ejemplo n.º 13
0
        private void ParseCities(ref PacketBufferReader p)
        {
            byte count = p.ReadByte();

            Cities = new CityInfo[count];

            bool isNew = Client.Version >= ClientVersion.CV_70130;

            string[] descriptions = null;

            if (!isNew)
            {
                descriptions = ReadCityTextFile(count);
            }

            Point[] oldtowns =
            {
                new Point(105, 130), new Point(245,     90),
                new Point(165, 200), new Point(395,    160),
                new Point(200, 305), new Point(335,    250),
                new Point(160, 395), new Point(100,    250),
                new Point(270, 130), new Point(0xFFFF, 0xFFFF)
            };

            for (int i = 0; i < count; i++)
            {
                CityInfo cityInfo;

                if (isNew)
                {
                    byte   cityIndex       = p.ReadByte();
                    string cityName        = p.ReadASCII(32);
                    string cityBuilding    = p.ReadASCII(32);
                    ushort cityX           = (ushort)p.ReadUInt();
                    ushort cityY           = (ushort)p.ReadUInt();
                    sbyte  cityZ           = (sbyte)p.ReadUInt();
                    uint   cityMapIndex    = p.ReadUInt();
                    uint   cityDescription = p.ReadUInt();
                    p.Skip(4);

                    cityInfo = new CityInfo
                               (
                        cityIndex,
                        cityName,
                        cityBuilding,
                        ClilocLoader.Instance.GetString((int)cityDescription),
                        cityX,
                        cityY,
                        cityZ,
                        cityMapIndex,
                        isNew
                               );
                }
                else
                {
                    byte   cityIndex    = p.ReadByte();
                    string cityName     = p.ReadASCII(31);
                    string cityBuilding = p.ReadASCII(31);

                    cityInfo = new CityInfo
                               (
                        cityIndex,
                        cityName,
                        cityBuilding,
                        descriptions != null ? descriptions[i] : string.Empty,
                        (ushort)oldtowns[i % oldtowns.Length].X,
                        (ushort)oldtowns[i % oldtowns.Length].Y,
                        0,
                        0,
                        isNew
                               );
                }

                Cities[i] = cityInfo;
            }
        }
Ejemplo n.º 14
0
        public void ParsePacket(ref PacketBufferReader p)
        {
            byte code = p.ReadByte();

            bool add = false;

            switch (code)
            {
            case 1:
                add = true;
                goto case 2;

            case 2:
                byte count = p.ReadByte();

                if (count <= 1)
                {
                    Leader  = 0;
                    Inviter = 0;

                    for (int i = 0; i < PARTY_SIZE; i++)
                    {
                        if (Members[i] == null || Members[i].Serial == 0)
                        {
                            break;
                        }

                        BaseHealthBarGump gump = UIManager.GetGump <BaseHealthBarGump>(Members[i].Serial);


                        if (gump != null)
                        {
                            if (code == 2)
                            {
                                Members[i].Serial = 0;
                            }

                            gump.RequestUpdateContents();
                        }
                    }

                    Clear();

                    UIManager.GetGump <PartyGump>()?.RequestUpdateContents();

                    break;
                }

                Clear();

                uint to_remove = 0xFFFF_FFFF;

                if (!add)
                {
                    to_remove = p.ReadUInt();

                    UIManager.GetGump <BaseHealthBarGump>(to_remove)?.RequestUpdateContents();
                }

                bool remove_all = !add && to_remove == World.Player;
                int  done       = 0;

                for (int i = 0; i < count; i++)
                {
                    uint serial = p.ReadUInt();
                    bool remove = !add && serial == to_remove;

                    if (remove && serial == to_remove && i == 0)
                    {
                        remove_all = true;
                    }

                    if (!remove && !remove_all)
                    {
                        if (!Contains(serial))
                        {
                            Members[i] = new PartyMember(serial);
                        }

                        done++;
                    }

                    if (i == 0 && !remove && !remove_all)
                    {
                        Leader = serial;
                    }

                    BaseHealthBarGump gump = UIManager.GetGump <BaseHealthBarGump>(serial);

                    if (gump != null)
                    {
                        gump.RequestUpdateContents();
                    }
                    else
                    {
                        if (serial == World.Player)
                        {
                        }
                    }
                }

                if (done <= 1 && !add)
                {
                    for (int i = 0; i < PARTY_SIZE; i++)
                    {
                        if (Members[i] != null && SerialHelper.IsValid(Members[i].Serial))
                        {
                            uint serial = Members[i].Serial;

                            Members[i] = null;

                            UIManager.GetGump <BaseHealthBarGump>(serial)?.RequestUpdateContents();
                        }
                    }

                    Clear();
                }


                UIManager.GetGump <PartyGump>()?.RequestUpdateContents();

                break;

            case 3:
            case 4:
                uint   ser  = p.ReadUInt();
                string name = p.ReadUnicode();

                for (int i = 0; i < PARTY_SIZE; i++)
                {
                    if (Members[i] != null && Members[i].Serial == ser)
                    {
                        MessageManager.HandleMessage
                        (
                            null,
                            name,
                            Members[i].Name,
                            ProfileManager.CurrentProfile.PartyMessageHue,
                            MessageType.Party,
                            3,
                            TextType.GUILD_ALLY
                        );

                        break;
                    }
                }

                break;

            case 7:
                Inviter = p.ReadUInt();

                if (ProfileManager.CurrentProfile.PartyInviteGump)
                {
                    UIManager.Add(new PartyInviteGump(Inviter));
                }

                break;
            }
        }