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; }
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; } } } }