hunter

package
v0.0.182 Latest Latest
Warning

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

Go to latest
Published: Jan 6, 2026 License: MIT Imports: 4 Imported by: 0

Documentation

Index

Constants

View Source
const (
	HunterSpellFlagsNone int64 = 0
	SpellMaskSpellRanged int64 = 1 << iota
	HunterSpellAutoShot
	HunterSpellSteadyShot
	HunterSpellCobraShot
	HunterSpellArcaneShot
	HunterSpellKillCommand
	HunterSpellChimeraShot
	HunterSpellExplosiveShot
	HunterSpellExplosiveTrap
	HunterSpellBlackArrow
	HunterSpellMultiShot
	HunterSpellAimedShot
	HunterSpellSerpentSting
	HunterSpellKillShot
	HunterSpellRapidFire
	HunterSpellBestialWrath
	HunterPetFocusDump
	HunterPetDamage
	HunterPetBeastCleaveHit
	HunterSpellFervor
	HunterSpellDireBeast
	HunterSpellAMurderOfCrows
	HunterSpellLynxRush
	HunterSpellGlaiveToss
	HunterSpellBarrage
	HunterSpellPowershot
	HunterSpellsAll = HunterSpellSteadyShot | HunterSpellCobraShot |
		HunterSpellArcaneShot | HunterSpellKillCommand | HunterSpellChimeraShot | HunterSpellExplosiveShot |
		HunterSpellExplosiveTrap | HunterSpellBlackArrow | HunterSpellMultiShot | HunterSpellAimedShot |
		HunterSpellSerpentSting | HunterSpellKillShot | HunterSpellRapidFire | HunterSpellBestialWrath
	HunterSpellsTalents = HunterSpellFervor | HunterSpellDireBeast | HunterSpellAMurderOfCrows | HunterSpellLynxRush | HunterSpellGlaiveToss | HunterSpellPowershot | HunterSpellBarrage

	// These spells trigger auto shot when their cast time finishes
	HunterSpellsAutoOnCastComplete = HunterSpellCobraShot | HunterSpellAimedShot

	// These spells trigger auto shot when they are cast
	HunterSpellsAutoOnCast = HunterSpellSteadyShot | HunterSpellArcaneShot | HunterSpellChimeraShot |
		HunterSpellExplosiveShot | HunterSpellBlackArrow | HunterSpellMultiShot | HunterSpellSerpentSting | HunterSpellKillShot
)
View Source
const BiteSpellID = 17253

These IDs are needed for certain talents.

View Source
const ClawSpellID = 16827
View Source
const PetGCD = time.Millisecond * 1200

Pet AI doesn't use abilities immediately, so model this with a 1.2s GCD.

View Source
const SmackSpellID = 49966
View Source
const ThoridalTheStarsFuryItemID = 34334

Variables

