public static bool ParseTrainerListOpcode(GenericReader gr, GenericReader gr2, StringBuilder sb, StreamWriter swe, byte direction) { sb.AppendLine("Packet offset " + gr.BaseStream.Position.ToString("X2")); sb.AppendLine("Opcode SMSG_TRAINER_LIST (0x01B1)"); StreamWriter sw = new StreamWriter("trainer.log", true, Encoding.ASCII); ulong guid = gr2.ReadUInt64(); TrainerType trainer_type = (TrainerType)gr2.ReadUInt32(); uint spells_count = gr2.ReadUInt32(); sw.WriteLine("Trainer {0}, type {1}, spells_count {2}", guid.ToString("X16"), trainer_type, spells_count); for (uint i = 0; i < spells_count; i++) { uint spellid = gr2.ReadUInt32(); TrainerSpellState state = (TrainerSpellState)gr2.ReadByte(); uint spellcost = gr2.ReadUInt32(); uint unk1 = gr2.ReadUInt32(); // isProfession? uint unk2 = gr2.ReadUInt32(); byte reqlevel = gr2.ReadByte(); uint reqskill = gr2.ReadUInt32(); uint reqskillvalue = gr2.ReadUInt32(); uint reqspell = gr2.ReadUInt32(); uint unk3 = gr2.ReadUInt32(); uint unk4 = gr2.ReadUInt32(); sw.WriteLine("Spell {0}, state {1}, cost {2}, unk1 {3}, unk2 {4}, reqlevel {5}, reqskill {6}, reqskillvalue {7}, reqspell {8}, unk3 {9} unk4 {10}", spellid, state, spellcost, unk1, unk2, reqlevel, reqskill, reqskillvalue, reqspell, unk3, unk4); } string title = gr2.ReadStringNull(); sw.WriteLine("title {0}", title); sw.Flush(); sw.Close(); if (gr2.BaseStream.Position == gr2.BaseStream.Length) sb.AppendLine("parsed: ok..."); else sb.AppendLine("parsed: error..."); return true; }
/// <summary> /// Packet header parser. /// </summary> /// <param name="gr">Main stream reader.</param> /// <param name="sw">Data stream writer.</param> /// <param name="swe">Error logger writer.</param> /// <param name="data">Data logger writer.</param> /// <param name="hex">HEX logger writer.</param> /// <returns>Successful</returns> private static bool ParseHeader(GenericReader gr, StreamWriter sw, StreamWriter swe, StreamWriter data, StreamWriter hex) { StringBuilder sb = new StringBuilder(); int datasize = gr.ReadInt32(); //sb.AppendLine("Packet offset " + (gr.BaseStream.Position - 4).ToString("X2")); //sb.AppendLine("Packet number: " + packet); //sb.AppendLine("Data size " + datasize); byte[] temp = gr.ReadBytes(datasize); MemoryStream ms = new MemoryStream(temp); GenericReader gr2 = new GenericReader(ms); uint id = 0; uint sess_id = 0; string time = ""; byte direction = 0; // 0-CMSG, 1-SMSG OpCodes opcode = OpCodes.MSG_NULL_ACTION; id = gr2.ReadUInt32(); sess_id = gr2.ReadUInt32(); time = gr2.ReadStringNull(); direction = gr2.ReadByte(); opcode = (OpCodes)gr2.ReadUInt16(); long cur_pos = gr2.BaseStream.Position; HexLike(gr2, hex, id, sess_id, time, direction, opcode); gr2.BaseStream.Position = cur_pos; switch (opcode) { /*case OpCodes.SMSG_MONSTER_MOVE: OpcodeParser.ParseMonsterMoveOpcode(gr, gr2, sb, swe, direction); break;*/ /*case OpCodes.SMSG_INITIAL_SPELLS: OpcodeParser.ParseInitialSpellsOpcode(gr, gr2, sb, swe, direction); break; case OpCodes.SMSG_AUCTION_LIST_RESULT: OpcodeParser.ParseAuctionListResultOpcode(gr, gr2, sb, swe, direction); break;*/ /*case OpCodes.SMSG_PARTY_MEMBER_STATS: case OpCodes.SMSG_PARTY_MEMBER_STATS_FULL: OpcodeParser.ParsePartyMemberStatsOpcode(gr, gr2, sb, swe, direction); break;*/ case OpCodes.SMSG_UPDATE_OBJECT: case OpCodes.SMSG_COMPRESSED_UPDATE_OBJECT: if (opcode == OpCodes.SMSG_COMPRESSED_UPDATE_OBJECT) { gr2 = A9.Decompress(gr2); gr2.BaseStream.Position = 0; hex.WriteLine("Decompressed SMSG_COMPRESSED_UPDATE_OBJECT:"); HexLike(gr2, hex, id, sess_id, time, direction, OpCodes.SMSG_UPDATE_OBJECT); gr2.BaseStream.Position = 0; } A9.ParseUpdatePacket(gr, gr2, sb, swe); break; /*case OpCodes.SMSG_SPELLNONMELEEDAMAGELOG: OpcodeParser.ParseSpellNonMeleeDamageLogOpcode(gr, gr2, sb, swe, direction); break; case OpCodes.SMSG_SPELLLOGEXECUTE: OpcodeParser.ParseSpellLogExecuteOpcode(gr, gr2, sb, swe, direction); break;*/ /*case OpCodes.SMSG_LOGIN_SETTIMESPEED: OpcodeParser.ParseLoginSetTimeSpeedOpcode(gr, gr2, sb, swe, direction); break; case OpCodes.SMSG_TRAINER_LIST: OpcodeParser.ParseTrainerListOpcode(gr, gr2, sb, swe, direction); break; case OpCodes.SMSG_ATTACKERSTATEUPDATE: OpcodeParser.ParseAttackerStateUpdateOpcode(gr, gr2, sb, swe, direction); break; case OpCodes.MSG_CORPSE_QUERY: OpcodeParser.ParseCorpseQueryOpcode(gr, gr2, sb, swe, direction); break; case OpCodes.SMSG_LOGIN_VERIFY_WORLD: OpcodeParser.ParseLoginVerifyWorldOpcode(gr, gr2, sb, swe, direction); break; default: // unhandled opcode return false;*/ } if (sb.ToString().Length != 0) sw.WriteLine(sb.ToString()); ms.Close(); gr2.Close(); return true; }
/// <summary> /// /// </summary> /// <param name="gr"></param> /// <param name="gr2"></param> /// <param name="sb"></param> /// <param name="swe"></param> /// <returns></returns> public static bool ParsePartyMemberStatsOpcode(GenericReader gr, GenericReader gr2, StringBuilder sb, StreamWriter swe, byte direction) { sb.AppendLine("Packet offset " + gr.BaseStream.Position.ToString("X2")); sb.AppendLine("Opcode SMSG_PARTY_MEMBER_STATS (0x007E)"); byte MAX_AURAS = 56; ulong guid = gr2.ReadPackedGuid(); sb.AppendLine("GUID " + guid.ToString("X16")); GroupUpdateFlags flags = (GroupUpdateFlags)gr2.ReadUInt32(); sb.AppendLine("Flags " + flags); if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_ONLINE) != 0) { GroupMemberOnlineStatus online = (GroupMemberOnlineStatus)gr2.ReadUInt16(); // flag sb.AppendLine("Online state " + online); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_CUR_HP) != 0) { ushort hp = gr2.ReadUInt16(); sb.AppendLine("Cur. health " + hp); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_MAX_HP) != 0) { ushort maxhp = gr2.ReadUInt16(); sb.AppendLine("Max health " + maxhp); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_POWER_TYPE) != 0) { Powers power = (Powers)gr2.ReadByte(); sb.AppendLine("Power type " + power); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_CUR_POWER) != 0) { ushort curpower = gr2.ReadUInt16(); sb.AppendLine("Cur. power " + curpower); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_MAX_POWER) != 0) { ushort maxpower = gr2.ReadUInt16(); sb.AppendLine("Max power " + maxpower); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_LEVEL) != 0) { ushort level = gr2.ReadUInt16(); sb.AppendLine("Level " + level); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_ZONE) != 0) { ushort zone = gr2.ReadUInt16(); sb.AppendLine("Zone " + zone); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_POSITION) != 0) { short x = gr2.ReadInt16(); short y = gr2.ReadInt16(); sb.AppendLine("Position: " + x + ", " + y); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_AURAS) != 0) { ulong mask = gr2.ReadUInt64(); sb.AppendLine("Auras mask " + mask.ToString("X16")); BitArray bitArr = new BitArray(BitConverter.GetBytes(mask)); for (int i = 0; i < bitArr.Length; i++) { if (i >= MAX_AURAS) // we can have only 56 auras break; if (bitArr[i]) { ushort spellid = gr2.ReadUInt16(); sb.AppendLine("Aura " + i.ToString() + ": " + spellid.ToString()); byte unk = gr2.ReadByte(); sb.AppendLine("Aura unk " + i.ToString() + ": " + unk.ToString()); } } } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_PET_GUID) != 0) { ulong petguid = gr2.ReadUInt64(); sb.AppendLine("Pet guid " + petguid.ToString("X16")); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_PET_NAME) != 0) { string name = gr2.ReadStringNull(); sb.AppendLine("Pet name " + name); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_PET_MODEL_ID) != 0) { ushort modelid = gr2.ReadUInt16(); sb.AppendLine("Pet model id " + modelid); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_PET_CUR_HP) != 0) { ushort pethp = gr2.ReadUInt16(); sb.AppendLine("Pet cur. HP " + pethp); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_PET_MAX_HP) != 0) { ushort petmaxhp = gr2.ReadUInt16(); sb.AppendLine("Pet max HP " + petmaxhp); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_PET_POWER_TYPE) != 0) { Powers power = (Powers)gr2.ReadByte(); sb.AppendLine("Pet power type " + power); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_PET_CUR_POWER) != 0) { ushort petpower = gr2.ReadUInt16(); sb.AppendLine("Pet cur. power " + petpower); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_PET_MAX_POWER) != 0) { ushort petmaxpower = gr2.ReadUInt16(); sb.AppendLine("Pet max power " + petmaxpower); } if ((flags & GroupUpdateFlags.GROUP_UPDATE_FLAG_PET_AURAS) != 0) { ulong mask = gr2.ReadUInt64(); sb.AppendLine("Pet auras mask " + mask.ToString("X16")); BitArray bitArr = new BitArray(BitConverter.GetBytes(mask)); for (int i = 0; i < bitArr.Length; i++) { if (i >= MAX_AURAS) // we can have only 56 auras break; if (bitArr[i]) { ushort spellid = gr2.ReadUInt16(); sb.AppendLine("Pet aura " + i.ToString() + ": " + spellid.ToString()); byte unk = gr2.ReadByte(); sb.AppendLine("Pet aura unk " + i.ToString() + ": " + unk.ToString()); } i++; } } if (gr2.BaseStream.Position == gr2.BaseStream.Length) sb.AppendLine("parsed: ok..."); else sb.AppendLine("parsed: error..."); return true; }