public virtual async Task<bool> Gather(GatherCollectableTag tag) { while (tag.Node.CanGather && GatheringManager.SwingsRemaining > 0 && Behaviors.ShouldContinue) { await Wait(); if (GatheringManager.GatheringCombo == 4 && GatheringManager.SwingsRemaining > 0) { await tag.Cast(Ability.IncreaseGatherChanceQuality100); await Wait(); } if (!await tag.ResolveGatherItem()) { return false; } var swingsRemaining = GatheringManager.SwingsRemaining - 1; if (!tag.GatherItem.TryGatherItem()) { return false; } var ticks = 0; while (swingsRemaining != GatheringManager.SwingsRemaining && ticks < 60 && Behaviors.ShouldContinue) { await Coroutine.Yield(); ticks++; } } return true; }