diff --git a/sim/common/wotlk/enchant_effects.go b/sim/common/wotlk/enchant_effects.go index 723ea45984..905acd90ee 100644 --- a/sim/common/wotlk/enchant_effects.go +++ b/sim/common/wotlk/enchant_effects.go @@ -486,6 +486,34 @@ func init() { }) }) + core.NewItemEffect(70164, func(agent core.Agent) { + character := agent.GetCharacter() + mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.ID == 70164 + oh := character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.ID == 70164 + if !mh && !oh { + return + } + + character.AddStat(stats.Defense, 13) + character.MultiplyStat(stats.Stamina, 1.01) + }) + + core.NewItemEffect(62158, func(agent core.Agent) { + character := agent.GetCharacter() + mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.ID == 62158 + oh := character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.ID == 62158 + if !mh { + return + } + + if oh { + return + } + + character.AddStat(stats.Defense, 25) + character.MultiplyStat(stats.Stamina, 1.02) + }) + core.NewItemEffect(55642, func(agent core.Agent) { character := agent.GetCharacter() diff --git a/sim/core/stats/deps.go b/sim/core/stats/deps.go index cbedc468fb..a35c052dff 100644 --- a/sim/core/stats/deps.go +++ b/sim/core/stats/deps.go @@ -29,6 +29,7 @@ var safeDepsOrder []Stat = []Stat{ Block, BlockValue, Dodge, + Parry, } const invalidDep = -1 diff --git a/sim/deathknight/deathknight.go b/sim/deathknight/deathknight.go index 3e277fa335..11f1a7f925 100644 --- a/sim/deathknight/deathknight.go +++ b/sim/deathknight/deathknight.go @@ -334,6 +334,7 @@ func NewDeathknight(character core.Character, talents proto.DeathknightTalents, dk.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritRatingPerCritChance/62.5) dk.AddStatDependency(stats.Agility, stats.Dodge, core.DodgeRatingPerDodgeChance/84.74576271) dk.AddStatDependency(stats.Strength, stats.AttackPower, 2) + dk.AddStatDependency(stats.Strength, stats.Parry, 0.25) dk.PseudoStats.MeleeHasteRatingPerHastePercent /= 1.3 diff --git a/sim/deathknight/dps/TestFrost.results b/sim/deathknight/dps/TestFrost.results index 6f76f6e33d..fb446250ac 100644 --- a/sim/deathknight/dps/TestFrost.results +++ b/sim/deathknight/dps/TestFrost.results @@ -34,7 +34,7 @@ character_stats_results: { final_stats: 0 final_stats: 0 final_stats: 471.2154000067 - final_stats: 0 + final_stats: 410.696 final_stats: 0 final_stats: 22703 final_stats: 75 diff --git a/sim/deathknight/dps/TestUnholy.results b/sim/deathknight/dps/TestUnholy.results index 217bc86a8f..27b8d121ef 100644 --- a/sim/deathknight/dps/TestUnholy.results +++ b/sim/deathknight/dps/TestUnholy.results @@ -34,7 +34,7 @@ character_stats_results: { final_stats: 0 final_stats: 0 final_stats: 471.2154000067 - final_stats: 0 + final_stats: 423.01688 final_stats: 0 final_stats: 22703 final_stats: 75 diff --git a/sim/deathknight/tank/rotation_blood_tank_default.go b/sim/deathknight/tank/rotation_blood_tank_default.go index 5dd0cb5e98..cf2264ae4f 100644 --- a/sim/deathknight/tank/rotation_blood_tank_default.go +++ b/sim/deathknight/tank/rotation_blood_tank_default.go @@ -33,48 +33,53 @@ func (dk *TankDeathknight) RotationActionCallback_TankBlood_PrioRotation(sim *co bp := dk.BloodPlagueDisease[target.Index].IsActive() fbAt := core.MinDuration(dk.FrostFeverDisease[target.Index].ExpiresAt(), dk.BloodPlagueDisease[target.Index].ExpiresAt()) + casted := false if dk.VampiricBlood.CanCast(sim) && dk.CurrentHealthPercent() < 0.1 { - dk.VampiricBlood.Cast(sim, target) + casted = dk.VampiricBlood.Cast(sim, target) } else if dk.RuneTap.CanCast(sim) && dk.CurrentHealthPercent() < 0.1 { - dk.RuneTap.Cast(sim, target) - } else if dk.NextCast == dk.BloodStrike && dk.CurrentHealthPercent() > 0.6 { - if dk.NormalCurrentBloodRunes() > 0 { - dk.BloodStrike.Cast(sim, target) - dk.NextCast = nil - } - } else { - if !ff && dk.IcyTouch.CanCast(sim) { - dk.IcyTouch.Cast(sim, target) - } else if !bp && dk.PlagueStrike.CanCast(sim) { - dk.PlagueStrike.Cast(sim, target) - } else if !dk.btr.itCycle && dk.DeathStrike.CanCast(sim) && sim.CurrentTime+attackGcd < fbAt { - casted := dk.DeathStrike.Cast(sim, target) - if casted && dk.LastOutcome.Matches(core.OutcomeLanded) { - dk.btr.dsCount++ - } - - if dk.btr.dsCount == 4 { - dk.btr.dsCount = 0 - dk.btr.itCount = 0 - dk.btr.itCycle = true - } - } else if dk.btr.itCycle && dk.IcyTouch.CanCast(sim) && sim.CurrentTime+attackGcd < fbAt { - casted := dk.IcyTouch.Cast(sim, target) - if casted && dk.LastOutcome.Matches(core.OutcomeLanded) { - dk.btr.itCount++ - } + casted = dk.RuneTap.Cast(sim, target) + } - if dk.btr.itCount == 4 { - dk.btr.dsCount = 0 - dk.btr.itCount = 0 - dk.btr.itCycle = false + if !casted { + if dk.NextCast == dk.BloodStrike && dk.CurrentHealthPercent() > 0.6 { + if dk.NormalCurrentBloodRunes() > 0 { + dk.BloodStrike.Cast(sim, target) + dk.NextCast = nil } } else { - if sim.CurrentTime < fbAt-2*spellGcd { - waitUntil = fbAt - 2*spellGcd + if !ff && dk.IcyTouch.CanCast(sim) { + dk.IcyTouch.Cast(sim, target) + } else if !bp && dk.PlagueStrike.CanCast(sim) { + dk.PlagueStrike.Cast(sim, target) + } else if !dk.btr.itCycle && dk.DeathStrike.CanCast(sim) && sim.CurrentTime+attackGcd < fbAt { + casted = dk.DeathStrike.Cast(sim, target) + if casted && dk.LastOutcome.Matches(core.OutcomeLanded) { + dk.btr.dsCount++ + } + + if dk.btr.dsCount == 4 { + dk.btr.dsCount = 0 + dk.btr.itCount = 0 + dk.btr.itCycle = true + } + } else if dk.btr.itCycle && dk.IcyTouch.CanCast(sim) && sim.CurrentTime+attackGcd < fbAt { + casted := dk.IcyTouch.Cast(sim, target) + if casted && dk.LastOutcome.Matches(core.OutcomeLanded) { + dk.btr.itCount++ + } + + if dk.btr.itCount == 4 { + dk.btr.dsCount = 0 + dk.btr.itCount = 0 + dk.btr.itCycle = false + } } else { - dk.Pestilence.Cast(sim, target) - dk.NextCast = dk.BloodStrike + if sim.CurrentTime < fbAt-2*spellGcd { + waitUntil = fbAt - 2*spellGcd + } else { + dk.Pestilence.Cast(sim, target) + dk.NextCast = dk.BloodStrike + } } } } diff --git a/ui/tank_deathknight/presets.ts b/ui/tank_deathknight/presets.ts index 2820eb28e4..e58378ea38 100644 --- a/ui/tank_deathknight/presets.ts +++ b/ui/tank_deathknight/presets.ts @@ -45,9 +45,9 @@ export const DefaultOptions = TankDeathKnightOptions.create({ }); export const DefaultConsumes = Consumes.create({ - flask: Flask.FlaskOfFortification, + flask: Flask.FlaskOfStoneblood, food: Food.FoodDragonfinFilet, - defaultPotion: Potions.PotionOfSpeed, + defaultPotion: Potions.IndestructiblePotion, prepopPotion: Potions.IndestructiblePotion, }); diff --git a/ui/tank_deathknight/sim.ts b/ui/tank_deathknight/sim.ts index 6e850dbe26..da23a6cc63 100644 --- a/ui/tank_deathknight/sim.ts +++ b/ui/tank_deathknight/sim.ts @@ -47,8 +47,6 @@ export class TankDeathknightSimUI extends IndividualSimUI