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

WitchDoctor: Community Enhanced Combat Profile.

MUFFDIVER

Member
Joined
Jun 15, 2014
Messages
72
Reaction score
1
|☠|witch|☠|doctor|☠|

As the title suggests...
WitchDoctor: Community Enhanced Combat Profile.

I think we have an opportunity here for us to create a resource that could contribute towards designing 'enhanced' combat.cs profiles.

I have seen MANY posts with very helpful tips, fixes, adjustments, improvements and so on. Problem is... the information can be so damn hard to locate sometimes and lots of the best stuff is scattered throughout random posts all over the forum which makes it nearly impossible to find.

We can bring all that information together just by providing a specific location for other people to share their knowledge. Provide a little code... write a brief description and the result of the changes in designated post\section = fountain of knowledge :)

>WitchDoctor: Community Enhanced Combat Profile.
>Crusader: Community Enhanced Combat Profile.
...or similar... whatever.

In the "spoiler!" area below you will find most of the edits I've made to my WitchDoctorCombat.cs
The "spoiler!" is just a preview - If you want the (complete) code\file you can find it on the bottom of this post.



// Soul Harvest: CHANGED TO HARVEST WHEN ANY 6 MOBS ARE IN A 12 FOOT RADIOUS OR AN ELITE IN 12F ALSO CHANGED FROM 16F
// ORIGINAL: (TargetUtil.AnyMobsInRange(16f, GetBuffStacks(SNOPower.Witchdoctor_SoulHarvest) + 1, false) || (hasSwallowYourSoul && Player.PrimaryResourcePct <= 0.50) || TargetUtil.IsEliteTargetInRange(16f)))
if (CanCast(SNOPower.Witchdoctor_SoulHarvest) &&
(GetBuffStacks(SNOPower.Witchdoctor_SoulHarvest) < 5) && (TargetUtil.AnyMobsInRange(12f, 6) || (hasSwallowYourSoul && Player.PrimaryResourcePct <= 0.50) || TargetUtil.IsEliteTargetInRange(12f)))
{
return new TrinityPower(SNOPower.Witchdoctor_SoulHarvest);
}

// Gargantuan Wrathful Protector: CHANGED TO ANYMOBSINRANGE (ANY 3 MOBS WITHIN 20 FEET OR AN ELITE IN 30 FEET = CAST)
// ORIGINAL: if (hasWrathfulProtector && TargetUtil.IsEliteTargetInRange(30f))

if (hasWrathfulProtector && (TargetUtil.AnyMobsInRange(20, 3)) || TargetUtil.IsEliteTargetInRange(30f))

{
return new TrinityPower(SNOPower.Witchdoctor_Gargantuan);
}

// Gargantuan regular
if (!hasRestlessGiant && !hasWrathfulProtector && Trinity.PlayerOwnedGargantuanCount == 0)
{
return new TrinityPower(SNOPower.Witchdoctor_Gargantuan);
}
}

// Zombie Dogs NON SACRIFICE BUILD: CHANGED TO RECAST WHEN # OF DOGS IS 3 INSTEAD OF THE ORIGINAL 2 = CAST
// ORIGINAL: if (!hasSacrifice && CanCast(SNOPower.Witchdoctor_SummonZombieDog) && Trinity.PlayerOwnedZombieDogCount <= 2)

if (!hasSacrifice && CanCast(SNOPower.Witchdoctor_SummonZombieDog) && Trinity.PlayerOwnedZombieDogCount <= 3)
{
return new TrinityPower(SNOPower.Witchdoctor_SummonZombieDog);
}

// Zombie Dogs SACRIFICE BUILD: CHANGED TO SACRIFICE WHEN # OF DOGS IS 4 INSTEAD OF THE ORIGINAL 2 = CAST
// ORIGINAL: (LastPowerUsed == SNOPower.Witchdoctor_Sacrifice || Trinity.PlayerOwnedZombieDogCount <= 2) &&

if (hasSacrifice && CanCast(SNOPower.Witchdoctor_SummonZombieDog) &&
(LastPowerUsed == SNOPower.Witchdoctor_Sacrifice || Trinity.PlayerOwnedZombieDogCount <= 4) &&
CombatBase.LastPowerUsed != SNOPower.Witchdoctor_SummonZombieDog)
{
return new TrinityPower(SNOPower.Witchdoctor_SummonZombieDog);
}

