예제 #1
0
        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);
        }
예제 #2
0
        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();
        }
예제 #4
0
        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);
        }
예제 #5
0
 // KSP Events
 void OnVesselRecovered(ProtoVessel vessel, bool quick)
 {
     foreach (ProtoCrewMember kerbal in vessel.GetVesselCrew())
     {
         kerbal.SetMissionFinished(Planetarium.GetUniversalTime());
     }
 }
예제 #6
0
        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);
        }
예제 #7
0
        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;
                }
            }
        }
예제 #9
0
        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);
        }
예제 #10
0
            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();
                }
            }
예제 #11
0
            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();
            }
예제 #12
0
        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);
            }
        }
예제 #13
0
		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);
		}
예제 #14
0
        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();
        }
예제 #15
0
        /**
         * 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);
        }
예제 #16
0
        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);
            }
        }
예제 #17
0
        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);
        }
     }
 }
예제 #19
0
        /// <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!");
            }
        }
예제 #20
0
        /// <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);
            }
        }
예제 #21
0
        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);
                }
            }
        }
예제 #22
0
            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);
                    }
                }
            }
예제 #23
0
        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);
        }
예제 #24
0
        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]);
            }
        }
예제 #25
0
        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);
        }
예제 #26
0
        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;
                }
            }
        }
예제 #27
0
        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;
                }
            }
        }
예제 #29
0
        /// <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);
        }
예제 #30
0
		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);
		}
예제 #31
0
        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();
        }
예제 #33
0
 // 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));
      }
 }
예제 #34
0
 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);
         }
     }
 }
예제 #35
0
 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();
    }
 }
예제 #36
0
 /**
  * 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();
        }
예제 #40
0
        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);
                }
            }
        }
예제 #42
0
         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();
         }
예제 #43
0
        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);
       }
    }
 }