Skip to content
Draft
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
b181ff2
Added mistweaver to alpha
Patrick-Hogeveen May 13, 2025
fb1ada6
Merge branch 'wowsims:master' into master
Patrick-Hogeveen May 13, 2025
5fb6473
Merge branch 'wowsims:master' into master
Patrick-Hogeveen May 16, 2025
eeec9ce
Merge branch 'wowsims:master' into master
Patrick-Hogeveen May 17, 2025
78e9266
Adding monk as healer spec in the front end
Patrick-Hogeveen May 17, 2025
72d980a
Merge branch 'master' of https://github.com/Patrick-Hogeveen/mop
Patrick-Hogeveen May 17, 2025
6aa67fc
Renewing mist (wip) + surging mist
Patrick-Hogeveen May 17, 2025
d685e5e
Merge branch 'wowsims:master' into master
Patrick-Hogeveen May 27, 2025
80b9f3e
Mistweaver changes
Patrick-Hogeveen May 27, 2025
2687aab
Merge branch 'master' of https://github.com/Patrick-Hogeveen/mop
Patrick-Hogeveen May 27, 2025
ce9108c
Merge branch 'wowsims:master' into master
Patrick-Hogeveen Jun 6, 2025
2bdec85
Working on making monk spells functional
Patrick-Hogeveen Jun 6, 2025
668dd2a
Merge branch 'master' of https://github.com/Patrick-Hogeveen/mop
Patrick-Hogeveen Jun 6, 2025
bf11a9e
Merge branch 'wowsims:master' into master
Patrick-Hogeveen Jun 22, 2025
26cca5c
Merge branch 'wowsims:master' into master
Patrick-Hogeveen Jun 22, 2025
590b2ab
Added cast while channeling logic
Patrick-Hogeveen Jun 22, 2025
93a5f01
Merge branch 'master' of https://github.com/Patrick-Hogeveen/mop
Patrick-Hogeveen Jun 22, 2025
aaf950e
Merge branch 'wowsims:master' into master
Patrick-Hogeveen Jun 25, 2025
2cdfa93
Merge branch 'wowsims:master' into master
Patrick-Hogeveen Jun 26, 2025
7c773ef
Merge branch 'master' of https://github.com/Patrick-Hogeveen/mop
Patrick-Hogeveen Jun 26, 2025
ea67b07
Merge branch 'wowsims:master' into master
Patrick-Hogeveen Jun 28, 2025
8e59baa
Merge branch 'master' of https://github.com/Patrick-Hogeveen/mop
Patrick-Hogeveen Jun 28, 2025
42ca540
Merge branch 'wowsims:master' into master
Patrick-Hogeveen Jun 29, 2025
22ba653
Merge branch 'master' of https://github.com/Patrick-Hogeveen/mop
Patrick-Hogeveen Jun 29, 2025
0f986db
Merge branch 'wowsims:master' into master
Patrick-Hogeveen Jun 29, 2025
b173c2d
Soothing mist fix + passives
Patrick-Hogeveen Jun 29, 2025
ce8f36a
Merge branch 'master' of https://github.com/Patrick-Hogeveen/mop
Patrick-Hogeveen Jun 29, 2025
bc16a63
channel fix + monk core changes
Patrick-Hogeveen Jun 29, 2025
10f82a9
Merge branch 'wowsims:master' into master
Patrick-Hogeveen Jun 30, 2025
09f417e
Remove debug prints
Patrick-Hogeveen Jun 30, 2025
67ca075
Merge branch 'master' of https://github.com/Patrick-Hogeveen/mop
Patrick-Hogeveen Jul 1, 2025
894f836
Fix muscle memory passive
Patrick-Hogeveen Jul 1, 2025
5563765
Vital mists implementation
Patrick-Hogeveen Jul 2, 2025
9b5d21a
Fix spell_mod function placements in code
Patrick-Hogeveen Jul 2, 2025
258aa4c
Soothing mist aura consolidation
Patrick-Hogeveen Jul 4, 2025
b4dcd50
Changes / fixes based on pr draft comments
Patrick-Hogeveen Jul 10, 2025
eb1e58c
Mistweaver aura updates
Patrick-Hogeveen Jul 14, 2025
ff438d4
Merge branch 'master' of github.com:wowsims/mop
Patrick-Hogeveen Jul 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion sim/core/apl.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package core

