Register

Leafkiller's MoP Feral/Guardian Ovale Script

Face-rippin fun.

Moderator: Forum Administrators

Posts: 4
Joined: Tue Feb 25, 2014 11:46 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Druizz » Tue Feb 25, 2014 2:23 pm

Hello all, Like grayfox is having with leaf killer's script, I am to not getting the rake to be reapplied when it drops off of target. I have to reapply myself, then the script starts back t working

Exalted
User avatar
Posts: 1743
Joined: Mon May 24, 2010 10:21 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Tinderhoof » Tue Feb 25, 2014 7:09 pm

Using the spoiler flag can you please post the script you are using here? I am not seeing any issues currently.

Posts: 7
Joined: Sun Feb 23, 2014 6:53 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Grayfox23 » Tue Feb 25, 2014 8:23 pm

It's too big for one post so I'll split it into two
Spoiler: show
# Leafkiller's Feral/Guardian druid script, maintained by ShmooDude and aggixx.
# Support/Discussion thread: viewtopic.php?f=3&t=857
# 11/03/13 version 5.4.3.1
# Fixed rake filler comparison
# 10/24/13 version 5.4.3.0
# Took asValue=1 off {Ability}EnergySafetyMargin functions as they're used in portions of the script that need timestates
# Fixed TimeTilEnergyForMangle
# Added upto 0.9 for buff safety margin.
# 10/19/13 version 5.4.3.0
# Fixed rest of SoO trinket spell IDs
# Updated damage calculation functions to use asValue=1 so they're treated as constants
# Switched functions that only contained a number to use Define instead
# Changed logic of bleed prediction functions to be true when the buff is expiring instead of isn't and removed unnecessary energy check
# Changed many comparisons to use one node evaluations whenever possible
# Made cat abilities remove clearcasting buff when used and updated HasEnergyFor functions to check for clearcasting
# Switched to BuffAmount() function whenever possible to pull trinket proc values directly from buffs.
# Made AoE rotation use same filler conditions as Main rotation
# Removed mangle specific filler line
# Wrapped crit and mastery into their own functions
# Fixed crit to allow 100% crit vs higher level enemies
# 10/03/13 version 5.4.2.1
# Fixed rake bug
# Added check to ensure you'll have energy to use thrash at the end of a rune before suggesting it
# Reenabled bleed ratio prediction but added a mangle specific filler line that occurs shortly after the traditional filler line so something shows up till Ovale bug is fixed
# Update FoN logic
# Fix Haromm's spell ID
# 9/28/13 version 5.4.2.0
# Temporarily disabled bleed ratio prediction on filler rake until ovale fix can be implemented
# Removed some unnecessary conditionals from FillerActions
# Removed Tiger's Fury condition in TimeTilEnergyForAbility functions
# Reverted to manually calculating the energy cost and TimeTilEnergy for abilities due to weirdness with omen of clarity
# 9/26/13 version 5.4.1.0
# Only overwrite Rake at the end of a rune if its ratio is >75
# Changed potion logic to use the new TimeToHealthPercent() function
# 9/25/13 version 5.4.0.4
# Allowed Ferocious Bite to be used at TimeToDie <=16 without rip present
# Added crit suppression for damage calculations
# Added 20% Rip damage buff
# 9/24/13 version 5.4.0.3
# Changed Rip to use Last functions instead of target.Debuff functions to fix Rip extension bug
# Added Potion logic
# 9/18/13 version 5.4.0.2
# Switched to execute range Rip logic if TimeToDie <=16
# Thrash as filler if the initial hit out damages (per energy) Swipe for AoE rotation
# Added Energy based considerations for when to suggest applying an end of rune bleed
# Added Thrash clipping at end of Rune to normal rotation
# 9/13/13 version 5.4.0.1
# Fixed Incarnation
# Added Nature's Vigil for CD usage
# Modified Berserk check box description to "Suggest Long DPS cooldown(s)"
# Added an AoE rotation for cat
# Moved Bear AoE to its own box to match cat
# Modified checkboxes to have spec specific, more detailed descriptions where appropriate and for consistency
# Changed Big Cat Predictive box to show when on instead of off for consistency
# Changed Bear Small Rage Usage Boxes to be enabled with the same checkbox as Cat Small Predictive Box
# Allowed Small Rage Usage Boxes to coexist with left cooldown boxes
# Cleaned up icon tooltip information
# 9/09/13 version 5.4.0.0
# Added Feral Rage and Feral Fury buffs and logic
# Changed Nature's Swiftness to Ysera's Gift
# Updated FoN logic
# 9/06/13 version 5.4.0.0
# Added SoO trinkets to buff prediction
# Removed waiting on TF for Rip
# Only use fillers during TF for DoC
# Modified DoC Filler line to be less aggressive at building CPs
# Added Energy check for fillers
# 9/05/13 version 5.4.0.0
# Added end of Rune logic for Thrash and Rip
# Added <12 second SR logic, lowered the priority of FB and increased energy pooling for non-berserk FB
# Changed fillers to be used at 1.25 seconds from energy cap instead of 1.0.
# 9/02/13 version 5.4.0.0
# Fixed Savage Roar refresh logic
# Removed line for HotW+SotF that prevented energy pooling
# 8/29/13 version 5.4.0.0
# Defined buffs and ItemLists for new SoO trinkets
# Removed old FoN code, added FoN usage logic to "extraCD" box
# Changed BAD_JUJU and SOUL_CHARM to 10 second durations
# Updated DoC damage modifier to 1.30
# Added DoC as a damage buff to some damage-dealing abilities


############################
## Define Spells, Buffs, Items, Talents ##
############################

# Shared spells
Define(BARKSKIN 22812)
SpellInfo(BARKSKIN cd=60)
Define(FERAL_SPIRIT 110807)
SpellInfo(FERAL_SPIRIT cd=120)
Define(HEALING_TOUCH 5185)
Define(MARK_OF_THE_WILD 1126)
SpellInfo(MARK_OF_THE_WILD duration=3600)
SpellAddBuff(MARK_OF_THE_WILD MARK_OF_THE_WILD=1)
Define(SYMBIOSIS 110309)
SpellAddBuff(SYMBIOSIS SYMBIOSIS=1)
Define(WRATH 5176)
Define(HURRICANE 16914)
SpellInfo(HURRICANE duration=10 tick=1 haste=spell canStopChannelling=9 )

# Shared buffs
Define(DREAM_OF_CENARIUS 145152)
SpellInfo(DREAM_OF_CENARIUS duration=30)
Define(NATURES_VIGIL 124974)
SpellInfo(NATURES_VIGIL cd=180)
SpellAddBuff(NATURES_VIGIL NATURES_VIGIL=1)
Define(PREDATORY_SWIFTNESS 69369)
SpellAddBuff(PREDATORY_SWIFTNESS PREDATORY_SWIFTNESS=1)
Define(PRIMAL_FURY 16961)
Define(TRICKS 57933)
SpellAddBuff(TRICKS TRICKS=1)
Define(WEAKENED_ARMOR 113746)
SpellInfo(WEAKENED_ARMOR duration=30)
Define(WEAKENED_BLOWS 115798)
SpellInfo(WEAKENED_BLOWS duration=30)
Define(CLEARCASTING 135700)
Define(FERAL_FURY 144865)
SpellInfo(FERAL_FURY duration=6)
Define(FERAL_RAGE 146874)
SpellInfo(FERAL_RAGE duration=12)

# Trinket, Potion and Weapon Enchant buffs
Define(ROR_CRIT 139117)
SpellInfo(ROR_CRIT duration=10)
Define(ROR_MASTERY 139120)
SpellInfo(ROR_MASTERY duration=10)
Define(ROR_HASTE 139121)
SpellInfo(ROR_HASTE duration=10)
SpellList(ROR ROR_CRIT ROR_MASTERY ROR_HASTE)
Define(DANCING_STEEL 120032)
SpellInfo(DANCING_STEEL duration=12)
Define(SOUL_CHARM 138756)
SpellInfo(SOUL_CHARM duration=10)
Define(BLADES 138737)
Define(BAD_JUJU 138939)
SpellInfo(BAD_JUJU duration=10)
Define(VICIOUS_TALISMAN 138700)
SpellInfo(VICIOUS_TALISMAN duration=20)
Define(ASSURANCE_OF_CONSEQUENCE 146308)
SpellInfo(ASSURANCE_OF_CONSEQUENCE duration=20)
Define(HAROMMS_TALISMAN 148903)
SpellInfo(HAROMMS_TALISMAN duration=10)
Define(SIGIL_OF_RAMPAGE 148896)
SpellInfo(SIGIL_OF_RAMPAGE duration=15)
Define(TICKING_EBON_DETONATOR 146310)
SpellInfo(TICKING_EBON_DETONATOR duration=10)
Define(RESTLESS_AGILITY 146310)
Define(VIRMENS_BITE 105697)

# Shared items
ItemList(ROR_ITEM 94532 95802 96174 96546 96918)
ItemList(SOUL_CHARM_ITEM 96741 96369 95997 94512 95625)
ItemList(BAD_JUJU_ITEM 96781 96409 96037 94523 95665)
ItemList(VICIOUS_TALISMAN_ITEM 94511)
ItemList(ASSURANCE_OF_CONSEQUENCE_ITEM 104974 104725 102292 105223 104476 105472)
ItemList(HAROMMS_TALISMAN_ITEM 105029 104780 102301 105278 104531 105527)
ItemList(SIGIL_OF_RAMPAGE_ITEM 105082 104833 102302 105331 104584 105580)
ItemList(TICKING_EBON_DETONATOR_ITEM 105114 104865 102311 105363 104616 105612)
Define(VIRMENS_BITE_ITEM 76089)

# Talents
Define(YSERAS_GIFT_TALENT 4)
Define(RENEWAL_TALENT 5)
Define(CENARION_WARD_TALENT 6)
Define(FAERIE_SWARM_TALENT 7)
Define(TYPHOON_TALENT 9)
Define(SOUL_OF_THE_FOREST 10)
Define(INCARNATION_TALENT 11)
Define(FORCE_OF_NATURE_TALENT 12)
Define(MIGHTY_BASH_TALENT 15)
Define(HEART_OF_THE_WILD_TALENT 16)
Define(DREAM_OF_CENARIUS_TALENT 17)
Define(NATURES_VIGIL_TALENT 18)

# Talent spells
Define(CENARION_WARD 102351)
SpellInfo(CENARION_WARD cd=30)
Define(FORCE_OF_NATURE 106737)
SpellInfo(FORCE_OF_NATURE duration=15 cd=60)
Define(HEART_OF_THE_WILD 108292)
SpellInfo(HEART_OF_THE_WILD cd=360)
SpellAddBuff(HEART_OF_THE_WILD HEART_OF_THE_WILD=1)
Define(INCARNATION 106731)
SpellInfo(INCARNATION cd=180)
Define(MIGHTY_BASH 5211)
SpellInfo(MIGHTY_BASH cd=50)
Define(RENEWAL 108238)
SpellInfo(RENEWAL cd=120)
Define(TYPHOON 132469)
SpellInfo(TYPHOON cd=20)
Define(WILD_CHARGE 102401)
SpellInfo(WILD_CHARGE cd=15)

#Glyphs
Define(GLYPH_OF_SHRED 114234)
Define(GLYPH_OF_SAVAGERY 127540)

# Shared spells
Define(FAERIE_FERAL 770)
SpellInfo(FAERIE_FERAL duration=300 cd=6)
SpellAddTargetDebuff(FAERIE_FERAL FAERIE_FERAL=1 WEAKENED_ARMOR=1)
Define(FAERIE_SWARM 102355)
SpellInfo(FAERIE_SWARM duration=300 cd=6)
SpellAddTargetDebuff(FAERIE_SWARM FAERIE_SWARM=1 WEAKENED_ARMOR=1)

