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

Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Dungeonbuddy and the 10 Man Bot Raid - The full Story!

buzzerbeater

Well-Known Member
Joined
Mar 21, 2011
Messages
5,419
Good evening ladies and gentleman,

I'm gonna present to you my newest "project", since I no longer bot for Gold or play WoW for fun, I create random stuff, my last project was a full warsong bot Match, which was really awesome, but we lost. :D


The Preparation!
Since we can't start a botraid out of nowhere, we need a little work to be done.

Since we are botter, mats aren't the Problem. But we still needed a solid automated Process to get it all done: A big thanks for Benkoren at this point!
We used his profile as a basic to get the process sorted out. The Farmers run about 8 hrs per day to get all the stuff. Completly automated 24hr schedule for aRelog. Dailies included to help raising our new founded guild even more!

Now we have Flasks, Potions, Gems, Enchants, Bufffood and everything a Raid Group will ever need in our Guild Bank and are ready for raiding 24/7 till MoP. :D

The Raidsetup!

Now the big Question: Who is in, who is out?!

First: The Damagedealer. We want three ranged and two Meele DPS.
Since we want the best for our Raid, we look at performance, what can the Class and the CC do?

Ok, the Meeles were easy: An Arms Warrior and a Combat Rogue.
Arms for just ruling the world and having a good CC and Rogue for the Legendaries for sure!! (And being not too bad as a combat rogue.)

Now the ranged ones: Survival Hunter for sure, they can do so much dmg out of nowhere, with nearly zero equipment. The next one would be a Shadow Priest. Why? Because it's my old Main with an ilvl of 403. :P aaaaaaand the last Spot goooooooes to: A Mage. Simple. :)


Second: The Tanks. This choice was easy, but only because we have already decently geared tanks.
A Paladin. Tbh. those bastards are OP. Sometimes it feels like they can Solotank DS alone while only wearing a Banana as Armor...
And a Druid. This char has also an ilvl of around 400 and therefore should be a strong force to keep the raid alive in early attempts. (And for having the second best CC ever made. :P )


Third: The Healersetup. Now we have two super easy choices and a "hard" choice.
First a Shaman. Why? Best CC ever made.
Then second a Paladin. They are, again, just overpowered.
Now the hard choice, Priest or Druid? We already have both in the raid... Priest has the most gamebreaking CD ever... Druid has Replenishment... I have no clue, but yeah, we took the Druid, because the CD's aren't that much worse and we get an Battlerezz and Replenishment.

Here a little picture while they were in an super early state: (Setup was a bit different back then.)
wowscrnshot071212205125.jpg

Aaaand a little List with my CC choices:

Setup:

Warrior______ Arms ___________ Melee __________ Dunatank
Rogue_______ Combat _________ Melee __________ Mutaraid or CLU
Priest_______ Shadow ____________ Ranged __________ Hopefully Mentally but i think CLU
Paladin______ Prot ______________ Tank ____________ Protect & Serve
Paladin______ Holy _____________ Heal ____________ Holy Cow! or CLU
Druid ________ Resto ___________ Heal __________ RestoCow!
Shaman ____ Resto ________ Heal____________ ShamWoW
Druid _________ Feral ________ Offtank ________ Junglebook
Hunter______ Survival ______ Ranged _______ Bowman or CLU
Mage________ Fire _____ Ranged ___________ CLU


The "First Raid"!

Since Dungeonbuddy doesn't have any Raid Profiles yet and I couldn't get anything done, since I know as much about coding as an mechanical engineer should, aka. not the slightest bit, i had my first Raid with Lazyraider:

We had two user controlled tanks and 4 people following one tank each.

