/// <summary> /// This converts the actualFrozenKerbals actual object to a new dictionary for consumption /// </summary> /// <param name="actualFrozenKerbals"></param> /// <returns> /// Dictionary<string, KerbalInfo> of Frozen Kerbals /// </returns> private Dictionary <string, KerbalInfo> ExtractFrozenKerbalDict(object actualFrozenKerbals) { Dictionary <string, KerbalInfo> dictToReturn = new Dictionary <string, KerbalInfo>(); try { // SM - Replaced foreach with enumerator for performance (foreach = bad in Unity) IEnumerator frnKbls = ((IDictionary)actualFrozenKerbals).GetEnumerator(); while (frnKbls.MoveNext()) { if (frnKbls.Current == null) { continue; } Type typeitem = frnKbls.Current.GetType(); PropertyInfo[] itemprops = typeitem.GetProperties(BindingFlags.Instance | BindingFlags.Public); string itemkey = (string)itemprops[0].GetValue(frnKbls.Current, null); object itemvalue = itemprops[1].GetValue(frnKbls.Current, null); KerbalInfo itemkerbalinfo = new KerbalInfo(itemvalue); dictToReturn[itemkey] = itemkerbalinfo; } } catch (Exception ex) { LogFormatted("Unable to extract FrozenKerbals Dictionary: {0}", ex.Message); } return(dictToReturn); }
protected override void OnLoad(ConfigNode configNode) { base.OnLoad(configNode); foreach (ConfigNode child in configNode.GetNodes("KERBAL_INFO")) { KerbalInfo kerb = new KerbalInfo(); kerbalInfo.Add(kerb); kerb.kerbal = ConfigNodeUtil.ParseValue<Kerbal>(child, "kerbal"); kerb.kerbalType = ConfigNodeUtil.ParseValue<ProtoCrewMember.KerbalType?>(child, "kerbalType", null); kerb.trait = ConfigNodeUtil.ParseValue<string>(child, "trait", null); } }
protected override void OnLoad(ConfigNode configNode) { base.OnLoad(configNode); foreach (ConfigNode child in configNode.GetNodes("KERBAL_INFO")) { KerbalInfo kerb = new KerbalInfo(); kerbalInfo.Add(kerb); kerb.kerbal = ConfigNodeUtil.ParseValue <Kerbal>(child, "kerbal"); kerb.kerbalType = ConfigNodeUtil.ParseValue <ProtoCrewMember.KerbalType?>(child, "kerbalType", null); kerb.trait = ConfigNodeUtil.ParseValue <string>(child, "trait", null); } }
/// <summary> /// This converts the actualFrozenKerbals actual object to a new dictionary for consumption /// </summary> /// <param name="actualFrozenKerbals"></param> /// <returns>Dictionary <string, KerbalInfo> of Frozen Kerbals</returns> private Dictionary <string, KerbalInfo> ExtractFrozenKerbalDict(Object actualFrozenKerbals) { Dictionary <string, KerbalInfo> DictToReturn = new Dictionary <string, KerbalInfo>(); try { foreach (var item in (IDictionary)actualFrozenKerbals) { var typeitem = item.GetType(); PropertyInfo[] itemprops = typeitem.GetProperties(BindingFlags.Instance | BindingFlags.Public); string itemkey = (string)itemprops[0].GetValue(item, null); object itemvalue = (object)itemprops[1].GetValue(item, null); KerbalInfo itemkerbalinfo = new KerbalInfo(itemvalue); DictToReturn[itemkey] = itemkerbalinfo; } } catch (Exception ex) { LogFormatted("Unable to extract FrozenKerbals Dictionary: {0}", ex.Message); } return(DictToReturn); }
private void ThawKerbalStep4(String frozenkerbal) { Utilities.Log_Debug("ThawKerbalConfirm start for " + frozenkerbal); machine_hum.Stop(); //stop sound effects StoredCharge = 0; // Discharge all EC stored ProtoCrewMember kerbal = HighLogic.CurrentGame.CrewRoster.Crew.FirstOrDefault(a => a.name == frozenkerbal); if (!AddKerbal(kerbal, ToThawKerbalSeat)) { ThawKerbalAbort(frozenkerbal); return; } if (partHasStripLights && DeepFreeze.Instance.DFsettings.StripLightsActive) { stopStripLightFlash(ToThawKerbalSeat); } foreach (Animator anim in kerbal.KerbalRef.gameObject.GetComponentsInChildren<Animator>()) { if (anim.name == "kbIVA@idle") { Utilities.Log_Debug("Animator " + anim.name + " for " + kerbal.KerbalRef.name + " turned off"); anim.enabled = false; } } ToThawKerbal = ""; // Set the Active Thaw Kerbal to null IsThawActive = false; // Turn the Freezer actively thawing mode off ThawStepInProgress = 0; skipThawStep1 = false; ScreenMessages.PostScreenMessage(frozenkerbal + " thawed out", 5.0f, ScreenMessageStyle.UPPER_CENTER); if (emergencyThawInProgress) { ScreenMessages.PostScreenMessage(frozenkerbal + " was thawed out due to lack of Electrical Charge to run cryogenics", 5.0f, ScreenMessageStyle.UPPER_CENTER); Debug.Log("DeepFreezer - kerbal " + frozenkerbal + " was thawed out due to lack of Electrical charge to run cryogenics"); DeepFreeze.Instance.setComatoseKerbal(kerbal, ProtoCrewMember.KerbalType.Tourist); // Update the saved frozen kerbals dictionary KerbalInfo kerbalInfo = new KerbalInfo(Planetarium.GetUniversalTime()); kerbalInfo.vesselID = CrntVslID; kerbalInfo.vesselName = CrntVslName; kerbalInfo.experienceTraitName = kerbal.experienceTrait.Title; kerbalInfo.type = ProtoCrewMember.KerbalType.Tourist; kerbalInfo.status = ProtoCrewMember.RosterStatus.Assigned; if (partHasInternals) { kerbalInfo.seatName = ToFrzeKerbalXformNme; kerbalInfo.seatIdx = ToFrzeKerbalSeat; } else { kerbalInfo.seatName = "Unknown"; kerbalInfo.seatIdx = -1; } kerbalInfo.partID = CrntPartID; Utilities.Log_Debug("Adding New Comatose Crew to dictionary"); try { if (!DeepFreeze.Instance.DFgameSettings.KnownFrozenKerbals.ContainsKey(kerbal.name)) { DeepFreeze.Instance.DFgameSettings.KnownFrozenKerbals.Add(kerbal.name, kerbalInfo); } if (DeepFreeze.Instance.DFsettings.debugging) DeepFreeze.Instance.DFgameSettings.DmpKnownFznKerbals(); } catch (Exception ex) { Utilities.Log("Unable to add to knownfrozenkerbals comatose crewmember " + kerbal.name); Utilities.Log("Err: " + ex); ScreenMessages.PostScreenMessage("DeepFreezer mechanical failure", 5.0f, ScreenMessageStyle.UPPER_CENTER); } } Debug.Log("Thawed out: " + frozenkerbal); UpdateCounts(); // Update the Crew counts removeThawEvent(frozenkerbal); // Remove the Thaw Event for this kerbal. ding_ding.Play(); OpenPodAnimPlaying = false; onvslchgInternal = true; if (DFInstalledMods.IskerbalismInstalled) // IF Kerbalism Installed, add tracking. { Utilities.Log_Debug("kerbalism installed track kerbal=" + frozenkerbal); try { KBDisableKerbal(frozenkerbal, false); } catch (Exception ex) { Utilities.Log("DeepFreeze Exception attempting to track a kerbal in Kerbalism. Report this error on the Forum Thread."); Utilities.Log("DeepFreeze Err: " + ex); } } CrewHatchController.fetch.EnableInterface(); GameEvents.onVesselChange.Fire(vessel); GameEvents.onVesselWasModified.Fire(vessel); Utilities.Log_Debug("ThawKerbalConfirm End"); }
//Removes a frozen kerbal from the vessel. private bool RemoveKerbal(ProtoCrewMember kerbal, int SeatIndx) { try { Utilities.Log_Debug("RemoveKerbal " + kerbal.name + " seat " + SeatIndx); FrznCrewMbr tmpcrew = _StoredCrewList.Find(a => a.CrewName == kerbal.name); // Find the thawed kerbal in the frozen kerbal list. if (tmpcrew == null) { FrznCrewMbr frzncrew = new FrznCrewMbr(kerbal.name, SeatIndx, vessel.id, vessel.name); Utilities.Log_Debug("Adding _StoredCrewList entry"); _StoredCrewList.Add(frzncrew); } else { Utilities.Log("Found Kerbal in the stored frozen crew list for this part."); Utilities.Log("Crewmember:" + tmpcrew.CrewName + " Seat:" + tmpcrew.SeatIdx); } // Update the saved frozen kerbals dictionary KerbalInfo kerbalInfo = new KerbalInfo(Planetarium.GetUniversalTime()); kerbalInfo.vesselID = CrntVslID; kerbalInfo.vesselName = CrntVslName; kerbalInfo.type = ProtoCrewMember.KerbalType.Unowned; kerbalInfo.status = ProtoCrewMember.RosterStatus.Dead; if (partHasInternals) { kerbalInfo.seatName = part.internalModel.seats[SeatIndx].seatTransformName; kerbalInfo.seatIdx = SeatIndx; } else { kerbalInfo.seatName = "Unknown"; kerbalInfo.seatIdx = -1; } kerbalInfo.partID = CrntPartID; kerbalInfo.experienceTraitName = kerbal.experienceTrait.Title; Utilities.Log_Debug("Adding New Frozen Crew to dictionary"); try { if (!DeepFreeze.Instance.DFgameSettings.KnownFrozenKerbals.ContainsKey(kerbal.name)) { DeepFreeze.Instance.DFgameSettings.KnownFrozenKerbals.Add(kerbal.name, kerbalInfo); } if (DeepFreeze.Instance.DFsettings.debugging) DeepFreeze.Instance.DFgameSettings.DmpKnownFznKerbals(); } catch (Exception ex) { Utilities.Log("Unable to add to knownfrozenkerbals frozen crewmember " + kerbal.name); Utilities.Log("Err: " + ex); ScreenMessages.PostScreenMessage("DeepFreezer mechanical failure", 5.0f, ScreenMessageStyle.UPPER_CENTER); return false; } if (partHasInternals && ExternalDoorActive) Utilities.setHelmetshaders(kerbal.KerbalRef, true); // remove the CrewMember from the part crewlist and unregister their traits, because they are frozen, and this is the only way to trick the game. kerbal.UnregisterExperienceTraits(part); part.protoModuleCrew.Remove(kerbal); if (partHasInternals) { if (part.internalModel.seats[SeatIndx].kerbalRef != kerbal.KerbalRef) { part.internalModel.seats[SeatIndx].kerbalRef = kerbal.KerbalRef; setseatstaticoverlay(part.internalModel.seats[SeatIndx]); } part.internalModel.seats[SeatIndx].taken = true; // Set their seat to Taken, because they are really still there. :) seatTakenbyFrznKerbal[SeatIndx] = true; } // Set our newly frozen Popsicle, er Kerbal, to Unowned type (usually a Crew) and Dead status. kerbal.type = ProtoCrewMember.KerbalType.Unowned; kerbal.rosterStatus = ProtoCrewMember.RosterStatus.Dead; if (kerbal.KerbalRef != null) { //Remove them from the GUIManager Portrait cams. DFPortraits.DestroyPortrait(kerbal.KerbalRef); } return true; } catch (Exception ex) { Debug.Log("Remove Kerbal " + kerbal.name + " for DeepFreeze failed"); Debug.Log("Err: " + ex); return false; } }
private void ChkUnknownFrozenKerbals() { // Check the roster list for any unknown dead kerbals (IE: Frozen) that were not in the save file and add them. //unknownkerbals.Clear(); unknownkerbals = HighLogic.CurrentGame.CrewRoster.Unowned.ToList(); if (unknownkerbals != null) { Utilities.Log("There are " + unknownkerbals.Count + " unknownKerbals in the game roster."); foreach (ProtoCrewMember CrewMember in unknownkerbals) { if (CrewMember.rosterStatus == ProtoCrewMember.RosterStatus.Dead) { if (!DeepFreeze.Instance.DFgameSettings.KnownFrozenKerbals.ContainsKey(CrewMember.name)) { // Update the saved frozen kerbals dictionary KerbalInfo kerbalInfo = new KerbalInfo(Planetarium.GetUniversalTime()); kerbalInfo.vesselID = Guid.Empty; kerbalInfo.vesselName = ""; kerbalInfo.type = CrewMember.type; kerbalInfo.status = CrewMember.rosterStatus; //kerbalInfo.seatName = "Unknown"; kerbalInfo.seatIdx = 0; kerbalInfo.partID = 0; kerbalInfo.experienceTraitName = CrewMember.experienceTrait.Title; try { Utilities.Log("Adding dead unknown kerbal " + CrewMember.name + " AKA FROZEN kerbal to DeepFreeze List"); DeepFreeze.Instance.DFgameSettings.KnownFrozenKerbals.Add(CrewMember.name, kerbalInfo); } catch (Exception ex) { Utilities.Log("Add of dead unknown kerbal " + CrewMember.name + " failed " + ex); } } } } } }