示例#1
0
        public void UpdateFighter()
        {
            try
            {
                bool followingCommandShip = commandShip.IsOperational();
                if (commandShip != null)
                {
                    if (!followingCommandShip)
                    {
                        commandShip = null;
                    }
                    else
                    {
                        defaultOrbitPoint = commandShip.GetPosition();
                    }
                }

                Logger.Debug("==== fighter Update:");
                UpdateHealthPercent();
                weaponControls.DisableWeapons();

                var isOperational = IsOperational();
                Logger.Debug("operational = " + isOperational);
                if (isOperational)
                {
                    Logger.Debug("operational");
                    var hasAvoidanceVectors = CalculateAvoidanceVectors();
                    //var AnyTargetsInfront = CheckForHeadonCollision();
                    avoidanceVector.Normalize();

                    var target = weaponControls.GetEnemyTarget();

                    var targetLocked = target != null;
                    if (targetLocked)
                    {
                        Logger.Debug("Has Target " + target);

                        IMyTerminalBlock targetblock = null;
                        targetblock = weaponControls.GetTargetKeyAttackPoint(target.Ship);

                        Logger.Debug("Has TargetBlock " + targetblock);
                        var targetPoition = targetblock != null
                            ? targetblock.GetPosition()
                            : target.Ship.GetPosition();

                        Logger.Debug("Target Position " + targetPoition);

                        var awayDir     = _cubeGrid.GetPosition() - target.Ship.GetPosition();
                        var dirTotarget = targetPoition - _cubeGrid.GetPosition();
                        var distance    = dirTotarget.Length() - target.ShipSize;
                        dirTotarget.Normalize();
                        var avoidTargetVector = avoidanceVector * 100;//*dirTotarget;
                        if (distance > breakawayDistance)
                        {
                            //Util.NotifyHud(hasAvoidanceVectors + " has vectors " + avoidanceVector);
                            if (hasAvoidanceVectors)
                            {
                                navigation.ThrustTwordsDirection(avoidTargetVector);
                                AlignTo(_cubeGrid.GetPosition() - avoidTargetVector);
                                _currentNavigationAction = DroneNavigationActions.Avoiding;
                            }
                            else
                            {
                                //if(distance > breakawayDistance*3)
                                navigation.CombatApproach(targetPoition);
                                _currentWeaponAction     = DroneWeaponActions.LockedOn;
                                _currentNavigationAction = DroneNavigationActions.AttackRun;

                                var falloff   = target.Ship.Physics.LinearVelocity - _cubeGrid.Physics.LinearVelocity;
                                var alignment = AlignTo(targetPoition + falloff);
                                if (alignment <= 1)
                                {
                                    if (distance < 900)
                                    {
                                        weaponControls.EnableWeapons();
                                    }

                                    if (alignment <= 1)
                                    {
                                        navigation.StopSpin();
                                    }
                                }
                            }
                            breakawayDistance = 75;
                            attacking         = true;
                        }
                        else
                        {
                            _currentNavigationAction = DroneNavigationActions.BreakAway;
                            navigation.ThrustTwordsDirection(avoidTargetVector);
                            AlignTo(_cubeGrid.GetPosition() - avoidTargetVector);

                            breakawayDistance = 600;
                            attacking         = false;
                        }
                    }
                    else
                    {
                        _currentWeaponAction = DroneWeaponActions.Standby;
                        if (!hasAvoidanceVectors)
                        {
                            FighterOrbit(defaultOrbitPoint);
                            _currentNavigationAction = DroneNavigationActions.Orbiting;
                        }
                        else
                        {
                            navigation.ThrustTwordsDirection(avoidanceVector);
                            AlignTo(_cubeGrid.GetPosition() - avoidanceVector);
                            _currentNavigationAction = DroneNavigationActions.Avoiding;
                            breakawayDistance        = 150;
                            attacking = false;
                        }
                    }
                    Broadcast();
                    if (_cubeGrid.Physics.LinearVelocity.Normalize() > 60)
                    {
                        navigation.SlowDown();
                    }
                }
            }
            catch (Exception e)
            {
                Logger.LogException(e);
            }
        }
