public isDone ( Vessel vessel, |
||
vessel | Vessel | current vessel |
events | ||
return | bool |
/// <summary> /// Finishes the given mission with the given vessel. /// Rewards the space program with the missions reward. /// </summary> /// <param name="m">mission</param> /// <param name="vessel">vessel</param> public void finishMission(Mission m, Vessel vessel, GameEvent events) { if (!isMissionAlreadyFinished(m, vessel) && m.isDone(vessel, events)) { MissionStatus status = new MissionStatus(m.name, vessel.id.ToString()); status.repeatable = m.repeatable; status.repeatableSameVessel = m.repeatableSameVessel; if (m.passiveMission) { status.endOfLife = Planetarium.GetUniversalTime() + m.lifetime; status.passiveReward = m.passiveReward; status.lastPassiveRewardTime = Planetarium.GetUniversalTime(); } if (m.clientControlled) { status.endOfLife = Planetarium.GetUniversalTime() + m.lifetime; } status.clientControlled = m.clientControlled; currentProgram.add(status); reward(m.reward); // finish unfinished goals foreach (MissionGoal goal in m.goals) { finishMissionGoal(goal, vessel, events); } // If this mission is randomized, we will discard the mission if (m.randomized) { discardRandomMission(m); m = reloadMission(m, vessel); } } }
/// <summary> /// Calculates the mission status. Some fields are not set by this method unless the passed mission /// is the currently selected mission1!! /// </summary> /// <returns>The status.</returns> /// <param name="mission">Mission.</param> private Status calculateStatus(Mission mission, bool fullCheck = false, Vessel vessel = null) { Status s = new Status (); // Fill the mission status fields if (mission != null) { s.requiresAnotherMission = (mission.requiresMission.Length != 0 && !manager.isMissionAlreadyFinished (mission.requiresMission)); s.missionAlreadyFinished = (manager.isMissionAlreadyFinished (mission, vessel) || (!mission.repeatable && manager.isMissionAlreadyFinished(mission.name))); } // Fill the vessel fields, that are not dependant on the current mission if (vessel != null) { s.onLaunchPad = (vessel.situation == Vessel.Situations.PRELAUNCH); s.recyclable = ((vessel.Landed || vessel.Splashed) && !s.onLaunchPad && !vessel.isEVA && vessel.orbit.referenceBody.name.Equals("Kerbin") && !recycled); s.vesselCanFinishMissions = true; s.isClientControlled = manager.isClientControlled (vessel); s.isOnPassiveMission = manager.isOnPassiveMission (vessel); } // for all other fields we need both: a mission and a vessel if (vessel == null || mission == null) { return s; } s.canFinishMission = s.vesselCanFinishMissions && !s.requiresAnotherMission && !settings.disablePlugin; bool orderOk = true; // Only the selected mission is tracked and finishable. A preview Mission is *NOT* finishable. // We calculate the events only for the selected mission, because we might need to reset them. if (fullCheck) { if(eventFlags.Has(EventFlags.CRASHED)) { eventFlags = eventFlags.Remove (EventFlags.CRASHED); s.events.isCrashed = true; } if(eventFlags.Has (EventFlags.DOCKED)) { eventFlags = eventFlags.Remove (EventFlags.DOCKED); s.events.docked = true; } eventFlags = EventFlags.NONE; } foreach (MissionGoal g in mission.goals) { s.finishableGoals [g.id] = false; if (fullCheck && orderOk && g.isDone (vessel, s.events)) { if (g.nonPermanent && (s.canFinishMission || manager.isMissionGoalAlreadyFinished (g, vessel))) { s.finishableGoals [g.id] = true; // Let the manager handle the already finished goals... manager.finishMissionGoal (g, vessel, s.events); } } else { if (mission.inOrder) { orderOk = false; } } } if (s.canFinishMission && fullCheck) { s.missionIsFinishable = (!manager.isMissionAlreadyFinished(mission, vessel) && mission.isDone (vessel, s.events)); } else { s.missionIsFinishable = false; } return s; }
/// <summary> /// Calculates the mission status. Some fields are not set by this method unless the passed mission /// is the currently selected mission1!! /// </summary> /// <returns>The status.</returns> /// <param name="mission">Mission.</param> private Status calculateStatus(Mission mission, bool fullCheck = false, Vessel vessel = null) { Status s = new Status(); // Fill the mission status fields if (mission != null) { s.requiresAnotherMission = (mission.requiresMission.Length != 0 && !manager.isMissionAlreadyFinished(mission.requiresMission)); s.missionAlreadyFinished = (manager.isMissionAlreadyFinished(mission, vessel) || (!mission.repeatable && manager.isMissionAlreadyFinished(mission.name))); } // Fill the vessel fields, that are not dependant on the current mission if (vessel != null) { s.onLaunchPad = (vessel.situation == Vessel.Situations.PRELAUNCH); s.recyclable = ((vessel.Landed || vessel.Splashed) && !s.onLaunchPad && !vessel.isEVA && vessel.orbit.referenceBody.name.Equals("Kerbin") && !recycled); s.vesselCanFinishMissions = true; s.isClientControlled = manager.isClientControlled(vessel); s.isOnPassiveMission = manager.isOnPassiveMission(vessel); } // for all other fields we need both: a mission and a vessel if (vessel == null || mission == null) { return(s); } // edited malkuth to add that setting must be set to flight mode to save missons!! s.canFinishMission = s.vesselCanFinishMissions && !s.requiresAnotherMission && !settings.disablePlugin && settings.difficulty != 0; bool orderOk = true; // Only the selected mission is tracked and finishable. A preview Mission is *NOT* finishable. // We calculate the events only for the selected mission, because we might need to reset them. if (fullCheck) { if (eventFlags.Has(EventFlags.CRASHED)) { eventFlags = eventFlags.Remove(EventFlags.CRASHED); s.events.isCrashed = true; } if (eventFlags.Has(EventFlags.DOCKED)) { eventFlags = eventFlags.Remove(EventFlags.DOCKED); s.events.docked = true; } eventFlags = EventFlags.NONE; } foreach (MissionGoal g in mission.goals) { s.finishableGoals[g.id] = false; if (fullCheck && orderOk && g.isDone(vessel, s.events)) { if (g.nonPermanent && (s.canFinishMission || manager.isMissionGoalAlreadyFinished(g, vessel))) { s.finishableGoals[g.id] = true; // Let the manager handle the already finished goals... manager.finishMissionGoal(g, vessel, s.events); } } else { if (mission.inOrder) { orderOk = false; } } } if (s.canFinishMission && fullCheck) { s.missionIsFinishable = (!manager.isMissionAlreadyFinished(mission, vessel) && mission.isDone(vessel, s.events)); } else { s.missionIsFinishable = false; } return(s); }
/// <summary> /// Finishes the given mission with the given vessel. /// Rewards the space program with the missions reward. /// </summary> /// <param name="m">mission</param> /// <param name="vessel">vessel</param> public void finishMission(Mission m, Vessel vessel, GameEvent events) { if (!isMissionAlreadyFinished (m, vessel) && m.isDone(vessel, events)) { MissionStatus status = new MissionStatus (m.name, vessel.id.ToString ()); status.repeatable = m.repeatable; status.repeatableSameVessel = m.repeatableSameVessel; if (m.passiveMission) { status.endOfLife = Planetarium.GetUniversalTime () + m.lifetime; status.passiveReward = m.passiveReward; status.lastPassiveRewardTime = Planetarium.GetUniversalTime (); } if(m.clientControlled) { status.endOfLife = Planetarium.GetUniversalTime () + m.lifetime; } status.clientControlled = m.clientControlled; currentProgram.add(status); reward (m.reward); // finish unfinished goals foreach(MissionGoal goal in m.goals) { finishMissionGoal(goal, vessel, events); } // If this mission is randomized, we will discard the mission if (m.randomized) { discardRandomMission (m); m = reloadMission (m, vessel); } } }