コード例 #1
0
        public S_LOAD_EP_INFO(TeraMessageReader r) : base(r)
        {
            Perks = new Dictionary <uint, uint>();

            var perksCount = r.ReadInt16();

            if (perksCount == 0)
            {
                return;
            }

            var perksOffset = r.ReadInt16();

            r.RepositionAt(perksOffset);

            for (var i = 0; i < perksCount; i++)
            {
                r.Skip(2);    //var curr = r.ReadUInt16();
                var next      = r.ReadUInt16();
                var perkId    = r.ReadUInt32();
                var perkLevel = r.ReadUInt32();
                Perks[perkId] = perkLevel;
                if (next == 0)
                {
                    break;
                }
                r.RepositionAt(next);
            }
        }
コード例 #2
0
        public S_DUNGEON_COOL_TIME_LIST(TeraMessageReader reader) : base(reader)
        {
            DungeonCooldowns = new Dictionary <uint, short>();

            try
            {
                reader.RepositionAt(4);
                var count = reader.ReadUInt16();
                reader.Skip(2); //var offset = reader.ReadUInt16();
                reader.Skip(4);
                for (var i = 0; i < count; i++)
                {
                    reader.Skip(2); //var curr = reader.ReadUInt16();
                    var next = reader.ReadUInt16();
                    var id   = reader.ReadUInt32();
                    reader.Skip(8);
                    var daily   = reader.ReadInt16();
                    var weekly  = reader.ReadInt16();
                    var entries = (short)(daily == -1 ? weekly == -1 ? -1 : weekly : daily);
                    if (entries != -1)
                    {
                        DungeonCooldowns[id] = entries;
                    }
                    if (next == 0)
                    {
                        return;
                    }
                    reader.RepositionAt(next);
                }
            }
            catch (System.Exception)
            {
                Log.F($"[S_DUNGEON_COOL_TIME_LIST] Failed to parse packet");
            }
        }
コード例 #3
0
        public S_BEGIN_THROUGH_ARBITER_CONTRACT(TeraMessageReader reader) : base(reader)
        {
            var senderOffset    = reader.ReadUInt16();
            var recipientOffset = reader.ReadUInt16();

            reader.Skip(2);
            Type = (RequestType)reader.ReadUInt32();
            reader.RepositionAt(senderOffset);
            Sender = reader.ReadTeraString();
            reader.RepositionAt(recipientOffset);
            Recipient = reader.ReadTeraString();
        }
コード例 #4
0
        public S_GUILD_MEMBER_LIST(TeraMessageReader reader) : base(reader)
        {
            var membersCount  = reader.ReadInt16();
            var membersOffset = reader.ReadInt16();

            reader.Skip(2); //gname offset
            var masterNameOffset = reader.ReadInt16();

            MasterId = reader.ReadUInt32();
            reader.RepositionAt(masterNameOffset);
            MasterName = reader.ReadTeraString();
            //GuildMembersList = new Dictionary<uint, string>();
            if (membersCount == 0)
            {
                return;
            }
            try
            {
                reader.RepositionAt(membersOffset);

                for (var i = 0; i < membersCount; i++)
                {
                    var m = new GuildMemberData();
                    reader.Skip(2); //curr
                    var next       = reader.ReadUInt16();
                    var nameOffset = reader.ReadInt16();

                    reader.Skip(2); //noteOffset
                    m.PlayerId = reader.ReadUInt32();

                    reader.RepositionAt(nameOffset);
                    m.Name = reader.ReadTeraString();

                    Members.Add(m);
                    //GuildMembersList[playerId] = name;

                    if (next == 0)
                    {
                        return;
                    }
                    reader.RepositionAt(next);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"[{nameof(S_GUILD_MEMBER_LIST)}] Failed to parse packet. \nContent:\n{Payload.Array.ToHexString()}\nException:\n{e.Message}\n{e.StackTrace}");
                //WindowManager.ViewModels.NotificationArea.Enqueue("Warning", "A non-fatal error occured. More detailed info has been written to error.log. Please report this to the developer on Discord or Github.", NotificationType.Warning, 10000);
            }
        }