示例#2
0
文件: Drone.cs 项目: ESearcy/SE_MOD
        //Working - and damn good I might add
        //returns status means -1 = not activated, 0 = notEngaged, 1 = InCombat
        public int Guard(Vector3D position)
        {
            if (_bulletSpeed < 400)
            {
                _bulletSpeed += 100;
            }
            else
            {
                _bulletSpeed = 100;
            }

            var targetVector = Vector3D.Zero;
            var target       = Vector3D.Zero;


            ManualFire(false);
            float enemyShipRadius = _defaultOrbitRange;
            var   enemyTarget     = tc.FindEnemyTarget();
            var   avoidanceVector = navigation.GetWeightedCollisionAvoidanceVectorForNearbyStructures();

            if (enemyTarget != null)
            {
                target = enemyTarget.GetPosition();

                var keyPoint = tc.GetTargetKeyAttackPoint(enemyTarget);
                enemyShipRadius = tc.GetTargetSize(enemyTarget);
                if (keyPoint != null)
                {
                    target       = keyPoint.GetPosition();
                    targetVector = enemyTarget.Physics.LinearVelocity;
                }
            }
            else if (tc.GetEnemyPlayer() != null)
            {
                target = tc.GetEnemyPlayer().GetPosition();
            }

            if (target != Vector3D.Zero)
            {
                var distance           = (position - Ship.GetPosition()).Length();
                var distanceFromTarget = (target - Ship.GetPosition()).Length();

                double   distanceVect = (target - Ship.GetPosition()).Length() / _bulletSpeed;
                Vector3D compAmount   = targetVector - Ship.Physics.LinearVelocity;
                Vector3D compVector   = new Vector3D(compAmount.X * distanceVect, compAmount.Y * distanceVect, compAmount.Z * distanceVect);

                if (distance > _maxAttackRange)
                {
                    _currentNavigationAction = DroneNavigationActions.Approaching;
                    Approach(position);
                }
                else
                {
                    _currentNavigationAction = DroneNavigationActions.Orbiting;


                    if (avoidanceVector != Vector3D.Zero)
                    {
                        if (Ship.Physics.LinearVelocity.Normalize() > _maxAvoidanceSpeed)
                        {
                            navigation.SlowDown();
                        }
                        else
                        {
                            navigation.WeightedThrustTwordsDirection(avoidanceVector);
                        }
                        _currentNavigationAction = DroneNavigationActions.Avoiding;
                    }
                    else
                    {
                        AimFreeOrbit(target, enemyShipRadius * _radiusOrbitmultiplier);
                    }
                    //KeepAtCombatRange(target, targetVector);
                    double alignment = AlignTo(target + compVector);


                    if (alignment < 1)
                    {
                        _currentWeaponAction = DroneWeaponActions.Attacking;
                        ManualFire(true);
                    }
                    else
                    {
                        _currentWeaponAction = DroneWeaponActions.LockedOn;
                        ManualFire(false);
                    }
                }
            }
            else if (avoidanceVector != Vector3D.Zero)
            {
                if (Ship.Physics.LinearVelocity.Normalize() > _maxAvoidanceSpeed)
                {
                    navigation.SlowDown();
                }
                else
                {
                    AlignTo(avoidanceVector);
                    navigation.WeightedThrustTwordsDirection(avoidanceVector);
                }
                _currentNavigationAction = DroneNavigationActions.Avoiding;
                _currentWeaponAction     = DroneWeaponActions.Standby;
            }
            else
            {
                _currentWeaponAction     = DroneWeaponActions.Standby;
                _currentNavigationAction = DroneNavigationActions.Approaching;
                Orbit(position);
                //ManualFire(false);
            }

            return(0);
        }