public override List <InstantCastEvent> ComputeInstantCast(CombatData combatData, SkillData skillData, AgentData agentData) { var res = new List <InstantCastEvent>(); EffectGUIDEvent effectGUIDEvent = combatData.GetEffectGUIDEvent(_effectGUID); if (effectGUIDEvent != null) { Dictionary <AgentItem, List <EffectEvent> > effects = GetEffectEventDict(effectGUIDEvent, combatData); foreach (KeyValuePair <AgentItem, List <EffectEvent> > pair in effects) { long lastTime = int.MinValue; foreach (EffectEvent effectEvent in pair.Value) { if (effectEvent.Time - lastTime < ICD) { lastTime = effectEvent.Time; continue; } if (_triggerCondition != null) { if (_triggerCondition(effectEvent, combatData)) { lastTime = effectEvent.Time; res.Add(new InstantCastEvent(effectEvent.Time, skillData.Get(SkillID), GetAgent(effectEvent))); } } else { lastTime = effectEvent.Time; res.Add(new InstantCastEvent(effectEvent.Time, skillData.Get(SkillID), GetAgent(effectEvent))); } } } } return(res); }
internal override void ComputePlayerCombatReplayActors(AbstractPlayer p, ParsedEvtcLog log, CombatReplay replay) { var knownEffectsIDs = new HashSet <long>(); EffectGUIDEvent spread = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTempleSpread); if (spread != null) { var spreadEffects = log.CombatData.GetEffectEvents(spread.ContentID).Where(x => x.Dst == p.AgentItem).ToList(); knownEffectsIDs.Add(spread.ContentID); foreach (EffectEvent spreadEffect in spreadEffects) { int duration = 5500; int start = (int)spreadEffect.Time; int end = start + duration; AbstractSingleActor dragonVoid = FindActiveDragonVoid(spreadEffect.Time); if (dragonVoid == null) { continue; } int effectEnd = Math.Min((int)dragonVoid.LastAware, end); replay.Decorations.Add(new CircleDecoration(true, end, 240, (start, effectEnd), "rgba(250, 120, 0, 0.2)", new AgentConnector(p))); replay.Decorations.Add(new CircleDecoration(true, 0, 240, (start, effectEnd), "rgba(250, 120, 0, 0.2)", new AgentConnector(p))); } } EffectGUIDEvent redSelected = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTempleRedPuddleSelect); if (redSelected != null) { var redSelectedEffects = log.CombatData.GetEffectEvents(redSelected.ContentID).Where(x => x.Dst == p.AgentItem).ToList(); knownEffectsIDs.Add(redSelected.ContentID); foreach (EffectEvent redSelectedEffect in redSelectedEffects) { int duration = 6500; int start = (int)redSelectedEffect.Time; int end = start + duration; AbstractSingleActor dragonVoid = FindActiveDragonVoid(redSelectedEffect.Time); if (dragonVoid == null) { continue; } int puddleEnd = (int)dragonVoid.LastAware; int effectEnd = Math.Min(puddleEnd, end); replay.Decorations.Add(new CircleDecoration(true, end, 280, (start, effectEnd), "rgba(250, 50, 0, 0.2)", new AgentConnector(p))); replay.Decorations.Add(new CircleDecoration(true, 0, 280, (start, effectEnd), "rgba(250, 50, 0, 0.2)", new AgentConnector(p))); Point3D pos = p.GetCurrentPosition(log, end); if (pos == null) { continue; } replay.Decorations.Add(new CircleDecoration(true, end + 1000, 280, (end, puddleEnd), "rgba(250, 0, 0, 0.3)", new PositionConnector(pos))); replay.Decorations.Add(new CircleDecoration(true, 0, 280, (end, puddleEnd), "rgba(250, 0, 0, 0.3)", new PositionConnector(pos))); } } /*if (p != log.PlayerList[0]) * { * return; * } * var test = log.CombatData.GetEffectEvents(p.AgentItem); * foreach (EffectEvent effectEvt in test) * { * if (effectEvt.IsAroundDst) * { * replay.Decorations.Insert(0, new CircleDecoration(true, 0, 180, ((int)effectEvt.Time, (int)effectEvt.Time + 100), "rgba(0, 180, 255, 1.0)", new AgentConnector(log.FindActor(effectEvt.Dst)))); * } * else * { * * replay.Decorations.Insert(0, new CircleDecoration(true, 0, 180, ((int)effectEvt.Time, (int)effectEvt.Time + 100), "rgba(0, 180, 255, 1.0)", new PositionConnector(effectEvt.Position))); * } * }*/ }
internal override void ComputeNPCCombatReplayActors(NPC target, ParsedEvtcLog log, CombatReplay replay) { var knownEffectsIDs = new HashSet <long>(); switch (target.ID) { case (int)ArcDPSEnums.TrashID.PushableVoidAmalgamate: // EffectGUIDEvent purificationZone = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTemplePurificationZones); if (purificationZone != null) { var voidShells = log.CombatData.GetBuffData(VoidShell).Where(x => x.To == target.AgentItem).ToList(); var voidShellRemovals = voidShells.Where(x => x is BuffRemoveSingleEvent || x is BuffRemoveAllEvent).ToList(); int voidShellAppliesCount = voidShells.Where(x => x is BuffApplyEvent).Count(); int voidShellRemovalOffset = 0; int purificationAdd = 0; bool breakPurification = false; var purificationZoneEffects = log.CombatData.GetEffectEvents(purificationZone.ContentID).Where(x => x.Time >= target.FirstAware && x.Time <= target.LastAware).ToList(); knownEffectsIDs.Add(purificationZone.ContentID); foreach (EffectEvent purificationZoneEffect in purificationZoneEffects) { int start = (int)purificationZoneEffect.Time; int end = start + purificationZoneEffect.Duration; int radius = 280; if (voidShellRemovalOffset < voidShellRemovals.Count) { end = (int)voidShellRemovals[voidShellRemovalOffset++].Time; } replay.Decorations.Add(new CircleDecoration(true, 0, radius, (start, end), "rgba(0, 180, 255, 0.3)", new PositionConnector(purificationZoneEffect.Position))); purificationAdd++; if (purificationAdd >= voidShellAppliesCount) { breakPurification = true; } if (breakPurification) { break; } } } // EffectGUIDEvent lightning = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTemplePurificationLightnings); if (lightning != null) { var lightningEffects = log.CombatData.GetEffectEvents(lightning.ContentID).Where(x => x.Time >= target.FirstAware && x.Time <= target.LastAware).ToList(); knownEffectsIDs.Add(lightning.ContentID); foreach (EffectEvent lightningEffect in lightningEffects) { int duration = 3000; int start = (int)lightningEffect.Time - duration; int end = (int)lightningEffect.Time; replay.Decorations.Add(new CircleDecoration(true, end, 180, (start, end), "rgba(255, 180, 0, 0.2)", new PositionConnector(lightningEffect.Position))); replay.Decorations.Add(new CircleDecoration(true, 0, 180, (start, end), "rgba(255, 180, 0, 0.2)", new PositionConnector(lightningEffect.Position))); } } // EffectGUIDEvent fireBall = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTemplePurificationFireBalls); if (fireBall != null) { var fireBallEffects = log.CombatData.GetEffectEvents(fireBall.ContentID).Where(x => x.Time >= target.FirstAware && x.Time <= target.LastAware).ToList(); knownEffectsIDs.Add(fireBall.ContentID); foreach (EffectEvent fireBallEffect in fireBallEffects) { int startLoad = (int)fireBallEffect.Time - 2000; int endLoad = (int)fireBallEffect.Time; replay.Decorations.Add(new CircleDecoration(true, endLoad, 180, (startLoad, endLoad), "rgba(250, 0, 0, 0.2)", new PositionConnector(fireBallEffect.Position))); replay.Decorations.Add(new CircleDecoration(true, 0, 180, (startLoad, endLoad), "rgba(250, 0, 0, 0.2)", new PositionConnector(fireBallEffect.Position))); replay.Decorations.Add(new CircleDecoration(true, 0, 180, (endLoad, endLoad + 2000), "rgba(250, 0, 0, 0.4)", new PositionConnector(fireBallEffect.Position))); } } // EffectGUIDEvent voidZone = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTemplePurificationVoidZones); if (voidZone != null) { var voidZoneEffects = log.CombatData.GetEffectEvents(voidZone.ContentID).Where(x => x.Time >= target.FirstAware && x.Time <= target.LastAware).ToList(); knownEffectsIDs.Add(voidZone.ContentID); foreach (EffectEvent voidZoneEffect in voidZoneEffects) { int start = (int)voidZoneEffect.Time; int end = start + 5000; replay.Decorations.Add(new RotatedRectangleDecoration(true, 0, 90, 230, RadianToDegreeF(voidZoneEffect.Orientation.Z), (start, end), "rgba(150, 0, 150, 0.2)", new PositionConnector(voidZoneEffect.Position))); replay.Decorations.Add(new RotatedRectangleDecoration(true, end, 90, 230, RadianToDegreeF(voidZoneEffect.Orientation.Z), (start, end), "rgba(250, 0, 250, 0.3)", new PositionConnector(voidZoneEffect.Position))); } } // EffectGUIDEvent beeLaunch = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTemplePurificationBeeLaunch); if (beeLaunch != null) { var beeLaunchEffects = log.CombatData.GetEffectEvents(beeLaunch.ContentID).Where(x => x.Time >= target.FirstAware && x.Time <= target.LastAware).ToList(); knownEffectsIDs.Add(beeLaunch.ContentID); foreach (EffectEvent beeLaunchEffect in beeLaunchEffects) { int start = (int)beeLaunchEffect.Time; int end = start + 3000; replay.Decorations.Add(new RotatedRectangleDecoration(true, 0, 380, 30, RadianToDegreeF(beeLaunchEffect.Orientation.Z), 190, (start, end), "rgba(250, 50, 0, 0.4)", new PositionConnector(beeLaunchEffect.Position))); replay.Decorations.Add(new CircleDecoration(true, end, 280, (start, end), "rgba(250, 150, 0, 0.2)", new PositionConnector(beeLaunchEffect.Position))); replay.Decorations.Add(new CircleDecoration(true, 0, 280, (start, end), "rgba(250, 150, 0, 0.2)", new PositionConnector(beeLaunchEffect.Position))); } } // EffectGUIDEvent poisonTrail = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTemplePurificationPoisonTrail); if (poisonTrail != null) { var poisonTrailEffects = log.CombatData.GetEffectEvents(poisonTrail.ContentID).Where(x => x.Time >= target.FirstAware && x.Time <= target.LastAware).ToList(); knownEffectsIDs.Add(poisonTrail.ContentID); foreach (EffectEvent poisonTrailEffect in poisonTrailEffects) { int startLoad = (int)poisonTrailEffect.Time - 1000; int start = (int)poisonTrailEffect.Time; int end = start + 15000; replay.Decorations.Add(new CircleDecoration(true, start, 220, (startLoad, start), "rgba(0, 150, 0, 0.2)", new PositionConnector(poisonTrailEffect.Position))); replay.Decorations.Add(new CircleDecoration(true, 0, 220, (start, end), "rgba(0, 150, 0, 0.4)", new PositionConnector(poisonTrailEffect.Position))); } } // BreakbarStateEvent breakbar = log.CombatData.GetBreakbarStateEvents(target.AgentItem).FirstOrDefault(x => x.State == ArcDPSEnums.BreakbarState.Active); if (breakbar != null) { int start = (int)breakbar.Time; int end = (int)target.LastAware; replay.Decorations.Add(new CircleDecoration(true, 0, 120, (start, end), "rgba(0, 180, 255, 0.3)", new AgentConnector(target))); } // /*var effects = log.CombatData.GetEffectEvents(target.AgentItem).Where(x => x.EffectID != 0 && x.EffectID != 29656 && !knownEffectsIDs.Contains(x.EffectID)).ToList(); * var effects2 = log.CombatData.GetEffectEvents(ParserHelper._unknownAgent).Where(x => x.EffectID != 0 && !knownEffectsIDs.Contains(x.EffectID) && x.Time >= target.FirstAware && x.Time <= target.LastAware && !x.IsAroundDst).ToList(); * foreach (EffectEvent effectEvt in effects) * { * if (effectEvt.IsAroundDst) * { * continue; * } * replay.Decorations.Insert(0,new CircleDecoration(true, 0, 180, ((int)effectEvt.Time, (int)effectEvt.Time + 2000), "rgba(0, 180, 255, 1.0)", new PositionConnector(effectEvt.Position))); * } * var test = log.CombatData.GetEffectIDToGUIDEvents(18235);*/ break; case (int)ArcDPSEnums.TargetID.TheDragonVoidJormag: EffectGUIDEvent iceShard = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTempleJormagIceShards); if (iceShard != null) { IReadOnlyList <EffectEvent> iceShardEffects = log.CombatData.GetEffectEvents(iceShard.ContentID); knownEffectsIDs.Add(iceShard.ContentID); foreach (EffectEvent iceShardEffect in iceShardEffects) { int duration = 2500; int start = (int)iceShardEffect.Time; int end = start + duration; replay.Decorations.Add(new CircleDecoration(true, end, 160, (start, end), "rgba(0, 50, 180, 0.2)", new PositionConnector(iceShardEffect.Position))); replay.Decorations.Add(new CircleDecoration(true, 0, 160, (start, end), "rgba(0, 50, 180, 0.2)", new PositionConnector(iceShardEffect.Position))); } } /*var effects = log.CombatData.GetEffectEvents(target.AgentItem).Where(x => x.EffectID != 0 && x.EffectID != 29656 && !knownEffectsIDs.Contains(x.EffectID)).ToList(); * var effects2 = log.CombatData.GetEffectEvents(ParserHelper._unknownAgent).Where(x => x.EffectID != 0 && !knownEffectsIDs.Contains(x.EffectID) && x.Time >= target.FirstAware && x.Time <= target.LastAware && (!x.IsAroundDst ||(x.IsAroundDst && x.Dst.IsPlayer)) && x.Time > 48500 && x.Time < 48600).ToList(); * foreach (EffectEvent effectEvt in effects2) * { * if (effectEvt.IsAroundDst) * { * replay.Decorations.Insert(0, new CircleDecoration(true, 0, 180, ((int)effectEvt.Time, (int)effectEvt.Time + 100), "rgba(0, 180, 255, 1.0)", new AgentConnector(log.FindActor(effectEvt.Dst)))); * } * else * { * * replay.Decorations.Insert(0, new CircleDecoration(true, 0, 180, ((int)effectEvt.Time, (int)effectEvt.Time + 100), "rgba(0, 180, 255, 1.0)", new PositionConnector(effectEvt.Position))); * } * }*/ break; case (int)ArcDPSEnums.TargetID.TheDragonVoidPrimordus: EffectGUIDEvent smallJaw = log.CombatData.GetEffectGUIDEvent(EffectGUIDs.HarvestTemplePrimordusSmallJaw); if (smallJaw != null) { IReadOnlyList <EffectEvent> smallJawEffects = log.CombatData.GetEffectEvents(smallJaw.ContentID); knownEffectsIDs.Add(smallJaw.ContentID); // The effect is slightly shifted on X var jawPosition = new Point3D(610, -21400.3f, -15417.3f); foreach (EffectEvent smallJawEffect in smallJawEffects) { int duration = 4500; int start = (int)smallJawEffect.Time - duration; int end = (int)smallJawEffect.Time; replay.Decorations.Add(new CircleDecoration(true, end, 580, (start, end), "rgba(200, 100, 0, 0.2)", new PositionConnector(jawPosition))); replay.Decorations.Add(new CircleDecoration(true, 0, 580, (start, end), "rgba(200, 100, 0, 0.2)", new PositionConnector(jawPosition))); } } /*var effects = log.CombatData.GetEffectEvents(target.AgentItem).Where(x => x.EffectID != 0 && x.EffectID != 3819 && !knownEffectsIDs.Contains(x.EffectID)).ToList(); * var effects2 = log.CombatData.GetEffectEvents(ParserHelper._unknownAgent).Where(x => x.EffectID != 0 && x.EffectID != 3819 && !knownEffectsIDs.Contains(x.EffectID) && x.EffectID != EffectGUIDs.HarvestTempleJormagIceShards && x.Time >= target.FirstAware && x.Time <= target.LastAware && (!x.IsAroundDst) && x.Time > 170000 && x.Time < 175000).ToList(); * foreach (EffectEvent effectEvt in effects2) * { * if (effectEvt.IsAroundDst) * { * replay.Decorations.Insert(0, new CircleDecoration(true, 0, 180, ((int)effectEvt.Time, (int)effectEvt.Time + 100), "rgba(0, 180, 255, 1.0)", new AgentConnector(log.FindActor(effectEvt.Dst)))); * } * else * { * * replay.Decorations.Insert(0, new CircleDecoration(true, 0, 180, ((int)effectEvt.Time, (int)effectEvt.Time + 100), "rgba(0, 180, 255, 1.0)", new PositionConnector(effectEvt.Position))); * } * }*/ break; case (int)ArcDPSEnums.TrashID.DragonBodyVoidAmalgamate: /*var effects = log.CombatData.GetEffectEvents(target.AgentItem).Where(x => x.EffectID != 0 && !knownEffectsIDs.Contains(x.EffectID)).ToList(); * var effects2 = log.CombatData.GetEffectEvents().Where(x => x.EffectID != 0 && !knownEffectsIDs.Contains(x.EffectID) && x.Time >= target.FirstAware && x.Time <= target.LastAware && (!x.IsAroundDst || (x.IsAroundDst && x.Dst.IsPlayer)) && x.Time > 133000 && x.Time < 142000 && x.Src != ParserHelper._unknownAgent && !x.Src.GetFinalMaster().IsPlayer).ToList(); * foreach (EffectEvent effectEvt in effects2) * { * if (effectEvt.IsAroundDst) * { * replay.Decorations.Insert(0, new CircleDecoration(true, 0, 180, ((int)effectEvt.Time, (int)effectEvt.Time + 100), "rgba(0, 180, 255, 1.0)", new AgentConnector(log.FindActor(effectEvt.Dst)))); * } * else * { * * replay.Decorations.Insert(0, new CircleDecoration(true, 0, 180, ((int)effectEvt.Time, (int)effectEvt.Time + 100), "rgba(0, 180, 255, 1.0)", new PositionConnector(effectEvt.Position))); * } * }*/ break; default: break; } }
protected override Dictionary <AgentItem, List <EffectEvent> > GetEffectEventDict(EffectGUIDEvent effectGUIDEvent, CombatData combatData) { return(combatData.GetEffectEvents(effectGUIDEvent.ContentID).Where(x => x.IsAroundDst).GroupBy(x => x.Dst).ToDictionary(x => x.Key, x => x.ToList())); }
protected virtual Dictionary <AgentItem, List <EffectEvent> > GetEffectEventDict(EffectGUIDEvent effectGUIDEvent, CombatData combatData) { return(combatData.GetEffectEvents(effectGUIDEvent.ContentID).GroupBy(x => x.Src).ToDictionary(x => x.Key, x => x.ToList())); }