コード例 #1
0
        internal EachSkillResultServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            reader.Skip(4);
            Source = reader.ReadEntityId();
            Target = reader.ReadEntityId();


            //I think it s some kind of source ID.
            //When I use a skill against any monstrer, it s always the same value
            //When I pick up a mana mote, differente ID
            Unknow1 = reader.ReadBytes(4);

            SkillId = reader.ReadInt32() & 0x3FFFFFF;

            //Not sure if it s a int32. or int16 or int64 or other thing
            //When using a skill with many hit, each hit seem to have a different number (ex: 0, 1, 2, or 3)
            HitId = reader.ReadInt32();

            //No f*****g idea. I think I see 3 different part in that thing
            Unknow2 = reader.ReadBytes(12);

            Amount     = reader.ReadInt32();
            FlagsDebug = reader.ReadInt32();
            Flags      = (SkillResultFlags)FlagsDebug;
            IsCritical = (reader.ReadByte() & 1) != 0;

            if (IsMana)
            {
                Amount = Math.Abs(Amount);
            }
        }
コード例 #2
0
        internal EachSkillResultServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            reader.Skip(4);
            Source = reader.ReadEntityId();
            reader.Skip(8);
            Target = reader.ReadEntityId();


            //I think it s some kind of source ID.
            //When I use a skill against any monstrer, it s always the same value
            //When I pick up a mana mote, differente ID
            Unknow1 = reader.ReadBytes(4);

            SkillId = new SkillId(reader).Id;

            //Not sure if it s a int32. or int16 or int64 or other thing
            //When using a skill with many hit, each hit seem to have a different number (ex: 0, 1, 2, or 3)
            HitId = reader.ReadInt32();

            //No f*****g idea. I think I see 3 different part in that thing
            Unknow2 = reader.ReadBytes(12);   //unknown, id, time

            Amount      = reader.ReadInt64(); // KR now use 64 bit
            FlagsDebug  = reader.ReadInt32();
            Flags       = (SkillResultFlags)FlagsDebug;
            IsCritical  = (reader.ReadByte() & 1) != 0;
            ConsumeEdge = (reader.ReadByte() & 1) != 0;
            Blocked     = (reader.ReadByte() & 1) != 0;
            reader.Skip(reader.Factory.ReleaseVersion >= 7401 ? 8 : 12); //KR removed something
            Position = reader.ReadVector3f();
            Heading  = reader.ReadAngle();
            //if (Position.X!=0)
            //    Trace.WriteLine($"{Time.Ticks} {BitConverter.ToString(BitConverter.GetBytes(Target.Id))} {SkillId} {Position} {Heading}");
        }
コード例 #3
0
        public S_GET_USER_GUILD_LOGO(TeraMessageReader reader) : base(reader)
        {
            var offset = reader.ReadUInt16();
            var size   = reader.ReadUInt16();

            PlayerId = reader.ReadUInt32();
            GuildId  = reader.ReadUInt32();
            //Debug.WriteLine("icon size:"+size+";offset:"+offset+";player:"+PlayerId+";GuildId:"+GuildId);

            var logo = reader.ReadBytes(size);

            GuildLogo = new Bitmap(64, 64, PixelFormat.Format8bppIndexed);
            var paletteSize = (size - 0x1018) / 3;

            if (paletteSize > 0x100 || paletteSize < 1)
            {
                Debug.WriteLine("Missed guild logo format");
                return;
            }
            var palette = GuildLogo.Palette;

            for (var i = 0; i < paletteSize; i++)
            {
                palette.Entries[i] = Color.FromArgb(logo[0x14 + i * 3], logo[0x15 + i * 3], logo[0x16 + i * 3]);
            }
            var pixels = GuildLogo.LockBits(new Rectangle(0, 0, 64, 64), ImageLockMode.WriteOnly, GuildLogo.PixelFormat);

            Marshal.Copy(logo, size - 0x1000, pixels.Scan0, 0x1000);
            GuildLogo.UnlockBits(pixels);
            GuildLogo.Palette = palette;
            //GuildLogo.Save($"q:\\{Time.Ticks}.bmp",ImageFormat.Bmp);
            //System.IO.File.WriteAllBytes($"q:\\{Time.Ticks}.bin", logo);
        }
