What's new
  • Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Visit Resources
  • Visit Downloads
  • Visit Portal

[Barb] The rend/smash/cleave Setup!!

herbfunk

Community Developer
Joined
Oct 30, 2012
Messages
238
Reaction score
7
My barb was sitting at 50% Crit, 60% with overpower and over 300% Crit Damage.. but I found it counter-productive when using Rend.

Why use rend? Well 9% life return is godly.. example being after rending 3 targets I was stuck in 3x stacks of descerator piles and getting hit by 3 strong monsters, and my life stayed near 100%... (This occurred on MP2).

With my warcry up, I normally have 1650 Life Regeneration, and with Rend on a single target 8750 life regeneration. Groups usually put this number over 15k easily!


The Skills:
Hammer of the ancient
Ignore pain
War cry (Impunity)
Battle Rage (Maurder Rage)
Cleave
Rend (Blood Lust)
----
Unforgiving
Inspiring Presence
Superstition


I use Daul-Wield for speed,

Stat-wise I have around 53k HP, 85k DPS, 70% reduction of damage, with 5.5% LS and 1k LOH...



Below are the modifications made to trinity 1.6.3.4



Summary:
Maintains rend when necessary. Fixed issues caused by monsters who were fast or caused lots of damage and rend not applying since character was "recovering".



Modify the "cooldown" for 3.5 seconds
Code:
                {SNOPower.Barbarian_Rend, 3500},


Added bool for DotDPS attribute
Code:
        public class GilesObject
        {
            // Generic stuff applicable to all objects
            public GilesObjectType ThisGilesObjectType { get; set; }
            public double dThisWeight { get; set; }
            public Vector3 vThisPosition { get; set; }
            public float fCentreDistance { get; set; }
            public float fRadiusDistance { get; set; }
            public string sThisInternalName { get; set; }
            public int iThisACDGUID { get; set; }
            public int iThisRActorGuid { get; set; }
            public int iThisDynamicID { get; set; }
            public int iThisBalanceID { get; set; }
            public int iThisActorSNO { get; set; }
            // Item/gold/other stuff
            public int iThisLevel { get; set; }
            public int iThisGoldAmount { get; set; }
            public bool bThisOneHanded { get; set; }
            public ItemQuality ThisQuality { get; set; }
            public ItemType ThisDBItemType { get; set; }
            public FollowerType ThisFollowerType { get; set; }
            public GilesItemType ThisGilesItemType { get; set; }
            // Monster/unit stuff
            public bool bThisElite { get; set; }
            public bool bThisRare { get; set; }
            public bool bThisUnique { get; set; }
            public bool bThisMinion { get; set; }
            public bool bThisTreasureGoblin { get; set; }
            public bool bThisEliteRareUnique { get; set; }
            public bool bThisBoss { get; set; }
            public bool bThisAttackable { get; set; }
            public double iThisHitPoints { get; set; }
            public float fThisRadius { get; set; }
            public bool bForceLeapAgainst { get; set; }
            public bool bHasDOTDPS { get; set; }
            public MonsterSize unit_thisMonsterSize { get; set; }
            // A reference to the original object for fast updates
            public DiaUnit unit_thisDiaUnit { get; set; }

            public GilesObject(Vector3 thisposition, GilesObjectType thisobjecttype = GilesObjectType.Unknown, double thisweight = 0, float thisdistance = 0f, float thisradiusdistance = 0f,
                string thisinternalname = "", int thisacdguid = -1, int thisractorguid = -1, int thisdynamicid = -1, int thisbalanceid = -1, int thisactorsno = -1, int thislevel = -1, int thisgold = -1,
                bool thisonehand = true, ItemQuality thisquality = ItemQuality.Invalid, ItemType thisitemtype = ItemType.Unknown, FollowerType thisfollowertype = FollowerType.None,
                GilesItemType thisgilestype = GilesItemType.Unknown, bool thiselite = false, bool thisrare = false, bool thisunique = false, bool thisminion = false,
                bool thistreasure = false, bool thisboss = false, bool thisattackable = false, double thishitpoints = 0d, float thisradius = 0f, MonsterSize thismonstersize = MonsterSize.Unknown,
                DiaUnit thisunit = null, bool uniquerareelite = false, bool forceleap = false, bool hasDOT = false)
            {
                vThisPosition = thisposition;
                ThisGilesObjectType = thisobjecttype;
                dThisWeight = thisweight;
                fCentreDistance = thisdistance;
                fRadiusDistance = thisradiusdistance;
                sThisInternalName = thisinternalname;
                iThisACDGUID = thisacdguid;
                iThisRActorGuid = thisractorguid;
                iThisDynamicID = thisdynamicid;
                iThisBalanceID = thisbalanceid;
                iThisActorSNO = thisactorsno;

                iThisLevel = thislevel;
                iThisGoldAmount = thisgold;
                bThisOneHanded = thisonehand;
                ThisQuality = thisquality;
                ThisDBItemType = thisitemtype;
                ThisFollowerType = thisfollowertype;
                ThisGilesItemType = thisgilestype;

                bThisElite = thiselite;
                bThisRare = thisrare;
                bThisUnique = thisunique;
                bThisMinion = thisminion;
                bThisTreasureGoblin = thistreasure;
                bThisEliteRareUnique = uniquerareelite;
                bThisBoss = thisboss;
                bThisAttackable = thisattackable;
                iThisHitPoints = thishitpoints;
                fThisRadius = thisradius;
                unit_thisMonsterSize = thismonstersize;

                unit_thisDiaUnit = thisunit;

                bForceLeapAgainst = forceleap;
                bHasDOTDPS = hasDOT;
            }

            // For cloning the object (and not simply referencing it)
            public GilesObject Clone()
            {
                GilesObject newGilesObject = new GilesObject(vThisPosition, ThisGilesObjectType, dThisWeight, fCentreDistance, fRadiusDistance, sThisInternalName, iThisACDGUID,
                    iThisRActorGuid, iThisDynamicID, iThisBalanceID, iThisActorSNO, iThisLevel, iThisGoldAmount, bThisOneHanded,
                    ThisQuality, ThisDBItemType, ThisFollowerType, ThisGilesItemType, bThisElite, bThisRare, bThisUnique,
                    bThisMinion, bThisTreasureGoblin, bThisBoss, bThisAttackable, iThisHitPoints, fThisRadius, unit_thisMonsterSize, unit_thisDiaUnit, bThisEliteRareUnique, bForceLeapAgainst, bHasDOTDPS);
                return newGilesObject;
            }
        }


