• Visit Honorbuddy
  • Visit Rebornbuddy
  • Visit Demonbuddy
  • Visit Exilebuddy
  • Visit Hearthbuddy
  • Visit Pokefarmer
  • Visit Buddystore

INNA PET + EP

Discussion in 'Combat Routines' started by ModernGuy, Apr 1, 2017.

  1. ModernGuy

    ModernGuy New Member

    Joined:
    Apr 1, 2017
    Messages:
    2
    Likes Received:
    3
    Trophy Points:
    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>
    
       
    
     
    pandora125 and Ferolina like this.
  2. Dedoo

    Dedoo New Member

    Joined:
    Jul 10, 2016
    Messages:
    14
    Likes Received:
    0
    Trophy Points:
    1
    How do you use that ? :eek:
     
  3. Ferolina

    Ferolina New Member

    Joined:
    Mar 22, 2017
    Messages:
    6
    Likes Received:
    0
    Trophy Points:
    1
    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.
     
  4. pandora125

    pandora125 New Member

    Joined:
    Aug 3, 2016
    Messages:
    7
    Likes Received:
    0
    Trophy Points:
    1
    thanks dude its working pretty good so far :) also really appreciate the contribution this was exactly the build i wanted :)) thanks
     
    Last edited: Apr 3, 2017
  5. kam9395

    kam9395 New Member

    Joined:
    Jan 10, 2017
    Messages:
    3
    Likes Received:
    0
    Trophy Points:
    1
    What kind of build do you need for these settings?
     
  6. lanceproate

    lanceproate Member

    Joined:
    Aug 2, 2011
    Messages:
    41
    Likes Received:
    0
    Trophy Points:
    6
    what skills and how do you import?
     
  7. pandora125

    pandora125 New Member

    Joined:
    Aug 3, 2016
    Messages:
    7
    Likes Received:
    0
    Trophy Points:
    1
    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: Apr 5, 2017
  8. tdubs96

    tdubs96 Member

    Joined:
    Aug 10, 2013
    Messages:
    87
    Likes Received:
    3
    Trophy Points:
    8
    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
     
  9. vamosomo

    vamosomo New Member

    Joined:
    Nov 30, 2015
    Messages:
    2
    Likes Received:
    1
    Trophy Points:
    1
    Curious what grift level is this build while using routine is good up until? Thanks in advance.

    Cheers
     
  10. ModernGuy

    ModernGuy New Member

    Joined:
    Apr 1, 2017
    Messages:
    2
    Likes Received:
    3
    Trophy Points:
    3
    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: May 6, 2017
    tdubs96 likes this.
  11. drizzle206

    drizzle206 Active Member

    Joined:
    Mar 25, 2017
    Messages:
    312
    Likes Received:
    74
    Trophy Points:
    28
    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!
     
  12. nw95

    nw95 New Member

    Joined:
    May 20, 2017
    Messages:
    14
    Likes Received:
    2
    Trophy Points:
    3
    How do I use this? I'm running default monk routine :( Please help me put this into the routines
     
  13. drizzle206

    drizzle206 Active Member

    Joined:
    Mar 25, 2017
    Messages:
    312
    Likes Received:
    74
    Trophy Points:
    28
    Here are the files...Put them in your DemonBuddy-->Plugins-->Trinity-->Routines-->Monk directory :) Again, credit to ModernGuy :)
     

    Attached Files:

    nw95 likes this.
  14. nw95

    nw95 New Member

    Joined:
    May 20, 2017
    Messages:
    14
    Likes Received:
    2
    Trophy Points:
    3
    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
     
  15. drizzle206

    drizzle206 Active Member

    Joined:
    Mar 25, 2017
    Messages:
    312
    Likes Received:
    74
    Trophy Points:
    28
    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...
     
  16. Nirvana9832

    Nirvana9832 Member

    Joined:
    Apr 12, 2012
    Messages:
    188
    Likes Received:
    1
    Trophy Points:
    18
    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: Jul 26, 2017

Share This Page