To make it short: We cleared the trash and got to boss to the first phase, but since everyone was derping in one place, we died fast. :(


Beta Raid? It's wipe time!!

We had our first Raid and it was more or less a success. No kill, many wipes. (Only 5 I think, but this was jsut because of Hearthstoning chars and a not yet working corpse run.)

We had many problems: CC's going crazy, Dungeonbuddy going crazy and many movement hiccups.
First: Dungeonbuddy has huge Problems with the tanks in DS. They recapture old waypoints again and again and therefore run back and forth like derps all day, we had to push them forward just to see them getting smashed. We couldnt set one as Leader in the Botconfig nor could we set one of the Raidmember as Raidleader, they just freak out, so a new member was born, the eleventh member, sitting in SW, being our Raidleader, yeah no extra motivation for the Raid. :(
Second: To test our Raidscripts we decided to go Singular only, just to see what will happen or will not happen. We hoped to see less fails with that, but yeah it wasn that good at all.
Third: This:" System.NullReferenceException: Object reference not set to an instance of an object.
at Styx.WoWInternals.Lua.GetReturnVal[T](String lua, UInt32 retVal) "
DB spams this message after every Spellcall, after ever mesh loaded, after nearly everything. We have the strong feeling, that it is related to some sort of Check, because we get this message every time we start DB in DS. It was somehow related to a latency check which couldnt be found, but yeah, can't find it right now.

Now we tested some script things and could make a little bit of progress, one time they were moving towards the resonating crystal and another time they were walking towards the pillars, but not behind it.

Big thanks to Stormchasing again for his great effort and for Natfoth too, he helped us out via. Skype to get things done. :)

The Call up at the end!

If there are any devs who can provide me with an working profile aka. dungeon script for the first boss only, i would be the happiest person on earth!! I'm ready to donate for sure. I made a plan how to do it and even mathematically calculate the coords behind the pillars etc. but, yeah, no idea how to put this in beautiful code.
tbh. i don't even know if it's possible to code Raid Scripts atm, since nobody answered my post in the Dungeonbuddy Release Thread. :(



Thanks a lot, if you read at least one line of this Stuff!

I will put up videos and screenshots of the bosskills, just to let you know what's possible with this amazing bot! Maybe one day, it will be an 25man Raid, we have 16 Accounts atm for use, but this would most certainly kill our computers. :D

Greets :)




And thanks to all the people, who support Honorbuddy, you make it possible! :)
 
Last edited:
Just saw you are going to use Dunatank's Warrior CC for this. We hereby offer you early access to our new v4.0 Alpha version.
 
one of the dreams since i started botting is to run a full bot 40 man raid in perfect precision. this is defiantly getting close and i cant wait to see what happens.
 
Now I'm really sad that I can't help :(
This is, indeed, something I'd *so* much like to see.

Being an average project manager I'd say "Mwah, can't be that hard" ;)

So if there's anything I can do to help, please let me know. I'm especially good at testing stuff until it breaks.
 
i've absolutely NO idea bout the Helpers from dungeonbuddy atm, but if they are working the way i think they work, then this script should work (couldn't test, still at work)
PHP:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Bots.DungeonBuddy.Attributes;
using Bots.DungeonBuddy.Helpers;
using CommonBehaviors.Actions;
using Styx;
using Styx.Helpers;
using Styx.Logic;
using Styx.Logic.Pathing;
using Styx.WoWInternals;
using Styx.WoWInternals.WoWObjects;
using TreeSharp;
using Tripper.Tools.Math;
using Action = TreeSharp.Action;

namespace Bots.DungeonBuddy.Dungeon_Scripts.Cataclysm
{
    public class DragonSoul : Dungeon
    {
        #region Overrides of Dungeon
        public override uint DungeonId
        {
            get { return 416; }
        }
        //tbd
        public override WoWPoint Entrance { get { return new WoWPoint(-7570.482f, -1330.446f, 246.5363f); } }

        /// <summary>
        ///   IncludeTargetsFilter is used to add units to the targeting list. If you want to include a mob thats usually removed by the default filters, you shall use that.
        /// </summary>
        /// <param name="incomingunits"> Units passed into the method </param>
        /// <param name="outgoingunits"> Units passed to the targeting class </param>
        public override void IncludeTargetsFilter(List<WoWObject> incomingunits, HashSet<WoWObject> outgoingunits)
        {
            foreach (var obj in incomingunits)
            {
                var unit = obj as WoWUnit;
                if (unit != null)
                {

                }
            }
        }

