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); } }
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}"); }
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); }
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); }
} //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}"); }
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()); }
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); }
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); }