rendered paste bodyusing System;
using InnerSpaceAPI;
using LavishScriptAPI;
using PRModuleInterface;
using ISXWoW;
using PRCoreInterface;
namespace PRModuleLibrary
{
#region State Machine Ennumerations
public enum RogueStates
{
SingleMob,
DoubleMob,
MultiMob,
Flee,
Null
}
public enum SingleStates
{
Approach,
Pulling,
Nuking,
Null
}
public enum DoubleStates
{
Approach,
Gougeing,
Nuking,
Null
}
#endregion
public partial class PRModule : IPlugin
{
int i = 0;
bool JustPulled = false;
#region State Object and Data Hiding access initiation.
private RogueStates _CurrentState = RogueStates.SingleMob;
private RogueStates RogueState
{
get { return CurrentState; }
}
public RogueStates CurrentState
{
get { return _CurrentState; }
set { _CurrentState = value; }
}
private SingleStates _CurrentSingleState = SingleStates.Pulling;
private SingleStates SingleState
{
get { return CurrentSingleState; }
}
public SingleStates CurrentSingleState
{
get { return _CurrentSingleState; }
set { _CurrentSingleState = value; }
}
private DoubleStates _CurrentDoubleState = DoubleStates.Gougeing;
private DoubleStates DoubleState
{
get { return CurrentDoubleState; }
}
public DoubleStates CurrentDoubleState
{
get { return _CurrentDoubleState; }
set { _CurrentDoubleState = value; }
}
#endregion
public double FleeHealth
{
get { return 20.00; }
}
public void Pulse()
{
CurrentState = GetState(); //Let's get our state and return it via our accessor, storing it via the CurrentState property.
StateManager();
i++;
if (i % 30 == 0)
{
Requiem.Kernel.Echo("Number of baddies in list is " + Requiem.Character.PriorityList.Count + " Number of Aggros: " + Requiem.Character.AggroList.Count);
}
}
#region State Management
public RogueStates GetState()
{
if (Requiem.Character.PriorityList.Count == 1) //we have 1 target
return RogueStates.SingleMob;
if (Requiem.Character.PriorityList.Count == 2) //we have 2 targets
return RogueStates.DoubleMob;
if (Requiem.Character.HealthPercent < FleeHealth)
return RogueStates.Flee;
else
return RogueStates.Null;
}
private void StateManager()
{
switch (CurrentState)
{
case RogueStates.SingleMob:
SingleStateManager();
break;
case RogueStates.DoubleMob:
DoubleStateManagement();
break;
case RogueStates.Flee:
FleeHandler();
break;
}
}
#endregion
#region Single State Management
private void SingleStateManager()
{
CurrentSingleState = GetSingleState();
if (i % 30 == 0)
{
Requiem.Kernel.Echo("Single State Routine Checking in, Getting State, " + CurrentSingleState.ToString());
}
switch (CurrentSingleState)
{
case SingleStates.Approach:
ApproachHandler();
JustPulled = false;
break;
case SingleStates.Pulling:
PullHandler();
break;
case SingleStates.Nuking:
NukeHandler();
break;
case SingleStates.Null:
NullHandler();
break;
}
}
public SingleStates GetSingleState() //broken for now
{
if (PrimaryTarget.Distance > 5)
return SingleStates.Approach;
if (PrimaryTarget.Distance >= 1.3 && PrimaryTarget.Distance <= 5 && !JustPulled && PrimaryTarget.CurrentTarget != WoWActivePlayer.Get())
return SingleStates.Pulling;
if (PrimaryTarget.Distance <= 35)
return SingleStates.Nuking;
else
return SingleStates.Null;
}
#endregion
#region Double State Management
private void DoubleStateManagement()
{
CurrentDoubleState = GetDoubleState();
switch (CurrentDoubleState)
{
case DoubleStates.Approach:
ApproachHandler();
break;
case DoubleStates.Gougeing:
GougeHandler();
break;
case DoubleStates.Nuking:
NukeHandler();
break;
}
}
private void GougeHandler()
{
throw new NotImplementedException();
}
public DoubleStates GetDoubleState() //broken for now
{
if (Requiem.Character.InCombat)
return DoubleStates.Gougeing;
else
return DoubleStates.Nuking;
}
#endregion
#region Initialization and Destruction
public void OnLoad()
{
GUIs.LoadGUIs();
}
public void OnUnload()
{
GUIs.UnloadGUIs();
}
#endregion
#region Combat State Handlers
private void NullHandler()
{
return;
}
private void ApproachHandler()
{
if (Requiem.Navigation.CurrentState.Equals(NAVIGATION_STATE.NONE))
{
Requiem.Navigation.PathTo(PrimaryTarget.X, PrimaryTarget.Y, PrimaryTarget.Z);
}
//throw new Exception("The method or operation is not implemented.");
}
private void FleeHandler()
{
Requiem.Kernel.Echo("We should Flee");
//throw new Exception("The method or operation is not implemented.");
}
private void CrowdHandler()
{
//throw new Exception("The method or operation is not implemented.");
}
private void NukeHandler()
{
Requiem.Navigation.StopPathing();
PrimaryTarget.Target();
if (Requiem.Navigation.ShouldFace(PrimaryTarget.Location.X, PrimaryTarget.Location.Y))
{
Requiem.Navigation.Face(PrimaryTarget.X, PrimaryTarget.Y);
return;
}
if (Requiem.Character.ComboPoints == 5 && Requiem.Character.Action("Eviscerate").Usable)
{
Requiem.Character.Action("Eviscerate").Use();
JustPulled = false;
return;
}
if (Requiem.Character.Action("Sinister Strike").Usable)
{
Requiem.Character.Action("Sinister Strike").Use();
JustPulled = false;
return;
}
if (!Requiem.Character.Attacking)
Requiem.Character.Attack();
return;
}
private void PullHandler()
{
Requiem.Navigation.StopPathing();
PrimaryTarget.Target();
if (Requiem.Navigation.ShouldFace(PrimaryTarget.Location.X, PrimaryTarget.Location.Y))
{
Requiem.Kernel.Echo("Face Target!");
Requiem.Navigation.Face(PrimaryTarget.X, PrimaryTarget.Y);
return;
}
if (!Requiem.Character.Attacking)
Requiem.Character.Attack();
}
#endregion
#region Internal Implementations of Macros
private WoWUnit MyTarget
{
get { return Requiem.Character.CurrentTarget; }
}
private WoWUnit PrimaryTarget
{
get { return Requiem.Character.PriorityList.Unit(1); }
}
#endregion
}
}