using System;
using System.Linq;
using Mammon.Dynamics;
using Mammon.Helpers;
using Zeta;
using Zeta.Common;
using Zeta.CommonBot;
using Zeta.Internals.Actors;
using Zeta.TreeSharp;
using Action = Zeta.TreeSharp.Action;
namespace Mammon.Routines
{
public class Wizard
{
private static int ClusterCount { get { return Clusters.GetClusterCount(ZetaDia.Me, CombatTargeting.Instance.LastObjects, ClusterType.Radius, 20f); } }
[Class(ActorClass.Wizard)]
[Behavior(BehaviorType.OutOfCombat)]
[Priority(2)]
public static Composite WizardBuff()
{
return
new PrioritySelector(
Spell.Buff(SNOPower.Wizard_IceArmor, extra => !ZetaDia.Me.HasBuff(SNOPower.Wizard_IceArmor)),
Spell.Buff(SNOPower.Wizard_StormArmor, extra => !ZetaDia.Me.HasBuff(SNOPower.Wizard_StormArmor)),
Spell.Buff(SNOPower.Wizard_EnergyArmor, extra => !ZetaDia.Me.HasBuff(SNOPower.Wizard_EnergyArmor)),
Spell.Buff(SNOPower.Wizard_MagicWeapon, extra => !ZetaDia.Me.HasBuff(SNOPower.Wizard_MagicWeapon))
);
}
[Class(ActorClass.Wizard)]
[Behavior(BehaviorType.Combat)]
[Priority(1)]
public static Composite WizardCombat()
{
return
new PrioritySelector(ctx => CombatTargeting.Instance.FirstNpc,
Common.CreateWaitWhileIncapacitated(),
Common.CreateWaitForAttack(),
Common.CreateUsePotion(),
// Make sure we are within range/line of sight of the unit.
Movement.MoveTo(ctx => ((DiaUnit)ctx).Position, 40f),
//Movement.MoveToLineOfSight(ctx => ((DiaUnit)ctx)),
// Low health stuff
Spell.CastAOESpell(SNOPower.Wizard_DiamondSkin, extra => ZetaDia.Me.HitpointsCurrentPct <= 0.3),
Spell.Buff(SNOPower.Wizard_MirrorImage, extra => ZetaDia.Me.HitpointsCurrentPct <= 0.4),
//Buffs
Spell.Buff(SNOPower.Wizard_IceArmor, extra => !ZetaDia.Me.HasBuff(SNOPower.Wizard_IceArmor)),
Spell.Buff(SNOPower.Wizard_StormArmor, extra => !ZetaDia.Me.HasBuff(SNOPower.Wizard_StormArmor)),
Spell.Buff(SNOPower.Wizard_EnergyArmor, extra => !ZetaDia.Me.HasBuff(SNOPower.Wizard_EnergyArmor)),
Spell.Buff(SNOPower.Wizard_MagicWeapon, extra => !ZetaDia.Me.HasBuff(SNOPower.Wizard_MagicWeapon)),
Spell.Buff(SNOPower.Wizard_Familiar, extra => !HasFamiliar),
// AoE spells.
Spell.CastAOESpell(SNOPower.Wizard_WaveOfForce, extra => ClusterCount >= 4,
require => Zeta.CommonBot.PowerManager.CanCast(Wizard_WaveOfForce) && CombatTargeting.Instance.FirstNpc.Distance < 6f
),
Spell.CastAOESpell(SNOPower.Wizard_FrostNova, extra => ClusterCount >= 2),
require => Zeta.CommonBot.PowerManager.CanCast(Wizard_FrostNova) && CombatTargeting.Instance.FirstNpc.Distance < 6f
),
Spell.CastOnUnit(SNOPower.Wizard_EnergyTwister, ctx => ((DiaUnit)ctx).ACDGuid, extra => ClusterCount >= 2),
require => Zeta.CommonBot.PowerManager.CanCast(Wizard_EnergyTwister) && CombatTargeting.Instance.FirstNpc.Distance < 18f
),
Spell.CastOnUnit(SNOPower.Wizard_Meteor, ctx => ((DiaUnit)ctx).ACDGuid, extra => Clusters.GetClusterCount(ZetaDia.Me, CombatTargeting.Instance.LastObjects, ClusterType.Radius, 6f) >= 4),
Spell.CastOnUnit(SNOPower.Wizard_Blizzard, ctx => ((DiaUnit)ctx).ACDGuid, extra => Clusters.GetClusterCount(ZetaDia.Me, CombatTargeting.Instance.LastObjects, ClusterType.Radius, 6f) >= 4),
Spell.CastAOESpell(SNOPower.Wizard_ExplosiveBlast, extra => ClusterCount >= 3),
require => Zeta.CommonBot.PowerManager.CanCast(Wizard_ExplosiveBlast) && CombatTargeting.Instance.FirstNpc.Distance < 6f
),
//Hydra
Spell.CastAtLocation(SNOPower.Wizard_Hydra, ctx => ((DiaUnit)ctx).Position, exta => !HasHydra),
// Arcane power spenders.
Spell.CastOnUnit(SNOPower.Wizard_ArcaneOrb, ctx => ((DiaUnit)ctx).ACDGuid),
Spell.CastOnUnit(SNOPower.Wizard_RayOfFrost, ctx => ((DiaUnit)ctx).ACDGuid),
Spell.CastOnUnit(SNOPower.Wizard_ArcaneTorrent, ctx => ((DiaUnit)ctx).ACDGuid),
Spell.CastOnUnit(SNOPower.Wizard_Disintegrate, ctx => ((DiaUnit)ctx).ACDGuid),
// Signature spells.
Spell.CastOnUnit(SNOPower.Wizard_SpectralBlade, ctx => ((DiaUnit)ctx).ACDGuid),
Spell.CastOnUnit(SNOPower.Wizard_Electrocute, ctx => ((DiaUnit)ctx).ACDGuid),
Spell.CastOnUnit(SNOPower.Wizard_ShockPulse, ctx => ((DiaUnit)ctx).ACDGuid),
Spell.CastOnUnit(SNOPower.Wizard_MagicMissile, ctx => ((DiaUnit)ctx).ACDGuid)
);
}
public static bool HasFamiliar
{
get
{
int dynId = ZetaDia.Me.CommonData.DynamicId;
var summoned = ZetaDia.Actors.GetActorsOfType<DiaUnit>().FirstOrDefault(u => u.SummonedByACDId == dynId && u.Name.Contains("Familiar"));
return summoned != null;
}
}
public static bool HasHydra
{
get
{
int dynId = ZetaDia.Me.CommonData.DynamicId;
var summoned = ZetaDia.Actors.GetActorsOfType<DiaUnit>().FirstOrDefault(u => u.SummonedByACDId == dynId && u.Name.Contains("Hydra"));
return summoned != null;
}
}
public static void WizardOnLevelUp(object sender, EventArgs e)
{
if (ZetaDia.Me.ActorClass != ActorClass.Wizard)
return;
int myLevel = ZetaDia.Me.Level;
Logger.Write("Player leveled up, congrats! Your level is now: {0}",
myLevel
);
// Set Ray of Frost as secondary spell.
if (myLevel == 2)
{
ZetaDia.Me.SetActiveSkill(SNOPower.Wizard_RayOfFrost, -1, 1);
Logger.Write("Setting Ray of Frost as Secondary");
}
// Set Shock Pulse as primary.
if (myLevel == 3)
{
ZetaDia.Me.SetActiveSkill(SNOPower.Wizard_ShockPulse, -1, 0);
Logger.Write("Setting Shock Pulse as Primary");
}
if (myLevel == 4)
{
ZetaDia.Me.SetActiveSkill(SNOPower.Wizard_FrostNova, -1, 2);
Logger.Write("Setting Frost Nova as Defensive");
}
if (myLevel == 5)
{
ZetaDia.Me.SetActiveSkill(SNOPower.Wizard_ArcaneOrb, -1, 1);
Logger.Write("Setting Arcane Orb as Secondary");
}
if (myLevel == 8)
{
ZetaDia.Me.SetActiveSkill(SNOPower.Wizard_DiamondSkin, -1, 2);
Logger.Write("Setting Diamond Skin as Defensive");
}
if (myLevel == 9)
{
ZetaDia.Me.SetActiveSkill(SNOPower.Wizard_WaveOfForce, -1, 3);
Logger.Write("Setting Wave of Force as Force");
ZetaDia.Me.SetActiveSkill(SNOPower.Wizard_ShockPulse, -1, 2);
Logger.Write("Changing rune for Shock Pulse: \"Explosive Bolts\"");
}
// First passive skill!
if (myLevel == 10)
{
// Blur - Decreases melee damage taken by 20%.
ZetaDia.Me.SetTraits(SNOPower.Wizard_Passive_Blur);
}
if (myLevel == 11)
{
ZetaDia.Me.SetActiveSkill(SNOPower.Wizard_ArcaneOrb, 2, 1);
Logger.Write("Changing rune for Arcane Orb: \"Obliteration\"");
}
}
}
}