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
Added bool for DotDPS attribute
Added the temp check variable (tmp_bHasDOTDPS)
Set the temp "rend" using attributes bleeding and DOTDPS (added above the last line)
And now modify the return of our target
Now we need to add our NonRendTargets variable, which i added under the iAnythingWithinRange
Then we add the NonRendTargets counter. We use 6 feet since 12feet is to far.
And finally we add nonRended reset
Now the target ability selection
Rend
Warcry modification for passive Inspiring Presence (Every 60 seconds to keep life bonus buff)
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)
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.
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
Last edited: