private void doWeld(Part otherPort, SSTUWeldingDockingPort otherPortModule, Part otherWeld)
        {
            Part weld = getBasePart();

            if (otherPort == null || otherPortModule == null || otherWeld == null || weld == null)
            {
                return;
            }

            AttachNode thisNode  = weld.FindAttachNodeByPart(part);
            AttachNode otherNode = otherWeld.FindAttachNodeByPart(otherPort);

            decoupleFromBase();
            otherPortModule.decoupleFromBase();
            weld.Couple(otherWeld);
            setupPartAttachNodes(weld, otherWeld, thisNode, otherNode);

            //cleanup global data from all the changing of parts/etc
            FlightGlobals.ForceSetActiveVessel(weld.vessel);
            //if you don't de-activate the GUI it will null-ref because the active window belongs to one of the exploding parts below.
            UIPartActionController.Instance.Deactivate();
            //but then we need to re-activate it to make sure that part-right clicking/etc doesn't break
            UIPartActionController.Instance.Activate();

            //remove the welding docking ports
            //TODO find non-explosive way to do this?
            selfDestruct();
            otherPortModule.selfDestruct();
        }
Пример #2
0
        /// <summary>
        /// Switch to the vessel
        /// </summary>
        private static IEnumerator SwitchToVessel()
        {
            if (VesselToSwitchTo != null)
            {
                var tries = 0;
                var zoom  = FlightCamera.fetch.Distance;

                OrbitPhysicsManager.HoldVesselUnpack();
                while (!VesselToSwitchTo.loaded && tries < 100)
                {
                    tries++;
                    yield return(new WaitForFixedUpdate());
                }

                LunaLog.Log($"Tries: {tries} Loaded: {VesselToSwitchTo.loaded}");

                if (!VesselToSwitchTo.loaded)
                {
                    tries = 0;
                    //Vessels still didn't loaded after 100 fixued update frames, let's wait for 1 more second...
                    while (!VesselToSwitchTo.loaded && tries < 10)
                    {
                        tries++;
                        yield return(new WaitForSeconds(0.1f));
                    }
                }

                FlightGlobals.ForceSetActiveVessel(VesselToSwitchTo);
                FlightCamera.fetch.SetDistance(zoom);
                VesselToSwitchTo = null;
            }
        }
Пример #3
0
        private void FireHoD()
        {
            var wmPart = FlightGlobals.ActiveVessel.FindPartModuleImplementing <MissileFire>();

            team = wmPart.team;

            playerVessel = FlightGlobals.ActiveVessel.id;

            var SatCount = 0;

            foreach (Vessel v in FlightGlobals.Vessels)
            {
                if (!v.HoldPhysics && v.atmDensity <= 0.000005)
                {
                    var HoD = FlightGlobals.ActiveVessel.FindPartModuleImplementing <ModuleHammerOfDawn>();
                    if (HoD != null)
                    {
                        if (HoD.myTeam == team && SatCount == 0)
                        {
                            SatCount    += 1;
                            playerVessel = FlightGlobals.ActiveVessel.id;
                            HoD.Fire();
                            HoD.fireLaser = true;
                            BDArmorySetup.Instance.showVSGUI = true;
                            FlightGlobals.ForceSetActiveVessel(v);
                            FlightInputHandler.ResumeVesselCtrlState(v);
                            StartCoroutine(FocusSwitchRoutine());
                        }
                    }
                }
            }
        }
