Beispiel #1
0
        private IEnumerator WaitAndGrab(KASModuleGrab moduleGrab, Vessel vess)
        {
            waitAndGrabRunning = true;
            while (!moduleGrab.part.rigidbody)
            {
                KAS_Shared.DebugLog("WaitAndGrab(Container) - Waiting rigidbody to initialize...");
                yield return(new WaitForFixedUpdate());
            }
            KAS_Shared.DebugLog("WaitAndGrab(Container) - Rigidbody initialized, setting velocity...");
            moduleGrab.part.rigidbody.velocity        = vess.rootPart.rigidbody.velocity;
            moduleGrab.part.rigidbody.angularVelocity = vess.rootPart.rigidbody.angularVelocity;
            KAS_Shared.DebugLog("WaitAndGrab(Container) - Waiting velocity to apply by waiting 0.1 seconds...");
            yield return(new WaitForSeconds(0.1f));

            KAS_Shared.DebugLog("WaitAndGrab(Container) - Grab part...");
            if (!moduleGrab.evaHolderPart)
            {
                moduleGrab.Grab(vess);
            }
            KAS_Shared.DebugLog("WaitAndGrab(Container) - End of coroutine...");
            waitAndGrabRunning = false;
        }
 private IEnumerator WaitAndGrab(KASModuleGrab moduleGrab, Vessel vess)
 {
     waitAndGrabRunning = true;
     while (!moduleGrab.part.rigidbody)
     {
         KAS_Shared.DebugLog("WaitAndGrab(Container) - Waiting rigidbody to initialize...");
         yield return new WaitForFixedUpdate();
     }
     KAS_Shared.DebugLog("WaitAndGrab(Container) - Rigidbody initialized, setting velocity...");
     moduleGrab.part.rigidbody.velocity = vess.rootPart.rigidbody.velocity;
     moduleGrab.part.rigidbody.angularVelocity = vess.rootPart.rigidbody.angularVelocity;
     KAS_Shared.DebugLog("WaitAndGrab(Container) - Waiting velocity to apply by waiting 0.1 seconds...");
     yield return new WaitForSeconds(0.1f);
     KAS_Shared.DebugLog("WaitAndGrab(Container) - Grab part...");
     if (!moduleGrab.evaHolderPart) moduleGrab.Grab(vess);
     KAS_Shared.DebugLog("WaitAndGrab(Container) - End of coroutine...");
     waitAndGrabRunning = false;
 }
Beispiel #3
0
        private void UpdateGrab()
        {
            if (Input.GetKeyDown(grabPartKey.ToLower()))
            {
                if (FlightGlobals.ActiveVessel.isEVA)
                {
                    // Check if a part is already grabbed
                    KASModuleGrab grabbedPart = KAS_Shared.GetGrabbedPartModule(FlightGlobals.ActiveVessel);
                    if (grabbedPart)
                    {
                        grabbedPart.Drop();
                        return;
                    }
                    List <Collider> nearestColliders  = new List <Collider>(Physics.OverlapSphere(FlightGlobals.ActiveVessel.transform.position, radius, 557059));
                    float           shorterDist       = Mathf.Infinity;
                    KASModuleGrab   nearestModuleGrab = null;
                    foreach (Collider col in nearestColliders)
                    {
                        // Check if if the collider have a rigidbody
                        if (!col.attachedRigidbody)
                        {
                            continue;
                        }
                        // Check if it's a part
                        Part p = col.attachedRigidbody.GetComponent <Part>();
                        if (!p)
                        {
                            continue;
                        }
                        // Check if it's grabbable part
                        KASModuleGrab moduleGrab = p.GetComponent <KASModuleGrab>();
                        if (!moduleGrab)
                        {
                            continue;
                        }
                        // Check if it's a part is connected
                        if (moduleGrab.part.isConnected)
                        {
                            continue;
                        }
                        // Check if it's a part grabbed by another kerbal eva
                        if (moduleGrab.evaHolderPart)
                        {
                            continue;
                        }

                        // Select the nearest grabbable part
                        float distToGrab = Vector3.Distance(FlightGlobals.ActiveVessel.transform.position, moduleGrab.part.transform.position);
                        if (distToGrab <= shorterDist)
                        {
                            shorterDist       = distToGrab;
                            nearestModuleGrab = moduleGrab;
                        }
                    }
                    //Grab nearest part if exist
                    if (nearestModuleGrab)
                    {
                        nearestModuleGrab.Grab(FlightGlobals.ActiveVessel);
                        return;
                    }
                }
            }
        }