Added the temp check variable (tmp_bHasDOTDPS)
Code:
        private static bool tmp_bForceLeapAgainst = false;
        private static bool tmp_bHasDOTDPS = false;


Set the temp "rend" using attributes bleeding and DOTDPS (added above the last line)
Code:
                        //DoTDPS used in Rend Checking
                        tmp_bHasDOTDPS = (tempCommonData.GetAttribute<int>(ActorAttributeType.DOTDPS) != 0 && tempCommonData.GetAttribute<int>(ActorAttributeType.Bleeding) != 0);
                        // Store the dia unit reference (we'll be able to remove this if we update ractor list every single loop, yay!)

And now modify the return of our target
Code:
                if (bWantThis)
                {
                    listGilesObjectCache.Add(new GilesObject(tmp_vThisPosition, tmp_ThisGilesObjectType, tmp_dThisWeight, tmp_fCentreDistance, tmp_fRadiusDistance, tmp_sThisInternalName,
                        tmp_iThisACDGUID, tmp_iThisRActorGuid, tmp_iThisDynamicID, tmp_iThisBalanceID, tmp_iThisActorSNO, tmp_item_iThisLevel, tmp_item_iThisGoldAmount, tmp_item_bThisOneHanded,
                        tmp_item_ThisQuality, tmp_item_ThisDBItemType, tmp_item_ThisFollowerType, tmp_item_ThisGilesItemType, tmp_unit_bThisElite, tmp_unit_bThisRare, tmp_unit_bThisUnique,
                        tmp_unit_bThisMinion, tmp_unit_bThisTreasureGoblin, tmp_unit_bThisBoss, tmp_unit_bThisAttackable, tmp_unit_iThisHitPoints, tmp_fThisRadius,
                        tmp_unit_ThisMonsterSize, tmp_unit_diaUnit, tmp_bThisEliteRareUnique, tmp_bForceLeapAgainst, tmp_bHasDOTDPS));
                }