Пример #4
0
        private static void SwitchVesselIfSpectating(Vessel killVessel)
        {
            if (FlightGlobals.ActiveVessel?.id == killVessel.id)
            {
                //Try to switch to a nearby loaded vessel...
                var otherVessel = FlightGlobals.VesselsLoaded.FirstOrDefault(v => v.id != killVessel.id);

                //No nearby vessel detected... Get a random vessel and switch to it if exists, otherwise go to spacecenter
                if (otherVessel == null)
                {
                    otherVessel = FlightGlobals.Vessels.FirstOrDefault(v => v.id != killVessel.id);
                }

                if (otherVessel != null)
                {
                    FlightGlobals.ForceSetActiveVessel(otherVessel);
                }
                else
                {
                    HighLogic.LoadScene(GameScenes.SPACECENTER);
                }

                LunaScreenMsg.PostScreenMessage(LocalizationContainer.ScreenText.SpectatingRemoved, 10f, ScreenMessageStyle.UPPER_CENTER);
            }
        }
Пример #5
0
        private void CheckForMine()
        {
            var navalMine = FlightGlobals.ActiveVessel.FindPartModuleImplementing <ModuleEnemyMine_Naval>();
            var landMine  = FlightGlobals.ActiveVessel.FindPartModuleImplementing <ModuleEnemyMine_Land>();

            if (navalMine != null || landMine != null)
            {
                count = 0.0f;
                foreach (Vessel v in FlightGlobals.Vessels)
                {
                    if (!v.HoldPhysics)
                    {
                        double targetDistance = Vector3d.Distance(FlightGlobals.ActiveVessel.GetWorldPos3D(), v.GetWorldPos3D());

                        if (targetDistance <= 2500 && count <= 1)
                        {
                            count += 1;
                            FlightGlobals.ActiveVessel.DiscoveryInfo.SetLevel(DiscoveryLevels.Unowned);
                            FlightGlobals.ForceSetActiveVessel(v);
                            FlightInputHandler.ResumeVesselCtrlState(v);
                            return;
                        }
                    }
                }
            }
        }
Пример #6
0
        /// <summary>Handles vessel selection logic.</summary>
        void HandleVesselSelection()
        {
            // Highlight focused vessel.
            SetHoveredVessel(Mouse.HoveredPart? Mouse.HoveredPart.vessel : null);

            // Select vessel if clicked.
            if (Mouse.GetAllMouseButtonsDown() == _switchMouseButton &&
                _hoveredVessel != null && !_hoveredVessel.isActiveVessel)
            {
                if (_hoveredVessel.DiscoveryInfo.Level != DiscoveryLevels.Owned)
                {
                    // Cannot switch to unowned vessel. Invoke standard "soft" switch to have error message
                    // triggered.
                    FlightGlobals.SetActiveVessel(_hoveredVessel);
                }
                else
                {
                    // Use forced version since "soft" switch blocks on many normal situations (e.g. "on
                    // ladder" or "in atmosphere").
                    var vesselToSelect = _hoveredVessel; // Save hovered vessel as it'll be reset on blur.
                    SetHoveredVessel(null);
                    _evsSwitchAction = true;
                    FlightGlobals.ForceSetActiveVessel(vesselToSelect);
                }
            }
        }
Пример #7
0
        public void TryRestoreVessel(StoredVessel stored_vessel)
        {
            if (!can_restore())
            {
                return;
            }
            ScreenMessager.showMessage(string.Format("Launching {0}...", stored_vessel.vessel.vesselName), 3);
            //clean up
            stored_vessels.Remove(stored_vessel.vessel.vesselID);
            //switch hangar state
            hangar_state = HangarState.Inactive;
            //transfer resources
            transferResources(stored_vessel);
            //set restored vessel orbit
            GetLaunchTransform();
            position_vessel(stored_vessel);
            //restore vessel
            stored_vessel.Load();
            //get restored vessel from the world
            launched_vessel = stored_vessel.vessel.vesselRef;
            //transfer crew back to the launched vessel
            List <ProtoCrewMember> crew_to_transfer = CrewTransfer.delCrew(vessel, stored_vessel.crew);

            //change volume and mass
            change_part_params(stored_vessel.metric, -1f);
            //switch to restored vessel
            FlightGlobals.ForceSetActiveVessel(launched_vessel);
            SetupVessel(new LaunchedVessel(stored_vessel, launched_vessel, crew_to_transfer, part.flightID));
        }