        /// <summary>RemoveTargetsFilter is used to remove units thats not wanted in target list. Like immune mobs etc.</summary>
        /// <param name="units">The incomingunits.</param>
        public override void RemoveTargetsFilter(List<WoWObject> units)
        {
            foreach (var obj in units)
            {
                var unit = obj as WoWUnit;
                if (unit != null)
                {

                }
            }
        }
        public override void WeighTargetsFilter(List<Targeting.TargetPriority> units)
        {
            foreach (var priority in units)
            {
                var unit = priority.Object as WoWUnit;
                if (unit != null)
                {
                    //Madness, Ship, Hagara
                    //Blistering Tentacles, Twilight Sapper, Frozen Binding Crystal,Bound Lightning Elemental
                    if (unit.Entry.Equals(new uint[] { 56188, 56923, 56136, 56700 })) 
                    {
                        priority.Score += 400;
                    }
                    //Yor'Sahj
                    //add the bubbles in the needed priority

                    //Zonozz Hardmode

                    //Spine of Deathwing
                    //Hideous Amalgamation, Corrupted Blood, Corruption with Fiery Grip, Burning Tendron
                }
            }
        }
        #endregion

        #region Encounter Handlers
        private uint crystalEntry = 55346;
        //[EncounterHandler(0)]
        /*
         * public Composite RootLogic()
         * {
         * }
         */
        [EncounterHandler(55265, "Morchock", Mode = CallBehaviorMode.Proximity, BossRange = 200)]
        public Composite MorchockEncounter()
        {
            var tankBossLoc = new WoWPoint(-1981.033, -2409.299, 69.05319);

            var bossFarPathEndLoc = new WoWPoint(-1981.033, -2409.299, 69.05319); //to be refined
            var trashTankLoc = new WoWPoint(201.7278, 998.2936, 195.0932); //to be refined
            var partyWaitLoc = new WoWPoint(201.3972, 1008.957, 197.0022); //to be refined

            WoWUnit boss = null, trash = null, crystals = null;
            return new PrioritySelector(
                ctx => boss = ctx as WoWUnit,
                // Clear the area and then pull boss.
                new Decorator(
                    ctx => !boss.Combat,
                    new PrioritySelector(
                        ctx => trash = ScriptHelpers.GetUnfriendlyNpsAtLocation(() => tankBossLoc, 50, u => u != boss).FirstOrDefault(),
                // pull the trash when boss is far away
                        ScriptHelpers.CreatePullNpcToLocation(
                            ctx => trash != null && !StyxWoW.Me.Combat,
                            ctx => boss.Location.DistanceSqr(bossFarPathEndLoc) <= 25 * 25 || trash.Location.DistanceSqr(trashTankLoc) <= 50 * 50,
                            () => trash, () => trashTankLoc, () => StyxWoW.Me.IsTank() ? trashTankLoc : partyWaitLoc, 5),
                // pull boss when he's near and trash is cleared.
                        ScriptHelpers.CreatePullNpcToLocation(
                            ctx => trash == null && StyxWoW.Me.Location.DistanceSqr(tankBossLoc) <= 50 * 50,
                            ctx => boss.Location.DistanceSqr(tankBossLoc) <= 25 * 25,
                            () => boss, () => tankBossLoc, () => StyxWoW.Me.IsTank() ? tankBossLoc : StyxWoW.Me.Location, 5)                            
                        )),
                // Handle boss encounter
                new Decorator(
                    ctx => boss.Combat,
                    new PrioritySelector(
                        ctx => crystals = ObjectManager.GetObjectsOfType<WoWUnit>().Where(q => q.Entry == crystalEntry).FirstOrDefault(),
                        ScriptHelpers.CreateRunAwayFromBad(ctx => true, 30, 103851, 103785),
                        new Decorator(
                            ret => StyxWoW.Me.HasAura(103534) && !StyxWoW.Me.IsTank(), 
                            ScriptHelpers.CreateWaitAtLocationWhile(ret => (StyxWoW.Me.HasAura(103534) || StyxWoW.Me.HasAura(103541) || StyxWoW.Me.HasAura(103536)) && !StyxWoW.Me.IsTank(), ()=>crystals.Location,10)
                            )
                        )
                    )
                    ); 
        }
        #endregion
    }
}

