/*************************************************************************************************************************/ public void fill_Vessels_list() { #if DEBUG // if (Debug_Level_1_Active) Log.PushStackInfo("FMRS_Core.fill_Vessels_list", "entering fill_Vessels_list()"); #endif foreach (Vessel temp_vessel in FlightGlobals.Vessels) { if (!Vessels.Contains(temp_vessel.id)) { Vessels.Add(temp_vessel.id); #if DEBUG if (Debug_Active) { Log.Info("" + temp_vessel.vesselName + " Found"); } #endif } } #if DEBUG // if (Debug_Level_1_Active) Log.PopStackInfo("leaving fill_Vessels_list()"); #endif }
/*************************************************************************************************************************/ public void fill_Vessels_list() { Log.PushStackInfo("FMRS_Core.fill_Vessels_list", "entering fill_Vessels_list()"); foreach (Vessel temp_vessel in FlightGlobals.Vessels) { if (!Vessels.Contains(temp_vessel.id)) { Vessels.Add(temp_vessel.id); Log.dbg("{0} Found", temp_vessel.vesselName); } } Log.PopStackInfo("leaving fill_Vessels_list()"); }
/*************************************************************************************************************************/ 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 void flight_scene_update_routine() { Log.PushStackInfo("FMRS_Core.flight_scene_update_routine", "entering flight_scene_update_routine()"); Instance = this; if (_SETTING_Enabled) { if (timer_start_delay_active) { if ((Timer_Start_Delay + Time_Trigger_Start_Delay) <= Planetarium.GetUniversalTime()) { if (!_SAVE_Switched_To_Dropped) { write_recovered_values_to_save(); } else { List <Guid> temp_guid_list = new List <Guid>(); foreach (Guid id in loaded_vessels) { if (FlightGlobals.Vessels.Find(v => v.id == id) == null) { temp_guid_list.Add(id); } } foreach (Guid id in temp_guid_list) { Log.dbg("loaded_vessels: removing " + id.ToString()); loaded_vessels.Remove(id); } Log.dbg("loaded_vessels: " + loaded_vessels.Count.ToString()); } timer_start_delay_active = false; } } if (timer_staging_active) { if (timer_cuto_active && _SETTING_Auto_Cut_Off) { //if ((Time_Trigger_Cuto + 0.1) <= Planetarium.GetUniversalTime()) //if (_SETTING_Auto_Cut_Off) { Log.dbg("auto thrust cut off"); foreach (Vessel temp_vessel in FlightGlobals.Vessels) { if (!Vessels.Contains(temp_vessel.id)) { temp_vessel.ctrlState.mainThrottle = 0; } } timer_cuto_active = false; } } if ((Time_Trigger_Staging + Timer_Stage_Delay) <= Planetarium.GetUniversalTime()) { Log.dbg("Has Staged Delayed"); last_staging_event = Planetarium.GetUniversalTime(); timer_staging_active = false; quicksave_file_name = FILES.GAMESAVE_NAME + FlightGlobals.ActiveVessel.currentStage.ToString(); if (Vessels_dropped.ContainsValue(quicksave_file_name) || (separated_vessel && !staged_vessel)) { int nr_save_file = 0; foreach (KeyValuePair <Guid, string> temp_keyvalues in Vessels_dropped) { if (temp_keyvalues.Value.Contains("separated_")) { if (nr_save_file <= Convert.ToInt16(temp_keyvalues.Value.Substring(20))) { nr_save_file = Convert.ToInt16(temp_keyvalues.Value.Substring(20)) + 1; } } } quicksave_file_name = FILES.GAMESAVE_NAME + "separated_" + nr_save_file; } separated_vessel = false; staged_vessel = false; if (search_for_new_vessels(quicksave_file_name)) { // GamePersistence.SaveGame(quicksave_file_name, HighLogic.SaveFolder + "/FMRS", SaveMode.OVERWRITE); FMRS_SAVE_Util.Instance.SaveGame("FMRS_Core.flight_scene_update_routine", quicksave_file_name, HighLogic.SaveFolder + "/FMRS", SaveMode.OVERWRITE); if (_SAVE_Main_Vessel != FlightGlobals.ActiveVessel.id && !_SAVE_Switched_To_Dropped) { main_vessel_changed(quicksave_file_name); } set_save_value(save_cat.SAVEFILE, quicksave_file_name, Planetarium.GetUniversalTime().ToString()); write_save_values_to_file(); } } } if (n_launchpad_preflight && !FlightGlobals.ActiveVessel.Landed) { EventReport dummy_event = null; Log.dbg("non launchpad launch"); n_launchpad_preflight = false; launch_routine(dummy_event); } } Log.PopStackInfo("leaving flight_scene_update_routine"); }
/*************************************************************************************************************************/ 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); }