# Cat spells
Define(BERSERK_CAT 106951) #cat cd buff
SpellInfo(BERSERK_CAT duration=15 cd=180)
SpellAddBuff(BERSERK_CAT BERSERK_CAT=1)
Define(CAT_FORM 768)
SpellAddBuff(CAT_FORM CAT_FORM=1)
Define(FEROCIOUS_BITE 22568) #cat finish 25-50 energy
SpellInfo(FEROCIOUS_BITE combo=0)
SpellDamageBuff(FEROCIOUS_BITE DREAM_OF_CENARIUS=1.30)
SpellAddBuff(FEROCIOUS_BITE CLEARCASTING=0)
Define(INCARNATION_CAT 102543)
SpellInfo(INCARNATION_CAT duration=30 cd=180)
Define(MAIM 22570) #cat interrupt
SpellInfo(MAIM cd=10 combo=0)
SpellDamageBuff(MAIM DREAM_OF_CENARIUS=1.30)
SpellAddBuff(MAIM CLEARCASTING=0)
Define(MANGLE_CAT 33876) #cat bleed+debuff
SpellInfo(MANGLE_CAT inccounter=ripshreds combo=1)
SpellInfo(MANGLE_CAT critcombo=1 if_spell=PRIMAL_FURY)
SpellDamageBuff(MANGLE_CAT DREAM_OF_CENARIUS=1.30)
SpellDamageBuff(MANGLE_CAT FERAL_FURY=1.5)
SpellAddBuff(MANGLE_CAT CLEARCASTING=0)
Define(RAKE 1822) #cat bleed
SpellInfo(RAKE combo=1 duration=15 tick=3)
SpellInfo(RAKE base=99 bonusap=0.3)
SpellInfo(RAKE critcombo=1 if_spell=PRIMAL_FURY)
SpellAddTargetDebuff(RAKE RAKE=1)
SpellDamageBuff(RAKE DREAM_OF_CENARIUS=1.30)
SpellAddBuff(RAKE CLEARCASTING=0)
Define(RAVAGE 6785)
SpellInfo(RAVAGE inccounter=ripshreds combo=1)
SpellInfo(RAVAGE critcombo=1 if_spell=PRIMAL_FURY)
SpellDamageBuff(RAVAGE DREAM_OF_CENARIUS=1.30)
SpellDamageBuff(RAVAGE FERAL_FURY=1.5)
SpellAddBuff(RAVAGE CLEARCASTING=0)
Define(RAVAGE_BANG 102545)
SpellInfo(RAVAGE_BANG inccounter=ripshreds combo=1)
SpellInfo(RAVAGE_BANG critcombo=1 if_spell=PRIMAL_FURY)
SpellDamageBuff(RAVAGE_BANG DREAM_OF_CENARIUS=1.30)
SpellDamageBuff(RAVAGE_BANG FERAL_FURY=1.5)
SpellAddBuff(RAVAGE_BANG CLEARCASTING=0)
Define(RIP 1079) #cat bleed
SpellInfo(RIP resetcounter=ripshreds duration=16 tick=2 combo=0)
SpellAddTargetDebuff(RIP RIP=1)
SpellDamageBuff(RIP DREAM_OF_CENARIUS=1.30)
SpellAddBuff(RIP DREAM_OF_CENARIUS=1)
SpellAddBuff(RIP CLEARCASTING=0)
Define(SAVAGE_ROAR_OLD 52610)
SpellInfo(SAVAGE_ROAR_OLD duration=18 combo=0)
SpellAddBuff(SAVAGE_ROAR_OLD SAVAGE_ROAR_OLD=1)
Define(SAVAGE_ROAR_GLYPHED 127538)
SpellInfo(SAVAGE_ROAR_GLYPHED duration=12 combo=-5)
SpellAddBuff(SAVAGE_ROAR_GLYPHED SAVAGE_ROAR_GLYPHED=1)
SpellList(SAVAGE_ROAR 52610 127538)
Define(SHRED 5221) #cat behind
SpellInfo(SHRED inccounter=ripshreds combo=1)
SpellInfo(SHRED critcombo=1 if_spell=PRIMAL_FURY)
SpellDamageBuff(SHRED DREAM_OF_CENARIUS=1.30)
SpellDamageBuff(SHRED FERAL_FURY=1.5)
SpellAddBuff(SHRED CLEARCASTING=0)
Define(SHRED_BANG 114236)
SpellInfo(SHRED_BANG inccounter=ripshreds combo=1)
SpellInfo(SHRED_BANG critcombo=1 if_spell=PRIMAL_FURY)
SpellDamageBuff(SHRED_BANG DREAM_OF_CENARIUS=1.30)
SpellDamageBuff(SHRED_BANG FERAL_FURY=1.5)
SpellAddBuff(SHRED_BANG CLEARCASTING=0)
Define(STAMPEDE 81022)
SpellAddBuff(STAMPEDE STAMPEDE=1)
Define(SKULL_BASH_CAT 80965) #cat interrupt
SpellInfo(SKULL_BASH_CAT cd=15)
Define(THRASH_CAT 106830)
SpellInfo(THRASH_CAT duration=15 tick=3)
SpellAddTargetDebuff(THRASH_CAT THRASH_CAT=1 WEAKENED_BLOWS=1)
SpellDamageBuff(THRASH_CAT DREAM_OF_CENARIUS=1.30)
SpellAddBuff(THRASH_CAT CLEARCASTING=0)
Define(SWIPE_CAT 62078)
SpellInfo(SWIPE_CAT combo=1)
SpellDamageBuff(SWIPE_CAT DREAM_OF_CENARIUS=1.30)
SpellDamageBuff(SWIPE_CAT FERAL_FURY=1.5)
SpellAddBuff(SWIPE_CAT CLEARCASTING=0)
Define(TIGERS_FURY 5217) #cat buff
SpellInfo(TIGERS_FURY duration=6 cd=30)
SpellAddBuff(TIGERS_FURY TIGERS_FURY=1)

# Bear spells
Define(BEAR_FORM 5487)
SpellAddBuff(BEAR_FORM BEAR_FORM=1)
Define(BERSERK_BEAR 106952) #cat+bear cd buff
SpellInfo(BERSERK_BEAR duration=10 cd=180 )
SpellAddBuff(BERSERK_BEAR BERSERK_BEAR=1)
Define(ENRAGE 5229)
Define(FRENZIED_REGEN 22842)
Define(INCARNATION_BEAR 102558)
SpellInfo(INCARNATION_BEAR duration=30 cd=180 )
Define(LACERATE 33745)
Define(MANGLE_BEAR 33878)
SpellInfo(MANGLE_BEAR cd=3 buffnocd=INCARNATION_BEAR buffnocd=BERSERK_BEAR)
Define(MAUL 6807)
Define(MIGHT_OF_URSOC 106922)
Define(SAVAGE_DEFENSE 62606)
Define(SURVIVAL_INSTINCTS 61336)
Define(SWIPE_BEAR 779)
Define(THRASH_BEAR 77758)
Define(TOOTH_AND_CLAW 135286)
SpellAddBuff(TOOTH_AND_CLAW TOOTH_AND_CLAW=1)
Define(TOOTH_AND_CLAW_DEBUFF 135601)
SpellAddTargetDebuff(TOOTH_AND_CLAW_DEBUFF TOOTH_AND_CLAW_DEBUFF=1)

###############
## Define Settings ##
###############

AddCheckBox(cooldownsL "Left: DPS CD Boxes" default mastery=2)
AddCheckBox(cooldownsL "Left: Defensive CD Boxes" default mastery=3)
AddCheckBox(cooldownsR "Right: Bleed/SR Remain Boxes" default mastery=2)
AddCheckBox(cooldownsR "Right: Defensive CD Boxes" default mastery=3)
AddCheckBox(altpredictive "Left: Small Predictive Box" mastery=2)
AddCheckBox(altpredictive "Left: Small Rage Usage Boxes" mastery=3)
# AddCheckBox(bearaoe "Bear AoE Rotation") # Removed; AoE rotation is now its own box
AddCheckBox(showaoe "Right: AoE Rotation" default)
AddCheckBox(cooldownsRatio "Left: Rake/Rip Ratio Boxes" mastery=2)
AddCheckBox(cooldownsRatio "Don't change in Guardian" mastery=3)
AddCheckBox(lucioles SpellName(FAERIE_FERAL) default mastery=2)
AddCheckBox(berserk "Suggest Long DPS CD(s)" default mastery=2)
AddCheckBox(infront "Frontal attack" mastery=2)
AddCheckBox(predictive "Right: Big Predictive Box" mastery=2 default)
AddCheckBox(predictive "Right: Big Rage Usage Box" mastery=3 default)
# AddCheckBox(nvbounce "Use healing CDs for damage" mastery=2) # Currently unused
AddCheckBox(potion "Suggest Virmen's Bite Potion" mastery=2)
AddListItem(expbuffsafetymargin point0 "0.0 seconds" mastery=2)
AddListItem(expbuffsafetymargin point1 "0.1 seconds" mastery=2)
AddListItem(expbuffsafetymargin point2 "0.2 seconds" mastery=2)
AddListItem(expbuffsafetymargin point3 "0.3 seconds" mastery=2)
AddListItem(expbuffsafetymargin point4 "0.4 seconds" mastery=2)
AddListItem(expbuffsafetymargin point5 "0.5 seconds" mastery=2 default)
AddListItem(expbuffsafetymargin point6 "0.6 seconds" mastery=2)
AddListItem(expbuffsafetymargin point7 "0.7 seconds" mastery=2)
AddListItem(expbuffsafetymargin point8 "0.8 seconds" mastery=2)
AddListItem(expbuffsafetymargin point9 "0.9 seconds" mastery=2)

################
# Static Variables
################
Define(HeartOfTheWildAgiModifier 1.06)
Define(LeatherSpecAgiModifier 1.05)
Define(StatsBuffBonus 0.05)
Define(RakeBaseDamage 99)
Define(RakeDamagePerAttackPower 0.3)
Define(RipBaseDamage 136)
Define(RipDamagePerComboPoint 384)
Define(RipDamagePerComboPointAttackPower 0.05808)
Define(ThrashHitBaseDamage 1232)
Define(ThrashHitDamagePerAttackPower 0.191)
Define(SwipeCatWeaponDamageMultiplier 4.8)
Define(FerociousBiteBaseDamage 500)
Define(FerociousBiteDamagePerComboPoint 762)
Define(FerociousBiteDamagePerComboPointAttackPower 0.196)
Define(FerociousBiteCritChanceBonus 0.25)
Define(MangleCatBaseDamage 78)
Define(MangleCatWeaponDamageMultiplier 5)
Define(RavageBaseDamage 78)
Define(RavageWeaponDamageMultiplier 9.5)
Define(RavageCritChanceBonus 0.50)
Define(CritPerAttackPower 251904)
AddFunction LevelBasedCritSuppression asValue=1 { if target.RelativeLevel() >0 target.RelativeLevel()/100 0 }
AddFunction ExpiringBuffSafetyMargin asValue=1
{
if List(expbuffsafetymargin point0) 0.0
if List(expbuffsafetymargin point1) 0.1
if List(expbuffsafetymargin point2) 0.2
if List(expbuffsafetymargin point3) 0.3
if List(expbuffsafetymargin point4) 0.4
if List(expbuffsafetymargin point5) 0.5
if List(expbuffsafetymargin point6) 0.6
if List(expbuffsafetymargin point7) 0.7
if List(expbuffsafetymargin point8) 0.8
if List(expbuffsafetymargin point9) 0.9
0.5
}

