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

INNA PET + EP

ModernGuy

New Member
Joined
Apr 1, 2017
Messages
2
Reaction score
3
My first routine ever and hacked together in 5 minutes so any suggestions/fixes are welcome (used uliana as template).

Code:
using Trinity.Framework.Helpers;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Controls;
using Trinity.Components.Combat.Resources;
using Trinity.Framework.Actors.ActorTypes;
using Trinity.Framework.Objects;
using Trinity.Framework.Reference;
using Trinity.UI;
using Zeta.Common;
using Zeta.Game.Internals.Actors;


namespace Trinity.Routines.Monk
{
    public sealed class MonkInnaPetEP : MonkBase, IRoutine
    {
        #region Definition

        public string DisplayName => "Monk Pet EP Routine";
        public string Description => "INNA EP PETS";
        public string Author => "Me";
        public string Version => "0.1";
        public string Url => "";

        public override int PrimaryEnergyReserve => 100;

        public Build BuildRequirements => new Build
        {
            Sets = new Dictionary<Set, SetBonus>
            {
                { Sets.Innas, SetBonus.Third },
            },
            Skills = new Dictionary<Skill, Rune>
            {
                { Skills.Monk.MysticAlly, null },
                { Skills.Monk.ExplodingPalm, null },
            },
        };

        #endregion

        public TrinityPower GetOffensivePower()
        {
            TrinityActor target;
            TrinityPower power = null;
            Vector3 position;

            if (ShouldDashingStrike(out position))
                return DashingStrike(position);
           
            if (!WeightedUnits.Any(u => u.Distance < 20f && HasEP(u)))
                return GetExplodingPalmPrimary();
           
            if (ShouldCycloneStrike())
                return CycloneStrike();

            if (ShouldMysticAlly())
                return MysticAlly();

           

            return GetPrimary();
        }

        private TrinityPower GetExplodingPalmPrimary()
        {
            TrinityPower power = null;

            var target = TargetUtil.LowestHealthTarget(6f, CurrentTarget.Position, SNOPower.Monk_ExplodingPalm);
           

            return ExplodingPalm(target);
        }

        private TrinityPower GetPrimary()
        {
            TrinityPower power = null;

            var target = TargetUtil.GetBestClusterUnit() ?? CurrentTarget;

            if (Skills.Monk.FistsOfThunder.CanCast())
                power = FistsOfThunder(target);

            else if (Skills.Monk.DeadlyReach.CanCast())
                power = DeadlyReach(target);

            else if (Skills.Monk.CripplingWave.CanCast())
                power = CripplingWave(target);

            else if (Skills.Monk.WayOfTheHundredFists.CanCast())
                power = WayOfTheHundredFists(target);

            return power;
        }

        // There is currently a bug with Attributes sometimes not showing up in Trinity's attributes list.
        // Needs to be looked into, this is a work-around for now (or use ZetaDia lookup) 
        public bool HasEP(TrinityActor actor) 
            => actor.Attributes.Powers.ContainsKey(SNOPower.Monk_ExplodingPalm) || 
            actor.Attributes.GetAttributeDirectlyFromTable<bool>(ActorAttributeType.PowerBuff0VisualEffectB, (int)SNOPower.Monk_ExplodingPalm);

        protected override bool ShouldMysticAlly()
        {
            var skill = Skills.Monk.MysticAlly;
            var nearbyUnitsWithEP = WeightedUnits.Any(u => u.Distance < 20f && HasEP(u));
            //var nearbyUnitsWithGungdoEP = CurrentTarget.HasDebuff((SNOPower)455436);

            if (!skill.CanCast())
                return false;

            if (!TargetUtil.AnyMobsInRange(45f) && !CurrentTarget.IsTreasureGoblin)
                return false;

            if (!nearbyUnitsWithEP && !Legendary.Madstone.IsEquipped)
                return false;

            //if (!nearbyUnitsWithGungdoEP)
            //    return false;

           
            return true;
        }

        public double MysticAllyCooldownMs
        {
            get
            {
                var baseCooldown = Runes.Monk.SustainedAttack.IsActive ? 14 : 30;
                var multiplier = Legendary.TheFlowOfEternity.IsEquipped ? 0.6 : 1;
                return 30 * 1000;
            }
        }

        public TrinityPower GetDefensivePower() => GetBuffPower();