コード例 #5
0
        public S_LOAD_EP_INFO(TeraMessageReader r) : base(r)
        {
            var perksCount = r.ReadInt16();

            //var perksOffset = r.ReadInt16();
            //var lvl = r.ReadUInt32();
            //var exp = r.ReadUInt64();
            //var totPoints = r.ReadUInt32();
            //var usedPoints = r.ReadUInt32();
            //var dailyExp = r.ReadUInt32();
            //var dailyExpMax = r.ReadUInt32();
            //var prevLevel = r.ReadUInt32();
            //var prevTotalPoints = r.ReadUInt32();
            r.Skip(38);

            Perks = new Dictionary <uint, uint>();
            if (perksCount == 0)
            {
                return;
            }

            for (var i = 0; i < perksCount; i++)
            {
                r.Skip(2);    //var curr = r.ReadUInt16();
                var next      = r.ReadUInt16();
                var perkId    = r.ReadUInt32();
                var perkLevel = r.ReadUInt32();
                Perks[perkId] = perkLevel;
                if (next == 0)
                {
                    break;
                }
                r.RepositionAt(next);
            }
        }
コード例 #6
0
        public S_LEARN_EP_PERK(TeraMessageReader r) : base(r)
        {
            var perksCount = r.ReadInt16();

            //var perksOffset = r.ReadInt16();
            //var success = r.ReadBoolean();
            //var usedPoints = r.ReadUInt32();

            r.Skip(7);

            Perks = new Dictionary <uint, uint>();
            if (perksCount == 0)
            {
                return;
            }

            for (var i = 0; i < perksCount; i++)
            {
                r.Skip(2);    //var curr = r.ReadUInt16();
                var next      = r.ReadUInt16();
                var perkId    = r.ReadUInt32();
                var perkLevel = r.ReadUInt32();
                Perks[perkId] = perkLevel;
                if (next == 0)
                {
                    break;
                }
                r.RepositionAt(next);
            }
        }
コード例 #7
0
        public S_PARTY_MEMBER_LIST(TeraMessageReader reader) : base(reader)
        {
            var count  = reader.ReadUInt16();
            var offset = reader.ReadUInt16();

            Im   = reader.ReadBoolean();
            Raid = reader.ReadBoolean();

            reader.Skip(12);

            LeaderServerId = reader.ReadUInt32();
            LeaderPlayerId = reader.ReadUInt32();

            reader.Skip(19);

            Members = new List <GroupMemberData>();

            for (var i = 0; i < count; i++)
            {
                var u = new GroupMemberData();
                reader.RepositionAt(offset);
                reader.Skip(2);
                var nextOffset = reader.ReadUInt16();
                var nameOffset = reader.ReadUInt16();
                u.ServerId  = reader.ReadUInt32();
                u.PlayerId  = reader.ReadUInt32();
                u.Level     = reader.ReadUInt32();
                u.Class     = (Class)reader.ReadUInt32();
                u.Online    = reader.ReadBoolean();
                u.EntityId  = reader.ReadUInt64();
                u.Order     = reader.ReadInt32();
                u.CanInvite = reader.ReadBoolean();
                u.Laurel    = (Laurel)reader.ReadUInt32();
                u.Awakened  = reader.ReadInt32() > 0;

                reader.RepositionAt(nameOffset);
                u.Name     = reader.ReadTeraString();
                u.Alive    = true;
                u.IsLeader = u.ServerId == LeaderServerId && u.PlayerId == LeaderPlayerId;
                Members.Add(u);
                offset = nextOffset;
            }
        }
コード例 #8
0
        private string ParseBlockedUser(TeraMessageReader reader)
        {
            reader.Skip(4);
            var nameOffset = reader.ReadUInt16();

            reader.RepositionAt(nameOffset);
            var name = reader.ReadTeraString();

            reader.ReadTeraString(); //skips notes
            return(name);
        }
コード例 #9
0
        public C_LOGIN_ARBITER(TeraMessageReader reader) : base(reader)
        {
            var nameOffset = reader.ReadUInt16();

            reader.Skip(9);
            Language = (LangEnum)reader.ReadUInt32();
            Version  = reader.ReadInt32();
            reader.RepositionAt(nameOffset);
            AccountName = reader.ReadTeraString();
            reader.Factory.ReleaseVersion = Version;
        }
