/// <summary> /// Writes the log. /// </summary> /// <param name="context">The context.</param> /// <param name="stream">The stream.</param> /// <param name="callback">The callback for UI updates.</param> public void WriteLog(IExecutionContext context, Stream stream, ProgressCallback callback) { using (StreamWriter s = new StreamWriter(stream)) { int region = 0; int ZoneXOffset = 0; int ZoneYOffset = 0; Hashtable m_obj = new Hashtable(); foreach (PacketLog log in context.LogManager.Logs) { for (int i = 0; i < log.Count; i++) { if (callback != null && (i & 0xFFF) == 0) // update progress every 4096th packet { callback(i, log.Count - 1); } StoC_0x20_PlayerPositionAndObjectID_171 pak_reg20 = log[i] as StoC_0x20_PlayerPositionAndObjectID_171; if (pak_reg20 != null) { region = pak_reg20.Region; ZoneXOffset = pak_reg20.ZoneXOffset; ZoneYOffset = pak_reg20.ZoneYOffset; // m_obj.Clear(); m_keeps.Clear(); continue; } StoC_0xB7_RegionChange pak_regB7 = log[i] as StoC_0xB7_RegionChange; if (pak_regB7 != null) { region = pak_regB7.RegionId; ZoneXOffset = 0; ZoneYOffset = 0; // m_obj.Clear(); m_keeps.Clear(); continue; } if (region != 238) { continue; } StoC_0x69_KeepOverview pak_keep = log[i] as StoC_0x69_KeepOverview; if (pak_keep != null) { Keep keep = new Keep(); keep.KeepID = pak_keep.KeepId; keep.X = (uint)(pak_keep.KeepX + ZoneXOffset * 0x2000); keep.Y = (uint)(pak_keep.KeepY + ZoneYOffset * 0x2000); keep.Heading = pak_keep.Heading; keep.Realm = pak_keep.Realm; keep.Level = pak_keep.Level; m_keeps[keep.KeepID] = keep; continue; } KeepGuard guard = new KeepGuard(); StoC_0xD9_ItemDoorCreate door = log[i] as StoC_0xD9_ItemDoorCreate; string key = ""; if (door != null) { if (door.ExtraBytes == 4) { guard.KeepGuard_ID = door.InternalId.ToString(); guard.Name = door.Name; guard.EquipmentID = ""; guard.KeepID = 0; guard.BaseLevel = 0; guard.X = (uint)(door.X + ZoneXOffset * 0x2000); guard.Y = (uint)(door.Y + ZoneYOffset * 0x2000); guard.Z = door.Z; guard.Heading = door.Heading; guard.Realm = (door.Flags & 0x30) >> 4; guard.Model = door.Model; guard.ClassType = "DOL.GS.GameKeepDoor"; key = "REGION:" + region.ToString() + "-DOOR:" + guard.KeepGuard_ID; } else { continue; } } else { continue; } if (key == "") { continue; } if (m_obj.ContainsKey(key)) { continue; } Keep my_keep = getKeepCloseToSpot(guard.X, guard.Y, 2000); if (my_keep != null) { guard.KeepID = my_keep.KeepID; guard.BaseLevel = my_keep.Level; } m_obj[key] = guard; } } s.WriteLine("<KeepGuard>"); foreach (KeepGuard guard in m_obj.Values) { s.WriteLine(" <KeepGuard>"); if (guard.KeepGuard_ID == "") { s.WriteLine(" <KeepGuard_ID />"); } else { s.WriteLine(string.Format(" <KeepGuard_ID>{0}</KeepGuard_ID>", guard.KeepGuard_ID)); } if (guard.Name == "") { s.WriteLine(" <Name />"); } else { s.WriteLine(string.Format(" <Name>{0}</Name>", guard.Name)); } if (guard.EquipmentID == "") { s.WriteLine(" <EquipmentID />"); } else { s.WriteLine(string.Format(" <EquipmentID>{0}</EquipmentID>", guard.EquipmentID)); } s.WriteLine(string.Format(" <KeepID>{0}</KeepID>", guard.KeepID)); s.WriteLine(string.Format(" <BaseLevel>{0}</BaseLevel>", guard.BaseLevel)); s.WriteLine(string.Format(" <X>{0}</X>", guard.X)); s.WriteLine(string.Format(" <Y>{0}</Y>", guard.Y)); s.WriteLine(string.Format(" <Z>{0}</Z>", guard.Z)); s.WriteLine(string.Format(" <Heading>{0}</Heading>", guard.Heading)); s.WriteLine(string.Format(" <Realm>{0}</Realm>", guard.Realm)); s.WriteLine(string.Format(" <Model>{0}</Model>", guard.Model)); if (guard.ClassType == "") { s.WriteLine(" <ClassType />"); } else { s.WriteLine(string.Format(" <ClassType>{0}</ClassType>", guard.ClassType)); } s.WriteLine(" </KeepGuard>"); } s.WriteLine("</KeepGuard>"); } }
public static SortedList MakeOidList(int selectedIndex, PacketLog log, out int currentRegion, out int currentZone) { SortedList oidInfo = new SortedList(); currentRegion = -1; currentZone = -1; ushort playerOid = 0; string CharName = "UNKNOWN"; for (int i = 0; i < selectedIndex; ++i) { Packet pak = log[i]; if (pak is StoC_0xD4_PlayerCreate) { StoC_0xD4_PlayerCreate player = (StoC_0xD4_PlayerCreate)pak; oidInfo[player.Oid] = new LivingInfo(pak.Time, "PLR", player.Name, player.Level, player.GuildName); } else if (pak is StoC_0x4B_PlayerCreate_172) { StoC_0x4B_PlayerCreate_172 player = (StoC_0x4B_PlayerCreate_172)pak; oidInfo[player.Oid] = new LivingInfo(pak.Time, "PLR", player.Name, player.Level, player.GuildName); if (currentZone == -1) { currentZone = player.ZoneId; } } else if (pak is StoC_0x12_CreateMovingObject) { StoC_0x12_CreateMovingObject obj = (StoC_0x12_CreateMovingObject)pak; oidInfo[obj.ObjectOid] = new ObjectInfo(pak.Time, "MOVE", obj.Name, 0); } else if (pak is StoC_0x6C_KeepComponentOverview) { StoC_0x6C_KeepComponentOverview keep = (StoC_0x6C_KeepComponentOverview)pak; oidInfo[keep.Uid] = new ObjectInfo(pak.Time, "Keep", string.Format("keepId:0x{0:X4} componentId:{1}", keep.KeepId, keep.ComponentId), 0); } else if (pak is StoC_0xD1_HouseCreate) { StoC_0xD1_HouseCreate house = (StoC_0xD1_HouseCreate)pak; oidInfo[house.HouseId] = new ObjectInfo(pak.Time, "HOUS", house.Name, 0); } else if (pak is StoC_0xDA_NpcCreate) { StoC_0xDA_NpcCreate npc = (StoC_0xDA_NpcCreate)pak; oidInfo[npc.Oid] = new LivingInfo(pak.Time, "NPC", npc.Name, npc.Level, npc.GuildName); } else if (pak is CtoS_0xA9_PlayerPosition) { CtoS_0xA9_PlayerPosition plr = (CtoS_0xA9_PlayerPosition)pak; if (currentZone == -1) { currentZone = plr.CurrentZoneId; } } else if (pak is StoC_0xD9_ItemDoorCreate) { StoC_0xD9_ItemDoorCreate item = (StoC_0xD9_ItemDoorCreate)pak; string type = "ITEM"; if (item.ExtraBytes > 0) { type = "DOOR"; } oidInfo[item.Oid] = new ObjectInfo(pak.Time, type, item.Name, 0); } else if (pak is StoC_0xB7_RegionChange) { StoC_0xB7_RegionChange region = (StoC_0xB7_RegionChange)pak; // if (region.RegionId != currentRegion) // { currentRegion = region.RegionId; currentZone = region.ZoneId; oidInfo.Clear(); // } } else if (pak is StoC_0x20_PlayerPositionAndObjectID_171) { StoC_0x20_PlayerPositionAndObjectID_171 region = (StoC_0x20_PlayerPositionAndObjectID_171)pak; // if (region.Region!= currentRegion) // { currentRegion = region.Region; oidInfo.Clear(); // } playerOid = region.PlayerOid; oidInfo[region.PlayerOid] = new LivingInfo(pak.Time, "YOU", CharName, 0, ""); } else if (pak is StoC_0x16_VariousUpdate) { if (playerOid != 0) { StoC_0x16_VariousUpdate stat = (StoC_0x16_VariousUpdate)pak; if (stat.SubCode == 3) { StoC_0x16_VariousUpdate.PlayerUpdate subData = (StoC_0x16_VariousUpdate.PlayerUpdate)stat.SubData; if (oidInfo[playerOid] != null) { LivingInfo plr = (LivingInfo)oidInfo[playerOid]; plr.level = subData.playerLevel; plr.guildName = subData.guildName; oidInfo[playerOid] = plr; } } } } else if (pak is CtoS_0x10_CharacterSelectRequest) { CtoS_0x10_CharacterSelectRequest login = (CtoS_0x10_CharacterSelectRequest)pak; CharName = login.CharName; } } return(oidInfo); }
/// <summary> /// Writes the log. /// </summary> /// <param name="context">The context.</param> /// <param name="stream">The stream.</param> /// <param name="callback">The callback for UI updates.</param> public void WriteLog(IExecutionContext context, Stream stream, ProgressCallback callback) { SortedList oidInfo = new SortedList(); IList CombatWaitMessage = new ArrayList(); Hashtable styleIcons = new Hashtable(); Hashtable plrInfo = new Hashtable(); weapons = new StoC_0x02_InventoryUpdate.Item[4]; PlayerInfo playerInfo = null; // = new PlayerInfo(); int playerOid = -1; string nameKey = ""; string statKey = ""; string plrName = ""; string plrClass = ""; int plrLevel = 0; int countBC = 0; using (StreamWriter s = new StreamWriter(stream)) { foreach (PacketLog log in context.LogManager.Logs) { for (int i = 0; i < log.Count; i++) { if (callback != null && (i & 0xFFF) == 0) // update progress every 4096th packet { callback(i, log.Count - 1); } Packet pak = log[i]; // Enter region (get new self OID) if (pak is StoC_0x20_PlayerPositionAndObjectID) { StoC_0x20_PlayerPositionAndObjectID plr = (StoC_0x20_PlayerPositionAndObjectID)pak; playerOid = plr.PlayerOid; oidInfo.Clear(); oidInfo[plr.PlayerOid] = new ObjectInfo(eObjectType.player, "You", 0); s.WriteLine("{0, -16} playerOid:0x{1:X4}", pak.Time.ToString(), playerOid); } // Fill objects OID else if (pak is StoC_0xD4_PlayerCreate) { StoC_0xD4_PlayerCreate player = (StoC_0xD4_PlayerCreate)pak; oidInfo[player.Oid] = new ObjectInfo(eObjectType.player, player.Name, player.Level); } else if (pak is StoC_0x4B_PlayerCreate_172) { StoC_0x4B_PlayerCreate_172 player = (StoC_0x4B_PlayerCreate_172)pak; oidInfo[player.Oid] = new ObjectInfo(eObjectType.player, player.Name, player.Level); } else if (pak is StoC_0x12_CreateMovingObject) { StoC_0x12_CreateMovingObject obj = (StoC_0x12_CreateMovingObject)pak; oidInfo[obj.ObjectOid] = new ObjectInfo(eObjectType.movingObject, obj.Name, 0); } else if (pak is StoC_0x6C_KeepComponentOverview) { StoC_0x6C_KeepComponentOverview keep = (StoC_0x6C_KeepComponentOverview)pak; oidInfo[keep.Uid] = new ObjectInfo(eObjectType.keep, string.Format("keepId:0x{0:X4} componentId:{1}", keep.KeepId, keep.ComponentId), 0); } else if (pak is StoC_0xDA_NpcCreate) { StoC_0xDA_NpcCreate npc = (StoC_0xDA_NpcCreate)pak; oidInfo[npc.Oid] = new ObjectInfo(eObjectType.npc, npc.Name, npc.Level); } else if (pak is StoC_0xD9_ItemDoorCreate) { StoC_0xD9_ItemDoorCreate item = (StoC_0xD9_ItemDoorCreate)pak; eObjectType type = eObjectType.staticObject; if (item.ExtraBytes > 0) { type = eObjectType.door; } oidInfo[item.Oid] = new ObjectInfo(type, item.Name, 0); } // Fill current weapons else if (pak is StoC_0x02_InventoryUpdate) { StoC_0x02_InventoryUpdate invPack = (StoC_0x02_InventoryUpdate)pak; if (invPack.PreAction == 1 || invPack.PreAction == 0) { VisibleSlots = invPack.VisibleSlots; for (int j = 0; j < invPack.SlotsCount; j++) { StoC_0x02_InventoryUpdate.Item item = (StoC_0x02_InventoryUpdate.Item)invPack.Items[j]; switch (item.slot) { case 10: weapons[0] = item; break; case 11: weapons[1] = item; break; case 12: weapons[2] = item; break; case 13: weapons[3] = item; break; default: break; } } } } // Fill character stats else if (pak is StoC_0x16_VariousUpdate) { // name, level, class StoC_0x16_VariousUpdate stat = (StoC_0x16_VariousUpdate)pak; if (stat.SubCode == 3) { StoC_0x16_VariousUpdate.PlayerUpdate subData = (StoC_0x16_VariousUpdate.PlayerUpdate)stat.SubData; nameKey = "N:" + subData.playerName + "L:" + subData.playerLevel; statKey = ""; plrName = subData.playerName; plrLevel = subData.playerLevel; plrClass = subData.className; s.WriteLine("{0, -16} 0x16:3 nameKey:{1} plrName:{2} {3} {4}", pak.Time.ToString(), nameKey, plrName, plrLevel, plrClass); } // mainhand spec, mainhand DPS else if (stat.SubCode == 5) { StoC_0x16_VariousUpdate.PlayerStateUpdate subData = (StoC_0x16_VariousUpdate.PlayerStateUpdate)stat.SubData; string key = string.Format("WD:{0}.{1}WS:{2}", subData.weaponDamageHigh, subData.weaponDamageLow, (subData.weaponSkillHigh << 8) + subData.weaponSkillLow); if (nameKey != "") { if (plrInfo.ContainsKey(nameKey + key)) { playerInfo = (PlayerInfo)plrInfo[nameKey + key]; } else { playerInfo = new PlayerInfo(); playerInfo.name = plrName; playerInfo.level = plrLevel; playerInfo.className = plrClass; playerInfo.weaponDamage = string.Format("{0,2}.{1,-3}", subData.weaponDamageHigh, subData.weaponDamageLow); playerInfo.weaponSkill = (subData.weaponSkillHigh << 8) + subData.weaponSkillLow; plrInfo.Add(nameKey + key, playerInfo); } plrInfo[nameKey + key] = playerInfo; } statKey = key; s.WriteLine("{0, -16} 0x16:5 S:{1} {2} {3} {4} {5}", pak.Time.ToString(), statKey, playerInfo.name, playerInfo.level, playerInfo.weaponDamage, playerInfo.weaponSkill); } // Fill styles if (stat.SubCode == 1) { StoC_0x16_VariousUpdate.SkillsUpdate subData = (StoC_0x16_VariousUpdate.SkillsUpdate)stat.SubData; styleIcons.Clear(); if (log.Version < 186) { styleIcons.Add((ushort)0x01F4, "Bow prepare"); styleIcons.Add((ushort)0x01F5, "Lefthand hit"); styleIcons.Add((ushort)0x01F6, "Bothhands hit"); styleIcons.Add((ushort)0x01F7, "Bow shoot"); // styleIcons.Add((ushort)0x01F9, "Volley aim ?"); // styleIcons.Add((ushort)0x01FA, "Volley ready ?"); // styleIcons.Add((ushort)0x01FB, "Volley shoot ?"); } else { styleIcons.Add((ushort)0x3E80, "Bow prepare"); styleIcons.Add((ushort)0x3E81, "Lefthand hit"); styleIcons.Add((ushort)0x3E82, "Bothhands hit"); styleIcons.Add((ushort)0x3E83, "Bow shoot"); // styleIcons.Add((ushort)0x3E85, "Volley aim ?"); // styleIcons.Add((ushort)0x3E86, "Volley ready ?"); // styleIcons.Add((ushort)0x3E87, "Volley shoot ?"); } foreach (StoC_0x16_VariousUpdate.Skill skill in subData.data) { if (skill.page == StoC_0x16_VariousUpdate.eSkillPage.Styles) { styleIcons[skill.icon] = skill.name; // s.WriteLine("{0, -16} 0x16:1 icon:0x{1:X4} name:{2}", pak.Time.ToString(), skill.icon, styleIcons[skill.icon]); } } /* foreach (DictionaryEntry entry in styleIcons) * { * ushort icon = (ushort)entry.Key; * s.WriteLine("{0, -16} 0x16:1 icon:0x{1:X4} name:{2}", pak.Time.ToString(), icon, entry.Value); * }*/ } } // Combat animation else if (pak is StoC_0xBC_CombatAnimation && (playerInfo != null)) { StoC_0xBC_CombatAnimation combat = (StoC_0xBC_CombatAnimation)pak; CombatWaitMessage.Clear(); ObjectInfo targetObj = oidInfo[combat.DefenderOid] as ObjectInfo; string styleName = (combat.StyleId == 0 /* || (combat.Result & 0x7F) != 0x0B)*/) ? "" : (styleIcons[combat.StyleId] == null ? "not found " + combat.StyleId.ToString() : (styleIcons[combat.StyleId]).ToString()); string targetName = targetObj == null ? "" : " target:" + targetObj.name + " (" + targetObj.type + ")"; if (combat.Stance == 0 && combat.AttackerOid == playerOid /* && combat.DefenderOid != 0*/) { switch (combat.Result & 0x7F) { case 0: CombatWaitMessage.Add(new WaitMessage(0x11, "You miss!")); CombatWaitMessage.Add(new WaitMessage(0x11, "You were strafing in combat and miss!")); break; case 1: if (targetObj != null) { CombatWaitMessage.Add(new WaitMessage(0x11, targetObj.GetFirstFullName + " parries your attack!")); } break; case 2: // if (targetObj != null)//TODO // CombatWaitMessage.Add(new WaitMessage(0x11, targetObj.GetFirstFullName + " The Midgardian Assassin attacks you and you block the blow!")); break; case 3: if (targetObj != null) { CombatWaitMessage.Add(new WaitMessage(0x11, targetObj.GetFirstFullName + " evades your attack!")); } break; case 4: CombatWaitMessage.Add(new WaitMessage(0x11, "You fumble the attack and take time to recover!")); break; case 0xA: if (targetObj != null) { CombatWaitMessage.Add( new WaitMessage(0x11, "You attack " + targetObj.GetFullName + " with your % and hit for % damage!")); } break; case 0xB: CombatWaitMessage.Add(new WaitMessage(0x11, "You perform your " + styleName + " perfectly. %")); if (targetObj != null) { CombatWaitMessage.Add( new WaitMessage(0x11, "You attack " + targetObj.GetFullName + " with your % and hit for % damage!")); } break; case 0x14: if (targetObj != null) { CombatWaitMessage.Add(new WaitMessage(0x11, "You hit " + targetObj.GetFullName + " for % damage!")); } break; default: break; } } if (combat.AttackerOid == playerOid) { s.WriteLine("{0, -16} 0xBC attackerOid:0x{1:X4}(You) defenderOid:0x{2:X4} style:0x{4:X4} result:0x{3:X2}{5}{6}", pak.Time.ToString(), combat.AttackerOid, combat.DefenderOid, combat.Result, combat.StyleId, styleName == "" ? "" : " styleName:" + styleName, targetName); foreach (WaitMessage msg in CombatWaitMessage) { s.WriteLine(" WAITING 0xAF 0x{0:X2} {1}", msg.msgType, msg.message); } countBC++; } } // Messages else if (pak is StoC_0xAF_Message) { StoC_0xAF_Message msg = (StoC_0xAF_Message)pak; switch (msg.Type) { // case 0x10: // Your cast combat case 0x11: // Your Melee combat // case 0x1B: // resist // case 0x1D: // X hits you // case 0x1E: // X miss you s.WriteLine("{0, -16} 0xAF 0x{1:X2} {2} ", pak.Time.ToString(), msg.Type, msg.Text); break; default: break; } } } } if (nameKey != "" && statKey != "") { plrInfo[nameKey + statKey] = playerInfo; } } }