Skip to content

Commit 1192389

Browse files
committed
2 parents 33ed4e4 + 3bac92c commit 1192389

File tree

5 files changed

+96
-9
lines changed

5 files changed

+96
-9
lines changed

GW2EIEvtcParser/EIData/InstantCastFinders/EffectInstantCastFinder/EffectCastFinder.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace GW2EIEvtcParser.EIData
99
internal class EffectCastFinder : CheckedCastFinder<EffectEvent>
1010
{
1111
private readonly string _effectGUID;
12+
private int _speciesId = 0;
1213

1314
protected virtual Dictionary<AgentItem, List<EffectEvent>> GetEffectEventDict(EffectGUIDEvent effectGUIDEvent, CombatData combatData)
1415
{
@@ -64,6 +65,12 @@ internal EffectCastFinder UsingSecondaryEffectChecker(string effectGUID, long ti
6465
return this;
6566
}
6667

68+
internal EffectCastFinder UsingAgentRedirectionIfUnknown(int speciesID)
69+
{
70+
_speciesId = speciesID;
71+
return this;
72+
}
73+
6774
public override List<InstantCastEvent> ComputeInstantCast(CombatData combatData, SkillData skillData, AgentData agentData)
6875
{
6976
var res = new List<InstantCastEvent>();
@@ -85,6 +92,14 @@ public override List<InstantCastEvent> ComputeInstantCast(CombatData combatData,
8592
{
8693
lastTime = effectEvent.Time;
8794
AgentItem caster = GetAgent(effectEvent);
95+
if (_speciesId > 0 && caster.IsSpecies(ArcDPSEnums.NonIdentifiedSpecies))
96+
{
97+
AgentItem agent = agentData.GetNPCsByID(_speciesId).FirstOrDefault(x => x.LastAware >= effectEvent.Time && x.FirstAware <= effectEvent.Time);
98+
if (agent != null)
99+
{
100+
caster = agent;
101+
}
102+
}
88103
res.Add(new InstantCastEvent(GetTime(effectEvent, caster, combatData), skillData.Get(SkillID), caster));
89104
}
90105
}

GW2EIEvtcParser/EncounterLogic/Raids/W5/StatueOfIce.cs

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using GW2EIEvtcParser.EIData;
45
using GW2EIEvtcParser.ParsedData;
@@ -13,14 +14,16 @@ namespace GW2EIEvtcParser.EncounterLogic
1314
{
1415
internal class StatueOfIce : HallOfChains
1516
{
16-
// TODO - add CR icons and some mechanics
1717
public StatueOfIce(int triggerID) : base(triggerID)
1818
{
1919
MechanicList.AddRange(new List<Mechanic>
2020
{
21-
new PlayerDstHitMechanic(KingsWrath, "King's Wrath", new MechanicPlotlySetting(Symbols.TriangleLeft,Colors.LightBlue), "Cone Hit","King's Wrath (Auto Attack Cone Part)", "Cone Auto Attack",0),
22-
new PlayerDstHitMechanic(NumbingBreach, "Numbing Breach", new MechanicPlotlySetting(Symbols.AsteriskOpen,Colors.LightBlue), "Cracks","Numbing Breach (Ice Cracks in the Ground)", "Cracks",0),
23-
new PlayerDstBuffApplyMechanic(FrozenWind, "Frozen Wind", new MechanicPlotlySetting(Symbols.CircleOpen,Colors.Green), "Green","Frozen Wind (Stood in Green)", "Green Stack",0),
21+
new PlayerDstHitMechanic(KingsWrathConeAoE, "King's Wrath", new MechanicPlotlySetting(Symbols.TriangleUp, Colors.White), "Cone AoE", "Hit by King's Wrath (Cone AoEs)", "King's Wrath Cone AoE Hit", 0),
22+
new PlayerDstHitMechanic(KingsWrathConeShards, "King's Wrath", new MechanicPlotlySetting(Symbols.TriangleLeft, Colors.LightBlue), "Cone Shards", "Hit by King's Wrath (Frontal Cone Shards)", "King's Wrath Cone Shards Hit", 0),
23+
new PlayerDstHitMechanic(NumbingBreach, "Numbing Breach", new MechanicPlotlySetting(Symbols.AsteriskOpen, Colors.LightBlue), "Cracks", "Stood on Numbing Breach (Ice Cracks in the Ground)", "Cracks", 0),
24+
new PlayerDstBuffApplyMechanic(FrozenWind, "Frozen Wind", new MechanicPlotlySetting(Symbols.CircleOpen, Colors.Green), "Green", "Frozen Wind (Stood in Green)", "Green Stack", 0),
25+
new PlayerDstBuffApplyMechanic(Glaciate, "Glaciate", new MechanicPlotlySetting(Symbols.Square, Colors.Purple), "Glaciate", "Glaciated (Frozen by 4th Stack of Frozen Wind)", "Glaciate", 0),
26+
new EnemySrcEffectMechanic(EffectGUIDs.BrokenKingIceBreakerGreenExplosion, "Ice Breaker", new MechanicPlotlySetting(Symbols.CircleX, Colors.DarkGreen), "Ice Breaker", "Hailstorm Explosion (Missed Green)", "Ice Breaker (Green Missed)", 0),
2427
}
2528
);
2629
Extension = "brokenking";
@@ -40,7 +43,7 @@ protected override CombatReplayMap GetCombatMapInternal(ParsedEvtcLog log)
4043

4144
internal override long GetFightOffset(int evtcVersion, FightData fightData, AgentData agentData, List<CombatItem> combatData)
4245
{
43-
AgentItem brokenKing = agentData.GetNPCsByID((int)ArcDPSEnums.TargetID.BrokenKing).FirstOrDefault();
46+
AgentItem brokenKing = agentData.GetNPCsByID(ArcDPSEnums.TargetID.BrokenKing).FirstOrDefault();
4447
if (brokenKing == null)
4548
{
4649
throw new MissingKeyActorsException("Broken King not found");
@@ -86,7 +89,7 @@ internal override void ComputeNPCCombatReplayActors(NPC target, ParsedEvtcLog lo
8689
switch (target.ID)
8790
{
8891
case (int)ArcDPSEnums.TargetID.BrokenKing:
89-
var Cone = cls.Where(x => x.SkillId == KingsWrath).ToList();
92+
var Cone = cls.Where(x => x.SkillId == KingsWrathConeShards).ToList();
9093
foreach (AbstractCastEvent c in Cone)
9194
{
9295
int start = (int)c.Time;
@@ -107,14 +110,70 @@ internal override void ComputeNPCCombatReplayActors(NPC target, ParsedEvtcLog lo
107110
default:
108111
break;
109112
}
113+
}
114+
115+
internal override void ComputeEnvironmentCombatReplayDecorations(ParsedEvtcLog log)
116+
{
117+
base.ComputeEnvironmentCombatReplayDecorations(log);
118+
119+
// Numbing Breach - Cracks - White smoke indicator
120+
if (log.CombatData.TryGetEffectEventsByGUID(EffectGUIDs.BrokenKingNumbingBreachIndicator, out IReadOnlyList<EffectEvent> cracksIndicators))
121+
{
122+
foreach (EffectEvent effect in cracksIndicators)
123+
{
124+
(long, long) lifespan = effect.ComputeLifespan(log, 1000);
125+
var connector = new PositionConnector(effect.Position);
126+
var circle = new CircleDecoration(115, lifespan, "rgba(219, 233, 244, 0.2)", connector);
127+
EnvironmentDecorations.Add(circle);
128+
}
129+
}
110130

131+
// Numbing Breach - Cracks - Damage zone
132+
if (log.CombatData.TryGetEffectEventsByGUID(EffectGUIDs.BrokenKingNumbingBreachDamage, out IReadOnlyList<EffectEvent> cracks))
133+
{
134+
foreach (EffectEvent effect in cracks)
135+
{
136+
(long, long) lifespan = effect.ComputeLifespan(log, 30000);
137+
var connector = new PositionConnector(effect.Position);
138+
var rotationConnector = new AngleConnector(effect.Rotation.Z);
139+
var rectangle = (RectangleDecoration)new RectangleDecoration(40, 230, lifespan, "rgba(66, 130, 253, 0.2)", connector).UsingRotationConnector(rotationConnector);
140+
EnvironmentDecorations.Add(rectangle);
141+
}
142+
}
143+
144+
// Hailstorm - Greens
145+
if (log.CombatData.TryGetEffectEventsByGUID(EffectGUIDs.BrokenKingHailstormGreen, out IReadOnlyList<EffectEvent> greens))
146+
{
147+
foreach (EffectEvent green in greens)
148+
{
149+
string color = "rgba(0, 120, 0, 0.4)";
150+
151+
// Ice Breaker - Failed Greens
152+
if (log.CombatData.TryGetEffectEventsByGUID(EffectGUIDs.BrokenKingIceBreakerGreenExplosion, out IReadOnlyList<EffectEvent> failedGreens))
153+
{
154+
EffectEvent failedGreen = failedGreens.FirstOrDefault(x => x.Position.Distance2DToPoint(green.Position) < 1e-6 && Math.Abs(x.Time - green.Time - 15000) <= 650);
155+
if (failedGreen != null)
156+
{
157+
color = "rgba(120, 0, 0, 0.4)";
158+
}
159+
}
160+
161+
(long, long) lifespan = green.ComputeLifespan(log, 15000);
162+
var circle = new CircleDecoration(120, lifespan, color, new PositionConnector(green.Position));
163+
EnvironmentDecorations.Add(circle);
164+
EnvironmentDecorations.Add(circle.Copy().UsingGrowingEnd(lifespan.Item2, true));
165+
}
166+
}
111167
}
112168

113169
internal override List<InstantCastFinder> GetInstantCastFinders()
114170
{
115171
return new List<InstantCastFinder>()
116172
{
117-
new DamageCastFinder(BitingAura, BitingAura), // Biting Aura
173+
new DamageCastFinder(BitingAura, BitingAura),
174+
new EffectCastFinder(Hailstorm, EffectGUIDs.BrokenKingHailstormGreen),
175+
new EffectCastFinder(IceBreaker, EffectGUIDs.BrokenKingIceBreakerGreenExplosion)
176+
.UsingAgentRedirectionIfUnknown((int)ArcDPSEnums.TargetID.BrokenKing),
118177
};
119178
}
120179
internal override void CheckSuccess(CombatData combatData, AgentData agentData, FightData fightData, IReadOnlyCollection<AgentItem> playerAgents)

GW2EIEvtcParser/ParsedData/Skills/SkillItem.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ internal static (long, long) GetArcDPSCustomIDs(int evtcVersion)
206206
{ ProtectSAK, "Protect" },
207207
// Soulless Horror
208208
{ IssueChallengeSAK, "Issue Challenge" },
209+
// Broken King
210+
{ NumbingBreachCast, "Numbing Breach (Cast)" },
209211
// Dhuum
210212
{ MajorSoulSplit, "Major Soul Split" },
211213
{ ExpelEnergySAK, "Expel Energy" },

GW2EIEvtcParser/ParserHelpers/EffectGUIDs.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,13 @@ public static class EffectGUIDs
360360
public const string MursaarOverseerProtectBubble = "17BC358A51ED2D43BF2ABE8AB642B86B"; // Src player
361361
public const string MursaarOverseerClaimMarker = "94F3501D777FAC439E78E143CE756B0A"; // No Src - No Dst
362362
public const string MursaarOverseerShockwave = "0F62A1315A00FC438B2F1273E6BC4054";
363+
// Broken King
364+
public const string BrokenKingNumbingBreachIndicator = "5341E83B29B534408E90DBE7BE6F452D";
365+
public const string BrokenKingNumbingBreachDamage = "1BF014091BFD1E40A11ED36B92601342";
366+
public const string BrokenKingHailstormGreen = "C97A7665B2AA6C4482026D4F2562E25E";
367+
public const string BrokenKingIceBreakerGreenExplosion = "957ADB83D139704F8CB865E86E389228";
368+
public const string BrokenKingKingsWrathConeAoEIndicator = "FA4B726574C96E489D73529CFE390D3D"; // Currently unused, we don't know how to determinate the aoe size
369+
public const string BrokenKingKingsWrathConeAoEDamage = "22AC6bFC0B06C1459DFEF1E380F50165"; // Currently unused, we don't know how to determinate the aoe size
363370
// CA
364371
public const string CAArmSmash = "B1AAD873DB07E04E9D69627156CA8918";
365372
// Sabir

GW2EIEvtcParser/ParserHelpers/SkillIDs.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2534,6 +2534,8 @@ public static class SkillIDs
25342534
public const long SuperiorSigilOfTheStars = 46953;
25352535
public const long MushroomKingsBlessing = 46970;
25362536
public const long AchievementEligibilityNecroDancer = 46994;
2537+
public const long KingsWrathConeAoE = 47005;
2538+
public const long Hailstorm = 47013;
25372539
public const long Glaciate = 47022;
25382540
public const long Flare = 47074;
25392541
public const long EndersEchoDamage = 47076;
@@ -2572,6 +2574,7 @@ public static class SkillIDs
25722574
public const long EnvironmentallyFriendly = 47625;
25732575
public const long LastGraspJudgment = 47635;
25742576
public const long ArcingAffliction = 47646;
2577+
public const long IceBreaker = 47679;
25752578
public const long DhuumsMessengerFixationBuff = 47702; // From player applied to messenger
25762579
public const long CorsairMaintenanceOil = 47734;
25772580
public const long WurmSpit = 47756;
@@ -2584,12 +2587,13 @@ public static class SkillIDs
25842587
public const long ChoyaFinisher = 47904;
25852588
public const long QuadSlashSecondSet = 47915;
25862589
public const long OneTrackMind = 47929;
2590+
public const long NumbingBreachCast = 47930;
25872591
public const long SoulSiphon2 = 47939;
25882592
public const long ReclaimedEnergySkill = 47942;
25892593
public const long BrokenKingFirstCast = 47981;
25902594
public const long Imbibe = 48007;
25912595
public const long DhuumDamagingShacklesBuff = 48042;
2592-
public const long KingsWrath = 48066;
2596+
public const long KingsWrathConeShards = 48066;
25932597
public const long DeepAbyss = 48150;
25942598
public const long MortalCoilRiver = 48154;
25952599
public const long ArcingAfflictionHit = 48121;

0 commit comments

Comments
 (0)