コード例 #10
0
        public S_TRADE_BROKER_DEAL_SUGGESTED(TeraMessageReader reader) : base(reader)
        {
            var nameOffset = reader.ReadUInt16();

            PlayerId     = reader.ReadUInt32();
            Listing      = reader.ReadUInt32();
            Item         = reader.ReadInt32();
            Amount       = reader.ReadInt64();
            SellerPrice  = reader.ReadInt64();
            OfferedPrice = reader.ReadInt64();
            reader.RepositionAt(nameOffset);
            Name = reader.ReadTeraString();
        }
コード例 #11
0
        public S_ANSWER_INTERACTIVE(TeraMessageReader reader) : base(reader)
        {
            var nameOffset = reader.ReadUInt16();

            reader.Skip(4); // type
            if (reader.Factory.ReleaseVersion / 100 >= 103)
            {
                PlayerId = reader.ReadUInt32();
            }
            TemplateId = reader.ReadInt32();
            Level      = reader.ReadInt32();
            HasParty   = reader.ReadBoolean();
            HasGuild   = reader.ReadBoolean();
            ServerId   = reader.ReadUInt32();
            reader.RepositionAt(nameOffset);
            Name = reader.ReadTeraString();
        }
コード例 #12
0
        public S_GET_USER_LIST(TeraMessageReader reader) : base(reader)
        {
            CharacterList = new List <CharacterData>();
            var count = reader.ReadInt16();
            var next  = reader.ReadInt16();


            for (var i = 0; i < count; i++)
            {
                var c = new CharacterData();
                reader.RepositionAt(next);

                reader.Skip(2);
                next = reader.ReadInt16();

                reader.Skip(4);

                var nameOffset = reader.ReadInt16();

                reader.Skip(8); //array offsets and counts

                var guildOffset = reader.ReadInt16();

                c.Id = reader.ReadUInt32();

                reader.Skip(4); //c.gender = reader.ReadInt32();
                reader.Skip(4); //c.race = reader.ReadInt32();
                c.CharClass = (Class)reader.ReadInt32();
                c.Level     = reader.ReadInt32();
                reader.Skip(8); //c.hp = reader.ReadInt32();
                reader.Skip(4); //c.mp = reader.ReadInt32();
                //c.LastLocation = new Location(reader.ReadUInt32(), reader.ReadUInt32(), reader.ReadUInt32());
                c.LastWorldId   = reader.ReadUInt32();
                c.LastGuardId   = reader.ReadUInt32();
                c.LastSectionId = reader.ReadUInt32();
                reader.Skip(4); // dungeon gauntlet difficulty id
                c.LastOnline = reader.ReadInt64();
                reader.Skip(367);
                c.Laurel   = (Laurel)reader.ReadInt32();
                c.Position = reader.ReadInt32();
                c.GuildId  = reader.ReadUInt32();
                //TODO: use adventureCoins and itemLevel from here (added in p103)
                reader.RepositionAt(nameOffset);
                c.Name = reader.ReadTeraString();
                try
                {
                    reader.RepositionAt(guildOffset);
                    c.GuildName = reader.ReadTeraString();
                }
                catch { }
                CharacterList.Add(c);
                //CharacterList.Add(new Character(c.Name, (Class)c.CharClass, c.Id, c.Pos)
                //{
                //    GuildName = c.GuildName,
                //    Laurel = (Laurel)c.Laurel,
                //    Level = c.Level,
                //    LastOnline = c.LastOnline,
                //    LastLocation = new Location(c.LastLocation.World, c.LastLocation.Guard, c.LastLocation.Section)
                //});
            }
            CharacterList = CharacterList.OrderBy(ch => ch.Position).ToList();
        }