Now we need to add our NonRendTargets variable, which i added under the iAnythingWithinRange
Code:
        private static int[] iAnythingWithinRange = new int[] { 0, 0, 0, 0, 0, 0, 0 };
        private static int iNonRendedTargets_6 = 0;

Then we add the NonRendTargets counter. We use 6 feet since 12feet is to far.
Code:
                            // Total up monsters at various ranges
                            if (thisgilesobject.fRadiusDistance <= 50f)
                            {
                                bool bCountAsElite = (thisgilesobject.bThisEliteRareUnique || thisgilesobject.bThisTreasureGoblin || thisgilesobject.bThisBoss);
                                bool bIsRended = (thisgilesobject.bHasDOTDPS);

                                // Flag up any bosses in range
                                if (thisgilesobject.bThisBoss)
                                    bAnyBossesInRange = true;

                                if (thisgilesobject.fRadiusDistance <= 6f)
                                {
                                    iAnythingWithinRange[RANGE_6]++;
                                    if (bCountAsElite)
                                        iElitesWithinRange[RANGE_6]++;
                                    if (!bIsRended)
                                        iNonRendedTargets_6++;
                                }

And finally we add nonRended reset
Code:
            // Reset the counters for monsters at various ranges
            iElitesWithinRange = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
            iAnythingWithinRange = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
            iNonRendedTargets_6 = 0;


Now the target ability selection

Rend
Code:
 // Rend spam
                    if (!bOOCBuff && !playerStatus.bIsIncapacitated && hashPowerHotbarAbilities.Contains(SNOPower.Barbarian_Rend) &&
                        //Only if 2 non-elite targets OR 1 elite target is within 6feet
                        (iAnythingWithinRange[RANGE_6] > 1 || iElitesWithinRange[RANGE_6] > 0) &&

                        // Don't use against goblins (they run too quick!) Or any mobs added to the fast list unless elite.                                                                  
                        (!targetCurrent.bThisTreasureGoblin && (!hashActorSNOFastMobs.Contains(targetCurrent.iThisActorSNO) || targetCurrent.bThisEliteRareUnique))
                        &&
                        //Non-WW users
                        (!hashPowerHotbarAbilities.Contains(SNOPower.Barbarian_Whirlwind) &&
                                (
                                //We use rend every 3.5s, Or if there are non-rended targets, or our current target is not rended
                                (GilesUseTimer(SNOPower.Barbarian_Rend) || (iNonRendedTargets_6 > 1 || !targetCurrent.bHasDOTDPS))                     
                                )

                        // This segment is for people who *DO* have whirlwind
                             || (hashPowerHotbarAbilities.Contains(SNOPower.Barbarian_Whirlwind) &&
                        // See if it's off-cooldown and at least 40 fury, or use as a fury dump
                                 (
                                    (settings.bFuryDumpWrath && playerStatus.dCurrentEnergyPct >= 0.92 && GilesHasBuff(SNOPower.Barbarian_WrathOfTheBerserker)) ||
                                    (settings.bFuryDumpAlways && playerStatus.dCurrentEnergyPct >= 0.92) ||
                                    (DateTime.Now.Subtract(dictAbilityLastUse[SNOPower.Barbarian_Rend]).TotalMilliseconds >= 2800)
                                 ) &&
                        // Max once every 1.2 seconds even if fury dumping, so sprint can be fury dumped too
                        // DateTime.Now.Subtract(dictAbilityLastUse[SNOPower.Barbarian_Rend]).TotalMilliseconds >= 1200 &&
                        // 3+ mobs of any kind at close range *OR* one elite/boss/special at close range
                                 (
                                    (iAnythingWithinRange[RANGE_15] >= 3 && iElitesWithinRange[RANGE_12] >= 1) ||
                                    (iAnythingWithinRange[RANGE_15] >= 3 && targetCurrent.bThisTreasureGoblin && targetCurrent.fRadiusDistance <= 13f) ||
                                    iAnythingWithinRange[RANGE_15] >= 5 ||
                                    ((targetCurrent.bThisEliteRareUnique || targetCurrent.bThisBoss) && targetCurrent.fRadiusDistance <= 13f && iAnythingWithinRange[RANGE_15] >= 3)
                                 )
                             )
                        ) &&
                        // And finally, got at least 20 energy
                        playerStatus.dCurrentEnergy >= 20)
                    {
                        iWithinRangeLastRend = iAnythingWithinRange[RANGE_6];
                        //iACDGUIDLastRend = targetCurrent.iThisACDGUID;
                        // Note - we have LONGER animation times for whirlwind-users
                        // Since whirlwind seems to interrupt rend so easily
                        int iPreDelay = 0;
                        int iPostDelay = 0;
                        if (hashPowerHotbarAbilities.Contains(SNOPower.Barbarian_Whirlwind))
                        {
                            if (powerLastSnoPowerUsed == SNOPower.Barbarian_Whirlwind || powerLastSnoPowerUsed == SNOPower.None)
                            {
                                iPreDelay = 5;
                                iPostDelay = 5;
                            }
                        }
                        return new GilesPower(SNOPower.Barbarian_Rend, 0f, playerStatus.vCurrentPosition, iCurrentWorldID, -1, iPreDelay, iPostDelay, USE_SLOWLY);
                    }
                        ) &&
                        // And finally, got at least 20 energy
                        playerStatus.dCurrentEnergy >= 20)
                    {
                        iWithinRangeLastRend = iAnythingWithinRange[RANGE_6];
                        //iACDGUIDLastRend = targetCurrent.iThisACDGUID;
                        // Note - we have LONGER animation times for whirlwind-users
                        // Since whirlwind seems to interrupt rend so easily
                        int iPreDelay = 0;
                        int iPostDelay = 0;
                        if (hashPowerHotbarAbilities.Contains(SNOPower.Barbarian_Whirlwind))
                        {
                            if (powerLastSnoPowerUsed == SNOPower.Barbarian_Whirlwind || powerLastSnoPowerUsed == SNOPower.None)
                            {
                                iPreDelay = 5;
                                iPostDelay = 5;
                            }
                        }
                        return new GilesPower(SNOPower.Barbarian_Rend, 0f, playerStatus.vCurrentPosition, iCurrentWorldID, -1, iPreDelay, iPostDelay, USE_SLOWLY);
                    }