View Source
var BattlegearOfTheUnblinkingVigil = core.NewItemSet(core.ItemSet{
	ID:   1195,
	Name: "Battlegear of the Unblinking Vigil",
	Bonuses: map[int32]core.ApplySetBonus{
		2: func(agent core.Agent, setBonusAura *core.Aura) {

			hunter := agent.(HunterAgent).GetHunter()

			var cdReduction time.Duration
			switch hunter.Spec {
			case proto.Spec_SpecBeastMasteryHunter, proto.Spec_SpecMarksmanshipHunter:
				cdReduction = time.Second * 4
			case proto.Spec_SpecSurvivalHunter:
				cdReduction = time.Second * 8
			}

			setBonusAura.AttachProcTrigger(core.ProcTrigger{
				Callback:       core.CallbackOnSpellHitDealt,
				ClassSpellMask: HunterSpellAimedShot | HunterSpellArcaneShot | HunterSpellMultiShot,

				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					if !hunter.RapidFire.CD.IsReady(sim) {
						hunter.RapidFire.CD.Reduce(cdReduction)
					}
				},
			})
		},
		4: func(agent core.Agent, setBonusAura *core.Aura) {

			hunter := agent.(HunterAgent).GetHunter()

			if hunter.Spec == proto.Spec_SpecSurvivalHunter {

				return
			}

			if hunter.Spec == proto.Spec_SpecMarksmanshipHunter {
				registerMarksmanT16(hunter, setBonusAura)
			} else {
				registerBeastMasteryT16(hunter, setBonusAura)
			}
		},
	},
})
View Source
var DefaultPetConfigs = [...]PetConfig{
	proto.HunterOptions_PetNone:      {},
	proto.HunterOptions_Bat:          {Name: "Bat", FocusDump: Smack},
	proto.HunterOptions_Bear:         {Name: "Bear", FocusDump: Claw, SpecialAbility: DemoralizingRoar},
	proto.HunterOptions_BirdOfPrey:   {Name: "Bird of Prey", FocusDump: Claw},
	proto.HunterOptions_Boar:         {Name: "Boar", FocusDump: Bite, SpecialAbility: Gore},
	proto.HunterOptions_CarrionBird:  {Name: "Carrion Bird", FocusDump: Bite, SpecialAbility: DemoralizingScreech},
	proto.HunterOptions_Cat:          {Name: "Cat", FocusDump: Claw},
	proto.HunterOptions_Chimaera:     {Name: "Chimaera", FocusDump: Bite, ExoticAbility: FroststormBreathAoE},
	proto.HunterOptions_CoreHound:    {Name: "Core Hound", FocusDump: Bite, ExoticAbility: LavaBreath},
	proto.HunterOptions_Crab:         {Name: "Crab", FocusDump: Claw},
	proto.HunterOptions_Crocolisk:    {Name: "Crocolisk", FocusDump: Bite},
	proto.HunterOptions_Devilsaur:    {Name: "Devilsaur", FocusDump: Bite, ExoticAbility: MonstrousBite},
	proto.HunterOptions_Dragonhawk:   {Name: "Dragonhawk", FocusDump: Bite, SpecialAbility: FireBreathDebuff},
	proto.HunterOptions_Fox:          {Name: "Fox", FocusDump: Bite, SpecialAbility: TailSpin},
	proto.HunterOptions_Gorilla:      {Name: "Gorilla", FocusDump: Smack},
	proto.HunterOptions_Hyena:        {Name: "Hyena", FocusDump: Bite},
	proto.HunterOptions_Moth:         {Name: "Moth", FocusDump: Smack},
	proto.HunterOptions_NetherRay:    {Name: "Nether Ray", FocusDump: Bite},
	proto.HunterOptions_Raptor:       {Name: "Raptor", FocusDump: Claw, SpecialAbility: TearArmor},
	proto.HunterOptions_Ravager:      {Name: "Ravager", FocusDump: Bite, SpecialAbility: Ravage},
	proto.HunterOptions_Rhino:        {Name: "Rhino", FocusDump: Bite, SpecialAbility: StampedeDebuff},
	proto.HunterOptions_Scorpid:      {Name: "Scorpid", FocusDump: Bite},
	proto.HunterOptions_Serpent:      {Name: "Serpent", FocusDump: Bite},
	proto.HunterOptions_Silithid:     {Name: "Silithid", FocusDump: Claw},
	proto.HunterOptions_Spider:       {Name: "Spider", FocusDump: Bite},
	proto.HunterOptions_SpiritBeast:  {Name: "Spirit Beast", FocusDump: Claw, ExoticAbility: SpiritMend},
	proto.HunterOptions_SporeBat:     {Name: "Spore Bat", FocusDump: Smack, SpecialAbility: SporeCloud},
	proto.HunterOptions_Tallstrider:  {Name: "Tallstrider", FocusDump: Claw, SpecialAbility: DustCloud},
	proto.HunterOptions_Turtle:       {Name: "Turtle", FocusDump: Bite},
	proto.HunterOptions_WarpStalker:  {Name: "Warp Stalker", FocusDump: Bite},
	proto.HunterOptions_Wasp:         {Name: "Wasp", FocusDump: Smack},
	proto.HunterOptions_WindSerpent:  {Name: "Wind Serpent", FocusDump: Bite, SpecialAbility: LightningBreath},
	proto.HunterOptions_Wolf:         {Name: "Wolf", FocusDump: Bite},
	proto.HunterOptions_Worm:         {Name: "Worm", FocusDump: Bite, SpecialAbility: AcidSpitDebuff, ExoticAbility: BurrowAttack},
	proto.HunterOptions_ShaleSpider:  {Name: "Shale Spider", FocusDump: Bite},
	proto.HunterOptions_Goat:         {Name: "Goat", FocusDump: Bite, SpecialAbility: Trample},
	proto.HunterOptions_Porcupine:    {Name: "Porcupine", FocusDump: Bite},
	proto.HunterOptions_Monkey:       {Name: "Monkey", FocusDump: Bite},
	proto.HunterOptions_Basilisk:     {Name: "Basilisk", FocusDump: Bite},
	proto.HunterOptions_Crane:        {Name: "Crane", FocusDump: Bite},
	proto.HunterOptions_Dog:          {Name: "Dog", FocusDump: Bite},
	proto.HunterOptions_Beetle:       {Name: "Beetle", FocusDump: Bite},
	proto.HunterOptions_Quilen:       {Name: "Quilen", FocusDump: Bite},
	proto.HunterOptions_WaterStrider: {Name: "Water Strider", FocusDump: Claw},
}
View Source
var ItemSetGladiatorsPursuit = core.NewItemSet(core.ItemSet{
	ID:   1108,
	Name: "Gladiator's Pursuit",
	Bonuses: map[int32]core.ApplySetBonus{
		2: func(_ core.Agent, setBonusAura *core.Aura) {
		},
		4: func(_ core.Agent, setBonusAura *core.Aura) {

			focusRegenMultiplier := 1.25
			setBonusAura.ApplyOnGain(func(aura *core.Aura, sim *core.Simulation) {
				aura.Unit.MultiplyFocusRegenSpeed(sim, focusRegenMultiplier)
			})
			setBonusAura.ApplyOnExpire(func(aura *core.Aura, sim *core.Simulation) {
				aura.Unit.MultiplyFocusRegenSpeed(sim, 1/focusRegenMultiplier)
			})
		},
	},
})
View Source
var SaurokStalker = core.NewItemSet(core.ItemSet{
	Name:                    "Battlegear of the Saurok Stalker",
	ID:                      1157,
	DisabledInChallengeMode: true,
	Bonuses: map[int32]core.ApplySetBonus{
		2: func(agent core.Agent, setBonusAura *core.Aura) {

			hunter := agent.(HunterAgent).GetHunter()

			summonThunderhawkSpell := hunter.RegisterSpell(core.SpellConfig{
				ActionID:    core.ActionID{SpellID: 138363},
				SpellSchool: core.SpellSchoolPhysical,
				Flags:       core.SpellFlagPassiveSpell,

				ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) {
					for _, thunderhawk := range hunter.Thunderhawks {
						if thunderhawk.IsActive() {
							continue
						}

						thunderhawk.EnableWithTimeout(sim, thunderhawk, time.Second*10)

						return
					}

					if sim.Log != nil {
						hunter.Log(sim, "No Thunderhawks available for the T15 2pc to proc, this is unreasonable.")
					}
				},
			})

			setBonusAura.AttachProcTrigger(core.ProcTrigger{
				Callback:       core.CallbackOnSpellHitDealt,
				ClassSpellMask: HunterSpellCobraShot | HunterSpellSteadyShot,
				DPM: hunter.NewSetBonusRPPMProcManager(138365,
					setBonusAura,
					core.ProcMaskRangedSpecial,
					core.RPPMConfig{
						PPM: 1.0,
					}.WithHasteMod(),
				),
				ICD: time.Millisecond * 250,

				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					summonThunderhawkSpell.Cast(sim, result.Target)
				},
			})
		},
		4: func(agent core.Agent, setBonusAura *core.Aura) {

			hunter := agent.(HunterAgent).GetHunter()

			lightningArrowSpell := hunter.RegisterSpell(core.SpellConfig{
				ActionID:     core.ActionID{SpellID: 138366},
				SpellSchool:  core.SpellSchoolNature,
				ProcMask:     core.ProcMaskRangedProc,
				Flags:        core.SpellFlagMeleeMetrics | core.SpellFlagRanged | core.SpellFlagPassiveSpell,
				MissileSpeed: 45,

				DamageMultiplier: 1.0,
				CritMultiplier:   hunter.DefaultCritMultiplier(),
				ThreatMultiplier: 1.0,

				ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) {
					wepDmg := hunter.AutoAttacks.Ranged().CalculateNormalizedWeaponDamage(sim, spell.RangedAttackPower())
					result := spell.CalcDamage(sim, target, wepDmg, spell.OutcomeRangedHitAndCrit)
					spell.WaitTravelTime(sim, func(sim *core.Simulation) {
						spell.DealDamage(sim, result)
					})
				},
			})

			setBonusAura.AttachProcTrigger(core.ProcTrigger{
				Callback:       core.CallbackOnSpellHitDealt,
				ClassSpellMask: HunterSpellArcaneShot | HunterSpellMultiShot | HunterSpellAimedShot,
				DPM: hunter.NewSetBonusRPPMProcManager(138367,
					setBonusAura,
					core.ProcMaskRangedSpecial,
					core.RPPMConfig{
						PPM: 3.0,
					}.WithHasteMod(),
				),
				ICD: time.Millisecond * 250,

				Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
					lightningArrowSpell.Cast(sim, result.Target)
				},
			})
		},
	},
})
View Source
var YaungolSlayersBattlegear = core.NewItemSet(core.ItemSet{
	Name:                    "Yaungol Slayer Battlegear",
	ID:                      1129,
	DisabledInChallengeMode: true,
	Bonuses: map[int32]core.ApplySetBonus{
		2: func(agent core.Agent, setBonusAura *core.Aura) {
			setBonusAura.AttachSpellMod(core.SpellModConfig{
				Kind:       core.SpellMod_DamageDone_Pct,
				ClassMask:  HunterSpellExplosiveShot,
				FloatValue: 0.05,
			})
			setBonusAura.AttachSpellMod(core.SpellModConfig{
				Kind:              core.SpellMod_DamageDone_Pct,
				ClassMask:         HunterSpellKillCommand,
				ShouldApplyToPets: true,
				FloatValue:        0.15,
			})

			setBonusAura.AttachSpellMod(core.SpellModConfig{
				Kind:       core.SpellMod_DamageDone_Pct,
				ClassMask:  HunterSpellChimeraShot,
				FloatValue: 0.15,
			})
		},
		4: func(agent core.Agent, setBonusAura *core.Aura) {

		},
	},
})

