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); } }
//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); }