/// <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); }
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 }
public void OnVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> evt) { watchdogRun = false; delayCounter = 0; }
private void VesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> Data) { // _logger.Trace( "Callback: VesselSOIChanged" ); ScheduleExperimentUpdate(true); }
public void VesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> a) { _inWater = FlightGlobals.ActiveVessel.situation == Vessel.Situations.SPLASHED; }
public void ResetIVATransform(GameEvents.HostedFromToAction <ProtoCrewMember, Part> dat) { DoIVASetup(); }
void OnVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> e) => StopTimekeeping();
protected void OnVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> pair) { CheckVessel(pair.host); }
/// <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); }
void onVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> hft) { Vessel vessel = hft.host; KerbalStats.current.StartCoroutine(WaitAndSetBody(vessel)); }
protected void OnVesselRename(GameEvents.HostedFromToAction <Vessel, string> hfta) { CheckVessel(hfta.host); }
protected void onCrewTransfer(GameEvents.HostedFromToAction <ProtoCrewMember, Part> evnt) { totalCrewSkill = GetTotalCrewSkill(); criticalSuccess = originalCriticalSuccess - (100 * SpecialistBonusBase * totalCrewSkill); }
// 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(); }
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); } }
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); } } }
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); } }
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); } }
private void OnShipNamingChanged(GameEvents.HostedFromToAction <ShipConstruct, string> action) { update = true; }
private void OnRename(GameEvents.HostedFromToAction <Vessel, string> data) { //Debug.Log("OnRename"); SnackSnapshot.Instance().RebuildSnapshot(); }
void OmVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> gameEvent) { Debug.Log("[Persistent Thrust]: GameEventSubscriber - detected OmVesselSOIChanged"); gameEvent.host.FindPartModulesImplementing <PersistentEngine>().ForEach(e => e.VesselChangedSOI()); }
private void VesselRename(GameEvents.HostedFromToAction <Vessel, string> Data) { // _logger.Trace( "Callback: VesselRename" ); ScheduleExperimentUpdate( ); }
public void OnCrewTransferred(GameEvents.HostedFromToAction <ProtoCrewMember, Part> ev) { RefreshGUI(); }
public void OnVesselRename(GameEvents.HostedFromToAction <Vessel, string> action) { }
public void OnVesselSOIChanged(GameEvents.HostedFromToAction <Vessel, CelestialBody> evt) { UpdateData(); }
protected void OnVesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> pair) { CheckVessel(pair.host); }
public void OnVesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> evt) { UpdateData(); }
private void SituationChangeFixes(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> data) { RefreshPqsWhenApproaching(data); }
private void TriggerSimulator(GameEvents.HostedFromToAction <bool, Part> action) { _updateSimulator = true; }
private void OnVesselSituationChange(GameEvents.HostedFromToAction <Vessel, Vessel.Situations> data) { throw new NotImplementedException(); }
private void TriggerSimulator(GameEvents.HostedFromToAction <PartResource, bool> action) { _updateSimulator = true; }
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); } }
void onVesselRename(GameEvents.HostedFromToAction <Vessel, string> data) { update_and_checkin(data.host); }