コード例 #4
0
        internal CChat(TeraMessageReader reader) : base(reader)
        {
            //    reader.Skip(2);
            Canal = reader.ReadBytes(6);

            //Console.WriteLine("Canal:" + BitConverter.ToString(Canal));

            Text = reader.ReadTeraString();

            // Console.WriteLine("text:" + Text);
        }
コード例 #5
0
        } //0 = Hidden, 1 = Damage, 2 = Heal, 3 = MP, bit16+ = DataCenter.NocTanEffectData

        internal EachSkillResultServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            reader.Skip(4);
            Source = reader.ReadEntityId();
            if (reader.Factory.ReleaseVersion >= 7402)
            {
                var owner = reader.ReadEntityId();
                if (owner.Id != 0)
                {
                    Source = owner;
                }
            } // not sure, when it was added

            Target     = reader.ReadEntityId();
            TemplateId = reader.ReadInt32();

            SkillId = new SkillId(reader).Id;

            HitId   = reader.ReadInt32();                                                                 //index in TargetingList (NOT id) - See DataCenter.SkillData
            Unknow2 = reader.ReadBytes(12);                                                               //index in area, id, time

            Amount      = reader.Factory.ReleaseVersion < 6200 ? reader.ReadInt32() : reader.ReadInt64(); // KR now use 64 bit
            FlagsDebug  = reader.ReadInt32();
            Flags       = (SkillResultFlags)FlagsDebug;
            IsCritical  = (reader.ReadByte() & 1) != 0;
            ConsumeEdge = (reader.ReadByte() & 1) != 0;
            if (reader.Factory.ReleaseVersion >= 3707)        //brawler stuff
            {
                Blocked       = (reader.ReadByte() & 1) != 0; ///SuperArmor
                SuperArmorId  = reader.ReadInt32();
                HitCylinderId = reader.ReadInt32();
                reader.Skip(4); // reaction bools: enable,push,air, airchain
            }
            else
            {
                reader.Skip(2);    //reaction bools: enable, push
            }
            Position = reader.ReadVector3f();
            Heading  = reader.ReadAngle();
            //if (Position.X!=0)
            //    Debug.WriteLine($"{Time.Ticks} {BitConverter.ToString(BitConverter.GetBytes(Target.Id))} {SkillId} {Position} {Heading}");
        }
