// AURA CAST AND GOLEM CAST
// Modified from ExVault's MapRunner.
private static async Task CastAuras(IEnumerable<Skill> auras)
{
int slotForHidden = AllAuras.First(a => a.IsOnSkillBar).Slot;
foreach (var aura in auras.OrderBy(a => a.Slot))
{
if (aura.Slot == -1)
{
await SetAuraToSlot(aura, slotForHidden);
}
await ApplyAura(aura);
}
}
private static async Task ApplyAura(Skill aura)
{
const int timeout = 5000;
Log.InfoFormat("[ApplyAura] Now casting {0}.", aura.Name);
var isUsed = SkillBar.Use(aura.Slot, false);
if (isUsed != LokiPoe.InGameState.UseError.None)
{
Log.ErrorFormat("[ApplyAura] Fail to cast {0}. Error: {1}", aura.Name, isUsed);
return;
}
var timer = Stopwatch.StartNew();
while (timer.ElapsedMilliseconds < timeout)
{
if (!LokiPoe.Me.HasCurrentAction && PlayerHasAura(aura.Name))
{
//just in case... another 200 ms
await Coroutine.Sleep(Utility.LatencySafeValue(100));
return;
}
Log.Debug("[ApplyAura] Waiting for aura applying.");
await Coroutine.Sleep(100);
}
Log.Error("[ApplyAura] Aura applying timeout.");
}
private static async Task SetGolemToSlot(Skill golem, int slot)
{
const int timeout = 3000;
Log.InfoFormat("[SetGolemToSlot] Now setting {0} to slot {1}.", golem.Name, slot);
var isSet = SkillBar.SetSlot(slot, golem);
if (isSet != LokiPoe.InGameState.SetSlotError.None)
{
Log.ErrorFormat("[SetGolemToSlot] Fail to set {0} to slot {1}. Error: {2}", golem.Name, slot, isSet);
return;
}
var timer = Stopwatch.StartNew();
while (timer.ElapsedMilliseconds < timeout)
{
if (!LokiPoe.Me.HasCurrentAction && SkillBar.Slot(slot).Name == golem.Name)
{
//just in case... another 200 ms
await Coroutine.Sleep(Utility.LatencySafeValue(100));
return;
}
Log.Debug("[SetGolemToSlot] Waiting for aura slot setting.");
await Coroutine.Sleep(100);
}
Log.Error("[SetGolemToSlot] Aura slot setting timeout.");
}
private static async Task SetAuraToSlot(Skill aura, int slot)
{
const int timeout = 3000;
Log.InfoFormat("[SetAuraToSlot] Now setting {0} to slot {1}.", aura.Name, slot);
var isSet = SkillBar.SetSlot(slot, aura);
if (isSet != LokiPoe.InGameState.SetSlotError.None)
{
Log.ErrorFormat("[SetAuraToSlot] Fail to set {0} to slot {1}. Error: {2}", aura.Name, slot, isSet);
return;
}
var timer = Stopwatch.StartNew();
while (timer.ElapsedMilliseconds < timeout)
{
if (!LokiPoe.Me.HasCurrentAction && SkillBar.Slot(slot).Name == aura.Name)
{
//just in case... another 200 ms
await Coroutine.Sleep(Utility.LatencySafeValue(100));
return;
}
Log.Debug("[SetAuraToSlot] Waiting for aura slot setting.");
await Coroutine.Sleep(100);
}
Log.Error("[SetAuraToSlot] Aura slot setting timeout.");
}
private static List<Skill> GetAurasForCast()
{
List<Skill> result = new List<Skill>();
foreach (var aura in AllAuras)
{
//if (MapRunnerSettings.Instance.IgnoreHiddenAuras && aura.Slot == -1) continue;
if (!PlayerHasAura(aura.Name))
{
result.Add(aura);
}
}
return result;
}
private static IEnumerable<Skill> AllAuras
{
get { return SkillBar.Skills.Where(skill => AuraNames.Contains(skill.Name)); }
}
private static bool PlayerHasAura(string auraName)
{
return LokiPoe.Me.Auras
.Any(a => a.Name.Equals(auraName, StringComparison.OrdinalIgnoreCase) ||
a.Name.Equals((auraName + " aura"), StringComparison.OrdinalIgnoreCase));
}
private static readonly HashSet<string> AuraNames = new HashSet<string>
{
"Vaal Haste"
};