Warcry modification for passive Inspiring Presence (Every 60 seconds to keep life bonus buff)
Code:
                    // War cry, constantly maintain
                    if (!playerStatus.bIsIncapacitated && hashPowerHotbarAbilities.Contains(SNOPower.Barbarian_WarCry) &&
                        (   playerStatus.dCurrentEnergy >= 20 && PowerManager.CanCast(SNOPower.Barbarian_WarCry) && 
                        (       !GilesHasBuff(SNOPower.Barbarian_WarCry) || DateTime.Now.Subtract(dictAbilityLastUse[SNOPower.Barbarian_WarCry]).TotalSeconds >= 60)
                        ))
                    {
                        return new GilesPower(SNOPower.Barbarian_WarCry, 0f, vNullLocation, iCurrentWorldID, -1, 1, 1, USE_SLOWLY);
                    }

Hammer of the ancients modified in conjunction with using rend (won't use unless energy is high enough to use rend still Or if at least 30 fury and target is at 25% or less HP)
Code:
                    // Hammer of the ancients spam-attacks - never use if waiting for special
                    if (!bOOCBuff && !bCurrentlyAvoiding && !bWaitingForSpecial && hashPowerHotbarAbilities.Contains(SNOPower.Barbarian_HammerOfTheAncients) && !playerStatus.bIsIncapacitated &&
                         playerStatus.dCurrentEnergy >= 20 &&
                       (
                        // More than 75 energy... *OR* 55 energy and target is high on health... 
                            hashPowerHotbarAbilities.Contains(SNOPower.Barbarian_Rend) && (
                                playerStatus.dCurrentEnergy >= 40 || (playerStatus.dCurrentEnergy >= 30 && targetCurrent.iThisHitPoints <= 0.25))

                          || targetCurrent.bThisEliteRareUnique || targetCurrent.bThisTreasureGoblin || targetCurrent.bThisBoss ||
                        // OR... player WOTB is active... OR player is low on health...
                            GilesHasBuff(SNOPower.Barbarian_WrathOfTheBerserker) || playerStatus.dCurrentHealthPct <= 0.38
                       ) &&
                       GilesUseTimer(SNOPower.Barbarian_HammerOfTheAncients))
                    {
                        return new GilesPower(SNOPower.Barbarian_HammerOfTheAncients, 12f, vNullLocation, -1, targetCurrent.iThisACDGUID, 1, 1, USE_SLOWLY);
                    }



Edit:
Added modified hammer of the ancients code.
Rend has been modified further and now uses a NonRended count of targets to check if it should rend again.
 

Attachments

  • ThatsNotGodly.webp
    ThatsNotGodly.webp
    21.8 KB · Views: 387
Last edited:
I used that spec for months but the bot's always just spammed rend and didn't use hota properly for me, I've wanted to try this out but I don't know anything about this code stuff and don't have the desire to learn lol.

Good that you're trying to make it work though it's been my favourite spec.

edit: wait now that I actually read it did you make it to spam rend more? lol. I hated that it didn't dump fury properly with hota even with it enabled in db.
 
Last edited:
Ill try when i have time... probably this weekend... but till then ill wait for some feedback on this
 
edit: wait now that I actually read it did you make it to spam rend more? lol. I hated that it didn't dump fury properly with hota even with it enabled in db.

This has been changed now, and overall the code is working great. Fury is no longer dumped on rending relentlessly on targets and now takes into account the barbs health since it is essential for survival.
 
This has been changed now, and overall the code is working great. Fury is no longer dumped on rending relentlessly on targets and now takes into account the barbs health since it is essential for survival.

Figured a better method of checking by using a count of targets not experiencing rend effects. This also solves a key issue of being under the effect of recovering from lots of damage (Firechains/Horde/Lots of damage).

Code added and changed. Hopefully no more issues arise!
 
build and edited code works flawlessly. Literally not dying now on mp3-4. nice job
 
could you link me your barb docuement cuz I am not 100% sure where I should change all this code :(
 
Could post your gillestrinity.cs instead of the sections of code you edited?
 
yes please, and include it into unified trinity in next versions
 
Does it working with 2H? I have much, much more dps, or it's all about speed? Also if you could, add whole file please.
 
Seems like an aewsome build! As alot of other ppl requested, can u please upload ur modified in a CS version :) Or can anyone tell me how i do with the codes? might aswell learn =)
 
