public CombatData(List <CombatItem> allCombatItems, FightData fightData, AgentData agentData, SkillData skillData, List <Player> players, OperationController operation) { _skillIds = new HashSet <long>(allCombatItems.Select(x => (long)x.SkillID)); IEnumerable <CombatItem> noStateActiBuffRem = allCombatItems.Where(x => x.IsStateChange == ParseEnum.StateChange.None && x.IsActivation == ParseEnum.Activation.None && x.IsBuffRemove == ParseEnum.BuffRemove.None); // movement events _movementData = CombatEventFactory.CreateMovementEvents(allCombatItems.Where(x => x.IsStateChange == ParseEnum.StateChange.Position || x.IsStateChange == ParseEnum.StateChange.Velocity || x.IsStateChange == ParseEnum.StateChange.Rotation).ToList(), agentData); HasMovementData = _movementData.Count > 1; // state change events operation.UpdateProgressWithCancellationCheck("Creatint status and metadata events"); CombatEventFactory.CreateStateChangeEvents(allCombatItems, _metaDataEvents, _statusEvents, _rewardEvents, agentData); operation.UpdateProgressWithCancellationCheck("Combining SkillInfo with SkillData"); skillData.CombineWithSkillInfo(_metaDataEvents.SkillInfoEvents); // activation events operation.UpdateProgressWithCancellationCheck("Creating Cast Events"); List <AnimatedCastEvent> animatedCastData = CombatEventFactory.CreateCastEvents(allCombatItems.Where(x => x.IsActivation != ParseEnum.Activation.None).ToList(), agentData, skillData); operation.UpdateProgressWithCancellationCheck("Creating Weapon Swap Events"); List <WeaponSwapEvent> wepSwaps = CombatEventFactory.CreateWeaponSwapEvents(allCombatItems.Where(x => x.IsStateChange == ParseEnum.StateChange.WeaponSwap).ToList(), 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()); var allCastEvents = new List <AbstractCastEvent>(animatedCastData); allCastEvents.AddRange(wepSwaps); _castDataById = allCastEvents.GroupBy(x => x.SkillId).ToDictionary(x => x.Key, x => x.ToList()); // buff remove event var buffCombatEvents = allCombatItems.Where(x => x.IsBuffRemove != ParseEnum.BuffRemove.None && x.IsBuff != 0).ToList(); buffCombatEvents.AddRange(noStateActiBuffRem.Where(x => x.IsBuff != 0 && x.BuffDmg == 0 && x.Value > 0)); buffCombatEvents.AddRange(allCombatItems.Where(x => x.IsStateChange == ParseEnum.StateChange.BuffInitial)); buffCombatEvents.Sort((x, y) => x.Time.CompareTo(y.Time)); operation.UpdateProgressWithCancellationCheck("Creating Buff Events"); List <AbstractBuffEvent> buffEvents = CombatEventFactory.CreateBuffEvents(buffCombatEvents, agentData, skillData); _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"); List <AbstractDamageEvent> damageData = CombatEventFactory.CreateDamageEvents(noStateActiBuffRem.Where(x => (x.IsBuff != 0 && x.Value == 0) || (x.IsBuff == 0)).ToList(), agentData, skillData); _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()); /*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, fightData, operation); _buffRemoveAllData = _buffData.ToDictionary(x => x.Key, x => x.Value.OfType <BuffRemoveAllEvent>().ToList()); }
public CombatData(List <CombatItem> allCombatItems, FightData fightData, AgentData agentData, SkillData skillData, List <Player> players) { _skillIds = new HashSet <long>(allCombatItems.Select(x => x.SkillID)); var noStateActiBuffRem = allCombatItems.Where(x => x.IsStateChange == ParseEnum.StateChange.None && x.IsActivation == ParseEnum.Activation.None && x.IsBuffRemove == ParseEnum.BuffRemove.None); // movement events _movementData = CombatEventFactory.CreateMovementEvents(allCombatItems.Where(x => x.IsStateChange == ParseEnum.StateChange.Position || x.IsStateChange == ParseEnum.StateChange.Velocity || x.IsStateChange == ParseEnum.StateChange.Rotation).ToList(), agentData, fightData.FightStartLogTime); HasMovementData = _movementData.Count > 1; // state change events CombatEventFactory.CreateStateChangeEvents(allCombatItems, _metaDataEvents, _statusEvents, agentData, fightData.FightStartLogTime); // activation events List <AnimatedCastEvent> castData = CombatEventFactory.CreateCastEvents(allCombatItems.Where(x => x.IsActivation != ParseEnum.Activation.None).ToList(), agentData, skillData, fightData.FightStartLogTime); List <WeaponSwapEvent> wepSwaps = CombatEventFactory.CreateWeaponSwapEvents(allCombatItems.Where(x => x.IsStateChange == ParseEnum.StateChange.WeaponSwap).ToList(), agentData, skillData, fightData.FightStartLogTime); _weaponSwapData = wepSwaps.GroupBy(x => x.Caster).ToDictionary(x => x.Key, x => x.ToList()); _castData = castData.GroupBy(x => x.Caster).ToDictionary(x => x.Key, x => x.ToList()); List <AbstractCastEvent> allCastEvents = new List <AbstractCastEvent>(castData); allCastEvents.AddRange(wepSwaps); _castDataById = allCastEvents.GroupBy(x => x.SkillId).ToDictionary(x => x.Key, x => x.ToList()); // buff remove event List <CombatItem> buffCombatEvents = allCombatItems.Where(x => x.IsBuffRemove != ParseEnum.BuffRemove.None && x.IsBuff != 0).ToList(); buffCombatEvents.AddRange(noStateActiBuffRem.Where(x => x.IsBuff != 0 && x.BuffDmg == 0 && x.Value > 0)); buffCombatEvents.AddRange(allCombatItems.Where(x => x.IsStateChange == ParseEnum.StateChange.BuffInitial)); buffCombatEvents.Sort((x, y) => x.LogTime.CompareTo(y.LogTime)); List <AbstractBuffEvent> buffEvents = CombatEventFactory.CreateBuffEvents(buffCombatEvents, agentData, skillData, fightData.FightStartLogTime); _boonDataByDst = buffEvents.GroupBy(x => x.To).ToDictionary(x => x.Key, x => x.ToList()); _boonData = buffEvents.GroupBy(x => x.BuffID).ToDictionary(x => x.Key, x => x.ToList()); // damage events List <AbstractDamageEvent> damageData = CombatEventFactory.CreateDamageEvents(noStateActiBuffRem.Where(x => (x.IsBuff != 0 && x.Value == 0) || (x.IsBuff == 0)).ToList(), agentData, skillData, fightData.FightStartLogTime); _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()); /*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();*/ ExtraEvents(players, skillData, fightData); }