################
# Trinket/Proc values
################
Define(TigersFuryMultiplier 1.15)
Define(RuneMultiplier 2) # Not the actual amount like the rest, but given the power of the rune buff the script should still function properly
Define(DancingSteelAttackPower 3300)
AddFunction SoulCharmAttackPower asValue=1
{
BuffAmount(BLADES)*2
}
AddFunction BadJujuAttackPower asValue=1
{
if HasTrinket(96781) 18864 # Heroic TF 2/2 upgrade
if HasTrinket(96409) 17840 # Heroic 2/2 upgrade
if HasTrinket(96037) 16712 # Normal TF 2/2 upgrade
if HasTrinket(94523) 15806 # Normal 2/2 upgrade
if HasTrinket(95665) 13118 # LFR 2/2 upgrade
}
AddFunction ViciousTalismanAttackPower asValue=1
{
17600 # 2/2 upgrade
}
AddFunction AssuranceOfConsequenceAttackPower asValue=1
{
BuffAmount(ASSURANCE_OF_CONSEQUENCE)*2
}
AddFunction HarommsTalismanAttackPower asValue=1
{
if HasTrinket(105527) 30248 # Heroic WF 2/2 upgrade
if HasTrinket(104531) 28606 # Heroic 2/2 upgrade
if HasTrinket(105278) 26798 # Normal WF 2/2 upgrade
if HasTrinket(102301) 25342 # Normal 2/2 upgrade
if HasTrinket(104780) 22452 # Flex 2/2 upgrade
if HasTrinket(105029) 20074 # LFR 2/2 upgrade
}
AddFunction SigilOfRampageAttackPower asValue=1
{
BuffAmount(SIGIL_OF_RAMPAGE)*2
}
AddFunction TickingEbonDetonatorAttackPower asValue=1
{
if HasTrinket(105612) 2750 # Heroic WF 2/2 upgrade
if HasTrinket(104616) 2600 # Heroic 2/2 upgrade
if HasTrinket(105363) 2436 # Normal WF 2/2 upgrade
if HasTrinket(102311) 2304 # Normal 2/2 upgrade
if HasTrinket(104865) 2042 # Flex 2/2 upgrade
if HasTrinket(105114) 1826 # LFR 2/2 upgrade
}

################
# Energy related functions
################
AddFunction EnergyForThrash asValue=1 { if BuffPresent(BERSERK_CAT) 25 50 }
AddFunction EnergyForRake asValue=1 { if BuffPresent(BERSERK_CAT) 18 35 }
AddFunction EnergyForRip asValue=1 { if BuffPresent(BERSERK_CAT) 15 30 }
AddFunction EnergyForMangle asValue=1 { if BuffPresent(BERSERK_CAT) 18 35 }
AddFunction EnergyForShred asValue=1 { if BuffPresent(BERSERK_CAT) 20 40 }
AddFunction EnergyForRavage asValue=1 { if BuffPresent(BERSERK_CAT) 23 45 }
AddFunction EnergyForFerociousBite asValue=1 { if BuffPresent(BERSERK_CAT) 25 50 }
AddFunction HasEnergyForThrash { Energy() >= EnergyForThrash() or BuffPresent(CLEARCASTING) }
AddFunction HasEnergyForRake { Energy() >= EnergyForRake() or BuffPresent(CLEARCASTING) }
AddFunction HasEnergyForRip { Energy() >= EnergyForRip() or BuffPresent(CLEARCASTING) }
AddFunction HasEnergyForMangle { Energy() >= EnergyForMangle() or BuffPresent(CLEARCASTING) }
AddFunction HasEnergyForShred { Energy() >= EnergyForShred() or BuffPresent(CLEARCASTING) }
AddFunction HasEnergyForFerociousBite { Energy() >= EnergyForFerociousBite() or BuffPresent(CLEARCASTING) }
AddFunction HasEnergyForRavage { Energy() >= EnergyForRavage() or BuffPresent(CLEARCASTING) }

################
# Armor and Mastery Functions
################
AddFunction ArmorReduction asValue=1
{
if target.DebuffPresent(WEAKENED_ARMOR any=1)
{
if target.Level(less 1) 0.679
0.698
}
if target.Level(less 1) 0.651
0.671
}
AddFunction CurrentMasteryMultiplier asValue=1 { 1+Mastery()/100 }

################
# Crit Chance Functions
################
AddFunction CurrentCritChanceRaw asValue=1 { 1+MeleeCritChance(unlimited=1)/100-LevelBasedCritSuppression() }
AddFunction CurrentCritChanceMultiplier asValue=1
{
if CurrentCritChanceRaw() > 2
2
CurrentCritChanceRaw()
}
AddFunction RakeDebuffCritChanceRaw asValue=1 { 1+target.DebuffMeleeCritChance(RAKE unlimited=1)/100-LevelBasedCritSuppression() }
AddFunction RakeDebuffCritChanceMultiplier asValue=1
{
if RakeDebuffCritChanceRaw() > 2
2
RakeDebuffCritChanceRaw()
}
AddFunction RipDebuffCritChanceRaw asValue=1 { 1+target.DebuffMeleeCritChance(RIP unlimited=1)/100-LevelBasedCritSuppression() }
AddFunction RipDebuffCritChanceMultiplier asValue=1
{
if RipDebuffCritChanceRaw() > 2
2
RipDebuffCritChanceRaw()
}
AddFunction FerociousBiteCritChanceRaw asValue=1 { FerociousBiteCritChanceBonus+CurrentCritChanceMultiplier() }
AddFunction FerociousBiteCritChanceMultiplier asValue=1
{
if FerociousBiteCritChanceRaw() > 2
2
FerociousBiteCritChanceRaw()
}
AddFunction RavageCritChanceRaw asValue=1 { RavageCritChanceBonus+CurrentCritChanceMultiplier() }
AddFunction RavageCritChanceMultiplier asValue=1
{
if target.HealthPercent(atLeast 80)
{
if RavageCritChanceRaw() > 2
2
RavageCritChanceRaw()
}
CurrentCritChanceMultiplier()
}


################
# Time till energy for abilities functions (must come before Rune functions)
# Moved energy check from functions to main code to fix predictive algorithm bug within ovale
# Always use an energy check when utilizing these functions or you will have a disappearing icon problem
# Example:
# if HasEnergyForRake() and target.DebuffRemains(RAKE less 3)
# or not HasEnergyForRake() and target.DebuffRemains(RAKE) < 3 + TimeTilEnergyForRake()
################
AddFunction TimeTilEnergyForThrash
{
if HasEnergyForThrash()
0
{ EnergyForThrash() - Energy() } / EnergyRegen()
}
AddFunction TimeTilEnergyForRake
{
if HasEnergyForRake()
0
{ EnergyForRake() - Energy() } / EnergyRegen()
}
AddFunction TimeTilEnergyForRip
{
if HasEnergyForRip()
0
{ EnergyForRip() - Energy() } / EnergyRegen()
}
AddFunction TimeTilEnergyForMangle
{
if HasEnergyForMangle()
0
{ EnergyForMangle() - Energy() } / EnergyRegen()
}
AddFunction ThrashEnergySafetyMargin { TimeTilEnergyForThrash()+ExpiringBuffSafetyMargin() }
AddFunction RakeEnergySafetyMargin { TimeTilEnergyForRake()+ExpiringBuffSafetyMargin() }
AddFunction RipEnergySafetyMargin { TimeTilEnergyForRip()+ExpiringBuffSafetyMargin() }

################
# Cooldown check functions
################
AddFunction RakeCooldownSafetyMargin { SpellCooldown(RAKE)+ExpiringBuffSafetyMargin() }
AddFunction RipCooldownSafetyMargin { SpellCooldown(RIP)+ExpiringBuffSafetyMargin() }

################
# Buff Calculation assistance functions
################
AddFunction AttackPowerToCrit asValue=1 { 1/CritPerAttackPower/{1+0.1*BuffStacks(attack_power_multiplier any=1)} }
AddFunction PrimordiusStats asValue=1 { {1 + 0.05 * DebuffStacks(136184)} * {1 - 0.1 * DebuffStacks(136185)} } # Thick and Fragile bones
AddFunction StatsMultiplier asValue=1 # Leatherwearer, Heart of the Wild, Mark of the Wild/Blessing of Kings, Primordius Buffs
{
if TalentPoints(HEART_OF_THE_WILD)
LeatherSpecAgiModifier * HeartOfTheWildAgiModifier * {1 + StatsBuffBonus * BuffStacks(str_agi_int any=1)} * PrimordiusStats()
LeatherSpecAgiModifier * {1 + StatsBuffBonus * BuffStacks(str_agi_int any=1)} * PrimordiusStats()
}
AddFunction DancingSteelAttackPowerIncrease asValue=1 { DancingSteelAttackPower*StatsMultiplier() }
AddFunction SoulCharmAttackPowerIncrease asValue=1 { SoulCharmAttackPower()*StatsMultiplier() }
AddFunction BadJujuAttackPowerIncrease asValue=1 { BadJujuAttackPower()*StatsMultiplier() }
AddFunction ViciousTalismanAttackPowerIncrease asValue=1 { ViciousTalismanAttackPower()*StatsMultiplier() }
AddFunction AssuranceOfConsequenceAttackPowerIncrease asValue=1 { AssuranceOfConsequenceAttackPower()*StatsMultiplier() }
AddFunction HarommsTalismanAttackPowerIncrease asValue=1 { HarommsTalismanAttackPower()*StatsMultiplier() }
AddFunction SigilOfRampageAttackPowerIncrease asValue=1 { SigilOfRampageAttackPower()*StatsMultiplier() }
AddFunction TickingEbonDetonatorAttackPowerIncrease asValue=1 { TickingEbonDetonatorAttackPower()*BuffStacks(RESTLESS_AGILITY)*StatsMultiplier() }


################
# Rake Buff related functions; Checks to ensure you can use a Rake before a buff expires
################
AddFunction RuneRakeExpiresBeforeUsable asValue=1
{
BuffRemains(ROR_MASTERY) < RakeCooldownSafetyMargin()
or BuffRemains(ROR_MASTERY) < RakeEnergySafetyMargin()
}
AddFunction RuneExpiresRakeMultiplier asValue=1
{
if BuffPresent(ROR_MASTERY) and RuneRakeExpiresBeforeUsable() RuneMultiplier 1
}
AddFunction TigersFuryRakeExpiresBeforeUsable asValue=1
{
BuffRemains(TIGERS_FURY) < RakeCooldownSafetyMargin()
or BuffRemains(TIGERS_FURY) < RakeEnergySafetyMargin()
}
AddFunction TigersFuryExpiresRakeMultiplier asValue=1
{
if BuffPresent(TIGERS_FURY) and TigersFuryRakeExpiresBeforeUsable() TigersFuryMultiplier 1
}
AddFunction DancingSteelRakeExpiresBeforeUsable asValue=1
{
BuffRemains(DANCING_STEEL any=1) < RakeCooldownSafetyMargin()
or BuffRemains(DANCING_STEEL any=1) < RakeEnergySafetyMargin()
}
AddFunction DancingSteelExpiresRakeAttackPower asValue=1
{
if BuffPresent(DANCING_STEEL any=1) and DancingSteelRakeExpiresBeforeUsable() DancingSteelAttackPowerIncrease() 0
}
AddFunction SoulCharmRakeExpiresBeforeUsable asValue=1
{
BuffRemains(SOUL_CHARM any=1) < RakeCooldownSafetyMargin()
or BuffRemains(SOUL_CHARM any=1) < RakeEnergySafetyMargin()
}
AddFunction SoulCharmExpiresRakeAttackPower asValue=1
{
if BuffPresent(SOUL_CHARM any=1) and SoulCharmRakeExpiresBeforeUsable() SoulCharmAttackPowerIncrease() 0
}
AddFunction BadJujuRakeExpiresBeforeUsable asValue=1
{
BuffRemains(BAD_JUJU any=1) < RakeCooldownSafetyMargin()
or BuffRemains(BAD_JUJU any=1) < RakeEnergySafetyMargin()
}
AddFunction BadJujuExpiresRakeAttackPower asValue=1
{
if BuffPresent(BAD_JUJU any=1) and BadJujuRakeExpiresBeforeUsable() BadJujuAttackPowerIncrease() 0
}
AddFunction ViciousTalismanRakeExpiresBeforeUsable asValue=1
{
BuffRemains(VICIOUS_TALISMAN any=1) < RakeCooldownSafetyMargin()
or BuffRemains(VICIOUS_TALISMAN any=1) < RakeEnergySafetyMargin()
}
AddFunction ViciousTalismanExpiresRakeAttackPower asValue=1
{
if BuffPresent(VICIOUS_TALISMAN any=1) and ViciousTalismanRakeExpiresBeforeUsable() ViciousTalismanAttackPowerIncrease() 0
}
AddFunction AssuranceOfConsequenceRakeExpiresBeforeUsable asValue=1
{
BuffRemains(ASSURANCE_OF_CONSEQUENCE any=1) < RakeCooldownSafetyMargin()
or BuffRemains(ASSURANCE_OF_CONSEQUENCE any=1) < RakeEnergySafetyMargin()
}
AddFunction AssuranceOfConsequenceExpiresRakeAttackPower asValue=1
{
if BuffPresent(ASSURANCE_OF_CONSEQUENCE any=1) and AssuranceOfConsequenceRakeExpiresBeforeUsable() AssuranceOfConsequenceAttackPowerIncrease() 0
}
AddFunction HarommsTalismanRakeExpiresBeforeUsable asValue=1
{
BuffRemains(HAROMMS_TALISMAN any=1) < RakeCooldownSafetyMargin()
or BuffRemains(HAROMMS_TALISMAN any=1) < RakeEnergySafetyMargin()
}
AddFunction HarommsTalismanExpiresRakeAttackPower asValue=1
{
if BuffPresent(HAROMMS_TALISMAN any=1) and HarommsTalismanRakeExpiresBeforeUsable() HarommsTalismanAttackPowerIncrease() 0
}
AddFunction SigilOfRampageRakeExpiresBeforeUsable asValue=1
{
BuffRemains(SIGIL_OF_RAMPAGE any=1) < RakeCooldownSafetyMargin()
or BuffRemains(SIGIL_OF_RAMPAGE any=1) < RakeEnergySafetyMargin()
}
AddFunction SigilOfRampageExpiresRakeAttackPower asValue=1
{
if BuffPresent(SIGIL_OF_RAMPAGE any=1) and SigilOfRampageRakeExpiresBeforeUsable() SigilOfRampageAttackPowerIncrease() 0
}
AddFunction TickingEbonDetonatorRakeExpiresBeforeUsable asValue=1
{
BuffRemains(SIGIL_OF_RAMPAGE any=1) < RakeCooldownSafetyMargin()
or BuffRemains(SIGIL_OF_RAMPAGE any=1) < RakeEnergySafetyMargin()
}
AddFunction TickingEbonDetonatorExpiresRakeAttackPower asValue=1
{
if BuffPresent(TICKING_EBON_DETONATOR any=1)
{
if TickingEbonDetonatorRakeExpiresBeforeUsable() TickingEbonDetonatorAttackPowerIncrease()
TickingEbonDetonatorAttackPower()
}
0
}