// Big Bad Voodoo: CHANGED TO 12F VS 30F AND SET TO MATCH WITH FETISH TRIGGERS
// MATCHED TRIGGERS WITH FETISH ARMY TO FIRE AT SAME TIME = MAXIMUM DAMAGE

// ORIGINAL: (TargetUtil.EliteOrTrashInRange(25f) || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 30f)))
if (CanCast(SNOPower.Witchdoctor_BigBadVoodoo) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 25f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{
return new TrinityPower(SNOPower.Witchdoctor_BigBadVoodoo);
}

// Piranhas: CHANGED TO ELITEORTRASHINRANGE (ANY 3 ELITEORTRASHINRANGE MOBS CLUSTERED IN 15\45 FEET = CAST AT CLUSTER)
// ORIGINAL: (TargetUtil.ClusterExists(15f, 45f, 2, true) || TargetUtil.AnyElitesInRange(45f)) &&
if (CanCast(SNOPower.Witchdoctor_Piranhas) && Player.PrimaryResource >= 250 &&
(TargetUtil.ClusterExists(15f, 45f, 3, true) || TargetUtil.EliteOrTrashInRange(45f)) &&
Player.PrimaryResource >= 250)
{
var bestClusterPoint = TargetUtil.GetBestClusterPoint(15f);

return new TrinityPower(SNOPower.Witchdoctor_Piranhas, 25f, bestClusterPoint);
}

// Horrify Buff at 35% health -- Frightening Aspect -- Courtesy of Marta11: Spam Horrify:Frightening Aspect
// ORIGINAL: if (CanCast(SNOPower.Witchdoctor_Horrify) && Player.CurrentHealthPct <= 0.35 && hasFrighteningAspect)
if (CanCast(SNOPower.Witchdoctor_Horrify) && TargetUtil.AnyMobsInRange(horrifyRadius, 0))
{
return new TrinityPower(SNOPower.Witchdoctor_Horrify);
}

// Fetish Army: DISABLE "CAST OFF COOLDOWN" TO ASSURE FETISH AND BIG BAD VOODOO CAST AT THE SAME TIME.
// MATCHED TRIGGERS WITH BIG BAD VOODOO TO MAXIMIZE DAMAGE

// ORIGINAL: (TargetUtil.EliteOrTrashInRange(30f) || TargetUtil.IsEliteTargetInRange(30f) || Settings.Combat.WitchDoctor.UseFetishArmyOffCooldown))
if (CanCast(SNOPower.Witchdoctor_FetishArmy) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 30f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{
return new TrinityPower(SNOPower.Witchdoctor_FetishArmy);
}

// TESTING CAST DURATION OF VAMPIRE BATS - NEED LONG BLASTS VS QUICK BLASTS COSTING 225 MANA EACH
// ORIGINAL: SpellHistory.TimeSinceUse(SNOPower.Witchdoctor_Firebats) <= TimeSpan.FromMilliseconds(250d));
// SCRATCH: Seems to be length of time between use vs length of cast.
SpellHistory.TimeSinceUse(SNOPower.Witchdoctor_Firebats) <= TimeSpan.FromMilliseconds(1000d));


A little about submissions below:
If this idea works there will obviously have to be some sort of structure to keep things reasonably organized so if you post could you please:

1) Start with a couple details... what the code does etc....
2) DemonBuddy Version the code was last used on (if known).
3) Who wrote the code or location where the code was found (if known).
4) Lastly please use the CODE tag or ideally use the SPOILER tag to keep the huge walls of code to a minimum.
Thanks!

How to use the tags:
[C0DE] TEXT BETWEEN [/C0DE]
and
[SP0ILER] TEXT BETWEEN [/SP0ILER]
I used zero's for the letter O just to avoid it actually using the function...
Use the proper spelling and letters... numbers will not work.



Download the WitchDoctor profile I use (below):
*All the code I shared above is included the file - no editing required.
*Tested on: Demonbuddy v1.1 r1923 b363 & 418 beta
*File Location: ..DemonBuddy\Plugins\Trinity\Combat\Abilities\WitchDoctorCombat.cs
 

Attachments

Last edited:
Here is the first question and hopefully (answer) to add to the information in this post.

Vampire Bats:
The cost of casting is 225 Mana... if you hold the button down... it keeps casting at no further cost.
If you release and repress you get dinged another 225... fair enough.

My question:
Is there a way to code it so the bot casts the spell constantly until (X) the target is dead or (Y) a set amount of seconds?

