private void SpawnEscortGrid(PrefabGrid prefabGrid, Vector3D naturalGravity, EscortPosition escortPosition, UnitType convoyUnitType, IMyCubeGrid convoyLeaderGrid) { var positionToSpawn = Convoy.GetEscortPositionVector(convoyLeaderGrid, naturalGravity, escortPosition, GetAdditionalHeightModifier(convoyUnitType)); var factionId = convoyLeaderGrid.GetGridControllerFaction(); var forwards = convoyLeaderGrid.WorldMatrix.Forward; DuckUtils.SpawnInGravity(positionToSpawn, naturalGravity, factionId, prefabGrid.PrefabName, prefabGrid.InitialBeaconName, forwards); }
private void SendEscortToPosition(EscortPosition position, IMyCubeGrid escort, Vector3D targetPosition) { var slimBlocks = new List <IMySlimBlock>(); escort.GetBlocks(slimBlocks, b => b.FatBlock is IMyRemoteControl); foreach (var slim in slimBlocks) { var remoteControl = slim.FatBlock as IMyRemoteControl; remoteControl.ClearWaypoints(); var escortPosition = GetEscortPositionVector(targetPosition, remoteControl.GetNaturalGravity(), position, GetAdditionalHeightModifier()); remoteControl.AddWaypoint(escortPosition, "Target"); remoteControl.SetAutoPilotEnabled(true); } }
private void SendEscortToGrid(EscortPosition position, IMyCubeGrid escort, IMyEntity convoyLeaderGrid) { var slimBlocks = new List <IMySlimBlock>(); escort.GetBlocks(slimBlocks, b => b.FatBlock is IMyRemoteControl); foreach (var slim in slimBlocks) { // TODO: Make intelligent escorts var remoteControl = slim.FatBlock as IMyRemoteControl; remoteControl.ClearWaypoints(); var escortPosition = GetEscortPositionVector(convoyLeaderGrid, remoteControl.GetTotalGravity(), position, GetAdditionalHeightModifier()); remoteControl.AddWaypoint(escortPosition, "Target"); remoteControl.SetAutoPilotEnabled(true); } }
internal static Vector3D GetEscortPositionVector(IMyEntity convoyLeaderGrid, Vector3D gravity, EscortPosition escortPosition, int additionalHeightModifier) { var deliveryShipPosition = convoyLeaderGrid.GetPosition(); switch (escortPosition) { case EscortPosition.GroundLeft: return(deliveryShipPosition + convoyLeaderGrid.WorldMatrix.Left * 20); case EscortPosition.GroundRight: return(deliveryShipPosition + convoyLeaderGrid.WorldMatrix.Right * 20); case EscortPosition.AboveLeft: return(deliveryShipPosition + convoyLeaderGrid.WorldMatrix.Left * 10 - gravity * (2 + additionalHeightModifier)); case EscortPosition.AboveRight: return(deliveryShipPosition + convoyLeaderGrid.WorldMatrix.Right * 10 - gravity * (2 + additionalHeightModifier)); case EscortPosition.AboveLeftFar: return(deliveryShipPosition + convoyLeaderGrid.WorldMatrix.Left * 20 - gravity * (3 + additionalHeightModifier)); case EscortPosition.AboveRightFar: return(deliveryShipPosition + convoyLeaderGrid.WorldMatrix.Right * 20 - gravity * (3 + additionalHeightModifier)); case EscortPosition.AboveLeftSuperFar: return(deliveryShipPosition + convoyLeaderGrid.WorldMatrix.Left * 30 - gravity * (4 + additionalHeightModifier)); case EscortPosition.AboveRightSuperFar: return(deliveryShipPosition + convoyLeaderGrid.WorldMatrix.Right * 30 - gravity * (4 + additionalHeightModifier)); default: throw new ArgumentException("Uncoped for escort position: " + escortPosition); } }
internal static Vector3D GetEscortPositionVector(Vector3D deliveryShipPosition, Vector3D gravity, EscortPosition escortPosition, int additionalHeightModifier) { switch (escortPosition) { case EscortPosition.GroundLeft: return(deliveryShipPosition + GetPerpendicularVector(ref gravity, Degrees90) * 2); case EscortPosition.GroundRight: return(deliveryShipPosition + GetPerpendicularVector(ref gravity, Degrees270) * 2); case EscortPosition.AboveLeft: return(deliveryShipPosition + GetPerpendicularVector(ref gravity, Degrees90) - gravity * (2 + additionalHeightModifier)); case EscortPosition.AboveRight: return(deliveryShipPosition + GetPerpendicularVector(ref gravity, Degrees270) - gravity * (2 + additionalHeightModifier)); case EscortPosition.AboveLeftFar: return(deliveryShipPosition + GetPerpendicularVector(ref gravity, Degrees90) * 2 - gravity * (3 + additionalHeightModifier)); case EscortPosition.AboveRightFar: return(deliveryShipPosition + GetPerpendicularVector(ref gravity, Degrees270) * 2 - gravity * (3 + additionalHeightModifier)); case EscortPosition.AboveLeftSuperFar: return(deliveryShipPosition + GetPerpendicularVector(ref gravity, Degrees90) * 3 - gravity * (4 + additionalHeightModifier)); case EscortPosition.AboveRightSuperFar: return(deliveryShipPosition + GetPerpendicularVector(ref gravity, Degrees270) * 3 - gravity * (4 + additionalHeightModifier)); default: throw new ArgumentException("Uncoped for escort position: " + escortPosition); } }