################
# Rip Buff related functions; Checks to ensure you can use a Rip before a buff expires
################
AddFunction RuneRipExpiresBeforeUsable asValue=1
{
BuffRemains(ROR_MASTERY) < RipCooldownSafetyMargin()
or BuffRemains(ROR_MASTERY) < RipEnergySafetyMargin()
}
AddFunction RuneExpiresRipMultiplier asValue=1
{
if BuffPresent(ROR_MASTERY) and RuneRipExpiresBeforeUsable() RuneMultiplier 1
}
AddFunction TigersFuryRipExpiresBeforeUsable asValue=1
{
BuffRemains(TIGERS_FURY) < RipCooldownSafetyMargin()
or BuffRemains(TIGERS_FURY) < RipEnergySafetyMargin()
}
AddFunction TigersFuryExpiresRipMultiplier asValue=1
{
if BuffPresent(TIGERS_FURY) and TigersFuryRipExpiresBeforeUsable() TigersFuryMultiplier 1
}
AddFunction DancingSteelRipExpiresBeforeUsable asValue=1
{
BuffRemains(DANCING_STEEL any=1) < RipCooldownSafetyMargin()
or BuffRemains(DANCING_STEEL any=1) < RipEnergySafetyMargin()
}
AddFunction DancingSteelExpiresRipAttackPower asValue=1
{
if BuffPresent(DANCING_STEEL any=1) and DancingSteelRipExpiresBeforeUsable() DancingSteelAttackPowerIncrease() 0
}
AddFunction SoulCharmRipExpiresBeforeUsable asValue=1
{
BuffRemains(SOUL_CHARM any=1) < RipCooldownSafetyMargin()
or BuffRemains(SOUL_CHARM any=1) < RipEnergySafetyMargin()
}
AddFunction SoulCharmExpiresRipAttackPower asValue=1
{
if BuffPresent(SOUL_CHARM any=1) and SoulCharmRipExpiresBeforeUsable() SoulCharmAttackPowerIncrease() 0
}
AddFunction BadJujuRipExpiresBeforeUsable asValue=1
{
BuffRemains(BAD_JUJU any=1) < RipCooldownSafetyMargin()
or BuffRemains(BAD_JUJU any=1) < RipEnergySafetyMargin()
}
AddFunction BadJujuExpiresRipAttackPower asValue=1
{
if BuffPresent(BAD_JUJU any=1) and BadJujuRipExpiresBeforeUsable() BadJujuAttackPowerIncrease() 0
}
AddFunction ViciousTalismanRipExpiresBeforeUsable asValue=1
{
BuffRemains(VICIOUS_TALISMAN any=1) < RipCooldownSafetyMargin()
or BuffRemains(VICIOUS_TALISMAN any=1) < RipEnergySafetyMargin()
}
AddFunction ViciousTalismanExpiresRipAttackPower asValue=1
{
if BuffPresent(VICIOUS_TALISMAN any=1) and ViciousTalismanRipExpiresBeforeUsable() ViciousTalismanAttackPowerIncrease() 0
}
AddFunction AssuranceOfConsequenceRipExpiresBeforeUsable asValue=1
{
BuffRemains(ASSURANCE_OF_CONSEQUENCE any=1) < RipCooldownSafetyMargin()
or BuffRemains(ASSURANCE_OF_CONSEQUENCE any=1) < RipEnergySafetyMargin()
}
AddFunction AssuranceOfConsequenceExpiresRipAttackPower asValue=1
{
if BuffPresent(ASSURANCE_OF_CONSEQUENCE any=1) and AssuranceOfConsequenceRipExpiresBeforeUsable() AssuranceOfConsequenceAttackPowerIncrease() 0
}
AddFunction HarommsTalismanRipExpiresBeforeUsable asValue=1
{
BuffRemains(HAROMMS_TALISMAN any=1) < RipCooldownSafetyMargin()
or BuffRemains(HAROMMS_TALISMAN any=1) < RipEnergySafetyMargin()
}
AddFunction HarommsTalismanExpiresRipAttackPower asValue=1
{
if BuffPresent(HAROMMS_TALISMAN any=1) and HarommsTalismanRipExpiresBeforeUsable() HarommsTalismanAttackPowerIncrease() 0
}
AddFunction SigilOfRampageRipExpiresBeforeUsable asValue=1
{
BuffRemains(SIGIL_OF_RAMPAGE any=1) < RipCooldownSafetyMargin()
or BuffRemains(SIGIL_OF_RAMPAGE any=1) < RipEnergySafetyMargin()
}
AddFunction SigilOfRampageExpiresRipAttackPower asValue=1
{
if BuffPresent(SIGIL_OF_RAMPAGE any=1) and SigilOfRampageRipExpiresBeforeUsable() SigilOfRampageAttackPowerIncrease() 0
}
AddFunction TickingEbonDetonatorRipExpiresBeforeUsable asValue=1
{
BuffRemains(SIGIL_OF_RAMPAGE any=1) < RipCooldownSafetyMargin()
or BuffRemains(SIGIL_OF_RAMPAGE any=1) < RipEnergySafetyMargin()
}
AddFunction TickingEbonDetonatorExpiresRipAttackPower asValue=1
{
if BuffPresent(TICKING_EBON_DETONATOR any=1)
{
if TickingEbonDetonatorRipExpiresBeforeUsable() TickingEbonDetonatorAttackPowerIncrease()
TickingEbonDetonatorAttackPower()
}
0
}

################
# Rake Damage functions
################
AddFunction RakeTickDamage asValue=1 # Switched to raw numbers in place of Damage(RAKE) for 5.3.4+ compatibility
{
{RakeBaseDamage + AttackPower()*RakeDamagePerAttackPower} * DamageMultiplier(RAKE) * CurrentCritChanceMultiplier() * CurrentMasteryMultiplier()
}
AddFunction LastRakeTickDamage asValue=1
{
{RakeBaseDamage + target.DebuffAttackPower(RAKE)*RakeDamagePerAttackPower} * target.DebuffDamageMultiplier(RAKE) * RakeDebuffCritChanceMultiplier() * {1+target.DebuffMastery(RAKE)/100}
}
AddFunction TotalRakeMultiplier asValue=1
{
RuneExpiresRakeMultiplier()*TigersFuryExpiresRakeMultiplier()
}
AddFunction TotalRakeAttackPower asValue=1
{
DancingSteelExpiresRakeAttackPower() +
SoulCharmExpiresRakeAttackPower() +
BadJujuExpiresRakeAttackPower() +
ViciousTalismanExpiresRakeAttackPower() +
AssuranceOfConsequenceExpiresRakeAttackPower() +
HarommsTalismanExpiresRakeAttackPower() +
SigilOfRampageExpiresRakeAttackPower() +
TickingEbonDetonatorExpiresRakeAttackPower()
}
AddFunction FutureRakeTickDamage asValue=1
{
{RakeBaseDamage + {AttackPower() - TotalRakeAttackPower()} * RakeDamagePerAttackPower}
* DamageMultiplier(RAKE) / TotalRakeMultiplier()
* {CurrentCritChanceMultiplier() - TotalRakeAttackPower()*AttackPowerToCrit()}
* CurrentMasteryMultiplier()
}
AddFunction RakeRatio asValue=1
{
if TargetDebuffPresent(RAKE) 100 * FutureRakeTickDamage()/LastRakeTickDamage()
100.0
}

################
# Rip Damage functions
################
AddFunction RipTickDamage asValue=1
{
{RipBaseDamage + {{RipDamagePerComboPoint + {RipDamagePerComboPointAttackPower * AttackPower()}} * ComboPoints()}} * DamageMultiplier(RIP) * CurrentCritChanceMultiplier() * CurrentMasteryMultiplier()
}
AddFunction LastRipTickDamage asValue=1
{
{RipBaseDamage + {{RipDamagePerComboPoint + {RipDamagePerComboPointAttackPower * target.DebuffAttackPower(RIP)}} * target.DebuffComboPoints(RIP)}} * target.DebuffDamageMultiplier(RIP) * RipDebuffCritChanceMultiplier() * {1 + target.DebuffMastery(RIP)/100}
}
AddFunction TotalRipMultiplier asValue=1
{
RuneExpiresRipMultiplier()*TigersFuryExpiresRipMultiplier()
}
AddFunction TotalRipAttackPower asValue=1
{
DancingSteelExpiresRipAttackPower() +
SoulCharmExpiresRipAttackPower() +
BadJujuExpiresRipAttackPower() +
ViciousTalismanExpiresRipAttackPower() +
AssuranceOfConsequenceExpiresRipAttackPower() +
HarommsTalismanExpiresRipAttackPower() +
SigilOfRampageExpiresRipAttackPower() +
TickingEbonDetonatorExpiresRipAttackPower()
}
AddFunction FutureRipTickDamage asValue=1
{
{RipBaseDamage + {{RipDamagePerComboPoint + {RipDamagePerComboPointAttackPower * {AttackPower() - TotalRipAttackPower()}}} * ComboPoints()}}
* DamageMultiplier(RIP) / TotalRipMultiplier()
* {CurrentCritChanceMultiplier() - TotalRipAttackPower()*AttackPowerToCrit()}
* CurrentMasteryMultiplier()
}
AddFunction RipDamageTillDead asValue=1
{
# The damage from Rip that is cast under the current conditions and lasting till target is dead.
# Multiply the damage per tick with the number of ticks that can fit into the time to die.
FutureRipTickDamage() * {target.TimeToDie() / 2}
}
AddFunction ExistingRipDamageTillDead asValue=1
{
# The damage from Rip that is already on the target and lasting till target is dead.
if target.DebuffPresent(RIP)
{
# Multiply the damage per tick with the number of ticks that can fit into the time to die.
LastRipTickDamage() * {target.TimeToDie() / 2}
}
0
}
AddFunction RipRatio asValue=1
{
if TargetDebuffPresent(RIP) 100 * FutureRipTickDamage()/LastRipTickDamage()
100.0
}

################
# Ability damage functions
################
AddFunction FerociousBiteDamage asValue=1 # Switched to raw numbers in place of Damage(FEROCIOUS_BITE) for 5.3.4+ compatibility
{
{FerociousBiteBaseDamage + {FerociousBiteDamagePerComboPoint + FerociousBiteDamagePerComboPointAttackPower * AttackPower()} * ComboPoints()} * DamageMultiplier(FEROCIOUS_BITE) * FerociousBiteCritChanceMultiplier() * 2 * ArmorReduction()
}
AddFunction MangleCatDamage asValue=1
{
{MangleCatBaseDamage + WeaponDamage()} * MangleCatWeaponDamageMultiplier * DamageMultiplier(MANGLE_CAT) * CurrentCritChanceMultiplier() * ArmorReduction()
}
AddFunction ShredDamage asValue=1
{
MangleCatDamage()*1.2
}
AddFunction ThrashCatHitDamage asValue=1
{
{ThrashHitBaseDamage + AttackPower()}*ThrashHitDamagePerAttackPower * DamageMultiplier(THRASH_CAT) * CurrentCritChanceMultiplier() * CurrentMasteryMultiplier()
}
AddFunction SwipeCatDamage asValue=1
{
WeaponDamage() * MangleCatWeaponDamageMultiplier * DamageMultiplier(MANGLE_CAT) * CurrentCritChanceMultiplier() * ArmorReduction()
}
AddFunction RavageDamage asValue=1
{
{RavageBaseDamage + WeaponDamage()} * RavageWeaponDamageMultiplier * DamageMultiplier(RAVAGE) * RavageCritChanceMultiplier() * ArmorReduction()
}

################
# Misc functions
################
AddFunction FaerieFire
{
if TalentPoints(FAERIE_SWARM_TALENT) Spell(FAERIE_SWARM)
unless TalentPoints(FAERIE_SWARM_TALENT) Spell(FAERIE_FERAL)
}
AddFunction SavageRoar
{
if Glyph(GLYPH_OF_SAVAGERY) Spell(SAVAGE_ROAR_GLYPHED)
if Glyph(GLYPH_OF_SAVAGERY no) and ComboPoints(more 0) Spell(SAVAGE_ROAR_OLD)
}
AddFunction UsePotion
{
#virmens_bite_potion
Item(virmens_bite_potion)
}
AddFunction TreantTimeThreshold
{
1+{Charges(FORCE_OF_NATURE)-1}*0.33
}

#############################
## Feral rotation functions (Mastery=2) ##
#############################

AddFunction NotInCombat
{
unless InCombat() {
if BuffExpires(str_agi_int 400 any=1) Spell(MARK_OF_THE_WILD)
if BuffExpires(DREAM_OF_CENARIUS) and TalentPoints(DREAM_OF_CENARIUS_TALENT) Spell(HEALING_TOUCH)
unless Stance(3) Spell(CAT_FORM)
if Glyph(GLYPH_OF_SAVAGERY) and ComboPoints(atMost 0) {
if BuffRemains(SAVAGE_ROAR_GLYPHED less 12) and TimeToMaxEnergy() < BuffRemains(SAVAGE_ROAR_GLYPHED)-11.5
or BuffRemains(SAVAGE_ROAR_GLYPHED less 9) and TimeToMaxEnergy() < BuffRemains(SAVAGE_ROAR_GLYPHED)-8.5
or BuffRemains(SAVAGE_ROAR_GLYPHED less 6) and TimeToMaxEnergy() < BuffRemains(SAVAGE_ROAR_GLYPHED)-5.5
or BuffRemains(SAVAGE_ROAR_GLYPHED less 3) and TimeToMaxEnergy() < BuffRemains(SAVAGE_ROAR_GLYPHED)-2.5
or BuffExpires(SAVAGE_ROAR_GLYPHED)
{
SavageRoar()
}
}
if TalentPoints(FORCE_OF_NATURE_TALENT) Spell(FORCE_OF_NATURE)
}
}

AddFunction SpareGcdCooldowns {
# Spirit Wolves goes here when symbiosis is supported appropriately.
}

AddFunction HealingTouch
{
#healing_touch,if=talent.dream_of_cenarius.enabled&buff.predatory_swiftness.up&buff.dream_of_cenarius.down&(buff.predatory_swiftness.remains<1.5|combo_points>=4)
if TalentPoints(DREAM_OF_CENARIUS_TALENT) and BuffPresent(PREDATORY_SWIFTNESS) and BuffExpires(DREAM_OF_CENARIUS_DAMAGE) and
{BuffRemains(PREDATORY_SWIFTNESS atMost 1.5) or ComboPoints(atLeast 4)}
{
Spell(HEALING_TOUCH)
}
}

AddFunction SavageRoarOrWeakenedArmorMissing
{
#savage_roar,if=buff.savage_roar.down
if BuffExpires(SAVAGE_ROAR) SavageRoar()

#faerie_fire,if=debuff.weakened_armor.stack<3
if target.DebuffStacks(WEAKENED_ARMOR any=1 less 3) and CheckBoxOn(lucioles) FaerieFire()
}

AddFunction RangeCheck
{
#range check
unless target.InRange(MANGLE_CAT) Texture(ability_druid_catformattack)
}

AddFunction DpsCooldownLogic
{
#incarnation,if=energy<=35&!buff.omen_of_clarity.react&cooldown.tigers_fury.remains=0&cooldown.berserk.remains=0
#use_item,slot=hands,if=buff.tigers_fury.up
#tigers_fury,if=(energy<=35&!buff.omen_of_clarity.react)|buff.king_of_the_jungle.up
#berserk,if=buff.tigers_fury.up|(target.time_to_die<15&cooldown.tigers_fury.remains>6)
if {{Energy(atMost 35) and BuffExpires(CLEARCASTING)} or BuffPresent(INCARNATION_CAT)} and Spell(TIGERS_FURY)
{
if CheckBoxOn(berserk) and Spell(BERSERK_CAT)
{
if not TalentPoints(INCARNATION_TALENT) or BuffPresent(INCARNATION_CAT) Spell(BERSERK_CAT)
if TalentPoints(INCARNATION_TALENT) wait Spell(INCARNATION) #wait is necessary otherwise it suggests TF for about a half second before suggesting Incarnation
}
unless BuffPresent(BERSERK_CAT) Spell(TIGERS_FURY)
}
if CheckBoxOn(berserk)
{
if TalentPoints(INCARNATION_TALENT) and BuffPresent(BERSERK_CAT) Spell(INCARNATION_CAT)
if TalentPoints(NATURES_VIGIL_TALENT) and {BuffPresent(BERSERK_CAT) or SpellCooldown(BERSERK_CAT more 88)} Spell(NATURES_VIGIL)
}

}

AddFunction ExecuteRangeRipFerociousBiteLogic
{
#ferocious_bite,if=combo_points>=1&dot.rip.ticking&dot.rip.remains<=3&target.health.pct<=25
if target.HealthPercent(atMost 25) and ComboPoints(more 0)
and target.DebuffPresent(RIP) and target.DebuffRemains(RIP less 4) # is 4 instead of 3 because the remaining time on rip can be inaccurate upto 2 seconds
{
Spell(FEROCIOUS_BITE)
}

#thrash_cat,if=target.time_to_die>=6&buff.omen_of_clarity.react&dot.thrash_cat.remains<3
if target.TimeToDie(atLeast 9) and BuffPresent(CLEARCASTING)
and target.DebuffRemains(THRASH_CAT less 3)
{
Spell(THRASH_CAT)
}

#ferocious_bite,if=target.time_to_die<=1&combo_points>=3
if target.TimeToDie(atMost 1) and ComboPoints(atLeast 3) Spell(FEROCIOUS_BITE)

#savage_roar,if=buff.savage_roar.remains<=3&combo_points>0&target.health.pct<25
if BuffRemains(SAVAGE_ROAR less 3) and ComboPoints(more 0) and target.HealthPercent(atMost 25)
{
SavageRoar()
}

if ComboPoints(atLeast 5)
{
if CheckBoxOn(potions) and target.Classification(worldboss) and ItemCount(VIRMENS_BITE_ITEM more 0)
{
if TimeToHealthPercent(25 atMost 15)
{
#virmens_bite_potion,if=combo_points>=5&$(time_til_bitw)<15&$(rip_ratio)>=1.15&buff.dream_of_cenarius_damage.up
if not HasTrinket(ROR_ITEM) and ComboPoints(atLeast 5) and {BuffPresent(DREAM_OF_CENARIUS) or not TalentPoints(DREAM_OF_CENARIUS_TALENT)} and RipRatio() >=115 Item(VIRMENS_BITE_ITEM)

#virmens_bite_potion,if=combo_points>=5&$(time_til_bitw)<15&buff.rune_of_reorigination.up&buff.dream_of_cenarius_damage.up
if HasTrinket(ROR_ITEM) and ComboPoints(atLeast 5) and {BuffPresent(DREAM_OF_CENARIUS) or not TalentPoints(DREAM_OF_CENARIUS_TALENT)} and BuffPresent(ROR_MASTERY) Item(VIRMENS_BITE_ITEM)
}
#virmens_bite_potion,if=target.time_to_die<=40
if target.TimeToDie(atMost 40) Item(VIRMENS_BITE_ITEM)
}

#rip,if=combo_points>=5&(tick_damage*(1+crit_pct_current)-tick_dmg*(1+crit_pct))*target.time_to_die%2>=action.ferocious_bite.hit_damage*(1+action.ferocious_bite.crit_pct_current)*2&target.health.pct<=25
if RipDamageTillDead() > ExistingRipDamageTillDead() + FerociousBiteDamage() and {target.HealthPercent(atMost 25) or target.TimeToDie(atMost 16)}
{
Spell(RIP)
}

#pool_resource,wait=0.25,if=combo_points>=5&dot.rip.ticking&target.health.pct<=25&((energy<50&buff.berserk.down)|(energy<25&buff.berserk.remains>1))
#ferocious_bite,if=combo_points>=5&dot.rip.ticking&target.health.pct<=25
if target.DebuffPresent(RIP) and target.HealthPercent(atMost 25)
{
if not HasEnergyForFerociousBite() SpareGcdCooldowns()
wait if HasEnergyForFerociousBite() Spell(FEROCIOUS_BITE)
}
}
}

AddFunction RipLogic
{
if target.HealthPercent(more 25) and target.TimeToDie(more 16)
{
#rip,if=combo_points>=5&$(rip_ratio)>=1.15
if ComboPoints(atLeast 5) and RipRatio() >= 115
{
Spell(RIP)
}

#rip,if=combo_points>=5&target.time_to_die>=6&dot.rip.remains<2
if ComboPoints(atLeast 5)
and {{HasEnergyForRip() and target.DebuffRemains(RIP less 2)}
or {not HasEnergyForRip() and target.DebuffRemains(RIP) <2+TimeTilEnergyForRip()}}
{
Spell(RIP)
}

#rip,if=combo_points>=5&action.rip.tick_damage%dot.rip.tick_dmg>=1.15
if BuffPresent(ROR_MASTERY) and RipRatio() >= 95 and ComboPoints(atLeast 4)
and {{HasEnergyForRip() and BuffRemains(ROR_MASTERY atMost 1.5) and BuffRemains(ROR_MASTERY) > ExpiringBuffSafetyMargin()}
or {not HasEnergyForRip() and BuffRemains(ROR_MASTERY) <=1.5 + TimeTilEnergyForRip() and BuffRemains(ROR_MASTERY) > RipEnergySafetyMargin() and TimeTilEnergyForRip() < BuffRemains(ROR_MASTERY) - ExpiringBuffSafetyMargin()}}
{
Spell(RIP)
}
}
}

AddFunction SavageRoarRefreshLogic
{
#savage_roar,if=buff.savage_roar.remains<3&combo_points>0&buff.savage_roar.remains+2>dot.rip.remains
if BuffRemains(SAVAGE_ROAR less 3) and ComboPoints(more 0) and BuffRemains(SAVAGE_ROAR) +2 > target.DebuffRemains(RIP)
{
SavageRoar()
}

#savage_roar,if=buff.savage_roar.remains<6&combo_points>=5&buff.savage_roar.remains+2<=dot.rip.remains&dot.rip.ticking
if BuffRemains(SAVAGE_ROAR less 6) and ComboPoints(atLeast 5) and BuffRemains(SAVAGE_ROAR) +2 <= target.DebuffRemains(RIP) and target.DebuffPresent(RIP)
{
SavageRoar()
}

#savage_roar,if=buff.savage_roar.remains<12&combo_points>=5&energy.time_to_max<=1.25&buff.savage_roar.remains<=dot.rip.remains+6&dot.rip.ticking
if BuffRemains(SAVAGE_ROAR less 12) and ComboPoints(atLeast 5) and TimeToMaxEnergy(atMost 1.25) and BuffRemains(SAVAGE_ROAR) <= target.DebuffRemains(RIP) +6
{
SavageRoar()
}
}

AddFunction RakeLogic
{
if target.TimeToDie() - target.DebuffRemains(RAKE) >3
{
#rake,if=target.time_to_die-dot.rake.remains>3&buff.rune_of_reorigination.up&dot.rake.remains<9&(buff.rune_of_reorigination.remains<=1.5)
if BuffPresent(ROR_MASTERY) and RakeRatio() > 75
and {{HasEnergyForRake() and target.DebuffRemains(RAKE less 9) and BuffRemains(ROR_MASTERY atMost 1.5)
and ExpiringBuffSafetyMargin() < BuffRemains(ROR_MASTERY)}
or {not HasEnergyForRake() and target.DebuffRemains(RAKE) <9 + TimeTilEnergyForRake() and BuffRemains(ROR_MASTERY) <=1.5 + TimeTilEnergyForRake()
and RakeEnergySafetyMargin() < BuffRemains(ROR_MASTERY) and TimeTilEnergyForRake() < BuffRemains(ROR_MASTERY) - ExpiringBuffSafetyMargin()}}
{
Spell(RAKE)
}

#rake,if=target.time_to_die-dot.rake.remains>3&(action.rake.tick_damage>dot.rake.tick_dmg*1.12|(dot.rake.remains<3&action.rake.tick_damage%dot.rake.tick_dmg>=0.75))
if RakeRatio() > 75
and {{HasEnergyForRake() and target.DebuffRemains(RAKE less 3)}
or {not HasEnergyForRake() and target.DebuffRemains(RAKE) < 3 + TimeTilEnergyForRake()}}
{
Spell(RAKE)
}
if RakeRatio() > 112
{
Spell(RAKE)
}

#rake if its about to fall off. Simcraft doesn't require this line but ovale does for the prediction box.
if {HasEnergyForRake() and target.DebuffRemains(RAKE) < 0.001}
or {not HasEnergyForRake() and target.DebuffRemains(RAKE) < 0.001 + TimeTilEnergyForRake()}
{
Spell(RAKE)
}
}
}

AddFunction ThrashLogic
{
#pool_resource,wait=0.25,for_next=1
#thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<3&(dot.rip.remains>=8&buff.savage_roar.remains>=12|buff.berserk.up|combo_points>=5)&dot.rip.ticking
if {HasEnergyForThrash()
and target.DebuffRemains(THRASH_CAT less 3)
and target.TimeToDie(atLeast 9)
and {{target.DebuffRemains(RIP atLeast 8) and BuffRemains(SAVAGE_ROAR atLeast 12)}
or BuffPresent(BERSERK_CAT) or ComboPoints(atLeast 5)}}
or {not HasEnergyForThrash()
and target.DebuffRemains(THRASH_CAT) < 3 + TimeTilEnergyForThrash()
and target.TimeToDie() >=9 + TimeTilEnergyForThrash()
and {{target.DebuffRemains(RIP) >=8 + TimeTilEnergyForThrash() and BuffRemains(SAVAGE_ROAR) >=12 + TimeTilEnergyForThrash()}
or BuffPresent(BERSERK_CAT) or ComboPoints(atLeast 5)}}
{
if TimeTilEnergyForThrash() >=1.5 SpareGcdCooldowns()
Spell(THRASH_CAT)
}

#pool_resource,for_next=1
#thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<9&buff.rune_of_reorigination.up&buff.rune_of_reorigination.remains<=1.5&dot.rip.ticking
if BuffPresent(ROR_MASTERY) and target.DebuffPresent(RIP)
and {{HasEnergyForThrash()
and ExpiringBuffSafetyMargin() < BuffRemains(ROR_MASTERY)
and target.DebuffRemains(THRASH_CAT less 9) and BuffRemains(ROR_MASTERY atMost 1.5)
and target.TimeToDie(atLeast 9)}
or {not HasEnergyForThrash()
and ThrashEnergySafetyMargin() < BuffRemains(ROR_MASTERY)
and target.DebuffRemains(THRASH_CAT) < 9 + TimeTilEnergyForThrash()
and BuffRemains(ROR_MASTERY) <=1.5 + TimeTilEnergyForThrash()
and TimeTilEnergyForThrash() <= BuffRemains(ROR_MASTERY) + ExpiringBuffSafetyMargin()
and target.TimeToDie() >=9 + TimeTilEnergyForThrash()}}
{
if TimeTilEnergyForThrash() >=1.5 SpareGcdCooldowns()
Spell(THRASH_CAT)
}
}

AddFunction FerociousBiteWaitConditions { TimeToMaxEnergy(atMost 1.25) or {{target.DebuffExpires(RIP) or BuffPresent(BERSERK_CAT) or SpellCooldown(TIGERS_FURY atMost 1.5)} and HasEnergyForFerociousBite()} or {BuffPresent(FERAL_RAGE) and BuffRemains(FERAL_RAGE atMost 1.25)} }
AddFunction NonExcuteRangeFerociousBiteLogic
{
#pool_resource,if=combo_points>=5&!(energy.time_to_max<=1.25|(buff.feral_rage.up&buff.feral_rage.remains<1)|(energy>=50&cooldown.tigers_fury.remains<=1.5)|(buff.berserk.up&energy>=25))&dot.rip.ticking
#ferocious_bite,if=combo_points>=5&dot.rip.ticking
if ComboPoints(atLeast 5) and {target.DebuffPresent(RIP) or target.TimeToDie(atMost 16)} and BuffPresent(SAVAGE_ROAR)
{
if not FerociousBiteWaitConditions() SpareGcdCooldowns()
wait if FerociousBiteWaitConditions() Spell(FEROCIOUS_BITE)
}
}
AddFunction RakeTargetNotDieing asValue=1 { FutureRakeTickDamage() * {target.TicksRemain(RAKE)+1} - LastRakeTickDamage() * target.TicksRemain(RAKE) }
AddFunction RakeTargetIsDieing asValue=1 { FutureRakeTickDamage() * {target.TimeToDie()/3+1} - LastRakeTickDamage() * target.TimeToDie()/3 }
AddFunction FillerActions
{
#rake,if=target.time_to_die-dot.rake.remains>3&action.rake.tick_damage*(dot.rake.ticks_remain+1)-dot.rake.tick_dmg*dot.rake.ticks_remain>action.mangle_cat.hit_damage
if target.TimeToDie() - target.DebuffRemains(RAKE) >=3 and RakeTargetNotDieing() >= MangleCatDamage()
{
Spell(RAKE)
}
#rake,if=target.time_to_die-dot.rake.remains<=3&action.rake.tick_damage*(target.time_to_die%3+1)-dot.rake.tick_dmg*target.time_to_die%3>action.mangle_cat.hit_damage
if target.TimeToDie() - target.DebuffRemains(RAKE) <3 and RakeTargetIsDieing() >= MangleCatDamage()
{
Spell(RAKE)
}
#ravage
if BuffPresent(INCARNATION_CAT) Spell(RAVAGE)

#actions.filler+=/shred,if=(buff.omen_of_clarity.react|buff.berserk.up|energy.regen>=15)&buff.king_of_the_jungle.down
if BuffPresent(CLEARCASTING) Spell(SHRED)
if BuffPresent(BERSERK_CAT) or EnergyRegen(atLeast 15)
and {not CheckBoxOn(infront)
or {Glyph(GLYPH_OF_SHRED) and {BuffPresent(TIGERS_FURY) or BuffPresent(BERSERK_CAT)}}}
Spell(SHRED)

#actions.filler+=/mangle_cat,if=buff.king_of_the_jungle.down
Spell(MANGLE_CAT)
}

AddFunction AoeFillerActions
{
if ThrashCatHitDamage() > SwipeCatDamage() * 1.11
and {{HasEnergyForThrash() and ExpiringBuffSafetyMargin() < BuffRemains(ROR_MASTERY)}
or {not HasEnergyForThrash() and ThrashEnergySafetyMargin() < BuffRemains(ROR_MASTERY)}}
{
Spell(THRASH_CAT)
}
Spell(SWIPE_CAT)
}

Posts: 7
Joined: Sun Feb 23, 2014 6:53 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Grayfox23 » Tue Feb 25, 2014 8:23 pm

Spoiler: show
# Feral rotation

AddFunction MainActions
{
HealingTouch()

SavageRoarOrWeakenedArmorMissing()

RangeCheck()

DpsCooldownLogic()

#Also includes Clearcasting Thrash and end of fight Ferocious Bite
ExecuteRangeRipFerociousBiteLogic()

RipLogic()

SavageRoarRefreshLogic()

RakeLogic()

ThrashLogic()

NonExcuteRangeFerociousBiteLogic()
}

AddFunction FillerConditions
{
#run_action_list,name=filler,if=buff.omen_of_clarity.react
BuffPresent(CLEARCASTING)
#run_action_list,name=filler,if=buff.feral_fury.react
or {BuffPresent(FERAL_FURY) and BuffRemains(FERAL_FURY) > TimeTilEnergyForMangle()}
#run_action_list,name=filler,if=(combo_points<5&dot.rip.remains<3)|(combo_points=0&buff.savage_roar.remains<2)
or {not ComboPoints(atLeast 5) and target.DebuffRemains(RIP less 3)}
or {ComboPoints(atMost 0) and BuffRemains(SAVAGE_ROAR less 2)}
#run_action_list,name=filler,if=target.time_to_die<=8.5
or target.TimeToDie(atMost 8.5)
#run_action_list,name=filler,if=(talent.dream_of_cenarius.enabled&buff.tigers_fury.up)|buff.berserk.up
or {TalentPoints(DREAM_OF_CENARIUS_TALENT) and BuffPresent(TIGERS_FURY)}
or BuffPresent(BERSERK_CAT)
#run_action_list,name=filler,if=cooldown.tigers_fury.remains<=3
or SpellCooldown(TIGERS_FURY atMost 3)
#run_action_list,name=filler,if=talent.dream_of_cenarius.enabled&combo_points<=3&buff.predatory_swiftness.remains<(5.5-combo_points)&buff.predatory_swiftness.up
or {TalentPoints(DREAM_OF_CENARIUS_TALENT) and BuffPresent(PREDATORY_SWIFTNESS) and BuffRemains(PREDATORY_SWIFTNESS) <= {5.5-ComboPoints()} and ComboPoints(less 4)}
#run_action_list,name=filler,if=energy.time_to_max<=1
or TimeToMaxEnergy(atMost 1.25)
}

AddFunction AoeActions
{
HealingTouch()

SavageRoarOrWeakenedArmorMissing()

RangeCheck()

DpsCooldownLogic()

ExecuteRangeRipFerociousBiteLogic()

if TalentPoints(DREAM_OF_CENARIUS_TALENT) or TalentPoints(SOUL_OF_THE_FOREST_TALENT) or Enemies(atMost 6)
{
RipLogic()
}

SavageRoarRefreshLogic()

#pool_resource,for_next=1
#thrash_cat,if=dot.thrash_cat.remains<3
if {HasEnergyForThrash()
and target.DebuffRemains(THRASH_CAT less 3)}
or {not HasEnergyForThrash()
and target.DebuffRemains(THRASH_CAT) < 3 + TimeTilEnergyForThrash()}
{
if TimeTilEnergyForThrash() >=1.5 SpareGcdCooldowns()
Spell(THRASH_CAT)
}

if target.TimeToDie() - target.DebuffRemains(RAKE) >15
{
#rake,if=buff.rune_of_reorigination.up&active_enemies<=8&dot.rake.remains<3&target.time_to_die>=15&action.rake.tick_damage%dot.rake.tick_dmg>=0.75
if BuffPresent(ROR_MASTERY) and RakeRatio() >75 and Enemies(atMost 8)
and {{HasEnergyForRake() and target.DebuffRemains(RAKE less 3) and ExpiringBuffSafetyMargin() < BuffRemains(ROR_MASTERY)}
or {not HasEnergyForRake() and target.DebuffRemains(RAKE) < 3 + TimeTilEnergyForRake() and RakeEnergySafetyMargin() < BuffRemains(ROR_MASTERY) and TimeTilEnergyForRake() <= BuffRemains(ROR_MASTERY) + ExpiringBuffSafetyMargin()}}
{
Spell(RAKE)
}

if Enemies(atMost 4)
{
#rake,if=active_enemies<=4&dot.rake.remains<3&target.time_to_die>=15&action.rake.tick_damage%dot.rake.tick_dmg>=0.75
if RakeRatio() >75
and {{HasEnergyForRake() and target.DebuffRemains(RAKE less 3)}
or {not HasEnergyForRake() and target.DebuffRemains(RAKE) < 3 + TimeTilEnergyForRake()}}
{
Spell(RAKE)
}
#rake if its about to fall off. Simcraft doesn't require this line but ovale does for the prediction box.
if {HasEnergyForRake() and target.DebuffRemains(RAKE less 0.001)}
or {not HasEnergyForRake() and target.DebuffRemains(RAKE) < 0.001 + TimeTilEnergyForRake()}
{
Spell(RAKE)
}
}
}

#ferocious_bite,if=combo_points>=5&dot.rip.ticking&talent.dream_of_cenarius.enabled&talent.soul_of_the_forest.enabled&buff.berserk.up
if TalentPoints(DREAM_OF_CENARIUS_TALENT) and TalentPoints(SOUL_OF_THE_FOREST_TALENT) and BuffPresent(BERSERK_CAT)
{
Spell(FEROCIOUS_BITE)
}

}

AddFunction Prediction
{
if Stance(3) {
MainActions()
}
if Stance(1) {
if BuffPresent(HEART_OF_THE_WILD) Spell(FRENZIED_REGEN)
unless BuffPresent(HEART_OF_THE_WILD) Spell(CAT_FORM)
}
if Stance(0) {
if BuffPresent(HEART_OF_THE_WILD) {
if BuffExpires(HEART_OF_THE_WILD) Texture(spell_holy_blessingofagility)
}
unless BuffPresent(HEART_OF_THE_WILD) Spell(CAT_FORM)
}
if Stance(4) or Stance(2) Spell(CAT_FORM)
}

#####################
## Feral icons (Mastery=2) ##
#####################

AddIcon help=Rake_Ratio size=small mastery=2 checkboxon=cooldownsRatio
{
RakeRatio()
}

AddIcon help=Rip_Ratio size=small mastery=2 checkboxon=cooldownsRatio
{
RipRatio()
}

#AddIcon help=Interrupts_and_Wild_Charge size=small mastery=2 checkboxon=cooldownsL {
# if target.InRange(SKULL_BASH_CAT) Spell(SKULL_BASH_CAT)
# unless target.Classification(worldboss)
# {
# if TalentPoints(MIGHTY_BASH_TALENT) and target.InRange(MIGHTY_BASH) Spell(MIGHTY_BASH)
# if TalentPoints(TYPHOON_TALENT) and target.InRange(SKULL_BASH_CAT) Spell(TYPHOON)
# if ComboPoints(more 0) and target.InRange(MAIM) Spell(MAIM)
# }
# Spell(WILD_CHARGE)
#}

AddIcon size=small mastery=2 checkboxon=cooldownsL {
Spell(TIGERS_FURY)
}
AddIcon help=Berserk size=small mastery=2 checkboxon=cooldownsL { # Berserk Icon
if BuffPresent(TIGERS_FURY) Spell(BERSERK_CAT)
if Spell(BERSERK_CAT) Texture(Ability_mount_polarbear_white)
}


# Predictive rotation
AddIcon help=Predictive size=small mastery=2 checkboxon=altpredictive {
Prediction()
}

AddIcon help=Talent_Cooldowns size=small mastery=2 checkboxon=altpredictive {
if TalentPoints(FORCE_OF_NATURE_TALENT)
{
if Charges(FORCE_OF_NATURE) ==3 or {Charges(FORCE_OF_NATURE) ==2 and SpellChargeCooldown(FORCE_OF_NATURE) <=1} Spell(FORCE_OF_NATURE)
if BuffPresent(TICKING_EBON_DETONATOR)
or {BuffPresent(SOUL_CHARM) and BuffRemains(SOUL_CHARM) <= TreantTimeThreshold()}
or {BuffPresent(ROR_MASTERY) and BuffRemains(ROR_MASTERY) <= TreantTimeThreshold()}
or {BuffPresent(BAD_JUJU) and BuffRemains(BAD_JUJU) <= TreantTimeThreshold()}
or {BuffPresent(VICIOUS_TALISMAN) and BuffRemains(VICIOUS_TALISMAN) <= TreantTimeThreshold()}
or {BuffPresent(ASSURANCE_OF_CONSEQUENCE) and BuffRemains(ASSURANCE_OF_CONSEQUENCE) <= TreantTimeThreshold()}
or {BuffPresent(HAROMMS_TALISMAN) and BuffRemains(HAROMMS_TALISMAN) <= TreantTimeThreshold()}
or {BuffPresent(SIGIL_OF_RAMPAGE) and BuffRemains(SIGIL_OF_RAMPAGE) <= TreantTimeThreshold()}
{
Spell(FORCE_OF_NATURE)
}
}
unless TalentPoints(FORCE_OF_NATURE_TALENT)
{
if TalentPoints(HEART_OF_THE_WILD_TALENT) Spell(HEART_OF_THE_WILD)
if TalentPoints(DREAM_OF_CENARIUS_TALENT)
{
if TalentPoints(CENARION_WARD_TALENT) Spell(CENARION_WARD)
if TalentPoints(RENEWAL_TALENT) Spell(RENEWAL)
}
if TalentPoints(NATURES_VIGIL_TALENT) Spell(NATURES_VIGIL)
}
}

# Main rotation
AddIcon help=main mastery=2 {
NotInCombat()
if Stance(3)
{
MainActions()
if FillerConditions() FillerActions()
SpareGcdCooldowns()
}
if Stance(1)
{
if BuffPresent(HEART_OF_THE_WILD)
BearMain()
unless BuffPresent(HEART_OF_THE_WILD) Spell(CAT_FORM)
}
if Stance(0)
{
if BuffPresent(HEART_OF_THE_WILD)
{
if CastTime(WRATH) <BuffRemains(HEART_OF_THE_WILD) Spell(WRATH)
Spell(CAT_FORM)
}
unless BuffPresent(HEART_OF_THE_WILD) Spell(CAT_FORM)
}
if Stance(4) or Stance(2) Spell(CAT_FORM)
}

# Predictive rotation
AddIcon help=Predictive mastery=2 checkboxon=predictive {
Prediction()
}

AddIcon help=aoe mastery=2 checkboxon=showaoe
{
NotInCombat()
if Stance(3)
{
AoeActions()
if FillerConditions() AoeFillerActions()
SpareGcdCooldowns()
}
if Stance(1)
{
if BuffPresent(HEART_OF_THE_WILD)
BearMainAOE()
unless BuffPresent(HEART_OF_THE_WILD) Spell(CAT_FORM)
}
if Stance(0)
{
if BuffRemains(HEART_OF_THE_WILD) > GCD()
Spell(HURRICANE)
Spell(CAT_FORM)
}
if Stance(4) or Stance(2) Spell(CAT_FORM)
}

AddIcon help=Savage_Roar size=small mastery=2 checkboxon=cooldownsR { # Savage Roar
if BuffExpires(SAVAGE_ROAR) Texture(ability_druid_skinteeth)
}
AddIcon help=Rip size=small mastery=2 checkboxon=cooldownsR { # Rip
if TargetDebuffExpires(RIP) Texture(ability_ghoulfrenzy)
}
AddIcon help=Rake size=small mastery=2 checkboxon=cooldownsR { # Rake
if TargetDebuffExpires(RAKE) Texture(ability_druid_disembowel)
}
AddIcon help=Thrash size=small mastery=2 checkboxon=cooldownsR { # Thrash
if TargetDebuffExpires(THRASH_CAT) Texture(spell_druid_thrash)
}

################################
## Guardian rotation functions (Mastery=3) ##
################################

AddFunction BearMain {
if Threat() <100 and target.DebuffPresent(LACERATE) and target.DebuffRemains(LACERATE less 2) Spell(LACERATE)
if Threat() <100 and BuffPresent(INCARNATION_BEAR) and target.DebuffRemains(THRASH_BEAR less 2) Spell(THRASH_BEAR)

Spell(MANGLE_BEAR)


# Debuff maintenance.
if target.DebuffRemains(WEAKENED_BLOWS any=1 atMost 3) Spell(THRASH_BEAR)
if target.DebuffRemains(WEAKENED_ARMOR any=1 atMost 3) or target.DebuffStacks(WEAKENED_ARMOR any=1 less 3)
{
FaerieFire()
}

Spell(LACERATE)
if target.DebuffPresent(THRASH_BEAR 6) FaerieFire()
Spell(THRASH_BEAR)
}

AddFunction BearMainAOE {
Spell(MANGLE_BEAR)
Spell(THRASH_BEAR)
Spell(SWIPE_BEAR)
}

#######################
## Guardian icons (Mastery=3) ##
#######################

AddIcon help=Rake size=small mastery=3 checkboxon=cooldownsRatio
{
# Offset the guardian icons if the user has bleed ratios enabled
}

AddIcon help=Rip size=small mastery=3 checkboxon=cooldownsRatio
{
# Offset the guardian icons if the user has bleed ratios enabled
}

AddIcon size=small mastery=3 checkboxon=cooldownsL {
Spell(BARKSKIN)
}

AddIcon size=small mastery=3 checkboxon=cooldownsL {
if TalentPoints(RENEWAL_TALENT) Spell(RENEWAL)
if TalentPoints(CENARION_WARD_TALENT) Spell(CENARION_WARD)
}

AddIcon mastery=3 size=small checkboxon=altpredictive {
if Rage(less 11) Spell(ENRAGE useable=1)
Spell(SAVAGE_DEFENSE usable=1)
Spell(FRENZIED_REGEN)
}

AddIcon mastery=3 size=small checkboxon=altpredictive {
if BuffPresent(TOOTH_AND_CLAW) and target.DebuffExpires(TOOTH_AND_CLAW_DEBUFF) Spell(TOOTH_AND_CLAW)
unless BuffPresent(TOOTH_AND_CLAW) and target.DebuffExpires(TOOTH_AND_CLAW_DEBUFF) Spell(MAUL)
}

# Main rotation
AddIcon help=main mastery=3 {
if InCombat(no) and BuffRemains(str_agi_int any=1 less 400) Spell(MARK_OF_THE_WILD)
unless Stance(1) Spell(BEAR_FORM)

BearMain()

}

AddIcon mastery=3 checkboxon=predictive {
if Rage(less 11) Spell(ENRAGE useable=1)
Spell(SAVAGE_DEFENSE usable=1)
Spell(FRENZIED_REGEN)
}

AddIcon help=aoe mastery=3 checkboxon=showaoe {
if InCombat(no) and BuffRemains(str_agi_int any=1 less 400) Spell(MARK_OF_THE_WILD)
unless Stance(1) Spell(BEAR_FORM)

BearMainAOE()
}
AddIcon size=small mastery=3 checkboxon=cooldownsR {
Spell(SURVIVAL_INSTINCTS)
}

AddIcon size=small mastery=3 checkboxon=cooldownsR {
Spell(MIGHT_OF_URSOC)
}

AddIcon size=small mastery=3 checkboxon=cooldownsR {
if TalentPoints(INCARNATION_TALENT) Spell(INCARNATION_BEAR)
if TalentPoints(FORCE_OF_NATURE_TALENT) Spell(FORCE_OF_NATURE)
}
AddIcon size=small mastery=3 checkboxon=cooldownsR {
Spell(BERSERK_BEAR)
}

Posts: 4
Joined: Tue Feb 25, 2014 11:46 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Druizz » Wed Feb 26, 2014 12:48 am

Using the same script as gray fox, if you need me to, I can upload the script from my files even thou it the same as his

Posts: 11
Joined: Thu Oct 14, 2010 4:02 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Triplebuses » Wed Feb 26, 2014 4:11 am

