protected async Task Fight() { if (playerReader.Bits.HasPet && !playerReader.PetHasTarget) { await input.TapPetAttack(""); } foreach (var item in Keys) { if (!playerReader.HasTarget) { logger.LogInformation($"{GetType().Name}: Lost Target!"); await stopMoving.Stop(); return; } else { lastKnwonPlayerDirection = playerReader.Direction; lastKnownMinDistance = playerReader.MinRange; lastKnownMaxDistance = playerReader.MaxRange; } if (await castingHandler.CastIfReady(item, item.DelayBeforeCast)) { if (item.Name == classConfiguration.Approach.Name || item.Name == classConfiguration.AutoAttack.Name) { await castingHandler.ReactToLastUIErrorMessage($"{GetType().Name}: Fight {item.Name}"); } break; } } }
protected async Task WaitForWithinMeleeRange(KeyAction item, bool lastCastSuccess) { await stopMoving.Stop(); await wait.Update(1); var start = DateTime.Now; var lastKnownHealth = playerReader.HealthCurrent; int maxWaitTime = 10; Log($"Waiting for the target to reach melee range - max {maxWaitTime}s"); while (playerReader.HasTarget && !playerReader.IsInMeleeRange && (DateTime.Now - start).TotalSeconds < maxWaitTime) { if (playerReader.HealthCurrent < lastKnownHealth) { Log("Got damage. Stop waiting for melee range."); break; } if (playerReader.IsTargetCasting) { Log("Target started casting. Stop waiting for melee range."); break; } if (lastCastSuccess && addonReader.UsableAction.Is(item)) { Log($"While waiting, repeat current action: {item.Name}"); lastCastSuccess = await castingHandler.CastIfReady(item, item.DelayBeforeCast); Log($"Repeat current action: {lastCastSuccess}"); } await wait.Update(1); } }
public override async Task PerformAction() { if (Keys.Any(k => k.StopBeforeCast)) { await stopMoving.Stop(); await wait.Update(1); if (playerReader.Bits.IsMounted) { await input.TapDismount(); await wait.Update(1); //if (!await Wait(1000, () => playerReader.PlayerBitValues.PlayerInCombat)) return; // vanilla after dismout GCD } } await AsyncExt.Loop(Keys, async (KeyAction key) => { var pressed = await castingHandler.CastIfReady(key, key.DelayBeforeCast); key.ResetCooldown(); key.SetClicked(); }); bool wasDrinkingOrEating = playerReader.Buffs.Drinking || playerReader.Buffs.Eating; logger.LogInformation($"Waiting for {Name}"); DateTime startTime = DateTime.Now; while ((playerReader.Buffs.Drinking || playerReader.Buffs.Eating || playerReader.IsCasting) && !playerReader.Bits.PlayerInCombat) { await wait.Update(1); if (playerReader.Buffs.Drinking && playerReader.Buffs.Eating) { if (playerReader.ManaPercentage > 98 && playerReader.HealthPercent > 98) { break; } } else if (playerReader.Buffs.Drinking) { if (playerReader.ManaPercentage > 98) { break; } } else if (playerReader.Buffs.Eating) { if (playerReader.HealthPercent > 98) { break; } } if ((DateTime.Now - startTime).TotalSeconds >= 25) { logger.LogInformation($"Waited (25s) long enough for {Name}"); break; } } if (wasDrinkingOrEating) { await input.TapStandUpKey(); } }