/*************************************************************************************************************************/ public void main_vessel_changed(string save_file) { #if DEBUG // if (Debug_Level_1_Active) Log.PushStackInfo("FMRS_Core.main_vessel_changed", "enter main_vessel_changed(string save_file) " + save_file); if (Debug_Active) { Log.Info("switching main vessel"); } #endif ProtoVessel temp_proto; Game loadgame = GamePersistence.LoadGame(save_file, HighLogic.SaveFolder + "/FMRS", false, false); if (loadgame != null && loadgame.compatible && loadgame.flightState != null) { temp_proto = loadgame.flightState.protoVessels.Find(p => p.vesselID == _SAVE_Main_Vessel); if (temp_proto != null) { if (Vessels_dropped.ContainsKey(temp_proto.vesselID)) { delete_dropped_vessel(temp_proto.vesselID); } Vessels_dropped.Add(temp_proto.vesselID, quicksave_file_name); Vessels_dropped_names.Add(temp_proto.vesselID, temp_proto.vesselName); Vessels.Add(temp_proto.vesselID); } #if DEBUG else if (Debug_Active) { Log.Info("main vessel not found"); } #endif if (Vessels_dropped.ContainsKey(FlightGlobals.ActiveVessel.id)) { delete_dropped_vessel(FlightGlobals.ActiveVessel.id); } _SAVE_Main_Vessel = FlightGlobals.ActiveVessel.id; } #if DEBUG else if (Debug_Active) { Log.Info("unable to load savefile"); } // if (Debug_Level_1_Active) Log.PopStackInfo("leaving main_vessel_changed(string save_file)"); #endif }
/*************************************************************************************************************************/ public void vessel_change_handler(Vessel change_vessel) { Log.dbg(" #### FMRS: changed to {0}", FlightGlobals.ActiveVessel.vesselName); if (!_SAVE_Switched_To_Dropped) { if (last_staging_event < Planetarium.GetUniversalTime() + 10 && last_staging_event != 0) { if (FlightGlobals.ActiveVessel.id != _SAVE_Main_Vessel && Vessels_dropped.ContainsKey(FlightGlobals.ActiveVessel.id)) { Vessel temp_vessel = FlightGlobals.Vessels.Find(v => v.id == _SAVE_Main_Vessel); if (temp_vessel != null) { if (Vessels_dropped.ContainsKey(_SAVE_Main_Vessel)) { Vessels_dropped.Remove(_SAVE_Main_Vessel); } if (Vessel_State.ContainsKey(_SAVE_Main_Vessel)) { Vessel_State.Remove(_SAVE_Main_Vessel); } if (Vessels_dropped_names.ContainsKey(_SAVE_Main_Vessel)) { Vessels_dropped_names.Remove(_SAVE_Main_Vessel); } if (Vessel_State.ContainsKey(_SAVE_Main_Vessel)) { Vessel_State.Remove(_SAVE_Main_Vessel); } Vessels_dropped.Add(_SAVE_Main_Vessel, Vessels_dropped[FlightGlobals.ActiveVessel.id]); Vessel_State.Add(_SAVE_Main_Vessel, vesselstate.FLY); Vessels_dropped_names.Add(_SAVE_Main_Vessel, temp_vessel.vesselName); foreach (ProtoCrewMember crew_member in temp_vessel.protoVessel.GetVesselCrew()) { Kerbal_dropped.Add(crew_member.name, _SAVE_Main_Vessel); } if (Vessels_dropped.ContainsKey(FlightGlobals.ActiveVessel.id)) { Vessels_dropped.Remove(FlightGlobals.ActiveVessel.id); } if (Vessels_dropped_names.ContainsKey(FlightGlobals.ActiveVessel.id)) { Vessels_dropped_names.Remove(FlightGlobals.ActiveVessel.id); } if (Vessel_State.ContainsKey(FlightGlobals.ActiveVessel.id)) { Vessel_State.Remove(FlightGlobals.ActiveVessel.id); } if (Kerbal_dropped.ContainsValue(FlightGlobals.ActiveVessel.id)) { List <string> kerbals = new List <string>(); foreach (KeyValuePair <string, Guid> kerbal in Kerbal_dropped) { if (kerbal.Value == FlightGlobals.ActiveVessel.id) { kerbals.Add(kerbal.Key); } } foreach (string kerbal in kerbals) { Kerbal_dropped.Remove(kerbal); } } _SAVE_Main_Vessel = FlightGlobals.ActiveVessel.id; } } } else { if (!Vessels_dropped.ContainsKey(change_vessel.id)) { close_FMRS(); } } } else { if (!Vessels_dropped.ContainsKey(FlightGlobals.ActiveVessel.id)) { foreach (Part p in FlightGlobals.ActiveVessel.Parts) { foreach (PartModule pm in p.Modules) { if (pm.moduleName == "FMRS_PM") { Guid temp_guid = new Guid("00000000-0000-0000-0000-000000000000"); try { temp_guid = new Guid((pm as FMRS_PM).parent_vessel); } catch (Exception) { } if (Vessels_dropped.ContainsKey(temp_guid)) { if (Vessels_dropped[temp_guid] == _SAVE_Switched_To_Savefile) { anz_id = temp_guid; } } } } break; } } } }
/*************************************************************************************************************************/ public bool search_for_new_vessels(string save_file_name) { bool new_vessel_found = false, controllable = false; Log.PushStackInfo("FMRS_Core.search_for_new_vessels(string)", "entering search_for_new_vessels(string save_file_name) {0}", save_file_name); foreach (Vessel temp_vessel in FlightGlobals.Vessels) { controllable = false; //Check if the stage was claimed by another mod or by this mod string controllingMod = RecoveryControllerWrapper.ControllingMod(temp_vessel); bool FMRSIsControllingMod = false; if (controllingMod != null) { Log.info("RecoveryControllerWrapper.ControllingMod for vessel: {0} : {1}", temp_vessel.name, controllingMod); FMRSIsControllingMod = string.Equals(controllingMod, "FMRS", StringComparison.OrdinalIgnoreCase); } if (controllingMod == null || string.Equals(controllingMod, "auto", StringComparison.OrdinalIgnoreCase) || FMRSIsControllingMod) { if (!Vessels.Contains(temp_vessel.id)) { if (FMRSIsControllingMod || ( ((temp_vessel.isCommandable && temp_vessel.IsControllable) || (_SETTING_Control_Uncontrollable && controllingMod == null)) && temp_vessel.vesselType != VesselType.EVA && temp_vessel.vesselType != VesselType.Flag && temp_vessel.vesselType != VesselType.SpaceObject && temp_vessel.vesselType != VesselType.Unknown ) ) { controllable = true; } else { foreach (ProtoPartSnapshot proto_part in temp_vessel.protoVessel.protoPartSnapshots) { List <ProtoPartModuleSnapshot> proto_modules = proto_part.modules; ProtoPartModuleSnapshot module = null; if (proto_modules != null && (_SETTING_Parachutes && ((controllingMod != null && string.Equals(controllingMod, "FMRS", StringComparison.OrdinalIgnoreCase)) || !_SETTING_Defer_Parachutes_to_StageRecovery || !stageRecoveryInstalled) ) ) { // module = proto_part.modules.Find(p => p.moduleName == "RealChuteModule" || p.moduleName == "ModuleParachute" || p.moduleName == "ModuleKrKerbalParachute" || p.moduleName == "RealChuteFAR"); if (module != null) { controllable = true; } } if (proto_part.protoCrewNames.Count > 0) { controllable = true; } } } foreach (Part p in temp_vessel.Parts) { foreach (PartModule pm in p.Modules) { if (pm.moduleName == "FMRS_PM") { if ((pm as FMRS_PM).parent_vessel != "00000000-0000-0000-0000-000000000000") { controllable = false; break; } } } break; } if (controllable) { Log.dbg("{0} Found and will be added to the dicts", temp_vessel.vesselName); Vessels_dropped.Add(temp_vessel.id, save_file_name); Vessels_dropped_names.Add(temp_vessel.id, temp_vessel.vesselName); Vessel_State.Add(temp_vessel.id, vesselstate.FLY); foreach (Part p in temp_vessel.Parts) { foreach (PartModule pm in p.Modules) { if (pm.moduleName == "FMRS_PM") { pm.StartCoroutine("setid"); } } } foreach (ProtoPartSnapshot part_snapshot in temp_vessel.protoVessel.protoPartSnapshots) { foreach (ProtoCrewMember member in part_snapshot.protoModuleCrew) { if (!Kerbal_dropped.ContainsKey(member.name)) { Kerbal_dropped.Add(member.name, temp_vessel.id); } } } new_vessel_found = true; } Vessels.Add(temp_vessel.id); } } } Log.PopStackInfo("leaving search_for_new_vessels(string save_file_name)"); return(new_vessel_found); }
/*************************************************************************************************************************/ public bool search_for_new_vessels(string save_file_name) { bool new_vessel_found = false, controllable = false; #if DEBUG // if (Debug_Level_1_Active) Log.PushStackInfo("FMRS_Core.search_for_new_vessels(string)", "entering search_for_new_vessels(string save_file_name) " + save_file_name); #endif foreach (Vessel temp_vessel in FlightGlobals.Vessels) { controllable = false; if (!Vessels.Contains(temp_vessel.id)) { if (temp_vessel.isCommandable && temp_vessel.IsControllable && temp_vessel.vesselType != VesselType.EVA && temp_vessel.vesselType != VesselType.Flag && temp_vessel.vesselType != VesselType.SpaceObject && temp_vessel.vesselType != VesselType.Unknown) { controllable = true; } else { foreach (ProtoPartSnapshot proto_part in temp_vessel.protoVessel.protoPartSnapshots) { List <ProtoPartModuleSnapshot> proto_modules = proto_part.modules; ProtoPartModuleSnapshot module = null; if (proto_modules != null && (_SETTING_Parachutes && (!_SETTING_Defer_Parachutes_to_StageRecovery || !stageRecoveryInstalled))) { // module = proto_part.modules.Find(p => p.moduleName == "RealChuteModule" || p.moduleName == "ModuleParachute" || p.moduleName == "ModuleKrKerbalParachute" || p.moduleName == "RealChuteFAR"); if (module != null) { controllable = true; } } if (proto_part.protoCrewNames.Count > 0) { controllable = true; } } } foreach (Part p in temp_vessel.Parts) { foreach (PartModule pm in p.Modules) { if (pm.moduleName == "FMRS_PM") { if ((pm as FMRS_PM).parent_vessel != "00000000-0000-0000-0000-000000000000") { controllable = false; break; } } } break; } if (controllable) { #if DEBUG if (Debug_Active) { Log.Info("" + temp_vessel.vesselName + " Found and will be added to the dicts"); } #endif Vessels_dropped.Add(temp_vessel.id, save_file_name); Vessels_dropped_names.Add(temp_vessel.id, temp_vessel.vesselName); Vessel_State.Add(temp_vessel.id, vesselstate.FLY); foreach (Part p in temp_vessel.Parts) { foreach (PartModule pm in p.Modules) { if (pm.moduleName == "FMRS_PM") { pm.StartCoroutine("setid"); } } } foreach (ProtoPartSnapshot part_snapshot in temp_vessel.protoVessel.protoPartSnapshots) { foreach (ProtoCrewMember member in part_snapshot.protoModuleCrew) { if (!Kerbal_dropped.ContainsKey(member.name)) { Kerbal_dropped.Add(member.name, temp_vessel.id); } } } new_vessel_found = true; } Vessels.Add(temp_vessel.id); } } #if DEBUG // if (Debug_Level_1_Active) Log.PopStackInfo("leaving search_for_new_vessels(string save_file_name)"); #endif return(new_vessel_found); }