Nookz 1 Posted October 2 Share Posted October 2 I copied a fightclass for holy priest healing and tried to make it work for mistweaver monk by replacing the priest spells with the monk onesย ๐ , i know that's not how it works but bare with me i am a total noob when it comes to coding. i get this when i try to start the fightclass Any ideas ? Thank you. Link to comment https://wrobot.eu/forums/topic/15542-healing-class-legion/ Share on other sites More sharing options...
Droidz 2738 Posted October 2 Share Posted October 2 Hello, when fightclass has more than one code files, you need to compile it in dll. (seems to be missing part of the code). Link to comment https://wrobot.eu/forums/topic/15542-healing-class-legion/#findComment-69661 Share on other sites More sharing options...
Nookz 1 Posted October 2 Author Share Posted October 2 Here is the code, much appreciate it if you can assist me with itย ๐ ย /* Changelog: 1.0.0ย ย ย - initial release 1.0.1ย ย ย - fixed not healing "recruit a friend" connected payers ย ย ย ย - fixed endless resurrection tries 1.0.2 ย - fixed FollowTank trying to follow target which is not in line of sight ย ย ย ย - improved FollowTank function ย ย ย ย - added Spell Circle of Healing ย ย ย ย - added Mass Resurrection if option "Resurrection on" is set to "all" ย ย ย ย - attack spells will now also be casted if your own target is the only valid one ย ย ย ย - purify will now check for debuffed partymembers instead of only low health partymembers ย ย ย ย - modified usage of Holy Word: Chastise ย ย ย ย - minor code fixes 1.0.3 ย - changed purify behaviour: wont move to target anymore ย ย ย ย - added option "Max healrange" - partymembers out of range will be ignored ย ย ย ย - changed Renew and Flash Heal to make use of "Max healrange" 1.0.4 ย - the debuff recognition is now much more strict ย ย ย ย - purify should work much more efficient now */ using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using robotManager; using robotManager.FiniteStateMachine; using robotManager.Helpful; using Timer = robotManager.Helpful.Timer; using wManager.Wow.Class; using wManager.Wow.Enums; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; public class Main : ICustomClass { ย ย private MonkMistweaver _monk; ย ย public float Range { get { return 39.0f; } } ย ย private bool IsRunning; ย ย public void Initialize() ย ย { ย ย ย ย MonkMistWeaverSettings.Load(); ย ย ย ย if (!IsRunning) ย ย ย ย { ย ย ย ย ย ย _monk = new MonkMistweaver(); ย ย ย ย ย ย _monk.Pulse(); ย ย ย ย ย ย IsRunning = true; ย ย ย ย } ย ย } ย ย public void Dispose() ย ย { ย ย ย ย if (IsRunning) ย ย ย ย { ย ย ย ย ย ย _monk.Stop(); ย ย ย ย ย ย IsRunning = false; ย ย ย ย } ย ย } ย ย public void ShowConfiguration() ย ย { ย ย ย ย MonkMistWeaverSettings.Load(); ย ย ย ย MonkMistWeaverSettings.CurrentSetting.ToForm(); ย ย ย ย MonkMistWeaverSettings.CurrentSetting.Save(); ย ย } ย ย class MonkMistweaver ย ย { ย ย ย ย public static float HealRange = 40; ย ย ย ย public int maxhealrange; ย ย ย ย // Property: ย ย ย ย private bool _isLaunched; ย ย ย ย public bool IsLaunched ย ย ย ย { ย ย ย ย ย ย get { return _isLaunched; } ย ย ย ย ย ย set { _isLaunched = value; } ย ย ย ย } ย ย ย ย // Spells: ย ย ย ย private Spell _vivify; ย ย ย ย private Spell _envelopingmist; ย ย ย ย private Spell _zenpulse; ย ย ย ย private Spell _detox; ย ย ย ย private Spell _renewingmist; ย ย ย ย private Spell _Revival; ย ย ย ย private Spell _Lifecocoon; ย ย ย ย public MonkMistweaver() ย ย ย ย { ย ย ย ย ย ย _envelopingmist = new Spell("Enveloping Mist"); ย ย ย ย ย ย _vivify = new Spell("Vivify"); ย ย ย ย ย ย _zenpulse = new Spell("Zen Pulse"); ย ย ย ย ย ย _detox = new Spell("Detox"); ย ย ย ย ย ย _renewingmist = new Spell("Renewing Mist"); ย ย ย ย ย ย _Revival = new Spell("Revival"); ย ย ย ย ย ย _Lifecocoon = new Spell("Life Cocoon"); ย ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย public void Pulse() ย ย ย ย { ย ย ย ย ย ย _isLaunched = true; ย ย ย ย ย ย var thread = new Thread(RoutineThread) { Name = "Monk MistWeaver Healing Class" }; ย ย ย ย ย ย thread.Start(); ย ย ย ย } ย ย ย ย public void Stop() ย ย ย ย { ย ย ย ย ย ย _isLaunched = false; ย ย ย ย ย ย Logging.WriteFight("Stop 'MistWeaver Monk'"); ย ย ย ย } ย ย ย ย #region Routine ย ย ย ย void RoutineThread() ย ย ย ย { ย ย ย ย ย ย Logging.WriteFight("'MistWeaver Monk' Started"); ย ย ย ย ย ย ย ย ย ย ย ย ย if (MonkMistWeaverSettings.CurrentSetting.maxhealrange != null | MonkMistWeaverSettings.CurrentSetting.maxhealrange > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย maxhealrange = MonkMistWeaverSettings.CurrentSetting.maxhealrange; ย ย ย ย ย ย } ย ย ย ย ย ย else ย ย ย ย ย ย { ย ย ย ย ย ย ย ย maxhealrange = 80; ย ย ย ย ย ย } ย ย ย ย ย ย while (_isLaunched) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย Routine(); ย ย ย ย ย ย ย ย Thread.Sleep(25); // time between Routine steps in ms - lower time results in higher cpu usage ย ย ย ย ย ย } ย ย ย ย ย ย Logging.WriteFight("'MistWeaver Monk' Stopped"); ย ย ย ย } ย ย ย ย void Routine() ย ย ย ย { ย ย ย ย ย ย if (!Conditions.InGameAndConnectedAndAlive || ObjectManager.Me.IsMounted || ObjectManager.Me.IsStunned || ObjectManager.Me.Silenced) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย return; ย ย ย ย ย ย } ย ย ย ย ย ย if (!ObjectManager.Me.InCombat && !ObjectManager.Me.IsMounted ) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ZenPulse(); ย ย ย ย ย ย ย ย Vivify(); ย ย ย ย ย ย ย ย Detox(); ย ย ย ย ย ย ย ย FollowTank(); ย ย ย ย ย ย ย ย return; ย ย ย ย ย ย } ย ย ย ย ย ย // if (!Conditions.InGameAndConnectedAndAlive || ObjectManager.Me.IsMounted || !ObjectManager.Me.InCombat) // || !ObjectManager.Me.InCombat return; ย ย ย ย ย ย if (LifeCocoon()) return; ย ย ย ย ย ย if (Revival()) return; ย ย ย ย ย ย if (EnvelopingMist()) return; ย ย ย ย ย ย if (ZenPulse()) return; ย ย ย ย ย ย if (Renewingmist()) return; ย ย ย ย ย ย if (Vivify()) return; ย ย ย ย ย ย if (Detox()) return; ย ย ย ย ย ย if (FollowTank()) return; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย #region Follow Tank ย ย ย ย bool FollowTank() ย ย ย ย { ย ย ย ย ย ย ย ย ย if (MonkMistWeaverSettings.CurrentSetting.FollowTank == false) return false; ย ย ย ย ย ย if (MonkMistWeaverSettings.CurrentSetting.FollowTank == null) return false; ย ย ย ย ย ย var FollowTanks = getTanks().Where(o => o.IsValid && !o.IsMounted).OrderBy(o => o.GetDistance); ย ย ย ย ย ย ย int FollowTankDistance = MonkMistWeaverSettings.CurrentSetting.FollowTankDistance; ย ย ย ย ย ย if (FollowTanks.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย var u = FollowTanks.First(); ย ย ย ย ย ย ย ย WoWPlayer tank = new WoWPlayer(u.GetBaseAddress); ย ย ย ย ย ย ย ย if (tank.GetDistance > FollowTankDistance) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย while ((float)(System.Math.Round((tank.GetDistance),0)) > FollowTankDistance) ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.MoveTo(tank.Position); ย ย ย ย ย ย ย ย ย ย ย ย /* ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Logging.WriteDebug("Following Tank " + tank.Name); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Logging.WriteDebug("Current Tank distance " + tank.GetDistance); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Logging.WriteDebug("Wanted Tank distance " + FollowTankDistance); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย */ ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย if ((float)(System.Math.Round((tank.GetDistance),0)) < FollowTankDistance) ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.StopMove(); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.StopMove(); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย return false; ย ย ย ย ย ย } ย ย ย ย ย ย var FollowParty = getPartymembers().Where(o => o.IsValid && !o.IsMounted && (o.Name != ObjectManager.Me.Name)).OrderBy(o => o.GetDistance); ย ย ย ย ย ย if (FollowParty.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย var k = FollowParty.First(); ย ย ย ย ย ย ย ย WoWPlayer party = new WoWPlayer(k.GetBaseAddress); ย ย ย ย ย ย ย ย //Logging.WriteDebug("Is partymember in line of sight? " + TraceLine.TraceLineGo(party.Position)); ย ย ย ย ย ย ย ย if (party.GetDistance > FollowTankDistance) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย MovementManager.MoveTo(party); ย ย ย ย ย ย ย ย ย ย //Logging.WriteDebug("Following Partymember " + party.Name); ย ย ย ย ย ย ย ย ย ย return false; ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย ย ย #region RenewingMist ย ย ย ย bool RenewingMist() ย ย ย ย { ย ย ย ย ย ย if (!_renewingmist.KnownSpell) return false; ย ย ย ย ย ย if (!_renewingmist.IsSpellUsable) return false; ย ย ย ย ย ย var buffTanks = getTanks().Where(o => o.IsValid && !(o.HaveBuff("Renewing Mist"))).OrderBy(o => o.GetDistance); ย ย ย ย ย ย var buffHealers = getHealers().Where(o => o.IsValid && !(o.HaveBuff("Renewing Mist"))).OrderBy(o => o.GetDistance); ย ย ย ย ย ย if (buffTanks.Count() > 0 && buffHealers.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย var u = buffTanks.First(); ย ย ย ย ย ย ย ย WoWPlayer tank = new WoWPlayer(u.GetBaseAddress); ย ย ย ย ย ย ย ย if (!TraceLine.TraceLineGo(tank.Position) && (tank.Name != ObjectManager.Me.Name)) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย //Logging.WriteDebug("Is " + tank.Name + " a healer? " + IsHealer(tank.Name) + " - " + GetHealerName() + " is the healer."); ย ย ย ย ย ย ย ย ย ย Interact.InteractGameObject(tank.GetBaseAddress, false); ย ย ย ย ย ย ย ย ย ย _renewingmist.Launch(); ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย #region Life Cocoon ย ย ย ย bool LifeCocoon() ย ย ย ย { ย ย ย ย ย ย if (!_LifeCocoon.KnownSpell) return false; ย ย ย ย ย ย if (!_LifeCocoon.IsSpellUsable) return false; ย ย ย ย ย ย if (MonkMistWeaverSettings.CurrentSetting.PercentLifeCocoonHealth == null) return false; ย ย ย ย ย ย int HandsHealth = MonkMistWeaverSettings.CurrentSetting.PercentLifeCocoonHealth; ย ย ย ย ย ย if (HandsHealth == 0) return false; ย ย ย ย ย ย var members = getPartymembers().Where(o => o.IsValid ย ย ย ย ย ย ย ย && o.IsAlive ย ย ย ย ย ย ย ย && o.HealthPercent <= HandsHealth ย ย ย ย ย ย ย ย && !TraceLine.TraceLineGo(o.Position)).OrderBy(o => o.HealthPercent); ย ย ย ย ย ย if (members.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย var u = members.First(); ย ย ย ย ย ย ย ย WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); ย ย ย ย ย ย ย ย if (healTarget.IsAlive || healTarget.HealthPercent > 0) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย while (TraceLine.TraceLineGo(healTarget.Position)) ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.MoveTo(healTarget); ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย MovementManager.StopMove(); ย ย ย ย ย ย ย ย ย ย Interact.InteractGameObject(healTarget.GetBaseAddress, false); ย ย ย ย ย ย ย ย ย ย _LifeCocoon.Launch(); ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย #region Enveloping Mist ย ย ย ย bool EnvelopingMist() ย ย ย ย { ย ย ย ย ย ย if (!_EnvelopingMist.KnownSpell) return false; ย ย ย ย ย ย if (!_EnvelopingMist.IsSpellUsable) return false; ย ย ย ย ย ย if (MonkMistWeaverSettings.CurrentSetting.PercentEnvelopingMistHealth == null) return false; ย ย ย ย ย ย int HandsHealth = MonkMistWeaverSettings.CurrentSetting.PercentEnvelopingMistHealth; ย ย ย ย ย ย if (HandsHealth == 0) return false; ย ย ย ย ย ย var members = getPartymembers().Where(o => o.IsValid ย ย ย ย ย ย ย ย && o.IsAlive ย ย ย ย ย ย ย ย && o.HealthPercent <= HandsHealth ย ย ย ย ย ย ย ย && !TraceLine.TraceLineGo(o.Position)).OrderBy(o => o.HealthPercent); ย ย ย ย ย ย if (members.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย var u = members.First(); ย ย ย ย ย ย ย ย WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); ย ย ย ย ย ย ย ย if (healTarget.IsAlive || healTarget.HealthPercent > 0) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย while (TraceLine.TraceLineGo(healTarget.Position)) ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.MoveTo(healTarget); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.StopMove(); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Interact.InteractGameObject(healTarget.GetBaseAddress, false); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย _EnvelopingMist.Launch(); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย #region Vivify ย ย ย ย bool Vivify() ย ย ย ย { ย ย ย ย ย ย if (!_vivify.KnownSpell) return false; ย ย ย ย ย ย if (!_vivify.IsSpellUsable) return false; ย ย ย ย ย ย if (MonkMistWeaverSettings.CurrentSetting.PercentVivifyHealth == null) return false; ย ย ย ย ย ย int VivifyHealth = MonkMistWeaverSettings.CurrentSetting.PercentVivifyHealth; ย ย ย ย ย ย if (VivifyHealth == 0) return false; ย ย ย ย ย ย var members = getPartymembers().Where(o => o.IsValid ย ย ย ย ย ย ย ย && (o.IsAlive || o.HealthPercent > 0) ย ย ย ย ย ย ย ย && o.HealthPercent <= VivifyHealth).OrderBy(o => o.HealthPercent); ย ย ย ย ย ย if (members.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย var u = members.First(); ย ย ย ย ย ย ย ย WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); ย ย ย ย ย ย ย ย if (healTarget.IsAlive || healTarget.HealthPercent > 0) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย while (TraceLine.TraceLineGo(healTarget.Position)) ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.MoveTo(healTarget); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.StopMove(); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Interact.InteractGameObject(healTarget.GetBaseAddress, false); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย _Vivify.Launch(); ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย #region Revival ย ย ย ย /* ย ย ย public int healthTr ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย get ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย return MonkMistWeaverSettings.CurrentSetting.PercentRevivalHealth != null ย ย ย ย ย ย ย ย ย ย ย ย ย ย ? MonkMistWeaverSettings.CurrentSetting.PercentRevivalHealth : 0; ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย public int maxPlayersTr ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย get ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย return MonkMistWeaverSettings.CurrentSetting.PlayersCountRevival != null ? MonkMistWeaverSettings.CurrentSetting.PlayersCountRevival : 0; ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย }*/ ย ย ย ย bool Revival() ย ย ย ย { ย ย ย ย ย ย if (!_Revival.KnownSpell) return false; ย ย ย ย ย ย if (!_Revival.IsSpellUsable) return false; ย ย ย ย ย ย int healthTr = MonkMistWeaverSettings.CurrentSetting.PercentRevivalHealth; ย ย ย ย ย ย int maxPlayersTr = MonkMistWeaverSettings.CurrentSetting.PlayersCountRevival; ย ย ย ย ย ย if (healthTr == 0) return false; ย ย ย ย ย ย if (maxPlayersTr == 0) return false; ย ย ย ย ย ย var members = getPartymembers().Where(o => o.IsValid ย ย ย ย ย ย ย ย && o.IsAlive ย ย ย ย ย ย ย ย && o.HealthPercent <= healthTr ย ย ย ย ย ย ย ย && o.GetDistance <= 40); ย ย ย ย ย ย if (members.Count() >= maxPlayersTr) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย _Revival.Launch(); ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย ย ย ย ย ย #region Zen Pulse ย ย ย ย public int healthPOH ย ย ย ย { ย ย ย ย ย ย get ย ย ย ย ย ย { ย ย ย ย ย ย ย ย return MonkMistWeaverSettings.CurrentSetting.PercentZenPulseHealth != null ? MonkMistWeaverSettings.CurrentSetting.PercentZenPulseHealth : 0; ย ย ย ย ย ย } ย ย ย ย } ย ย ย ย public int maxplayersPOH ย ย ย ย { ย ย ย ย ย ย get ย ย ย ย ย ย { ย ย ย ย ย ย ย ย return MonkMistWeaverSettings.CurrentSetting.PlayersCountZenPulse != null ? MonkMistWeaverSettings.CurrentSetting.PlayersCountZenPulse : 0; ย ย ย ย ย ย } ย ย ย ย } ย ย ย ย bool ZenPulse() ย ย ย ย { ย ย ย ย ย ย if (!_zenpulse.KnownSpell) return false; ย ย ย ย ย ย if (!_zenpulse.IsSpellUsable) return false; ย ย ย ย ย ย if (healthPOH == 0) return false; ย ย ย ย ย ย if (maxplayersPOH == 0) return false; ย ย ย ย ย ย //Logging.WriteDebug("Wild Growth health : " + healthPOH); ย ย ย ย ย ย //Logging.WriteDebug("Wild Growth players: " + maxplayersPOH); ย ย ย ย ย ย var members = getPartymembers().Where(o => o.IsValid ย ย ย ย ย ย ย ย && o.IsAlive ย ย ย ย ย ย ย ย && o.HealthPercent <= healthPOH ย ย ย ย ย ย ย ย && !TraceLine.TraceLineGo(o.Position)).OrderBy(o => o.HealthPercent); ย ย ย ย ย ย if (members.Count() >= maxplayersPOH) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย var u = members.First(); ย ย ย ย ย ย ย ย WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); ย ย ย ย ย ย ย ย if (!TraceLine.TraceLineGo(healTarget.Position) && healTarget.IsAlive) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย Interact.InteractGameObject(healTarget.GetBaseAddress, false); ย ย ย ย ย ย ย ย ย ย ย ย _zenpulse.Launch(); ย ย ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย ย ย ย #region Detox ย ย ย ย bool Detox() ย ย ย ย { ย ย ย ย ย ย if (!_detox.KnownSpell) return false; ย ย ย ย ย ย if (!_detox.IsSpellUsable) return false; ย ย ย ย ย ย var members = GetDebuffedPartymembers().OrderBy(o => o.HealthPercent); ย ย ย ย ย ย if (members.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย var u = members.First(); ย ย ย ย ย ย ย ย WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); ย ย ย ย ย ย ย ย if (!TraceLine.TraceLineGo(healTarget.Position) && healTarget.IsAlive) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย Interact.InteractGameObject(healTarget.GetBaseAddress, false); ย ย ย ย ย ย ย ย ย ย if (Lua.LuaDoString<bool>("for j=1,40 do local m=5; local d={UnitDebuff(\"target\",j)}; if (d[5]==\"Magic\" or d[5]==\"Disease\" or d[5]==\"Poison\") and d[7]>m then j=41 return 1 end end;")) ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย _detox.Launch(); ย ย ย ย ย ย ย ย ย ย ย ย Logging.WriteDebug("Detox " + healTarget.Name); ย ย ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย return false; ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย #region get in Healingrange ย ย ย ย bool GetInHealingrange(WoWPlayer healTarget) ย ย ย ย { ย ย ย ย ย ย ย ย ย if (healTarget.GetDistance > HealRange) ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย Logging.WriteDebug(healTarget.Name + " is out of range, lets move to him. "); ย ย ย ย ย ย ย ย ย ย ย ย while (healTarget.GetDistance > HealRange) ย ย ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.MoveTo(healTarget); ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย ย ย MovementManager.StopMove(); ย ย ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย ย #region get party ย ย ย ย List<WoWPlayer> getPartymembers() ย ย ย ย { ย ย ย ย ย ย List<WoWPlayer> ret = new List<WoWPlayer>(); ย ย ย ย ย ย var u = Party.GetPartyHomeAndInstance().Where(p => p.GetDistance < maxhealrange && p.IsValid && !TraceLine.TraceLineGo(p.Position)); ย ย ย ย ย ย if (u.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย foreach (var unit in u) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); ย ย ย ย ย ย ย ย ย ย ret.Add(p); ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย WoWPlayer v = new WoWPlayer(ObjectManager.Me.GetBaseAddress); ย ย ย ย ย ย ret.Add(v); ย ย ย ย ย ย return ret; ย ย ย ย } ย ย ย ย ย ย ย ย ย ย ย ย List<WoWPlayer> getAllPartymembers() ย ย ย ย { ย ย ย ย ย ย List<WoWPlayer> ret = new List<WoWPlayer>(); ย ย ย ย ย ย var u = Party.GetPartyHomeAndInstance().Where(p => p.GetDistance < 80 && p.IsValid); ย ย ย ย ย ย if (u.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย foreach (var unit in u) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); ย ย ย ย ย ย ย ย ย ย ret.Add(p); ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย WoWPlayer v = new WoWPlayer(ObjectManager.Me.GetBaseAddress); ย ย ย ย ย ย ret.Add(v); ย ย ย ย ย ย return ret; ย ย ย ย } ย ย ย ย List<WoWUnit> GetPartyTargets() ย ย ย ย { ย ย ย ย ย ย List<WoWPlayer> party = Party.GetPartyHomeAndInstance(); ย ย ย ย ย ย List<WoWPlayer> partyMembers = new List<WoWPlayer>(); ย ย ย ย ย ย var ret = new List<WoWUnit>(); ย ย ย ย ย ย partyMembers.AddRange(party.Where(p => p.GetDistance < 40 && p.IsValid && p.HealthPercent > 0)); ย ย ย ย ย ย WoWPlayer Me = new WoWPlayer(ObjectManager.Me.GetBaseAddress); ย ย ย ย ย ย partyMembers.Add(Me); ย ย ย ย ย ย foreach (var m in partyMembers) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย var targetUnit = new WoWUnit(ObjectManager.GetObjectByGuid(m.Target).GetBaseAddress); ย ย ย ย ย ย ย ย if (m.IsValid && (m.HealthPercent > 0) && (m.InCombat || targetUnit.InCombat) && m.Target.IsNotZero()) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย if (ret.All(u => u.Guid != m.Target)) // prevent double list entrys ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย if (targetUnit.IsValid && targetUnit.IsAlive) ย ย ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ret.Add(targetUnit); ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย return ret; ย ย ย ย } ย ย ย ย List<WoWPlayer> GetDebuffedPartymembers() ย ย ย ย { ย ย ย ย ย ย List<WoWPlayer> ret = new List<WoWPlayer>(); ย ย ย ย ย ย List<WoWPlayer> u = new List<WoWPlayer>(); ย ย ย ย ย ย List<WoWPlayer> party = Party.GetPartyHomeAndInstance(); ย ย ย ย ย ย WoWPlayer Me = new WoWPlayer(ObjectManager.Me.GetBaseAddress); ย ย ย ย ย ย u.AddRange(party.Where(p => p.GetDistance < 40 && p.IsValid && p.HealthPercent > 0 && !TraceLine.TraceLineGo(p.Position))); ย ย ย ย ย ย u.Add(Me); ย ย ย ย ย ย if (u.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย //Logging.WriteDebug("Checking" + u.Count + " players for debuffs."); ย ย ย ย ย ย ย ย foreach (var unit in u) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); ย ย ย ย ย ย ย ย ย ย List<Aura> debuffs = new List<Aura>(); ย ย ย ย ย ย ย ย ย ย debuffs = p.GetAllBuff(); ย ย ย ย ย ย ย ย ย ย //Logging.WriteDebug("Found " + debuffs.Count + " buffs on " + unit.Name); ย ย ย ย ย ย ย ย ย ย foreach (var m in debuffs) ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย //Logging.WriteDebug("Buff: " + m.GetSpell + " Flags: " + m.Flag); ย ย ย ย ย ย ย ย ย ย ย ย if (!m.Flag.HasFlag(AuraFlags.Passive) && m.Flag.HasFlag(AuraFlags.Harmful) && m.Flag.HasFlag(AuraFlags.Active) && m.Flag.HasFlag(AuraFlags.Negative) && m.Flag.HasFlag(AuraFlags.Duration)) ย ย ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ret.Add(p); ย ย ย ย ย ย ย ย ย ย ย ย ย ย return ret; ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย return ret; ย ย ย ย } ย ย ย ย ย ย ย ย ย ย #endregion ย ย ย ย #region get tanks ย ย ย ย List<WoWPlayer> getTanks() ย ย ย ย { ย ย ย ย ย ย List<WoWPlayer> ret = new List<WoWPlayer>(); ย ย ย ย ย ย var u = Party.GetPartyHomeAndInstance().Where(p => p.GetDistance < 80 && p.IsValid && !TraceLine.TraceLineGo(p.Position)); ย ย ย ย ย ย if (u.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย foreach (var unit in u) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย //Logging.WriteDebug("Unit name: " + unit.Name.ToString().Trim()); ย ย ย ย ย ย ย ย ย ย if (IsTank(unit.Name.ToString())) ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); ย ย ย ย ย ย ย ย ย ย ย ย ret.Add(p); ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } /* ย ย ย ย ย if (ret.Count() == 0) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย Logging.WriteDebug("Could not find a tank!"); ย ย ย ย ย ย ย ย ย ย WoWPlayer v = new WoWPlayer(ObjectManager.Me.GetBaseAddress); ย ย ย ย ย ย ย ย ย ย ret.Add(v); ย ย ย ย ย ย ย ย } */ ย ย ย ย ย ย return ret; ย ย ย ย } ย ย ย ย string GetTankPlayerName() ย ย ย ย { ย ย ย ย ย ย var lua = new[] ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย "partyTank = \"\";", ย ย ย ย ย ย ย ย ย ย ย "for groupindex = 1,MAX_PARTY_MEMBERS do", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย if (UnitInParty(\"party\" .. groupindex)) then", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย local role = UnitGroupRolesAssigned(\"party\" .. groupindex);", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย if role == \"TANK\" then", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย ย ย ย local name, realm = UnitName(\"party\" .. groupindex);", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย ย ย ย partyTank = name;", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย ย ย ย return;", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย end", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย end", ย ย ย ย ย ย ย ย ย ย ย "end", ย ย ย ย ย ย ย ย ย }; ย ย ย ย ย ย return Lua.LuaDoString(lua, "partyTank"); ย ย ย ย } ย ย ย ย public bool IsTank(string unit) ย ย ย ย { ย ย ย ย ย ย var tankNaam = GetTankPlayerName(); ย ย ย ย ย ย WoWPlayer v = new WoWPlayer(ObjectManager.Me.GetBaseAddress); ย ย ย ย ย ย if (tankNaam.Contains(unit)) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย ย ย #region getHealers ย ย ย ย List<WoWPlayer> getHealers() ย ย ย ย { ย ย ย ย ย ย List<WoWPlayer> ret = new List<WoWPlayer>(); ย ย ย ย ย ย var u = Party.GetPartyHomeAndInstance().Where(p => p.GetDistance < 80 && p.IsValid && !TraceLine.TraceLineGo(p.Position)); ย ย ย ย ย ย if (u.Count() > 0) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย foreach (var unit in u) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย //Logging.WriteDebug("Healer name: " + unit.Name.ToString().Trim()); ย ย ย ย ย ย ย ย ย ย if (IsHealer(unit.Name.ToString())) ย ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย ย WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); ย ย ย ย ย ย ย ย ย ย ย ย ret.Add(p); ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย } ย ย ย ย ย ย } ย ย ย ย ย ย return ret; ย ย ย ย } ย ย ย ย string GetHealerName() ย ย ย ย { ย ย ย ย ย ย var lua = new[] ย ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย ย "partyHealer = \"\";", ย ย ย ย ย ย ย ย ย ย ย "for groupindex = 1,MAX_PARTY_MEMBERS do", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย if (UnitInParty(\"party\" .. groupindex)) then", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย local role = UnitGroupRolesAssigned(\"party\" .. groupindex);", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย if role == \"HEALER\" then", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย ย ย ย local name, realm = UnitName(\"party\" .. groupindex);", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย ย ย ย partyHeaer = name;", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย ย ย ย return;", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย ย ย ย end", ย ย ย ย ย ย ย ย ย ย ย "ย ย ย end", ย ย ย ย ย ย ย ย ย ย ย "end", ย ย ย ย ย ย ย ย ย }; ย ย ย ย ย ย return Lua.LuaDoString(lua, "partyHealer"); ย ย ย ย } ย ย ย ย public bool IsHealer(string unit) ย ย ย ย { ย ย ย ย ย ย var healerNaam = GetHealerName(); ย ย ย ย ย ย if (healerNaam.Contains(unit)) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย ย ย #endregion ย ย } ย ย ย ย ย #region settings ย ย [Serializable] ย ย public class MonkMistWeaverSettings : Settings ย ย { ย ย ย ย [Setting, DefaultValue(0)] ย ย ย ย [Category("Healing Spells")] ย ย ย ย [DisplayName("Life Cocoon HP%")] ย ย ย ย [Description("Cast Life Cocoon when HP% <= Value")] ย ย ย ย public int PercentLifeCocoonHealth { get; set; } ย ย ย ย [Setting, DefaultValue(0)] ย ย ย ย [Category("Group Healing Spells")] ย ย ย ย [DisplayName("Zen Pulse Players")] ย ย ย ย [Description("Cast Zen Pulse when player count with low HP >= Value. 0 = Disable")] ย ย ย ย public int PlayersCountZenPulse { get; set; } ย ย ย ย [Setting, DefaultValue(0)] ย ย ย ย [Category("Group Healing Spells")] ย ย ย ย [DisplayName("Zen Pulse HP%")] ย ย ย ย [Description("Cast Zen Pulse when players HP% <= Value")] ย ย ย ย public int PercentZenPulseHealthHealth { get; set; } ย ย ย ย [Setting, DefaultValue(0)] ย ย ย ย [Category("Group Healing Spells")] ย ย ย ย [DisplayName("Revival HP%")] ย ย ย ย [Description("Cast Revival when players HP% <= Value")] ย ย ย ย public int PercentRevivalHealth { get; set; } ย ย ย ย [Setting, DefaultValue(0)] ย ย ย ย [Category("Group Healing Spells")] ย ย ย ย [DisplayName("Revival Players")] ย ย ย ย [Description("Cast Revival when playercount with low HP >= Value. 0 = Disable")] ย ย ย ย public int Players { get; set; } ย ย ย ย [Setting, DefaultValue(0)] ย ย ย ย [Category("Healing Spells")] ย ย ย ย [DisplayName("Vivify HP%")] ย ย ย ย [Description("Cast Vivify when HP% <= Value")] ย ย ย ย public int PercentVivifyHealth { get; set; } ย ย ย ย [Setting, DefaultValue(0)] ย ย ย ย [Category("Healing Spells")] ย ย ย ย [DisplayName("Enveloping Mist HP%")] ย ย ย ย [Description("Cast Enveloping Mist when HP% <= Value")] ย ย ย ย public int PercentEnvelopingMistHealth { get; set; } ย ย ย ย [Setting, DefaultValue(80)] ย ย ย ย [Category("Behaviour")] ย ย ย ย [DisplayName("Max Healrange")] ย ย ย ย [Description("Maximal distance between you and a valid healtarget")] ย ย ย ย public int maxhealrange { get; set; } ย ย ย ย [Setting, DefaultValue(false)] ย ย ย ย [Category("Behaviour")] ย ย ย ย [DisplayName("Follow Tank")] ย ย ย ย [Description("Follow the tank while in fight")] ย ย ย ย public bool FollowTank { get; set; } ย ย ย ย [Setting, DefaultValue(0)] ย ย ย ย [Category("Behaviour")] ย ย ย ย [DisplayName("Follow Tank Distance")] ย ย ย ย [Description("Move to tank if distance is higher than value")] ย ย ย ย public int FollowTankDistance { get; set; } ย ย ย ย private MonkMistWeaverSettings() ย ย ย ย { ย ย ย ย ย ย ConfigWinForm(new System.Drawing.Point(400, 600), "MistWeaver Monk " + Translate.Get("Settings")); ย ย ย ย } ย ย ย ย public static MonkMistWeaverSettings CurrentSetting { get; set; } ย ย ย ย public bool Save() ย ย ย ย { ย ย ย ย ย ย try ย ย ย ย ย ย { ย ย ย ย ย ย ย ย return Save(AdviserFilePathAndName("CustomClass-MistWeaver Monk", ObjectManager.Me.Name + "." + Usefuls.RealmName)); ย ย ย ย ย ย } ย ย ย ย ย ย catch (Exception e) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย Logging.WriteError("MonkMistWeaverSettings > Save(): " + e); ย ย ย ย ย ย ย ย return false; ย ย ย ย ย ย } ย ย ย ย } ย ย ย ย public static bool Load() ย ย ย ย { ย ย ย ย ย ย try ย ย ย ย ย ย { ย ย ย ย ย ย ย ย if (File.Exists(AdviserFilePathAndName("CustomClass-MistweaverMonk", ObjectManager.Me.Name + "." + Usefuls.RealmName))) ย ย ย ย ย ย ย ย { ย ย ย ย ย ย ย ย ย ย CurrentSetting = ย ย ย ย ย ย ย ย ย ย ย ย Load<MonkMistWeaverSettings>(AdviserFilePathAndName("CustomClass-MistweaverMonk", ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ObjectManager.Me.Name + "." + Usefuls.RealmName)); ย ย ย ย ย ย ย ย ย ย return true; ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย CurrentSetting = new MonkMistWeaverSettings(); ย ย ย ย ย ย } ย ย ย ย ย ย catch (Exception e) ย ย ย ย ย ย { ย ย ย ย ย ย ย ย Logging.WriteError("MonkMistWeaverSettings > Load(): " + e); ย ย ย ย ย ย } ย ย ย ย ย ย return false; ย ย ย ย } ย ย } ย ย #endregion } Link to comment https://wrobot.eu/forums/topic/15542-healing-class-legion/#findComment-69666 Share on other sites More sharing options...
Droidz 2738 Posted October 4 Share Posted October 4 Hello, Your code is not complete, it is missing the Renewingmist method, the PercentZenPulseHealth setting and some spells : Link to comment https://wrobot.eu/forums/topic/15542-healing-class-legion/#findComment-69671 Share on other sites More sharing options...
Droidz 2738 Posted October 4 Share Posted October 4 /* Changelog: 1.0.0 - initial release 1.0.1 - fixed not healing "recruit a friend" connected payers - fixed endless resurrection tries 1.0.2 - fixed FollowTank trying to follow target which is not in line of sight - improved FollowTank function - added Spell Circle of Healing - added Mass Resurrection if option "Resurrection on" is set to "all" - attack spells will now also be casted if your own target is the only valid one - purify will now check for debuffed partymembers instead of only low health partymembers - modified usage of Holy Word: Chastise - minor code fixes 1.0.3 - changed purify behaviour: wont move to target anymore - added option "Max healrange" - partymembers out of range will be ignored - changed Renew and Flash Heal to make use of "Max healrange" 1.0.4 - the debuff recognition is now much more strict - purify should work much more efficient now */ using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using robotManager; using robotManager.FiniteStateMachine; using robotManager.Helpful; using Timer = robotManager.Helpful.Timer; using wManager.Wow.Class; using wManager.Wow.Enums; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; public class Main : ICustomClass { private MonkMistweaver _monk; public float Range { get { return 39.0f; } } private bool IsRunning; public void Initialize() { MonkMistWeaverSettings.Load(); if (!IsRunning) { _monk = new MonkMistweaver(); _monk.Pulse(); IsRunning = true; } } public void Dispose() { if (IsRunning) { _monk.Stop(); IsRunning = false; } } public void ShowConfiguration() { MonkMistWeaverSettings.Load(); MonkMistWeaverSettings.CurrentSetting.ToForm(); MonkMistWeaverSettings.CurrentSetting.Save(); } class MonkMistweaver { public static float HealRange = 40; public int maxhealrange; // Property: private bool _isLaunched; public bool IsLaunched { get { return _isLaunched; } set { _isLaunched = value; } } // Spells: private Spell _vivify; private Spell _envelopingmist; private Spell _zenpulse; private Spell _detox; private Spell _renewingmist; private Spell _Revival; private Spell _Lifecocoon; public MonkMistweaver() { _envelopingmist = new Spell("Enveloping Mist"); _vivify = new Spell("Vivify"); _zenpulse = new Spell("Zen Pulse"); _detox = new Spell("Detox"); _renewingmist = new Spell("Renewing Mist"); _Revival = new Spell("Revival"); _Lifecocoon = new Spell("Life Cocoon"); } public void Pulse() { _isLaunched = true; var thread = new Thread(RoutineThread) { Name = "Monk MistWeaver Healing Class" }; thread.Start(); } public void Stop() { _isLaunched = false; Logging.WriteFight("Stop 'MistWeaver Monk'"); } #region Routine void RoutineThread() { Logging.WriteFight("'MistWeaver Monk' Started"); if (MonkMistWeaverSettings.CurrentSetting.maxhealrange != null | MonkMistWeaverSettings.CurrentSetting.maxhealrange > 0) { maxhealrange = MonkMistWeaverSettings.CurrentSetting.maxhealrange; } else { maxhealrange = 80; } while (_isLaunched) { Routine(); Thread.Sleep(25); // time between Routine steps in ms - lower time results in higher cpu usage } Logging.WriteFight("'MistWeaver Monk' Stopped"); } void Routine() { if (!Conditions.InGameAndConnectedAndAlive || ObjectManager.Me.IsMounted || ObjectManager.Me.IsStunned || ObjectManager.Me.Silenced) { return; } if (!ObjectManager.Me.InCombat && !ObjectManager.Me.IsMounted ) { ZenPulse(); Vivify(); Detox(); FollowTank(); return; } // if (!Conditions.InGameAndConnectedAndAlive || ObjectManager.Me.IsMounted || !ObjectManager.Me.InCombat) // || !ObjectManager.Me.InCombat return; if (LifeCocoon()) return; if (Revival()) return; if (EnvelopingMist()) return; if (ZenPulse()) return; if (RenewingMist()) return; if (Vivify()) return; if (Detox()) return; if (FollowTank()) return; } #endregion #region Follow Tank bool FollowTank() { if (MonkMistWeaverSettings.CurrentSetting.FollowTank == false) return false; if (MonkMistWeaverSettings.CurrentSetting.FollowTank == null) return false; var FollowTanks = getTanks().Where(o => o.IsValid && !o.IsMounted).OrderBy(o => o.GetDistance); int FollowTankDistance = MonkMistWeaverSettings.CurrentSetting.FollowTankDistance; if (FollowTanks.Count() > 0) { var u = FollowTanks.First(); WoWPlayer tank = new WoWPlayer(u.GetBaseAddress); if (tank.GetDistance > FollowTankDistance) { while ((float)(System.Math.Round((tank.GetDistance),0)) > FollowTankDistance) { MovementManager.MoveTo(tank.Position); /* Logging.WriteDebug("Following Tank " + tank.Name); Logging.WriteDebug("Current Tank distance " + tank.GetDistance); Logging.WriteDebug("Wanted Tank distance " + FollowTankDistance); */ if ((float)(System.Math.Round((tank.GetDistance),0)) < FollowTankDistance) { MovementManager.StopMove(); return true; } } MovementManager.StopMove(); return true; } return false; } var FollowParty = getPartymembers().Where(o => o.IsValid && !o.IsMounted && (o.Name != ObjectManager.Me.Name)).OrderBy(o => o.GetDistance); if (FollowParty.Count() > 0) { var k = FollowParty.First(); WoWPlayer party = new WoWPlayer(k.GetBaseAddress); //Logging.WriteDebug("Is partymember in line of sight? " + TraceLine.TraceLineGo(party.Position)); if (party.GetDistance > FollowTankDistance) { MovementManager.MoveTo(party); //Logging.WriteDebug("Following Partymember " + party.Name); return false; } } return false; } #endregion #region RenewingMist bool RenewingMist() { if (!_renewingmist.KnownSpell) return false; if (!_renewingmist.IsSpellUsable) return false; var buffTanks = getTanks().Where(o => o.IsValid && !(o.HaveBuff("Renewing Mist"))).OrderBy(o => o.GetDistance); var buffHealers = getHealers().Where(o => o.IsValid && !(o.HaveBuff("Renewing Mist"))).OrderBy(o => o.GetDistance); if (buffTanks.Count() > 0 && buffHealers.Count() > 0) { var u = buffTanks.First(); WoWPlayer tank = new WoWPlayer(u.GetBaseAddress); if (!TraceLine.TraceLineGo(tank.Position) && (tank.Name != ObjectManager.Me.Name)) { //Logging.WriteDebug("Is " + tank.Name + " a healer? " + IsHealer(tank.Name) + " - " + GetHealerName() + " is the healer."); Interact.InteractGameObject(tank.GetBaseAddress, false); _renewingmist.Launch(); return true; } } return false; } #endregion #region Life Cocoon bool LifeCocoon() { if (!_Lifecocoon.KnownSpell) return false; if (!_Lifecocoon.IsSpellUsable) return false; if (MonkMistWeaverSettings.CurrentSetting.PercentLifeCocoonHealth == null) return false; int HandsHealth = MonkMistWeaverSettings.CurrentSetting.PercentLifeCocoonHealth; if (HandsHealth == 0) return false; var members = getPartymembers().Where(o => o.IsValid && o.IsAlive && o.HealthPercent <= HandsHealth && !TraceLine.TraceLineGo(o.Position)).OrderBy(o => o.HealthPercent); if (members.Count() > 0) { var u = members.First(); WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); if (healTarget.IsAlive || healTarget.HealthPercent > 0) { while (TraceLine.TraceLineGo(healTarget.Position)) { MovementManager.MoveTo(healTarget); } MovementManager.StopMove(); Interact.InteractGameObject(healTarget.GetBaseAddress, false); _Lifecocoon.Launch(); return true; } } return false; } #endregion #region Enveloping Mist bool EnvelopingMist() { if (!_envelopingmist.KnownSpell) return false; if (!_envelopingmist.IsSpellUsable) return false; if (MonkMistWeaverSettings.CurrentSetting.PercentEnvelopingMistHealth == null) return false; int HandsHealth = MonkMistWeaverSettings.CurrentSetting.PercentEnvelopingMistHealth; if (HandsHealth == 0) return false; var members = getPartymembers().Where(o => o.IsValid && o.IsAlive && o.HealthPercent <= HandsHealth && !TraceLine.TraceLineGo(o.Position)).OrderBy(o => o.HealthPercent); if (members.Count() > 0) { var u = members.First(); WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); if (healTarget.IsAlive || healTarget.HealthPercent > 0) { while (TraceLine.TraceLineGo(healTarget.Position)) { MovementManager.MoveTo(healTarget); } MovementManager.StopMove(); Interact.InteractGameObject(healTarget.GetBaseAddress, false); _envelopingmist.Launch(); return true; } } return false; } #endregion #region Vivify bool Vivify() { if (!_vivify.KnownSpell) return false; if (!_vivify.IsSpellUsable) return false; if (MonkMistWeaverSettings.CurrentSetting.PercentVivifyHealth == null) return false; int VivifyHealth = MonkMistWeaverSettings.CurrentSetting.PercentVivifyHealth; if (VivifyHealth == 0) return false; var members = getPartymembers().Where(o => o.IsValid && (o.IsAlive || o.HealthPercent > 0) && o.HealthPercent <= VivifyHealth).OrderBy(o => o.HealthPercent); if (members.Count() > 0) { var u = members.First(); WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); if (healTarget.IsAlive || healTarget.HealthPercent > 0) { while (TraceLine.TraceLineGo(healTarget.Position)) { MovementManager.MoveTo(healTarget); } MovementManager.StopMove(); Interact.InteractGameObject(healTarget.GetBaseAddress, false); _vivify.Launch(); return true; } } return false; } #endregion #region Revival /* public int healthTr { get { return MonkMistWeaverSettings.CurrentSetting.PercentRevivalHealth != null ? MonkMistWeaverSettings.CurrentSetting.PercentRevivalHealth : 0; } } public int maxPlayersTr { get { return MonkMistWeaverSettings.CurrentSetting.PlayersCountRevival != null ? MonkMistWeaverSettings.CurrentSetting.PlayersCountRevival : 0; } }*/ bool Revival() { if (!_Revival.KnownSpell) return false; if (!_Revival.IsSpellUsable) return false; int healthTr = MonkMistWeaverSettings.CurrentSetting.PercentRevivalHealth; int maxPlayersTr = MonkMistWeaverSettings.CurrentSetting.Players; // PlayersCountRevival ??? if (healthTr == 0) return false; if (maxPlayersTr == 0) return false; var members = getPartymembers().Where(o => o.IsValid && o.IsAlive && o.HealthPercent <= healthTr && o.GetDistance <= 40); if (members.Count() >= maxPlayersTr) { _Revival.Launch(); return true; } return false; } #endregion #region Zen Pulse public int healthPOH { get { return MonkMistWeaverSettings.CurrentSetting.PercentZenPulseHealth != null ? MonkMistWeaverSettings.CurrentSetting.PercentZenPulseHealth : 0; } } public int maxplayersPOH { get { return MonkMistWeaverSettings.CurrentSetting.PlayersCountZenPulse != null ? MonkMistWeaverSettings.CurrentSetting.PlayersCountZenPulse : 0; } } bool ZenPulse() { if (!_zenpulse.KnownSpell) return false; if (!_zenpulse.IsSpellUsable) return false; if (healthPOH == 0) return false; if (maxplayersPOH == 0) return false; //Logging.WriteDebug("Wild Growth health : " + healthPOH); //Logging.WriteDebug("Wild Growth players: " + maxplayersPOH); var members = getPartymembers().Where(o => o.IsValid && o.IsAlive && o.HealthPercent <= healthPOH && !TraceLine.TraceLineGo(o.Position)).OrderBy(o => o.HealthPercent); if (members.Count() >= maxplayersPOH) { var u = members.First(); WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); if (!TraceLine.TraceLineGo(healTarget.Position) && healTarget.IsAlive) { { Interact.InteractGameObject(healTarget.GetBaseAddress, false); _zenpulse.Launch(); return true; } } } return false; } #endregion #region Detox bool Detox() { if (!_detox.KnownSpell) return false; if (!_detox.IsSpellUsable) return false; var members = GetDebuffedPartymembers().OrderBy(o => o.HealthPercent); if (members.Count() > 0) { var u = members.First(); WoWPlayer healTarget = new WoWPlayer(u.GetBaseAddress); if (!TraceLine.TraceLineGo(healTarget.Position) && healTarget.IsAlive) { Interact.InteractGameObject(healTarget.GetBaseAddress, false); if (Lua.LuaDoString<bool>("for j=1,40 do local m=5; local d={UnitDebuff(\"target\",j)}; if (d[5]==\"Magic\" or d[5]==\"Disease\" or d[5]==\"Poison\") and d[7]>m then j=41 return 1 end end;")) { _detox.Launch(); Logging.WriteDebug("Detox " + healTarget.Name); return true; } return false; } } return false; } #endregion #region get in Healingrange bool GetInHealingrange(WoWPlayer healTarget) { if (healTarget.GetDistance > HealRange) { Logging.WriteDebug(healTarget.Name + " is out of range, lets move to him. "); while (healTarget.GetDistance > HealRange) { MovementManager.MoveTo(healTarget); } MovementManager.StopMove(); return true; } return false; } #endregion #region get party List<WoWPlayer> getPartymembers() { List<WoWPlayer> ret = new List<WoWPlayer>(); var u = Party.GetPartyHomeAndInstance().Where(p => p.GetDistance < maxhealrange && p.IsValid && !TraceLine.TraceLineGo(p.Position)); if (u.Count() > 0) { foreach (var unit in u) { WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); ret.Add(p); } } WoWPlayer v = new WoWPlayer(ObjectManager.Me.GetBaseAddress); ret.Add(v); return ret; } List<WoWPlayer> getAllPartymembers() { List<WoWPlayer> ret = new List<WoWPlayer>(); var u = Party.GetPartyHomeAndInstance().Where(p => p.GetDistance < 80 && p.IsValid); if (u.Count() > 0) { foreach (var unit in u) { WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); ret.Add(p); } } WoWPlayer v = new WoWPlayer(ObjectManager.Me.GetBaseAddress); ret.Add(v); return ret; } List<WoWUnit> GetPartyTargets() { List<WoWPlayer> party = Party.GetPartyHomeAndInstance(); List<WoWPlayer> partyMembers = new List<WoWPlayer>(); var ret = new List<WoWUnit>(); partyMembers.AddRange(party.Where(p => p.GetDistance < 40 && p.IsValid && p.HealthPercent > 0)); WoWPlayer Me = new WoWPlayer(ObjectManager.Me.GetBaseAddress); partyMembers.Add(Me); foreach (var m in partyMembers) { var targetUnit = new WoWUnit(ObjectManager.GetObjectByGuid(m.Target).GetBaseAddress); if (m.IsValid && (m.HealthPercent > 0) && (m.InCombat || targetUnit.InCombat) && m.Target.IsNotZero()) { if (ret.All(u => u.Guid != m.Target)) // prevent double list entrys { if (targetUnit.IsValid && targetUnit.IsAlive) { ret.Add(targetUnit); } } } } return ret; } List<WoWPlayer> GetDebuffedPartymembers() { List<WoWPlayer> ret = new List<WoWPlayer>(); List<WoWPlayer> u = new List<WoWPlayer>(); List<WoWPlayer> party = Party.GetPartyHomeAndInstance(); WoWPlayer Me = new WoWPlayer(ObjectManager.Me.GetBaseAddress); u.AddRange(party.Where(p => p.GetDistance < 40 && p.IsValid && p.HealthPercent > 0 && !TraceLine.TraceLineGo(p.Position))); u.Add(Me); if (u.Count() > 0) { //Logging.WriteDebug("Checking" + u.Count + " players for debuffs."); foreach (var unit in u) { WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); List<Aura> debuffs = new List<Aura>(); debuffs = p.GetAllBuff(); //Logging.WriteDebug("Found " + debuffs.Count + " buffs on " + unit.Name); foreach (var m in debuffs) { //Logging.WriteDebug("Buff: " + m.GetSpell + " Flags: " + m.Flag); if (!m.Flag.HasFlag(AuraFlags.Passive) && m.Flag.HasFlag(AuraFlags.Harmful) && m.Flag.HasFlag(AuraFlags.Active) && m.Flag.HasFlag(AuraFlags.Negative) && m.Flag.HasFlag(AuraFlags.Duration)) { ret.Add(p); return ret; } } } } return ret; } #endregion #region get tanks List<WoWPlayer> getTanks() { List<WoWPlayer> ret = new List<WoWPlayer>(); var u = Party.GetPartyHomeAndInstance().Where(p => p.GetDistance < 80 && p.IsValid && !TraceLine.TraceLineGo(p.Position)); if (u.Count() > 0) { foreach (var unit in u) { //Logging.WriteDebug("Unit name: " + unit.Name.ToString().Trim()); if (IsTank(unit.Name.ToString())) { WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); ret.Add(p); } } } /* if (ret.Count() == 0) { Logging.WriteDebug("Could not find a tank!"); WoWPlayer v = new WoWPlayer(ObjectManager.Me.GetBaseAddress); ret.Add(v); } */ return ret; } string GetTankPlayerName() { var lua = new[] { "partyTank = \"\";", "for groupindex = 1,MAX_PARTY_MEMBERS do", " if (UnitInParty(\"party\" .. groupindex)) then", " local role = UnitGroupRolesAssigned(\"party\" .. groupindex);", " if role == \"TANK\" then", " local name, realm = UnitName(\"party\" .. groupindex);", " partyTank = name;", " return;", " end", " end", "end", }; return Lua.LuaDoString(lua, "partyTank"); } public bool IsTank(string unit) { var tankNaam = GetTankPlayerName(); WoWPlayer v = new WoWPlayer(ObjectManager.Me.GetBaseAddress); if (tankNaam.Contains(unit)) { return true; } return false; } #endregion #region getHealers List<WoWPlayer> getHealers() { List<WoWPlayer> ret = new List<WoWPlayer>(); var u = Party.GetPartyHomeAndInstance().Where(p => p.GetDistance < 80 && p.IsValid && !TraceLine.TraceLineGo(p.Position)); if (u.Count() > 0) { foreach (var unit in u) { //Logging.WriteDebug("Healer name: " + unit.Name.ToString().Trim()); if (IsHealer(unit.Name.ToString())) { WoWPlayer p = new WoWPlayer(unit.GetBaseAddress); ret.Add(p); } } } return ret; } string GetHealerName() { var lua = new[] { "partyHealer = \"\";", "for groupindex = 1,MAX_PARTY_MEMBERS do", " if (UnitInParty(\"party\" .. groupindex)) then", " local role = UnitGroupRolesAssigned(\"party\" .. groupindex);", " if role == \"HEALER\" then", " local name, realm = UnitName(\"party\" .. groupindex);", " partyHeaer = name;", " return;", " end", " end", "end", }; return Lua.LuaDoString(lua, "partyHealer"); } public bool IsHealer(string unit) { var healerNaam = GetHealerName(); if (healerNaam.Contains(unit)) { return true; } return false; } #endregion } #region settings [Serializable] public class MonkMistWeaverSettings : Settings { [Setting, DefaultValue(0)] [Category("Healing Spells")] [DisplayName("Life Cocoon HP%")] [Description("Cast Life Cocoon when HP% <= Value")] public int PercentLifeCocoonHealth { get; set; } [Setting, DefaultValue(0)] [Category("Group Healing Spells")] [DisplayName("Zen Pulse Players")] [Description("Cast Zen Pulse when player count with low HP >= Value. 0 = Disable")] public int PlayersCountZenPulse { get; set; } [Setting, DefaultValue(0)] [Category("Group Healing Spells")] [DisplayName("Zen Pulse HP%")] [Description("Cast Zen Pulse when players HP% <= Value")] public int PercentZenPulseHealth { get; set; } [Setting, DefaultValue(0)] [Category("Group Healing Spells")] [DisplayName("Revival HP%")] [Description("Cast Revival when players HP% <= Value")] public int PercentRevivalHealth { get; set; } [Setting, DefaultValue(0)] [Category("Group Healing Spells")] [DisplayName("Revival Players")] [Description("Cast Revival when playercount with low HP >= Value. 0 = Disable")] public int Players { get; set; } [Setting, DefaultValue(0)] [Category("Healing Spells")] [DisplayName("Vivify HP%")] [Description("Cast Vivify when HP% <= Value")] public int PercentVivifyHealth { get; set; } [Setting, DefaultValue(0)] [Category("Healing Spells")] [DisplayName("Enveloping Mist HP%")] [Description("Cast Enveloping Mist when HP% <= Value")] public int PercentEnvelopingMistHealth { get; set; } [Setting, DefaultValue(80)] [Category("Behaviour")] [DisplayName("Max Healrange")] [Description("Maximal distance between you and a valid healtarget")] public int maxhealrange { get; set; } [Setting, DefaultValue(false)] [Category("Behaviour")] [DisplayName("Follow Tank")] [Description("Follow the tank while in fight")] public bool FollowTank { get; set; } [Setting, DefaultValue(0)] [Category("Behaviour")] [DisplayName("Follow Tank Distance")] [Description("Move to tank if distance is higher than value")] public int FollowTankDistance { get; set; } private MonkMistWeaverSettings() { ConfigWinForm(new System.Drawing.Point(400, 600), "MistWeaver Monk " + Translate.Get("Settings")); } public static MonkMistWeaverSettings CurrentSetting { get; set; } public bool Save() { try { return Save(AdviserFilePathAndName("CustomClass-MistWeaver Monk", ObjectManager.Me.Name + "." + Usefuls.RealmName)); } catch (Exception e) { Logging.WriteError("MonkMistWeaverSettings > Save(): " + e); return false; } } public static bool Load() { try { if (File.Exists(AdviserFilePathAndName("CustomClass-MistweaverMonk", ObjectManager.Me.Name + "." + Usefuls.RealmName))) { CurrentSetting = Load<MonkMistWeaverSettings>(AdviserFilePathAndName("CustomClass-MistweaverMonk", ObjectManager.Me.Name + "." + Usefuls.RealmName)); return true; } CurrentSetting = new MonkMistWeaverSettings(); } catch (Exception e) { Logging.WriteError("MonkMistWeaverSettings > Load(): " + e); } return false; } } #endregion } It's code fixed (but no tested) Nookz 1 Link to comment https://wrobot.eu/forums/topic/15542-healing-class-legion/#findComment-69672 Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now