As it is now the bot seems to have the urge to press the button multiple times even if it is just engaging one target. Obviously this isn't ideal as it eats up your entire Mana supply in seconds. If this could be prevented or adjusted somehow... that would be excellent!

Thank you in advance!
 
Hello maybe you can put a download link for the file allot of people dont know where to put what, Thanx for your work.
 
Courtesy of Marta11, here are the changes needed to spam Horrify:Frightening Aspect

Original:
// Horrify Buff at 35% health -- Freightening Aspect
if (CanCast(SNOPower.Witchdoctor_Horrify) && Player.CurrentHealthPct <= 0.35 && hasFrighteningAspect)
{
return new TrinityPower(SNOPower.Witchdoctor_Horrify);
}

Modified:
if (CanCast(SNOPower.Witchdoctor_Horrify) && TargetUtil.AnyMobsInRange(horrifyRadius, 0))

{
return new TrinityPower(SNOPower.Witchdoctor_Horrify);
}
 
Last edited:
Courtesy of Marta11, here are the changes needed to spam Horrify:Frightening Aspect

Excellent and exactly type of thing I was hoping for. Even if it's a slow process or not a huge post... what is here will be easy to find and if the post does get larger... you can just search the post rather than the entire forum.

Thanks for your contribution :)
 
Great idea :>, question,
Can you or is it already implemented that Plague of toads + Rain of frogs will keep targeting different enemies and not spam the same one?
 
Great idea :>, question,
Can you or is it already implemented that Plague of toads + Rain of frogs will keep targeting different enemies and not spam the same one?

Thanks :)

I'm pretty sure that what you're asking would be something that you'd more likely find in one of the main combat files. Maybe something like 'target priority' calculations or who knows maybe it's totally random.

If it can be added to this particular file I would guess that you'd have to write the code for that vs just tweaking. Someone else may have some input but... at this time it's the standard target priority calculations for me.

I know mine switches quite a bit and then other times it stays on target. Either way... it's partial AOE and I try aim for mobs to be dead before I have to worry about which one dies first. All at once works for me ;)

I'll update if I hear\see anything. Take care :)
 
Cant get the fetish and big bad voodoo be cast at the same time. I changed the values to f12.

anyone with some info or pointers?
 
Cant get the fetish and big bad voodoo be cast at the same time. I changed the values to f12.

anyone with some info or pointers?

To have them sync is more that just the 12f... that is just the distance the mobs have to be within. The rest of the code combined with that is where the synchronization occurs. Mob type is also very important to make this work.

Fetish:
Code:
if (CanCast(SNOPower.Witchdoctor_FetishArmy) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 30f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{
return new TrinityPower(SNOPower.Witchdoctor_FetishArmy);
}
...and Voodoo:
Code:
if (CanCast(SNOPower.Witchdoctor_BigBadVoodoo) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 25f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{
return new TrinityPower(SNOPower.Witchdoctor_BigBadVoodoo);
}

Both must be the same in order for the conditions to match and trigger at the same time.

Hope that helps :)

Oh I almost forgot... you cannot have the 'cast fetish off cooldown' enabled (uncheck it).
- I will attach a screenshot below.
0offcool.webp
I know some people won't like that but when you see the devastating effects of both of them firing together and at the more important moments... you'll totally change your mind about having them up always... because there is something cool about roasting bosses in just seconds ;)
 
Last edited:
To have them sync is more that just the 12f... that is just the distance the mobs have to be within. The rest of the code combined with that is where the synchronization occurs. Mob type is also very important to make this work.

Fetish:
Code:
if (CanCast(SNOPower.Witchdoctor_FetishArmy) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 30f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{
return new TrinityPower(SNOPower.Witchdoctor_FetishArmy);
}
...and Voodoo:
Code:
if (CanCast(SNOPower.Witchdoctor_BigBadVoodoo) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 25f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{
return new TrinityPower(SNOPower.Witchdoctor_BigBadVoodoo);
}

Both must be the same in order for the conditions to match and trigger at the same time.

Hope that helps :)

Oh I almost forgot... you cannot have the 'cast fetish off cooldown' enabled (uncheck it).
- I will attach a screenshot below.
View attachment 135389
I know some people won't like that but when you see the devastating effects of both of them firing together and at the more important moments... you'll totally change your mind about having them up always... because there is something cool about roasting bosses in just seconds ;)

What changes would I have to make to your current code to cast BBV when I cast garg or if no garg used as a skill use it with fetish army? Also how can I change your code to make Fetish army constantly used?
 