Functions

This section is empty.

Types

type Hunter

type Hunter struct {
	core.Character

	ClassSpellScaling float64

	Talents *proto.HunterTalents
	Options *proto.HunterOptions

	Pet          *HunterPet
	StampedePet  []*HunterPet
	DireBeastPet *HunterPet
	Thunderhawks []*ThunderhawkPet

	// Hunter spells
	AspectOfTheHawk      *core.Spell
	ExplosiveTrap        *core.Spell
	HuntersMarkSpell     *core.Spell
	ImprovedSerpentSting *core.Spell
	RapidFire            *core.Spell
	SerpentSting         *core.Spell

	BestialWrathAura *core.Aura
}

func NewHunter

func NewHunter(character *core.Character, options *proto.Player, hunterOptions *proto.HunterOptions) *Hunter

func (*Hunter) AddPartyBuffs

func (hunter *Hunter) AddPartyBuffs(_ *proto.PartyBuffs)

func (*Hunter) AddRaidBuffs

func (hunter *Hunter) AddRaidBuffs(raidBuffs *proto.RaidBuffs)

func (*Hunter) AddStatDependencies

func (hunter *Hunter) AddStatDependencies()

func (*Hunter) ApplyHotfixes

func (hunt *Hunter) ApplyHotfixes()

func (*Hunter) ApplyTalents

func (hunter *Hunter) ApplyTalents()

func (*Hunter) GetBaseDamageFromCoeff

func (hunter *Hunter) GetBaseDamageFromCoeff(coeff float64) float64

func (*Hunter) GetCharacter

func (hunter *Hunter) GetCharacter() *core.Character

func (*Hunter) GetHunter

func (hunter *Hunter) GetHunter() *Hunter

func (*Hunter) HasMajorGlyph

func (hunter *Hunter) HasMajorGlyph(glyph proto.HunterMajorGlyph) bool

func (*Hunter) HasMinorGlyph

func (hunter *Hunter) HasMinorGlyph(glyph proto.HunterMinorGlyph) bool

func (*Hunter) Initialize

func (hunter *Hunter) Initialize()

func (*Hunter) NewDireBeastPet

func (hunter *Hunter) NewDireBeastPet() *HunterPet

func (*Hunter) NewHunterPet

func (hunter *Hunter) NewHunterPet() *HunterPet

func (*Hunter) NewStampedePet

func (hunter *Hunter) NewStampedePet(index int) *HunterPet

func (*Hunter) NewThunderhawkPet added in v0.0.100

func (hunter *Hunter) NewThunderhawkPet(index int) *ThunderhawkPet

func (*Hunter) OnEncounterStart added in v0.0.13

func (hunter *Hunter) OnEncounterStart(sim *core.Simulation)

func (*Hunter) RegisterDireBeastSpell

func (hunter *Hunter) RegisterDireBeastSpell()

func (*Hunter) RegisterLynxRushSpell

func (hunter *Hunter) RegisterLynxRushSpell()

func (*Hunter) RegisterSpells

func (hunter *Hunter) RegisterSpells()

func (*Hunter) RegisterStampedeSpell

func (hunter *Hunter) RegisterStampedeSpell()

func (*Hunter) Reset

func (hunter *Hunter) Reset(_ *core.Simulation)

type HunterAgent

type HunterAgent interface {
	GetHunter() *Hunter
}

Agent is a generic way to access underlying hunter on any of the agents.

type HunterPet

