I'll start by saying I'm not experienced at doing this, I don't even know what language these files are written in, and I could not write one from scratch. But I did manage to get some of the more broken skills working and therefore allow a more efficient witch doctor. All of the traditional builds I've tried were pretty bad, in comparison to my own play at least. All of the heavy spender builds like acid rain, bears, or acid bats suffered from fairly bad aoe clear speed and running out of mana constantly, combined with bad survivability. This is partially due to the lack of Piranhado in the default file, 4 second cc that also groups the mobs up to be aoe'd is very important. Vampire bats would have worked but the logic for them is pretty awful and it was out of my league to fix that. Pet builds are strong with the right gear, but its really hard to get them to a point where they rival anything else in clear speed.
For me, this is the fastest killspeed/strongest survivability build the witch doctor has in trinity. Witch Doctor - Game Guide - Diablo III It does require a certain amount of weapon damage to pull off as you need to chain soul harvests to clear trash. I'd say about 750k would be good, before that I would use firebomb with bears instead. Do note that this build simply won't work on higher torments because it relies on chain cooldown resets. Higher torments are less efficient anyway, there is no reason to bot them.
To make this work I changed three things. I had to remove the part of the soul harvest logic that makes it wait until the stacks run out to use it again so that it would spam it on cooldown for damage. I fixed the spirit barrage, although I'm honestly unsure what was wrong with it in the first place. And I added basic support for the new Piranha skill which should be a staple in any build. So even if you think I'm full of shit about everything else, I'd add the piranha support. Also, if something doesn't work for you and you didn't do anything wrong the only thing I can think of is version incompatibility. I am using the latest demonbuddy beta and trinity 1.8.15.
Skip to the bottom for the changed file if you would like all three changes and you won't have to do any of this editing.
I will break this down into 3 sections, you don't need to do them all if you don't want. If you use soul harvest as purely a buff and don't want it spammed, don't make the soul harvest changes, simple stuff.
Soul Harvest Damage Spam
Find your WitchDoctor.cs file and open it in notepad. It is in your Demonbuddy Folder>Plugins>Trinity>Combat>Abilities
Search for Harvest. You should arrive here.
We are going to replace all of that, with this.
Spirit Barrage Fix
This will remove support for the manitou rune which is uselss anyway. As I said before I am not quite experienced in doing this and I have no idea what was causing the problem before, so I just deleted this section because it didn't make sense to me to have spirit barrage cast at 0 range.
Search for Barrage.
Delete everything here. Then search for Barrage again.
Delete all of this too. Search for barrage once more, or scroll down about 10 lines.
Replace the above with this.
Piranha Support
Search for Grasp. It is near the middle of the file, and you should find this.
Replace it with this.
For me, this is the fastest killspeed/strongest survivability build the witch doctor has in trinity. Witch Doctor - Game Guide - Diablo III It does require a certain amount of weapon damage to pull off as you need to chain soul harvests to clear trash. I'd say about 750k would be good, before that I would use firebomb with bears instead. Do note that this build simply won't work on higher torments because it relies on chain cooldown resets. Higher torments are less efficient anyway, there is no reason to bot them.
To make this work I changed three things. I had to remove the part of the soul harvest logic that makes it wait until the stacks run out to use it again so that it would spam it on cooldown for damage. I fixed the spirit barrage, although I'm honestly unsure what was wrong with it in the first place. And I added basic support for the new Piranha skill which should be a staple in any build. So even if you think I'm full of shit about everything else, I'd add the piranha support. Also, if something doesn't work for you and you didn't do anything wrong the only thing I can think of is version incompatibility. I am using the latest demonbuddy beta and trinity 1.8.15.
Skip to the bottom for the changed file if you would like all three changes and you won't have to do any of this editing.
I will break this down into 3 sections, you don't need to do them all if you don't want. If you use soul harvest as purely a buff and don't want it spammed, don't make the soul harvest changes, simple stuff.
Soul Harvest Damage Spam
Find your WitchDoctor.cs file and open it in notepad. It is in your Demonbuddy Folder>Plugins>Trinity>Combat>Abilities
Search for Harvest. You should arrive here.
Code:
// Witch Doctor - Terror
//skillDict.Add("SoulHarvest", SNOPower.Witchdoctor_SoulHarvest);
//runeDict.Add("SwallowYourSoul", 3);
//runeDict.Add("Siphon", 0);
//runeDict.Add("Languish", 2);
//runeDict.Add("SoulToWaste", 1);
//runeDict.Add("VengefulSpirit", 4);
bool hasVengefulSpirit = HotbarSkills.AssignedSkills.Any(s => s.Power == SNOPower.Witchdoctor_SoulHarvest && s.RuneIndex == 4);
bool hasSwallowYourSoul = HotbarSkills.AssignedSkills.Any(s => s.Power == SNOPower.Witchdoctor_SoulHarvest && s.RuneIndex == 3);
// Soul Harvest Any Elites or 2+ Norms and baby it's harvest season
if (!UseOOCBuff && CombatBase.CanCast(SNOPower.Witchdoctor_SoulHarvest) && !Player.IsIncapacitated && Player.PrimaryResource >= 59 &&
(TargetUtil.AnyMobsInRange(16f, GetBuffStacks(SNOPower.Witchdoctor_SoulHarvest) + 1, false) || (hasSwallowYourSoul && Player.PrimaryResourcePct <= 0.50) || TargetUtil.IsEliteTargetInRange(16f)))
{
return new TrinityPower(SNOPower.Witchdoctor_SoulHarvest, 0f, Vector3.Zero, CurrentWorldDynamicId, -1, 0, 0, WAIT_FOR_ANIM);
}
// Soul Harvest with VengefulSpirit
if (!UseOOCBuff && !IsCurrentlyAvoiding && !Player.IsIncapacitated && CombatBase.CanCast(SNOPower.Witchdoctor_SoulHarvest) && hasVengefulSpirit && Player.PrimaryResource >= 59
&& TargetUtil.AnyMobsInRange(16, 3) && GetBuffStacks(SNOPower.Witchdoctor_SoulHarvest) <= 4)
{
return new TrinityPower(SNOPower.Witchdoctor_SoulHarvest, 0f, Vector3.Zero, CurrentWorldDynamicId, -1, 0, 0, WAIT_FOR_ANIM);
}
We are going to replace all of that, with this.
Code:
// Soul Harvest with VengefulSpirit
if (!UseOOCBuff && !IsCurrentlyAvoiding && !Player.IsIncapacitated && CombatBase.CanCast(SNOPower.Witchdoctor_SoulHarvest) && Player.PrimaryResource >= 59
&& TargetUtil.AnyMobsInRange(16, 3))
{
return new TrinityPower(SNOPower.Witchdoctor_SoulHarvest, 0f, Vector3.Zero, CurrentWorldDynamicId, -1, 0, 0, WAIT_FOR_ANIM);
}
Spirit Barrage Fix
This will remove support for the manitou rune which is uselss anyway. As I said before I am not quite experienced in doing this and I have no idea what was causing the problem before, so I just deleted this section because it didn't make sense to me to have spirit barrage cast at 0 range.
Search for Barrage.
Code:
//skillDict.Add("SpiritBarage", SNOPower.Witchdoctor_SpiritBarrage);
//runeDict.Add("TheSpiritIsWilling", 3);
//runeDict.Add("WellOfSouls", 1);
//runeDict.Add("Phantasm", 2);
//runeDict.Add("Phlebotomize", 0);
//runeDict.Add("Manitou", 4);
bool hasManitou = HotbarSkills.AssignedSkills.Any(s => s.Power == SNOPower.Witchdoctor_SpiritBarrage && s.RuneIndex == 4);
// Spirit Barrage Manitou
if (CombatBase.CanCast(SNOPower.Witchdoctor_SpiritBarrage) && Player.PrimaryResource >= 100 && TimeSinceUse(SNOPower.Witchdoctor_SpiritBarrage) > 18000 && hasManitou)
{
return new TrinityPower(SNOPower.Witchdoctor_SpiritBarrage, 0f, Vector3.Zero, CurrentWorldDynamicId, -1, 2, 2, WAIT_FOR_ANIM);
}
// Regular spirita barage
if (CombatBase.CanCast(SNOPower.Witchdoctor_SpiritBarrage) && Player.PrimaryResource >= 100 && !hasManitou)
{
return new TrinityPower(SNOPower.Witchdoctor_SpiritBarrage, 0f, Vector3.Zero, CurrentWorldDynamicId, -1, 2, 2, WAIT_FOR_ANIM);
}
Code:
bool hasWellOfSouls = HotbarSkills.AssignedSkills.Any(s => s.Power == SNOPower.Witchdoctor_SpiritBarrage && s.RuneIndex == 1);
bool hasRushOfEssence = ZetaDia.CPlayer.PassiveSkills.Any(s => s == SNOPower.Witchdoctor_Passive_RushOfEssence);
// Spirit Barrage + Rush of Essence
if (!UseOOCBuff && !IsCurrentlyAvoiding && !Player.IsIncapacitated && CombatBase.CanCast(SNOPower.Witchdoctor_SpiritBarrage) && Player.PrimaryResource >= 108 &&
hasRushOfEssence && Player.PrimaryResourcePct <= 0.25 && !hasManitou)
{
if (hasWellOfSouls)
return new TrinityPower(SNOPower.Witchdoctor_SpiritBarrage, 2, 2);
return new TrinityPower(SNOPower.Witchdoctor_SpiritBarrage, 21f, Vector3.Zero, -1, CurrentTarget.ACDGuid, 2, 2, WAIT_FOR_ANIM);
}
Delete all of this too. Search for barrage once more, or scroll down about 10 lines.
Code:
// Spirit Barrage
if (!UseOOCBuff && !IsCurrentlyAvoiding && !Player.IsIncapacitated && CombatBase.CanCast(SNOPower.Witchdoctor_SpiritBarrage) && Player.PrimaryResource >= 108 && !hasManitou)
{
return new TrinityPower(SNOPower.Witchdoctor_SpiritBarrage, 21f, Vector3.Zero, -1, CurrentTarget.ACDGuid, 2, 2, WAIT_FOR_ANIM);
}
Code:
// Spirit Barrage
if (!UseOOCBuff && !IsCurrentlyAvoiding && !Player.IsIncapacitated && CombatBase.CanCast(SNOPower.Witchdoctor_SpiritBarrage) && Player.PrimaryResource >= 108)
{
return new TrinityPower(SNOPower.Witchdoctor_SpiritBarrage, 21f, Vector3.Zero, -1, CurrentTarget.ACDGuid, 2, 2, WAIT_FOR_ANIM);
}
Piranha Support
Search for Grasp. It is near the middle of the file, and you should find this.
Code:
// Grasp of the Dead, look below, droping globes and dogs when using it on elites and 3 norms
if (!UseOOCBuff && !IsCurrentlyAvoiding && CombatBase.CanCast(SNOPower.Witchdoctor_GraspOfTheDead) && !Player.IsIncapacitated &&
(TargetUtil.AnyMobsInRange(30, 2)) &&
Player.PrimaryResource >= 78)
{
var bestClusterPoint = TargetUtil.GetBestClusterPoint(15);
return new TrinityPower(SNOPower.Witchdoctor_GraspOfTheDead, 25f, bestClusterPoint, CurrentWorldDynamicId, -1, 0, 0, WAIT_FOR_ANIM);
}
//skillDict.Add("Horrify", SNOPower.Witchdoctor_Horrify);
//runeDict.Add("Phobia", 2);
//runeDict.Add("Stalker", 4);
//runeDict.Add("FaceOfDeath", 1);
//runeDict.Add("FrighteningAspect", 0);
//runeDict.Add("RuthlessTerror", 3);
Replace it with this.
Code:
// Grasp of the Dead, look below, droping globes and dogs when using it on elites and 3 norms
if (!UseOOCBuff && !IsCurrentlyAvoiding && CombatBase.CanCast(SNOPower.Witchdoctor_GraspOfTheDead) && !Player.IsIncapacitated &&
(TargetUtil.AnyMobsInRange(30, 2)) &&
Player.PrimaryResource >= 78)
{
var bestClusterPoint = TargetUtil.GetBestClusterPoint(15);
return new TrinityPower(SNOPower.Witchdoctor_GraspOfTheDead, 25f, bestClusterPoint, CurrentWorldDynamicId, -1, 0, 0, WAIT_FOR_ANIM);
}
if (!UseOOCBuff && !IsCurrentlyAvoiding && CombatBase.CanCast(SNOPower.Witchdoctor_Piranhas) && !Player.IsIncapacitated &&
(TargetUtil.AnyMobsInRange(30, 2)) &&
Player.PrimaryResource >= 250)
{
var bestClusterPoint = TargetUtil.GetBestClusterPoint(15);
return new TrinityPower(SNOPower.Witchdoctor_Piranhas, 25f, bestClusterPoint, CurrentWorldDynamicId, -1, 0, 0, WAIT_FOR_ANIM);
}
//skillDict.Add("Horrify", SNOPower.Witchdoctor_Horrify);
//runeDict.Add("Phobia", 2);
//runeDict.Add("Stalker", 4);
//runeDict.Add("FaceOfDeath", 1);
//runeDict.Add("FrighteningAspect", 0);
//runeDict.Add("RuthlessTerror", 3);
Attachments
Last edited: