private void UpdateWinchKeyGrab() { if (Input.GetKeyDown(grabHeadKey.ToLower())) { if (FlightGlobals.ActiveVessel.isEVA) { KASModuleWinch tmpGrabbbedHead = KAS_Shared.GetWinchModuleGrabbed(FlightGlobals.ActiveVessel); if (tmpGrabbbedHead) { tmpGrabbbedHead.DropHead(); return; } var nearestColliders = new List <Collider>( Physics.OverlapSphere(FlightGlobals.ActiveVessel.transform.position, radius, 557059)); float shorterDist = Mathf.Infinity; KASModuleWinch nearestModuleWinch = null; foreach (Collider col in nearestColliders) { KAS_LinkedPart linkedPart = col.transform.gameObject.GetComponent <KAS_LinkedPart>(); if (!linkedPart) { continue; } KASModuleWinch winchModule = linkedPart.part.GetComponent <KASModuleWinch>(); if (!winchModule) { continue; } // Check if the head is plugged if (winchModule.headState != KASModuleWinch.PlugState.Deployed) { continue; } // Check if it's a head grabbed by another kerbal eva if (winchModule.evaHolderPart) { continue; } // Select the nearest grabbable part float distToGrab = Vector3.Distance(FlightGlobals.ActiveVessel.transform.position, winchModule.part.transform.position); if (distToGrab <= shorterDist) { shorterDist = distToGrab; nearestModuleWinch = winchModule; } } //Grab nearest head if exist if (nearestModuleWinch) { nearestModuleWinch.GrabHead(FlightGlobals.ActiveVessel); return; } } } }
void OnGUI() { if (!clickedWinch) { return; } GUI.skin = HighLogic.Skin; GUI.skin.label.alignment = TextAnchor.MiddleCenter; GUI.skin.button.alignment = TextAnchor.MiddleCenter; guiButtonStyle = new GUIStyle(GUI.skin.button); guiButtonStyle.normal.textColor = Color.white; guiButtonStyle.focused.textColor = Color.white; guiButtonStyle.hover.textColor = Color.yellow; guiButtonStyle.active.textColor = Color.yellow; guiButtonStyle.onNormal.textColor = Color.green; guiButtonStyle.onFocused.textColor = Color.green; guiButtonStyle.onHover.textColor = Color.green; guiButtonStyle.onActive.textColor = Color.green; guiButtonStyle.padding = new RectOffset(4, 4, 4, 4); guiButtonStyle.alignment = TextAnchor.MiddleCenter; Vector3 headScreenPoint = Camera.main.WorldToScreenPoint(clickedWinch.headTransform.position); GUILayout.BeginArea(new Rect(headScreenPoint.x, Screen.height - headScreenPoint.y, 200, 200)); GUILayout.BeginVertical(); if (clickedWinch.evaHolderPart) { if (GUILayout.Button("Drop (Key " + grabHeadKey + ")", guiButtonStyle, GUILayout.Width(100f))) { clickedWinch.DropHead(); clickedWinch = null; } } else { if (GUILayout.Button("Grab (Key " + grabHeadKey + ")", guiButtonStyle, GUILayout.Width(100f))) { clickedWinch.GrabHead(FlightGlobals.ActiveVessel); clickedWinch = null; } } GUILayout.EndHorizontal(); GUILayout.EndArea(); }
void OnGUI() { if (!clickedWinch) { return; } GUI.skin = HighLogic.Skin; GUI.skin.label.alignment = TextAnchor.MiddleCenter; GUI.skin.button.alignment = TextAnchor.MiddleCenter; guiButtonStyle = new GUIStyle(GUI.skin.button); guiButtonStyle.normal.textColor = guiButtonStyle.focused.textColor = Color.white; guiButtonStyle.hover.textColor = guiButtonStyle.active.textColor = Color.yellow; guiButtonStyle.onNormal.textColor = guiButtonStyle.onFocused.textColor = guiButtonStyle.onHover.textColor = guiButtonStyle.onActive.textColor = Color.green; guiButtonStyle.padding = new RectOffset(4, 4, 4, 4); guiButtonStyle.alignment = TextAnchor.MiddleCenter; Vector3 headScreenPoint = Camera.main.WorldToScreenPoint(clickedWinch.headTransform.position); GUILayout.BeginArea(new Rect(headScreenPoint.x, Screen.height - headScreenPoint.y, 200, 200)); GUILayout.BeginVertical(); if (clickedWinch.evaHolderPart) { if (GUILayout.Button("Drop (Key " + grabHeadKey + ")", guiButtonStyle, GUILayout.Width(100f))) { clickedWinch.DropHead();; clickedWinch = null; } } else { if (GUILayout.Button("Grab (Key " + grabHeadKey + ")", guiButtonStyle, GUILayout.Width(100f))) { clickedWinch.GrabHead(FlightGlobals.ActiveVessel); clickedWinch = null; } if (clickedWinch) { if (clickedWinch.headState == KASModuleWinch.PlugState.Deployed) { KASModuleGrab grabbedModule = KAS_Shared.GetGrabbedPartModule(FlightGlobals.ActiveVessel); if (grabbedModule) { KASModulePort grabbedPort = grabbedModule.GetComponent <KASModulePort>(); if (grabbedPort) { if (GUILayout.Button("Plug grabbed", guiButtonStyle, GUILayout.Width(100f))) { grabbedModule.Drop(); grabbedPort.transform.rotation = Quaternion.FromToRotation(grabbedPort.portNode.forward, -clickedWinch.headPortNode.forward) * grabbedPort.transform.rotation; grabbedPort.transform.position = grabbedPort.transform.position - (grabbedPort.portNode.position - clickedWinch.headPortNode.position); clickedWinch.PlugHead(grabbedPort, KASModuleWinch.PlugState.PlugDocked); clickedWinch = null; } } } } } } GUILayout.EndHorizontal(); GUILayout.EndArea(); }