import (
"fmt"
"slices"
"time"

"github.com/wowsims/mop/sim/core/proto"
Expand All @@ -23,6 +24,8 @@ type APLRotation struct {
// If true, can recast channel when interrupted.
allowChannelRecastOnInterrupt bool

//Checking for cast-while-channeling spells to allow the APL to not evaluate during channels unless absolutely necessary
allowCastWhileChanneling bool

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This field could be removed if you go with my previous suggestion.

// Used inside of actions/value to determine whether they will occur during the prepull or regular rotation.
parsingPrepull bool

Expand Down Expand Up @@ -265,6 +268,11 @@ func (rot *APLRotation) reset(sim *Simulation) {
rot.inLoop = false
rot.interruptChannelIf = nil
rot.allowChannelRecastOnInterrupt = false

//rot.allowCastWhileChanneling = slices.ContainsFunc(rot.unit.Spellbook, func(spell *Spell) bool {
Comment thread
NerdEgghead marked this conversation as resolved.
// return spell.Flags.Matches(SpellFlagCastWhileChanneling)
//})
Comment on lines +269 to +271

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

General comment: delete any unused commented code like this for cleanliness once you are done debugging.


for _, action := range rot.allAPLActions() {
action.impl.Reset(sim)
}
Expand All @@ -282,7 +290,12 @@ func (apl *APLRotation) DoNextAction(sim *Simulation) {
return
}

if apl.unit.ChanneledDot != nil {
//Probably not the best solution, added so apl evaluates if a spell can be cast while channeling during runtime rather than on reset
apl.allowCastWhileChanneling = slices.ContainsFunc(apl.unit.Spellbook, func(spell *Spell) bool {
return spell.Flags.Matches(SpellFlagCastWhileChanneling)
})

if apl.unit.ChanneledDot != nil && !apl.allowCastWhileChanneling {
return
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there's a simpler solution for this: you can permanently add SpellFlagCastWhileChanneling to Soothing Mist, then all you have to check is

if (apl.unit.ChanneledDot != nil) && !apl.unit.ChanneledDot.Spell.Matches(SpellFlagCastWhileChanneling) {
    return
}


Expand Down
4 changes: 4 additions & 0 deletions sim/core/cast.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,10 @@ func (spell *Spell) makeCastFunc(config CastConfig) CastSuccessFunc {
return spell.castFailureHelper(sim, "casting/channeling %v for %s, curTime = %s", hc.ActionID, hc.Expires-sim.CurrentTime, sim.CurrentTime)
}

if dot := spell.Unit.ChanneledDot; spell.Unit.IsChanneling(sim) && !spell.Flags.Matches(SpellFlagCastWhileChanneling) && (spell.Unit.Rotation.interruptChannelIf == nil || !spell.Unit.Rotation.interruptChannelIf.GetBool(sim)) {
return spell.castFailureHelper(sim, "channeling %v for %s, curTime = %s", dot.ActionID, dot.expires-sim.CurrentTime, sim.CurrentTime)
}

if effectiveTime := spell.CurCast.EffectiveTime(); effectiveTime != 0 {

// do not add channeled time here as they have variable cast length
Expand Down
1 change: 1 addition & 0 deletions sim/core/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ const (
SpellFlagCannotBeDodged // Ignores dodge in physical hit rolls
SpellFlagBinary // Does not do partial resists and could need a different hit roll.
SpellFlagChanneled // Spell is channeled
SpellFlagCastWhileChanneling // Spell can be cast while channeling
SpellFlagDisease // Spell is categorized as disease
SpellFlagHelpful // For healing spells / buffs.
SpellFlagMeleeMetrics // Marks a spell as a melee ability for metrics.
Expand Down
3 changes: 2 additions & 1 deletion sim/core/spell.go
Original file line number Diff line number Diff line change
Expand Up @@ -571,10 +571,11 @@ func (spell *Spell) CanCast(sim *Simulation, target *Unit) bool {
}

// While casting or channeling, no other action is possible
if spell.Unit.Hardcast.Expires > sim.CurrentTime {
if (spell.Unit.Hardcast.Expires > sim.CurrentTime || spell.Unit.IsChanneling(sim)) && !spell.Flags.Matches(SpellFlagCastWhileChanneling) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add the same correction to the CanQueue() method within sim/core/spell_queueing.go.

//if sim.Log != nil {
// sim.Log("Cant cast because already casting/channeling")
//}

return false
}

Expand Down
16 changes: 16 additions & 0 deletions sim/core/spell_mod.go
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,9 @@ const (
// Enables casting while moving
SpellMod_AllowCastWhileMoving

// Enables casting while channeling
SpellMod_AllowCastWhileChanneling

// Add/subtract bonus spell power
// Uses: FloatValue
SpellMod_BonusSpellPower_Flat
Expand Down Expand Up @@ -448,6 +451,11 @@ var spellModMap = map[SpellModType]*SpellModFunctions{
Remove: removeAllowCastWhileMoving,
},

SpellMod_AllowCastWhileChanneling: {
Apply: applyAllowCastWhileChanneling,
Remove: removeAllowCastWhileChanneling,
},

SpellMod_BonusSpellPower_Flat: {
Apply: applyBonusSpellPowerFlat,
Remove: removeBonusSpellPowerFlat,
Expand Down Expand Up @@ -680,6 +688,14 @@ func removeAllowCastWhileMoving(mod *SpellMod, spell *Spell) {
spell.Flags ^= SpellFlagCanCastWhileMoving
}

func applyAllowCastWhileChanneling(mod *SpellMod, spell *Spell) {
Comment thread
1337LutZ marked this conversation as resolved.
spell.Flags |= SpellFlagCastWhileChanneling
}

func removeAllowCastWhileChanneling(mod *SpellMod, spell *Spell) {
spell.Flags ^= SpellFlagCastWhileChanneling
}

func applyBonusSpellPowerFlat(mod *SpellMod, spell *Spell) {
spell.BonusSpellPower += mod.floatValue
}
Expand Down
4 changes: 4 additions & 0 deletions sim/core/unit.go
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,10 @@ func (unit *Unit) InitialCastSpeed() float64 {
return unit.initialCastSpeed
}

func (unit *Unit) IsChanneling(sim *Simulation) bool {
return unit.ChanneledDot != nil
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sim argument here is unused and can be omitted.


func (unit *Unit) SpellGCD() time.Duration {
return max(GCDMin, unit.ApplyCastSpeed(GCDDefault))
}
Expand Down
6 changes: 6 additions & 0 deletions sim/monk/blackout_kick.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ func blackoutKickSpellConfig(monk *Monk, isSEFClone bool, overrides core.SpellCo
func (monk *Monk) registerBlackoutKick() {
chiMetrics := monk.NewChiMetrics(blackoutKickActionID)
chiCost := int32(2)
manaMetrics := monk.NewManaMetrics(blackoutKickActionID)

monk.RegisterSpell(blackoutKickSpellConfig(monk, false, core.SpellConfig{
Cast: core.CastConfig{
Expand All @@ -92,6 +93,11 @@ func (monk *Monk) registerBlackoutKick() {
} else {
monk.SpendChi(sim, chiCost, chiMetrics)
}

if monk.MuscleMemoryAura.IsActive() {
result.Damage += result.Damage * 1.5

@1337LutZ 1337LutZ Aug 11, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should probably become a 0.5 DamageDonePct SpellMod on the Aura itself, because right now you are actually not going a 150% mod, but 250%. (100% of the original result + 150% of the original result * 1.5)

monk.AddMana(sim, monk.MaxMana()*0.04, manaMetrics)
}
}

spell.DealOutcome(sim, result)
Expand Down
4 changes: 3 additions & 1 deletion sim/monk/jab.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ func (monk *Monk) registerJab() {
Refund: 0.8,
},
ManaCost: core.ManaCostOptions{
BaseCostPercent: core.TernaryFloat64(monk.StanceMatches(WiseSerpent), 8, 0),
//This is wrong? But works?
BaseCostPercent: core.TernaryFloat64(monk.StanceMatches(WiseSerpent), 0, 8),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reminder to figure out what the underlying bug is here and fix it

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a bit confused myself, the intention behind the original I assume was to have the mana cost be set if the player is in wise serpent stance. However when running the sim the mana cost of jab was zero. Replacing it with the above now had it properly costing mana or simply replacing it with the mana cost sans TernaryFloat64 also works and doesn't seem to disrupt the other monk sims from what I can tell.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would leave in the costs, and then if needed based on the active Stance aura enable/disable a SpellMod that reduces the costs

},

Cast: core.CastConfig{
Expand All @@ -84,6 +85,7 @@ func (monk *Monk) registerJab() {
},

ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) {

baseDamage := monk.CalculateMonkStrikeDamage(sim, spell)
result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialHitAndCrit)

Expand Down
82 changes: 82 additions & 0 deletions sim/monk/mistweaver/enveloping_mist.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package mistweaver

import (
"time"

"github.com/wowsims/mop/sim/core"
"github.com/wowsims/mop/sim/monk"
)

func (mw *MistweaverMonk) registerEnvelopingMist() {
actionID := core.ActionID{SpellID: 124682}
chiMetrics := mw.NewChiMetrics(actionID)
spellCoeff := 0.45

mw.enevelopingMist = mw.RegisterSpell(core.SpellConfig{
ActionID: actionID,
SpellSchool: core.SpellSchoolNature,
ProcMask: core.ProcMaskSpellHealing,
Flags: core.SpellFlagHelpful | core.SpellFlagAPL, // | core.SpellFlagCastWhileChanneling,
Comment on lines +19 to +20

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you intend to comment out the extra flag here?

ClassSpellMask: monk.MonkSpellEnvelopingMist,

ManaCost: core.ManaCostOptions{BaseCostPercent: 0},
Comment on lines +22 to +23

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can just omit this field if the cost is 0.

Cast: core.CastConfig{
DefaultCast: core.Cast{
GCD: core.GCDDefault,
CastTime: time.Millisecond * 2000,
},
},
DamageMultiplier: 1,
ThreatMultiplier: 1,
CritMultiplier: mw.DefaultCritMultiplier(),

ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool {
return mw.GetChi() >= 3
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

General comment for code readability: use _ as the variable name for any unused function inputs.


ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) {

mw.SpendChi(sim, 3, chiMetrics)
spell.RelatedDotSpell.Cast(sim, &mw.Unit)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be cast on the supplied target input rather than exclusively self-cast, so that it will still work when healing any configured target dummies.

},
})

mw.enevelopingMist.RelatedDotSpell = mw.RegisterSpell(core.SpellConfig{
ActionID: actionID,
SpellSchool: core.SpellSchoolNature,
ProcMask: core.ProcMaskSpellHealing,
Flags: core.SpellFlagHelpful,
//ClassSpellMask: monk.MonkSpellEnvelopingMist,

Comment on lines +51 to +52

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you intend to comment out the spell mask here?

DamageMultiplier: 1,
ThreatMultiplier: 1,
CritMultiplier: mw.DefaultCritMultiplier(),
Hot: core.DotConfig{
Aura: core.Aura{
Label: "Enveloping Mist",
},
NumberOfTicks: 6,
TickLength: 1 * time.Second,
AffectedByCastSpeed: true,
HasteReducesDuration: true,
OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, _ bool) {
dot.SnapshotBaseDamage = 0 + mw.CalcScalingSpellDmg(spellCoeff)
dot.SnapshotAttackerMultiplier = dot.Spell.CasterHealingMultiplier()
},

OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) {
dot.CalcAndDealPeriodicSnapshotHealing(sim, target, dot.OutcomeTick)

},
},

ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) {
//Targets only mw currently
hot := spell.Hot(&mw.Unit)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment - if you use the CastFriendlySpell APL action, then this should be able to support arbitrary friendly targets.


hot.Apply(sim)

},
})
}
102 changes: 102 additions & 0 deletions sim/monk/mistweaver/mana_tea.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package mistweaver

import (
"math"
"time"

"github.com/wowsims/mop/sim/core"
"github.com/wowsims/mop/sim/core/stats"
"github.com/wowsims/mop/sim/monk"
)

func (mw *MistweaverMonk) registerManaTea() {

buffActionID := core.ActionID{SpellID: 115294}
stackActionID := core.ActionID{SpellID: 123766}
manaMetrics := mw.NewManaMetrics(buffActionID)
manaPerTick := 0.0
//numerOFTicks := 6

mw.Monk.RegisterOnChiSpent(func(sim *core.Simulation, chiSpent int32) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mw.RegisterOnChiSpent should work

accumulatedChi := mw.outstandingChi + chiSpent

for accumulatedChi >= 4 {

mw.AddBrewStacks(sim, 1)
accumulatedChi -= 4
}

mw.outstandingChi = accumulatedChi

})

mw.ManaTeaStackAura = mw.RegisterAura(core.Aura{
Label: "Mana Tea Stacks" + mw.Label,
ActionID: stackActionID,
Duration: time.Hour,
MaxStacks: 10,
})

mw.Monk.RegisterOnNewBrewStacks(func(sim *core.Simulation, stacksToAdd int32) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mw.RegisterOnNewBrewStacks should work

mw.ManaTeaStackAura.Activate(sim)

procChance := mw.GetStat(stats.SpellCritPercent)

if sim.Proc(math.Mod(procChance, 1), "Mana Tea") {
stacksToAdd += 1
}
Comment on lines +43 to +46

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't seem correct, it would set the proc chance to 99% if your current Spell Crit chance is 1.99% for example.


mw.ManaTeaStackAura.SetStacks(sim, mw.ManaTeaStackAura.GetStacks()+stacksToAdd)
})

mw.RegisterSpell(core.SpellConfig{
ActionID: buffActionID,
Flags: core.SpellFlagAPL | core.SpellFlagNoOnCastComplete | core.SpellFlagHelpful | core.SpellFlagChanneled,
ClassSpellMask: monk.MonkSpellManaTea,

Cast: core.CastConfig{
DefaultCast: core.Cast{
GCD: time.Millisecond * 1000,
},
},

Hot: core.DotConfig{
SelfOnly: true,
Aura: core.Aura{
Label: "Mana Tea",
Duration: 3 * time.Second, //Set at activation
},
NumberOfTicks: 6,
TickLength: 500 * time.Millisecond,
AffectedByCastSpeed: false, //?
OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) {
mw.manaTeaAura = dot.Aura
},
Comment on lines +71 to +73

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

General comment for readability: replace any unused function inputs (in this case sim, target, and isRollover) with _.

OnTick: func(sim *core.Simulation, target *core.Unit, spell *core.Dot) {
mw.AddMana(sim, manaPerTick, manaMetrics)

mw.ManaTeaStackAura.SetStacks(sim, mw.ManaTeaStackAura.GetStacks()-1)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can simplify this to

mw.ManaTeaStackAura.RemoveStack(sim)


},
},

ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool {

return mw.ManaTeaStackAura.GetStacks() > 0
},

ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) {
manaPerTick = mw.MaxMana() * 0.05 //Patched to restore 5% instead of original 4%

hot := spell.SelfHot()
stacksToUse := min(mw.ManaTeaStackAura.GetStacks(), 6.0)
hot.Duration = time.Duration(stacksToUse) * 500 * time.Millisecond
hot.BaseTickCount = stacksToUse
hot.Activate(sim)
//mw.ManaTeaStackAura.SetStacks(sim, mw.ManaTeaStackAura.GetStacks()-1)

//spell.SelfHot().Apply(sim)

},
})
}
21 changes: 21 additions & 0 deletions sim/monk/mistweaver/mistweaver.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,17 @@ func NewMistweaverMonk(character *core.Character, options *proto.Player) *Mistwe

type MistweaverMonk struct {
*monk.Monk

ManaTeaStackAura *core.Aura

renewingMist *core.Spell
enevelopingMist *core.Spell

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo, should be envelopingMist

JadeSerpentAura *core.Aura
//May move this to monk as both ww and mw use this
outstandingChi int32

manaTeaAura *core.Aura
}

func (mw *MistweaverMonk) GetMonk() *monk.Monk {
Expand All @@ -68,11 +79,21 @@ func (mw *MistweaverMonk) ApplyTalents() {
}

func (mw *MistweaverMonk) Reset(sim *core.Simulation) {
mw.outstandingChi = 0
mw.Monk.Reset(sim)
}

func (mw *MistweaverMonk) RegisterSpecializationEffects() {
mw.RegisterMastery()
mw.registerRenewingMist()
mw.registerSurgingMist()
mw.registerSoothingMist()
mw.registerEnvelopingMist()
mw.registerUplift()
mw.registerRevival()
mw.registerSummonJadeSerpentStatue()
mw.registerManaTea()
mw.registerPassives()
}

func (mw *MistweaverMonk) RegisterMastery() {
Expand Down
Loading