protected BoonMap GetBoonMap(ParsedLog log) { // buff extension ids HashSet <long> idsToCheck = new HashSet <long>() { 10236, 51696, 29453 }; List <CastLog> extensionSkills = new List <CastLog>(); foreach (Player p in log.PlayerList) { extensionSkills.AddRange(p.GetCastLogs(log, log.FightData.ToFightSpace(p.FirstAware), log.FightData.ToFightSpace(p.LastAware)).Where(x => idsToCheck.Contains(x.SkillId))); } // BoonMap boonMap = new BoonMap(); // Fill in Boon Map foreach (CombatItem c in log.GetBoonDataByDst(InstID, FirstAware, LastAware)) { long boonId = c.SkillID; if (!boonMap.ContainsKey(boonId)) { if (!Boon.BoonsByIds.ContainsKey(boonId)) { continue; } boonMap.Add(Boon.BoonsByIds[boonId]); } if (c.IsBuffRemove == ParseEnum.BuffRemove.Manual || (c.IsBuffRemove == ParseEnum.BuffRemove.Single && c.IFF == ParseEnum.IFF.Unknown && c.DstInstid == 0) || (c.IsBuffRemove != ParseEnum.BuffRemove.None && c.Value <= 50)) { continue; } long time = log.FightData.ToFightSpace(c.Time); List <BoonLog> loglist = boonMap[boonId]; if (c.IsStateChange == ParseEnum.StateChange.BuffInitial) { ushort src = c.SrcMasterInstid > 0 ? c.SrcMasterInstid : c.SrcInstid; loglist.Add(new BoonApplicationLog(time, src, c.Value)); } else if (c.IsStateChange != ParseEnum.StateChange.BuffInitial) { if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { ushort src = c.SrcMasterInstid > 0 ? c.SrcMasterInstid : c.SrcInstid; if (c.IsOffcycle > 0) { if (src == 0) { src = TryFindSrc(extensionSkills, time, c.Value, log); } loglist.Add(new BoonExtensionLog(time, c.Value, c.OverstackValue - c.Value, src)); } else { loglist.Add(new BoonApplicationLog(time, src, c.Value)); } } else if (time < log.FightData.FightDuration - 50) { ushort src = c.DstMasterInstid > 0 ? c.DstMasterInstid : c.DstInstid; loglist.Add(new BoonRemovalLog(time, src, c.Value, c.IsBuffRemove)); } } } //boonMap.Sort(); foreach (var pair in boonMap) { TrackedBoons.Add(Boon.BoonsByIds[pair.Key]); } return(boonMap); }
protected BoonMap GetBoonMap(ParsedLog log) { // buff extension ids BoonSourceFinder sourceFinder = log.BoonSourceFinder; // BoonMap boonMap = new BoonMap(); // Fill in Boon Map foreach (CombatItem c in log.CombatData.GetBoonDataByDst(InstID, FirstAware, LastAware)) { long boonId = c.SkillID; if (!boonMap.ContainsKey(boonId)) { if (!log.Boons.BoonsByIds.ContainsKey(boonId)) { continue; } boonMap.Add(log.Boons.BoonsByIds[boonId]); } if (c.IsBuffRemove == ParseEnum.BuffRemove.Manual || // don't check manuals (c.IsBuffRemove == ParseEnum.BuffRemove.Single && c.IFF == ParseEnum.IFF.Unknown && c.DstInstid == 0) || // weird single remove (c.IsBuffRemove == ParseEnum.BuffRemove.Single && c.Value <= 50) || (c.IsBuffRemove == ParseEnum.BuffRemove.All && c.Value <= 50 && c.BuffDmg <= 50)) // don't take into account low value buff removals, with server delays it can mess up some stuff { continue; } long time = log.FightData.ToFightSpace(c.Time); List <BoonLog> loglist = boonMap[boonId]; if (c.IsStateChange == ParseEnum.StateChange.BuffInitial) { ushort src = c.SrcMasterInstid > 0 ? c.SrcMasterInstid : c.SrcInstid; loglist.Add(new BoonApplicationLog(time, log.AgentData.GetAgentByInstID(src, c.Time), c.Value)); } else if (c.IsStateChange != ParseEnum.StateChange.BuffInitial) { if (c.IsBuffRemove == ParseEnum.BuffRemove.None) { ushort src = c.SrcMasterInstid > 0 ? c.SrcMasterInstid : c.SrcInstid; if (c.IsOffcycle > 0) { if (src == 0) { src = sourceFinder.TryFindSrc(this, time, c.Value, log, boonId); } loglist.Add(new BoonExtensionLog(time, c.Value, c.OverstackValue - c.Value, log.AgentData.GetAgentByInstID(src, c.Time))); } else { loglist.Add(new BoonApplicationLog(time, log.AgentData.GetAgentByInstID(src, c.Time), c.Value)); } } else if (time < log.FightData.FightDuration - 50) { ushort src = c.DstMasterInstid > 0 ? c.DstMasterInstid : c.DstInstid; loglist.Add(new BoonRemovalLog(time, log.AgentData.GetAgentByInstID(src, c.Time), c.Value, c.IsBuffRemove)); } } } //boonMap.Sort(); foreach (var pair in boonMap) { TrackedBoons.Add(log.Boons.BoonsByIds[pair.Key]); } return(boonMap); }