コード例 #6
0
        internal S_GUILD_QUEST_LIST(TeraMessageReader reader) : base(reader)
        {
            //PrintRaw();
            GuildQuests = new List <GuildQuest>();
            var counter           = reader.ReadUInt16();
            var questOffset       = reader.ReadUInt16();
            var guildNameOffset   = reader.ReadUInt16();
            var guildMasterOffset = reader.ReadUInt16();

            var guildId       = reader.ReadUInt32();
            var guildMasterId = reader.ReadInt32();

            GuildLevel            = reader.ReadUInt32();
            GuildXpCurrent        = reader.ReadUInt64();
            GuildXpNextLevel      = reader.ReadUInt64();
            Gold                  = reader.ReadUInt64();
            NumberCharacters      = reader.ReadUInt32();
            NumberAccount         = reader.ReadUInt32();
            GuildSize             = (GuildSizeType)reader.ReadUInt32();
            GuildCreationTime     = UnixTimeStampToDateTime(reader.ReadUInt64());
            NumberQuestsDone      = reader.ReadUInt32();
            NumberTotalDailyQuest = reader.ReadUInt32();
            GuildName             = reader.ReadTeraString();
            GuildMaster           = reader.ReadTeraString();

            for (var i = 1; i <= counter; i++)
            {
                reader.BaseStream.Position = questOffset - 4;
                var pointer = reader.ReadUInt16();
                Debug.Assert(pointer == questOffset);//should be the same
                var nextOffset = reader.ReadUInt16();

                var countTargets  = reader.ReadUInt16();
                var offsetTargets = reader.ReadUInt16();

                var countUnk2  = reader.ReadUInt16();
                var offsetUnk2 = reader.ReadUInt16();

                var countRewards  = reader.ReadUInt16();
                var offsetRewards = reader.ReadUInt16();

                var offsetName        = reader.ReadUInt16();
                var offsetDescription = reader.ReadUInt16();
                var offsetGuildName   = reader.ReadUInt16();

                var id         = reader.ReadUInt32();
                var questType2 = (GuildQuestType2)reader.ReadUInt32();
                var questSize  = (QuestSizeType)reader.ReadUInt32();
                var unk3       = reader.ReadByte();
                var unk4       = reader.ReadUInt32();
                var active     = reader.ReadByte();
                //Debug.WriteLine(active.ToString("X"));
                var activeBool = active == 1;
                var unk7       = reader.ReadBytes(3);

                //in seconds
                var timeRemaining = reader.ReadUInt32();


                var guildQuestType = (GuildQuestType)reader.ReadUInt32();
                var unk5           = reader.ReadByte();
                var unk6           = reader.ReadInt32();

                var guildQuestDescriptionLabel = reader.ReadTeraString();
                var guildQuestTitleLabel       = reader.ReadTeraString();
                var questguildname             = reader.ReadTeraString();
                //Debug.WriteLine(
                // ";unk3:" + unk3 +
                // ";unk4:" + unk4 +
                // ";unk5:" + unk5.ToString("X") +
                // ";unk6:" + unk6 +
                // ";unk7:" + BitConverter.ToString(unk7) +
                // ";countUnk2:" + countUnk2 +
                // ";offsetUnk2:" + offsetUnk2
                // );
                var targets = new List <GuildQuestTarget>();
                reader.BaseStream.Position = offsetTargets - 4;
                for (var j = 1; j <= countTargets; j++)
                {
                    var currentPosition  = reader.ReadUInt16();
                    var nextTargetOffset = reader.ReadUInt16();
                    var zoneId           = reader.ReadUInt32();
                    var targetId         = reader.ReadUInt32();
                    var countQuest       = reader.ReadUInt32();
                    var totalQuest       = reader.ReadUInt32();
                    targets.Add(new GuildQuestTarget(zoneId, targetId, countQuest, totalQuest));
                }

                var nextUnk2Offset = offsetUnk2;
                for (var j = 1; j <= countUnk2; j++)
                {
                    reader.BaseStream.Position = nextUnk2Offset - 4;
                    var currentPosition = reader.ReadUInt16();
                    nextUnk2Offset = reader.ReadUInt16();
                    Debug.WriteLine("unk2:" + reader.ReadByte().ToString("X") + " ;" + j + "/" + countUnk2);
                }

                var rewards = new List <GuildQuestItem>();
                reader.BaseStream.Position = offsetRewards - 4;
                for (var j = 1; j <= countRewards; j++)
                {
                    var currentPosition  = reader.ReadUInt16();
                    var nextRewardOffset = reader.ReadUInt16();
                    var item             = reader.ReadUInt32();
                    var amount           = reader.ReadUInt64();

                    rewards.Add(new GuildQuestItem(item, amount));
                }

                questOffset = nextOffset;

                var quest = new GuildQuest(
                    guildQuestType,
                    questType2,
                    guildQuestDescriptionLabel,
                    guildQuestTitleLabel,
                    questguildname,
                    targets,
                    activeBool,
                    rewards,
                    timeRemaining,
                    questSize

                    );
                GuildQuests.Add(quest);
            }

            // Debug.WriteLine(ToString());
        }
