shaman

package
v1.9.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 13, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Index

Constants

View Source
const (
	StormfuryTotem           = 31031
	TotemOfAncestralGuidance = 32330
	TotemOfImpact            = 27947
	TotemOfStorms            = 23199
	TotemOfThePulsingEarth   = 29389
	TotemOfTheVoid           = 28248
	TotemOfRage              = 22395
)

Totem Item IDs

View Source
const (
	SpellFlagShock    = core.SpellFlagAgentReserved1
	SpellFlagElectric = core.SpellFlagAgentReserved2
	SpellFlagTotem    = core.SpellFlagAgentReserved3
)
View Source
const (
	AirTotem int = iota
	EarthTotem
	FireTotem
	WaterTotem
)

Indexes into NextTotemDrops for self buffs

View Source
const (
	CastTagLightningOverload int32 = 1 // This could be value or bitflag if we ended up needing multiple flags at the same time.
)
View Source
const TotemRefreshTime2M = time.Second * 115

Start looking to refresh 2 minute totems at 1:55.

Variables

View Source
var ItemSetCataclysmHarness = core.NewItemSet(core.ItemSet{
	Name: "Cataclysm Harness",
	Bonuses: map[int32]core.ApplyEffect{
		4: func(agent core.Agent) {

		},
	},
})
View Source
var ItemSetCataclysmRegalia = core.NewItemSet(core.ItemSet{
	Name: "Cataclysm Regalia",
	Bonuses: map[int32]core.ApplyEffect{
		4: func(agent core.Agent) {
			shaman := agent.(ShamanAgent).GetShaman()
			manaMetrics := shaman.NewManaMetrics(core.ActionID{SpellID: 37237})
			shaman.RegisterAura(core.Aura{
				Label:    "Cataclysm Regalia 4pc",
				Duration: core.NeverExpires,
				OnReset: func(aura *core.Aura, sim *core.Simulation) {
					aura.Activate(sim)
				},
				OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) {
					if spellEffect.ProcMask.Matches(core.ProcMaskMeleeOrRanged) {
						return
					}
					if !spellEffect.Outcome.Matches(core.OutcomeCrit) || sim.RandomFloat("cata4p") > 0.25 {
						return
					}
					shaman.AddMana(sim, 120, manaMetrics, false)
				},
			})
		},
	},
})
View Source
var ItemSetCycloneHarness = core.NewItemSet(core.ItemSet{
	Name: "Cyclone Harness",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {

		},
		4: func(agent core.Agent) {

		},
	},
})
View Source
var ItemSetCycloneRegalia = core.NewItemSet(core.ItemSet{
	Name: "Cyclone Regalia",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {

		},
		4: func(agent core.Agent) {
			shaman := agent.(ShamanAgent).GetShaman()

			procAura := shaman.RegisterAura(core.Aura{
				Label:    "Cyclone Regalia 4pc Proc",
				Duration: time.Second * 15,
				OnGain: func(aura *core.Aura, sim *core.Simulation) {
					aura.Unit.PseudoStats.CostReduction += 270
				},
				OnExpire: func(aura *core.Aura, sim *core.Simulation) {
					aura.Unit.PseudoStats.CostReduction -= 270
				},
				OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) {
					aura.Deactivate(sim)
				},
			})

			shaman.RegisterAura(core.Aura{
				Label:    "Cyclone Regalia 4pc",
				Duration: core.NeverExpires,
				OnReset: func(aura *core.Aura, sim *core.Simulation) {
					aura.Activate(sim)
				},
				OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, spellEffect *core.SpellEffect) {
					if spellEffect.ProcMask.Matches(core.ProcMaskMeleeOrRanged) {
						return
					}
					if !spellEffect.Outcome.Matches(core.OutcomeCrit) || sim.RandomFloat("cycl4p") > 0.11 {
						return
					}
					procAura.Activate(sim)
				},
			})
		},
	},
})
View Source
var ItemSetSkyshatterHarness = core.NewItemSet(core.ItemSet{
	Name: "Skyshatter Harness",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {

		},
		4: func(agent core.Agent) {

		},
	},
})
View Source
var ItemSetSkyshatterRegalia = core.NewItemSet(core.ItemSet{
	Name: "Skyshatter Regalia",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {
			shaman := agent.(ShamanAgent).GetShaman()

			if shaman.Totems.Air == proto.AirTotem_NoAirTotem ||
				shaman.Totems.Water == proto.WaterTotem_NoWaterTotem ||
				shaman.Totems.Earth == proto.EarthTotem_NoEarthTotem ||
				shaman.Totems.Fire == proto.FireTotem_NoFireTotem {
				return
			}

			shaman.AddStat(stats.MP5, 15)
			shaman.AddStat(stats.SpellCrit, 35)
			shaman.AddStat(stats.SpellPower, 45)
		},
		4: func(agent core.Agent) {

		},
	},
})
View Source
var ItemSetTidefury = core.NewItemSet(core.ItemSet{
	Name: "Tidefury Raiment",
	Bonuses: map[int32]core.ApplyEffect{
		2: func(agent core.Agent) {

		},
		4: func(agent core.Agent) {
			shaman := agent.(ShamanAgent).GetShaman()

			if shaman.SelfBuffs.WaterShield {
				shaman.AddStat(stats.MP5, 3)
			}
		},
	},
})
View Source
var StormstrikeActionID = core.ActionID{SpellID: 17364}
View Source
var TotemOfTheAstralWinds int32 = 27815