Last edited:
What changes would I have to make to your current code to cast BBV when I cast garg or if no garg used as a skill use it with fetish army? Also how can I change your code to make Fetish army constantly used?

The way I've configured the code is specifically so Fetish Army isn't constantly used and is only used when Big Bad Voodoo is ready. The reason for this is that enormous damage is done when they both fire at the same time. If Fetish Army gets out of sync with Big Bad Voodoo you will lose valuable DPS when it's most needed.

If you want to change the settings you're obviously more than welcome too but... I've spent countless hours trying various configurations and what I've put together here has been tested thoroughly .

All you need to do to have Fetish Army fire any time it is available is check the box in the screenshot that you quoted. Again, I wouldn't recommend it with this build but that's all you have to do - you can leave the code the way it is.

As for the Gargantuan firing at the same time as Big Bad Voodoo... just adjust the code to match the Big Bad Voodoo code. As well I wouldn't recommend this as the way code has been modified these skills all work together to create max DPS.

If you still would like to modify the settings just pay attention to these parts of code:

Code:
GARG
if (hasWrathfulProtector && [COLOR="#800000"](TargetUtil.EliteOrTrashInRange(12f)[/COLOR] || TargetUtil.IsEliteTargetInRange(30f))
{

BBV
if (CanCast(SNOPower.Witchdoctor_BigBadVoodoo) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 25f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{

FA
if (CanCast(SNOPower.Witchdoctor_FetishArmy) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 30f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{

I do not recommend the above code changes but if you wish to try them feel free. The code above is not and will not be included in the main attachment on the 1st page as I don't believe they are ideal settings but you are more than welcome to manually change the code.

Take Care!
 
Last edited:
The way I've configured the code is specifically so Fetish Army isn't constantly used and is only used when Big Bad Voodoo is ready. The reason for this is that enormous damage is done when they both fire at the same time. If Fetish Army gets out of sync with Big Bad Voodoo you will lose valuable DPS when it's most needed.

If you want to change the settings you're obviously more than welcome too but... I've spent countless hours trying various configurations and what I've put together here has been tested thoroughly .

All you need to do to have Fetish Army fire any time it is available is check the box in the screenshot that you quoted. Again, I wouldn't recommend it with this build but that's all you have to do - you can leave the code the way it is.

As for the Gargantuan firing at the same time as Big Bad Voodoo... just adjust the code to match the Big Bad Voodoo code. As well I wouldn't recommend this as the way code has been modified these skills all work together to create max DPS.

If you still would like to modify the settings just pay attention to these parts of code:

Code:
GARG
if (hasWrathfulProtector && [COLOR="#800000"](TargetUtil.EliteOrTrashInRange(12f)[/COLOR] || TargetUtil.IsEliteTargetInRange(30f))
{

BBV
if (CanCast(SNOPower.Witchdoctor_BigBadVoodoo) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 25f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{

FA
if (CanCast(SNOPower.Witchdoctor_FetishArmy) &&
(TargetUtil.EliteOrTrashInRange(12f)/*ORIG: 30f*/ || (CurrentTarget.IsBoss && CurrentTarget.Distance <= 12f/*ORIG: 30f*/)))
{

I do not recommend the above code changes but if you wish to try them feel free. The code above is not and will not be included in the main attachment on the 1st page as I don't believe they are ideal settings but you are more than welcome to manually change the code.

Take Care!

You might want to add the code for hexing pants. It works really well.
 
You might want to add the code for hexing pants. It works really well.

Haven't been playing much but... I'll look into it. You're welcome to share the code for the others in the meantime ;) ;)

Take Care.
 
Can I also request something here ? if yes ^^

When doing ghom runs, my bot casts guarg right after tping to the location. As I use the rune that hes only there for 15 secs, he just disappears right before ghom spawns. if someone can help me I would appreciate that ^^
 
So, with the Jade set, will this make it so that my WD makes sure the mobs are in range, cast locusts and haunt, then siphon to deal some massive damage? If this isn't the case, how would I go about making sure the bot can do this?
 
which build is this muff?

Sorry for the delay.

It's not really a specific build but a collection of enhancements all in one.

It has tweaks done to various skills themselves not just one particular build. If I was to pick a build... it has had more tweaks towards a pet build but will work better than the default with any build. In my opinion anyways.
 
When I use this routine, my WD uses Fetish Army very little even if BBV is ready to cast. It can go a hole bountie farm run without using Fetish army.
 
Last edited:
Back
Top