        public TrinityPower GetBuffPower()
        {
            if (ShouldSweepingWind())
                return SweepingWind();

            if (ShouldMantraOfConviction())
                return MantraOfConviction();

            if (ShouldMantraOfHealing())
                return MantraOfConviction();

            if (ShouldMantraOfRetribution())
                return MantraOfRetribution();

            if (ShouldMantraOfSalvation())
                return MantraOfSalvation();

            if (ShouldEpiphany())
                return Epiphany();

            if (ShouldBreathOfHeaven())
                return BreathOfHeaven();

            if (ShouldSerenity())
                return Serenity();

            if (ShouldBlindingFlash())
                return BlindingFlash();

            if (ShouldInnerSanctuary())
                return InnerSanctuary();

            return null;
        }

        public TrinityPower GetDestructiblePower() => DefaultDestructiblePower();

        public TrinityPower GetMovementPower(Vector3 destination)
        {
            if (AllowedToUse(Settings.DashingStrike, Skills.Monk.DashingStrike) && CanDashTo(destination))
                DashingStrike(destination);

            return Walk(destination);
        }

        protected override bool ShouldDashingStrike(out Vector3 position)
        {
            position = Vector3.Zero;

            var skill = Skills.Monk.DashingStrike;
            if (skill.TimeSinceUse < 3000 && skill.Charges < MaxDashingStrikeCharges)
                return false;

            if (!AllowedToUse(Settings.DashingStrike, Skills.Monk.DashingStrike))
                return false;

            return base.ShouldDashingStrike(out position);
        }

        protected override bool ShouldEpiphany()
        {
            if (!AllowedToUse(Settings.Epiphany, Skills.Monk.Epiphany))
                return false;

            return base.ShouldEpiphany();
        }

        #region Settings

        public override int ClusterSize => Settings.ClusterSize;
        public override float EmergencyHealthPct => Settings.EmergencyHealthPct;

        IDynamicSetting IRoutine.RoutineSettings => Settings;
        public MonkInnaPetEPSettings Settings { get; } = new MonkInnaPetEPSettings();

        public sealed class MonkInnaPetEPSettings : NotifyBase, IDynamicSetting
        {
            private SkillSettings _epiphany;
            private SkillSettings _dashingStrike;
            private int _clusterSize;
            private float _emergencyHealthPct;

            [DefaultValue(6)]
            public int ClusterSize
            {
                get { return _clusterSize; }
                set { SetField(ref _clusterSize, value); }
            }

            [DefaultValue(0.4f)]
            public float EmergencyHealthPct
            {
                get { return _emergencyHealthPct; }
                set { SetField(ref _emergencyHealthPct, value); }
            }

            public SkillSettings Epiphany
            {
                get { return _epiphany; }
                set { SetField(ref _epiphany, value); }
            }

            public SkillSettings DashingStrike
            {
                get { return _dashingStrike; }
                set { SetField(ref _dashingStrike, value); }
            }

            #region Skill Defaults

            private static readonly SkillSettings EpiphanyDefaults = new SkillSettings
            {
                UseMode = UseTime.Selective,
                Reasons = UseReasons.Elites | UseReasons.HealthEmergency
            };

            private static readonly SkillSettings DashingStrikeDefaults = new SkillSettings
            {
                UseMode = UseTime.Default,
                RecastDelayMs = 3500,
                Reasons = UseReasons.Blocked
            };

            #endregion

            public override void LoadDefaults()
            {
                base.LoadDefaults();
                Epiphany = EpiphanyDefaults.Clone();
                DashingStrike = DashingStrikeDefaults.Clone();
            }

            #region IDynamicSetting

            public string GetName() => GetType().Name;
            public UserControl GetControl() => UILoader.LoadXamlByFileName<UserControl>(GetName() + ".xaml");
            public object GetDataContext() => this;
            public string GetCode() => JsonSerializer.Serialize(this);
            public void ApplyCode(string code) => JsonSerializer.Deserialize(code, this, true);
            public void Reset() => LoadDefaults();
            public void Save() { }

            #endregion
        }

        #endregion
    }
}

settings

