Rawr.Hunter - Consortium Blaster

Topics: Retired
Jul 28, 2008 at 5:23 AM
I play a mage as my main so don't have the leet hunter knowledge to do the math on this so figured I'd ask here since my brother who does play a hunter outright says that there's no way the Consortium Blaster is better then the Bristleblitz Striker. He didn't try to run the numbers, just instantly declared Rawr wrong. So, is the Blaster really that good or is it bugged currently?
Jul 28, 2008 at 2:08 PM
Hunters are kind of messed up when it comes to dealing with things like weapon speed, etc compared to other classes.  So depending on spec and how much haste a player has it is possible for a fast weapon to output more total dps than a slow 3.0 weapon even with the large difference in listed "white" damage between the 2 items.  Generally speaking for a beast spec hunter you attempt to get as close to a 2.0 shot speed as possible.

However this module does not currently take into account things like heroism, drums, rapid fire, etc.  The amount of time a hunter spends hasted makes a large difference in the final outcome as well.  So what on "paper" may seem like an upgrade, ie a very fast weapon can actually be a downgrade in the real world once haste effects are taken into account.  For example on a 6 minute fight a hunter might spend 40 seconds under Heroism (30% haste); 30 seconds under rapid fire (40% haste) and perhaps 180 seconds with drums (80 haste, with 2 people drumming in the group).  So using the above numbers the player would only spend about 110 seconds in a non hasted situation, and that is not even counting imp hawk procs.    Anyhow, the point is that sometimes a spreadsheet will show a fast weapon as being awesome when in reality the slower weapon gives more DPS when figuring in the time spent hasted.
Jul 28, 2008 at 6:24 PM
Edited Jul 28, 2008 at 6:52 PM
Tobiah is correct in that all of the haste effects that a hunter can be under will affect the DPS and allow a much slower weapon to fall into the BM speed range and this model does not currently allow for adjusting those haste effects into a more accurate damage graph; however, even with taking that into account, I'm very curious as to what gear causes the blaster to out perform the striker.  Xeddicus, can you link your brother's armory so I can see if its a bug of if the model is really saying that for him the blaster is the better choice (which, honestly, I have no idea how that could be.)

