Archived

This topic is now archived and is closed to further replies.

Furion

Visualising the optimal cat rotation ingame

376 posts in this topic

Thanks for the work you put into this. I started using it last night and its great.

One question though. I want to add Barkskin into the CD box for when I tank. Where do you get the number that goes into the Define statement. I.e. Define(FF 770), where can I find that Faire Fire had the ID of 770?

edited: changed FFF to FF for the spell ID

Share this post


Link to post
Share on other sites

Just starting to try to figure out this script language (switched from FbN an hour ago) and noticed that this script will recommend Mangle the moment it falls off. Would it be possible to set that recommendation at 0.5 seconds _before_ it falls off as I'd rather not get caught in a GCD?

The alternative, of course, is to just keep an eye on a buff/debuff tracker addon in conjunction with the script, as I'm sure most of us are already.

Share this post


Link to post
Share on other sites
Just starting to try to figure out this script language (switched from FbN an hour ago) and noticed that this script will recommend Mangle the moment it falls off. Would it be possible to set that recommendation at 0.5 seconds _before_ it falls off as I'd rather not get caught in a GCD?

The alternative, of course, is to just keep an eye on a buff/debuff tracker addon in conjunction with the script, as I'm sure most of us are already.

You can change the following line

unless {TargetDebuffPresent(MANGLE) or TargetDebuffPresent(MANGLEB) or TargetDebuffPresent(TRAUMA)} Spell(MANGLE)

to
if {TargetDebuffExpires(MANGLE 1) or TargetDebuffExpires(MANGLEB 1) or TargetDebuffExpires(TRAUMA 1)} Spell(MANGLE)

I don't know if you can enter 0.5 but replace the 1's with 0.5 and give it a try.

Share this post


Link to post
Share on other sites
On another note: I am also not sure if it's a good idea to tie the script to simcraft forever in the way you seem to be suggesting.

I am not convinced this is true. From what I can see Ovale does execute the code in a way that is consistent with how Bkim wrote his script i.e. how the logic is expressed in the simulator. You did not see Rake due to a bug in the script that has to do with the time to die option Bkim included. Once I fixed that Rake was suggested correctly with that option on. Specifically:

		# actions+=/rake,time_to_die>=9

		if TargetDebuffExpires(RAKE 0 mine=1) {

			if CheckBoxOn(TTD) if TargetDeadIn(less 10) Spell(RAKE)

			if CheckBoxOff(TTD) Spell(RAKE)

		}

Should be:
		# actions+=/rake,time_to_die>=9

		if TargetDebuffExpires(RAKE 0 mine=1) {

			if CheckBoxOn(TTD) unless TargetDeadIn(less 10) Spell(RAKE)

			if CheckBoxOff(TTD) Spell(RAKE)

		}

Also, one of the things that is handled by the this script is the case where it is desirable to refresh SR early (in this snippet):

		# actions+=/savage_roar,cp>=5,savage_roar<=6,rip>=6

		if {ComboPoints(more 4) and BuffExpires(ROAR 6)} {

			unless TargetDebuffExpires(RIP 6) Spell(ROAR)

		}

Given the variability of RNG it is not possible for us to measure dps by doing test runs on dummies. The most we can do is to watch the cooldowns and make a judgment call on whether or not the move selector is making logical suggestions. We need simulators to execute 1000s of runs to measure small improvements in DPS - and if the Ovale code can mirror the sim code we are more likely to benefit from small dps improvements in the algorithm.

Share this post


Link to post
Share on other sites

I think it would be a lot easier if you just reposted Bkims hole script with all the fixes you made

Share this post


Link to post
Share on other sites

Leafkiller, thanks for that. I was looking at what was wrong with it and found it as well. Should be "unless" instead of "if".

I've also been able to figure out the following statement as well but I'm at work so I haven't been able to test it.


# actions+=/shred,if=cooldown.tigers_fury.remains<=3

if 3s before Spell(TIGER) Spell(SHRED)

Here is the other statement to fix so bite isn't suggested when Berserk is active:

# actions+=/ferocious_bite,cp>=5,rip>=10

unless BuffPresent(BERSERK) {

	if ComboPoints(more 4) {

		unless TargetDebuffExpires(RIP 10 mine=1) Spell(BITE)

	}

}


I've made other changes as well. I'll post the whole script with all changes once I've at least unit tested it once I get home. Or you can PM me for the script and I'll send it to you.

Share this post


Link to post
Share on other sites
You can change the following line

unless {TargetDebuffPresent(MANGLE) or TargetDebuffPresent(MANGLEB) or TargetDebuffPresent(TRAUMA)} Spell(MANGLE)

to
if {TargetDebuffExpires(MANGLE 1) or TargetDebuffExpires(MANGLEB 1) or TargetDebuffExpires(TRAUMA 1)} Spell(MANGLE)

I don't know if you can enter 0.5 but replace the 1's with 0.5 and give it a try.

Did not work - just returned Mangle as the recommendation all the time instead of Shred or Rake. Thinking with the priority I place on Mangle always being up that 1 second would be just fine.

Share this post


Link to post
Share on other sites

I think my logical statement is wrong again. Try this:


if {TargetDebuffExpires(MANGLE 0.5) and TargetDebuffExpires(MANGLEB 0.5) and TargetDebuffExpires(TRAUMA 0.5)} Spell(MANGLE)

It used to say that if mangle or manglebear or trauma were less than 0.5 seconds CD, then suggest mangle. In your case, manglebear and trauma would always be less than 0.5 seconds so it will suggest it always.

It now says if mange and mangelbear and trauma are all less than 0.5 seconds CD, then suggest mangle.

Share this post


Link to post
Share on other sites

That coding won't work either because the target would have to have all three debuff on it which should never happen.

Because the debuff can come from multiple sources I think we will have to let Mangle fall off the target before the script can suggest it properly. The orginal code looks to me like the best approch.

Share this post


Link to post
Share on other sites

As a precursor - I've never used the Ovale language to update/change a script, but I felt as far as a 'programming/script' language the ability might exist to solve this issue. I don't want to speculate on how the language works, but that is basically what I'm doing here.

So I went looking through the Ovale Documentation for a solution to this problem. I see there is a 'TargetDebuffPresent' action.

Using the 'TargetDebuffPresent' action to indicate which debuff (either Mangle, Mangle (Bear), or Trauma) exists on the target at that time? Then you can change the logic of the 'if' statement to check which debuff is active before checking to see when it expires. Hope that makes sense..


if TargetDebuffPresent(MANGLE) {

     if TargetDebuffExpires(MANGLE 1) Spell(MANGLE)

}


if TargetDebuffPresent(BMANGLE) {

     if TargetDebuffExpires(BMANGLE 1) Spell(MANGLE)

}


if TargetDebuffPresent(TRAUMA) {

     if TargetDebuffExpires(TRAUMA 1) Spell(MANGLE)

}

If this is wrong, doesn't make sense, will not work feel free to call me a fool. Like I said at the beginning of the post this is partly speculation because I have no way to test and have never used the script language.

Share this post


Link to post
Share on other sites
That coding won't work either because the target would have to have all three debuff on it which should never happen.

Because the debuff can come from multiple sources I think we will have to let Mangle fall off the target before the script can suggest it properly. The orginal code looks to me like the best approch.

It actually does work. I have an updated script with it included and I get prompts for Mangle.


if {TargetDebuffExpires(MANGLE 0.5) and TargetDebuffExpires(MANGLEB 0.5) and TargetDebuffExpires(TRAUMA 0.5)} Spell(MANGLE)

TargetDebuffExpires also checks for the absence of a debuff. e.g. TargetDebuffExpires(MANGLE 0) is the direct opposite of TargetDebuffPresent(MANGLE).

So the statement above it's checking if any of those debuffs has either 0.5 sec or less or has expired.

Share this post


Link to post
Share on other sites

Since my update yesterday the script should reflect the current status of theorycrafting.

Unless I get convincing feedback that states the DPS produced by following it ingame is suboptimal I will probably not update it until there are new discoveries through simcraft (which might not take long as there were a few nasty bugs for ferals, apparently).

Share this post


Link to post
Share on other sites

I have translated the SimulationCraft actions for feral DPS and created an Ovale script. The Ovale addon can be found here: Ovale - WoW AddOns - CurseForge.com

What you get:

  • A Large center Icon for move suggestions
  • Two smaller icons with CD for your trinkets on the left
  • Two smaller icons for your Tiger's Fury and Berserk CD's on the right

In-game Options (Click on the icon to get options)

  • Toggle on/off Tiger's Fury suggestions
  • Toggle on/off Faerie Fire suggestions
  • Toggle on/off Mangle suggestions

Change Log:

  • v1
    • Initial revision

Deviations from the SimulationCraft action list:

  • actions+=/berserk_cat,energy>=70,energy<=90
    • Excluded because it caused odd behavior in Ovale

    [*] actions+=/shred,extend_rip=1,rip<=4

    • Since Ovale monitors buff and debuff timers in real time, we get this by default.

    [*] actions+=/ferocious_bite,cp>=5,rip>=10

    • Added logic to this statement to never suggest FB when Berserk is active

    [*] actions+=/mangle_cat,mangle<=1

    • Also checks for Mangle (Bear) and Trauma

Known Issues

The Ovale Script


#------------------------------------------------

# Feral Cat DPS Ovale Script v1

#

# Based on SimulationCraft actions

# http://elitistjerks.com/f73/t81052-best_possible_feral_dps_simulationcraft/

#------------------------------------------------


Define(FFF 16857)

Define(FF 770)

Define(RIP 1079)

Define(MANGLE 33876)

Define(SHRED 5221)

Define(TIGER 5217)

Define(RAKE 59886)

Define(ROAR 52610)

Define(BITE 22568)

Define(BERSERK 50334)

Define(OMEN 16870)

Define(TRAUMA 46857)

Define(MANGLEB 33878)


AddCheckBox(CheckBoxTF "Suggest Tiger's Fury")

AddCheckBox(CheckBoxFF "Suggest Faerie Fire")

AddCheckBox(CheckBoxDisableMangle "Don't suggest Mangle")



AddIcon help=cd size=small nocd=0 {

	if Stance(3) { # cat

		Item(Trinket0Slot usable=1)

	}

}


AddIcon help=cd size=small nocd=0 {

	if Stance(3) { # cat

		Item(Trinket1Slot usable=1)

	}

}



AddIcon help=main {

	if Stance(3) {  # CAT


		# actions+=/faerie_fire_feral,debuff_only=1

		if CheckBoxOn(CheckBoxFF) {

			unless {TargetDebuffPresent(FFF) or TargetDebuffPresent(FF)} Spell(FFF)

		}


		# actions+=/tigers_fury,energy<=40,berserk=0

		if CheckBoxOn(CheckBoxTF) {

			unless BuffPresent(BERSERK) if Mana(less 40) Spell(TIGER)

		}


		# actions+=/savage_roar,cp>=1,savage_roar<=1

		if {ComboPoints(more 0) and BuffExpires(ROAR 1)} Spell(ROAR)


		# actions+=/savage_roar,cp>=5,savage_roar<=6,rip>=6

		if {ComboPoints(more 4) and BuffExpires(ROAR 6)} {

			unless TargetDebuffExpires(RIP 5 mine=1) Spell(ROAR)

		}


		# actions+=/rip,cp>=5,time_to_die>=6

		if {ComboPoints(more 4) and TargetDebuffExpires(RIP 0 mine=1)} {

			unless TargetDeadIn(less 6) Spell(RIP)

		}


		# actions+=/ferocious_bite,cp>=5,time_to_die<=6

		if ComboPoints(more 4) {

			if TargetDeadIn(less 6) Spell(BITE)

		}


		# actions+=/ferocious_bite,cp>=5,rip>=10

		unless BuffPresent(BERSERK) {

			if ComboPoints(more 4) {

				unless TargetDebuffExpires(RIP 10 mine=1) Spell(BITE)

			}

		}


		# actions+=/mangle_cat,mangle<=1

		if CheckBoxOff(CheckBoxDisableMangle) {

			if {TargetDebuffExpires(MANGLE 1) and TargetDebuffExpires(MANGLEB 1) and TargetDebuffExpires(TRAUMA 1)} {

				Spell(MANGLE)

			}

		}


		# actions+=/rake,time_to_die>=9

		if TargetDebuffExpires(RAKE 0 mine=1) {

			unless TargetDeadIn(less 10) Spell(RAKE)

		}


		# actions+=/shred,energy>=70

		if Mana(more 69) Spell(SHRED)


		# actions+=/shred,omen_of_clarity=1

		if BuffPresent(OMEN) Spell(SHRED)


		# actions+=/shred,cp<=4,rip<=3

		if {ComboPoints(less 5) and TargetDebuffExpires(RIP 3 mine=1)} Spell(SHRED)


		# actions+=/shred,time_to_die<=9

		if TargetDeadIn(less 10) Spell(SHRED)


		# actions+=/shred,berserk=1

		if BuffPresent(BERSERK) Spell(SHRED)


	}

}


AddIcon help=cd size=small nocd=0 {

	if Stance(3) { # cat

		Spell(TIGER)

	}

}


AddIcon help=cd size=small nocd=0 {

	if Stance(3) { # cat

		Spell(BERSERK)

	}

}

Share this post


Link to post
Share on other sites

Thanks everyone, and bkim. I guess I didn't refresh when I sent you that PM. I haven't tried it out yet, but from what I'm looking at the script does it just check to see if mangle is up or is that with 1 sec left on it? Being a FBN fan this sounds similar to that and am going to try it out tomorrow.

One thing I dislike is that I can do respectable dps on my own, but to maximize dps and I mean to really push things to the limit, I need to use an addon. Granted there are still situations where you can't follow the addon that makes or breaks the player.

Share this post


Link to post
Share on other sites

I was running ICC last night and ran into a problem. There were 2 other ferals in the raid and it kept reading thier RIP's as my own. Anyone else have this problem? I was using the latest version that has been posted.

Share this post


Link to post
Share on other sites

I always run with another feral and never had that Problem.

I just cleaned up my script again and posted another version with a few small tweaks. Will test bkim's script tomorrow.

Share this post


Link to post
Share on other sites

Has anyone figured out a way to add a timer for the internal cooldown of trinkets as a small side window?

Such as for death's choice and runestone (both have a 45? second internal cooldown on their procs.) This is about the only thing my custom script is missing.

Share this post


Link to post
Share on other sites

I doubt this is possible without a lot of effort as libinternalcooldowns isn't in the ovale package. I guess for now the best solution would be to use a different addon like InternalCooldowns - Addons - Curse

If you want to do it only with ovale maybe this part of the documentation helps in creating "custom timers"

Ovale - Documentation - WoW AddOns - CurseForge.com

I'm curious if you have a rational set of rules to modify your rotation when watching the ICDs.

And feel free to post your custom scripts here, too, if it adds anything to the table maybe I'll include it in the OP.

However, I won't be online for about a week from Monday on.

Share this post


Link to post
Share on other sites

I don't really change my rotation based on my procs, but i do like to match my berserks so that they overlap with my trinket procs to get the most out of both.

Share this post


Link to post
Share on other sites

Version 1.7 up, significantly increased Rip uptime. Should really be the final update before Christmas.

Share this post


Link to post
Share on other sites
Has anyone figured out a way to add a timer for the internal cooldown of trinkets as a small side window?

Such as for death's choice and runestone (both have a 45? second internal cooldown on their procs.) This is about the only thing my custom script is missing.

Try this out:


Define(MJOLNIR 65019)

Define(DCNORM 67702)

Define(DCHEROIC 67771)

AddIcon help=cd size=small nocd=1 {

	if Stance(3) {

		unless BuffPresent(MJOLNIR) if BuffGain(MJOLNIR 45) Item(Trinket0Slot);

	}

}

AddIcon help=cd size=small nocd=1 {

	if Stance(3) {

		unless BuffPresent(DCNORM) if BuffGain(DCNORM 45) Item(Trinket1Slot);

		unless BuffPresent(DCHEROIC) if BuffGain(DCHEROIC 45) Item(Trinket1Slot);

	}

}


I haven't test it because I don't have either trinket. It adds two icons, one for each trinket slot. What I'm thinking it will do is display a icon of the trinket once it has past the 45 sec timer. This assumes you have the runestone in the 1st trinket slot and the DC in the 2nd. You can modify the code if that's not the case. Let me know if this works and I can add it to my script as an option.

EDIT: Was thinking, instead of showing when the internal CD has expired, wouldn't you just wanna know when the buff is active? That would be a lot easier to implement.

EDIT #2: Doesn't quite work the way I wanted it to.

Share this post


Link to post
Share on other sites
Version 1.7 up, significantly increased Rip uptime. Should really be the final update before Christmas.

Ran a 5p and you script was suggesting Rake when it was already up. Unable to reproduce on a dummy... had a DK tank, Ret pally, Mage, Holy pally in the group if that's any help.

@bkim - thanks for putting up your version. I personally much prefer having TF included in the suggestions, and the options you've included are great. Kinda wish there was an easy way to have both your and Furion's versions up easily accessible.

Share this post


Link to post
Share on other sites

The only major issue I have with bkim's script is that if SR is about to drop soon, it doesn't suggest to reup it until it has ~1 second left. Several times I've had Rip waiting to be used without enough energy to actually use it, then right as I used Rip it switches to SR which IMO should have been a higher priority. Isn't the goal to never let SR drop whatsoever?

Share this post


Link to post
Share on other sites
The only major issue I have with bkim's script is that if SR is about to drop soon, it doesn't suggest to reup it until it has ~1 second left. Several times I've had Rip waiting to be used without enough energy to actually use it, then right as I used Rip it switches to SR which IMO should have been a higher priority. Isn't the goal to never let SR drop whatsoever?

This is most likely the correct sequence. If Rip has already expired, and Savage Roar is about to expire, and you're low on energy, you're in a tight spot. The best you can do is make sure that the Rip you throw up is boosted by Savage Roar, then pull a quick single combo point Savage Roar.

This way, you're only losing 33% extra damage on a few auto-attacks and one special, whereas if you refreshed Savage Roar first, and you were tight for energy, it would take ages to get a five combo point Rip up again.

It all comes down to you being able to Savage Roar at one combo point without undue ill effects.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.