internal CombatData(List <CombatItem> allCombatItems, FightData fightData, AgentData agentData, SkillData skillData, IReadOnlyList <Player> players, ParserController operation, IReadOnlyDictionary <uint, AbstractExtensionHandler> extensions, int evtcVersion) { var combatEvents = allCombatItems.OrderBy(x => x.Time).ToList(); _skillIds = new HashSet <long>(); var castCombatEvents = new Dictionary <ulong, List <CombatItem> >(); var buffEvents = new List <AbstractBuffEvent>(); var wepSwaps = new List <WeaponSwapEvent>(); var brkDamageData = new List <AbstractBreakbarDamageEvent>(); var damageData = new List <AbstractHealthDamageEvent>(); operation.UpdateProgressWithCancellationCheck("Creating EI Combat Data"); foreach (CombatItem combatItem in combatEvents) { _skillIds.Add(combatItem.SkillID); if (combatItem.IsStateChange != ArcDPSEnums.StateChange.None) { if (combatItem.IsExtension) { if (extensions.TryGetValue(combatItem.Pad, out AbstractExtensionHandler handler)) { handler.InsertEIExtensionEvent(combatItem, agentData, skillData); } } else { CombatEventFactory.AddStateChangeEvent(combatItem, agentData, skillData, _metaDataEvents, _statusEvents, _rewardEvents, wepSwaps, buffEvents, evtcVersion); } } else if (combatItem.IsActivation != ArcDPSEnums.Activation.None) { if (castCombatEvents.TryGetValue(combatItem.SrcAgent, out List <CombatItem> list)) { list.Add(combatItem); } else { castCombatEvents[combatItem.SrcAgent] = new List <CombatItem>() { combatItem }; } } else if (combatItem.IsBuffRemove != ArcDPSEnums.BuffRemove.None) { CombatEventFactory.AddBuffRemoveEvent(combatItem, buffEvents, agentData, skillData); } else { if (combatItem.IsBuff != 0 && combatItem.BuffDmg == 0 && combatItem.Value > 0) { CombatEventFactory.AddBuffApplyEvent(combatItem, buffEvents, agentData, skillData); } else if (combatItem.IsBuff == 0) { CombatEventFactory.AddDirectDamageEvent(combatItem, damageData, brkDamageData, agentData, skillData); } else if (combatItem.IsBuff != 0 && combatItem.Value == 0) { CombatEventFactory.AddIndirectDamageEvent(combatItem, damageData, brkDamageData, agentData, skillData); } } } HasStackIDs = false;// arcdpsVersion > 20210529 && buffEvents.Any(x => x is BuffStackActiveEvent || x is BuffStackResetEvent) && (fightData.Logic.Mode == EncounterLogic.FightLogic.ParseMode.Instanced10 || fightData.Logic.Mode == EncounterLogic.FightLogic.ParseMode.Instanced5 || fightData.Logic.Mode == EncounterLogic.FightLogic.ParseMode.Benchmark); HasMovementData = _statusEvents.MovementEvents.Count > 1; HasBreakbarDamageData = brkDamageData.Any(); // operation.UpdateProgressWithCancellationCheck("Combining SkillInfo with SkillData"); skillData.CombineWithSkillInfo(_metaDataEvents.SkillInfoEvents); // operation.UpdateProgressWithCancellationCheck("Creating Cast Events"); List <AnimatedCastEvent> animatedCastData = CombatEventFactory.CreateCastEvents(castCombatEvents, agentData, skillData, fightData); _weaponSwapData = wepSwaps.GroupBy(x => x.Caster).ToDictionary(x => x.Key, x => x.ToList()); _animatedCastData = animatedCastData.GroupBy(x => x.Caster).ToDictionary(x => x.Key, x => x.ToList()); _instantCastData = new Dictionary <AgentItem, List <InstantCastEvent> >(); _animatedCastDataById = animatedCastData.GroupBy(x => x.SkillId).ToDictionary(x => x.Key, x => x.ToList()); // operation.UpdateProgressWithCancellationCheck("Creating Buff Events"); _buffDataByDst = buffEvents.GroupBy(x => x.To).ToDictionary(x => x.Key, x => x.ToList()); _buffData = buffEvents.GroupBy(x => x.BuffID).ToDictionary(x => x.Key, x => x.ToList()); // damage events operation.UpdateProgressWithCancellationCheck("Creating Damage Events"); _damageData = damageData.GroupBy(x => x.From).ToDictionary(x => x.Key, x => x.ToList()); _damageTakenData = damageData.GroupBy(x => x.To).ToDictionary(x => x.Key, x => x.ToList()); _damageDataById = damageData.GroupBy(x => x.SkillId).ToDictionary(x => x.Key, x => x.ToList()); _breakbarDamageData = brkDamageData.GroupBy(x => x.From).ToDictionary(x => x.Key, x => x.ToList()); _breakbarDamageDataById = brkDamageData.GroupBy(x => x.SkillId).ToDictionary(x => x.Key, x => x.ToList()); _breakbarDamageTakenData = brkDamageData.GroupBy(x => x.To).ToDictionary(x => x.Key, x => x.ToList()); _buffRemoveAllData = _buffData.ToDictionary(x => x.Key, x => x.Value.OfType <BuffRemoveAllEvent>().ToList()); // /*healing_data = allCombatItems.Where(x => x.getDstInstid() != 0 && x.isStateChange() == ParseEnum.StateChange.Normal && x.getIFF() == ParseEnum.IFF.Friend && x.isBuffremove() == ParseEnum.BuffRemove.None && * ((x.isBuff() == 1 && x.getBuffDmg() > 0 && x.getValue() == 0) || * (x.isBuff() == 0 && x.getValue() > 0))).ToList(); * * healing_received_data = allCombatItems.Where(x => x.isStateChange() == ParseEnum.StateChange.Normal && x.getIFF() == ParseEnum.IFF.Friend && x.isBuffremove() == ParseEnum.BuffRemove.None && * ((x.isBuff() == 1 && x.getBuffDmg() > 0 && x.getValue() == 0) || * (x.isBuff() == 0 && x.getValue() >= 0))).ToList();*/ foreach (AbstractExtensionHandler handler in extensions.Values) { handler.AttachToCombatData(this, operation, GetBuildEvent().Build); } EIExtraEventProcess(players, skillData, agentData, fightData, operation, evtcVersion); }
private void EIBuffParse(IReadOnlyList <Player> players, SkillData skillData, FightData fightData) { var toAdd = new List <AbstractBuffEvent>(); foreach (Player p in players) { if (p.Spec == ParserHelper.Spec.Weaver) { toAdd.AddRange(WeaverHelper.TransformWeaverAttunements(GetBuffData(p.AgentItem), _buffData, p.AgentItem, skillData)); } if (p.Spec == ParserHelper.Spec.Virtuoso) { toAdd.AddRange(VirtuosoHelper.TransformVirtuosoBladeStorage(GetBuffData(p.AgentItem), p.AgentItem, skillData)); } if (p.BaseSpec == ParserHelper.Spec.Elementalist && p.Spec != ParserHelper.Spec.Weaver) { ElementalistHelper.RemoveDualBuffs(GetBuffData(p.AgentItem), _buffData, skillData); } } toAdd.AddRange(fightData.Logic.SpecialBuffEventProcess(this, skillData)); var buffIDsToSort = new HashSet <long>(); var buffAgentsToSort = new HashSet <AgentItem>(); foreach (AbstractBuffEvent bf in toAdd) { if (_buffDataByDst.TryGetValue(bf.To, out List <AbstractBuffEvent> buffByDstList)) { buffByDstList.Add(bf); } else { _buffDataByDst[bf.To] = new List <AbstractBuffEvent>() { bf }; } buffAgentsToSort.Add(bf.To); if (_buffData.TryGetValue(bf.BuffID, out List <AbstractBuffEvent> buffByIDList)) { buffByIDList.Add(bf); } else { _buffData[bf.BuffID] = new List <AbstractBuffEvent>() { bf }; } buffIDsToSort.Add(bf.BuffID); } foreach (long buffID in buffIDsToSort) { _buffData[buffID] = _buffData[buffID].OrderBy(x => x.Time).ToList(); } foreach (AgentItem a in buffAgentsToSort) { _buffDataByDst[a] = _buffDataByDst[a].OrderBy(x => x.Time).ToList(); } if (toAdd.Any()) { _buffRemoveAllData = _buffData.ToDictionary(x => x.Key, x => x.Value.OfType <BuffRemoveAllEvent>().ToList()); } }
private void EICastParse(IReadOnlyList <Player> players, SkillData skillData, FightData fightData, AgentData agentData) { List <AbstractCastEvent> toAdd = fightData.Logic.SpecialCastEventProcess(this, skillData); toAdd.AddRange(ProfHelper.ComputeInstantCastEvents(players, this, skillData, agentData, fightData.Logic)); foreach (Player p in players) { switch (p.Spec) { case ParserHelper.Spec.Willbender: toAdd.AddRange(WillbenderHelper.ComputeFlowingResolveCastEvents(p, this, skillData, agentData)); break; default: break; } } // var castIDsToSort = new HashSet <long>(); var castAgentsToSort = new HashSet <AgentItem>(); var wepSwapAgentsToSort = new HashSet <AgentItem>(); var instantAgentsToSort = new HashSet <AgentItem>(); foreach (AbstractCastEvent cast in toAdd) { if (cast is AnimatedCastEvent ace) { if (_animatedCastData.TryGetValue(ace.Caster, out List <AnimatedCastEvent> animatedCastList)) { animatedCastList.Add(ace); } else { _animatedCastData[ace.Caster] = new List <AnimatedCastEvent>() { ace }; } castAgentsToSort.Add(ace.Caster); if (_animatedCastDataById.TryGetValue(ace.SkillId, out List <AnimatedCastEvent> animatedCastByIDList)) { animatedCastByIDList.Add(ace); } else { _animatedCastDataById[cast.SkillId] = new List <AnimatedCastEvent>() { ace }; } castIDsToSort.Add(cast.SkillId); } if (cast is WeaponSwapEvent wse) { if (_weaponSwapData.TryGetValue(wse.Caster, out List <WeaponSwapEvent> weaponSwapList)) { weaponSwapList.Add(wse); } else { _weaponSwapData[wse.Caster] = new List <WeaponSwapEvent>() { wse }; } wepSwapAgentsToSort.Add(wse.Caster); } if (cast is InstantCastEvent ice) { if (_instantCastData.TryGetValue(ice.Caster, out List <InstantCastEvent> instantCastList)) { instantCastList.Add(ice); } else { _instantCastData[ice.Caster] = new List <InstantCastEvent>() { ice }; } instantAgentsToSort.Add(ice.Caster); } } foreach (long castID in castIDsToSort) { _animatedCastDataById[castID] = _animatedCastDataById[castID].OrderBy(x => x.Time).ToList(); } foreach (AgentItem a in castAgentsToSort) { _animatedCastData[a] = _animatedCastData[a].OrderBy(x => x.Time).ToList(); } foreach (AgentItem a in wepSwapAgentsToSort) { _weaponSwapData[a] = _weaponSwapData[a].OrderBy(x => x.Time).ToList(); } foreach (AgentItem a in instantAgentsToSort) { _instantCastData[a] = _instantCastData[a].OrderBy(x => x.Time).ToList(); } }
private void EIExtraEventProcess(IReadOnlyList <Player> players, SkillData skillData, AgentData agentData, FightData fightData, ParserController operation, int arcdpsVersion) { operation.UpdateProgressWithCancellationCheck("Creating Custom Buff Events"); EIBuffParse(players, skillData, fightData); operation.UpdateProgressWithCancellationCheck("Creating Custom Damage Events"); EIDamageParse(skillData, fightData); operation.UpdateProgressWithCancellationCheck("Creating Custom Cast Events"); EICastParse(players, skillData, fightData, agentData); operation.UpdateProgressWithCancellationCheck("Creating Custom Status Events"); EIMetaAndStatusParse(fightData, arcdpsVersion); // master attachements operation.UpdateProgressWithCancellationCheck("Attaching Banners to Warriors"); WarriorHelper.AttachMasterToWarriorBanners(players, this); operation.UpdateProgressWithCancellationCheck("Attaching Turrets to Engineers"); EngineerHelper.AttachMasterToEngineerTurrets(players, this); operation.UpdateProgressWithCancellationCheck("Attaching Ranger Gadgets to Rangers"); RangerHelper.AttachMasterToRangerGadgets(players, this); operation.UpdateProgressWithCancellationCheck("Attaching Racial Gadgets to Players"); ProfHelper.AttachMasterToRacialGadgets(players, this); }
private void EIDamageParse(SkillData skillData, FightData fightData) { var toAdd = new List <AbstractHealthDamageEvent>(); toAdd.AddRange(fightData.Logic.SpecialDamageEventProcess(this, skillData)); var idsToSort = new HashSet <long>(); var dstToSort = new HashSet <AgentItem>(); var srcToSort = new HashSet <AgentItem>(); foreach (AbstractHealthDamageEvent de in toAdd) { if (_damageTakenData.TryGetValue(de.To, out List <AbstractHealthDamageEvent> damageTakenList)) { damageTakenList.Add(de); } else { _damageTakenData[de.To] = new List <AbstractHealthDamageEvent>() { de }; } dstToSort.Add(de.To); if (_damageData.TryGetValue(de.From, out List <AbstractHealthDamageEvent> damageDoneList)) { damageDoneList.Add(de); } else { _damageData[de.From] = new List <AbstractHealthDamageEvent>() { de }; } srcToSort.Add(de.From); if (_damageDataById.TryGetValue(de.SkillId, out List <AbstractHealthDamageEvent> damageDoneByIDList)) { damageDoneByIDList.Add(de); } else { _damageDataById[de.SkillId] = new List <AbstractHealthDamageEvent>() { de }; } idsToSort.Add(de.SkillId); } foreach (long buffID in idsToSort) { _damageDataById[buffID] = _damageDataById[buffID].OrderBy(x => x.Time).ToList(); } foreach (AgentItem a in dstToSort) { _damageTakenData[a] = _damageTakenData[a].OrderBy(x => x.Time).ToList(); } foreach (AgentItem a in srcToSort) { _damageData[a] = _damageData[a].OrderBy(x => x.Time).ToList(); } }
private void EIDamageParse(SkillData skillData, FightData fightData) { var toAdd = new List <AbstractHealthDamageEvent>(); toAdd.AddRange(fightData.Logic.SpecialDamageEventProcess(_damageData, _damageTakenData, _damageDataById, skillData)); var idsToSort = new HashSet <long>(); var dstToSort = new HashSet <AgentItem>(); var srcToSort = new HashSet <AgentItem>(); foreach (AbstractHealthDamageEvent de in toAdd) { if (_damageTakenData.TryGetValue(de.To, out List <AbstractHealthDamageEvent> list1)) { list1.Add(de); } else { _damageTakenData[de.To] = new List <AbstractHealthDamageEvent>() { de }; } dstToSort.Add(de.To); if (_damageData.TryGetValue(de.From, out List <AbstractHealthDamageEvent> list3)) { list1.Add(de); } else { _damageData[de.From] = new List <AbstractHealthDamageEvent>() { de }; } srcToSort.Add(de.To); if (_damageDataById.TryGetValue(de.SkillId, out List <AbstractHealthDamageEvent> list2)) { list2.Add(de); } else { _damageDataById[de.SkillId] = new List <AbstractHealthDamageEvent>() { de }; } idsToSort.Add(de.SkillId); } foreach (long buffID in idsToSort) { _damageDataById[buffID].Sort((x, y) => x.Time.CompareTo(y.Time)); } foreach (AgentItem a in dstToSort) { _damageTakenData[a].Sort((x, y) => x.Time.CompareTo(y.Time)); } foreach (AgentItem a in srcToSort) { _damageData[a].Sort((x, y) => x.Time.CompareTo(y.Time)); } }
private void EICastParse(List <Player> players, SkillData skillData, FightData fightData, AgentData agentData) { List <AbstractCastEvent> toAdd = fightData.Logic.SpecialCastEventProcess(_animatedCastData, _weaponSwapData, _animatedCastDataById, skillData); toAdd.AddRange(ProfHelper.ComputeInstantCastEvents(players, this, skillData, agentData)); // var castIDsToSort = new HashSet <long>(); var castAgentsToSort = new HashSet <AgentItem>(); var wepSwapAgentsToSort = new HashSet <AgentItem>(); var instantAgentsToSort = new HashSet <AgentItem>(); foreach (AbstractCastEvent cast in toAdd) { if (cast is AnimatedCastEvent ace) { if (_animatedCastData.TryGetValue(ace.Caster, out List <AnimatedCastEvent> list1)) { list1.Add(ace); } else { _animatedCastData[ace.Caster] = new List <AnimatedCastEvent>() { ace }; } castAgentsToSort.Add(ace.Caster); if (_animatedCastDataById.TryGetValue(ace.SkillId, out List <AnimatedCastEvent> list2)) { list2.Add(ace); } else { _animatedCastDataById[cast.SkillId] = new List <AnimatedCastEvent>() { ace }; } castIDsToSort.Add(cast.SkillId); } if (cast is WeaponSwapEvent wse) { if (_weaponSwapData.TryGetValue(wse.Caster, out List <WeaponSwapEvent> list1)) { list1.Add(wse); } else { _weaponSwapData[wse.Caster] = new List <WeaponSwapEvent>() { wse }; } wepSwapAgentsToSort.Add(wse.Caster); } if (cast is InstantCastEvent ice) { if (_instantCastData.TryGetValue(ice.Caster, out List <InstantCastEvent> list1)) { list1.Add(ice); } else { _instantCastData[ice.Caster] = new List <InstantCastEvent>() { ice }; } instantAgentsToSort.Add(ice.Caster); } } foreach (long buffID in castIDsToSort) { _animatedCastDataById[buffID].Sort((x, y) => x.Time.CompareTo(y.Time)); } foreach (AgentItem a in castAgentsToSort) { _animatedCastData[a].Sort((x, y) => x.Time.CompareTo(y.Time)); } foreach (AgentItem a in wepSwapAgentsToSort) { _weaponSwapData[a].Sort((x, y) => x.Time.CompareTo(y.Time)); } foreach (AgentItem a in instantAgentsToSort) { _instantCastData[a].Sort((x, y) => x.Time.CompareTo(y.Time)); } }
public static List <AnimatedCastEvent> CreateCastEvents(Dictionary <ulong, List <CombatItem> > castEventsBySrcAgent, AgentData agentData, SkillData skillData, FightData fightData) { var res = new List <AnimatedCastEvent>(); foreach (KeyValuePair <ulong, List <CombatItem> > pairBySrcAgent in castEventsBySrcAgent) { var resBySrcAgent = new List <AnimatedCastEvent>(); var castEventsBySrcAgentBySkillID = pairBySrcAgent.Value.GroupBy(x => x.SkillID).ToDictionary(x => x.Key, x => x.ToList()); foreach (KeyValuePair <uint, List <CombatItem> > pairBySrcAgentBySkillID in castEventsBySrcAgentBySkillID) { var resBySrcAgentBySkillID = new List <AnimatedCastEvent>(); CombatItem startItem = null; foreach (CombatItem c in pairBySrcAgentBySkillID.Value) { if (c.StartCasting()) { // missing end if (startItem != null) { resBySrcAgentBySkillID.Add(new AnimatedCastEvent(startItem, agentData, skillData, fightData.LogEnd)); } startItem = c; } else if (c.EndCasting()) { if (startItem != null && startItem.SkillID == c.SkillID) { resBySrcAgentBySkillID.Add(new AnimatedCastEvent(startItem, agentData, skillData, c)); startItem = null; } // missing start else { var toCheck = new AnimatedCastEvent(agentData, skillData, c); // we are only interested in animations started before log starts if (toCheck.Time < fightData.LogStart) { resBySrcAgentBySkillID.Add(toCheck); } } } } // missing end if (startItem != null) { resBySrcAgentBySkillID.Add(new AnimatedCastEvent(startItem, agentData, skillData, fightData.LogEnd)); } resBySrcAgentBySkillID.RemoveAll(x => x.ActualDuration <= 1); resBySrcAgent.AddRange(resBySrcAgentBySkillID); } resBySrcAgent = resBySrcAgent.OrderBy(x => x.Time).ToList(); // sanitize for (int i = 0; i < resBySrcAgent.Count - 1; i++) { resBySrcAgent[i].CutAt(resBySrcAgent[i + 1].Time + ParserHelper.ServerDelayConstant); } res.AddRange(resBySrcAgent); } res = res.OrderBy(x => x.Time).ToList(); return(res); }
internal CombatData(List <CombatItem> allCombatItems, FightData fightData, AgentData agentData, SkillData skillData, List <Player> players, ParserController operation) { _skillIds = new HashSet <long>(); var castCombatEvents = new Dictionary <ulong, List <CombatItem> >(); var buffEvents = new List <AbstractBuffEvent>(); var wepSwaps = new List <WeaponSwapEvent>(); var brkDamageData = new List <AbstractBreakbarDamageEvent>(); var damageData = new List <AbstractHealthDamageEvent>(); operation.UpdateProgressWithCancellationCheck("Creating EI Combat Data"); foreach (CombatItem combatItem in allCombatItems) { _skillIds.Add(combatItem.SkillID); if (combatItem.IsStateChange != ArcDPSEnums.StateChange.None) { CombatEventFactory.AddStateChangeEvent(combatItem, agentData, skillData, _metaDataEvents, _statusEvents, _rewardEvents, wepSwaps, buffEvents); } else if (combatItem.IsActivation != ArcDPSEnums.Activation.None) { if (castCombatEvents.TryGetValue(combatItem.SrcAgent, out List <CombatItem> list)) { list.Add(combatItem); } else { castCombatEvents[combatItem.SrcAgent] = new List <CombatItem>() { combatItem }; } } else if (combatItem.IsBuffRemove != ArcDPSEnums.BuffRemove.None) { CombatEventFactory.AddBuffRemoveEvent(combatItem, buffEvents, agentData, skillData); } else { if (combatItem.IsBuff != 0 && combatItem.BuffDmg == 0 && combatItem.Value > 0) { CombatEventFactory.AddBuffApplyEvent(combatItem, buffEvents, agentData, skillData); //HasStackIDs = HasStackIDs || combatItem.Pad > 0; } else if (combatItem.IsBuff == 0) { CombatEventFactory.AddDirectDamageEvent(combatItem, damageData, brkDamageData, agentData, skillData); } else if (combatItem.IsBuff != 0 && combatItem.Value == 0) { CombatEventFactory.AddIndirectDamageEvent(combatItem, damageData, brkDamageData, agentData, skillData); } } } HasMovementData = _statusEvents.MovementEvents.Count > 1; HasBreakbarDamageData = brkDamageData.Any(); // operation.UpdateProgressWithCancellationCheck("Combining SkillInfo with SkillData"); skillData.CombineWithSkillInfo(_metaDataEvents.SkillInfoEvents); // operation.UpdateProgressWithCancellationCheck("Creating Cast Events"); List <AnimatedCastEvent> animatedCastData = CombatEventFactory.CreateCastEvents(castCombatEvents, agentData, skillData); _weaponSwapData = wepSwaps.GroupBy(x => x.Caster).ToDictionary(x => x.Key, x => x.ToList()); _animatedCastData = animatedCastData.GroupBy(x => x.Caster).ToDictionary(x => x.Key, x => x.ToList()); _instantCastData = new Dictionary <AgentItem, List <InstantCastEvent> >(); _animatedCastDataById = animatedCastData.GroupBy(x => x.SkillId).ToDictionary(x => x.Key, x => x.ToList()); // operation.UpdateProgressWithCancellationCheck("Creating Buff Events"); _buffDataByDst = buffEvents.GroupBy(x => x.To).ToDictionary(x => x.Key, x => x.ToList()); _buffData = buffEvents.GroupBy(x => x.BuffID).ToDictionary(x => x.Key, x => x.ToList()); // damage events operation.UpdateProgressWithCancellationCheck("Creating Damage Events"); _damageData = damageData.GroupBy(x => x.From).ToDictionary(x => x.Key, x => x.ToList()); _damageTakenData = damageData.GroupBy(x => x.To).ToDictionary(x => x.Key, x => x.ToList()); _damageDataById = damageData.GroupBy(x => x.SkillId).ToDictionary(x => x.Key, x => x.ToList()); _breakbarDamageData = brkDamageData.GroupBy(x => x.From).ToDictionary(x => x.Key, x => x.ToList()); _breakbarDamageTakenData = brkDamageData.GroupBy(x => x.To).ToDictionary(x => x.Key, x => x.ToList()); // /*healing_data = allCombatItems.Where(x => x.getDstInstid() != 0 && x.isStateChange() == ParseEnum.StateChange.Normal && x.getIFF() == ParseEnum.IFF.Friend && x.isBuffremove() == ParseEnum.BuffRemove.None && * ((x.isBuff() == 1 && x.getBuffDmg() > 0 && x.getValue() == 0) || * (x.isBuff() == 0 && x.getValue() > 0))).ToList(); * * healing_received_data = allCombatItems.Where(x => x.isStateChange() == ParseEnum.StateChange.Normal && x.getIFF() == ParseEnum.IFF.Friend && x.isBuffremove() == ParseEnum.BuffRemove.None && * ((x.isBuff() == 1 && x.getBuffDmg() > 0 && x.getValue() == 0) || * (x.isBuff() == 0 && x.getValue() >= 0))).ToList();*/ EIExtraEventProcess(players, skillData, agentData, fightData, operation); _buffRemoveAllData = _buffData.ToDictionary(x => x.Key, x => x.Value.OfType <BuffRemoveAllEvent>().ToList()); }