private void FightStartHandler(WoWUnit unit, CancelEventArgs cancelable) { if (UseWand.IsSpellUsable) { _iCanUseWand = true; } Lua.LuaDoString("PetDefensiveMode();"); // Imp Firebolt if (WarlockPetAndConsumables.MyWarlockPet().Equals("Imp")) { ToolBox.TogglePetSpellAuto("Firebolt", true); } // Imp BloodPact if (WarlockPetAndConsumables.MyWarlockPet().Equals("Imp")) { ToolBox.TogglePetSpellAuto("Blood Pact", true); } }
protected override void BuffRotation() { if (!Me.HaveBuff("Drink") || Me.ManaPercentage > 95) { base.BuffRotation(); // Unending Breath if (!Me.HaveBuff("Unending Breath") && settings.UseUnendingBreath && cast.OnSelf(UnendingBreath)) { return; } // Demon Skin if (!Me.HaveBuff("Demon Skin") && !DemonArmor.KnownSpell && !FelArmor.KnownSpell && cast.OnSelf(DemonSkin)) { return; } // Demon Armor if ((!Me.HaveBuff("Demon Armor")) && !FelArmor.KnownSpell && cast.OnSelf(DemonArmor)) { return; } // Fel Armor if (!Me.HaveBuff("Fel Armor") && cast.OnSelf(FelArmor)) { return; } // Health Funnel OOC if (ObjectManager.Pet.HealthPercent < 50 && Me.HealthPercent > 40 && ObjectManager.Pet.GetDistance < 19 && !ObjectManager.Pet.InCombatFlagOnly && settings.HealthFunnelOOC) { Lua.LuaDoString("PetWait();"); MovementManager.StopMove(); Fight.StopFight(); if (WarlockPetAndConsumables.MyWarlockPet().Equals("Voidwalker")) { cast.PetSpell("Consume Shadows", false, true); } if (cast.OnSelf(HealthFunnel)) { Thread.Sleep(500); Usefuls.WaitIsCasting(); Lua.LuaDoString("PetFollow();"); return; } Lua.LuaDoString("PetFollow();"); } // Health Stone if (!WarlockPetAndConsumables.HaveHealthstone() && cast.OnSelf(CreateHealthStone)) { return; } // Create Soul Stone if (!WarlockPetAndConsumables.HaveSoulstone() && cast.OnSelf(CreateSoulstone)) { return; } // PARTY Soul Stone if (CreateSoulstone.KnownSpell && ToolBox.HaveOneInList(WarlockPetAndConsumables.SoulStones()) && ToolBox.GetItemCooldown(WarlockPetAndConsumables.SoulStones()) <= 0) { WoWPlayer noSoulstone = AIOParty.GroupAndRaid .Find(m => !m.HaveBuff("Soulstone Resurrection") && m.GetDistance < 20 && m.Name != "Unknown" && !TraceLine.TraceLineGo(Me.Position, m.Position) && (m.WowClass == WoWClass.Paladin || m.WowClass == WoWClass.Priest || m.WowClass == WoWClass.Shaman || m.WowClass == WoWClass.Druid)); if (noSoulstone != null) { Logger.Log($"Using Soulstone on {noSoulstone.Name}"); MovementManager.StopMoveNewThread(); MovementManager.StopMoveToNewThread(); Lua.RunMacroText($"/target {noSoulstone.Name}"); if (ObjectManager.Target.Name == noSoulstone.Name) { ToolBox.UseFirstMatchingItem(WarlockPetAndConsumables.SoulStones()); Usefuls.WaitIsCasting(); Lua.RunMacroText("/cleartarget"); ToolBox.ClearCursor(); } } } // PARTY Drink if (AIOParty.PartyDrink(settings.PartyDrinkName, settings.PartyDrinkThreshold)) { return; } // Life Tap if (Me.HealthPercent > Me.ManaPercentage && settings.UseLifeTap && cast.OnSelf(LifeTap)) { return; } } }
protected override void BuffRotation() { base.BuffRotation(); // Life Tap if (Me.HealthPercent > Me.ManaPercentage && settings.UseLifeTap && !Me.IsMounted && cast.OnSelf(LifeTap)) { return; } // Unending Breath if (!Me.HaveBuff("Unending Breath") && settings.UseUnendingBreath && cast.OnSelf(UnendingBreath)) { return; } // Fel Armor if (!Me.HaveBuff("Fel Armor") && settings.UseFelArmor && cast.OnSelf(FelArmor)) { return; } // Demon Armor if (!Me.HaveBuff("Demon Skin") && !Me.HaveBuff("Demon Armor") && !Me.HaveBuff("Fel Armor") && cast.OnSelf(DemonArmor)) { return; } // Demon Skin if (!Me.HaveBuff("Demon Skin") && !Me.HaveBuff("Demon Armor") && !Me.HaveBuff("Fel Armor") && cast.OnSelf(DemonSkin)) { return; } // Soul Link if (!Me.HaveBuff("Soul Link") && ObjectManager.Pet.IsAlive && cast.OnSelf(SoulLink)) { return; } // Health Funnel OOC if (ObjectManager.Pet.HealthPercent < 50 && Me.HealthPercent > 40 && ObjectManager.Pet.GetDistance < 19 && !ObjectManager.Pet.InCombatFlagOnly && settings.HealthFunnelOOC) { Lua.LuaDoString("PetWait();"); MovementManager.StopMove(); Fight.StopFight(); if (WarlockPetAndConsumables.MyWarlockPet().Equals("Voidwalker")) { cast.PetSpell("Consume Shadows", false, true); } if (cast.OnSelf(HealthFunnel)) { Thread.Sleep(500); Usefuls.WaitIsCasting(); Lua.LuaDoString("PetFollow();"); return; } Lua.LuaDoString("PetFollow();"); } // Health Stone if (!WarlockPetAndConsumables.HaveHealthstone() && cast.OnSelf(CreateHealthStone)) { return; } // Create Soul Stone if (!WarlockPetAndConsumables.HaveSoulstone() && cast.OnSelf(CreateSoulstone)) { return; } // Use Soul Stone if (!Me.HaveBuff("Soulstone Resurrection") && CreateSoulstone.KnownSpell && ToolBox.HaveOneInList(WarlockPetAndConsumables.SoulStones()) && ToolBox.GetItemCooldown(WarlockPetAndConsumables.SoulStones()) <= 0) { MovementManager.StopMoveNewThread(); MovementManager.StopMoveToNewThread(); Lua.RunMacroText("/target player"); ToolBox.UseFirstMatchingItem(WarlockPetAndConsumables.SoulStones()); Usefuls.WaitIsCasting(); Lua.RunMacroText("/cleartarget"); } }
// Pet thread protected void PetThread(object sender, DoWorkEventArgs args) { while (Main.isLaunched) { try { if (StatusChecker.BasicConditions() && ObjectManager.Pet.IsValid && ObjectManager.Pet.IsAlive) { bool multiAggroImTargeted = false; // Pet Switch target on multi aggro if (Me.InCombatFlagOnly && ObjectManager.GetNumberAttackPlayer() > 1) { Lua.LuaDoString("PetDefensiveMode();"); // Get list of units targeting me in a multiaggro situation List <WoWUnit> unitsAttackingMe = ObjectManager.GetUnitAttackPlayer() .OrderBy(u => u.Guid) .Where(u => u.TargetObject.Guid == Me.Guid) .ToList(); foreach (WoWUnit unit in unitsAttackingMe) { multiAggroImTargeted = true; if (unit.Guid != ObjectManager.Pet.TargetObject.Guid && ObjectManager.Pet.TargetObject.Target == ObjectManager.Pet.Guid) { Logger.Log($"Forcing pet aggro on {unit.Name}"); Me.FocusGuid = unit.Guid; cast.PetSpell("PET_ACTION_ATTACK", true); if (WarlockPetAndConsumables.MyWarlockPet().Equals("Voidwalker")) { cast.PetSpell("Torment", true); cast.PetSpell("Suffering", true); } if (WarlockPetAndConsumables.MyWarlockPet().Equals("Felguard")) { cast.PetSpell("Anguish", true); } Lua.LuaDoString("ClearFocus();"); } } } // Pet attack on single aggro if ((Me.InCombatFlagOnly || Fight.InFight) && Me.Target > 0 && !multiAggroImTargeted) { Lua.LuaDoString("PetAttack();", false); } // Voidwalker Torment + Felguard Anguish if ((!settings.AutoTorment || !settings.AutoAnguish) && ObjectManager.Target.Target == Me.Guid && Me.InCombatFlagOnly) { if (WarlockPetAndConsumables.MyWarlockPet().Equals("Voidwalker")) { if (cast.PetSpell("Torment") || cast.PetSpell("Suffering")) { continue; } } if (WarlockPetAndConsumables.MyWarlockPet().Equals("Felguard")) { if (cast.PetSpell("Anguish")) { continue; } } } // Switch Auto Torment & Suffering off if (WarlockPetAndConsumables.MyWarlockPet().Equals("Voidwalker")) { ToolBox.TogglePetSpellAuto("Torment", settings.AutoTorment); ToolBox.TogglePetSpellAuto("Suffering", false); } // Switch Felguard Auto Cleave/Anguish if (WarlockPetAndConsumables.MyWarlockPet().Equals("Felguard") && specialization.RotationType == Enums.RotationType.Solo) { ToolBox.TogglePetSpellAuto("Cleave", settings.FelguardCleave); ToolBox.TogglePetSpellAuto("Anguish", settings.AutoAnguish); } } } catch (Exception arg) { Logging.WriteError(string.Concat(arg), true); } Thread.Sleep(300); } }
protected virtual void BuffRotation() { // Delete additional Soul Shards if (ToolBox.CountItemStacks("Soul Shard") > settings.NumberOfSoulShards) { Logger.Log("Deleting excess Soul Shard"); ToolBox.LuaDeleteOneItem("Soul Shard"); } // Define the demon to summon AIOSpell SummonSpell = null; bool shouldSummon = false; if (SummonImp.KnownSpell) { if (ToolBox.CountItemStacks("Soul Shard") < 1 || !SummonVoidwalker.KnownSpell && !SummonFelguard.KnownSpell) { SummonSpell = SummonImp; } if (SummonVoidwalker.KnownSpell && !SummonFelguard.KnownSpell) { SummonSpell = SummonVoidwalker; } if (specialization.RotationType == Enums.RotationType.Party) { SummonSpell = SummonImp; } if (SummonFelguard.KnownSpell) { SummonSpell = SummonFelguard; } if (!ObjectManager.Pet.IsValid || ObjectManager.Pet.ManaPercentage < settings.ManaThresholdResummon && SummonSpell != SummonImp || ObjectManager.Pet.HealthPercent < settings.HealthThresholdResummon || !SummonSpell.Name.Contains(WarlockPetAndConsumables.MyWarlockPet())) { shouldSummon = true; } } if (shouldSummon) { // Make sure we have mana to summon if (ObjectManager.Me.Mana < SummonSpell.Cost && !ObjectManager.Me.HaveBuff("Drink") && !Me.InCombatFlagOnly) { Logger.Log($"Not enough mana to summon {SummonSpell.Name}, forcing regen"); wManager.wManagerSetting.CurrentSetting.DrinkPercent = 95; Thread.Sleep(1000); return; } Thread.Sleep(Usefuls.Latency + 500); // Safety for Mount check if (!ObjectManager.Me.IsMounted && !ObjectManager.Me.IsOnTaxi) { if (cast.OnSelf(FelDomination)) { Thread.Sleep(200); } if (cast.OnSelf(SummonSpell)) { Usefuls.WaitIsCasting(); Thread.Sleep(1000); // Prevent double summon return; } } } else { wManager.wManagerSetting.CurrentSetting.DrinkPercent = _saveDrinkPercent; } }