Exemplo n.º 1
0
 /// <summary>
 /// The vessel has changed as it has less crew now so send the definition
 /// </summary>
 public void OnCrewTransfered(GameEvents.HostedFromToAction <ProtoCrewMember, Part> data)
 {
     VesselProtoSystem.Singleton.MessageSender.SendVesselMessage(data.from.vessel, true);
 }
Exemplo n.º 2
0
        public static void SetOrbit(this Vessel vessel, Orbit newOrbit)
        {
            var destinationMagnitude = newOrbit.getRelativePositionAtUT(Planetarium.GetUniversalTime()).magnitude;
            if (destinationMagnitude > newOrbit.referenceBody.sphereOfInfluence)
            {
                View.WindowHelper.Error("Destination position was above the sphere of influence");
                return;
            }
            if (destinationMagnitude < newOrbit.referenceBody.Radius)
            {
                View.WindowHelper.Error("Destination position was below the surface");
                return;
            }

            vessel.PrepVesselTeleport();

            try
            {
                OrbitPhysicsManager.HoldVesselUnpack(60);
            }
            catch (NullReferenceException)
            {
                Extensions.Log("OrbitPhysicsManager.HoldVesselUnpack threw NullReferenceException");
            }

            var allVessels = FlightGlobals.fetch?.vessels ?? (IEnumerable<Vessel>)new[] { vessel };
            foreach (var v in allVessels)
                v.GoOnRails();

            var oldBody = vessel.orbitDriver.orbit.referenceBody;

            HardsetOrbit(vessel.orbitDriver, newOrbit);

            vessel.orbitDriver.pos = vessel.orbit.pos.xzy;
            vessel.orbitDriver.vel = vessel.orbit.vel;

            var newBody = vessel.orbitDriver.orbit.referenceBody;
            if (newBody != oldBody)
            {
                var evnt = new GameEvents.HostedFromToAction<Vessel, CelestialBody>(vessel, oldBody, newBody);
                GameEvents.onVesselSOIChanged.Fire(evnt);
            }
        }
 public void UpdateCurrentAtmosphereState(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> data)
 {
     wasInAtmo = FlightGlobals.ActiveVessel.atmDensity != 0;             //updating wasInAtmo so it gets saved correctly
 }
Exemplo n.º 4
0
 public void OnVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> evt)
 {
     watchdogRun  = false;
     delayCounter = 0;
 }
Exemplo n.º 5
0
        private void VesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> Data)
        {
//				_logger.Trace( "Callback: VesselSOIChanged" );
            ScheduleExperimentUpdate(true);
        }
Exemplo n.º 6
0
 public void VesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> a)
 {
     _inWater = FlightGlobals.ActiveVessel.situation == Vessel.Situations.SPLASHED;
 }
Exemplo n.º 7
0
 public void ResetIVATransform(GameEvents.HostedFromToAction <ProtoCrewMember, Part> dat)
 {
     DoIVASetup();
 }
Exemplo n.º 8
0
 void OnVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> e) => StopTimekeeping();
 protected void OnVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> pair)
 {
     CheckVessel(pair.host);
 }
Exemplo n.º 10
0
 /// <summary>
 /// The vessel has changed as it has less crew now so send the definition
 /// </summary>
 public void OnCrewTransfered(GameEvents.HostedFromToAction <ProtoCrewMember, Part> data)
 {
     SystemsContainer.Get <VesselProtoSystem>().MessageSender.SendVesselMessage(data.from.vessel, true);
 }
Exemplo n.º 11
0
        void onVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> hft)
        {
            Vessel vessel = hft.host;

            KerbalStats.current.StartCoroutine(WaitAndSetBody(vessel));
        }
Exemplo n.º 12
0
 protected void OnVesselRename(GameEvents.HostedFromToAction <Vessel, string> hfta)
 {
     CheckVessel(hfta.host);
 }
Exemplo n.º 13
0
 protected void onCrewTransfer(GameEvents.HostedFromToAction <ProtoCrewMember, Part> evnt)
 {
     totalCrewSkill  = GetTotalCrewSkill();
     criticalSuccess = originalCriticalSuccess - (100 * SpecialistBonusBase * totalCrewSkill);
 }
