using System; using InnerSpaceAPI; using LavishScriptAPI; using PRModuleInterface; using PRCoreInterface; namespace PRModuleLibrary { // Main Code public partial class PRModule : IPlugin { //my delcares string WhichManaGem; bool UseFireWard; bool UseFrostWard; bool NeedBuffs; bool CheckedBuffs; string MyManaGem; string CombatPrepCurrentState; string RoutineState; public enum RoutineStates { CombatPrep, //Speaks for itself Pulling, //Speaks for itself Combat //The actual killing } public enum CombatPrepStates //apparently checking health is not needed { CheckingBuffs, //I'm going to have this here anyway because of waltz's current buff implementation Buffing, //May just make this part of the CheckingBuffs. CheckingManaGem, //Speaks for itself PreCombatWards //I'll implement it if I have to. Do any pre-combat fire/frost wards on fire/frost damage dealers } public enum PullingStates { Advancing, //Get close if the mob wandered out of range for some reason. If it did, your pull range is probably too high Casting //the actual pulling } public enum SingleTargetCombat { Nuking, //our good 'ole spec-optimized nukes. PreFlee, //Mana-shield, snares, etc, while running from mobs SwapToDoubleTargetCombat //Escalate to doubletarget combat if a mob aggros, essentially just start the CC } public enum DoubleTargetCombat { Nuking, //Will be same as singletarget nuking, because it's really the same CrowdControl, //Snare mobs if possible, get away, sheep lower priority mob SwapToMultiTargetCobmat, //Switch to multi target combat if needed, not sure how well it'd work mostly because there's a good chance you'll be lowhp with adds. Flee? PreFlee //same as above } public enum MultiTargetCombat { AoENuking, //Fancy blizzarding, blast waving, etc. should really be a frostie for this... EmergencyCrowdControl, //snares and flares to get away if needed, probably be merged with preflee PreFlee //same as above } public enum BuffStates //kinda like sub-substates for buffing. It'll do my own downtime if I need to. { CheckMana, //..... CheckBuffs, //I repeat, ..... CastBuffs //Spec-optimized buffing. } private void GetCombatPrepState() { if (!CheckedBuffs) return CombatPrepStates.CheckingBuffs; if (!Requiem.Character.Buff("Arcane Intellect").IsValid || (!Requiem.Character.Buff("Molten Armor").IsValid && !Requiem.Character.Buff("Ice Armor").IsValid && !Requiem.Character.Buff("Frost Armor").IsValid)) return CombatPrepStates.Buffing; //currently lacking Dampen Magic if (MyManaGem == null || !Requiem.Inventory.GetItem(MyManaGem)) return CombatPrepStates.CheckingManaGem; if ((UseFireWard && !Requiem.Character.Buff("Fire Ward").IsValid) || (UseFrostWard && !Requiem.Character.Buff("Frost Ward").IsValid)) return CombatPrepStates.PreCombatWards; } private void CheckBuffs() { if (!Requiem.Character.Buff("Arcane Intellect")) { NeedArcInt = true; } if (!Requiem.Character.Buff("Ice Armor") && !Requiem.Character.Buff("Frost Armor") && !Requiem.Character.Buff("Molten Armor")) { NeedArmorSpell = true; } if (Requiem.Character.TargetList.Unit(0).Mana > 0 || UseFireWard || UseFrostWard) { NeedDampen = true; } } private void Buffs() { if (NeedArcInt) { Requiem.Character.Cast("Arcane Intellect", Requiem.Character.GUID); } if (NeedArmorSpell) { if (!Requiem.Character.Cast("Molten Armor")) { if (!Requiem.Character.Cast("Ice Armor")) { if (!Requiem.Character.Cast("Frost Armor")) { } } } } if (NeedDampen) { Requiem.Character.Cast("Dampen Magaic", Requiem.Character.GUID); } } private void CheckManaGem() { if (!Requiem.Inventory.GetItem("Mana Agate") && !Requiem.Inventory.GetItem("Mana Jade") && !Requiem.Inventory.GetItem("Mana Citrine") && !Requiem.Inventory.GetItem("Mana Ruby") && !Requiem.Inventory.GetItem("Mana Emerald")) { if (!Requiem.Character.Cast("Conjure Mana Emerald")) { if (!Requiem.Character.Cast("Conjure Mana Ruby")) { if (!Requiem.Character.Cast("Conjure Mana Citrine")) { if (!Requiem.Character.Cast("Conjure Mana Jade")) { if (!Requiem.Character.Cast("Conjure Mana Agate")) { } } } } } } } private void PreCombatWards() { if (UseFireWard) { Requiem.Character.Cast("Fire Ward", Requiem.Character.GUID); } if (UseFrostWard) { Requiem.Character.Cast("Frost Ward", Requiem.Character.GUID); } } private void Pull() { } private RoutineStates Combat() { } private void ManaUp() { if (!Requiem.Inventory.ItemCount(Requiem.Inventory.BestDrink) < 6) { ConjureMyWater(); } Requiem.Inventory.Use(Requiem.Inventory.BestDrink); if (Requiem.Character.ManaPercent < 95) { do { } while (Requiem.Character.Buff("Drink").IsValid); } } private void ConjureMyWater() { if (Requiem.Character.ManaPercent >= 7.5) { Requiem.Character.Cast("Conjure Water"); } else { Requiem.Character.Sit(); if (Requiem.Character.ManaPercent >= 7.5) break; } } private bool GetPullState() { if (Requiem.Character.Location.Distance(Requiem.Character.CurrentTarget.Location.X, Requiem.Character.CurrentTarget.Location.Y, Requiem.Character.CurrentTarget.Location.Z)) { Requiem.Navigation.Face(Requiem.Character.CurrentTarget.Location.X, Requiem.Character.CurrentTarget.Location.Y); do { Requiem.Navigation.MoveForward(); } while (Requiem.Character.Location.Distance(Requiem.Character.CurrentTarget.Location.X, Requiem.Character.CurrentTarget.Location.Y, Requiem.Character.CurrentTarget.Location.Z) > (PullingRange - 3)); } return true; } int PullingRange; string CombatState; // This function is called every frame. public void Pulse() { RoutineState = GetRoutineState(); switch (RoutineState) { case RoutineStates.CombatPrep: CombatPrepCurrentState = GetCombatPrepState(); switch (CombatPrepCurrentState) { case CombatPrepStates.CheckingBuffs: CheckBuffs(); break; case CombatPrepStates.Buffing: Buffs(); break; case CombatPrepStates.CheckingManaGem: CheckManaGem(); break; case CombatPrepStates.PreCombatWards: PreCombatWards(); break; } break; case RoutineStates.Pulling: if (GetPullState) Pull(); break; case RoutineStates.Combat: //Will come back to this. break; } } // This function is executed when the plugin is loaded. public void OnLoad() { } // This function is executed when the plugin is unloaded. public void OnUnload() { } } }