Functions

This section is empty.

Types

type SelfBuffs

type SelfBuffs struct {
	Bloodlust        bool
	WaterShield      bool
	SnapshotWOAT42Pc bool
	SnapshotSOET42Pc bool
}

Which buffs this shaman is using.

type Shaman

type Shaman struct {
	core.Character

	Talents   proto.ShamanTalents
	SelfBuffs SelfBuffs

	Totems proto.ShamanTotems

	// The type of totem which should be dropped next and time to drop it, for
	// each totem type (earth, air, fire, water).
	NextTotemDropType [4]int32
	NextTotemDrops    [4]time.Duration

	LightningBolt   *core.Spell
	LightningBoltLO *core.Spell

	ChainLightning    *core.Spell
	ChainLightningLOs []*core.Spell

	Stormstrike *core.Spell

	EarthShock *core.Spell
	FlameShock *core.Spell
	FrostShock *core.Spell

	FireNovaTotem        *core.Spell
	GraceOfAirTotem      *core.Spell
	MagmaTotem           *core.Spell
	ManaSpringTotem      *core.Spell
	SearingTotem         *core.Spell
	StrengthOfEarthTotem *core.Spell
	TotemOfWrath         *core.Spell
	TranquilAirTotem     *core.Spell
	TremorTotem          *core.Spell
	WindfuryTotem        *core.Spell
	WrathOfAirTotem      *core.Spell

	FlameShockDot    *core.Dot
	SearingTotemDot  *core.Dot
	MagmaTotemDot    *core.Dot
	FireNovaTotemDot *core.Dot

	ClearcastingAura     *core.Aura
	ElementalMasteryAura *core.Aura
	NaturesSwiftnessAura *core.Aura
	ShamanisticFocusAura *core.Aura
}

Shaman represents a shaman character.

func NewShaman

func NewShaman(character core.Character, talents proto.ShamanTalents, totems proto.ShamanTotems, selfBuffs SelfBuffs) *Shaman

func (*Shaman) AddPartyBuffs

func (shaman *Shaman) AddPartyBuffs(partyBuffs *proto.PartyBuffs)

func (*Shaman) AddRaidBuffs

func (shaman *Shaman) AddRaidBuffs(raidBuffs *proto.RaidBuffs)

func (*Shaman) ApplyFlametongueImbue

func (shaman *Shaman) ApplyFlametongueImbue(mh bool, oh bool)

func (*Shaman) ApplyFrostbrandImbue

func (shaman *Shaman) ApplyFrostbrandImbue(mh bool, oh bool)

func (*Shaman) ApplyRockbiterImbue

func (shaman *Shaman) ApplyRockbiterImbue(mh bool, oh bool)

func (*Shaman) ApplyTalents

func (shaman *Shaman) ApplyTalents()

func (*Shaman) ApplyWindfuryImbue

func (shaman *Shaman) ApplyWindfuryImbue(mh bool, oh bool)

func (*Shaman) BloodlustActionID

func (shaman *Shaman) BloodlustActionID() core.ActionID

func (*Shaman) ElementalCritMultiplier

func (shaman *Shaman) ElementalCritMultiplier() float64

func (*Shaman) FireNovaTickLength

func (shaman *Shaman) FireNovaTickLength() time.Duration

func (*Shaman) GetCharacter

func (shaman *Shaman) GetCharacter() *core.Character

func (*Shaman) Initialize

func (shaman *Shaman) Initialize()

func (*Shaman) NextTotemAt

func (shaman *Shaman) NextTotemAt(sim *core.Simulation) time.Duration

func (*Shaman) Reset

func (shaman *Shaman) Reset(sim *core.Simulation)

func (*Shaman) ShockCD

func (shaman *Shaman) ShockCD() time.Duration

func (*Shaman) TryDropTotems

func (shaman *Shaman) TryDropTotems(sim *core.Simulation) bool

TryDropTotems will check to see if totems need to be re-cast.

Returns whether we tried to cast a totem, regardless of whether it succeeded.

type ShamanAgent

type ShamanAgent interface {
	core.Agent

	// The Shaman controlled by this Agent.
	GetShaman() *Shaman
}

Implemented by each Shaman spec.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL