Parry Hasting Addon
Moderators: Fridmarr, Worldie, Aergis, theckhd
Re: Parry Hasting Addon
OK, I have some results. First of all, here's the current version of the code: ph_analyzer2.m
I've done a lot of commenting to make it readable, and it now runs reasonably quickly (under a minute per boss, even for large logs) in Matlab 2009a. I still want to do some things with it both to help debug the code and to help us investigate how certain attacks interact with parry mechanics, but for now the most important stuff works.
Here's a rundown based on three logs, one from Ony+ToC25, and two from ICC10. The logs can be downloaded here (15 MB): WCL_archive1.rar.
They correspond to the following WoL raids:
ToC25+Ony: Expired
ICC10: Marrowgar-DBS, Sindragosa
ICC10: Sindragosa, Plague, Crimson Halls, LK attempts
ICC10: Marrowgar-DBS, Plague, Crimson Halls (alt run)
The last two raids were in the same combat log, which explains a few weird features in the plots (I'll make note of them when we get there). The first wing bosses and Sindragosa data come from the first main run. LK data comes from the second main run, and Plague/Crimson Halls data comes from both runs.
Note: The saveas() function is doing something weird to the plots. I'm going back and manually re-saving the plots to make them all look as pretty as the second Onyxia one.
<edit>: Plots fixed.
Boss-by-boss breakdown:
Lord Marrowgar
PH off. See below.

This one looks crazy, but it's actually pretty consistent. Browsing the log, it seems that the two hits from an individual Saber Lash can register at vastly different times. For example, here are the first 10 unparried events (blue dots):
It may be tricky to read with word wrap, but the point is that all of the entries at ~400 or ~800 ms correspond to cases where the same Saber Lash hit the two of us at slightly different times. It seems to happen mostly when one player avoids the Saber Lash and the other takes the damage, which is strange.
This is one thing I want to fix about the current code (i.e. only register the first in a series of cleave entries), but it will take some time to get the implementation right. if you ignore the Saber Lash effects, we get a very consistent swing timer of around 1.2s (1.0 pre-slow).
Lady Deathwhisper
PH on. Not much data here, but there seem to be at least a few examples of parry-haste

Deathbringer Saurfang
PH off. Excellent data set since he melees a lot.

Festergut
PH off. We already knew they'd turn PH off for this one, and the data confirms it. There are two kills in here.

Rotface
Another good data set showing that parry-hasting is turned off. There should be one kill, then two wipes and another kill in this log.

Putricide
PH off. No question about it. This is actually three attempts: one kill (main run), followed by a wipe in phase 2 (abom failure on alt run), followed by another kill (alt run).

Prince Valanar
PH off. Lots of clear examples. Also a nice display of JotJ dropping off. Again, 2 kills.

Prince Taldaram
PH off. Two kills.

Blood-Queen Lana'thel
PH off. One kill, and then a few wipes (alt run)

Sindragosa
PH on. This is 3 wipes.

This second plot is 4 more wipes and a kill

There's a lot going on in these two plots, but the first one should be enough to convince us that she parry-hastes. A lot of the extra junk is due to the Frost Breaths and Cleaves, I need to work on that portion to improve the handling of those events.
Lich King
PH off. This is 6 different wipes.

The ToC bosses are all single-attempt kills.
Gormok
PH off. Nothing surprising here, we know it's disabled on him.

Dreadscale
PH on. There are a few examples in the log that demonstrate it clearly.

Acidmaw
PH ??. We really don't have enough data for acidmaw, he spends most of his time spewing acid. Parryhaste is probably not a serious concern on him either way.

Icehowl
PH on. Icehowl does parry-haste, and we have a number of examples to choose from.

Jaraxxus
PH off. The one parry that looks like a haste (event 64) is actually a melee that was followed by a Fel Lightning cast, as are all of the other events below the baseline. Fel Lightning seems to have a shorter cast time than 2.4 seconds, so these events show up as "faster than usual" swings. The one exception is event 59 (no parry), which is a sequence of melee attacks - presumably the druid tank let Demo Roar fall off momentarily.

Eydis Darkbane
PH off. The Twin Spike section is pretty neat (at least, I assume that's what the dip is)

Fjola Lightbane
PH off.

Anub'arak
PH off.

Onyxia
PH on? Again, this plot is really noisy due to Flame Breaths, Cleaves, and Bellowing Roars.

Just to check, I put circles on all the Cleaves and diamonds on all of the Flame Breaths:

There doesn't seem to be a particular pattern here. It'll take a little more digging to figure out what's going on with the dragon bosses.
I'll be posting a new "comprehensive list" post later on today or tomorrow.
I've done a lot of commenting to make it readable, and it now runs reasonably quickly (under a minute per boss, even for large logs) in Matlab 2009a. I still want to do some things with it both to help debug the code and to help us investigate how certain attacks interact with parry mechanics, but for now the most important stuff works.
Here's a rundown based on three logs, one from Ony+ToC25, and two from ICC10. The logs can be downloaded here (15 MB): WCL_archive1.rar.
They correspond to the following WoL raids:
ToC25+Ony: Expired
ICC10: Marrowgar-DBS, Sindragosa
ICC10: Sindragosa, Plague, Crimson Halls, LK attempts
ICC10: Marrowgar-DBS, Plague, Crimson Halls (alt run)
The last two raids were in the same combat log, which explains a few weird features in the plots (I'll make note of them when we get there). The first wing bosses and Sindragosa data come from the first main run. LK data comes from the second main run, and Plague/Crimson Halls data comes from both runs.
Note: The saveas() function is doing something weird to the plots. I'm going back and manually re-saving the plots to make them all look as pretty as the second Onyxia one.
<edit>: Plots fixed.
Boss-by-boss breakdown:
Lord Marrowgar
PH off. See below.

This one looks crazy, but it's actually pretty consistent. Browsing the log, it seems that the two hits from an individual Saber Lash can register at vastly different times. For example, here are the first 10 unparried events (blue dots):
- Code: Select all
2/3 22:08:58.809 SWING_DAMAGE,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x0300000000183351,"Theck",0x511,9661,0,1,0,0,0,nil,nil,nil
2/3 22:09:00.044 SWING_MISSED,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
2/3 22:09:01.223 SWING_DAMAGE,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x0300000000183351,"Theck",0x511,6698,0,1,0,0,1470,nil,nil,nil
2/3 22:09:03.318 SWING_DAMAGE,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x0300000000183351,"Theck",0x511,8799,0,1,0,0,0,nil,nil,nil
2/3 22:09:04.488 SWING_DAMAGE,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x0300000000183351,"Theck",0x511,8782,0,1,0,0,0,nil,nil,nil
2/3 22:09:05.754 SPELL_MISSED,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x03000000038A3438,"Spektrum",0x512,69055,"Saber Lash",0x1,DODGE
2/3 22:09:06.112 SPELL_DAMAGE,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x0300000000183351,"Theck",0x511,69055,"Saber Lash",0x1,8799,0,1,0,0,0,nil,nil,nil
2/3 22:09:08.123 SPELL_MISSED,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x0300000000183351,"Theck",0x511,69055,"Saber Lash",0x1,MISS
2/3 22:09:08.475 SPELL_DAMAGE,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x03000000038A3438,"Spektrum",0x512,69055,"Saber Lash",0x1,6417,0,1,0,0,2026,nil,nil,nil
2/3 22:09:09.667 SPELL_DAMAGE,0xF130008F04004E60,"Lord Marrowgar",0x10a48,0x0300000000183351,"Theck",0x511,69055,"Saber Lash",0x1,8783,0,1,0,0,0,nil,nil,nil
It may be tricky to read with word wrap, but the point is that all of the entries at ~400 or ~800 ms correspond to cases where the same Saber Lash hit the two of us at slightly different times. It seems to happen mostly when one player avoids the Saber Lash and the other takes the damage, which is strange.
This is one thing I want to fix about the current code (i.e. only register the first in a series of cleave entries), but it will take some time to get the implementation right. if you ignore the Saber Lash effects, we get a very consistent swing timer of around 1.2s (1.0 pre-slow).
Lady Deathwhisper
PH on. Not much data here, but there seem to be at least a few examples of parry-haste

Deathbringer Saurfang
PH off. Excellent data set since he melees a lot.

Festergut
PH off. We already knew they'd turn PH off for this one, and the data confirms it. There are two kills in here.

Rotface
Another good data set showing that parry-hasting is turned off. There should be one kill, then two wipes and another kill in this log.

Putricide
PH off. No question about it. This is actually three attempts: one kill (main run), followed by a wipe in phase 2 (abom failure on alt run), followed by another kill (alt run).

Prince Valanar
PH off. Lots of clear examples. Also a nice display of JotJ dropping off. Again, 2 kills.

Prince Taldaram
PH off. Two kills.

Blood-Queen Lana'thel
PH off. One kill, and then a few wipes (alt run)

Sindragosa
PH on. This is 3 wipes.

This second plot is 4 more wipes and a kill

There's a lot going on in these two plots, but the first one should be enough to convince us that she parry-hastes. A lot of the extra junk is due to the Frost Breaths and Cleaves, I need to work on that portion to improve the handling of those events.
Lich King
PH off. This is 6 different wipes.

The ToC bosses are all single-attempt kills.
Gormok
PH off. Nothing surprising here, we know it's disabled on him.

Dreadscale
PH on. There are a few examples in the log that demonstrate it clearly.

Acidmaw
PH ??. We really don't have enough data for acidmaw, he spends most of his time spewing acid. Parryhaste is probably not a serious concern on him either way.

Icehowl
PH on. Icehowl does parry-haste, and we have a number of examples to choose from.

Jaraxxus
PH off. The one parry that looks like a haste (event 64) is actually a melee that was followed by a Fel Lightning cast, as are all of the other events below the baseline. Fel Lightning seems to have a shorter cast time than 2.4 seconds, so these events show up as "faster than usual" swings. The one exception is event 59 (no parry), which is a sequence of melee attacks - presumably the druid tank let Demo Roar fall off momentarily.

Eydis Darkbane
PH off. The Twin Spike section is pretty neat (at least, I assume that's what the dip is)

Fjola Lightbane
PH off.

Anub'arak
PH off.

Onyxia
PH on? Again, this plot is really noisy due to Flame Breaths, Cleaves, and Bellowing Roars.

Just to check, I put circles on all the Cleaves and diamonds on all of the Flame Breaths:

There doesn't seem to be a particular pattern here. It'll take a little more digging to figure out what's going on with the dragon bosses.
I'll be posting a new "comprehensive list" post later on today or tomorrow.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
-

theckhd - Moderator
- Posts: 7452
- Joined: Thu Jul 31, 2008 3:06 pm
- Location: Harrisburg, PA
Re: Parry Hasting Addon
While refining the method for calculating the parry haste bonus I came to a conclusion that double parry hasting cannot occur in practice. And in theory the only time double parry hasting can occur is with both parries at the exact beginning of the swing timer.
While my only understanding of parry hasting comes from Formulas:Parry - WoWWiki, the only way to receive two 40% bonuses is to have them at the beginning so that the remaining swing timer is 20%.
If A is less than 100%, E will be less than 20% and the bonus of D will not be applied.
If anyone knows the parry hasting mechanics more, I could value your input.
While my only understanding of parry hasting comes from Formulas:Parry - WoWWiki, the only way to receive two 40% bonuses is to have them at the beginning so that the remaining swing timer is 20%.
- Code: Select all
A 100% (full swing timer remaning)
B - 40%
C = 60% (normal parry haste)
D - 40%
E = 20% (fastest you can swing)
If A is less than 100%, E will be less than 20% and the bonus of D will not be applied.
If anyone knows the parry hasting mechanics more, I could value your input.
- Tbdsamman
- Posts: 10
- Joined: Fri Jan 15, 2010 8:38 am
Re: Parry Hasting Addon
I do not have the data to say how parry hasting really works, but I had heard it worked differently than wowwiki suggested.
If your swing speed is x, I had heard that if your swing timer is anywhere between 1 and 0.6x, then the first parry would reduce the swing timer to 0.6x. If the swing timer was between 0.2 and 0.6x, then a parry would reduce the swing timer to 0.2x.
If parry haste works the way I had described (and I have read on some websites that it works this way), then a double parry haste is a distinct possibility in practice.
If your swing speed is x, I had heard that if your swing timer is anywhere between 1 and 0.6x, then the first parry would reduce the swing timer to 0.6x. If the swing timer was between 0.2 and 0.6x, then a parry would reduce the swing timer to 0.2x.
If parry haste works the way I had described (and I have read on some websites that it works this way), then a double parry haste is a distinct possibility in practice.
- Cliffton
- Posts: 17
- Joined: Thu Jan 21, 2010 12:19 pm
Re: Parry Hasting Addon
Not quite. There was extensive research done over at EJ.
Basically, every parry removes up to 40% off of the swing timer, but cannot reduce it below 20%. It's not a binary operation though. If you're at 45% left and parry, it will remove 25%, dropping you to 20% left on your swing timer. You can see it pretty clearly in the first plot of this post.
So in Tbdsamman's example of two simultaneous parries, if you start A at 95, it looks like this:
Basically for any starting value A between 61 and 100, the second parry would do at least something.
Basically, every parry removes up to 40% off of the swing timer, but cannot reduce it below 20%. It's not a binary operation though. If you're at 45% left and parry, it will remove 25%, dropping you to 20% left on your swing timer. You can see it pretty clearly in the first plot of this post.
So in Tbdsamman's example of two simultaneous parries, if you start A at 95, it looks like this:
- Code: Select all
A 95%
B -40%
C = 55%
D -40%
E 20% (lower limit)
Basically for any starting value A between 61 and 100, the second parry would do at least something.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
-

theckhd - Moderator
- Posts: 7452
- Joined: Thu Jul 31, 2008 3:06 pm
- Location: Harrisburg, PA
Re: Parry Hasting Addon
Theck, there is a problem with the code that you have posted. The parryData array in your version includes the events when the boss attacks a player and the player parries.
This is going to muddy up the plots. They will show many more boss parries than are really happening (i.e. make too many red dots). This would provide false testimony that parry hasting is disabled.
The parser should distinguish between boss parries and player parries while populating the parryData array to fix this.
You've also got a large number of swingTimes that are unusually high, this is a symptom of the same problem. The "Boss attacks player" parries are being counted in the parryData bucket instead of the swingData bucket where they belong.
For Octave compatibility, I suggest changing where you use the Boolean expression of
to
Matlab (your version anyways) will apparently let you concatenate null rows with non-null rows if strfind returns the [] array, however, Octave will not. Octave will let you concatenate null columns with non-null columns though.
There is also an index problem that Octave does not like in
On the final pass through your loop "%% New while loop - faster
while( 0 < nextLine )", nextLine is an integer and not a string. Matlab I suppose will permit strfind to run on an integer (automatic conversion or some such) but Octave will not.
EDIT: On a side note, in Octave, the code seems to run equally fast with or without regexp's in there. I suspect that Matlab does not use a radically different implementation of regexp, so I'm suspicious that there may exist is another root cause of the execution time difference.
This is going to muddy up the plots. They will show many more boss parries than are really happening (i.e. make too many red dots). This would provide false testimony that parry hasting is disabled.
The parser should distinguish between boss parries and player parries while populating the parryData array to fix this.
You've also got a large number of swingTimes that are unusually high, this is a symptom of the same problem. The "Boss attacks player" parries are being counted in the parryData bucket instead of the swingData bucket where they belong.
For Octave compatibility, I suggest changing where you use the Boolean expression of
- Code: Select all
[strfind(x);strfind(y);strfind(z)]
to
- Code: Select all
[strfind(x),strfind(y),strfind(z)]
Matlab (your version anyways) will apparently let you concatenate null rows with non-null rows if strfind returns the [] array, however, Octave will not. Octave will let you concatenate null columns with non-null columns though.
There is also an index problem that Octave does not like in
- Code: Select all
if( (strfind(nextLine,boss)) ) %Determine if this line is relevant to boss fight
On the final pass through your loop "%% New while loop - faster
while( 0 < nextLine )", nextLine is an integer and not a string. Matlab I suppose will permit strfind to run on an integer (automatic conversion or some such) but Octave will not.
EDIT: On a side note, in Octave, the code seems to run equally fast with or without regexp's in there. I suspect that Matlab does not use a radically different implementation of regexp, so I'm suspicious that there may exist is another root cause of the execution time difference.
Last edited by Cliffton on Wed Feb 10, 2010 8:31 pm, edited 1 time in total.
- Cliffton
- Posts: 17
- Joined: Thu Jan 21, 2010 12:19 pm
Re: Parry Hasting Addon
Cliffton wrote:Theck, there is a problem with the code that you have posted. The parryData array in your version includes the events when the boss attacks a player and the player parries.
This is going to muddy up the plots. They will show many more boss parries than are really happening (i.e. make too many red dots). This would provide false testimony that parry hasting is disabled.
The parser should distinguish between boss parries and player parries while populating the parryData array to fix this.
You've also got a large number of swingTimes that are unusually high, this is a symptom of the same problem. The "Boss attacks player" parries are being counted in the parryData bucket instead of the swingData bucket where they belong.
Ah, ok. That explains a lot actually. Figuring out what was causing the extra long-time parry values was on my list of things to do when I find some more time.
Cliffton wrote:For Octave compatibility, I suggest changing where you use the Boolean expression of
- Code: Select all
[strfind(x);strfind(y);strfind(z)]
to
- Code: Select all
[strfind(x),strfind(y),strfind(z)]
Matlab (your version anyways) will apparently let you concatenate null rows with non-null rows if strfind returns the [] array, however, Octave will not. Octave will let you concatenate null columns with non-null columns though.
There is also an index problem that Octave does not like in
- Code: Select all
if( (strfind(nextLine,boss)) ) %Determine if this line is relevant to boss fight
On the final pass through your loop, nextLine is an integer and not a string. Matlab I suppose will permit strfind to run on an integer (automatic conversion or some such) but Octave will not.
OK, I'll go back and fix that. MATLAB doesn't like "strfind() || strfind() || strfind()", but it did allow me to build them into an array and check it that way.
I can add another conditional in there (nextline~=-1) to solve the strfind() problem.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
-

theckhd - Moderator
- Posts: 7452
- Joined: Thu Jul 31, 2008 3:06 pm
- Location: Harrisburg, PA
Re: Parry Hasting Addon
theckhd wrote:OK, I'll go back and fix that. MATLAB doesn't like "strfind() || strfind() || strfind()", but it did allow me to build them into an array and check it that way.
Not even if you enclose the expression in parens? "(strfind(x) || strfind(y) || strfind(z))"?
- Cliffton
- Posts: 17
- Joined: Thu Jan 21, 2010 12:19 pm
Re: Parry Hasting Addon
Cliffton wrote:theckhd wrote:OK, I'll go back and fix that. MATLAB doesn't like "strfind() || strfind() || strfind()", but it did allow me to build them into an array and check it that way.
Not even if you enclose the expression in parens? "(strfind(x) || strfind(y) || strfind(z))"?
I think I tried that, but I honestly can't remember. That's one of the drawbacks of doing any coding before coffee has kicked in. I'll double check it tomorrow.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
-

theckhd - Moderator
- Posts: 7452
- Joined: Thu Jul 31, 2008 3:06 pm
- Location: Harrisburg, PA
Re: Parry Hasting Addon
You also accidentally used the image for your first Onyxia plot for Anub'arak.

-

Chicken - Posts: 1597
- Joined: Fri Jun 26, 2009 2:19 pm
Re: Parry Hasting Addon
Chicken wrote:You also accidentally used the image for your first Onyxia plot for Anub'arak.
Oops. Looks like I manually saved over the Anub'arak one when fixing the images.
I'll fix that as I re-run the parses today (going to fix the bugs that Cliff found).
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
-

theckhd - Moderator
- Posts: 7452
- Joined: Thu Jul 31, 2008 3:06 pm
- Location: Harrisburg, PA
Re: Parry Hasting Addon
Just as an update - I've made a lot of changes to the code, and fixed a lot of problems (for one thing, it was completely ignoring player parries as well, which was causing a lot of the high-delay noise). I've also added some debugging features, as well as a crude cleave detection algorithm. And I think I've managed to cover all of the Octave compatibility problems (also, I checked, and ((strfind(str1,str2)) && (strfind(str1,str3))) doesn't work if either strfind returns a []).
First of all, here's the code: ph_analyzer3.m
It now looks for SPELL_CAST_SUCCESS and SPELL_INTERRUPT events, which picks up a few things we weren't getting before. The cleave detection is only crude insofar as it checks the current line against the last relevant line to see if it's the same spell. This will cause problems if the boss chain-casts a spell (like Marrowgar's Saber Lash), since there's no timing check in there. I need a better implementation for it, but I've run out of time to do anything with this today (have to get some actual work done).
In any event, here's how it looks for Jaraxxus, after adding all of his relevant spell casts:

As you can see, there are a lot of spell casts here, but the important part is that all of the melee attacks that appear to be parry-hastes are attacks that are followed by a spell cast (like Fel Lightning, which is an instant). It also seems to cover the exceptionally long ones, with one exception (I'll have to go back and check that event later).
Similarly, here's the Anub'arak one (updated in the previous post as well):

However, Onyxia still looks terrible:

I'm covering the spells you see in the code above, but there are still scenarios where we get a melee swing at 1.6 or so seconds that is surrounded only by other melee swings and no other events of relevance as far as I can tell. I think there's something I'm missing, but I can't quite pinpoint it yet. Her Tail Sweep attack isn't being parsed, but it looks even worse when I include that (it seems that's not tied to any other ability or the GCD). It's also not clear how Flame Breath and Cleave work. There are several instances of Flame Breath followed by Cleave giving a shorter-than-usual delay, but I haven't exhaustively checked each Cleave yet to see if it's always the case.
One thing I'd like to do yet is to make the plots a little clearer by showing melee swings separately from spells, possibly even identifying each particular spell. That would make it easier to see trends, and would clear up the clutter of the melee line.
First of all, here's the code: ph_analyzer3.m
- Code: Select all
clear all
close all
%% File Name
fpath='M:\George\oddassortedstuff\logs\'
file=[fpath 'WCL-2009-12-02.txt']; %Ony + TOC25
% file=[fpath 'WCL-2010-02-04.txt']; %ICC10 Marrow-DBS and Sindra
% file=[fpath 'WCL-2010-02-08.txt']; %ICC10 Plague, Blood, Sindra-LK
% Constants
UNABLE_TO_OPEN_FILE = 'Error: Unable to open file.';
UNABLE_TO_CLOSE_FILE = 'Error closing file.';
%% Names of bosses to analyze
bossList=[
% %ICC
% {'Lord Marrowgar'},
% {'Lady Deathwhisper'},
% {'High Overlord Saurfang'},
% {'Deathbringer Saurfang'},
% {'Rotface'},
% {'Festergut'},
% {'Professor Putricide'},
% {'Prince Taldaram'},
% {'Prince Valanar'},
% {'Blood-Queen Lana''thel'},
% {'Sindragosa'},
% {'The Lich King'},
% %ToC
% {'Gormok the Impaler'},
% {'Dreadscale'},
% {'Acidmaw'},
% {'Icehowl'},
% {'Lord Jaraxxus'},
% {'Fjola Lightbane'},
% {'Eydis Darkbane'},
% {'Anub''arak'},
{'Onyxia'}
]
% Name of boss abilities suspected to coincide with autoattacks (untested)
spells=[
{'Fel Lightning'}, %Jaraxxus
{'Fel Fireball'}, %Jaraxxus
{'Legion Flame'}, %Jaraxxus
{'Incinerate Flesh'}, %Jaraxxus
{'Infernal Eruption'}, %Jaraxxus
{'Nether Portal'}, %Jaraxxus
{'Saber Lash'}, %marrowgar
{'Frost Breath'}, %sindragosa
{'Freezing Slash'}, %Anub'arak
{'Bellowing Roar'}, %ony
{'Cleave'}, %ony
{'Flame Breath'}, %ony
{'Wing Buffet'} %ony
% {'Tail Sweep'} %ony
];
%TODO: implement checking for this
cleaves=[
{'Saber Lash'}, %marrowgar
{'Cleave'}, %ony
{'Flame Breath'}, %ony
{'Bellowing Roar'}, %ony
{'Fel Lightning'}, %Jaraxxus
% {'Tail Sweep'} %ony
];
pause(1)
%% Find file length
%this takes a while, probably 20% of the runtime for a single boss. Would
%love to speed this up eventually.
fh=fopen(file,'r');
nLines = 1;
% while (fgets(fh) ~= -1),
% nLines = nLines+1;
% end
fclose(fh);
nLines
clear chunksize
% a=waitbar(0/size(bossList,2));
% b=waitbar(0/nLines,'Scanning File');
%%
for k=1:size(bossList,1)
% waitbar(0/size(bossList,1),a,['Now Processing: ', bossList{k}] )
boss=bossList{k}
lineno = 1;
% Harvest useful data from logfile
parryData=[];
swingData=[];
fh=fopen(file,'r');
if fh~=-1
prevLine=' ';
nextLine=fgetl(fh);
curLine=0;
cleaveFlag=0;
tic
%% New while loop - faster
while( 0 < nextLine )
% nextLine=fgetl(fh);
curLine=curLine+1;
if nextLine==-1
break
end
% waitbar(curLine/nLines,b); %this is way too slow
if( (strfind(nextLine,boss)) ) %Determine if this line is relevant to boss fight
%can uncomment this section if doing onyxia - don't forget to
%comment an end if doing so
%('onyxian whelp' and 'onyxian warder' cause problems)
%shouldn't cause problems for normal bosses, but it's an extra
%step that can be omitted for speed
if( [strfind(nextLine,'Whelp'), strfind(nextLine,'Warder'), strfind(nextLine,'Lair Guard')] ) %Determine if this line is relevant to boss fight
%do nothing
else
%regexp() is very slow, and we were using it to check for
%strings in well-defined locations. Instead, we'll just
%check the last 5 characters, since 'PARRY' is always the
%last argument recorded
if strfind(nextLine,'PARRY')
if( (regexp(nextLine,['(.*,){5}.',boss])) )
parryData = char(parryData, nextLine); % Contains all events that might cause the boss to parry haste
end
end
%need to parse SPELL_DAMAGE, SWING_DAMAGE, and _MISSED
if [strfind(nextLine,'SPELL_DAMAGE'), strfind(nextLine,'SWING_DAMAGE'), strfind(nextLine,'SPELL_MISSED'), strfind(nextLine,'SWING_MISSED'),strfind(nextLine,'SPELL_INTERRUPT'),strfind(nextLine,'SPELL_CAST_SUCCESS')]
%if we have one of these, check to make sure that it's
%a boss attack - this means 'boss' should be the 3rd
%argument, so there should be exactly 2 commas before
%the boss name. That's what this regexp does - there's
%really no better way to do it here, but by only using
%regexp when absolutely necessary, we cut run time by a
%lot.
if( (regexp(nextLine,['^([^,]*,){2}.',boss])) )
%again, regexp is slow, so we'll use STRFIND to
%check these cases. This section is cases we want
%to keep
if [strfind(nextLine,'SPELL_DAMAGE'),strfind(nextLine,'SPELL_MISSED'),strfind(nextLine,'SPELL_INTERRUPT'),strfind(nextLine,'SPELL_CAST_SUCCESS')]
% %if it's a cleave, and the previous line was
% the same cleave, ignore it
cleaveFlag=0;
for i=(1:length(cleaves))
if strfind(prevLine,cleaves{i})
if (strfind(nextLine,cleaves{i}))
%ignore this line, it's the same
%attack as the previous line
cleaveFlag=1;
prevLine=nextLine;
end
end
end
%if it's one of the spells in our list of
%"interrupts melee speed" attacks, record it
if cleaveFlag==0
for i=(1:length(spells))
if( strfind(nextLine,spells{i}) )
swingData = char(swingData, nextLine);
prevLine=nextLine;
end
end
end
%otherwise, it's a melee swing
else
swingData = char(swingData, nextLine);
prevLine=nextLine;
end %close spell_damage & Spell_Missed
end %close regexp call
end %close parry check
end %close ony fix section
end %close boss check
lineno=lineno+1;
if mod(lineno,100000)==0
[boss ', Line # ' int2str(lineno) ' of ' int2str(nLines) ', ' num2str(lineno/nLines*100,'%2.1f') '%']
end
nextLine=fgetl(fh);
end
toc
%%fix for bug in first line of swing and parry data
temp=swingData;
clear swingData
swingData=temp(2:size(temp,1),:);
temp=parryData;
clear parryData
parryData=temp(2:size(temp,1),:);
%% Continue analysis
% Close logfile
if( fclose(fh) )
error(UNABLE_TO_CLOSE_FILE );
end
% Get times from data
[prevDay,swingTimes]=ParseTime(swingData(1,:));
for i=(min([2 size(swingData,1)]):size(swingData,1))
[day,time]=ParseTime(swingData(i,:));
if(strmatch(day,prevDay))
swingTimes(i)=time;
else % Assume 1-day rollover
swingTimes(i)=time+24*60*60*1000;
end
prevDay=day;
end
[prevDay,parryTimes]=ParseTime(parryData(1,:));
for i=(min([2 size(parryData,1)]):size(parryData,1))
[day,time]=ParseTime(parryData(i,:));
if(strmatch(day,prevDay))
parryTimes(i)=time;
else % Assume 1-day rollover
parryTimes(i)=time+24*60*60*1000;
end
prevDay=day;
end
% Create delta vector
dSwings=swingTimes(2:length(swingTimes))-swingTimes(1:(length(swingTimes)-1));
% Count parries immediately preceding each swing
parryCount=zeros(1,length(dSwings));
j=1; % parryIndex
for i=1:length(dSwings)
if( j<(length(parryTimes)+1) ) % If there are parries left that haven't been examined
while( parryTimes(j) < swingTimes(i+1) )
parryCount(i)=parryCount(i)+1;
j=j+1;
if( j>length(parryTimes) ) % If all parries have been examined
break;
end
end
end
end
%Identify specials that cause outliers
h=[];
s=[];
for m=1:size(swingData,1)
for n=1:size(spells,1)
if strfind(swingData(m,:),spells{n})
h=[h,m];
if [strfind(swingData(m,:),'SPELL_CAST_SUCCESS'),strfind(nextLine,'SPELL_INTERRUPT'),strfind(nextLine,'SPELL_MISSED'),strfind(nextLine,'SPELL_DAMAGE')]
s=[s,m];
end
end
end
end
s2=nonzeros(s.*(s<size(dSwings,2)));
% Compute moving average attack speed
% Cap severe outliers since moving average is being used as a visual aid
%temp = dSwings;
%temp( find(temp>2*mean(temp)) )=2*mean(temp);
%temp = conv(temp,ones(1,5)/5);
%movingAverage = temp( 3:(length(temp)-2) );
% Removed because it's generally not helpful
zPI = find(0==parryCount); % indices of dSwings preceded by zero parries
oPI = find(1==parryCount); % one parry
tPI = find(1<parryCount); % two or more parries
x = 1:length(dSwings);
temp=findstr(swingData(2,:),' ');
sdlog=[int2str([1:size(swingData,1)]') repmat(' ',size(swingData,1),1) swingData(:,temp(1):size(swingData,2))];
%plot(x(zPI),dSwings(zPI),'*','markersize',2,x(oPI),dSwings(oPI),'*r','markersize',2,x(tPI),dSwings(tPI),'*r','markersize',3,x,movingAverage);
figure;
plot(x(zPI),dSwings(zPI),'.',x(oPI),dSwings(oPI),'.r',x(tPI),dSwings(tPI),'dr');
hold on
plot(x(nonzeros(h-1)),dSwings(nonzeros(h-1)),'ok',x(s2),dSwings(s2),'sk')
hold off
xlim([0,length(dSwings)])
ylim([0,3*median(dSwings)]);
% legend('No parries','One parry','Two or more parries','5-sample average');
legend('No parries','One parry','Two or more parries','Att. followed by Specials','Spell Casts or Interrupts');
title(['Parry Effect on ',boss,'''s Attack Speed']);
xlabel('Sample Number');
ylabel('Time between attacks (ms)');
saveas(gcf,boss,'png')
save([boss,'_parryData'],'zPI','oPI','tPI','x','dSwings','parryData','swingData','boss')
else
error(UNABLE_TO_OPEN_FILE );
end
end
It now looks for SPELL_CAST_SUCCESS and SPELL_INTERRUPT events, which picks up a few things we weren't getting before. The cleave detection is only crude insofar as it checks the current line against the last relevant line to see if it's the same spell. This will cause problems if the boss chain-casts a spell (like Marrowgar's Saber Lash), since there's no timing check in there. I need a better implementation for it, but I've run out of time to do anything with this today (have to get some actual work done).
In any event, here's how it looks for Jaraxxus, after adding all of his relevant spell casts:

As you can see, there are a lot of spell casts here, but the important part is that all of the melee attacks that appear to be parry-hastes are attacks that are followed by a spell cast (like Fel Lightning, which is an instant). It also seems to cover the exceptionally long ones, with one exception (I'll have to go back and check that event later).
Similarly, here's the Anub'arak one (updated in the previous post as well):

However, Onyxia still looks terrible:

I'm covering the spells you see in the code above, but there are still scenarios where we get a melee swing at 1.6 or so seconds that is surrounded only by other melee swings and no other events of relevance as far as I can tell. I think there's something I'm missing, but I can't quite pinpoint it yet. Her Tail Sweep attack isn't being parsed, but it looks even worse when I include that (it seems that's not tied to any other ability or the GCD). It's also not clear how Flame Breath and Cleave work. There are several instances of Flame Breath followed by Cleave giving a shorter-than-usual delay, but I haven't exhaustively checked each Cleave yet to see if it's always the case.
One thing I'd like to do yet is to make the plots a little clearer by showing melee swings separately from spells, possibly even identifying each particular spell. That would make it easier to see trends, and would clear up the clutter of the melee line.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
-

theckhd - Moderator
- Posts: 7452
- Joined: Thu Jul 31, 2008 3:06 pm
- Location: Harrisburg, PA
Re: Parry Hasting Addon
Debugging out loud here. This is all of the Onyxia swingData with the tail sweep lines uncommented and event numbers added to the beginning - this should contain every offensive ability she has (you may want to copy/paste into notepad to fix the formatting). The abilities are:
Tail Sweep - instant
Flame Breath - 2s cast
Cleave - next melee
Wing Buffet - 0.5s cast

Event 98 is a spell cast of Tail Sweep, which comes 0.06 seconds before a melee:
However, the previous melee (event 97) comes 1.6 seconds before the next one (event 99).
Similarly, here's one where we have melee+flame breath+tail sweep+melee:
There's a 4.5ish-second wait between the first melee and Flame Breath, which makes sense for a 2.4 speed swing followed by a 2-second cast. The Tail Sweep follows 0.73 seconds later, and the next attack is 1.38 seconds after that.
So it seems like Tail Sweep doesn't reset the swing timer, and can be used whenever she likes
Tail Sweep - instant
Flame Breath - 2s cast
Cleave - next melee
Wing Buffet - 0.5s cast
- Code: Select all
1 21:05:14.960 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,19668,0,1,0,2614,0,nil,nil,nil
2 21:05:16.979 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
3 21:05:18.949 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
4 21:05:20.585 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
5 21:05:22.620 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
6 21:05:25.092 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
7 21:05:27.877 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,13910,0,4,6042,0,5581,nil,nil,nil
8 21:05:29.449 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
9 21:05:30.202 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
10 21:05:32.606 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
11 21:05:33.823 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,69293,"Wing Buffet",0x1,24435,0,1,0,0,0,nil,nil,nil
12 21:05:36.042 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
13 21:05:38.459 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
14 21:05:40.811 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,8511,0,1,0,2779,5923,nil,nil,nil
15 21:05:43.056 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,14724,0,1,0,2779,3657,nil,nil,nil
16 21:05:44.560 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
17 21:05:46.722 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,21072,0,4,2903,0,0,nil,nil,nil
18 21:05:47.112 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
19 21:05:48.582 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,17882,0,1,0,2779,0,nil,nil,nil
20 21:05:50.958 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x03000000040AA7FD,"Albil",0x514,68868,"Cleave",0x1
21 21:05:52.328 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
22 21:05:54.669 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
23 21:05:56.613 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
24 21:05:58.424 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,69293,"Wing Buffet",0x1,19281,0,1,0,0,3868,nil,nil,nil
25 21:06:01.546 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,RESIST,0
26 21:06:03.965 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
27 21:06:04.740 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
28 21:06:06.347 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,11916,0,1,0,2779,0,nil,nil,nil
29 21:06:08.751 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
30 21:06:11.129 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,14623,0,1,0,2779,0,nil,nil,nil
31 21:06:13.607 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
32 21:06:15.698 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,20356,0,4,6310,0,0,nil,nil,nil
33 21:06:17.174 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
34 21:06:19.501 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,11948,0,1,0,0,3327,nil,nil,nil
35 21:06:20.794 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
36 21:06:22.037 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
37 21:06:24.305 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
38 21:06:26.925 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,69293,"Wing Buffet",0x1,16852,0,1,0,0,5581,nil,nil,nil
39 21:06:28.955 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
40 21:06:32.573 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,15576,0,4,6070,0,4005,nil,nil,nil
41 21:06:33.476 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18073,0,1,0,2779,0,nil,nil,nil
42 21:06:35.961 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
43 21:06:37.254 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
44 21:06:38.346 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
45 21:06:40.829 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
46 21:06:43.087 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
47 21:06:45.389 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,69293,"Wing Buffet",0x1,16973,0,1,0,0,8750,nil,nil,nil
48 21:06:46.472 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
49 21:06:48.901 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
50 21:06:50.885 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,14027,0,1,0,2779,0,nil,nil,nil
51 21:06:52.889 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,RESIST,0
52 21:06:53.306 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
53 21:06:55.302 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
54 21:06:57.697 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,9279,0,1,0,2779,3327,nil,nil,nil
55 21:07:00.094 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
56 21:07:01.533 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,11557,0,1,0,2779,3116,nil,nil,nil
57 21:10:20.824 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
58 21:10:22.847 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
59 21:10:24.021 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
60 21:10:25.248 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
61 21:10:26.351 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,19004,0,1,0,2652,3116,nil,nil,nil
62 21:10:28.554 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000002B276D8,"Marotan",0x514,50972,28329,1,0,0,0,nil,nil,nil
63 21:10:31.606 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,18809,0,4,5656,0,0,nil,nil,nil
64 21:10:33.717 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
65 21:10:35.145 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
66 21:10:37.543 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
67 21:10:40.297 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18431,"Bellowing Roar",0x1,IMMUNE
68 21:10:41.306 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
69 21:10:42.657 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,MISS
70 21:10:45.035 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
71 21:10:48.178 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,19684,0,4,3075,0,3327,nil,nil,nil
72 21:10:50.520 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
73 21:10:52.939 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
74 21:10:55.326 SWING_MISSED,0xF1300027C8000990,"Onyxia",0xa48,0x0300000000183351,"Theck",0x511,MISS
75 21:10:55.326 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0xa48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
76 21:10:57.745 SWING_MISSED,0xF1300027C8000990,"Onyxia",0xa48,0x0300000000183351,"Theck",0x511,PARRY
77 21:10:59.600 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0xa48,0x0300000000183351,"Theck",0x511,15203,0,1,0,0,3116,nil,nil,nil
78 21:11:03.340 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x03000000025F48E6,"Manedo",0x514,18431,"Bellowing Roar",0x1,IMMUNE
79 21:11:05.452 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,16966,0,1,0,0,2291,nil,nil,nil
80 21:11:09.867 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,17719,0,4,6265,0,3116,nil,nil,nil
81 21:11:10.596 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
82 21:11:11.979 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
83 21:11:14.313 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
84 21:11:16.695 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,16286,0,1,0,0,0,nil,nil,nil
85 21:11:19.051 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,17826,0,1,0,0,2612,nil,nil,nil
86 21:11:21.579 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
87 21:11:23.965 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
88 21:11:28.002 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x03000000001C8454,"Eilthror",0x514,18431,"Bellowing Roar",0x1,MISS
89 21:11:30.337 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,16111,0,1,0,0,0,nil,nil,nil
90 21:11:32.811 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,19889,0,4,3094,0,3263,nil,nil,nil
91 21:11:35.067 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
92 21:11:36.664 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18773,0,1,0,2652,0,nil,nil,nil
93 21:11:38.979 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
94 21:11:41.375 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
95 21:11:42.779 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,5456,0,1,0,2652,5923,nil,nil,nil
96 21:11:44.318 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
97 21:11:46.756 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,10031,0,1,0,2652,4005,nil,nil,nil
98 21:11:48.338 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
99 21:11:48.395 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
100 21:11:49.925 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,12639,0,1,0,2652,0,nil,nil,nil
101 21:11:52.360 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
102 21:11:56.069 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x03000000038A3438,"Spektrum",0x514,18431,"Bellowing Roar",0x1,IMMUNE
103 21:12:00.477 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,14960,0,4,9427,0,3327,nil,nil,nil
104 21:12:00.735 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
105 21:12:01.804 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
106 21:12:04.201 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
107 21:12:06.767 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
108 21:12:08.046 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,13992,0,1,0,0,3327,nil,nil,nil
109 21:12:10.508 SWING_MISSED,0xF1300027C8000990,"Onyxia",0xa48,0x0300000000183351,"Theck",0x511,DODGE
110 21:12:12.997 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0xa48,0x0300000000183351,"Theck",0x511,15704,0,1,0,0,3327,nil,nil,nil
111 21:12:15.289 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
112 21:12:17.707 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,17550,0,1,0,2652,0,nil,nil,nil
113 21:12:20.145 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
114 21:12:22.481 SWING_MISSED,0xF1300027C8000990,"Onyxia",0xa48,0x0300000000183351,"Theck",0x511,MISS
115 21:12:25.009 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,12260,0,1,0,2652,5923,nil,nil,nil
116 21:12:26.706 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
117 21:12:31.014 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000002C420BC,"VÃvien",0x514,18431,"Bellowing Roar",0x1,MISS
118 21:12:33.449 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
119 21:12:34.634 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
120 21:12:35.804 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,MISS
121 21:12:38.206 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
122 21:12:40.595 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,21078,0,4,0,0,3794,nil,nil,nil
123 21:12:42.906 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
124 21:12:45.304 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
125 21:12:45.710 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
126 21:12:46.935 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
127 21:12:49.365 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18450,0,1,0,2652,0,nil,nil,nil
128 21:12:50.691 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,11698,0,1,0,2652,3116,nil,nil,nil
129 21:12:53.510 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x03000000001B0AA3,"Slowstrider",0x514,18431,"Bellowing Roar",0x1,IMMUNE
130 21:12:55.917 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,15217,0,1,0,0,0,nil,nil,nil
131 21:12:59.079 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,18562,0,4,5933,0,1170,nil,nil,nil
132 21:13:00.578 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,16361,0,1,0,2652,0,nil,nil,nil
133 21:13:00.578 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
134 21:13:02.603 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
135 21:13:04.176 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
136 21:13:05.372 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
137 21:13:06.988 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
138 21:13:09.235 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,13659,0,1,0,2652,5923,nil,nil,nil
139 21:13:11.825 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
140 21:13:13.123 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
141 21:13:14.633 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
142 21:13:20.248 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
143 21:13:20.371 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,16680,0,1,0,0,3657,nil,nil,nil
144 21:13:22.981 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18479,0,1,0,2652,0,nil,nil,nil
145 21:13:25.341 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
146 21:13:26.676 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
147 21:13:29.082 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,12713,0,1,0,0,3657,nil,nil,nil
148 21:13:31.080 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,RESIST,0
149 21:13:32.806 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18593,0,1,0,0,0,nil,nil,nil
150 21:13:35.256 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,12932,0,1,0,2652,4546,nil,nil,nil
151 21:13:39.383 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18431,"Bellowing Roar",0x1,IMMUNE
152 21:13:41.849 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
153 21:13:44.054 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
154 21:13:45.527 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,14109,0,1,0,2652,3327,nil,nil,nil
155 21:13:47.642 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
156 21:13:48.363 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
157 21:13:49.696 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
158 21:13:51.690 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,17915,0,1,0,2652,0,nil,nil,nil
159 21:13:53.151 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
160 21:13:55.210 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,11890,0,4,6293,0,9039,nil,nil,nil
161 21:13:56.768 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
162 21:13:58.394 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
163 21:14:01.777 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x03000000025F48E6,"Manedo",0x514,18431,"Bellowing Roar",0x1,IMMUNE
164 21:14:03.218 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18049,0,1,0,0,0,nil,nil,nil
165 21:14:05.591 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,9262,0,1,0,2652,3116,nil,nil,nil
166 21:14:07.862 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
167 21:14:11.247 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,RESIST,0
168 21:14:12.965 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,MISS
169 21:14:14.459 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
170 21:14:14.459 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
171 21:14:15.798 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
172 21:14:17.274 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,19579,0,1,0,2652,0,nil,nil,nil
173 21:14:20.578 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000191FB3,"Kmacrox",0x512,18431,"Bellowing Roar",0x1,MISS
174 21:14:22.961 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,12030,0,1,0,0,3327,nil,nil,nil
175 21:14:25.434 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
176 21:14:27.719 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,20254,0,4,3151,0,3327,nil,nil,nil
177 21:14:28.087 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
178 21:14:29.123 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
179 21:14:30.001 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18383,0,1,0,2652,0,nil,nil,nil
180 21:14:32.509 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
181 21:14:34.219 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,15775,0,1,0,0,0,nil,nil,nil
182 21:14:38.283 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000001415234,"Warrow",0x514,18431,"Bellowing Roar",0x1,MISS
183 21:14:40.542 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
184 21:14:40.705 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,12112,0,1,0,0,4005,nil,nil,nil
185 21:14:43.114 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18843,0,1,0,2652,0,nil,nil,nil
186 21:14:44.537 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
187 21:14:46.611 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,14957,0,4,9316,0,3116,nil,nil,nil
188 21:14:48.151 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18237,0,1,0,2652,0,nil,nil,nil
189 21:14:50.581 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
190 21:14:54.364 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x03000000038A3438,"Spektrum",0x514,18431,"Bellowing Roar",0x1,IMMUNE
191 21:14:56.806 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,14261,0,1,0,0,3327,nil,nil,nil
192 21:14:57.902 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
193 21:14:59.122 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
194 21:15:01.510 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
195 21:15:02.941 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,MISS
196 21:15:05.471 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,10132,0,1,0,0,6754,nil,nil,nil
197 21:15:07.873 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,3802,0,1,0,2652,9039,nil,nil,nil
198 21:15:10.297 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
199 21:15:14.865 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18431,"Bellowing Roar",0x1,IMMUNE
200 21:15:17.241 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,20414,0,4,6139,0,0,nil,nil,nil
201 21:15:17.545 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
202 21:15:19.511 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,15818,0,1,0,0,3116,nil,nil,nil
203 21:15:21.963 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
204 21:15:24.350 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
205 21:15:25.911 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
206 21:15:29.682 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,18431,"Bellowing Roar",0x1,MISS
207 21:15:31.964 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,RESIST,0
208 21:15:34.350 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,10997,0,1,0,0,3116,nil,nil,nil
209 21:15:36.772 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
210 21:15:38.387 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
211 21:15:39.982 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,12824,0,1,0,2652,0,nil,nil,nil
212 21:15:41.304 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,14310,0,1,0,2652,0,nil,nil,nil
213 21:15:44.000 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
214 21:15:46.407 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,16281,0,4,6181,0,3657,nil,nil,nil
215 21:15:48.793 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
216 21:15:51.210 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,11854,0,1,0,2652,4546,nil,nil,nil
217 21:15:53.728 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x03000000001B0AA3,"Slowstrider",0x514,18431,"Bellowing Roar",0x1,IMMUNE
218 21:15:56.164 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,MISS
219 21:15:58.760 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
220 21:16:00.957 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
221 21:16:03.363 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
222 21:16:06.984 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,14351,0,4,6285,0,5923,nil,nil,nil
223 21:16:08.310 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
224 21:16:12.489 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,21667,0,1,0,0,0,nil,nil,nil
225 21:16:14.888 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,MISS
226 21:16:16.421 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
227 21:16:18.742 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
228 21:16:21.322 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
229 21:16:24.130 SPELL_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,RESIST,0
230 21:16:26.545 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1
231 21:16:28.947 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
232 21:16:31.365 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,13997,0,1,0,2652,0,nil,nil,nil
233 21:16:33.789 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68868,"Cleave",0x1

Event 98 is a spell cast of Tail Sweep, which comes 0.06 seconds before a melee:
- Code: Select all
97 21:11:46.756 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,10031,0,1,0,2652,4005,nil,nil,nil
98 21:11:48.338 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
99 21:11:48.395 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,DODGE
However, the previous melee (event 97) comes 1.6 seconds before the next one (event 99).
Similarly, here's one where we have melee+flame breath+tail sweep+melee:
- Code: Select all
79 21:11:05.452 SWING_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,16966,0,1,0,0,2291,nil,nil,nil
80 21:11:09.867 SPELL_DAMAGE,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,68970,"Flame Breath",0x4,17719,0,4,6265,0,3116,nil,nil,nil
81 21:11:10.596 SPELL_CAST_SUCCESS,0xF1300027C8000990,"Onyxia",0x10a48,0x0000000000000000,nil,0x80000000,69286,"Tail Sweep",0x1
82 21:11:11.979 SWING_MISSED,0xF1300027C8000990,"Onyxia",0x10a48,0x0300000000183351,"Theck",0x511,PARRY
There's a 4.5ish-second wait between the first melee and Flame Breath, which makes sense for a 2.4 speed swing followed by a 2-second cast. The Tail Sweep follows 0.73 seconds later, and the next attack is 1.38 seconds after that.
So it seems like Tail Sweep doesn't reset the swing timer, and can be used whenever she likes
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
-

theckhd - Moderator
- Posts: 7452
- Joined: Thu Jul 31, 2008 3:06 pm
- Location: Harrisburg, PA
Re: Parry Hasting Addon
Most spells aren't (theoretically) impacted by parry hastes, so they aren't a whole lot of benefit to look at and may just make it more difficult to see what's going on in the plots. Cleaves/"on next attack" type abilities are more interesting, as these would occur at the same time as a parry-hasted attack. If these can be solidly detected then that will help us find parry-hastes. Even if they are excluded however, a sufficient amount of autoattack data is all that is truly needed to determine a yea/nay on parry haste enabled/disabled. For this reason, it seems that the most reliable approach to detecting parry hastes to me is to just focus on getting autoattack parry haste detection working flawlessly first (and test it extensively), then add in cleaves and/or spells for a smaller number of bosses.
There will always be some minor variance in boss attack time (a few ms here and there), those are caused by issues like server latency, tank moving, paladin healer accidental taunts, dual wielding bosses, etc. Severe outliers in the data should just be discarded and ignored, because they are things like Bonestorm between autoattacks which really don't help us find parry-hastes. The algorithm discards these outliers by setting the Y-axis limits such that they are simply hidden from view. For abilities like Saber Lash that hit multiple players concurrently, it seems the best way to deal with these and many other cleave attacks is to simply discard data from the swingData array after is it populated.
There will always be some minor variance in boss attack time (a few ms here and there), those are caused by issues like server latency, tank moving, paladin healer accidental taunts, dual wielding bosses, etc. Severe outliers in the data should just be discarded and ignored, because they are things like Bonestorm between autoattacks which really don't help us find parry-hastes. The algorithm discards these outliers by setting the Y-axis limits such that they are simply hidden from view. For abilities like Saber Lash that hit multiple players concurrently, it seems the best way to deal with these and many other cleave attacks is to simply discard data from the swingData array after is it populated.
- Code: Select all
totally pseudo: if swingData(i) < 0.02 seconds, then swingData(i)=[]
Last edited by Cliffton on Thu Feb 11, 2010 10:31 am, edited 1 time in total.
- Cliffton
- Posts: 17
- Joined: Thu Jan 21, 2010 12:19 pm
Re: Parry Hasting Addon
In case it helps, here's a .txt file for the Ony swingData log with the Tail Sweeps removed:
ony_sData.txt
ony_sData.txt
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
MATLAB 5.x, Call to Arms 5.x, Talent Spec & Glyph Guide 5.x, Blog: Sacred Duty
-

theckhd - Moderator
- Posts: 7452
- Joined: Thu Jul 31, 2008 3:06 pm
- Location: Harrisburg, PA
Re: Parry Hasting Addon
so cap out hit,,, soft cap, expertise, then, dont worry about other stats, just get upgrades amirite,,, not anywhere near the old 80% of expertise is the same effect as dodge...
- steadypal
- Posts: 1206
- Joined: Sat Mar 15, 2008 12:28 pm
Return to Advanced Theorycraft and Calculations
Who is online
Users browsing this forum: Google [Bot], Google Adsense [Bot] and 2 guests