The base script is taken from Blackrock Caverns, so maybe (no... it is sure, u have to) u have to refine some locations.
I commented these points with "//to be refined", these locations have to be reentered by real values from Dragon Soul.
Maybe we could remove some of them (maybe all except the tankLoc), but this has to be tested.
The script should handle both -> runaway from black blood (maybe this has to be recoded, since i dunno if the behavior from scripthelper is supporting this... maybe it rains straigt to a stone and run with his head against it), run to the crystal and wait till debuff fades
 
Interesting project.
Current version of DungeonBuddy doesn't support queuing for Raids atm but it should still load the correct profile and script if you manually queue and join one.

For calculating locations behind pillars or other objects you can use ScriptHelpers.CreateLosLocation, for example usage see scripts for last boss in Seth Halls or Slabhide in Stonecore (this isn't testing yet since ability that needs to be LOSed is only used in heroic mode)

edit: if the pillars are at fixed locations then you can use the blackspot generator button in Developer tools window to get location and radius.


Code:
        /// <summary>
        ///   This behavior will run out of Line-Of-Sight of a location.
        /// </summary>
        /// <param name="canRun"> The condition to run this behavior </param>
        /// <param name="locationToLos"> The location you want to get out of LOS with. </param>
        /// <param name="objectLocationToLosAt"> The center location of the object you want to use to LOS </param>
        /// <param name="objectRadius"> The radius of the object you want to use to LOS </param>
        /// <returns> </returns>
        public static Composite CreateLosLocation(CanRunDecoratorDelegate canRun,
                                                  Func<WoWPoint> locationToLos,
                                                  Func<WoWPoint> objectLocationToLosAt,
                                                  Func<float> objectRadius)
 
Last edited:
No fixed locations for the pillars far as I know but if they are objects which are shown in objectmanager then I know some ways to get proper locations :-) but thanks for the hint
 
something that kind of bugged me is you stated that there are no profiles

There are profiles
I believe you meant to say that there are no 'scripts'

I profiled both LFR versions (same concept as regular / heroic for profile purposes)
But the 'scripts' are missing of course (but lots of information in the profile for when the dungeonbuddy devs get around to making scripts)
 
i almost cried the first time i saw a multiboxer raid 10man video.. if i see this i definitely will
 
i've edited my first version of the Morchock Encounter
but the forum won't let me upload -.-
okay then i post it with php-tags hope that works
this script should do the following:

- Pull boss (if tank)
- Taunt boss (if tank and boss currenttarget has Crush Armor StackCount > 3)
- Run to the Resonating Crystals and wait there till Debuff is gone (i hope the CC executes rangeSpells and Healing with this Behavior)
- Run to the Pillars (with LOS Behavior)
- Run away if Blood Aura (Black Blood of Earth),
PHP:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

using Bots.DungeonBuddy.Attributes;
using Bots.DungeonBuddy.Helpers;

using Styx;
using Styx.Logic;
using Styx.Logic.Combat;
using Styx.Combat.CombatRoutine;
using Styx.Logic.Pathing;
using Styx.WoWInternals;
using Styx.WoWInternals.WoWObjects;
using TreeSharp;
using Action = TreeSharp.Action;


namespace Bots.DungeonBuddy.Dungeon_Scripts.Cataclysm
{
    public class TheSiegeOfWyrmrestTempleHeroic : Dungeon
    {
        #region Overrides of Dungeon
        public override uint DungeonId
        {
            get { return 416; }
        }
        public override WoWPoint Entrance { get { return new WoWPoint(-8263.148f, -4510.692f, -219.3243f); } }

