예제 #1
0
        private async Task <bool> MainCoroutine()
        {
            if (IsDone)
            {
                return(false);
            }

            // move to cannon.
            if (!Query.IsInVehicle())
            {
                if (VehicleId == 0)
                {
                    BehaviorDone("Not in a vehicle and no VehicleId is specified");
                    return(false);
                }

                // enable combat while not in a vehicle
                if ((LevelBot.BehaviorFlags & BehaviorFlags.Combat) == 0)
                {
                    LevelBot.BehaviorFlags |= BehaviorFlags.Combat;
                }

                return(await UtilityCoroutine.MountVehicle(
                           VehicleSearchLocation,
                           MovementBy,
                           u => !Query.IsInCompetition(u, NonCompeteDistance),
                           VehicleId));
            }

            // Disable combat while in a vehicle
            if ((LevelBot.BehaviorFlags & BehaviorFlags.Combat) != 0)
            {
                LevelBot.BehaviorFlags &= ~BehaviorFlags.Combat;
            }

            while (!IsDone && Query.IsInVehicle())
            {
                // find the first weapon that is ready.
                var weapon = Weapons.FirstOrDefault(w => w.IsWeaponReady());
                if (weapon != null)
                {
                    //_target = StyxWoW.Me.CurrentTarget;
                    if (!Query.IsViable(_target) || _target.IsDead ||
                        !weapon.WeaponAim(_target))
                    {
                        // acquire a target that is within shooting range
                        _target = Npcs.FirstOrDefault(n => weapon.WeaponAim(n));
                        await Coroutine.Sleep((int)Delay.BeforeButtonClick.TotalMilliseconds);

                        return(true);
                    }
                    // fire away.
                    if (Query.IsViable(_target) && weapon.WeaponAim(_target) && weapon.WeaponFire())
                    {
                        await Coroutine.Sleep((int)Delay.AfterWeaponFire.TotalMilliseconds);
                    }
                }
                await Coroutine.Yield();
            }
            return(false);
        }