Exemplo n.º 14
0
 // So these next three methods are called when crew transfers occur or vessel change occurs or crew board vessel
 // In all three cases we check the portrait cams for stowaways.
 public void OnCrewTransferred(GameEvents.HostedFromToAction <ProtoCrewMember, Part> fromToAction)
 {
     CheckStowaways();
 }
Exemplo n.º 15
0
        internal void CrewTransferAction()
        {
            try
            {
                // Both parts have internal models...
                if (FromPart.internalModel != null && ToPart.internalModel != null)
                {
                    if (ToSeat.taken)
                    {
                        // Remove the crew members from the part(s)...
                        RemoveCrewMember(FromCrewMember, FromPart);

                        // Swap places if there is no standing room available
                        if (ToPart.CrewCapacity == ToPart.protoModuleCrew.Count)
                        {
                            RemoveCrewMember(ToCrewMember, ToPart);
                            FromPart.AddCrewmemberAt(ToCrewMember, FromPart.internalModel.seats.IndexOf(FromSeat));
                            // Add the crew members back into the part(s) at their new seats.
                            ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
                        }
                        else
                        {
                            // Just move.
                            RemoveCrewMember(FromCrewMember, FromPart);
                            AddCrewMember(FromCrewMember, ToPart);
                        }
                        SMAddon.FireEventTriggers();
                    }
                    else
                    {
                        // Just move.
                        RemoveCrewMember(FromCrewMember, FromPart);
                        ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
                        SMAddon.FireEventTriggers();
                    }
                }
                else // one or both parts do not have an internal model
                {
                    // no portraits, so let's just move kerbals...
                    if (ToCrewMember != null)
                    {
                        RemoveCrewMember(FromCrewMember, FromPart);
                        RemoveCrewMember(ToCrewMember, ToPart);
                        AddCrewMember(FromCrewMember, ToPart);
                        AddCrewMember(ToCrewMember, FromPart);
                    }
                    else
                    {
                        RemoveCrewMember(FromCrewMember, FromPart);
                        AddCrewMember(FromCrewMember, ToPart);
                    }
                    SMAddon.FireEventTriggers();
                }
                if (SMSettings.EnableStockCrewXfer)
                {
                    // Now let's deal with third party mod support...
                    SourceAction        = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(FromCrewMember, FromPart, ToPart);
                    FireSourceXferEvent = true;

                    //If a swap, we need to handle that too...
                    if (ToCrewMember != null)
                    {
                        TargetAction        = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(ToCrewMember, ToPart, FromPart);
                        FireTargetXferEvent = true;
                    }
                }

                FromPart.vessel.SpawnCrew();

                // not sure if these help.   We have been experiencing issues with "ghost" kerbals & EVAs/docking/undocking after Crew Moves.
                // trying this to see if it "cleans up" any internal tracking inside of KSP...
                FromPart.RegisterCrew();
                ToPart.RegisterCrew();

                SMAddon.SmVessel.RespawnCrew();
                SMAddon.SmVessel.TransferCrewObj.IvaDelayActive = true;
            }
            catch (Exception ex)
            {
                SmUtils.LogMessage(
                    $"in CrewTransferAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true);
            }
        }
Exemplo n.º 16
0
        internal void CrewTransferStopAction()
        {
            // This adds the kerbal(s) to the destination part(s)
            if (FromCrewMember != null)
            {
                try
                {
                    // Add Source Crewmember to target part
                    if (FromCrewMember != null && ToPart.CrewCapacity > ToPart.protoModuleCrew.Count)
                    {
                        AddCrewMember(FromCrewMember, ToPart, ToSeat);
                        var action = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(FromCrewMember, FromPart, ToPart);
                        GameEvents.onCrewTransferred.Fire(action);
                    }

                    // Add Target Crewmember to source part
                    if (ToCrewMember != null && FromPart.CrewCapacity > FromPart.protoModuleCrew.Count)
                    {
                        AddCrewMember(ToCrewMember, FromPart, FromSeat);
                        // MW - Not sure if we need this guard
                        if (SMSettings.EnableStockCrewXfer)
                        {
                            var action = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(ToCrewMember, ToPart, FromPart);
                            GameEvents.onCrewTransferred.Fire(action);
                        }
                    }
                }
                catch (Exception ex)
                {
                    SmUtils.LogMessage(
                        $"in CrewTransferAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                        SmUtils.LogType.Error, true);
                }
            }
            else
            {
                // Must be multi-crew...
                try
                {
                    // Step through the destination parts, transferring kerbals into them
                    // if they have room.  Any kerbals left over have to go back to whence
                    // they came.  Perhaps in future they can evict kerbals already in
                    // residence..
                    int crewIdx = 0;
                    foreach (var toPart in ToParts)
                    {
                        // Add Source Crewmember(s) to target part
                        int space = toPart.CrewCapacity - toPart.protoModuleCrew.Count;
                        for (int idx = 0; idx < space; idx++)
                        {
                            if (crewIdx > CrewMembersToTransfer.Count - 1)
                            {
                                break;
                            }
                            RemoveCrewMember(CrewMembersToTransfer[crewIdx].kerbal, CrewMembersToTransfer[crewIdx].partSource);
                            AddCrewMember(CrewMembersToTransfer[crewIdx].kerbal, toPart);
                            // MW - Not sure if we need this guard
                            if (SMSettings.EnableStockCrewXfer)
                            {
                                var action = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(CrewMembersToTransfer[crewIdx].kerbal, CrewMembersToTransfer[crewIdx].partSource, toPart);
                                GameEvents.onCrewTransferred.Fire(action);
                            }
                            crewIdx++;
                        }
                    }
                }
                catch (Exception ex)
                {
                    SmUtils.LogMessage(
                        $"in CrewTransferAction.  Error moving crewmember.  Error:  {ex.Message} \r\n\r\n{ex.StackTrace}",
                        SmUtils.LogType.Error, true);
                }
            }
        }
Exemplo n.º 17
0
        internal void CrewTransferAction()
        {
            try
              {
            if (FromPart.internalModel != null && ToPart.internalModel != null)
            {
              if (ToSeat.taken)
              {

            // Remove the crew members from the part(s)...
            RemoveCrewMember(FromCrewMember, FromPart);

            // Swap places if there is no standing room available
            if (ToPart.CrewCapacity == ToPart.protoModuleCrew.Count)
            {
              RemoveCrewMember(ToCrewMember, ToPart);
              FromPart.AddCrewmemberAt(ToCrewMember, FromPart.internalModel.seats.IndexOf(FromSeat));
              // Add the crew members back into the part(s) at their new seats.
              ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
            }
            else
            {
              // Just move.
              RemoveCrewMember(FromCrewMember, FromPart);
              AddCrewMember(FromCrewMember, ToPart);
            }
              }
              else
              {
            // Just move.
            RemoveCrewMember(FromCrewMember, FromPart);
            ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
              }
            }
            else
            {
              // no portraits, so let's just move kerbals...
              if (ToCrewMember != null)
              {
            RemoveCrewMember(FromCrewMember, FromPart);
            RemoveCrewMember(ToCrewMember, ToPart);
            AddCrewMember(FromCrewMember, ToPart);
            AddCrewMember(ToCrewMember, FromPart);
              }
              else
              {
            RemoveCrewMember(FromCrewMember, FromPart);
            AddCrewMember(FromCrewMember, ToPart);
              }
            }
            if (SMSettings.EnableStockCrewXfer)
            {
              // Now let's deal with third party mod support...
              SourceAction = new GameEvents.HostedFromToAction<ProtoCrewMember, Part>(FromCrewMember, FromPart, ToPart);
              FireSourceXferEvent = true;

              //If a swap, we need to handle that too...
              if (ToCrewMember != null)
              {
            TargetAction = new GameEvents.HostedFromToAction<ProtoCrewMember, Part>(ToCrewMember, ToPart, FromPart);
            FireTargetXferEvent = true;
              }
            }

            FromPart.vessel.SpawnCrew();

            // not sure if these help.   We have been experiencing issues with "ghost" kerbals & EVAs/docking/undocking after Crew Moves.
            // trying this to see if it "cleans up" any internal tracking inside of KSP...
            FromPart.RegisterCrew();
            ToPart.RegisterCrew();

            SMAddon.SmVessel.RespawnCrew();
            SMAddon.SmVessel.TransferCrewObj.IvaDelayActive = true;
              }
              catch (Exception ex)
              {
            Utilities.LogMessage(
              string.Format("in CrewTransferAction.  Error moving crewmember.  Error:  {0} \r\n\r\n{1}", ex.Message,
            ex.StackTrace), Utilities.LogType.Error, true);
              }
        }
Exemplo n.º 18
0
 private void OnCrewTransferred(GameEvents.HostedFromToAction <ProtoCrewMember, Part> a)
 {
     // Check both vessels
     HandleVessel(a.from.vessel);
     HandleVessel(a.to.vessel);
 }
        public static void CalculateOrbit(Vessel vessel, Orbit oldOrbit, OrbitDriver driver)
        {
            VesselDied = false;

            if (!VesselData.Message.ContainsKey(vessel.id))
            {
                VesselData.Message.Add(vessel.id, false);
                VesselData.DisplayedMessage = false;
            }
            else
            {
                VesselData.Message.TryGetValue(vessel.id, out VesselData.DisplayedMessage);
            }

            vessel.GoOnRails();

            var oldBody = vessel.orbitDriver.orbit.referenceBody;

               // The ISS decays at about 2km/month = 2000/30*24*60*60 == 7.7x10^-4 m/s

            double BodyGravityConstant = vessel.orbitDriver.orbit.referenceBody.GeeASL;
            double AtmosphereMultiplier;
            double MaxDecayInfluence = vessel.orbitDriver.orbit.referenceBody.Radius * 10;
            if (vessel.orbitDriver.orbit.referenceBody.atmosphere)
            {
                AtmosphereMultiplier = vessel.orbitDriver.orbit.referenceBody.atmospherePressureSeaLevel / 101.325;
            }
            else
            {
                 AtmosphereMultiplier = 0.5;
            }

            if (vessel.orbitDriver.orbit.semiMajorAxis + 50 < MaxDecayInfluence )
            {
                double Lambda = 0.000000000133913 * UI.DifficultySetting;                           //0.000000000133913;
                double Sigma = MaxDecayInfluence - vessel.orbitDriver.orbit.altitude;
                DecayValue = (double)TimeWarp.CurrentRate * Sigma * BodyGravityConstant * AtmosphereMultiplier * Lambda;

                if (vessel.orbitDriver.orbit.referenceBody.atmosphere)
                {
                    if (vessel.orbitDriver.orbit.PeA < vessel.orbitDriver.orbit.referenceBody.atmosphereDepth)
                    {
                        DecayValue = DecayValue * (Math.Pow(Math.E, vessel.orbitDriver.orbit.referenceBody.atmosphereDepth - vessel.orbitDriver.orbit.PeA)); // Have it increase alot more as we enter the hard atmosphere
                    }

                    //EstimatedTimeUntilDeorbit = (float)(vessel.orbitDriver.orbit.altitude - (float)vessel.orbitDriver.orbit.referenceBody.atmosphereDepth) / (float)DecayValue;
                     MaxDecayValue = ((vessel.orbitDriver.orbit.referenceBody.Radius + vessel.orbitDriver.orbit.referenceBody.atmosphereDepth) * BodyGravityConstant * AtmosphereMultiplier * Lambda);
                     EstimatedTimeUntilDeorbit = ((float)(vessel.orbitDriver.orbit.semiMajorAxis - (float)vessel.orbitDriver.orbit.referenceBody.atmosphereDepth)) / (float)MaxDecayValue;
                   // EstimatedTimeUntilDeorbit = (float)(vessel.orbitDriver.orbit.PeA - (((vessel.orbitDriver.referenceBody.atmosphereDepth)/((MaxDecayValue+DecayValue)/2) - vessel.orbitDriver.orbit.PeA)) *((MaxDecayValue + DecayValue) / 2));
                }
                else
                {
                   //EstimatedTimeUntilDeorbit = (float)(vessel.orbitDriver.orbit.altitude - 100) / (float)DecayValue;
                    MaxDecayValue = ((vessel.orbitDriver.orbit.referenceBody.Radius + 100) * BodyGravityConstant * AtmosphereMultiplier * Lambda);
                    EstimatedTimeUntilDeorbit = ((float)(vessel.orbitDriver.orbit.semiMajorAxis - (float)vessel.orbitDriver.orbit.referenceBody.atmosphereDepth)) / (float)MaxDecayValue;
                }
                if (VesselData.DecayTimes.ContainsKey(vessel.id))
                {
                    VesselData.DecayTimes.Remove(vessel.id);
                    VesselData.DecayTimes.Add(vessel.id, EstimatedTimeUntilDeorbit);
                }
                else
                {
                    VesselData.DecayTimes.Add(vessel.id, EstimatedTimeUntilDeorbit);
                }

               // print(vessel.name + " Semi major axis reduced by: " + (DecayValue));
            }
            else
            {
                DecayValue = 0;

                if (VesselData.DecayTimes.ContainsKey(vessel.id))
                {
                    VesselData.DecayTimes.Remove(vessel.id);
                    VesselData.DecayTimes.Add(vessel.id, 0.5f);
                }
                else
                {
                    VesselData.DecayTimes.Add(vessel.id, 0.5f);
                }
            }

            if (VesselDied == false)         // Just Incase the vessel is destroyed part way though the check.
            {
                if (vessel.orbitDriver.orbit.referenceBody.GetInstanceID() != 0 || vessel.orbitDriver.orbit.semiMajorAxis > vessel.orbitDriver.orbit.referenceBody.Radius + 5)
                {
                    SetNewOrbit(driver, oldOrbit);
                }
            }

            if (vessel.orbitDriver.orbit.referenceBody.atmosphere) // Big problem ( Jool, Eve, Duna, Kerbin, Laythe)
            {
                if (vessel.orbitDriver.orbit.semiMajorAxis < vessel.orbitDriver.orbit.referenceBody.Radius + vessel.orbitDriver.referenceBody.atmosphereDepth + 500)
                {
                    FlightDriver.SetPause(true);
                    TimeWarp.SetRate(1, true);
                    FlightDriver.SetPause(false);
                    print("Warning: " + vessel.name + " is approaching " + oldOrbit.referenceBody.name + "'s hard atmosphere");
                    ScreenMessages.PostScreenMessage("Warning: " + vessel.name + " is approaching " + oldOrbit.referenceBody.name + "'s hard atmosphere");
                    VesselData.Message.Remove(vessel.id);
                    VesselData.Message.Add(vessel.id, true);
                }

                if (vessel.orbitDriver.orbit.semiMajorAxis < vessel.orbitDriver.orbit.referenceBody.Radius + vessel.orbitDriver.referenceBody.atmosphereDepth + 5)
                {
                    VesselDied = true;
                }
            }
            else // Moon Smaller Problem
            {
                if (vessel.orbitDriver.orbit.semiMajorAxis < vessel.orbitDriver.orbit.referenceBody.Radius + 5000)
                {
                    FlightDriver.SetPause(true);
                    TimeWarp.SetRate(1, true);
                    FlightDriver.SetPause(false);
                    print("Warning: " + vessel.name + " is approaching " + oldOrbit.referenceBody.name + "'s surface");
                    ScreenMessages.PostScreenMessage("Warning: " + vessel.name + " is approaching " + oldOrbit.referenceBody.name + "'s surface");
                    VesselData.Message.Remove(vessel.id);
                    VesselData.Message.Add(vessel.id, true);
                }

                if (vessel.orbitDriver.orbit.semiMajorAxis < vessel.orbitDriver.orbit.referenceBody.Radius + 100)
                {
                    VesselDied = true;
                }

            }

            if (VesselDied == false)
            {
                vessel.orbitDriver.pos = vessel.orbit.pos.xzy;
                vessel.orbitDriver.vel = vessel.orbit.vel;
                var newBody = vessel.orbitDriver.orbit.referenceBody;
                if (newBody != oldBody)
                {
                    var evnt = new GameEvents.HostedFromToAction<Vessel, CelestialBody>(vessel, oldBody, newBody);
                    GameEvents.onVesselSOIChanged.Fire(evnt);
                }
            }

            if (VesselDied == true)
            {
                vessel.Die();
                VesselData.CanStationKeep.Remove(vessel.id);
                VesselData.DecayTimes.Remove(vessel.id);
                VesselData.DisplayedDecayTimes.Remove(vessel);
                VesselData.StationKeeping.Remove(vessel.id);

            }
        }
Exemplo n.º 20
0
 private void OnShipNamingChanged(GameEvents.HostedFromToAction <ShipConstruct, string> action)
 {
     update = true;
 }
Exemplo n.º 21
0
 private void OnRename(GameEvents.HostedFromToAction <Vessel, string> data)
 {
     //Debug.Log("OnRename");
     SnackSnapshot.Instance().RebuildSnapshot();
 }
Exemplo n.º 22
0
 void OmVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> gameEvent)
 {
     Debug.Log("[Persistent Thrust]: GameEventSubscriber - detected OmVesselSOIChanged");
     gameEvent.host.FindPartModulesImplementing <PersistentEngine>().ForEach(e => e.VesselChangedSOI());
 }
Exemplo n.º 23
0
        private void VesselRename(GameEvents.HostedFromToAction <Vessel, string> Data)
        {
//				_logger.Trace( "Callback: VesselRename" );
            ScheduleExperimentUpdate( );
        }
Exemplo n.º 24
0
 public void OnCrewTransferred(GameEvents.HostedFromToAction <ProtoCrewMember, Part> ev)
 {
     RefreshGUI();
 }
Exemplo n.º 25
0
 public void OnVesselRename(GameEvents.HostedFromToAction <Vessel, string> action)
 {
 }
Exemplo n.º 26
0
 public void OnVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> evt)
 {
     UpdateData();
 }
