private DeathKnightRunesState GetAvailableRunes() { uint runeCountTotal = (uint)me.Memory.ReadInt32(IntPtr.Zero + Offset.RuneCount); DeathKnightRunesState state = new DeathKnightRunesState(); state.bloodReady += (runeCountTotal & (1 << (int)DeathKnightRune.Blood1)) != 0 ? 1 : 0; state.bloodReady += (runeCountTotal & (1 << (int)DeathKnightRune.Blood2)) != 0 ? 1 : 0; state.frostReady += (runeCountTotal & (1 << (int)DeathKnightRune.Frost1)) != 0 ? 1 : 0; state.frostReady += (runeCountTotal & (1 << (int)DeathKnightRune.Frost2)) != 0 ? 1 : 0; state.unholyReady += (runeCountTotal & (1 << (int)DeathKnightRune.Unholy1)) != 0 ? 1 : 0; state.unholyReady += (runeCountTotal & (1 << (int)DeathKnightRune.Unholy2)) != 0 ? 1 : 0; return(state); }
public override void Tick() { Thread.Sleep(1); if (!me.GetObjectMgrAndPlayer()) { return; } Looting(); if (me.IsOnCooldown("Death Coil")) /* global cooldown check */ { return; } if (!me.Player.IsMounted() && !me.IsOnCooldown("Horn of Winter") && !me.HasAura(me.Player, "Horn of Winter")) { me.CastSpell("Horn of Winter"); return; } Int64 targetGUID = me.GetTargetGUID(); if (targetGUID == 0) { return; } GameObject target = me.ObjectManager.FirstOrDefault(gameObj => gameObj.GUID == targetGUID); if (target == null || target.Health == 0 || ci.remoteControl.CGUnit_C__UnitReaction(me.Player.GetAddress(), target.GetAddress()) > UnitReaction.Neutral) { return; } bool isTargetInMelee = me.Player.GetDistance(target) < DeathKnightConstants.MeleeRange; Vector3 targetCoords = target.Coordinates; if (!isTargetInMelee) { if (!me.Player.IsMoving() && !me.Player.IsMounted()) { ci.remoteControl.CGPlayer_C__ClickToMove(me.Player.GetAddress(), ClickToMoveType.AutoAttack, ref targetGUID, ref targetCoords, 1f); return; } } else { ci.remoteControl.CGPlayer_C__ClickToMoveStop(me.Player.GetAddress()); float angle = me.Player.Coordinates.AngleBetween(targetCoords); ci.remoteControl.CGPlayer_C__ClickToMove(me.Player.GetAddress(), ClickToMoveType.Face, ref targetGUID, ref targetCoords, angle); } bool isTargetBloodPlagueUp = me.HasAura(target, "Blood Plague", me.Player); bool isTargetFrostFeverUp = me.HasAura(target, "Frost Fever", me.Player); Console.WriteLine($"bp: {isTargetBloodPlagueUp}"); Console.WriteLine($"ff: {isTargetFrostFeverUp}"); DeathKnightRunesState runesState = GetAvailableRunes(); Console.WriteLine($"blood r: {runesState.bloodReady}"); Console.WriteLine($"frost r: {runesState.frostReady}"); Console.WriteLine($"unholy r: {runesState.unholyReady}"); if (isTargetInMelee && !isTargetBloodPlagueUp && runesState.unholyReady > 0) { me.CastSpell("Plague Strike"); Console.WriteLine("PS"); return; } if (!isTargetFrostFeverUp && runesState.frostReady > 0) { me.CastSpell("Icy Touch"); Console.WriteLine("IT"); return; } /* check for Pestilence possibility */ if (isTargetInMelee && (isTargetBloodPlagueUp && isTargetFrostFeverUp) && runesState.bloodReady > 0) { IEnumerable <GameObject> pestilenceEnemies = me.ObjectManager.Where(gameObj => gameObj.Type == GameObjectType.Unit && gameObj.Health > 0 && /* alive units */ gameObj.GUID != targetGUID && /* exclude target unit */ me.Player.GetDistance(gameObj) < DeathKnightConstants.PestilenceRange && /* unit in range */ ci.remoteControl.CGUnit_C__UnitReaction(me.Player.GetAddress(), gameObj.GetAddress()) <= UnitReaction.Neutral && /* unit attackable */ !me.HasAura(gameObj, "Blood Plague", me.Player) && /* unit doesn't have diseases */ !me.HasAura(gameObj, "Frost Fever", me.Player)); if (pestilenceEnemies.Any()) { me.CastSpell("Pestilence"); Console.WriteLine("Pesti"); return; } } if (isTargetInMelee && isTargetBloodPlagueUp && isTargetFrostFeverUp && runesState.unholyReady > 0 && runesState.frostReady > 0) { if (me.Player.HealthPct >= 80) { me.CastSpell("Scourge Strike"); Console.WriteLine("SS"); return; } else { me.CastSpell("Death Strike"); Console.WriteLine("DS"); return; } } Int32 runicPower = me.Player.RunicPower; if (runicPower >= 40) { me.CastSpell("Death Coil"); Console.WriteLine("DC"); return; } /* use Blood Strike only when having 2 Blood Runes ready, to have always Pestilence ready to use */ if (isTargetInMelee && isTargetBloodPlagueUp && isTargetFrostFeverUp && runesState.bloodReady == 2) { me.CastSpell("Blood Strike"); return; } }
public override void Tick() { Thread.Sleep(ProdMbox.ClientSolutionSleepMs); me.RefreshLastHardwareEvent(); if (me.CastPrioritySpell()) { return; } if (!me.GetObjectMgrAndPlayer()) { return; } if (!mbox.slavesAI) { return; } LootAround(me); if (me.IsOnCooldown("Death Coil")) /* global cooldown check */ { return; } if (mbox.buffingAI) { BuffUp(me, mbox, PartyBuffs, SelfBuffs, null); } Int64[] targetGuids = GetRaidTargetGuids(me); GameObject target = SelectRaidTargetByPriority(targetGuids, AttackPriorities, me); if (target == null) { return; } if (me.GetTargetGUID() != target.GUID) { me.ControlInterface.remoteControl.SelectUnit(target.GUID); } if (me.Player.GetDistance(target) > MeleeAttackRange) { return; } else { FaceTowards(me, target); } if (!me.Player.IsCastingOrChanneling()) { if (!me.Player.IsAutoAttacking()) { me.ExecLua("AttackTarget();PetAttack()"); } DeathKnightRunesState runesState = GetAvailableRunes(); bool isTargetBloodPlagueUp = me.HasAuraEx(target, "Blood Plague", me.Player); bool isTargetFrostFeverUp = me.HasAuraEx(target, "Frost Fever", me.Player); if (target.Health > ProdMbox.BigHealthThreshold) { if (!isTargetBloodPlagueUp && runesState.unholyReady > 0) { me.CastSpell("Plague Strike"); return; } if (!isTargetFrostFeverUp && runesState.frostReady > 0) { me.CastSpell("Icy Touch"); return; } /* check for Pestilence possibility */ if (isTargetBloodPlagueUp && isTargetFrostFeverUp && runesState.bloodReady > 0) { IEnumerable <GameObject> pestilenceEnemies = me.ObjectManager.Where(gameObj => gameObj.Type == GameObjectType.Unit && gameObj.Health > 0 && /* alive units */ gameObj.GUID != target.GUID && /* exclude target unit */ me.Player.GetDistance(gameObj) < DeathKnightConstants.PestilenceRange && /* unit in range */ me.ControlInterface.remoteControl.CGUnit_C__UnitReaction(me.Player.GetAddress(), gameObj.GetAddress()) <= UnitReaction.Neutral && /* unit attackable */ !me.HasAuraEx(gameObj, "Blood Plague", me.Player) && /* unit doesn't have diseases */ !me.HasAuraEx(gameObj, "Frost Fever", me.Player)); if (pestilenceEnemies.Any()) { me.CastSpell("Pestilence"); return; } } if (isTargetBloodPlagueUp && isTargetFrostFeverUp && runesState.unholyReady > 0 && runesState.frostReady > 0) { if (me.Player.HealthPct >= 80) { me.CastSpell("Scourge Strike"); return; } else { me.CastSpell("Death Strike"); return; } } Int32 runicPower = me.Player.RunicPower; if (runicPower >= 40) { me.CastSpell("Death Coil"); return; } /* use Blood Strike only when having 2 Blood Runes ready, to have always Pestilence ready to use */ if (isTargetBloodPlagueUp && isTargetFrostFeverUp && runesState.bloodReady == 2) { me.CastSpell("Blood Strike"); return; } } else { if (!isTargetBloodPlagueUp && runesState.unholyReady > 0) { me.CastSpell("Plague Strike"); return; } if (isTargetBloodPlagueUp && isTargetFrostFeverUp && runesState.unholyReady > 0 && runesState.frostReady > 0) { if (me.Player.HealthPct >= 80) { me.CastSpell("Scourge Strike"); return; } else { me.CastSpell("Death Strike"); return; } } Int32 runicPower = me.Player.RunicPower; if (runicPower >= 40) { me.CastSpell("Death Coil"); return; } if (isTargetBloodPlagueUp && isTargetFrostFeverUp && runesState.bloodReady > 0) { me.CastSpell("Blood Strike"); return; } } } }