Code:
<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    xmlns:converters="clr-namespace:Trinity.UI.UIComponents.Converters"

    mc:Ignorable="d" Background="#434343" d:DesignHeight="820" d:DesignWidth="390">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../../UI/Template.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <converters:PercentConverter x:Key="PercentConverter" />
            <converters:EnumBooleanConverter x:Key="EnumBooleanConverter" />
            <converters:EnumVisibilityConverter x:Key="HiddenWhenEnumTrueConverter" Reverse="True"/>
            <converters:EnumVisibilityConverter x:Key="VisibleWhenEnumTrueConverter" />
            <converters:FlagsToBoolConverter x:Key="FlagsToValueConverter" />
        </ResourceDictionary>
    </UserControl.Resources>
    <Border Padding="10">
        <Grid>
            <StackPanel>
                <GroupBox>
                    <GroupBox.Header>General</GroupBox.Header>
                    <StackPanel>
                        <Slider Template="{DynamicResource LabelledSliderEditable}" 
                            Tag="Cluster Size"
                            ToolTip="Number of monsters that must be grouped up before fighting starts"
                            Interval="100" IsSnapToTickEnabled="True"
                            Maximum="40" Minimum="1" SmallChange="100" TickFrequency="1" TickPlacement="BottomRight" 
                            Value="{Binding Path=DataContext.ClusterSize}" 
                            HorizontalAlignment="Stretch" Margin="0,0,0,0"
                            MinWidth="175"/>
                        <Slider  Template="{DynamicResource LabelledSliderEditable}" 
                        Tag="Health Emergency %"
                        ToolTip="How low your health must drop before the potion is used"
                                Interval="500" Maximum="99" Minimum="0" 
                                SmallChange="1" LargeChange="5"
                                TickPlacement="None" 
                                Value="{Binding Path=DataContext.EmergencyHealthPct, Converter={StaticResource PercentConverter}}" 
                                HorizontalAlignment="Stretch" Margin="0"/>
                    </StackPanel>
                </GroupBox>
                <GroupBox>
                    <GroupBox.Header>Epiphany</GroupBox.Header>
                    <StackPanel>

                        <WrapPanel>
                            <RadioButton Content="Always" IsChecked="{Binding DataContext.Epiphany.UseMode, ConverterParameter=Always, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}}"  />
                            <RadioButton Content="Selectively" IsChecked="{Binding DataContext.Epiphany.UseMode, ConverterParameter=Selective, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}}" />
                        </WrapPanel>
                        <StackPanel Margin="0,5,0,0" Visibility="{Binding DataContext.Epiphany.UseMode, ConverterParameter=Selective, Converter={StaticResource VisibleWhenEnumTrueConverter}}">
                            <CheckBox ToolTip="Use when there are elites close nearby" 
                                      IsChecked="{Binding DataContext.Epiphany.Reasons, ConverterParameter=Elites, Converter={converters:FlagsToBoolConverter}}">Elites nearby</CheckBox>
                            <CheckBox ToolTip="Use when you are surrounded by enemies" 
                                      IsChecked="{Binding DataContext.Epiphany.Reasons, ConverterParameter=Surrounded, Converter={converters:FlagsToBoolConverter}}">Surrounded</CheckBox>
                            <CheckBox ToolTip="Use when you're low on health" 
                                      IsChecked="{Binding DataContext.Epiphany.Reasons, ConverterParameter=HealthEmergency, Converter={converters:FlagsToBoolConverter}}">Health emergency</CheckBox>
                        </StackPanel>
                    </StackPanel>
                </GroupBox>
                <GroupBox>
                    <GroupBox.Header>Dashing Strike</GroupBox.Header>
                    <StackPanel>
                        <WrapPanel Margin="0,5,0,0">
                            <RadioButton ToolTip="Use vault whenever it makes sense"
                                Content="Anytime" IsChecked="{Binding DataContext.DashingStrike.UseMode, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=Default}"  />
                            <RadioButton ToolTip="Use only while fighting monsters"
                                Content="In combat" IsChecked="{Binding DataContext.DashingStrike.UseMode, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=InCombat}" />
                            <RadioButton  ToolTip="Use only while NOT fighting monsters"
                                Content="Out of combat" IsChecked="{Binding DataContext.DashingStrike.UseMode, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=OutOfCombat}" />
                        </WrapPanel>
                    </StackPanel>
                </GroupBox>
            </StackPanel>
        </Grid>
    </Border>
</UserControl>
 
Thx just few details ,can you make it to use Cyclone Strike on 5 sec loop in fight cose aside of defense boost from "Lefebvre's "shoulders it also boosts Mistic Ally dmg 200% ( Bindings of Lesser Gods).Option to adjust cluster size will be nice too .Other than being blocked in some narrow spaces by single mob and not attaking it the profile is working just fine.
 
thanks dude its working pretty good so far :) also really appreciate the contribution this was exactly the build i wanted :)) thanks
 