Exemplo n.º 27
0
 protected void OnVesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> pair)
 {
     CheckVessel(pair.host);
 }
Exemplo n.º 28
0
 public void OnVesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> evt)
 {
     UpdateData();
 }
 private void SituationChangeFixes(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> data)
 {
     RefreshPqsWhenApproaching(data);
 }
Exemplo n.º 30
0
 private void TriggerSimulator(GameEvents.HostedFromToAction <bool, Part> action)
 {
     _updateSimulator = true;
 }
 private void OnVesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> data)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 32
0
 private void TriggerSimulator(GameEvents.HostedFromToAction <PartResource, bool> action)
 {
     _updateSimulator = true;
 }
Exemplo n.º 33
0
    public void CrewTransferAction()
    {
      try
      {
        Utilities.LogMessage("CrewTransferAction:  Begin.", "info", SMSettings.VerboseLogging);
        if (FromPart.internalModel != null && ToPart.internalModel != null)
        {
          Utilities.LogMessage("CrewTransferAction:  InternalModel exists.", "info", SMSettings.VerboseLogging);
          if (ToSeat.taken)
          {
            // Swap places.

            // Remove the crew members from the part(s)...
            RemoveCrewMember(FromCrewMember, FromPart);
            RemoveCrewMember(ToCrewMember, ToPart);

            // Add the crew members back into the part(s) at their new seats.
            FromPart.AddCrewmemberAt(ToCrewMember, FromPart.internalModel.seats.IndexOf(FromSeat));
            ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
          }
          else
          {
            // Just move.
            RemoveCrewMember(FromCrewMember, FromPart);
            ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat));
          }
        }
        else
        {
          // no portraits, so let's just move kerbals...
          Utilities.LogMessage("CrewTransferAction:  No InternalModel.", "info", SMSettings.VerboseLogging);
          if (ToCrewMember != null)
          {
            RemoveCrewMember(FromCrewMember, FromPart);
            RemoveCrewMember(ToCrewMember, ToPart);
            AddCrewMember(FromCrewMember, ToPart);
            AddCrewMember(ToCrewMember, FromPart);
          }
          else
          {
            RemoveCrewMember(FromCrewMember, FromPart);
            AddCrewMember(FromCrewMember, ToPart);
          }
        }
        if (SMSettings.EnableOnCrewTransferEvent)
        {
          // Now let's deal with third party mod support...
          SourceAction = new GameEvents.HostedFromToAction<ProtoCrewMember, Part>(FromCrewMember, FromPart, ToPart);
          FireSourceXferEvent = true;

          //If a swap, we need to handle that too...
          if (ToCrewMember != null)
          {
            TargetAction = new GameEvents.HostedFromToAction<ProtoCrewMember, Part>(ToCrewMember, ToPart, FromPart);
            FireTargetXferEvent = true;
          }
        }

        FromPart.SpawnCrew();
        ToPart.SpawnCrew();

        // not sure if these help.   We have been experiencing issues with "ghost" kerbals & EVAs/docking/undocking after Crew Moves.   
        // trying this to see if it "cleans up" any internal tracking inside of KSP...
        FromPart.RegisterCrew();
        ToPart.RegisterCrew();

        SMAddon.smController.RespawnCrew();
        SMAddon.smController.CrewTransfer.IvaDelayActive = true;
      }
      catch (Exception ex)
      {
        Utilities.LogMessage(string.Format("in CrewTransferAction.  Error moving crewmember.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), "Error", true);
      }
    }
Exemplo n.º 34
0
 void onVesselRename(GameEvents.HostedFromToAction <Vessel, string> data)
 {
     update_and_checkin(data.host);
 }