コード例 #13
0
        public S_SPAWN_USER(TeraMessageReader reader) : base(reader)
        {
            reader.Skip(2 + 2 + 2 + 2);
            var nameOffset      = reader.ReadUInt16();
            var guildNameOffset = reader.ReadUInt16();
            var guildRankOffset = reader.ReadUInt16();

            reader.Skip(2 + 2 + 2 + 2 + 2);
            ServerId = reader.ReadUInt32();
            PlayerId = reader.ReadUInt32();
            //if(!WindowManager.GroupWindow.VM.Exists(PlayerId,ServerId)) return;
            EntityId = reader.ReadUInt64();
            reader.Skip(12);
            reader.Skip(2);
            reader.Skip(4);
            TemplateId = reader.ReadUInt32();
            reader.Skip(2 + 2 + 2 + 2 + 2 + 1 + 1 + 4 + 4);

            var weaponId = reader.ReadUInt32();
            var armorId  = reader.ReadUInt32();
            var glovesId = reader.ReadUInt32();
            var bootsId  = reader.ReadUInt32();

            Weapon = new GearItemData(weaponId, GearTier.Low, GearPiece.Weapon);
            Armor  = new GearItemData(armorId, GearTier.Low, GearPiece.Armor);
            Gloves = new GearItemData(glovesId, GearTier.Low, GearPiece.Hands);
            Boots  = new GearItemData(bootsId, GearTier.Low, GearPiece.Feet);

            // ReSharper disable UnusedVariable
            var underwear       = reader.ReadUInt32();
            var head            = reader.ReadUInt32();
            var face            = reader.ReadUInt32();
            var spawnFx         = reader.ReadInt32();
            var mount           = reader.ReadInt32();
            var pose            = reader.ReadInt32();
            var title           = reader.ReadInt32();
            var shuttleId       = reader.ReadInt64();
            var guildLogo       = reader.ReadInt32();
            var exarch          = reader.ReadBoolean();
            var gm              = reader.ReadBoolean();
            var gmInv           = reader.ReadBoolean();
            var weapModel       = reader.ReadUInt32();
            var bodyModel       = reader.ReadUInt32();
            var handModel       = reader.ReadUInt32();
            var feetModel       = reader.ReadUInt32();
            var weapDye         = reader.ReadUInt32();
            var bodyDye         = reader.ReadUInt32();
            var handDye         = reader.ReadUInt32();
            var feetDye         = reader.ReadUInt32();
            var underwearDye    = reader.ReadUInt32();
            var backDye         = reader.ReadUInt32();
            var headDye         = reader.ReadUInt32();
            var faceDye         = reader.ReadUInt32();
            var weapEnch        = reader.ReadUInt32();
            var woldEventTarget = reader.ReadBoolean();
            var pkEnabled       = reader.ReadBoolean();

            // ReSharper restore UnusedVariable
            Level = reader.ReadInt32();


            //reader.Skip(4 + 4 + 4 + 4 + 4 + 4 + 4 + 8 + 4 + 1 + 1 + 1 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4);

            reader.RepositionAt(nameOffset);
            Name = reader.ReadTeraString();
            reader.RepositionAt(guildNameOffset);
            GuildName = reader.ReadTeraString();
            reader.RepositionAt(guildRankOffset);
            GuildRank = reader.ReadTeraString();

            //System.Console.WriteLine("[S_SPAWN_USER] {0} {1}", EntityId, Name);
        }