Пример #8
0
 public void SwitchToPayload()
 {
     if (payload != null && FlightGlobals.ActiveVessel != payload)
     {
         FlightGlobals.ForceSetActiveVessel(payload);
     }
 }
        public float RecycleKerbal(ProtoCrewMember crew, Part part)
        {
            // idea and numbers taken from Kethane
            if (crew.isBadass && part != null)
            {
                part.explosionPotential = 10000;
                FlightGlobals.ForceSetActiveVessel(this.vessel);
            }
            string message = crew.name + " was mulched";

            ScreenMessages.PostScreenMessage(message, 30.0f, ScreenMessageStyle.UPPER_CENTER);
            if (part != null)
            {
                FlightLogger.eventLog.Add("[" + FormatTime(part.vessel.missionTime) + "] " + message);
                part.explode();
            }

            float mass = 0;

            mass += ReclaimResource("Kethane", 150, crew.name);
            if (ExLaunchPad.kethane_present)
            {
                mass += ReclaimResource("Metal", 1, crew.name);
            }
            else
            {
                mass += ReclaimResource("RocketParts", 1, crew.name);
            }
            return(mass);
        }
Пример #10
0
    private IEnumerator PlaceSpawnedVessel(Vessel v, bool moveVessel)
    {
      loadingCraft = true;
      v.isPersistent = true;
      v.Landed = false;
      v.situation = Vessel.Situations.FLYING;
      while (v.packed)
      {
        yield return null;
      }
      v.SetWorldVelocity(Vector3d.zero);

      yield return null;
      FlightGlobals.ForceSetActiveVessel(v);
      yield return null;
      v.Landed = true;
      v.situation = Vessel.Situations.PRELAUNCH;
      v.GoOffRails();
      v.IgnoreGForces(240);

      //Staging.beginFlight();
      StageManager.BeginFlight();

      if (moveVessel)
      {
        VesselMove.Instance.StartMove(v, false);
        VesselMove.Instance.MoveHeight = 35;
        yield return null;
        if (VesselMove.Instance.MovingVessel == v)
        {
          v.Landed = false;
        }
      }
      loadingCraft = false;
    }
        public void RemoveVessel(Guid vesselId, bool isDockingUpdate, string dockingPlayer)
        {
            var vessel = FlightGlobals.Vessels.FirstOrDefault(v => v.id == vesselId);

            if (vessel == null)
            {
                return;
            }

            if (isDockingUpdate)
            {
                if (FlightGlobals.ActiveVessel?.id == vessel.id)
                {
                    var dockingPlayerVessel = FlightGlobals.Vessels
                                              .FirstOrDefault(v => LockSystem.Singleton.LockOwner("control-" + v.id) == dockingPlayer);

                    if (dockingPlayerVessel != null)
                    {
                        FlightGlobals.ForceSetActiveVessel(dockingPlayerVessel);
                    }
                    else
                    {
                        HighLogic.LoadScene(GameScenes.TRACKSTATION);
                        ScreenMessages.PostScreenMessage("Kicked to tracking station, a player docked with you but they were not loaded into the game.");
                    }
                }
                Debug.Log($"[LMP]: Removing docked vessel: {vesselId}");
                System.KillVessel(vessel, true);
            }
            else
            {
                Debug.Log($"[LMP]: Removing vessel: {vesselId}");
                System.KillVessel(vessel, true);
            }
        }
        internal void BuildAndLaunchCraft()
        {
            // build craft
            ShipConstruct nship = new ShipConstruct();

            nship.LoadShip(craftConfig);

            string             landedAt = "External Launchpad";
            string             flag     = flagname;
            Game               game     = FlightDriver.FlightStateCache;
            VesselCrewManifest crew     = new VesselCrewManifest();

            Box vessel_bounds = GetVesselBox(nship);

            launchTransform = builder.PlaceShip(nship, vessel_bounds);

            EnableExtendingLaunchClamps(nship);
            ShipConstruction.AssembleForLaunch(nship, landedAt, landedAt,
                                               flag, game, crew);
            var FlightVessels = FlightGlobals.Vessels;

            craftVessel = FlightVessels[FlightVessels.Count - 1];

            FlightGlobals.ForceSetActiveVessel(craftVessel);
            if (builder.capture)
            {
                craftVessel.Splashed = craftVessel.Landed = false;
            }
            else
            {
                bool loaded = craftVessel.loaded;
                bool packed = craftVessel.packed;
                craftVessel.loaded = true;
                craftVessel.packed = false;
                craftVessel.GetHeightFromTerrain();
                Debug.LogFormat("[EL] hft {0}", craftVessel.heightFromTerrain);
                craftVessel.loaded = loaded;
                craftVessel.packed = packed;
            }

            Vector3 offset = craftVessel.transform.position - launchTransform.position;

            craftOffset = launchTransform.InverseTransformDirection(offset);
            SetupCraftResources(craftVessel);

            KSP.UI.Screens.StageManager.BeginFlight();

            if (builder.capture)
            {
                FlightGlobals.overrideOrbit = true;
                (builder as PartModule).StartCoroutine(CaptureCraft());
            }
            else
            {
                state = State.Idle;
            }
        }