        /// <summary>
        ///   IncludeTargetsFilter is used to add units to the targeting list. If you want to include a mob thats usually removed by the default filters, you shall use that.
        /// </summary>
        /// <param name="incomingunits"> Units passed into the method </param>
        /// <param name="outgoingunits"> Units passed to the targeting class </param>
        public override void IncludeTargetsFilter(List<WoWObject> incomingunits, HashSet<WoWObject> outgoingunits)
        {
            foreach (var obj in incomingunits)
            {
                var unit = obj as WoWUnit;
                if (unit != null)
                {

                }
            }
        }

        /// <summary>RemoveTargetsFilter is used to remove units thats not wanted in target list. Like immune mobs etc.</summary>
        /// <param name="units">The incomingunits.</param>
        public override void RemoveTargetsFilter(List<WoWObject> units)
        {
            foreach (var obj in units)
            {
                var unit = obj as WoWUnit;
                if (unit != null)
                {

                }
            }
        }
        public override void WeighTargetsFilter(List<Targeting.TargetPriority> units)
        {
            foreach (var priority in units)
            {
                var unit = priority.Object as WoWUnit;
                if (unit != null)
                {
                    //Madness, Ship, Hagara
                    //Blistering Tentacles, Twilight Sapper, Frozen Binding Crystal,Bound Lightning Elemental
                    /*if (unit.Entry.Equals(new uint[] { 56188, 56923, 56136, 56700 }))
                    {
                        priority.Score += 400;
                    }*/
                    //Yor'Sahj
                    //add the bubbles in the needed priority

                    //Zonozz Hardmode

                    //Spine of Deathwing
                    //Hideous Amalgamation, Corrupted Blood, Corruption with Fiery Grip, Burning Tendron
                }
            }
        }
        #endregion

