rendered paste bodyusing System;
using InnerSpaceAPI;
using LavishScriptAPI;
using PRModuleInterface;
using ISXWoW;
using PRCoreInterface;
namespace RequiemRogue
{
public enum MageStates
{
SingleMob,
DoubleMob,
MultiMob,
Flee,
Null
}
public enum SingleStates
{
Approach,
Pulling,
Nuking,
Counterspelling,
Null
}
public enum DoubleStates
{
Approach,
Sheeping,
Nuking,
Counterspelling,
Null
}
public enum MultiStates
{
Approach,
AOE,
Nuking,
CrowdControl,
Null
}
public class PRModule : IPlugin
{
int i = 0;
bool JustPulled = false;
#region State Object and Data Hiding access initiation.
private MageStates _CurrentState = MageStates.SingleMob;
private MageStates MageState
{
get { return CurrentState; }
}
public MageStates 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.Sheeping;
private DoubleStates DoubleState
{
get { return CurrentDoubleState; }
}
public DoubleStates CurrentDoubleState
{
get { return _CurrentDoubleState; }
set { _CurrentDoubleState = value; }
}
private MultiStates _CurrentMultiState = MultiStates.CrowdControl;
private MultiStates MultiState
{
get { return CurrentMultiState; }
}
public MultiStates CurrentMultiState
{
get { return _CurrentMultiState; }
set { _CurrentMultiState = value; }
}
#endregion
public double FleeHealth
{
get { return 10.00; }
}
public double FleeMana
{
get { return 10.00; }
}
public void Pulse()
{
//return;
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 MageStates GetState()
{
if (Requiem.Character.PriorityList.Count == 1) //we have 1 target
return MageStates.SingleMob;
if (Requiem.Character.PriorityList.Count == 2) //we have 2 targets
return MageStates.DoubleMob;
if (Requiem.Character.PriorityList.Count >= 3) //we have 3 or more targets
return MageStates.MultiMob;
if (Requiem.Character.HealthPercent < FleeHealth && Requiem.Character.ManaPercent < FleeMana)
return MageStates.Flee;
else
return MageStates.Null;
}
private void StateManager()
{
switch (CurrentState)
{
case MageStates.SingleMob:
SingleStateManager();
break;
case MageStates.DoubleMob:
DoubleStateManagement();
break;
case MageStates.MultiMob:
MultiStateManager();
break;
case MageStates.Flee:
FleeHandler();
break;
}
}
#endregion
#region Single State Management
private void SingleStateManager()
{
//TEMP
//return;
//TEMP
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.Counterspelling:
CounterHandler();
break;
case SingleStates.Null:
NullHandler();
break;
}
}
public SingleStates GetSingleState() //broken for now
{
if (PrimaryTarget.Distance > 35)
return SingleStates.Approach;
if (PrimaryTarget.SpellInCast.IsValid)
return SingleStates.Counterspelling;
if (PrimaryTarget.Distance >= 15 && PrimaryTarget.Distance <= 30 && !JustPulled && !Busy && PrimaryTarget.CurrentTarget != WoWActivePlayer.Get())
return SingleStates.Pulling;
if (PrimaryTarget.Distance <= 35 && !Busy)
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.Sheeping:
SheepHandler();
break;
case DoubleStates.Nuking:
NukeHandler();
break;
case DoubleStates.Counterspelling:
CounterHandler();
break;
}
}
public DoubleStates GetDoubleState() //broken for now
{
if (Requiem.Character.InCombat)
return DoubleStates.Sheeping;
else
return DoubleStates.Nuking;
}
#endregion
#region Multi State Management
private void MultiStateManager()
{
CurrentMultiState = GetMultiState();
switch (CurrentMultiState)
{
case MultiStates.Approach:
ApproachHandler();
break;
case MultiStates.CrowdControl:
CrowdHandler();
break;
case MultiStates.Nuking:
NukeHandler();
break;
case MultiStates.AOE:
AOEHandler();
break;
}
}
public MultiStates GetMultiState() //broken for now
{
if (Requiem.Character.InCombat)
return MultiStates.AOE;
else
return MultiStates.CrowdControl;
}
#endregion
#region Initialization and Destruction
public void OnLoad()
{
GUIs.LoadGUIs();
if (Requiem.Character.HasSpell("Conjure Water"))
Requiem.Character.ConjuredItems.AddConjure("Conjure Water", "Conjured Water", 1);
if (Requiem.Character.HasSpell("Conjure Food"))
Requiem.Character.ConjuredItems.AddConjure("Conjure Food", "Conjured Muffin", 1);
if (Requiem.Character.HasSpell("Frost Armor"))
Requiem.Character.BuffList.AddBuff("Frost Armor");
if (Requiem.Character.HasSpell("Arcane Intellect"))
Requiem.Character.BuffList.AddBuff("Arcane Intellect");
}
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 AOEHandler()
{
//throw new Exception("The method or operation is not implemented.");
}
private void CounterHandler()
{
//throw new Exception("The method or operation is not implemented.");
}
private void SheepHandler()
{
//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 (!Busy && Requiem.Character.Action("Fireball").Usable)
{
Requiem.Character.Cast("Fireball");
//Requiem.Character.Cast(FireballObj, MyTarget); //Let's cast a fireball
JustPulled = false;
return;
}
if (Requiem.Character.Action("Shoot").Usable)
{
Requiem.Character.Action("Shoot").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("Facin'");
Requiem.Navigation.Face(PrimaryTarget.X, PrimaryTarget.Y);
return;
}
if (Requiem.Character.HasSpell("Frostbolt"))
{
if (!Busy)
{
Requiem.Character.Cast("Frostbolt");
//Requiem.Character.Cast(FrostboltObj, MyTarget); //Let's cast a frostbolt
JustPulled = true;
}
return;
}
else
{
if (!Busy)
{
Requiem.Character.Cast("Fireball");
//Requiem.Character.Cast(FireballObj, MyTarget); //we should do a fireball then.
JustPulled = true;
}
return;
}
}
#endregion
#region Internal Implementations of Macros
private WoWUnit MyTarget
{
get { return Requiem.Character.CurrentTarget; }
}
private WoWUnit PrimaryTarget
{
get { return Requiem.Character.PriorityList.Unit(1); }
}
private bool Busy
{
get { return Requiem.Character.IsCasting; }
}
#endregion
}
}