Пример #13
0
        public void ForceSetActiveVessel(VesselTarget vesselTarget)
        {
            Vessel vessel = vesselTarget.Vessel;

            if (!vessel.isActiveVessel)
            {
                FlightGlobals.ForceSetActiveVessel(vessel);
            }
        }
Пример #14
0
        public static void CoupleParts(Part srcPart, Part trgPart, AttachNode sourceNode, AttachNode targetNode = null)
        {
            Vessel srcVessel = srcPart.vessel;
            Vessel trgVessel = trgPart.vessel;

            DockedVesselInfo vesselInfo = new DockedVesselInfo();

            vesselInfo.name        = srcVessel.vesselName;
            vesselInfo.vesselType  = srcVessel.vesselType;
            vesselInfo.rootPartUId = srcVessel.rootPart.flightID;

            GameEvents.onActiveJointNeedUpdate.Fire(srcVessel);
            GameEvents.onActiveJointNeedUpdate.Fire(trgVessel);
            sourceNode.attachedPart   = trgPart;
            sourceNode.attachedPartId = trgPart.flightID;
            if (sourceNode.id != "srfAttach")
            {
                srcPart.attachMode = AttachModes.STACK;
                if (targetNode != null)
                {
                    targetNode.attachedPart = srcPart;
                }
                else
                {
                    log.warning("Target node is null.");
                }
            }
            else
            {
                srcPart.attachMode = AttachModes.SRF_ATTACH;
            }
            srcPart.Couple(trgPart);
            // Depending on how active vessel has updated do either force active or make active. Note, that
            // active vessel can be EVA kerbal, in which case nothing needs to be adjusted.
            // FYI: This logic was taken from ModuleDockingNode.DockToVessel.
            if (srcVessel == FlightGlobals.ActiveVessel)
            {
                FlightGlobals.ForceSetActiveVessel(sourceNode.owner.vessel);  // Use actual vessel.
            }
            else if (sourceNode.owner.vessel == FlightGlobals.ActiveVessel)
            {
                sourceNode.owner.vessel.MakeActive();
            }
            GameEvents.onVesselWasModified.Fire(sourceNode.owner.vessel);

            ModuleDockingNode sourcePort, targetPort;

            if (hasDockingPort(sourceNode, out sourcePort))
            {
                CoupleDockingPortWithPart(sourcePort);
            }
            if (hasDockingPort(targetNode, out targetPort))
            {
                CoupleDockingPortWithPart(targetPort);
            }
        }