Maybe an Ovale version problem ? For me the script behave fine with the 5.4.8 but went wrong with the 5.4.9 beta version ...

Posts: 3
Joined: Sun Feb 23, 2014 7:08 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Devín » Wed Feb 26, 2014 12:15 pm

I think that may be it. I copied Gray's script and it wouldn't work at all. Had too many UI errors. Also I am getting random lock ups while using scripts for druid. Let me see if I can find the error messages:

831x Interface\AddOns\Ovale\OvaleFrame.lua:187: attempt to index local 'timeSpan' (a nil value)
Interface\AddOns\Ovale\OvaleFrame.lua:187: in function `OnUpdate'
Interface\AddOns\Ovale\OvaleFrame.lua:84: in function <Interface\AddOns\Ovale\OvaleFrame.lua:83>

Locals:
self = <unnamed> {
0 = <userdata>
obj = <table> {
}
}
is the error Buggrabber is catching

Posts: 7
Joined: Sun Feb 23, 2014 6:53 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Grayfox23 » Sat Mar 01, 2014 4:24 pm

I switched to the release version of ovale (why in gods name was the aplha version the default to download?) and that did solve my rake bleed falling off problem. However now Ovale crashes even more frequently in combat. I don't know if it's the script or the add on but it is just completely unreliable in a raid and therefore unusable.

Posts: 2
Joined: Thu Aug 30, 2012 5:27 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Tantrum » Sun Mar 02, 2014 12:40 am

Hi guys :)

I'm back to the game after a long period away and of course I'm here at my #1 forum for all things kitty :D

I am wondering if this addon is working for anyone? I've tried downloading it multiple times and haven't had any luck getting it to load up. It continues to say "Dependency Missing" which I don't understand since I've downloaded what I assume to be the most recent version.

Am I doing something wrong? (It has been a long time so that isn't outside the realm of possibilities for me :lol:)

Any help, advice, or even a kick in the rump that would help me get this fabulous addon running would be greatly appreciated :)

Thanks!

Tantrum

Posts: 22
Joined: Wed Feb 13, 2013 5:29 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Karve » Wed Apr 09, 2014 3:24 pm

Do you have Ovale Spell Priority already installed, Tantrum?

Revered
Posts: 224
Joined: Tue Dec 14, 2010 5:34 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Jeshu » Mon Apr 21, 2014 10:38 am

I have been busy but I am recently starting up Ovale development again. I have made a new release of Ovale 5.4.9beta1, but it likely breaks the existing Leafkiller script until I have had a chance to update the script to the current language changes. I will try to do that today.

I will make a longer report of the Ovale changes that affect the Leafkiller script a bit later today after I've had a chance to look it over.

Longer-term, since I have had to take over all of the Ovale development, I will likely merge the Nerien's Ovale Scripts addon into Ovale itself. The "Nerien" scripts will become the default Ovale scripts, so people will have to get used to a different icon style than before, and all contributed scripts will be included in the default distribution as well.

Exalted
User avatar
Posts: 1573
Joined: Fri Nov 25, 2011 7:49 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby aggixx » Mon Apr 21, 2014 2:29 pm

Cool, thanks for the update Jeshu.
Image

Revered
Posts: 224
Joined: Tue Dec 14, 2010 5:34 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Jeshu » Mon Apr 21, 2014 4:01 pm

Out of curiosity, are the action lists in SimulationCraft up to date for the current WoW release?

Exalted
User avatar
Posts: 1573
Joined: Fri Nov 25, 2011 7:49 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby aggixx » Mon Apr 21, 2014 8:49 pm

They should be yes. If you mean all of them, I'm not certain about every spec, but at least all the DPS specs should be.
Image

Revered
Posts: 224
Joined: Tue Dec 14, 2010 5:34 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Jeshu » Fri Apr 25, 2014 9:41 am

I think there is a bug in this part of the script:

Code: Select all
AddFunction ThrashCatHitDamage asValue=1
{
    {ThrashHitBaseDamage + AttackPower()}*ThrashHitDamagePerAttackPower * DamageMultiplier(THRASH_CAT) * CurrentCritChanceMultiplier() * CurrentMasteryMultiplier()
}

In short, it looks like:
Code: Select all
    (Base + AP) * Coeff * Multipliers

I think it's supposed to look like:
Code: Select all
    (Base + AP * Coeff) * Multipliers

Anyone know for certain?

Exalted
User avatar
Posts: 1573
Joined: Fri Nov 25, 2011 7:49 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby aggixx » Fri Apr 25, 2014 12:58 pm

It does look incorrect, yeah. Although all that would mean is that the base damage is getting undervalued a bit so it should only have implications in edge cases.
Image

Revered
Posts: 224
Joined: Tue Dec 14, 2010 5:34 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Jeshu » Fri Apr 25, 2014 4:33 pm

I will release a new Ovale beta shortly with the Leafkiller script. I've imported the script with some minor changes into the main Ovale addon. It's available under the usual place in the dropdown menu when selecting scripts, but you should remove Nerien's Ovale Scripts from your system or else the latter will overwrite the former.

I've left the bug with the Thrash damage computation unchanged for now.

After reading through the Leafkiller script, the changes for the new Ovale syntax were minor. Ovale now directly supports the concept of a "finisher" spell separate from one that costs zero combo points. Those spells are now specified with "combo=finisher" instead of "combo=0" and the glyphed Savage Roar is now also set with "combo=finisher min_combo=0" to show that it's a finisher that can be cast with no combo points.

The Leafkiller script can now be shortened a bit, but I didn't make any changes to take advantage of some new Ovale features listed below.

There are some changes in the Ovale to support the concept of "pool_resource" a bit better when pooling energy for a spell -- the time needed to pool energy is now inherent in the cooldown calculation used by algorithm to determine when the next action is available. What this means is that the following two lines are equivalent:
Code: Select all
wait if Energy() > EnergyCost(thrash_cat) Spell(thrash_cat)

wait Spell(thrash_cat)

The whole notion of required resources is now better implemented in Ovale, so if Thrash needs 50 energy but is free with Clearcasting and costs 50% less with Berserk, then you can now write:
Code: Select all
Define(thrash_cat 106830)
   SpellInfo(thrash_cat energy=50)
   SpellInfo(thrash_cat buff_energy_half=berserk_cat_buff if_stance=druid_cat_form)
   SpellInfo(thrash_cat buff_energy_none=omen_of_clarity_buff if_spell=omen_of_clarity)

These buffs are checked to determine the actual cost of a spell during a frame update. The following two statements should now be equivalent:
Code: Select all
if { BuffPresent(berserk_cat_buff) and Energy() >= 25 } or BuffPresent(omen_of_clarity_buff)
    Spell(thrash_cat)

Spell(thrash_cat)

Lastly, Ovale now supports the concept of "includes", so it's possible to split up a script into smaller, re-usable pieces. The top of the main druid script has the following lines:
Code: Select all
Include(ovale_items)
Include(ovale_racials)
Include(ovale_druid_spells)

These scripts can be found in the scripts subdirectory of the Ovale addon directory. It may be possible to do similar inclusions to replace the large block of Defines() and SpellInfo() information at the head of the Leafkiller script.

Certainly, I will have to see where I can optimize the code to reduce run-time, but I think Ovale is now more accurate than ever.

Revered
Posts: 450
Joined: Tue Feb 08, 2011 5:51 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby ShmooDude » Fri May 02, 2014 10:49 am

Jeshu wrote:I think there is a bug in this part of the script:

Code: Select all
AddFunction ThrashCatHitDamage asValue=1
{
    {ThrashHitBaseDamage + AttackPower()}*ThrashHitDamagePerAttackPower * DamageMultiplier(THRASH_CAT) * CurrentCritChanceMultiplier() * CurrentMasteryMultiplier()
}

In short, it looks like:
Code: Select all
    (Base + AP) * Coeff * Multipliers

I think it's supposed to look like:
Code: Select all
    (Base + AP * Coeff) * Multipliers

Anyone know for certain?


You are correct. The reason its like that is the weapon damage functions actually are calculated that way. For example, Mangle is (78 + WD)*5. Compare http://www.wowhead.com/spell=33876 or http://www.wowdb.com/spells/33876-mangle to the ingame tooltip. The wowhead/wowdb tooltips read 500% + 78, but in game its 500% + 390 which is 78*5. This actually made a difference when they buffed/nerfed the abilities as while the 5 might change, the 78 never did. I probably simply overlooked it when copy/pasting. Looks like FB and all other attack power based calculations are correct. Overall not a huge error, looks like about 3k damage (went from like ~40k to ~43k unbuffed for me) with the fix. Largely won't matter in WoD as base damage is going away anyhow.


Looking forward to trying out the new version, especially on my hunter who as I told you before had some very serious problems based on focus costs that it sounds like you fixed. :)

Posts: 6
Joined: Sat Jul 23, 2011 7:38 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Crossbow » Sun May 11, 2014 4:46 pm

I'm using Leafkiller's script in the recent Ovale version, and I notice the Rip ratio going totally out of control as soon as the next ability (after Rip) is applied. It goes up into thousands, resulting in Ovale always suggesting to refresh Rip instead of Ferocious Bite.
Rake seems to work fine.

Honored
Posts: 145
Joined: Thu Mar 18, 2010 12:33 am
Location: Melbourne, Australia

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Grenache » Mon May 12, 2014 3:01 am

I am also seeing it not suggest Savage Roar either. Let me try again on a dummy though..

EDIT: Confirmed. It only suggests a Roar once you have 5 combo points up. This is with both 5.4.9 and 5.4.10.

Posts: 13
Joined: Tue May 28, 2013 9:13 am

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Wellwow » Mon May 12, 2014 9:02 am

I was coming to report that SR wasn't being presented until there were 5 CPs too (even with glyph of Savagery), but also the version 5.4.10, Leafkiller script, isn't showing the key of abilities bound to T (S Roar), Q (mangle) and E (shred). It was showing the keys for abilities bound to 1-7, alt-1, and alt-5.

Revered
Posts: 450
Joined: Tue Feb 08, 2011 5:51 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby ShmooDude » Mon May 12, 2014 9:29 am

I haven't even touched the new ovale versions yet. If you revert to 5.4.8, everything should work until the script can be updated.

Chances are it has to do with a lot of the changes Jeshu made to ovale as the script will need to be updated for it.

Posts: 4
Joined: Mon May 12, 2014 12:18 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Theostaltos » Mon May 12, 2014 12:41 pm

What i did and seemed to fix that problem is delete the old Neriens Oval script ,and just reinstalled the new Ovale spell priority 5.4.10

It seems that there is a leafkillers script implemented inside the "main" ovale addon.You can select it from the drop-down menu like before.

Now i don't know if there are any other glitches ,especially when calculating ,RoRo s procs etc ,but at least i didn't notice any obvious problems like not suggesting SR or using Rip as the only finisher (which was the case when i updated ovale to 5.4.10)

Sadly i didn't have the time to test it properly.
A feedback from a dev or at least someone that can properly test it would be very helpfull

Posts: 2
Joined: Wed Mar 27, 2013 12:24 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby Edeard » Mon May 12, 2014 12:45 pm

I also had a few issues after the 4.10 update however I managed to fix them for myself by just selecting a different script from the drop down menu then re-selecting Leafkillers.

Revered
Posts: 450
Joined: Tue Feb 08, 2011 5:51 pm

Re: Leafkiller's MoP Feral/Guardian Ovale Script

Postby ShmooDude » Mon May 12, 2014 3:17 pm

Theostaltos wrote:What i did and seemed to fix that problem is delete the old Neriens Oval script ,and just reinstalled the new Ovale spell priority 5.4.10

It seems that there is a leafkillers script implemented inside the "main" ovale addon.You can select it from the drop-down menu like before.

Now i don't know if there are any other glitches ,especially when calculating ,RoRo s procs etc ,but at least i didn't notice any obvious problems like not suggesting SR or using Rip as the only finisher (which was the case when i updated ovale to 5.4.10)

Sadly i didn't have the time to test it properly.
A feedback from a dev or at least someone that can properly test it would be very helpfull


That makes sense as Jeshu said he was retiring the Nerien addon and just putting those scripts into Ovale itself.

PreviousNext

Return to Kitty DPS

Who is online

Users browsing this forum: Raysere and 8 guests