コード例 #14
0
        public S_ITEMLIST(TeraMessageReader r) : base(r)
        {
            Items     = new Dictionary <uint, ItemAmount>();
            GearItems = new Dictionary <uint, ParsedGearItem>();

            try
            {
                var count  = r.ReadUInt16();
                var offset = r.ReadUInt16();
                r.Skip(8); // gameId
                Container  = r.ReadInt32();
                Pocket     = r.ReadInt32();
                NumPockets = r.ReadInt32();
                Size       = r.ReadInt32();
                r.Skip(8); // var money = r.ReadInt64();
                r.Skip(4); // var lootPriority = r.ReadInt32();
                IsOpen = r.ReadBoolean();
                r.Skip(1); // var requested = r.ReadBoolean();
                First       = r.ReadBoolean();
                More        = r.ReadBoolean();
                LastInBatch = r.ReadBoolean();
                if (offset == 0)
                {
                    return;
                }
                r.RepositionAt(offset);
                for (var i = 0; i < count; i++)
                {
                    r.Skip(2); // var curr = reader.ReadUInt16();
                    var next = r.ReadUInt16();
                    r.Skip(4); // crystals ref
                    r.Skip(4); // passivity ref
                    r.Skip(4); // merged passivity ref
                    r.Skip(2); // custom string offset
                    var itemId = r.ReadUInt32();
                    r.Skip(8); // dbid
                    r.Skip(8); // ownerId (playerId)
                    var slot = r.ReadUInt32();
                    //if(slot <= 39) continue;
                    var amount = r.ReadInt32();
                    r.Skip(4); // enchant
                    r.Skip(4); // durability
                    r.Skip(4); // soulbound
                    r.Skip(4); // passivity sets
                    r.Skip(4); // extra passivity sets
                    r.Skip(4); // remodel
                    r.Skip(4); // dye
                    r.Skip(4); // dye sec remaining
                    r.Skip(8); // dye date
                    r.Skip(8); // dye expire date
                    r.Skip(1); // masterwork
                    r.Skip(4); // enigma
                    r.Skip(4); // times brokered
                    r.Skip(4); // enchant advantage
                    r.Skip(4); // enchant bonus
                    r.Skip(4); // enchant bonus max plus
                    r.Skip(8); // bound to player (playerId)
                    r.Skip(1); // awakened
                    r.Skip(4); // liberation count
                    r.Skip(4); // feedstock
                    r.Skip(4); // bound to item
                    r.Skip(1); // has etching
                    r.Skip(1); // pc bang
                    r.Skip(8); // exp

                    Items[slot] = new ItemAmount(itemId, amount);
                    //if (slot > 39) Items[slot] = new ItemAmount(itemId, amount);
                    //else GearItems[itemId] = new ParsedGearItem(itemId, enchant, exp);

                    if (next == 0)
                    {
                        break;
                    }
                    r.RepositionAt(next);
                }
            }
            catch
            {
                Failed = true;
            }
        }
コード例 #15
0
        public S_GET_USER_LIST(TeraMessageReader reader) : base(reader)
        {
            CharacterList = new List <CharacterData>();
            var count = reader.ReadInt16();
            var next  = reader.ReadInt16();


            for (var i = 0; i < count; i++)
            {
                var c = new CharacterData();
                reader.RepositionAt(next);

                reader.Skip(2);
                next = reader.ReadInt16();

                reader.Skip(4);

                var nameOffset = reader.ReadInt16();

                reader.Skip(8); //array offsets and counts

                var guildOffset = reader.ReadInt16();

                c.Id = reader.ReadUInt32();

                reader.Skip(4); //c.gender = reader.ReadInt32();
                reader.Skip(4); //c.race = reader.ReadInt32();
                c.CharClass = (Class)reader.ReadInt32();
                c.Level     = reader.ReadInt32();
                reader.Skip(8); //c.hp = reader.ReadInt32();
                reader.Skip(4); //c.mp = reader.ReadInt32();
                //c.LastLocation = new Location(reader.ReadUInt32(), reader.ReadUInt32(), reader.ReadUInt32());
                c.LastWorldId   = reader.ReadUInt32();
                c.LastGuardId   = reader.ReadUInt32();
                c.LastSectionId = reader.ReadUInt32();
                c.LastOnline    = reader.ReadInt64();
                reader.Skip(reader.Factory.ReleaseVersion >= 8600 ? 367 : 359);
                c.Laurel   = (Laurel)reader.ReadInt32();
                c.Position = reader.ReadInt32();
                c.GuildId  = reader.ReadUInt32();

                reader.RepositionAt(nameOffset);
                c.Name = reader.ReadTeraString();
                try
                {
                    reader.RepositionAt(guildOffset);
                    c.GuildName = reader.ReadTeraString();
                }
                catch { }
                CharacterList.Add(c);
                //CharacterList.Add(new Character(c.Name, (Class)c.CharClass, c.Id, c.Pos)
                //{
                //    GuildName = c.GuildName,
                //    Laurel = (Laurel)c.Laurel,
                //    Level = c.Level,
                //    LastOnline = c.LastOnline,
                //    LastLocation = new Location(c.LastLocation.World, c.LastLocation.Guard, c.LastLocation.Section)
                //});
            }
            CharacterList = CharacterList.OrderBy(ch => ch.Position).ToList();
        }