Пример #15
0
        void AsteroidGUI(int windowID)
        {
            double asteroidPrice = 0;

            GUILayout.BeginVertical();
            scrollPos = GUILayout.BeginScrollView(scrollPos, HighLogic.Skin.scrollView);

            foreach (Vessel vessels in FlightGlobals.Vessels)
            {
                if (vessels.vesselType == VesselType.SpaceObject && vessels.loaded == true)
                {
                    if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.A)
                    {
                        asteroidPrice = 5000;
                    }
                    if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.B)
                    {
                        asteroidPrice = 10000;
                    }
                    if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.C)
                    {
                        asteroidPrice = 20000;
                    }
                    if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.D)
                    {
                        asteroidPrice = 35000;
                    }
                    if (vessels.DiscoveryInfo.objectSize == UntrackedObjectClass.E)
                    {
                        asteroidPrice = 50000;
                    }

                    if (GUILayout.Button("name: " + vessels.vesselName + "\n" + "type: " + vessels.DiscoveryInfo.objectSize + "\n price: " + asteroidPrice, HighLogic.Skin.button))
                    {
                        if (vessels.parts.Count >= 1)
                        {
                            FlightGlobals.ForceSetActiveVessel(part.vessel);
                            Funding.Instance.AddFunds(asteroidPrice, TransactionReasons.VesselRecovery);
                            vessels.Die();
                            ScreenMessages.PostScreenMessage("Asteroid Selled", 5.0f, ScreenMessageStyle.UPPER_CENTER);
                        }
                        else
                        {
                            ScreenMessages.PostScreenMessage("There is still a ship on the asteroid", 5.0f, ScreenMessageStyle.UPPER_CENTER);
                        }
                    }
                }
            }
            GUILayout.EndScrollView();
            if (GUILayout.Button("close", HighLogic.Skin.button))
            {
                asteroidGUI         = false;
                MainMenu.menuWindow = true;
            }
            GUILayout.EndVertical();
        }
Пример #16
0
 private void DrawVessel(ProtoCrewMember kerbal)
 {
     if (GUILayout.Button(vessel != null ? vessel.GetName() : "Not in a vessel", STYLE_LOCATION_LABEL))
     {
         if (vessel != null && HighLogic.LoadedSceneIsFlight)
         {
             FlightGlobals.ForceSetActiveVessel(vessel);
         }
     }
 }
Пример #17
0
        // Extracted method, so we dont have to call these two lines everywhere
        private void ForceSwitchVessel(Vessel v)
        {
            if (BDArmorySettings.MULTIPLAYER_ACTIVE)
            {
                return;
            }

            FlightGlobals.ForceSetActiveVessel(v);
            FlightInputHandler.ResumeVesselCtrlState(v);
        }
Пример #18
0
        /// <summary>
        /// Switch to the vessel
        /// </summary>
        private static IEnumerator SwitchToVessel()
        {
            if (VesselToSwitchTo != null)
            {
                FlightGlobals.ForceSetActiveVessel(VesselToSwitchTo);
                yield return(0);

                VesselToSwitchTo = null;
            }
        }
Пример #19
0
        public void ReleaseVessel()
        {
            TransferResources();
            craftRoot.Undock(vesselInfo);
            var    vesselCount = FlightGlobals.Vessels.Count;
            Vessel vsl         = FlightGlobals.Vessels[vesselCount - 1];

            FlightGlobals.ForceSetActiveVessel(vsl);
            //builder.part.StartCoroutine (FixAirstreamShielding (vsl));

            CleanupAfterRelease();
        }
Пример #20
0
        private void SwitchToPreviousVessel()
        {
            if (_wmgrsB.Count > 0)
            {
                for (var i = _wmgrsB.Count - 1; i >= 0; i--)
                {
                    if (_wmgrsB[i].vessel.isActiveVessel)
                    {
                        if (i > 0)
                        {
                            FlightGlobals.ForceSetActiveVessel(_wmgrsB[i - 1].vessel);
                            return;
                        }
                        else if (_wmgrsA.Count > 0)
                        {
                            FlightGlobals.ForceSetActiveVessel(_wmgrsA[_wmgrsA.Count - 1].vessel);
                            return;
                        }
                        else if (_wmgrsB.Count > 0)
                        {
                            FlightGlobals.ForceSetActiveVessel(_wmgrsB[_wmgrsB.Count - 1].vessel);
                            return;
                        }
                    }
                }
            }

            if (_wmgrsA.Count > 0)
            {
                for (var i = _wmgrsA.Count - 1; i >= 0; i--)
                {
                    if (_wmgrsA[i].vessel.isActiveVessel)
                    {
                        if (i > 0)
                        {
                            FlightGlobals.ForceSetActiveVessel(_wmgrsA[i - 1].vessel);
                            return;
                        }
                        else if (_wmgrsB.Count > 0)
                        {
                            FlightGlobals.ForceSetActiveVessel(_wmgrsB[_wmgrsB.Count - 1].vessel);
                            return;
                        }
                        else if (_wmgrsA.Count > 0)
                        {
                            FlightGlobals.ForceSetActiveVessel(_wmgrsA[_wmgrsA.Count - 1].vessel);
                            return;
                        }
                    }
                }
            }
        }
Пример #21
0
 public void CollectParts(Part part)
 {
     if (FlightGlobals.ActiveVessel == part.vessel)
     {
         FlightGlobals.ForceSetActiveVessel(recycler.vessel);
     }
     recycle_parts.Clear();
     foreach (var p in part.vessel.parts)
     {
         recycle_parts.Add(p.flightID);
     }
     recycler.StartCoroutine(WaitAndCouple(part));
 }
Пример #22
0
        IEnumerator FocusSwitchRoutine()
        {
            yield return(new WaitForSeconds(2));

            foreach (Vessel v in FlightGlobals.Vessels)
            {
                if (v.id == playerVessel)
                {
                    FlightGlobals.ForceSetActiveVessel(v);
                    FlightInputHandler.ResumeVesselCtrlState(v);
                }
            }
        }
Пример #23
0
        private void CoupleWithCraft(Vessel craftVessel)
        {
            craftRoot              = craftVessel.rootPart;
            vesselInfo             = new DockedVesselInfo();
            vesselInfo.name        = craftVessel.vesselName;
            vesselInfo.vesselType  = craftVessel.vesselType;
            vesselInfo.rootPartUId = craftRoot.flightID;
            craftRoot.Couple(builder.part);

            if (builder.vessel != FlightGlobals.ActiveVessel)
            {
                FlightGlobals.ForceSetActiveVessel(builder.vessel);
            }
        }
Пример #24
0
        //store vessel
        void store_vessel(Vessel vsl, bool perform_checks = true)
        {
            StoredVessel stored_vessel = new StoredVessel();

            if (perform_checks)            //for normal operation
            {
                //check momentary states
                if (!can_store(vsl))
                {
                    return;
                }
                //check if the vessel can be stored, if unknown, try to store
                bool storable;
                if (!probed_ids.TryGetValue(vsl.id, out storable))
                {
                    stored_vessel = try_store(vsl);
                    storable      = stored_vessel != null;
                    probed_ids.Add(vsl.id, storable);
                }
                if (!storable)
                {
                    return;
                }
            }
            else             //for storing packed constructs upon hangar launch
            {
                stored_vessel = new StoredVessel(vsl);
                stored_vessels.ForceAdd(stored_vessel);
            }
            //get vessel crew on board
            List <ProtoCrewMember> _crew = new List <ProtoCrewMember>(stored_vessel.crew);

            CrewTransfer.delCrew(vsl, _crew);
            vsl.DespawnCrew();
            //first of, add crew to the hangar if there's a place
            CrewTransfer.addCrew(part, _crew);
            //then add to other vessel parts if needed
            CrewTransfer.addCrew(vessel, _crew);
            //recalculate volume and mass
            change_part_params(stored_vessel.metric);
            //switch to hangar vessel before storing
            if (FlightGlobals.ActiveVessel.id == vsl.id)
            {
                FlightGlobals.ForceSetActiveVessel(vessel);
            }
            //destroy vessel
            vsl.Die();
            ScreenMessager.showMessage("Vessel has been docked inside the hangar", 3);
        }