        #region Encounter Handlers
        private uint crystalEntry = 55346;
        //[EncounterHandler(0)]
        /*
         * public Composite RootLogic()
         * {
         * }
         */
        private static uint resonatingCrystals = 55346;
        private static uint InnerWall = 209596;
        private static List<WoWGameObject> MorchockPillars {get{return ObjectManager.GetObjectsOfType<WoWGameObject>().Where(w => w.Entry == InnerWall).OrderBy(w=>w.Distance).ToList();}}
        private static WoWGameObject MorchockCrystals { get { return ObjectManager.GetObjectsOfType<WoWGameObject>().Where(q => q.Entry == resonatingCrystals).FirstOrDefault(); } }
        [EncounterHandler(55265, "Morchock", Mode = CallBehaviorMode.Proximity, BossRange = 200)]
        public Composite MorchockEncounter()
        {
            var tankBossLoc = new WoWPoint(-1970.588, -2408.602, 68.5843);

            var bossFarPathEndLoc = new WoWPoint(-2005.624, -2409.554, 70.20834);
            //<Hotspot X="-2005.624" Y="-2409.554" Z="70.20834" />
            var trashTankLoc = new WoWPoint(-2054.229, -2406.151, 73.31179);
            /* Trash packs for Hardmode to be cleared
             * <Hotspot X="-2033.066" Y="-2356.053" Z="70.50761" />
             * <Hotspot X="-1977.595" Y="-2305.988" Z="65.32207" />
             * <Hotspot X="-1977.17" Y="-2494.873" Z="64.29511" />
             * <Hotspot X="-2043.77" Y="-2517.459" Z="71.97334" />
             */
            var partyWaitLoc = new WoWPoint(-2054.229, -2406.151, 73.31179);

            WoWUnit boss = null, trash = null;
            return new PrioritySelector(
                ctx => boss = ctx as WoWUnit,
                // Clear the area and then pull boss.
                new Decorator(
                    ctx => !boss.Combat,
                    new PrioritySelector(
                        ctx => trash = ScriptHelpers.GetUnfriendlyNpsAtLocation(() => tankBossLoc, 50, u => u != boss).FirstOrDefault(),
                // pull the trash when boss is far away
                        ScriptHelpers.CreatePullNpcToLocation(
                            ctx => trash != null && !StyxWoW.Me.Combat,
                            ctx => boss.Location.DistanceSqr(bossFarPathEndLoc) <= 25 * 25 || trash.Location.DistanceSqr(trashTankLoc) <= 50 * 50,
                            () => trash, () => trashTankLoc, () => StyxWoW.Me.IsTank() ? trashTankLoc : partyWaitLoc, 5),
                // pull boss when he's near and trash is cleared.
                        ScriptHelpers.CreatePullNpcToLocation(
                            ctx => trash == null && StyxWoW.Me.Location.DistanceSqr(tankBossLoc) <= 50 * 50,
                            ctx => boss.Location.DistanceSqr(tankBossLoc) <= 25 * 25,
                            () => boss, () => tankBossLoc, () => StyxWoW.Me.IsTank() ? tankBossLoc : StyxWoW.Me.Location, 5)
                        )),
                // Handle boss encounter
                new Decorator(
                    ctx => boss.Combat,
                    new PrioritySelector(                       
                        
                        new Decorator(
                            ret => (StyxWoW.Me.HasAura(103534) || StyxWoW.Me.HasAura(103541) || StyxWoW.Me.HasAura(103536)) && !StyxWoW.Me.IsTank(),
                            ScriptHelpers.CreateWaitAtLocationWhile(ret => (StyxWoW.Me.HasAura(103534) || StyxWoW.Me.HasAura(103541) || StyxWoW.Me.HasAura(103536)) && !StyxWoW.Me.IsTank(), () => MorchockCrystals.Location, 10)
                            ),
                        ScriptHelpers.CreateLosLocation(ctx => MorchockPillars.Count>=1,()=>boss.Location,()=>MorchockPillars[0].Location, ()=>10), //Run to the Pillars
                        ScriptHelpers.CreateRunAwayFromBad(ctx => true, 30, 103851, 103785), //If behin Pillars, runaway from Blood
                        //103687 - Crush Armor
                        new Decorator(ret => StyxWoW.Me.IsTank() && boss.CurrentTarget.Guid != StyxWoW.Me.Guid && GetStacksOfDebuff(boss.CurrentTarget, "Crush Armor") > 3, CreateTankTaunt(boss))
                        )
                    )
                    );
        }
        private uint GetStacksOfDebuff(WoWUnit unit, string Debuff)
        {
            if (unit != null && unit.HasAura(Debuff))
                return unit.Auras[Debuff].StackCount;
            return 0;
        }
        private Composite CreateTankTaunt(WoWUnit tar)
        {
            string tauntSpell1 = null;
            string tauntSpell2 = null;
            switch (StyxWoW.Me.Class)
            {
                case WoWClass.DeathKnight:
                    tauntSpell1 = "Dark Command";
                    tauntSpell2 = "Death Grip";
                    break;
                case WoWClass.Druid:
                    tauntSpell1 = "Growl";
                    tauntSpell2 = "Challenging Roar";
                    break;
                case WoWClass.Paladin:
                    tauntSpell1 = "Hand of Reckoning";
                    tauntSpell2 = "Righteous Defense";
                    break;
                case WoWClass.Warrior:
                    tauntSpell1 = "Taunt";
                    tauntSpell2 = "Intervene";
                    break;
            }
            return new Decorator(ret => StyxWoW.Me.IsTank() && tar.CurrentTarget.Guid != StyxWoW.Me.Guid,
                new PrioritySelector(
                    new Decorator(
                        ret => SpellManager.CanCast(tauntSpell1),
                        new Action(ret => SpellManager.Cast(tauntSpell1, tar))),
                        new Decorator(
                        ret => SpellManager.CanCast(tauntSpell2),
                        new Action(ret => SpellManager.Cast(tauntSpell2, tar)))));
        }
        #endregion
    }
}

U have to replace the content of the File The Siege of Wyrmrest Temple Heroic.cs with this script
 

Attachments

Last edited:
If this ends up working, I will clap my hands till they fall off lol!
 
This is pretty awesome. I'm also honored that you are using 2 of my CCs.
 
Back
Top