コード例 #7
0
        public S_IMAGE_DATA(TeraMessageReader reader) : base(reader)
        {
            var nameOffset  = reader.ReadUInt16();
            var imageOffset = reader.ReadUInt16();
            var imageLength = reader.ReadUInt16();

            reader.BaseStream.Position = nameOffset - 4;
            var imageName = reader.ReadTeraString();

            if (!imageName.StartsWith("guildlogo"))
            {
                return;
            }
            reader.BaseStream.Position = imageOffset - 4;
            var imageBytes = reader.ReadBytes(imageLength);
            var width      = BitConverter.ToInt32(imageBytes, 8);
            var type       = BitConverter.ToInt32(imageBytes, 12);

            var image   = new Bitmap(width, width, PixelFormat.Format8bppIndexed);
            var palette = image.Palette;
            int length;

            switch (type)
            {
            case 0:
            case 1:
                var paletteSize = BitConverter.ToInt32(imageBytes, 16);
                if (paletteSize >= imageLength - 24)
                {
                    Debug.WriteLine("palette size too big"); return;
                }
                for (var i = 0; i < paletteSize; i++)
                {
                    palette.Entries[i] = Color.FromArgb(imageBytes[0x14 + i * 3], imageBytes[0x15 + i * 3], imageBytes[0x16 + i * 3]);
                }
                length = BitConverter.ToInt32(imageBytes, paletteSize * 3 + 20);
                break;

            case 2:
            case 3:
                for (var i = 0; i < 255; i++)
                {
                    palette.Entries[i] = Color.FromArgb(i, i, i);
                }
                length = BitConverter.ToInt32(imageBytes, 16);
                break;

            default:
                Debug.WriteLine("Unknown guild logo format");
                return;
            }
            var pixels = image.LockBits(new Rectangle(0, 0, width, width), ImageLockMode.WriteOnly, image.PixelFormat);

            Marshal.Copy(imageBytes, imageLength - length, pixels.Scan0, length);
            image.UnlockBits(pixels);
            image.Palette = palette;
            var id = Convert.ToUInt32(imageName.Split('_')[2]);

            if (Database.ContainsKey(id))
            {
                return;
            }
            Database.Add(id, image);
            //if (!Directory.Exists("resources/images/guilds")) Directory.CreateDirectory("resources/images/guilds");
            //image.Save("resources/images/guilds/" + imageName + ".bmp", ImageFormat.Bmp);
        }
コード例 #8
0
        internal S_GET_USER_GUILD_LOGO(TeraMessageReader reader) : base(reader)
        {
            var offset = reader.ReadUInt16();
            var size   = reader.ReadUInt16();

            PlayerId = reader.ReadUInt32();
            GuildId  = reader.ReadUInt32();
            //Debug.WriteLine("icon size:"+size+";offset:"+offset+";player:"+PlayerId+";GuildId:"+GuildId);

            if (offset == 0 || size < 20)
            {
                GuildLogo = new Bitmap(1, 1, PixelFormat.Format8bppIndexed); return;
            }
            var logo  = reader.ReadBytes(size);
            var width = BitConverter.ToInt32(logo, 8);
            var type  = BitConverter.ToInt32(logo, 12);

            GuildLogo = new Bitmap(width, width, PixelFormat.Format8bppIndexed);
            var palette = GuildLogo.Palette;
            int length;

            switch (type)
            {
            case 0:
            case 1:
                var paletteSize = BitConverter.ToInt32(logo, 16);
                if (paletteSize >= size - 24)
                {
                    Debug.WriteLine("palette size too big"); return;
                }
                for (var i = 0; i < paletteSize; i++)
                {
                    palette.Entries[i] = Color.FromArgb(logo[0x14 + i * 3], logo[0x15 + i * 3], logo[0x16 + i * 3]);
                }
                length = BitConverter.ToInt32(logo, paletteSize * 3 + 20);
                break;

            case 2:
            case 3:
                for (var i = 0; i < 255; i++)
                {
                    palette.Entries[i] = Color.FromArgb(i, i, i);
                }
                length = BitConverter.ToInt32(logo, 16);
                break;

            default:
                Debug.WriteLine("Unknown guild logo format");
                return;
            }
            if (length >= size + 20 || length != width * width)
            {
                Debug.WriteLine("length mismatch"); return;
            }
            var pixels = GuildLogo.LockBits(new Rectangle(0, 0, width, width), ImageLockMode.WriteOnly, GuildLogo.PixelFormat);

            Marshal.Copy(logo, size - length, pixels.Scan0, length);
            GuildLogo.UnlockBits(pixels);
            GuildLogo.Palette = palette;
            //GuildLogo.Save($"q:\\{Time.Ticks}.bmp",ImageFormat.Bmp);
            //System.IO.File.WriteAllBytes($"q:\\{Time.Ticks}.bin", logo);
        }