Last edited:
Hi guys, I'm NOT the person that made this but i'll give you my versions of the files, they have not been changed from the code on this, basically i put the code in notepad ++ and saved them in the routines file in your trinity directory (not the one in your db directory) thats db/plugins/trinity/routines/monk (whatever you have your db folder named)
Here is the download link since i cant upload the files here: hope its okay to link it
https://www.dropbox.com/s/ekyvu686vlhglqe/MonkInnapetep.cs?dl=0
https://www.dropbox.com/s/3rgu095zgljiuzh/MonkInnapetepSettings.xaml?dl=0

here is the build i'm using i tried to include the relevent stats, you can find this build on a popular site if you just google inna pet build and then look at the explosive palm variation
http://www.diablofans.com/builds/88350-inna-exploding-palm-gr-100-season-10-2-5
**updated with better version of this build mind had the wrong ring**

one thing to note is once your equipment has good stats look for secondary resists in every slot possible to take advantage of the passive Harmony which inceases those by 40%

no rune chosen on mythic ally because with innas set you dont need to pick one it uses all of them without a rune picked, pick water if you want :p

one more thing, unity is for solo use with a follower with the cannot die legendary token, you must put one on your follower as well. if you multi bot or are playing with people take off the unity and use a convention of ele, max crit and crit dmg on it of course, you will take a 50% dmg reduction hit

lemme know if the dropbox links dont work for you i'll upload em elsewhere. my first time uploading stuff ^_^
 
Last edited:
Hi guys, I'm NOT the person that made this but i'll give you my versions of the files, they have not been changed from the code on this, basically i put the code in notepad ++ and saved them in the routines file in your trinity directory (not the one in your db directory) thats db/plugins/trinity/routines/monk (whatever you have your db folder named)
Here is the download link since i cant upload the files here: hope its okay to link it
https://www.dropbox.com/s/ekyvu686vlhglqe/MonkInnapetep.cs?dl=0
https://www.dropbox.com/s/3rgu095zgljiuzh/MonkInnapetepSettings.xaml?dl=0

here is the build i'm using i tried to include the relevent stats, you can find this build on a popular site if you just google inna pet build and then look at the explosive palm variation
http://www.diablofans.com/builds/88350-inna-exploding-palm-gr-100-season-10-2-5
**updated with better version of this build mind had the wrong ring**

one thing to note is once your equipment has good stats look for secondary resists in every slot possible to take advantage of the passive Harmony which inceases those by 40%

no rune chosen on mythic ally because with innas set you dont need to pick one it uses all of them without a rune picked, pick water if you want :p

one more thing, unity is for solo use with a follower with the cannot die legendary token, you must put one on your follower as well. if you multi bot or are playing with people take off the unity and use a convention of ele, max crit and crit dmg on it of course, you will take a 50% dmg reduction hit

lemme know if the dropbox links dont work for you i'll upload em elsewhere. my first time uploading stuff ^_^

i get some trinity errors when using this profile, it also seems to not attack low health targets to make the exploding palm go off and instead switches around, which is a problem at high rift levels cause it takes forever to kill everything
 
Curious what grift level is this build while using routine is good up until? Thanks in advance.

Cheers
 
Hello,

I used this build just for farming and then swtched to LTK sunwuko.
I also edited the code a bit, here is last version. Still, i'm not using nor wotking on this anymore because it didn't seem to pay off compared to ltk
Place files with this code inside your Trinity/Routines/Monk folder (thanks pandora for helping them when i wasn't looking :) )
MyPetBuild.cs

Code:
using Trinity.Framework.Helpers;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Controls;
using Trinity.Components.Combat.Resources;
using Trinity.Framework.Actors.ActorTypes;
using Trinity.Framework.Objects;
using Trinity.Framework.Reference;
using Trinity.UI;
using Zeta.Common;
using Zeta.Game.Internals.Actors;


namespace Trinity.Routines.Monk
{
    public sealed class MyPetBuild : MonkBase, IRoutine
    {
        #region Definition

        public string DisplayName => "Monk Pet EP Routine";
        public string Description => "INNA EP PETS";
        public string Author => "Me";
        public string Version => "0.1";
        public string Url => "";

        public override int PrimaryEnergyReserve => 100;

        public Build BuildRequirements => new Build
        {
            Sets = new Dictionary<Set, SetBonus>
            {
                { Sets.Innas, SetBonus.Third },
            },
            Skills = new Dictionary<Skill, Rune>
            {
                { Skills.Monk.MysticAlly, null },
                { Skills.Monk.ExplodingPalm, null },
            },
        };

        #endregion

        public TrinityPower GetOffensivePower()
        {
            TrinityActor target;
            TrinityPower power = null;
            Vector3 position;

            if (ShouldDashingStrike(out position))
                return DashingStrike(position);

            if (Skills.Monk.ExplodingPalm.CanCast() && (WeightedUnits.Count(u => u.Distance < 6f && HasEP(u))) < (WeightedUnits.Count(u => u.Distance < 6f)/2f))
                return GetExplodingPalmPrimary();
           
            if (ShouldCycloneStrike())
                return CycloneStrike();

            if (ShouldMysticAlly())
                return MysticAlly();

           

            return GetPrimary();
        }

        private TrinityPower GetExplodingPalmPrimary()
        {
            TrinityPower power = null;

            var target = TargetUtil.LowestHealthTarget(6f, CurrentTarget.Position, SNOPower.Monk_ExplodingPalm);
           

            return ExplodingPalm(target);
        }

        private TrinityPower GetPrimary()
        {
            TrinityPower power = null;

            var target = TargetUtil.GetBestClusterUnit() ?? CurrentTarget;

            if (Skills.Monk.FistsOfThunder.CanCast())
                power = FistsOfThunder(target);

            else if (Skills.Monk.DeadlyReach.CanCast())
                power = DeadlyReach(target);

            else if (Skills.Monk.CripplingWave.CanCast())
                power = CripplingWave(target);

            else if (Skills.Monk.WayOfTheHundredFists.CanCast())
                power = WayOfTheHundredFists(target);

            return power;
        }

        // There is currently a bug with Attributes sometimes not showing up in Trinity's attributes list.
        // Needs to be looked into, this is a work-around for now (or use ZetaDia lookup)
        public bool HasEP(TrinityActor actor)
            => actor.Attributes.Powers.ContainsKey(SNOPower.Monk_ExplodingPalm) ||
            actor.Attributes.GetAttributeDirectlyFromTable<bool>(ActorAttributeType.PowerBuff0VisualEffectB, (int)SNOPower.Monk_ExplodingPalm);

        protected override bool ShouldMysticAlly()
        {
            var skill = Skills.Monk.MysticAlly;
            var nearbyUnitsWithEP = WeightedUnits.Any(u => u.Distance < 20f && HasEP(u));
            //var nearbyUnitsWithGungdoEP = CurrentTarget.HasDebuff((SNOPower)455436);

            if (!skill.CanCast())
                return false;

            if (!TargetUtil.AnyMobsInRange(45f) && !CurrentTarget.IsTreasureGoblin)
                return false;

            if (!nearbyUnitsWithEP && !Legendary.Madstone.IsEquipped)
                return false;

            //if (!nearbyUnitsWithGungdoEP)
            //    return false;

           
            return true;
        }

        public double MysticAllyCooldownMs
        {
            get
            {
                var baseCooldown = Runes.Monk.SustainedAttack.IsActive ? 14 : 30;
                var multiplier = Legendary.TheFlowOfEternity.IsEquipped ? 0.6 : 1;
                return 30 * 1000;
            }
        }

        public TrinityPower GetDefensivePower() => GetBuffPower();

        public TrinityPower GetBuffPower()
        {
            if (ShouldSweepingWind())
                return SweepingWind();

            if (ShouldMantraOfConviction())
                return MantraOfConviction();

            if (ShouldMantraOfHealing())
                return MantraOfConviction();

            if (ShouldMantraOfRetribution())
                return MantraOfRetribution();

            if (ShouldMantraOfSalvation())
                return MantraOfSalvation();

            if (ShouldEpiphany())
                return Epiphany();

            if (ShouldBreathOfHeaven())
                return BreathOfHeaven();

            if (ShouldSerenity())
                return Serenity();

            if (ShouldBlindingFlash())
                return BlindingFlash();

            if (ShouldInnerSanctuary())
                return InnerSanctuary();

            return null;
        }

        public TrinityPower GetDestructiblePower() => DefaultDestructiblePower();

        public TrinityPower GetMovementPower(Vector3 destination)
        {
            if (CanDashTo(destination))
                return DashingStrike(destination);

            return Walk(destination);
        }

        protected override bool ShouldDashingStrike(out Vector3 position)
        {
            position = Vector3.Zero;

            var skill = Skills.Monk.DashingStrike;
            if (skill.TimeSinceUse < 3000 && skill.Charges < MaxDashingStrikeCharges)
                return false;

            if (!AllowedToUse(Settings.DashingStrike, Skills.Monk.DashingStrike))
                return false;

            return base.ShouldDashingStrike(out position);
        }

        protected override bool ShouldEpiphany()
        {
            if (!AllowedToUse(Settings.Epiphany, Skills.Monk.Epiphany))
                return false;

            return base.ShouldEpiphany();
        }

        #region Settings

        public override int ClusterSize => Settings.ClusterSize;
        public override float EmergencyHealthPct => Settings.EmergencyHealthPct;

        IDynamicSetting IRoutine.RoutineSettings => Settings;
        public MyPetBuildSettings Settings { get; } = new MyPetBuildSettings();

        public sealed class MyPetBuildSettings : NotifyBase, IDynamicSetting
        {
            private SkillSettings _epiphany;
            private SkillSettings _dashingStrike;
            private int _clusterSize;
            private float _emergencyHealthPct;

            [DefaultValue(6)]
            public int ClusterSize
            {
                get { return _clusterSize; }
                set { SetField(ref _clusterSize, value); }
            }

            [DefaultValue(0.4f)]
            public float EmergencyHealthPct
            {
                get { return _emergencyHealthPct; }
                set { SetField(ref _emergencyHealthPct, value); }
            }

            public SkillSettings Epiphany
            {
                get { return _epiphany; }
                set { SetField(ref _epiphany, value); }
            }

            public SkillSettings DashingStrike
            {
                get { return _dashingStrike; }
                set { SetField(ref _dashingStrike, value); }
            }

            #region Skill Defaults

            private static readonly SkillSettings EpiphanyDefaults = new SkillSettings
            {
                UseMode = UseTime.Selective,
                Reasons = UseReasons.Elites | UseReasons.HealthEmergency
            };

            private static readonly SkillSettings DashingStrikeDefaults = new SkillSettings
            {
                UseMode = UseTime.Default,
                RecastDelayMs = 3500,
                Reasons = UseReasons.Blocked
            };

            #endregion

            public override void LoadDefaults()
            {
                base.LoadDefaults();
                Epiphany = EpiphanyDefaults.Clone();
                DashingStrike = DashingStrikeDefaults.Clone();
            }

            #region IDynamicSetting

            public string GetName() => GetType().Name;
            public UserControl GetControl() => UILoader.LoadXamlByFileName<UserControl>(GetName() + ".xaml");
            public object GetDataContext() => this;
            public string GetCode() => JsonSerializer.Serialize(this);
            public void ApplyCode(string code) => JsonSerializer.Deserialize(code, this, true);
            public void Reset() => LoadDefaults();
            public void Save() { }

            #endregion
        }

        #endregion
    }
}

MyPetBuildSettings.xaml
Code:
<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    xmlns:converters="clr-namespace:Trinity.UI.UIComponents.Converters"

    mc:Ignorable="d" Background="#434343" d:DesignHeight="820" d:DesignWidth="390">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../../UI/Template.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <converters:PercentConverter x:Key="PercentConverter" />
            <converters:EnumBooleanConverter x:Key="EnumBooleanConverter" />
            <converters:EnumVisibilityConverter x:Key="HiddenWhenEnumTrueConverter" Reverse="True"/>
            <converters:EnumVisibilityConverter x:Key="VisibleWhenEnumTrueConverter" />
            <converters:FlagsToBoolConverter x:Key="FlagsToValueConverter" />
        </ResourceDictionary>
    </UserControl.Resources>
    <Border Padding="10">
        <Grid>
            <StackPanel>
                <GroupBox>
                    <GroupBox.Header>General</GroupBox.Header>
                    <StackPanel>
                        <Slider Template="{DynamicResource LabelledSliderEditable}"
                            Tag="Cluster Size"
                            ToolTip="Number of monsters that must be grouped up before fighting starts"
                            Interval="100" IsSnapToTickEnabled="True"
                            Maximum="40" Minimum="1" SmallChange="100" TickFrequency="1" TickPlacement="BottomRight"
                            Value="{Binding Path=DataContext.ClusterSize}"
                            HorizontalAlignment="Stretch" Margin="0,0,0,0"
                            MinWidth="175"/>
                        <Slider  Template="{DynamicResource LabelledSliderEditable}"
                        Tag="Health Emergency %"
                        ToolTip="How low your health must drop before the potion is used"
                                Interval="500" Maximum="99" Minimum="0"
                                SmallChange="1" LargeChange="5"
                                TickPlacement="None"
                                Value="{Binding Path=DataContext.EmergencyHealthPct, Converter={StaticResource PercentConverter}}"
                                HorizontalAlignment="Stretch" Margin="0"/>
                    </StackPanel>
                </GroupBox>
                <GroupBox>
                    <GroupBox.Header>Epiphany</GroupBox.Header>
                    <StackPanel>

                        <WrapPanel>
                            <RadioButton Content="Always" IsChecked="{Binding DataContext.Epiphany.UseMode, ConverterParameter=Always, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}}"  />
                            <RadioButton Content="Selectively" IsChecked="{Binding DataContext.Epiphany.UseMode, ConverterParameter=Selective, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}}" />
                        </WrapPanel>
                        <StackPanel Margin="0,5,0,0" Visibility="{Binding DataContext.Epiphany.UseMode, ConverterParameter=Selective, Converter={StaticResource VisibleWhenEnumTrueConverter}}">
                            <CheckBox ToolTip="Use when there are elites close nearby"
                                      IsChecked="{Binding DataContext.Epiphany.Reasons, ConverterParameter=Elites, Converter={converters:FlagsToBoolConverter}}">Elites nearby</CheckBox>
                            <CheckBox ToolTip="Use when you are surrounded by enemies"
                                      IsChecked="{Binding DataContext.Epiphany.Reasons, ConverterParameter=Surrounded, Converter={converters:FlagsToBoolConverter}}">Surrounded</CheckBox>
                            <CheckBox ToolTip="Use when you're low on health"
                                      IsChecked="{Binding DataContext.Epiphany.Reasons, ConverterParameter=HealthEmergency, Converter={converters:FlagsToBoolConverter}}">Health emergency</CheckBox>
                        </StackPanel>
                    </StackPanel>
                </GroupBox>
                <GroupBox>
                    <GroupBox.Header>Dashing Strike</GroupBox.Header>
                    <StackPanel>
                        <WrapPanel Margin="0,5,0,0">
                            <RadioButton ToolTip="Use vault whenever it makes sense"
                                Content="Anytime" IsChecked="{Binding DataContext.DashingStrike.UseMode, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=Default}"  />
                            <RadioButton ToolTip="Use only while fighting monsters"
                                Content="In combat" IsChecked="{Binding DataContext.DashingStrike.UseMode, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=InCombat}" />
                            <RadioButton  ToolTip="Use only while NOT fighting monsters"
                                Content="Out of combat" IsChecked="{Binding DataContext.DashingStrike.UseMode, Mode=TwoWay, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=OutOfCombat}" />
                        </WrapPanel>
                    </StackPanel>
                </GroupBox>
            </StackPanel>
        </Grid>
    </Border>
</UserControl>

Hope it helps for new accounts that get inna set for free :)
 