Пример #25
0
 public void ReleaseVessel()
 {
     if (craftRoot != null)
     {
         craftRoot.Undock(vesselInfo);
         var    vesselCount = FlightGlobals.Vessels.Count;
         Vessel vsl         = FlightGlobals.Vessels[vesselCount - 1];
         FlightGlobals.ForceSetActiveVessel(vsl);
     }
     craftConfig = null;
     vesselInfo  = null;
     buildCost   = null;
     builtStuff  = null;
     state       = State.Idle;
 }
Пример #26
0
        /// <inheritdoc/>
        public Part CoupleParts(AttachNode sourceNode, AttachNode targetNode,
                                bool toDominantVessel = false)
        {
            if (toDominantVessel)
            {
                var dominantVessel =
                    Vessel.GetDominantVessel(sourceNode.owner.vessel, targetNode.owner.vessel);
                if (dominantVessel != targetNode.owner.vessel)
                {
                    var tmp = sourceNode;
                    sourceNode = targetNode;
                    targetNode = tmp;
                }
            }
            DebugEx.Fine("Couple {0} to {1}",
                         KASAPI.AttachNodesUtils.NodeId(sourceNode),
                         KASAPI.AttachNodesUtils.NodeId(targetNode));
            var srcPart   = sourceNode.owner;
            var srcVessel = srcPart.vessel;

            KASAPI.AttachNodesUtils.AddNode(srcPart, sourceNode);
            var tgtPart   = targetNode.owner;
            var tgtVessel = tgtPart.vessel;

            KASAPI.AttachNodesUtils.AddNode(tgtPart, targetNode);

            sourceNode.attachedPart   = tgtPart;
            sourceNode.attachedPartId = tgtPart.flightID;
            targetNode.attachedPart   = srcPart;
            targetNode.attachedPartId = srcPart.flightID;
            tgtPart.attachMode        = AttachModes.STACK;
            srcPart.Couple(tgtPart);
            // Depending on how active vessel has updated do either force active or make active. Note, that
            // active vessel can be EVA kerbal, in which case nothing needs to be adjusted.
            // FYI: This logic was taken from ModuleDockingNode.DockToVessel.
            if (srcVessel == FlightGlobals.ActiveVessel)
            {
                FlightGlobals.ForceSetActiveVessel(sourceNode.owner.vessel); // Use actual vessel.
                FlightInputHandler.SetNeutralControls();
            }
            else if (sourceNode.owner.vessel == FlightGlobals.ActiveVessel)
            {
                sourceNode.owner.vessel.MakeActive();
                FlightInputHandler.SetNeutralControls();
            }

            return(srcPart);
        }
Пример #27
0
        public void ConsumeKerbal()
        {
            var vessel = FlightGlobals.ActiveVessel;

            if (!vessel.isEVA)
            {
                return;
            }
            if (vessel.GetVesselCrew()[0].isBadass)
            {
                vessel.rootPart.explosionPotential = 10000;
            }
            FlightGlobals.ForceSetActiveVessel(this.vessel);
            vessel.rootPart.explode();
            this.part.RequestResource("Kethane", -150);
        }
Пример #28
0
        private static void AfterCouplingEvent()
        {
            if (_activeVesselIsWeakVessel)
            {
                if (_dominantVessel)
                {
                    FlightGlobals.ForceSetActiveVessel(_dominantVessel);
                    FlightInputHandler.SetNeutralControls();
                }
            }

            if (_activeVesselIsDominantVessel)
            {
                _dominantVessel.MakeActive();
                FlightInputHandler.SetNeutralControls();
            }
        }