I actually tried ur build now, with the normal trinity 1.7 Routines. And i can go mp4 without dying, tried act 3 and when threw 6-8 packs of champs/elites before i died to frost/arcane/vortex :/ Compared to the standard ww build who barely could handle mp 2!


PS: I guess with ur settings i would go even faster and maybe make it through mp 5-6!
 
Last edited:
WW build is still decent to be honest (but yes, even with high dps you might die). I just tested this build with 250k dps+ and it's shit for me. Very slow, I even used it with Sprint (Marathon).... I think it's all about his fix for GilesTrinity. :(
 
Ye i guess DR_MM. But for some key farming mp 1 is just way to low drop%...9 runs and no key, with mp 3 i got all 3 in 5-6 runs. With 250k dps i guess ww is the best! pretty sick gear u have there =) What mp are u botting on?
 
Hey herb just wanted to comment after about a full day of running your modifications.

Overall it seems to work pretty well though I haven't really had time to look at it running for long just mainly did a test to see how well it compared to WW. Only issue when I ran my tests was that I went from mp0 ww'ing to mp2 smash/rend build. The changes seems to have made my guys survive the higher mp fine but I believe my gear isn't quite at the right mark to take advantage of the MP increase so I was seeing a little lower (some bots close to similar) IPHs so I'll try and run it a little more this time on mp0 to comment more on the efficiency of the changes.

@The people asking about his changes: Hes dropped a hint on each code block of what code to look for IN trinity to input the new code, for example the "Added the temp check variable (tmp_bHasDOTDPS)" part, he has included the line in trinity that is
Code:
        private static bool tmp_bForceLeapAgainst = false;
to look for and then add the line he added below it which was
Code:
        private static bool tmp_bHasDOTDPS = false;
.

The part where he said "Added bool for DotDPS attribute", its easier to look for that code block in Gile's and replace the entire codeblock.
 
Could someone post the file already coded? I haven't touched code alteration before and wouldn't trust myself with it tbh.
 
if you're using unified trinity, the definitions are not the same as those listed in the first post.

tmp_ is c_ I believe, and the i and b prefixes have been removed for most of the definitions, so changing anything through just searching sections of code won't work and simply copying in OPs code will break any newer version of trinity other than the one the author refers to (but that is common sense, I guess)
 
Last edited:
Back
Top