void vesselRecovered(ProtoVessel vessel, bool b) { // note: this is called multiple times when a vessel is recovered, but its safe // find out if this was an EVA kerbal and if it was dead bool is_eva_dead = false; foreach (ProtoPartSnapshot p in vessel.protoPartSnapshots) { foreach (ProtoPartModuleSnapshot m in p.modules) { is_eva_dead |= (m.moduleName == "EVA" && Lib.GetProtoValue <bool>(m, "is_dead")); } } // set roster status of eva dead kerbals if (is_eva_dead) { vessel.GetVesselCrew()[0].rosterStatus = ProtoCrewMember.RosterStatus.Dead; } // forget kerbal data of recovered kerbals else { foreach (ProtoCrewMember c in vessel.GetVesselCrew()) { DB.ForgetKerbal(c.name); } } // forget vessel data DB.ForgetVessel(vessel.vesselID); }
public void ClearMissedMeals(ProtoVessel protoVessel) { if (protoVessel.GetVesselCrew().Count == 0) { return; } ProtoCrewMember[] crewMembers = protoVessel.GetVesselCrew().ToArray(); for (int index = 0; index < crewMembers.Length; index++) { crewMembers[index].inactive = false; SetMealsMissed(crewMembers[index], 0); } }
private void OnVesselRecovered(ProtoVessel v, bool quick) { // Don't check if we're not ready to complete if (!ReadyToComplete()) { return; } // EVA vessel if (v.vesselType == VesselType.EVA) { if (v.protoPartSnapshots != null) { foreach (ProtoPartSnapshot p in v.protoPartSnapshots) { foreach (ProtoCrewMember pcm in p.protoModuleCrew) { recovered[pcm.name] = true; } } } } else { foreach (ProtoCrewMember crew in v.GetVesselCrew()) { if (recovered.ContainsKey(crew.name)) { recovered[crew.name] = true; } } } TestConditions(); }
private void OnVesselRecovered(ProtoVessel v) { foreach (ProtoCrewMember crew in v.GetVesselCrew()) { if (recovered.ContainsKey(crew.name)) { recovered[crew.name] = true; } } // Retest the conditions bool success = ParameterDelegate <string> .CheckChildConditions(this, ""); if (ChildChanged || success) { ChildChanged = false; if (success) { SetState(ParameterState.Complete); } else { ContractConfigurator.OnParameterChange.Fire(Root, this); } } ContractConfigurator.OnParameterChange.Fire(Root, this); }
// KSP Events void OnVesselRecovered(ProtoVessel vessel, bool quick) { foreach (ProtoCrewMember kerbal in vessel.GetVesselCrew()) { kerbal.SetMissionFinished(Planetarium.GetUniversalTime()); } }
public void ExportSelectedCraft(Vessel vessel) { CreateFolder(); string filename = KSPUtil.ApplicationRootPath + "/Ships/export/" + HighLogic.SaveFolder + "_" + vessel.vesselName; Log($"Exporting vessel: {vessel.vesselName}\nExporting to file: {filename}"); ConfigNode nodeToSave = new ConfigNode(); //save vessel ConfigNode vesselNode = new ConfigNode("VESSEL"); ProtoVessel pVessel = vessel.BackupVessel(); pVessel.Save(vesselNode); nodeToSave.AddNode("VESSEL", vesselNode); //save active crew member info foreach (ProtoCrewMember pcm in pVessel.GetVesselCrew()) { ConfigNode pcmNode = new ConfigNode("CREW"); pcm.Save(pcmNode); nodeToSave.AddNode("CREW", pcmNode); } nodeToSave.Save(filename); ScreenMessage message = new ScreenMessage(vessel.vesselName + " exported to " + filename, 6, ScreenMessageStyle.UPPER_CENTER); ScreenMessages.PostScreenMessage(message); }
void vesselRecovered(ProtoVessel vessel, bool b) { // note: this is called multiple times when a vessel is recovered // for each crew member foreach (ProtoCrewMember c in vessel.GetVesselCrew()) { // avoid creating kerbal data in db again, // as this function may be called multiple times if (!DB.Kerbals().ContainsKey(c.name)) { continue; } // set roster status of eva dead kerbals if (DB.KerbalData(c.name).eva_dead) { c.rosterStatus = ProtoCrewMember.RosterStatus.Dead; } // forget kerbal data of recovered kerbals DB.ForgetKerbal(c.name); } // TODO: [SCIENCE] add science data from recovered vessel // beware of double calls to this function // forget vessel data DB.ForgetVessel(vessel.vesselID); // purge vessel from resource cache ResourceCache.Purge(vessel.vesselID); }
private void OnVesselRecovered(ProtoVessel v, bool quick) { LoggingUtil.LogVerbose(this, "OnVesselRecovered: {0}", v); // EVA vessel if (v.vesselType == VesselType.EVA) { foreach (ProtoPartSnapshot p in v.protoPartSnapshots) { foreach (string name in p.protoCrewNames) { // Find this crew member in our data and remove them ProtoCrewMember passenger = passengers.Keys.Where(pcm => pcm.name == name).FirstOrDefault(); if (passenger != null) { passengers[passenger] = false; } } } } // Vessel with crew foreach (ProtoCrewMember crewMember in v.GetVesselCrew()) { // Find this crew member in our data and remove them ProtoCrewMember passenger = passengers.Keys.Where(pcm => pcm == crewMember).FirstOrDefault(); if (passenger != null) { passengers[passenger] = false; } } }
void VesselRecovered(ProtoVessel pv, bool b) { // note: this is called multiple times when a vessel is recovered // for each crew member foreach (ProtoCrewMember c in pv.GetVesselCrew()) { // avoid creating kerbal data in db again, // as this function may be called multiple times if (!DB.ContainsKerbal(c.name)) { continue; } // set roster status of eva dead kerbals if (DB.Kerbal(c.name).eva_dead) { c.rosterStatus = ProtoCrewMember.RosterStatus.Dead; } // reset kerbal data of recovered kerbals DB.RecoverKerbal(c.name); } // purge the caches ResourceCache.Purge(pv); Cache.PurgeVesselCaches(pv); }
private void OnScienceReceived(float science, ScienceSubject subject, ProtoVessel vessel, bool flag) { Log.Detail("EventObserver::OnScienceReceived: " + science + ", flag=" + flag); if (vessel == null) { return; } HallOfFame halloffame = HallOfFame.Instance(); // halloffame.BeginArwardOfRibbons(); try { foreach (ProtoCrewMember kerbal in vessel.GetVesselCrew()) { if (!kerbal.IsTourist()) { halloffame.RecordScience(kerbal, science); CheckAchievementsForCrew(kerbal, false); } } } finally { // commit ribbons halloffame.EndArwardOfRibbons(); } }
private void OnVesselRecovered(ProtoVessel vessel) { if (vessel == null) { Log.Warning("vessel recover without a valid vessel detected"); return; } Log.Info("EventObserver:: OnVesselRecovered " + vessel.vesselName); // record recover of vessel recorder.RecordVesselRecovered(vessel); // check for kerbal specific achiements HallOfFame.Instance().BeginArwardOfRibbons(); foreach (ProtoCrewMember member in vessel.GetVesselCrew()) { CheckAchievementsForCrew(member); } HallOfFame.Instance().EndArwardOfRibbons(); // // ------ MissionSummary ------ if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { if (FinalFrontier.configuration.IsMissionSummaryEnabled()) { double technicalMissionEndTime = Planetarium.GetUniversalTime(); MissionSummaryWindow missionSummaryWindow = new MissionSummaryWindow(); missionSummaryWindow.SetSummaryForVessel(vessel, technicalMissionEndTime); missionSummaryWindow.SetVisible(true); } } // // refresh roster status HallOfFame.Instance().Refresh(); }
internal void OnVesselTerminated(ProtoVessel data) { LaunchEvent launch = GetLaunchByVesselId(data.vesselID.ToString()); if (launch != null) { VesselDestroyedEvent destroyed = new VesselDestroyedEvent(); launch.AddEvent(destroyed); EndFlightEvent endFlight = new EndFlightEvent(); float sumMass = 0; foreach (var part in data.protoPartSnapshots) { sumMass += part.mass; } endFlight.finalMass = sumMass; endFlight.crewMembers = new List <string>(); foreach (ProtoCrewMember kerbal in data.GetVesselCrew()) { endFlight.crewMembers.Add(kerbal.name); } launch.AddEvent(endFlight); } }
void VesselRecovered(ProtoVessel pv, bool b) { // note: this is called multiple times when a vessel is recovered // for each crew member foreach (ProtoCrewMember c in pv.GetVesselCrew()) { // avoid creating kerbal data in db again, // as this function may be called multiple times if (!DB.kerbals.ContainsKey(c.name)) continue; // set roster status of eva dead kerbals if (DB.Kerbal(c.name).eva_dead) { c.rosterStatus = ProtoCrewMember.RosterStatus.Dead; } // forget kerbal data of recovered kerbals DB.kerbals.Remove(c.name); } // for each part foreach (ProtoPartSnapshot p in pv.protoPartSnapshots) { // forget all potential vessel data DB.vessels.Remove(p.flightID); } // purge the caches Cache.Purge(pv); ResourceCache.Purge(pv); }
private void updateVesselInfo(Vessel vessel) { if (vessel == null || vessel.DiscoveryInfo.Level != DiscoveryLevels.Owned) { this.shipInfo = null; this.shipName = null; return; } ProtoVessel proto = vessel.protoVessel; double mass = 0; visitors.ForEach(v => v.reset()); var res = new SortedDictionary <string, ResourceData>(); foreach (ProtoPartSnapshot p in proto.protoPartSnapshots) { foreach (var r in p.resources) { ResourceData d; if (res.ContainsKey(r.resourceName)) { d = res[r.resourceName]; } else { d = new ResourceData(r.resourceName); } // var v = r.resourceValues; // d.current += doubleValue(v, "amount"); // d.max += doubleValue(v, "maxAmount"); d.current += r.amount; d.max += r.maxAmount; res[r.resourceName] = d; } visitors.ForEach(v => v.visit(p)); mass += p.mass; } var texts = res.Values.ToList().ConvertAll(d => d.ToString()); if (!vessel.isEVA) { texts.Add(""); var crew = proto.GetVesselCrew().Count(); mass += res.Values.Sum(d => d.GetMass()); var parts = proto.protoPartSnapshots.Count(); texts.Add(string.Format("Crew: {0}, Parts: {1}, Mass: {2:f2}t", crew, parts, mass)); visitors.ForEach(v => texts.AddRange(v.getTexts())); } this.shipInfo = string.Join("\n", texts.ToArray()); this.shipName = vessel.GetName(); }
/** * Removes the calculated number of snacks from the vessel. * returns the number of snacks that were required, but missing. * */ public double RemoveSnacks(ProtoVessel pv) { double demand = pv.GetVesselCrew().Count *snacksPer; double extra = CalculateExtraSnacksRequired(pv.GetVesselCrew()); //Debug.Log("SnackDemand(" + pv.vesselName +"): e: " + extra + " r:" + demand); if ((demand + extra) <= 0) { return(0); } double fed = GetSnackResource(pv.protoPartSnapshots, demand + extra); if (fed == 0)//unable to feed, no skipping or extra counted { return(pv.GetVesselCrew().Count *snacksPer); } return(demand + extra - fed); }
void onVesselRecoveryProcessing(ProtoVessel vessel, MissionRecoveryDialog d, float f) { double UT = Planetarium.GetUniversalTime(); var crew = vessel.GetVesselCrew(); foreach (var kerbal in crew) { ExperienceTracker.instance.FinishAllTasks(kerbal, UT); } }
void vesselTerminated(ProtoVessel vessel) { // forget all kerbals data foreach (ProtoCrewMember c in vessel.GetVesselCrew()) { DB.ForgetKerbal(c.name); } // forget vessel data DB.ForgetVessel(vessel.vesselID); }
public void RecordVesselRecovered(ProtoVessel vessel) { List<ProtoCrewMember> crew = vessel.GetVesselCrew(); foreach (ProtoCrewMember member in crew) { if (!member.IsTourist()) { Log.Info("kerbal " + member.name + " ended a mission "); hallOfFame.RecordMissionFinished(member); } } }
/// <summary> /// Remove Kerbal from tracking. /// </summary> /// <param name="proto"></param> private void OnVesselRecovered(ProtoVessel proto, bool mystery_var) { Log("Call -> OnVesselRecovered(..) for vessel: " + proto.vesselName); Log("Mystery bool = " + mystery_var); foreach (ProtoCrewMember kerbal in proto.GetVesselCrew()) { Log("Clearing EVA LS data for: " + kerbal.name); evals_info.Remove(kerbal.name); Log(" Successful!"); } }
/// <summary> /// Checks if the crew on a protoVessel has changed and sends the message accordingly /// </summary> public void ProcessKerbalsInVessel(ProtoVessel protoVessel) { if (protoVessel == null) { return; } foreach (var protoCrew in protoVessel.GetVesselCrew()) { MessageSender.SendKerbal(protoCrew); } }
private void OnVesselRecovered(ProtoVessel v, bool quick) { LoggingUtil.LogVerbose(this, "OnVesselRecovered: " + v); // EVA vessel if (v.vesselType == VesselType.EVA) { foreach (ProtoPartSnapshot p in v.protoPartSnapshots) { { LoggingUtil.LogVerbose(this, " p: " + p); foreach (string name in p.protoCrewNames) { // Find this crew member in our data foreach (VesselData vd in vessels) { foreach (CrewData cd in vd.crew) { if (cd.name == name && cd.addToRoster) { // Add them to the roster ProtoCrewMember pcm = HighLogic.CurrentGame.CrewRoster.AllKerbals().Where(cm => cm.name == cd.name).First(); pcm.type = ProtoCrewMember.KerbalType.Crew; } } } } } } } // Vessel with crew foreach (ProtoCrewMember crewMember in v.GetVesselCrew()) { // Find this crew member in our data foreach (VesselData vd in vessels) { foreach (CrewData cd in vd.crew) { if (cd.name == crewMember.name && cd.addToRoster) { // Add them to the roster ProtoCrewMember pcm = HighLogic.CurrentGame.CrewRoster.AllKerbals().Where(cm => cm.name == cd.name).First(); pcm.type = ProtoCrewMember.KerbalType.Crew; } } // Remove any other crew RemoveCrew(vd); } } }
public void RecordVesselRecovered(ProtoVessel vessel) { List <ProtoCrewMember> crew = vessel.GetVesselCrew(); foreach (ProtoCrewMember member in crew) { if (member.IsCrew()) { Log.Info("kerbal " + member.name + " ended a mission "); hallOfFame.RecordMissionFinished(member); } } }
void VesselTerminated(ProtoVessel pv) { // forget all kerbals data foreach (ProtoCrewMember c in pv.GetVesselCrew()) { DB.KillKerbal(c.name, true); } // purge the caches ResourceCache.Purge(pv); Cache.PurgeVesselCaches(pv); //Drive.Purge(pv); }
public void UnregisterCrew(ProtoVessel protoVessel) { List <ProtoCrewMember> crewManifest; int crewCount = 0; crewManifest = protoVessel.GetVesselCrew(); crewCount = crewManifest.Count; for (int index = 0; index < crewCount; index++) { UnregisterCrew(crewManifest[index]); } }
void vesselTerminated(ProtoVessel vessel) { // forget all kerbals data foreach (ProtoCrewMember c in vessel.GetVesselCrew()) { DB.ForgetKerbal(c.name); } // forget vessel data DB.ForgetVessel(vessel.vesselID); // purge vessel from resource cache ResourceCache.Purge(vessel.vesselID); }
private void OnVesselRecoveredOffGame(ProtoVessel vessel, bool wtf) { printDebug("entered; vessel: " + vessel.vesselName + "; wtf: " + wtf); // Switch tourists back to tourists List <ProtoCrewMember> crewList = vessel.GetVesselCrew(); foreach (ProtoCrewMember crew in crewList) { printDebug("crew=" + crew.name); if (Tourist.isTourist(crew)) { crew.type = ProtoCrewMember.KerbalType.Tourist; } } }
void VesselTerminated(ProtoVessel pv) { // forget all kerbals data foreach (ProtoCrewMember c in pv.GetVesselCrew()) { DB.KillKerbal(c.name, true); } DB.vessels.Remove(Lib.VesselID(pv)); // purge the caches ResourceCache.Purge(pv); Drive.Purge(pv); Cache.PurgeObjects(pv); }
private void OnVesselRecoveredOffGame(ProtoVessel vessel, bool wtf) { Log.dbg("entered; vessel: {0}; wtf: {1}", vessel.vesselName, wtf); // Switch tourists back to tourists List <ProtoCrewMember> crewList = vessel.GetVesselCrew(); foreach (ProtoCrewMember crew in crewList) { Log.dbg("crew={0}", crew.name); if (Tourist.isTourist(crew)) { crew.type = ProtoCrewMember.KerbalType.Tourist; } } }
/// <summary> /// This event is called when vessel is terminated from track station /// </summary> public void OnVesselTerminated(ProtoVessel terminatedVessel) { if (!LockSystem.LockQuery.CanRecoverOrTerminateTheVessel(terminatedVessel.vesselID, SettingsSystem.CurrentSettings.PlayerName)) { LunaScreenMsg.PostScreenMessage(LocalizationContainer.ScreenText.CannotTerminate, 5f, ScreenMessageStyle.UPPER_CENTER); return; } _recoveringTerminatingVesselId = terminatedVessel.vesselID; LunaLog.Log($"[LMP]: Removing vessel {terminatedVessel.vesselID}, Name: {terminatedVessel.vesselName} from the server: Terminated"); System.MessageSender.SendVesselRemove(terminatedVessel.vesselID); //Vessel is terminated so remove locks LockSystem.Singleton.ReleaseAllVesselLocks(terminatedVessel.GetVesselCrew().Select(c => c.name), terminatedVessel.vesselID); }
void VesselTerminated(ProtoVessel pv) { // forget all kerbals data foreach (ProtoCrewMember c in pv.GetVesselCrew()) DB.kerbals.Remove(c.name); // for each part foreach (ProtoPartSnapshot p in pv.protoPartSnapshots) { // forget all potential vessel data DB.vessels.Remove(p.flightID); } // purge the caches Cache.Purge(pv); ResourceCache.Purge(pv); }
private void OnVesselTerminated(ProtoVessel pv) { List <ProtoCrewMember> crew = pv.GetVesselCrew(); if (crew.Count > 0) { if (lockSystem.LockExists("control-" + pv.vesselID) && !lockSystem.LockIsOurs("control-" + pv.vesselID)) { if (!repLossHasReason) { repLossHasReason = true; repEventTimer = Client.realtimeSinceStartup; } } } }
private void OnVesselRecovered(ProtoVessel v) { // Don't check if we're not ready to complete if (!ReadyToComplete()) { return; } // EVA vessel if (v.vesselType == VesselType.EVA) { if (v.protoPartSnapshots != null) { foreach (ProtoPartSnapshot p in v.protoPartSnapshots) { foreach (ProtoCrewMember pcm in p.protoModuleCrew) { recovered[pcm.name] = true; } } } } else { foreach (ProtoCrewMember crew in v.GetVesselCrew()) { if (recovered.ContainsKey(crew.name)) { recovered[crew.name] = true; } } } TestConditions(); }
// callback for vessel recovered private void OnVesselRecovered(ProtoVessel vessel, bool flag) { // its better to be safe than sorry if (vessel == null) return; // // log crew statistics (not really useful) foreach (ProtoCrewMember kerbal in vessel.GetVesselCrew()) { Debug.Log("crew member " + kerbal.name + " total missions: " + adapter.GetMissionsFlownForKerbal(kerbal)); // without the current one Debug.Log("crew member " + kerbal.name + " research points: " + adapter.GetResearchForKerbal(kerbal)); Debug.Log("crew member " + kerbal.name + " dockings: " + adapter.GetDockingsForKerbal(kerbal)); Debug.Log("crew member " + kerbal.name + " contracts complteted: " + adapter.GetContractsCompletedForKerbal(kerbal)); } }
private void InitKMPVesselUpdate(Vessel _vessel, bool includeProtoVessel) { pos = new float[3]; dir = new float[3]; vel = new float[3]; o_vel = new double[3]; s_vel = new double[3]; w_pos = new double[3]; rot = new float[4]; id = _vessel.id; if (_vessel.packed) { flightCtrlState = new KMPFlightCtrlState(new FlightCtrlState()); } else { flightCtrlState = new KMPFlightCtrlState(_vessel.ctrlState); } if (includeProtoVessel) { protoVesselNode = new ConfigNode(); ProtoVessel proto; try { proto = new ProtoVessel(_vessel); } catch (Exception e) { Log.Debug("Exception thrown in InitKMPVesselUpdate(), catch 1, Exception: {0}", e.ToString()); proto = null; } if (proto != null) { foreach (ProtoCrewMember crewMember in proto.GetVesselCrew()) { crewMember.KerbalRef = null; } proto.Save(protoVesselNode); } } }
private void OnScienceReceived(float science, ScienceSubject subject, ProtoVessel vessel, bool flag) { Log.Detail("EventObserver::OnScienceReceived: " + science + ", flag=" + flag); if (vessel == null) return; HallOfFame halloffame = HallOfFame.Instance(); // halloffame.BeginArwardOfRibbons(); try { foreach (ProtoCrewMember kerbal in vessel.GetVesselCrew()) { if (!kerbal.IsTourist()) { halloffame.RecordScience(kerbal, science); CheckAchievementsForCrew(kerbal, false); } } } finally { // commit ribbons halloffame.EndArwardOfRibbons(); } }
/** * Removes the calculated number of snacks from the vessel. * returns the number of snacks that were required, but missing. * */ public double RemoveSnacks(ProtoVessel pv) { double demand = pv.GetVesselCrew().Count * snacksPer; double extra = CalculateExtraSnacksRequired(pv.GetVesselCrew()); //Debug.Log("SnackDemand(" + pv.vesselName +"): e: " + extra + " r:" + demand); if ((demand + extra) <= 0) return 0; double fed = GetSnackResource(pv.protoPartSnapshots, demand + extra); if (fed == 0)//unable to feed, no skipping or extra counted return pv.GetVesselCrew().Count * snacksPer; return demand + extra - fed; }
private void OnVesselRecovered(ProtoVessel v) { LoggingUtil.LogVerbose(this, "OnVesselRecovered: " + v); // EVA vessel if (v.vesselType == VesselType.EVA) { foreach (ProtoPartSnapshot p in v.protoPartSnapshots) { foreach (string name in p.protoCrewNames) { // Find this crew member in our data foreach (KerbalData kd in kerbals) { if (kd.name == name && kd.addToRoster) { // Add them to the roster kd.crewMember.type = ProtoCrewMember.KerbalType.Crew; } } } } } // Vessel with crew foreach (ProtoCrewMember crewMember in v.GetVesselCrew()) { foreach (KerbalData kd in kerbals) { if (kd.crewMember == crewMember && kd.addToRoster) { // Add them to the roster crewMember.type = ProtoCrewMember.KerbalType.Crew; } } } }
private void OnVesselRecovered(ProtoVessel v, bool quick) { LoggingUtil.LogVerbose(this, "OnVesselRecovered: " + v); // EVA vessel if (v.vesselType == VesselType.EVA) { foreach (ProtoPartSnapshot p in v.protoPartSnapshots) { foreach (string name in p.protoCrewNames) { // Find this crew member in our data and remove them ProtoCrewMember passenger = passengers.Keys.Where(pcm => pcm.name == name).FirstOrDefault(); if (passenger != null) { passengers[passenger] = false; } } } } // Vessel with crew foreach (ProtoCrewMember crewMember in v.GetVesselCrew()) { // Find this crew member in our data and remove them ProtoCrewMember passenger = passengers.Keys.Where(pcm => pcm == crewMember).FirstOrDefault(); if (passenger != null) { passengers[passenger] = false; } } }
private void OnVesselRecovered(ProtoVessel v) { // Don't check if we're not ready to complete if (!ReadyToComplete()) { return; } foreach (ProtoCrewMember crew in v.GetVesselCrew()) { if (recovered.ContainsKey(crew.name)) { recovered[crew.name] = true; } } TestConditions(); }
private void addRemoteVessel(ProtoVessel protovessel, Guid vessel_id, KMPVessel kvessel = null, KMPVesselUpdate update = null, double distance = 501d) { if (vessel_id == FlightGlobals.ActiveVessel.id && (serverVessels_InUse.ContainsKey(vessel_id) ? !serverVessels_InUse.ContainsKey(vessel_id) : false)) return; KMPClientMain.DebugLog("addRemoteVessel"); Vector3 newWorldPos = Vector3.zero, newOrbitVel = Vector3.zero; bool setTarget = false, wasLoaded = false, wasActive = false; Vessel oldVessel = null; try { //Ensure this vessel isn't already loaded oldVessel = FlightGlobals.Vessels.Find (v => v.id == vessel_id); if (oldVessel != null) { wasLoaded = oldVessel.loaded; if (protovessel.vesselType == VesselType.EVA && wasLoaded) { return; //Don't touch EVAs here } else { setTarget = FlightGlobals.fetch.VesselTarget != null && FlightGlobals.fetch.VesselTarget.GetVessel().id == vessel_id; if (oldVessel.loaded) { newWorldPos = oldVessel.transform.position; if (oldVessel.altitude > 10000d) newOrbitVel = oldVessel.GetObtVelocity(); } if (oldVessel.id == FlightGlobals.ActiveVessel.id) wasActive = true; } } if (protovessel.vesselType != VesselType.EVA && serverVessels_Parts.ContainsKey(vessel_id)) { KMPClientMain.DebugLog("killing known precursor vessels"); foreach (Part part in serverVessels_Parts[vessel_id]) { try { if (!part.vessel.isEVA && part.vessel.id != oldVessel.id) part.vessel.Die(); } catch {} } } } catch {} try { if ((protovessel.vesselType != VesselType.Debris && protovessel.vesselType != VesselType.Unknown) && protovessel.situation == Vessel.Situations.SUB_ORBITAL && protovessel.altitude < 25d) { //Land flags, vessels and EVAs that are on sub-orbital trajectory KMPClientMain.DebugLog("Placing sub-orbital protovessel on surface"); protovessel.situation = Vessel.Situations.LANDED; protovessel.landed = true; if (protovessel.vesselType == VesselType.Flag) protovessel.height = -1; } //Don't bother with suborbital debris else if (protovessel.vesselType == VesselType.Debris && protovessel.situation == Vessel.Situations.SUB_ORBITAL) return; CelestialBody body = null; if (update != null) { body = FlightGlobals.Bodies.Find(b => b.name == update.bodyName); if (update.situation != Situation.LANDED && update.situation != Situation.SPLASHED) { if (body.atmosphere && body.maxAtmosphereAltitude > protovessel.altitude) { //In-atmo vessel--only load if within visible range if (distance > 500d) return; } } } if (isInSafetyBubble(protovessel.position, body, protovessel.altitude)) //refuse to load anything too close to the KSC { KMPClientMain.DebugLog("Tried to load vessel too close to KSC"); return; } IEnumerator<ProtoCrewMember> crewEnum = HighLogic.CurrentGame.CrewRoster.GetEnumerator(); int applicants = 0; while (crewEnum.MoveNext()) if (crewEnum.Current.rosterStatus == ProtoCrewMember.RosterStatus.AVAILABLE) applicants++; if (protovessel.GetVesselCrew().Count * 5 > applicants) { KMPClientMain.DebugLog("Adding crew applicants"); for (int i = 0; i < (protovessel.GetVesselCrew().Count * 5);) { ProtoCrewMember protoCrew = CrewGenerator.RandomCrewMemberPrototype(); if (!HighLogic.CurrentGame.CrewRoster.ExistsInRoster(protoCrew.name)) { HighLogic.CurrentGame.CrewRoster.AddCrewMember(protoCrew); i++; } } } if (vessels.ContainsKey(vessel_id.ToString()) && (serverVessels_LoadDelay.ContainsKey(vessel_id) ? serverVessels_LoadDelay[vessel_id] < UnityEngine.Time.realtimeSinceStartup : true)) { if (wasActive) { KMPClientMain.DebugLog("Preparing active vessel for replacement"); oldVessel.MakeInactive(); foreach (Part part in oldVessel.Parts) { part.Rigidbody.detectCollisions = false; part.explosionPotential = 0; } bool inUse = serverVessels_InUse[oldVessel.id]; bool isPrivate = serverVessels_IsPrivate[oldVessel.id]; bool isMine = serverVessels_IsMine[oldVessel.id]; oldVessel.id = new Guid(); FlightGlobals.SetActiveVessel(oldVessel); serverVessels_InUse[oldVessel.id] = inUse; serverVessels_IsPrivate[oldVessel.id] = isPrivate; serverVessels_IsMine[oldVessel.id] = isMine; } else if (oldVessel != null && !oldVessel.isEVA) { KMPClientMain.DebugLog("Killing extant vessel"); oldVessel.Die(); } StartCoroutine(loadProtovessel(oldVessel, newWorldPos, newOrbitVel, wasLoaded, wasActive, setTarget, protovessel, vessel_id, kvessel, update, distance)); } } catch (Exception e) { KMPClientMain.DebugLog("Error adding remote vessel: " + e.Message + " " + e.StackTrace); } }
private void OnVesselRecovered(ProtoVessel v) { LoggingUtil.LogVerbose(this, "OnVesselRecovered: " + v); // EVA vessel if (v.vesselType == VesselType.EVA) { foreach (ProtoPartSnapshot p in v.protoPartSnapshots) { { LoggingUtil.LogVerbose(this, " p: " + p); foreach (string name in p.protoCrewNames) { // Find this crew member in our data foreach (VesselData vd in vessels) { foreach (CrewData cd in vd.crew) { if (cd.name == name && cd.addToRoster) { // Add them to the roster ProtoCrewMember pcm = HighLogic.CurrentGame.CrewRoster.AllKerbals().Where(cm => cm.name == cd.name).First(); pcm.type = ProtoCrewMember.KerbalType.Crew; } } } } } } } // Vessel with crew foreach (ProtoCrewMember crewMember in v.GetVesselCrew()) { // Find this crew member in our data foreach (VesselData vd in vessels) { foreach (CrewData cd in vd.crew) { if (cd.name == crewMember.name && cd.addToRoster) { // Add them to the roster ProtoCrewMember pcm = HighLogic.CurrentGame.CrewRoster.AllKerbals().Where(cm => cm.name == cd.name).First(); pcm.type = ProtoCrewMember.KerbalType.Crew; } } // Remove any other crew RemoveCrew(vd); } } }
private void OnVesselRecovered(ProtoVessel vessel) { if (vessel == null) { Log.Warning("vessel recover without a valid vessel detected"); return; } Log.Info("EventObserver:: OnVesselRecovered " + vessel.vesselName); // record recover of vessel recorder.RecordVesselRecovered(vessel); // check for kerbal specific achiements HallOfFame.Instance().BeginArwardOfRibbons(); foreach (ProtoCrewMember member in vessel.GetVesselCrew()) { CheckAchievementsForCrew(member); } HallOfFame.Instance().EndArwardOfRibbons(); // // ------ MissionSummary ------ if(HighLogic.LoadedScene == GameScenes.SPACECENTER) { if (FinalFrontier.configuration.IsMissionSummaryEnabled()) { double technicalMissionEndTime = Planetarium.GetUniversalTime(); MissionSummaryWindow missionSummaryWindow = new MissionSummaryWindow(); missionSummaryWindow.SetSummaryForVessel(vessel, technicalMissionEndTime); missionSummaryWindow.SetVisible(true); } } // // refresh roster status HallOfFame.Instance().Refresh(); }
private void addRemoteVessel(ProtoVessel protovessel, Guid vessel_id, KMPVesselUpdate update = null, double distance = 501d) { if (isInFlight && vessel_id == FlightGlobals.ActiveVessel.id) { KMPClientMain.DebugLog("Attempted to update controlled vessel!"); return; } KMPClientMain.DebugLog("addRemoteVessel"); Vector3 newWorldPos = Vector3.zero, newOrbitVel = Vector3.zero; bool setTarget = false, wasLoaded = false; try { //Ensure this vessel isn't already loaded Vessel oldVessel = FlightGlobals.Vessels.Find (v => v.id == vessel_id); if (oldVessel != null) { KMPClientMain.DebugLog("killing extant vessel"); wasLoaded = oldVessel.loaded; if (protovessel.vesselType == VesselType.EVA && wasLoaded) { return; //Don't touch EVAs here } else { setTarget = FlightGlobals.fetch.VesselTarget != null && FlightGlobals.fetch.VesselTarget.GetVessel().id == vessel_id; if (oldVessel.loaded) { newWorldPos = oldVessel.transform.position; if (oldVessel.altitude > 10000d) newOrbitVel = oldVessel.GetObtVelocity(); } oldVessel.Die(); } } if (protovessel.vesselType != VesselType.EVA && serverVessels_Parts.ContainsKey(vessel_id)) { KMPClientMain.DebugLog("killing known precursor vessels"); foreach (Part part in serverVessels_Parts[vessel_id]) { try { if (!part.vessel.isEVA) part.vessel.Die(); } catch {} } } } catch {} try { if ((protovessel.vesselType != VesselType.Debris && protovessel.vesselType != VesselType.Unknown) && protovessel.situation == Vessel.Situations.SUB_ORBITAL && protovessel.altitude < 25d) { //Land flags, vessels and EVAs that are on sub-orbital trajectory KMPClientMain.DebugLog("Placing sub-orbital protovessel on surface"); protovessel.situation = Vessel.Situations.LANDED; protovessel.landed = true; if (protovessel.vesselType == VesselType.Flag) protovessel.height = -1; } //Don't bother with suborbital debris else if (protovessel.vesselType == VesselType.Debris && protovessel.situation == Vessel.Situations.SUB_ORBITAL) return; CelestialBody body = null; if (update != null) { body = FlightGlobals.Bodies.Find(b => b.name == update.bodyName); if (update.situation != Situation.LANDED && update.situation != Situation.SPLASHED) { if (body.atmosphere && body.maxAtmosphereAltitude > protovessel.altitude) { //In-atmo vessel--only load if within visible range if (distance > 500d) return; } } } if (isInSafetyBubble(protovessel.position, body, protovessel.altitude)) //refuse to load anything too close to the KSC { KMPClientMain.DebugLog("Tried to load vessel too close to KSC"); return; } IEnumerator<ProtoCrewMember> crewEnum = HighLogic.CurrentGame.CrewRoster.GetEnumerator(); int applicants = 0; while (crewEnum.MoveNext()) if (crewEnum.Current.rosterStatus == ProtoCrewMember.RosterStatus.AVAILABLE) applicants++; if (protovessel.GetVesselCrew().Count * 5 > applicants) { KMPClientMain.DebugLog("Adding crew applicants"); for (int i = 0; i < (protovessel.GetVesselCrew().Count * 5);) { ProtoCrewMember protoCrew = CrewGenerator.RandomCrewMemberPrototype(); if (!HighLogic.CurrentGame.CrewRoster.ExistsInRoster(protoCrew.name)) { HighLogic.CurrentGame.CrewRoster.AddCrewMember(protoCrew); i++; } } } if (vessels.ContainsKey(vessel_id.ToString()) && (!serverVessels_LoadDelay.ContainsKey(vessel_id) || (serverVessels_LoadDelay.ContainsKey(vessel_id) ? serverVessels_LoadDelay[vessel_id] < UnityEngine.Time.realtimeSinceStartup : false))) { protovessel.Load(HighLogic.CurrentGame.flightState); Vessel created_vessel = protovessel.vesselRef; if (created_vessel != null) { try { OrbitPhysicsManager.HoldVesselUnpack(1); } catch (NullReferenceException) { } if (!created_vessel.loaded) created_vessel.Load(); KMPClientMain.DebugLog(created_vessel.id.ToString() + " initializing: ProtoParts=" + protovessel.protoPartSnapshots.Count+ ",Parts=" + created_vessel.Parts.Count + ",Sit=" + created_vessel.situation.ToString() + ",type=" + created_vessel.vesselType + ",alt=" + protovessel.altitude); vessels[vessel_id.ToString()].vessel.vesselRef = created_vessel; serverVessels_PartCounts[vessel_id] = created_vessel.Parts.Count; serverVessels_Parts[vessel_id] = new List<Part>(); serverVessels_Parts[vessel_id].AddRange(created_vessel.Parts); bool distanceBlocksUnload = false; if (created_vessel.vesselType != VesselType.Flag && created_vessel.vesselType != VesselType.EVA) { foreach (Part part in created_vessel.Parts) { part.OnLoad(); part.OnJustAboutToBeDestroyed += checkRemoteVesselIntegrity; part.explosionPotential = 0; part.terrainCollider = new PQS_PartCollider(); part.terrainCollider.part = part; part.terrainCollider.useVelocityCollider = false; part.terrainCollider.useGravityCollider = false; part.breakingForce = float.MaxValue; part.breakingTorque = float.MaxValue; } if (update != null && update.bodyName == FlightGlobals.ActiveVessel.mainBody.name) { KMPClientMain.DebugLog("update included"); //Update rotation created_vessel.SetRotation(new Quaternion(update.rot[0],update.rot[1],update.rot[2],update.rot[3])); if (update.relTime == RelativeTime.PRESENT) { if (newWorldPos != Vector3.zero) { KMPClientMain.DebugLog("repositioning"); created_vessel.transform.position = newWorldPos; if (wasLoaded) distanceBlocksUnload = Vector3.Distance(created_vessel.transform.position,FlightGlobals.ActiveVessel.transform.position) < 2000f; } if (newOrbitVel != Vector3.zero) { KMPClientMain.DebugLog("updating velocity"); created_vessel.ChangeWorldVelocity((-1 * created_vessel.GetObtVelocity()) + newOrbitVel); } //Update FlightCtrlState if (created_vessel.ctrlState == null) created_vessel.ctrlState = new FlightCtrlState(); created_vessel.ctrlState.CopyFrom(update.flightCtrlState.getAsFlightCtrlState(0.75f)); } else { serverVessels_InPresent[update.id] = false; foreach (Part part in created_vessel.Parts) { part.setOpacity(0.3f); } } } } if (!syncing && !distanceBlocksUnload) //This explicit Unload helps correct the effects of "Can't remove Part (Script) because PartBuoyancy (Script) depends on it" errors and associated NREs seen during rendezvous mode switching, but for unknown reasons it causes problems if active during universe sync created_vessel.Unload(); if (setTarget) StartCoroutine(setDockingTarget(created_vessel)); KMPClientMain.DebugLog(created_vessel.id.ToString() + " initialized"); } } } catch (Exception e) { KMPClientMain.DebugLog("Error adding remote vessel: " + e.Message + " " + e.StackTrace); } }
public void SetSummaryForVessel(ProtoVessel vessel, double missionEndTime = 0) { Summaries.Clear(); this.vessel = vessel; if (vessel == null) return; Log.Detail("showing mission summary for "+vessel); foreach(ProtoCrewMember kerbal in vessel.GetVesselCrew()) { Summary summary = new Summary(kerbal); Summaries.Add(summary); foreach (Ribbon ribbon in HallOfFame.Instance().GetRibbonsOfLatestMission(kerbal, missionEndTime)) { summary.newRibbons.Add(ribbon); } } }