public TrialOfTheChampion(ProdMboxV2 mbox)
        {
            this.mbox = mbox;

            tank = mbox.me;

            if (!mbox.masterAI)
            {
                mbox.GetCommand("ta").Invoke(mbox.me, new List <string>(new [] { "ma" }));
            }

            if (!mbox.slavesAI)
            {
                mbox.GetCommand("ta").Invoke(mbox.me, new List <string>(new[] { "sl" }));
            }

            if (!mbox.buffingAI)
            {
                mbox.GetCommand("ta").Invoke(mbox.me, new List <string>(new[] { "bu" }));
            }

            grpMgr = new GenericGroupManager(mbox);
            grpMgr.AutoTargetThreateners = false;

            eadricBhv    = new EadricThePure(this);
            paletressBhv = new ArgentConfessorPaletress(this);
            tbkBhv       = new TheBlackKnight(this);

            var paletress = mbox.me.ObjectManager.FirstOrDefault(obj =>
                                                                 obj.Type == GameObjectType.Unit && GetName(mbox.me.ControlInterface, obj) == ArgentConfessorPaletress.PaletressName);

            if (paletress != null)
            {
                Console.WriteLine("Running Paletress");
                root = paletressBhv;
            }
            else
            {
                grandChampionsBhv = new GrandChampions(this);
                Console.WriteLine("Running Champions");
                root = grandChampionsBhv;
            }
        }
            private List <BTNode> ConfessorPaletressBehaviour()
            {
                var nodes = new List <BTNode>();

                GameObject memoryMonster = null;

                var shaman = mbox.clients.FirstOrDefault(client =>
                                                         client.Player.UnitClass == UnitClass.Shaman);
                var pala = mbox.clients.FirstOrDefault(client =>
                                                       client.Player.UnitClass == UnitClass.Paladin);
                var priest = mbox.clients.FirstOrDefault(client =>
                                                         client.Player.UnitClass == UnitClass.Priest);

                var common = new LeafAction((() =>
                {
                    if (paletress == null)
                    {
                        paletress = mbox.me.ObjectManager.FirstOrDefault(obj =>
                                                                         obj.Type == GameObjectType.Unit && totch.GetName(mbox.me.ControlInterface, obj) == PaletressName);

                        if (paletress != null)
                        {
                            paletressGUID = paletress.GUID;
                        }
                    }

                    // ensure tremor totem
                    if (!mbox.me.ObjectManager.Any(obj => obj.EntryID == TremorTotem))
                    {
                        if (shaman != null && shaman.Player.HealthPct > 0)
                        {
                            shaman.EnqueuePrioritySpellCast(
                                new SpellCast
                            {
                                Coordinates = null,
                                SpellName = "Tremor Totem",
                                TargetGUID = 0
                            }
                                );
                            Thread.Sleep(1000);
                        }
                    }

                    // cleanse Paletress's debuffs
                    int lowPlayerCount = 0;
                    foreach (var player in mbox.clients.Select(cli => cli.Player).Where(pla => pla.HealthPct > 0))
                    {
                        if (player.HealthPct < 50)
                        {
                            lowPlayerCount++;
                        }

                        foreach (var aura in player.Auras)
                        {
                            if (PaletressDebuffIds.Contains(aura.auraID))
                            {
                                if (pala != null && pala.Player.HealthPct > 0)
                                {
                                    pala.EnqueuePrioritySpellCast(
                                        new SpellCast
                                    {
                                        Coordinates = null,
                                        SpellName = "Cleanse",
                                        TargetGUID = player.GUID
                                    }
                                        );
                                    break;
                                }
                            }
                        }
                    }

                    if (lowPlayerCount >= 2)
                    {
                        if (pala != null && pala.Player.HealthPct > 0)
                        {
                            if (!pala.IsOnCooldown("Divine Sacrifice"))
                            {
                                pala.EnqueuePrioritySpellCast(
                                    new SpellCast
                                {
                                    Coordinates = null,
                                    SpellName = "Divine Sacrifice",
                                    TargetGUID = 0
                                }
                                    );
                            }
                        }
                    }

                    return(BTStatus.Success);
                }));

                // Paletress disappeared - end condition
                var paletressGone =
                    new Decorator(
                        (() => { return(!mbox.me.ObjectManager.Any(obj => obj.GUID == paletressGUID)); }),
                        new LeafAction((() =>
                {
                    return(BTStatus.Success);
                })));

                var argentAdds =
                    new Decorator(
                        (() => { return(!totch.IsAttackableByTank(paletress)); }),
                        new LeafAction((() =>
                {
                    foreach (var argentAdd in ArgentAdds)
                    {
                        foreach (var unit in mbox.me.ObjectManager.Where(obj => obj.Type == GameObjectType.Unit && obj.IsInCombat()))
                        {
                            if (argentAdd == unit.EntryID)
                            {
                                mbox.GroupTargetGuids[0] = unit.GUID;
                                goto end;
                            }
                        }
                    }


                    end:
                    return(BTStatus.Failed);
                })));

                var memoryAsTarget = new Decorator((() =>
                {
                    return(paletress.Auras.Select(aura => aura.auraID).Contains(PaletressReflectiveShield));
                }), new LeafAction((() =>
                {
                    if (memoryMonster != null)
                    {
                        mbox.GroupTargetGuids[0] = memoryMonster.GUID;
                        mbox.me.ControlInterface.remoteControl.SelectUnit(memoryMonster.GUID);
                        mbox.me.CastSpellOnGuid(GenericGroupManager.GetTauntAbilityForTankClass(mbox.me.Player.UnitClass), memoryMonster.GUID);

                        foreach (var aura in memoryMonster.Auras)
                        {
                            if (PaletressRenewIds.Contains(aura.auraID))
                            {
                                if (priest != null && priest.Player.HealthPct > 0)
                                {
                                    priest.EnqueuePrioritySpellCast(
                                        new SpellCast
                                    {
                                        Coordinates = null,
                                        SpellName = "Dispel Magic",
                                        TargetGUID = memoryMonster.GUID
                                    }
                                        );
                                    break;
                                }
                            }
                        }

                        if (priest != null && priest.Player.HealthPct > 0)
                        {
                            if (!priest.IsOnCooldown("Power Infusion"))
                            {
                                priest.EnqueuePrioritySpellCast(
                                    new SpellCast
                                {
                                    Coordinates = null,
                                    SpellName = "Power Infusion",
                                    TargetGUID = priest.Player.GUID
                                }
                                    );
                            }
                        }

                        if (shaman != null && shaman.Player.HealthPct > 0)
                        {
                            if (!shaman.IsOnCooldown("Bloodlust"))
                            {
                                shaman.EnqueuePrioritySpellCast(
                                    new SpellCast
                                {
                                    Coordinates = null,
                                    SpellName = "Bloodlust",
                                    TargetGUID = 0
                                }
                                    );
                            }
                        }
                    }
                    else
                    {
                        mbox.GroupTargetGuids[0] = 0;
                        memoryMonster = mbox.me.ObjectManager.FirstOrDefault(obj =>
                                                                             obj.Type == GameObjectType.Unit && totch.GetName(mbox.me.ControlInterface, obj).Contains("Memory"));
                    }

                    return(BTStatus.Failed);
                })));


                var paletressAsTarget = new Decorator((() =>
                {
                    return(totch.IsAttackableByTank(paletress) && !paletress.Auras.Select(aura => aura.auraID).Contains(PaletressReflectiveShield));
                }), new LeafAction((() =>
                {
                    mbox.GroupTargetGuids[0] = paletress.GUID;
                    mbox.me.ControlInterface.remoteControl.SelectUnit(paletress.GUID);
                    mbox.me.CastSpellOnGuid(GenericGroupManager.GetTauntAbilityForTankClass(mbox.me.Player.UnitClass), paletress.GUID);

                    foreach (var aura in paletress.Auras)
                    {
                        if (PaletressRenewIds.Contains(aura.auraID))
                        {
                            var priest = mbox.clients.FirstOrDefault(client =>
                                                                     client.Player.UnitClass == UnitClass.Priest);
                            if (priest != null && priest.Player.HealthPct > 0)
                            {
                                priest.EnqueuePrioritySpellCast(
                                    new SpellCast
                                {
                                    Coordinates = null,
                                    SpellName = "Dispel Magic",
                                    TargetGUID = paletress.GUID
                                }
                                    );
                                break;
                            }
                        }
                    }

                    return(BTStatus.Failed);
                })));


                var select = new Selector(paletressGone, argentAdds, memoryAsTarget, paletressAsTarget);

                nodes.Add(common);
                nodes.Add(select);


                return(nodes);
            }