Last edited:
ModernGuy...i'm getting an error when loading up DB...something on line 1...downloaded the file from dropbox and copied the code in notepad and renamed to the proper xml file...DB crashes and won't load anything...deleted the files and DB works...any ideas? i will post the error code when i get home...thanks!
 
How do I use this? I'm running default monk routine :( Please help me put this into the routines
 
Here are the files...Put them in your DemonBuddy-->Plugins-->Trinity-->Routines-->Monk directory :) Again, credit to ModernGuy :)
 

Attachments

Here are the files...Put them in your DemonBuddy-->Plugins-->Trinity-->Routines-->Monk directory :) Again, credit to ModernGuy :)
It worked :) Thanks! I started a greater rift and set the attack cluster to 10 and it walked by a group of elites, has that happened to you? Going to use the default monk again for now :s
 
nw95,

i left the cluster at default and it ran things fine...my gear isn't complete nor great for the build atm (my monk is focused more for support build in a 3 char team) so i think i only ran it up to grift 70-75...but it worked well for me...
 
Hey Modern and everyone, I'm absolutely loving this. works way better than the others i've tried. But I've noticed it likes to miss EP a lot of the time and let mobs die without it. Any advice there?

Also, I get this red text quite a lot:
Exception during bot tick.Buddy.Coroutines.CoroutineUnhandledException: Exception was thrown by coroutine ---> System.Exception: Only part of a ReadProcessMemory or WriteProcessMemory request was completed, at addr: 000001B8, Size: 4
at GreyMagic.ExternalProcessMemory.ReadByteBuffer(IntPtr addr, Void* buffer, Int32 count)
at GreyMagic.MemoryBase.Read[T](IntPtr addr)
at Zeta.Game.Internals.FastAttribGroupsEntry.‮‌‬‍‏‬‌‭‎‌‫‭‏‏‭‫‬‪‍‎‫‫‮[](Int32 , & )
at Zeta.Game.Internals.FastAttribGroupsEntry.‍‮‪‎‮‎‪‎‎‍‫‮‍‬‌‍‫‭‎‎‎‍‮[](Int32 , ACD )
at Zeta.Game.Internals.Actors.ACD.GetAttribute[T](Int32 attribute, Int32 parameter)
at Zeta.Game.Internals.Actors.ACD.GetAttribute[T](ActorAttributeType attributeType, Int32 parameter)
at Trinity.Framework.Actors.Attributes.AttributesWrapper.GetAttribute[T](ActorAttributeType type, Int32 modifier) in C:\Users\Nirva\Desktop\Demonb\Plugins\Trinity\Framework\Actors\Attributes\AttributesWrapper.cs:line 67
at Trinity.Routines.Monk.MonkInnaPetEP.HasEP(TrinityActor actor) in C:\Users\Nirva\Desktop\Demonb\Plugins\Trinity\Routines\Monk\MonkInnaPetEP.cs:line 101
at Trinity.Routines.Monk.MonkInnaPetEP.<GetOffensivePower>b__14_0(TrinityActor u) in C:\Users\Nirva\Desktop\Demonb\Plugins\Trinity\Routines\Monk\MonkInnaPetEP.cs:line 53
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
at Trinity.Routines.Monk.MonkInnaPetEP.GetOffensivePower() in C:\Users\Nirva\Desktop\Demonb\Plugins\Trinity\Routines\Monk\MonkInnaPetEP.cs:line 53
at Trinity.Components.Combat.DefaultTargetingProvider.GetPowerForTarget(TrinityActor target) in C:\Users\Nirva\Desktop\Demonb\Plugins\Trinity\Components\Combat\DefaultTargetingProvider.cs:line 303
at Trinity.Components.Combat.DefaultTargetingProvider.<HandleTarget>d__22.MoveNext() in C:\Users\Nirva\Desktop\Demonb\Plugins\Trinity\Components\Combat\DefaultTargetingProvider.cs:line 119
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Trinity.Components.Combat.TrinityCombat.<MainCombatTask>d__21.MoveNext() in C:\Users\Nirva\Desktop\Demonb\Plugins\Trinity\Components\Combat\TrinityCombat.cs:line 119
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Zeta.Bot.ActionRunCoroutine.0AFPPy>@(d)!1R@nh;_\.aY!r!.Mtw|7$=IV{fZ11|"jYLQ^c2@#.MoveNext()
--- End of inner exception stack trace ---
at Buddy.Coroutines.Coroutine.‫‬‮‏‏‌‬‬‫‫‮‮‮‌‌‎‎‬‮‫‎‌‭‮(Boolean )
at Buddy.Coroutines.Coroutine.‪‬‪‏‏‎‎‬‭‬‌‮‪‪‭‌‪‫‫‍‌‍‮(Boolean )
at Buddy.Coroutines.Coroutine.Resume()
at Zeta.Bot.ActionRunCoroutine.Run(Object context)
at Zeta.TreeSharp.Action.RunAction(Object context)
at Zeta.TreeSharp.Action.Gm4|\\87}Yj\.J5C7S(LQ9$Y_5(.MoveNext()
at Zeta.TreeSharp.Composite.Tick(Object context)
at Zeta.TreeSharp.PrioritySelector.?Ufuf(zTLP|YvR\[mY/_3-R^V%.MoveNext()
at Zeta.TreeSharp.Composite.Tick(Object context)
at Zeta.Common.HookExecutor.Run(Object context)
at Zeta.TreeSharp.Action.RunAction(Object context)
at Zeta.TreeSharp.Action.Gm4|\\87}Yj\.J5C7S(LQ9$Y_5(.MoveNext()
at Zeta.TreeSharp.Composite.Tick(Object context)
at Zeta.TreeSharp.PrioritySelector.?Ufuf(zTLP|YvR\[mY/_3-R^V%.MoveNext()
at Zeta.TreeSharp.Composite.Tick(Object context)
at Zeta.Bot.BotMain.‪‭‏‪‌‌‍‮‪‪‭‌‍‏‌‎‌‌‌‌‎‮()
 
Last edited:
Back
Top