Пример #29
0
        private void BuildAndLaunchCraft()
        {
            // build craft
            ShipConstruct nship = ShipConstruction.LoadShip(uis.craftfile);

            Vector3 offset = nship.Parts[0].transform.localPosition;

            nship.Parts[0].transform.Translate(-offset);
            string             landedAt = "External Launchpad";
            string             flag     = uis.flagname;
            Game               state    = FlightDriver.FlightStateCache;
            VesselCrewManifest crew     = new VesselCrewManifest();

            ShipConstruction.CreateBackup(nship);
            ShipConstruction.PutShipToGround(nship, GetLanchTransform());

            ShipConstruction.AssembleForLaunch(nship, landedAt, flag, state, crew);

            Vessel vsl = FlightGlobals.Vessels[FlightGlobals.Vessels.Count - 1];

            FlightGlobals.ForceSetActiveVessel(vsl);
            vsl.Landed = false;

            if (kethane_present && !DebugPad)
            {
                UseResources(vsl);
            }

            if (vessel.situation == Vessel.Situations.ORBITING)
            {
                HackStruts(vsl);
                uis.vesselInfo             = new DockedVesselInfo();
                uis.vesselInfo.name        = vsl.vesselName;
                uis.vesselInfo.vesselType  = vsl.vesselType;
                uis.vesselInfo.rootPartUId = vsl.rootPart.flightID;
                vsl.rootPart.Couple(part);
                FlightGlobals.ForceSetActiveVessel(vessel);
            }
            else
            {
                uis.timer    = 3.0f;
                uis.launchee = vsl;
            }

            Staging.beginFlight();
        }
Пример #30
0
        private void BuildCraft()
        {
            // build craft
            ShipConstruct nship           = ShipConstruction.LoadShip(uifs.craftfile);
            Transform     launchtransform = GetLaunchTransform();

            Vector3 offset = nship.Parts[0].transform.localPosition;

            nship.Parts[0].transform.Translate(-offset);
            Game state = FlightDriver.FlightStateCache;
            VesselCrewManifest crew = new VesselCrewManifest();

            ShipConstruction.CreateBackup(nship);
            ShipConstruction.PutShipToGround(nship, launchtransform);
            ShipConstruction.AssembleForLaunch(nship, uifs.LaunchSiteName, uifs.flagname, state, crew);

            Vessel vsl = FlightGlobals.Vessels[FlightGlobals.Vessels.Count - 1];

            FlightGlobals.ForceSetActiveVessel(vsl);
            vsl.Landed = false;

            HackStruts(vsl);
            uifs.vesselInfo              = new DockedVesselInfo();
            uifs.vesselInfo.name         = vsl.vesselName;
            uifs.vesselInfo.vesselType   = vsl.vesselType;
            uifs.vesselInfo.rootPartUId  = vsl.rootPart.uid;
            uifs.vesselFlightID          = vsl.rootPart.flightID;
            FlightDriver.flightStarted   = true;
            FlightDriver.newShipFlagURL  = uifs.flagname;
            FlightDriver.newShipManifest = crew;
            vsl.state     = Vessel.State.ACTIVE;
            vsl.situation = Vessel.Situations.ORBITING;
            Staging.beginFlight();
            vsl.ResumeStaging();
            Staging.GenerateStagingSequence(vsl.rootPart);
            Staging.RecalculateVesselStaging(vsl);

            FlightGlobals.ForceSetActiveVessel(vessel);
            vsl.rootPart.Couple(part);
            vessel.ResumeStaging();
            Staging.GenerateStagingSequence(vessel.rootPart);
            Staging.RecalculateVesselStaging(vessel);

            Events[("DecoupleVessel")].active = true;
        }