public override void OnStart(StartState startState) { base.OnStart(startState); SpawnManager.Init(part); if (!string.IsNullOrEmpty(ConstructionNode)) { construction_node = part.FindAttachNode(ConstructionNode); foreach (var port in part.FindModulesImplementing <ModuleDockingNode>()) { if (port.nodeTransformName == ConstructionNode || port.referenceAttachNode == ConstructionNode) { construction_port = port; break; } } } if (construction_node == null) { this.Log("ERROR: unable to find construction AttachNode with id: {}", ConstructionNode); this.EnableModule(false); return; } if (kit && ConstructDockingNode >= 0) { construct_docking_node = kit.DockingNodes[ConstructDockingNode]; } if (vessel != null) { StartCoroutine(CallbackUtil.DelayedCallback(1, find_connected_workshops)); } }
public void UpdateGUI(ShipConstruct ship) { if (isActiveAndEnabled) { StartCoroutine(CallbackUtil.DelayedCallback(1, () => MassDisplay = Utils.formatMass(part.TotalMass()))); } }
public void OnEditorScreenChange(EditorScreen e) { if (e == EditorScreen.Crew) { StartCoroutine(CallbackUtil.DelayedCallback(1, BuildCrewAssignmentDialogue)); } }
void OnLevelWasLoaded(GameScenes scene) { if (scene == GameScenes.MAINMENU) { StartCoroutine(CallbackUtil.DelayedCallback(15, LoadGame)); } }
void Rescale() { if (model == null) { return; } Scale _scale = scale; //change model scale model.localScale = _scale.ScaleVector(orig_local_scale); // this.Log("size {}/{}, orig scale: {}, local scale: {}", size, orig_size, orig_local_scale, model.localScale);//debug model.hasChanged = true; part.transform.hasChanged = true; //recalculate mass and cost mass = ((specificMass.x * _scale + specificMass.y) * _scale + specificMass.z) * _scale * _scale.aspect + specificMass.w; cost = ((specificCost.x * _scale + specificCost.y) * _scale + specificCost.z) * _scale * _scale.aspect + specificCost.w; //update nodes and modules updaters.ForEach(u => u.OnRescale(_scale)); //save size and aspect old_size = size; old_aspect = aspect; old_local_scale = model.localScale; Utils.UpdateEditorGUI(); if (HighLogic.LoadedSceneIsFlight) { StartCoroutine(CallbackUtil.DelayedCallback(1, UpdateDragCube)); } just_loaded = false; }
public void onMapEntered() { if (MapNode.AllMapNodes.Count == 0) { base.StartCoroutine(CallbackUtil.DelayedCallback(10, new Callback(this.processMapNodes))); } else { bool containsCBs = false; for (int mnI = 0; mnI < MapNode.AllMapNodes.Count; mnI++) { if (MapNode.AllMapNodes[mnI].mapObject != null) { if (MapNode.AllMapNodes[mnI].mapObject.celestialBody != null) { containsCBs = true; break; } } } if (containsCBs) { processMapNodes(); } else { base.StartCoroutine(CallbackUtil.DelayedCallback(10, new Callback(this.processMapNodes))); } } }
void OnLevelWasLoaded(GameScenes scene) { if (scene == GameScenes.SPACECENTER && Vessel >= 0) { StartCoroutine(CallbackUtil.DelayedCallback(15, SwitchVessel)); } }
private void OnDestroy() { if (vessel != null && vessel.gameObject.activeInHierarchy && FlightGlobals.fetch != null && ReferenceEquals(FlightGlobals.fetch.VesselTarget, this)) { vessel.StartCoroutine(CallbackUtil.DelayedCallback(1, FlightGlobals.fetch.SetVesselTarget, vessel, false)); } Fields[nameof(numSegments)].OnValueModified -= onNumSegmentsChange; Fields[nameof(ShowUI)].OnValueModified -= showUI; Fields[nameof(ShowConstructionUI)].OnValueModified -= showConstructionUI; GameEvents.onVesselWasModified.Remove(onVesselWasModified); GameEvents.onVesselCrewWasModified.Remove(onVesselCrewWasModified); axisController?.Disconnect(); axisController = null; UI?.Close(); cUI?.Close(); #if NIGHTBUILD GlobalsReloader.RemoveListener(onGlobalsLoaded); #endif }
bool same_vessel_collision_if_deployed() { var B = get_deployed_part_bounds(true); for (int i = 0, vesselPartsCount = vessel.Parts.Count; i < vesselPartsCount; i++) { var p = vessel.Parts[i]; if (p == part) { continue; } if (p.parent == part || part.parent == p) { continue; } var pM = new Metric(p, true, true); for (int j = 0, pMhullPointsCount = pM.hull.Points.Count; j < pMhullPointsCount; j++) { var c = pM.hull.Points[j]; var lc = model.InverseTransformDirection(c - model.position); if (B.Contains(lc)) { p.HighlightAlways(Colors.Danger.color); StartCoroutine(CallbackUtil.DelayedCallback(3f, () => p?.SetHighlightDefault())); ShowDeployHint = true; return(true); } } } return(false); }
public void CrewTransfer_MoveCrewTo() { _initialEyePosition = ActiveKerbal.KerbalRef.eyeInitialPos; FreeIva.InitialPart.RemoveCrewmember(ActiveKerbal); FreeIva.CurrentPart.AddCrewmemberAt(ActiveKerbal, TargetedSeatIndex); GameEvents.onCrewTransferred.Fire(new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(ActiveKerbal, FreeIva.InitialPart, FreeIva.CurrentPart)); FlightGlobals.ActiveVessel.DespawnCrew(); base.StartCoroutine(CallbackUtil.DelayedCallback(1, new Callback(CrewTransfer_waitAndCompleteTransfer))); }
internal Part LoadPart(ProtoPartSnapshot protoPart) { Part newPart = (Part)GameObject.Instantiate(protoPart.partPrefab, vessel.transform.position, vessel.transform.rotation); if (rootPart != null) { newPart.transform.parent = rootPart.transform; newPart.setParent(rootPart); } else { newPart.transform.parent = vessel.transform; } newPart.transform.localPosition = protoPart.position; newPart.transform.localRotation = protoPart.rotation; newPart.gameObject.SetActive(true); newPart.vessel = vessel; int index = 0; foreach (var module in protoPart.modules) { //if (!blacklist.Contains(module.moduleName)) //{ //Log.Normal("Loaded Module: " + (module.moduleName)); module.Load(newPart, ref index); //} } PartModule[] partModules = newPart.Modules.Cast <PartModule>().ToArray(); foreach (var module in partModules) { if (delayList.Contains(module.moduleName)) { StartCoroutine(CallbackUtil.DelayedCallback(10, DestroyDelayed, module)); } else { if (!blackList.Contains(module.moduleName)) { Log.Normal("Loaded Module: " + (module.moduleName)); module.OnAwake(); module.OnStart(PartModule.StartState.PreLaunch); } newPart.Modules.Remove(module); GameObject.DestroyImmediate(module); } } vessel.parts.Add(newPart); allObjects.Add(newPart); return(newPart); }
private void onLevelWasLoaded(GameScenes scene) { if (scene != GameScenes.SPACECENTER || activeVessel < 0) { return; } AutoLoadGame.Log("SPACECENTER is loaded. Waiting 60 frames and switching to the active vessel."); StartCoroutine(CallbackUtil.DelayedCallback(60, switch_to_active_vessel)); }
private void onLevelWasLoaded(GameScenes scene) { if (scene != GameScenes.MAINMENU) { return; } Log("MAINMENU is loaded. Waiting 60 frames and loading the save."); StartCoroutine(CallbackUtil.DelayedCallback(60, LoadGame)); }
private void OnLevelWasLoaded(GameScenes scene) { PatchColliders(); PatchFlightIntegrator(); FixCameras(); PatchTimeOfDayAnimation(); StartCoroutine(CallbackUtil.DelayedCallback(3, FixFlags)); PatchContracts(); previousScene = HighLogic.LoadedScene; }
public override void OnStart(StartState state) { base.OnStart(state); just_started = true; StartCoroutine(CallbackUtil.DelayedCallback(1, create_deploy_hint_mesh)); if (State == DeplyomentState.DEPLOYING) { StartCoroutine(deploy()); } }
void Start() { this.Log("Starting WorldSpaceTrace for {}s at {}", Delay, transform.position); StartCoroutine(CallbackUtil.DelayedCallback (Delay, () => { if (gameObject != null) { Destroy(gameObject); } })); }
private void OnLevelWasLoaded(GameScenes scene) { PatchFlightIntegrator(); FixCameras(); PatchTimeOfDayAnimation(); StartCoroutine(CallbackUtil.DelayedCallback(3, FixFlags)); for (Int32 i = 0; i < PSystemManager.Instance.localBodies.Count; i++) { PatchStarReferences(PSystemManager.Instance.localBodies[i]); PatchContractWeight(PSystemManager.Instance.localBodies[i]); } }
void fromEVA(GameEvents.FromToAction <Part, Part> data) { // use Hydrazine instead of MonoPropellant if RealFuel is installed string monoprop_name = detected_mods.RealFuels ? "Hydrazine" : "MonoPropellant"; // get any leftover EVA Fuel from EVA vessel double monoprop = data.from.Resources.list[0].amount; // add the leftover monoprop back to the pod data.to.RequestResource(monoprop_name, -monoprop); // manage resources in rules foreach (Rule r in rules) { if (r.resource_name.Length == 0 || r.on_eva <= double.Epsilon) { continue; } double leftover = ResourceCache.Info(data.from.vessel, r.resource_name).amount; data.to.RequestResource(r.resource_name, -leftover); } // merge EVA computer files into vessel Computer a = DB.VesselData(data.from.vessel.id).computer; Computer b = DB.VesselData(data.to.vessel.id).computer; b.merge(a); // forget vessel data DB.ForgetVessel(data.from.vessel.id); // purge vessel from resource cache ResourceCache.Purge(data.from.vessel.id); // execute script on vessel computer if (DB.Ready()) { DB.VesselData(data.to.vessel.id).computer.execute("run", "auto/eva_in", string.Empty, data.to.vessel); } // mute messages for a couple seconds to avoid warning messages from the vessel resource amounts Message.MuteInternal(); base.StartCoroutine(CallbackUtil.DelayedCallback(2.0f, Message.UnmuteInternal)); // if vessel info is open, switch to the vessel if (Info.IsOpen()) { Info.Open(data.to.vessel); } }
void onPartJointBreak(PartJoint joint, float force) { if (state != State.Fixed || !IsDocked) { return; } var dockedPart = vessel[dockedPartUId]; if (joint.Parent == part && joint.Child == dockedPart || joint.Parent == dockedPart && joint.Child == part) { state = State.Broken; StartCoroutine(CallbackUtil.DelayedCallback(3, part.explode)); } }
public static void CreateMissingPartsInCurrentProtoVessel(Vessel vessel, ProtoVessel protoVessel) { //TODO: This is old code where we created parts dinamically but it's quite buggy. It create parts in the CURRENT vessel so it wont work for other vessels //We've run trough all the vessel parts and removed the ones that don't exist in the definition. //Now run trough the parts in the definition and add the parts that don't exist in the vessel. var partsToInit = new List <ProtoPartSnapshot>(); foreach (var partSnapshot in protoVessel.protoPartSnapshots) { if (partSnapshot.FindModule("ModuleDockingNode") != null) { //We are in a docking port part so remove it from our own vessel if we have it if (FlightGlobals.FindLoadedPart(partSnapshot.persistentId, out var vesselPart)) { vesselPart.Die(); } } //Skip parts that already exists if (FlightGlobals.FindLoadedPart(partSnapshot.persistentId, out _)) { continue; } var newPart = partSnapshot.Load(vessel, false); vessel.parts.Add(newPart); partsToInit.Add(partSnapshot); } //Init new parts. This must be done in another loop as otherwise new parts won't have their correct attachment parts. foreach (var partSnapshot in partsToInit) { partSnapshot.Init(vessel); } vessel.RebuildCrewList(); MainSystem.Singleton.StartCoroutine(CallbackUtil.DelayedCallback(0.25f, () => { if (FlightGlobals.ActiveVessel) { FlightGlobals.ActiveVessel.SpawnCrew(); } })); MainSystem.Singleton.StartCoroutine(CallbackUtil.DelayedCallback(0.5f, () => { if (KerbalPortraitGallery.Instance) { KerbalPortraitGallery.Instance.SetActivePortraitsForVessel(FlightGlobals.ActiveVessel); } })); }
public void ShowGroup() { var group = GetGroup(); group.ForEach(m => m.part.HighlightAlways(m.TCA_Active? Color.green : (m.GroupMaster? Color.magenta : Color.cyan))); StartCoroutine(CallbackUtil.DelayedCallback(3.0f, () => group.ForEach(m => { if (m != null && m.part != null) { m.part.SetHighlightDefault(); } }))); }
public void ShowGroup() { var group = GetGroup(); group.ForEach(m => m.part.HighlightAlways(m.TCA_Active ? Colors.Enabled : (m.GroupMaster ? Colors.Selected2 : Colors.Selected1))); StartCoroutine(CallbackUtil.DelayedCallback(3.0f, () => group.ForEach(m => { if (m != null && m.part != null) { m.part.SetHighlightDefault(); } }))); }
private void OnLevelWasLoaded(GameScenes scene) { PatchColliders(); PatchFlightIntegrator(); FixCameras(); PatchTimeOfDayAnimation(); StartCoroutine(CallbackUtil.DelayedCallback(3, FixFlags)); //Small Contract fixer to remove Sentinel Contracts Type contractTypeToRemove = null; try { foreach (Type contract in Contracts.ContractSystem.ContractTypes) { try { if (contract.FullName.Contains("SentinelContract")) { contractTypeToRemove = contract; } } catch { continue; } } if (!(contractTypeToRemove == null)) { ContractSystem.ContractTypes.Remove(contractTypeToRemove); contractTypeToRemove = null; Debug.Log("[Kopernicus] ScenarioDiscoverableObjects is removed, scrubbing SENTINEL contracts."); } } catch { contractTypeToRemove = null; } //Patch weights of contracts for (Int32 i = 0; i < PSystemManager.Instance.localBodies.Count; i++) { PatchStarReferences(PSystemManager.Instance.localBodies[i]); PatchContractWeight(PSystemManager.Instance.localBodies[i]); } }
private void updatePhysicsParams() { updateCoMOffset(); delayedUpdateInertiaTensor(); #if DEBUG StartCoroutine(CallbackUtil.DelayedCallback(3, () => { if (vessel != null) { VesselMass = vessel.GetTotalMass(); } else if (HighLogic.LoadedSceneIsEditor) { VesselMass = EditorLogic.fetch.ship.GetTotalMass(); } })); #endif }
public void UpdateMesh() { if (body_mesh == null || body_collider == null) { return; } update_body(); update_attach_nodes(); update_passage(); var data = new BaseEventDetails(BaseEventDetails.Sender.AUTO); data.Set <string>("volName", "Tankage"); data.Set <double>("newTotalVolume", body.current.V * UsableVolumeRatio); part.SendEvent("OnPartVolumeChanged", data); old_size = size; old_aspect = aspect; Utils.UpdateEditorGUI(); StartCoroutine(CallbackUtil.DelayedCallback(1, UpdateDragCube)); just_loaded = false; }
public void Decouple() { var dockedPart = vessel[dockedPartUId]; if (dockedPart != null) { restore_docking_info(dockedPart); var parent = part.parent; var old_vessel = vessel; var referenceTransformId = vessel.referenceTransformId; if (parent != dockedPart) { dockedPart.Undock(docked_vessel); dockedPart.attachNodes.Remove(grappleNode); } else { part.Undock(this_vessel); part.attachNodes.Remove(grappleNode); } grappleNode.attachedPart = null; grappleNode.owner = null; part.fuelLookupTargets.Remove(dockedPart); dockedPart.fuelLookupTargets.Remove(part); GameEvents.onPartFuelLookupStateChange.Fire(new GameEvents.HostedFromToAction <bool, Part>(true, part, dockedPart)); AddForceAlongGrapples(dockedPart, -GrappleForce); if (old_vessel == FlightGlobals.ActiveVessel) { if (old_vessel[referenceTransformId] == null) { StartCoroutine(CallbackUtil.DelayedCallback(1, () => FlightGlobals.ForceSetActiveVessel(vessel))); } } } if (armAnimator != null) { armAnimator.Close(); } state = State.Idle; update_part_menu(); }
void Rescale() { if (model == null) { return; } var scale = GetScale(); update_model(scale); //update modules updaters.ForEach(u => u.OnRescale(scale)); //save size and aspect old_size = size; old_aspect = aspect; old_local_scale = model.localScale; Utils.UpdateEditorGUI(); if (HighLogic.LoadedSceneIsFlight) { StartCoroutine(CallbackUtil.DelayedCallback(1, UpdateDragCube)); } just_loaded = false; }
void toEVA(GameEvents.FromToAction <Part, Part> data) { // use Hydrazine instead of MonoPropellant if RealFuel is installed string monoprop_name = detected_mods.RealFuels ? "Hydrazine" : "MonoPropellant"; // determine if inside breathable atmosphere // note: the user can force the helmet + oxygen by pressing shift when going on eva bool breathable = Sim.Breathable(data.from.vessel) && !(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)); // get total crew in the origin vessel double tot_crew = (double)data.from.vessel.GetVesselCrew().Count + 1.0; // EVA vessels start with 5 units of eva fuel, remove them data.to.RequestResource("EVA Propellant", 5.0); // determine how much MonoPropellant to get // note: never more that the 'share' of this kerbal double monoprop = Math.Min(ResourceCache.Info(data.from.vessel, monoprop_name).amount / tot_crew, Settings.MonoPropellantOnEVA); // get monoprop from the vessel monoprop = data.from.RequestResource(monoprop_name, monoprop); // transfer monoprop to the EVA kerbal data.to.RequestResource("EVA Propellant", -monoprop); // show warning if there isn't monoprop in the eva suit if (monoprop <= double.Epsilon && !Lib.Landed(data.from.vessel)) { Message.Post(Severity.danger, Lib.BuildString("There isn't any <b>", monoprop_name, "</b> in the EVA suit", "Don't let the ladder go!")); } // manage resources from rules foreach (Rule r in rules) { if (r.resource_name.Length == 0 || r.on_eva <= double.Epsilon) { continue; } // determine amount to take, never more that his own share double amount = Math.Min(ResourceCache.Info(data.from.vessel, r.resource_name).amount / tot_crew, r.on_eva); // deal with breathable modifier if (breathable && r.modifier.Contains("breathable")) { continue; } // remove resource from the vessel amount = data.from.RequestResource(r.resource_name, amount); // create new resource in the eva kerbal Lib.SetupResource(data.to, r.resource_name, amount, r.on_eva); } // get KerbalEVA KerbalEVA kerbal = data.to.FindModuleImplementing <KerbalEVA>(); // turn off headlamp light, to avoid stock bug that show the light for a split second when going on eva EVA.SetHeadlamp(kerbal, false); EVA.SetFlares(kerbal, false); // remove the helmet if inside breathable atmosphere // note: done in EVA::FixedUpdate(), but also done here avoid 'popping' of the helmet when going on eva EVA.SetHelmet(kerbal, !breathable); // remember if the kerbal has an helmet EVA.KerbalData(data.to.vessel).has_helmet = !breathable; // execute script on vessel computer if (DB.Ready()) { DB.VesselData(data.from.vessel.id).computer.execute("run", "auto/eva_out", string.Empty, data.from.vessel); } // mute messages for a couple seconds to avoid warning messages from the vessel resource amounts Message.MuteInternal(); base.StartCoroutine(CallbackUtil.DelayedCallback(2.0f, Message.UnmuteInternal)); // if vessel info is open, switch to the eva kerbal // note: for a single tick, the EVA vessel is not valid (sun_dist is zero) // this make IsVessel() return false, that in turn close the vessel info instantly // for this reason, we wait a small amount of time before switching the info window if (Info.IsOpen()) { Info.Open(data.to.vessel); } }
public void RebuildCrewAssignmentDialogue(KSP.UI.CrewListItem.ButtonTypes type, KSP.UI.CrewListItem cic) { StartCoroutine(CallbackUtil.DelayedCallback(1, BuildCrewAssignmentDialogue)); }
public void RebuildAstronautComplex(KSP.UI.CrewListItem.ButtonTypes type, KSP.UI.CrewListItem cic) { StartCoroutine(CallbackUtil.DelayedCallback(1, BuildAstronautComplex)); }