Edit: FYI, the long term goal is to allow this type of damage graph to be user customizable.  How often are you under drum affects, heroism, etc; however, given that Lich king looks to be changing a lot of the mechanics around, I probably won't start that until after I re-write the model with the new mechanics, which include the new pet talents (and actually being able to set them, which you can't do now), pet buffing, and a bunch of other features that are missing in the first release.
Jul 29, 2008 at 6:17 PM
Here is some code I changed to allow some very basic haste effects to show up.  I hard coded it for my own theory crafting but I thought I might post the code here to allow some feedback.  It has been a very long time since I have done any programming and this code is probably very wrong, however it seemed to work well for me in testing so far.  Basicly I wanted help in figuring out an optimal gear set for Brutallis and this is what I used.


   SimulationResults normalShotRotation = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed,
                averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                steadyShotCastTime);

   //create empty dps simulations with all zeros
   SimulationResults dstDPS = new SimulationResults();
   SimulationResults dstQuickShotsDPS = new SimulationResults();
   SimulationResults quickShotRotation = new SimulationResults();
            SimulationResults HeroismRotation = new SimulationResults();
            SimulationResults RapidFireRotation = new SimulationResults();
            SimulationResults DrumsRotation = new SimulationResults();
            SimulationResults qsHeroismRotation = new SimulationResults();
            SimulationResults qsRapidFireRotation = new SimulationResults();
            SimulationResults qsDrumsRotation = new SimulationResults();

   if (hasDST)
   {

    dstDPS = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed / (1 + dstHaste),
                averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                steadyShotCastTime / (1 + dstHaste));

    if (options.Aspect == Aspect.Hawk)
    {
     dstQuickShotsDPS = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed / (1 + dstHaste) / (1 + quickShotHaste),
                averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                steadyShotCastTime / (1 + dstHaste) / (1 + quickShotHaste));
    }
   }

   if (options.Aspect == Aspect.Hawk)
   {
    quickShotRotation = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed / (1 + quickShotHaste),
                 averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                 averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                 steadyShotCastTime / (1 + quickShotHaste));
                qsHeroismRotation = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed / (1.3 + quickShotHaste),
                                                        averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                                                        averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                                                        steadyShotCastTime / (1.3));
                qsRapidFireRotation = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed / (1.4 + quickShotHaste),
                                                                        averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                                                                        averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                                                                        steadyShotCastTime / (1.4));
                qsDrumsRotation = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed / (1 + (80 / HASTE_RATING_PER_PERCENT / 100) + quickShotHaste),
                                                                        averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                                                                        averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                                                                        steadyShotCastTime / (1 + (80 / HASTE_RATING_PER_PERCENT / 100)));
   }

            HeroismRotation = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed / (1.3),
                 averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                 averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                 steadyShotCastTime / (1.3));
            RapidFireRotation = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed / (1.4),
                 averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                 averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                 steadyShotCastTime / (1.4));
            DrumsRotation = CalculateShotRotationDPS(options, calculatedStats.BaseAttackSpeed / (1 + (80/HASTE_RATING_PER_PERCENT /100)),
                 averageAutoShotDamage * (1 - armorDamageReductionPercentage),
                 averageSteadyShotDamage * (1 - armorDamageReductionPercentage),
                 steadyShotCastTime / (1 + (80/HASTE_RATING_PER_PERCENT /100)));

            double totalHunterDPS = 0;
   //totalHunterDPS = normalShotRotation.dps * (1 - quickShotsUpTime) * (1 - dstUptime) +
   //         quickShotRotation.dps * quickShotsUpTime * (1 - dstQuickShotsUpTime) +
   //         dstDPS.dps * dstUptime * (1 - quickShotsUpTime) +
   //         dstQuickShotsDPS.dps *  quickShotsUpTime * dstQuickShotsUpTime;
           
            // These numbers are based on a 6 minute fight for my own testing
            double FightLength = 360;
            double HeroismTime = 40;
            double RapidFireTime = 60;
            double DrumsUpTime = 180; // Figures 2 people drumming
            double NoHasteTime = (FightLength - (HeroismTime + RapidFireTime + DrumsUpTime);

            if (character.Talents.Trees[SURVIVAL][22].PointsInvested > 0)
            {

                totalHunterDPS = (((normalShotRotation.dps * (1 - quickShotsUpTime) * (1 - dstUptime) +
                                          quickShotRotation.dps * quickShotsUpTime * (1 - dstQuickShotsUpTime) +
                                          dstDPS.dps * dstUptime * (1 - quickShotsUpTime) +
                                          dstQuickShotsDPS.dps * quickShotsUpTime * dstQuickShotsUpTime) * NoHasteTime) +
                                        ((HeroismRotation.dps * (1 - quickShotsUpTime) * (1 - dstUptime) +
                                          qsHeroismRotation.dps * quickShotsUpTime * (1 - dstQuickShotsUpTime) +
                                          dstDPS.dps * dstUptime * (1 - quickShotsUpTime) +
                                          dstQuickShotsDPS.dps * quickShotsUpTime * dstQuickShotsUpTime) * HeroismTime) +
                                        ((RapidFireRotation.dps * (1 - quickShotsUpTime) * (1 - dstUptime) +
                                          qsRapidFireRotation.dps * quickShotsUpTime * (1 - dstQuickShotsUpTime) +
                                          dstDPS.dps * dstUptime * (1 - quickShotsUpTime) +
                                          dstQuickShotsDPS.dps * quickShotsUpTime * dstQuickShotsUpTime) * RapidFireTime) +
                                        ((DrumsRotation.dps * (1 - quickShotsUpTime) * (1 - dstUptime) +
                                          qsDrumsRotation.dps * quickShotsUpTime * (1 - dstQuickShotsUpTime) +
                                          dstDPS.dps * dstUptime * (1 - quickShotsUpTime) +
                                          dstQuickShotsDPS.dps * quickShotsUpTime * dstQuickShotsUpTime) * NoHasteTime)) / FightLength;
            }
            else
            {
                RapidFireTime = 30;
                NoHasteTime = (FightLength - (HeroismTime + RapidFireTime + DrumsUpTime);

                totalHunterDPS = (((normalShotRotation.dps * (1 - quickShotsUpTime) * (1 - dstUptime) +
                                          quickShotRotation.dps * quickShotsUpTime * (1 - dstQuickShotsUpTime) +
                                          dstDPS.dps * dstUptime * (1 - quickShotsUpTime) +
                                          dstQuickShotsDPS.dps * quickShotsUpTime * dstQuickShotsUpTime) * NoHasteTime) +
                                        ((HeroismRotation.dps * (1 - quickShotsUpTime) * (1 - dstUptime) +
                                          qsHeroismRotation.dps * quickShotsUpTime * (1 - dstQuickShotsUpTime) +
                                          dstDPS.dps * dstUptime * (1 - quickShotsUpTime) +
                                          dstQuickShotsDPS.dps * quickShotsUpTime * dstQuickShotsUpTime) * HeroismTime) +
                                        ((RapidFireRotation.dps * (1 - quickShotsUpTime) * (1 - dstUptime) +
                                          qsRapidFireRotation.dps * quickShotsUpTime * (1 - dstQuickShotsUpTime) +
                                          dstDPS.dps * dstUptime * (1 - quickShotsUpTime) +
                                          dstQuickShotsDPS.dps * quickShotsUpTime * dstQuickShotsUpTime) * RapidFireTime) +
                                        ((DrumsRotation.dps * (1 - quickShotsUpTime) * (1 - dstUptime) +
                                          qsDrumsRotation.dps * quickShotsUpTime * (1 - dstQuickShotsUpTime) +
                                          dstDPS.dps * dstUptime * (1 - quickShotsUpTime) +
                                          dstQuickShotsDPS.dps * quickShotsUpTime * dstQuickShotsUpTime) * DrumsUpTime)) / NoHasteTime;
            }

Jul 29, 2008 at 7:02 PM

Looks pretty good at first glance (at work though, so can't really analyze too much but it looks like you aren't taking the quick shot haste into account on your steady shot cast time for heroism and rapid fire in the quick shot ones) and is along the lines of what I'd like to do in the long run.  More of a fight simulation instead of a burst simulation, that takes into account various group effects such as the drums, mana regen, OOM concerns etc.  But that won't be done before the retooling for Lich King unfortunatly.

It looks like you're accounting for readyness as a talent as well.  This might scew results a little because of other talents in the survival tree that I don't remember if they are programmed or not (expose weakness is not, some of the agility boosters are).  For the maintenance release that is coming soon, I'll try to red out any talents that aren't accounted for.

For those that are curious what your dps is like under various haste effects (not the full fight simulation like tobiah did), you can select various drums and buffs on the buff tab.  Again, its just a point in time DPS snapshot and not an overall fight dps outcome, but its another piece of knowledge to help you decide on gear.

Aug 3, 2008 at 8:11 AM
Edited Aug 3, 2008 at 8:20 AM

Sorry for the late reply, just forgot about this thread. The Blaster is showing up good for my alt hunter (which may have a lot to do with it I suppose...crap gear). Samxin on Uther.

Though it shows up fairly well for my brother's character as well, Drogan of Uther.

BM spec vs Survival, Blaster just seems to be good all around for it's obtainability! Or something's whacked.

And I just noticed for Drogan is shows The Boomstick as the #2 choice...I'm leaning towards wackiness...

Aug 3, 2008 at 1:38 PM
Ah, I see the problem. (well, what I assume the problem to be). For your brother, the model is really only accurate form BM spec although a lot of the agility increasing talents should be implemented already (unfortunately I never had the time this week to mark which talents were implemented.)

For both of you: You have no haste and the model's default shot rotation is a 1-1. This assumes you are hand weaving shots 1-1.  This combination ends up putting a lot of emphasis on faster weapons.  If you switch your shot rotation in the options panel to a 3-2, I believe you will get results more in line with what you are expecting to see.  The 3-2 rotation is based off of the currently excepted 3-2 macro which will fire an auto shot, if available, if not fire a steady shot.  This has the side effect of degrading to a 1-1 or 2-1 based on haste effects selected in the buff screen / quick shots proc, etc.  If I change that option on yours, your DPS jumps ~40 and the consortium blaster drops to the bottom of the gear list.

Please let me know if changing that option fixes the problem for you.

Aug 4, 2008 at 9:35 PM
That seems to have done it, yes. Three to Two dropped the blaster down. Thanks.