type HunterPet struct {
	core.Pet

	BestialWrathAura *core.Aura
	FrenzyAura       *core.Aura
	BoarsSpeedAura   *core.Aura

	KillCommand *core.Spell

	Dash *core.Spell

	WHFocusIncreaseMod *core.SpellMod
	WHDamageMod        *core.SpellMod
	// contains filtered or unexported fields
}

func (*HunterPet) ApplyBoarsSpeed added in v0.0.150

func (hp *HunterPet) ApplyBoarsSpeed()

func (*HunterPet) ApplyCombatExperience

func (hp *HunterPet) ApplyCombatExperience()

func (*HunterPet) ApplySpikedCollar

func (hp *HunterPet) ApplySpikedCollar()

func (*HunterPet) ApplyTalents

func (hp *HunterPet) ApplyTalents()

func (*HunterPet) ExecuteCustomRotation

func (hp *HunterPet) ExecuteCustomRotation(sim *core.Simulation)

func (*HunterPet) GetPet

func (hp *HunterPet) GetPet() *core.Pet

func (*HunterPet) Initialize

func (hp *HunterPet) Initialize()

func (*HunterPet) NewPetAbility

func (hp *HunterPet) NewPetAbility(abilityType PetAbilityType, isPrimary bool) *core.Spell

func (*HunterPet) OnEncounterStart added in v0.0.13

func (hp *HunterPet) OnEncounterStart(_ *core.Simulation)

func (*HunterPet) RegisterDash added in v0.0.150

func (hp *HunterPet) RegisterDash() *core.Spell

func (*HunterPet) RegisterKillCommandSpell

func (hp *HunterPet) RegisterKillCommandSpell() *core.Spell

func (*HunterPet) Reset

func (hp *HunterPet) Reset(sim *core.Simulation)

type PetAbilityType

type PetAbilityType int
const (
	Unknown PetAbilityType = iota

	// Beast Master Specific Buffs
	AncientHysteria         // Corehound: Burst Haste
	EmbraceOfTheShaleSpider // Shale Spider: Kings
	QirajiFortitude         // Silithid: Stamina

	// Enemy Debuffs
	Gore                // Boar: Phys Dmg Taken ↑
	Ravage              // Ravager: Phys Dmg Taken ↑
	StampedeDebuff      // Rhino: Phys Dmg Taken ↑
	AcidSpitDebuff      // Worm: Phys Dmg Taken ↑
	DemoralizingRoar    // Bear: Enemy DPS ↓
	DemoralizingScreech // Carrion Bird: Enemy DPS ↓
	FireBreathDebuff    // Dragonhawk: Magic Dmg Taken ↑
	LightningBreath     // Wind Serpent: Magic Dmg Taken ↑
	SporeCloud          // Spore Bat: Reduce Cast Speed
	TailSpin            // Fox: Reduce Cast Speed
	Trample             // Goat: Reduce Cast Speed
	LavaBreath          // Corehound: Exotic Cast Speed Debuff
	DustCloud           // Tallstrider: Reduce Armor
	TearArmor           // Raptor: Reduce Armor

	// Utility
	BurrowAttack        // Worm: AoE Damage
	FroststormBreathAoE // Chimera: AoE Damage

	MonstrousBite // Devilsaur: Reduce Healing
	SpiritMend    // Spirit Beast: Healing

	// Basic Attacks
	Bite  // FocusDump: Bite
	Claw  // FocusDump: Claw
	Smack // FocusDump: Smack
)

type PetConfig

type PetConfig struct {
	Name string

	SpecialAbility PetAbilityType
	FocusDump      PetAbilityType
	ExoticAbility  PetAbilityType
}

type PetDebuffSpellConfig

type PetDebuffSpellConfig struct {
	DebuffAura func(*core.Unit) *core.Aura
	Stacks     int32
	SpellID    int32
	School     core.SpellSchool
	GCD        time.Duration
	CD         time.Duration
	MaxRange   float64

	OnSpellHitDealt func(*core.Simulation, *core.Spell, *core.SpellResult)
}

type ThunderhawkPet added in v0.0.100

type ThunderhawkPet struct {
	HunterPet

	LightningBlast *core.Spell
	// contains filtered or unexported fields
}

func (*ThunderhawkPet) ExecuteCustomRotation added in v0.0.100

func (tp *ThunderhawkPet) ExecuteCustomRotation(sim *core.Simulation)

func (*ThunderhawkPet) Initialize added in v0.0.100

func (tp *ThunderhawkPet) Initialize()

func (*ThunderhawkPet) RegisterLightningBlast added in v0.0.100

func (tp *ThunderhawkPet) RegisterLightningBlast() *core.Spell

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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