Jump to content

Healing Class Legion


Recommended Posts

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.

error.png

Link to comment
Share on other sites

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
Share on other sites

/*
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)

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
ร—
ร—
  • Create New...