/// <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; Hashtable keeps = new Hashtable(); s.WriteLine("<KeepComponent>"); 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]; if (pak is StoC_0x20_PlayerPositionAndObjectID_171) { StoC_0x20_PlayerPositionAndObjectID_171 reg20 = (StoC_0x20_PlayerPositionAndObjectID_171)pak; region = reg20.Region; } else if (pak is StoC_0xB7_RegionChange) { StoC_0xB7_RegionChange regB7 = (StoC_0xB7_RegionChange)pak; region = regB7.RegionId; } else if (pak is StoC_0x6C_KeepComponentOverview) { StoC_0x6C_KeepComponentOverview partCreate = (StoC_0x6C_KeepComponentOverview)pak; // if (region != 163) continue; // if (partCreate.KeepId < 256) continue; string key = "KEEPID-" + partCreate.KeepId + "-WALLID-" + partCreate.ComponentId; if (keeps.ContainsKey(key)) { continue; } keeps[key] = partCreate; s.WriteLine(" <KeepComponent>"); s.WriteLine(string.Format(" <KeepComponent_ID>{0}</KeepComponent_ID>", key)); s.WriteLine(string.Format(" <X>{0}</X>", (sbyte)partCreate.X)); s.WriteLine(string.Format(" <Y>{0}</Y>", (sbyte)partCreate.Y)); s.WriteLine(string.Format(" <Heading>{0}</Heading>", partCreate.Heading)); // s.WriteLine(string.Format(" <Height>{0}</Height>", partCreate.Height)); // in DOL height calced depended on keep level s.WriteLine(string.Format(" <Health>{0}</Health>", /*partCreate.Health*/ 100)); s.WriteLine(string.Format(" <Skin>{0}</Skin>", partCreate.Skin)); s.WriteLine(string.Format(" <KeepID>{0}</KeepID>", partCreate.KeepId)); s.WriteLine(string.Format(" <ID>{0}</ID>", partCreate.ComponentId)); s.WriteLine(" </KeepComponent>"); } } } s.WriteLine("</KeepComponent>"); } }
/// <summary> /// Activates a log action. /// </summary> /// <param name="context">The context.</param> /// <param name="selectedPacket">The selected packet.</param> /// <returns><c>true</c> if log data tab should be updated.</returns> public override bool Activate(IExecutionContext context, PacketLocation selectedPacket) { PacketLog log = context.LogManager.GetPacketLog(selectedPacket.LogIndex); int selectedIndex = selectedPacket.PacketIndex; int currentRegion = 0; int currentZone = 0; Hashtable keepComponentsByOids = new Hashtable(); Hashtable keepComponents = new Hashtable(); Hashtable keeps = new Hashtable(); StringBuilder str = new StringBuilder(); for (int i = 0; i < selectedIndex; i++) { Packet pak = log[i]; if (pak is StoC_0x6C_KeepComponentOverview) { StoC_0x6C_KeepComponentOverview keep = (StoC_0x6C_KeepComponentOverview)pak; string key = keep.KeepId + "C:" + keep.ComponentId; Component kc; if (!keepComponents.ContainsKey(key)) { kc = new Component(); kc.KeepId = keep.KeepId; kc.ComponentId = keep.ComponentId; kc.Oid = keep.Uid; kc.Skin = keep.Skin; kc.addX = (sbyte)keep.X; kc.addY = (sbyte)keep.Y; kc.Rotate = keep.Heading; kc.Height = keep.Height; kc.Health = keep.Health; kc.Status = keep.Status; kc.Flag = keep.Flag; kc.Zone = 0; keepComponents[key] = kc; } else { kc = (Component)keepComponents[key]; } keepComponentsByOids[keep.Uid] = kc; } else if (pak is StoC_0x69_KeepOverview) { StoC_0x69_KeepOverview keep = (StoC_0x69_KeepOverview)pak; if (!keeps.ContainsKey(keep.KeepId)) { Keep k = new Keep(); k.KeepId = keep.KeepId; k.Angle = keep.Heading; k.X = keep.KeepX; k.Y = keep.KeepY; keeps[keep.KeepId] = k; } } else if (pak is StoC_0xA1_NpcUpdate) { StoC_0xA1_NpcUpdate obj = (StoC_0xA1_NpcUpdate)pak; if (keepComponentsByOids.ContainsKey(obj.NpcOid)) { Component kc = (Component)keepComponentsByOids[obj.NpcOid]; string key = kc.KeepId + "C:" + kc.ComponentId; kc.Zone = obj.CurrentZoneId; kc.Heading = (ushort)(obj.Heading & 0xFFF); kc.X = obj.CurrentZoneX; kc.Y = obj.CurrentZoneY; kc.Z = obj.CurrentZoneZ; keepComponentsByOids[obj.NpcOid] = kc; keepComponents[key] = kc; } } 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; keepComponentsByOids.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; keepComponentsByOids.Clear(); } } } foreach (Component kc in keepComponents.Values) { if (kc.Zone != 0) { Keep k = (Keep)keeps[kc.KeepId]; str.AppendFormat("keepId:{0,-4} keepX:{1,-6} keepY:{2,-6} angle:{3,-3} ", k.KeepId, k.X, k.Y, k.Angle); str.AppendFormat("componentId:{0,-2} oid:{1,-5} Skin:{2,-2} X:{3,-4} Y:{4,-4} Rotate:{5} ", kc.ComponentId, kc.Oid, kc.Skin, kc.addX, kc.addY, kc.Rotate); str.AppendFormat("Heading:{0,-4} Zone:{1,-3} @X:{2,-5} @Y:{3,-5} Z:{4}\n", kc.Heading, kc.Zone, kc.X, kc.Y, kc.Z); } } InfoWindowForm infoWindow = new InfoWindowForm(); infoWindow.Text = "Show keep components info (right click to close)"; infoWindow.Width = 650; infoWindow.InfoRichTextBox.Text = str.ToString(); infoWindow.StartWindowThread(); return(false); }
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) { using (StreamWriter s = new StreamWriter(stream)) { Hashtable keeps = new Hashtable(); int region = 0; s.WriteLine("<Keep>"); 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]; if (pak is StoC_0x20_PlayerPositionAndObjectID_171) { StoC_0x20_PlayerPositionAndObjectID_171 reg20 = (StoC_0x20_PlayerPositionAndObjectID_171)pak; region = reg20.Region; } else if (pak is StoC_0xB7_RegionChange) { StoC_0xB7_RegionChange regB7 = (StoC_0xB7_RegionChange)pak; region = regB7.RegionId; } else if (pak is StoC_0x69_KeepOverview) { StoC_0x69_KeepOverview keepCreate = (StoC_0x69_KeepOverview)pak; if (keeps.ContainsKey(keepCreate.KeepId)) { continue; } keeps[keepCreate.KeepId] = keepCreate; string keepName; if (region == 163) { if (keepCreate.KeepId < 256) { keepName = "KEEP_"; // continue; } else { keepName = "TOWER_"; } } else { // continue; if (keepCreate.KeepId < 1000) { keepName = "KEEP_"; } else { keepName = "TOWER_"; } } keepName += keepCreate.KeepId.ToString(); s.WriteLine(" <Keep>"); s.WriteLine(string.Format(" <Keep_ID>{0}</Keep_ID>", keepCreate.KeepId)); s.WriteLine(string.Format(" <KeepID>{0}</KeepID>", keepCreate.KeepId)); s.WriteLine(string.Format(" <Name>{0}</Name>", keepName)); s.WriteLine(string.Format(" <Region>{0}</Region>", region)); s.WriteLine(string.Format(" <X>{0}</X>", keepCreate.KeepX)); s.WriteLine(string.Format(" <Y>{0}</Y>", keepCreate.KeepY)); s.WriteLine(" <Z>0</Z>"); s.WriteLine(string.Format(" <Heading>{0}</Heading>", keepCreate.Heading)); s.WriteLine(string.Format(" <Realm>{0}</Realm>", keepCreate.Realm)); s.WriteLine(string.Format(" <Level>{0}</Level>", keepCreate.Level)); s.WriteLine(" <ClaimedGuildName />"); s.WriteLine(" <AlbionDifficultyLevel>0</AlbionDifficultyLevel>"); s.WriteLine(" <MidgardDifficultyLevel>0</MidgardDifficultyLevel>"); s.WriteLine(" <HiberniaDifficultyLevel>0</HiberniaDifficultyLevel>"); s.WriteLine(" <OriginalRealm>0</OriginalRealm>"); s.WriteLine(" <KeepType>0</KeepType>"); s.WriteLine(" <BaseLevel>0</BaseLevel>"); s.WriteLine(" </Keep>"); } } } s.WriteLine("</Keep>"); } }
/// <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>"); } }