protected override void OnPartDie() { base.OnPartDie(); if (winchConnected) { winchConnected.UnplugHead(false); } }
public void ContextMenuUnplug() { if (winchConnected) { winchConnected.UnplugHead(); } else { ScreenMessages.PostScreenMessage("There is nothing to unplug !", 5, ScreenMessageStyle.UPPER_CENTER); } }
public void Grab(Vessel kerbalEvaVessel) { KAS_Shared.DebugLog("Grab - Grabbing part :" + this.part.partInfo.name); //Get eva transform evaCollider = KAS_Shared.GetEvaCollider(kerbalEvaVessel, evaTransformName); if (!evaCollider) { KAS_Shared.DebugLog("Grab - " + evaTransformName + "transform not found on eva !"); return; } //Get attach node if (attachNodeName == null || attachNodeName == "") { if (this.part.srfAttachNode == null) { KAS_Shared.DebugLog("Grab - surface attach node cannot be found on the part !"); return; } KAS_Shared.AddNodeTransform(this.part, this.part.srfAttachNode); partNode = this.part.srfAttachNode; } else { AttachNode an = this.part.findAttachNode(attachNodeName); if (an == null) { KAS_Shared.DebugLog("Grab - " + attachNodeName + " node cannot be found on the part !"); return; } KAS_Shared.AddNodeTransform(this.part, an); partNode = an; } //Send message to other modules base.SendMessage("OnPartGrab", kerbalEvaVessel, SendMessageOptions.DontRequireReceiver); //Drop grabbed part on eva if needed KASModuleGrab tmpGrabbbedPartModule = KAS_Shared.GetGrabbedPartModule(kerbalEvaVessel); if (tmpGrabbbedPartModule) { KAS_Shared.DebugWarning("Grab - Drop current grabbed part"); tmpGrabbbedPartModule.Drop(); } evaNodeTransform = new GameObject("KASEvaNode").transform; evaNodeTransform.parent = evaCollider.transform; evaNodeTransform.localPosition = evaPartPos; evaNodeTransform.rotation = KAS_Shared.DirectionToQuaternion(evaCollider.transform, evaPartDir); KAS_Shared.MoveAlign(this.part.transform, partNode.nodeTransform, evaNodeTransform); //Grab winch connected head if any KASModuleWinch moduleWinch = KAS_Shared.GetConnectedWinch(this.part); if (moduleWinch) { KASModulePort modulePort = this.part.GetComponent <KASModulePort>(); moduleWinch.UnplugHead(false); moduleWinch.GrabHead(kerbalEvaVessel, modulePort); } List <Collider> allColliders = new List <Collider>(this.part.GetComponentsInChildren <Collider>() as Collider[]); foreach (Collider col in allColliders) { col.isTrigger = true; } Detach(); KAS_Shared.DecoupleFromAll(this.part); this.part.Couple(kerbalEvaVessel.rootPart); //Destroy joint to avoid buggy eva move Destroy(this.part.attachJoint); this.part.rigidbody.velocity = kerbalEvaVessel.rootPart.rigidbody.velocity; if (physicJoint) { if (evaJoint) { Destroy(evaJoint); } evaJoint = this.part.gameObject.AddComponent <FixedJoint>(); evaJoint.connectedBody = evaCollider.attachedRigidbody; evaJoint.breakForce = 5; evaJoint.breakTorque = 5; } else { this.part.physicalSignificance = Part.PhysicalSignificance.NONE; this.part.transform.parent = evaNodeTransform; this.part.rigidbody.isKinematic = true; } //Add grabbed part mass to eva if (addPartMass && !physicJoint) { orgKerbalMass = kerbalEvaVessel.rootPart.mass; kerbalEvaVessel.rootPart.mass += this.part.mass; } evaHolderVesselName = kerbalEvaVessel.vesselName; evaHolderPart = kerbalEvaVessel.rootPart; grabbed = true; RefreshContextMenu(); //Play grab sound fxSndGrab.audio.Play(); base.SendMessage("OnPartGrabbed", kerbalEvaVessel, SendMessageOptions.DontRequireReceiver); }
public void Grab(Vessel kerbalEvaVessel) { KAS_Shared.DebugLog("Grab - Grabbing part :" + this.part.partInfo.name); if (!AlignEvaPosition(kerbalEvaVessel)) { return; } //Grab winch connected head if any KASModuleWinch moduleWinch = KAS_Shared.GetConnectedWinch(this.part); if (moduleWinch) { KASModulePort modulePort = this.part.GetComponent <KASModulePort>(); moduleWinch.UnplugHead(false); moduleWinch.GrabHead(kerbalEvaVessel, modulePort); } keepTriggers = new List <Collider>(); List <Collider> allColliders = new List <Collider>(this.part.GetComponentsInChildren <Collider>() as Collider[]); foreach (Collider col in allColliders) { if (col.isTrigger) { keepTriggers.Add(col); } col.isTrigger = true; } Detach(); if (this.part.vessel != kerbalEvaVessel) { KAS_Shared.DecoupleFromAll(this.part); this.part.Couple(kerbalEvaVessel.rootPart); } else { if (this.part.parent != kerbalEvaVessel.rootPart) { this.part.setParent(null); this.part.setParent(kerbalEvaVessel.rootPart); } this.part.PromoteToPhysicalPart(); } //Destroy joint to avoid buggy eva move Destroy(this.part.attachJoint); this.part.rigidbody.velocity = kerbalEvaVessel.rootPart.rigidbody.velocity; if (physicJoint) { if (evaJoint) { Destroy(evaJoint); } evaJoint = this.part.gameObject.AddComponent <FixedJoint>(); evaJoint.connectedBody = evaCollider.attachedRigidbody; evaJoint.breakForce = 5; evaJoint.breakTorque = 5; KAS_Shared.ResetCollisionEnhancer(this.part); } else { this.part.physicalSignificance = Part.PhysicalSignificance.NONE; this.part.transform.parent = evaNodeTransform; this.part.rigidbody.isKinematic = true; KAS_Shared.ResetCollisionEnhancer(this.part, false); } //Add grabbed part mass to eva if (addPartMass && !physicJoint) { orgKerbalMass = kerbalEvaVessel.rootPart.mass; kerbalEvaVessel.rootPart.mass += this.part.mass; } GameEvents.onCrewBoardVessel.Add(new EventData <GameEvents.FromToAction <Part, Part> > .OnEvent(this.OnCrewBoardVessel)); evaHolderVesselName = kerbalEvaVessel.vesselName; evaHolderPart = kerbalEvaVessel.rootPart; grabbed = true; grab_pending = false; RefreshContextMenu(); //Play grab sound fxSndGrab.audio.Play(); base.SendMessage("OnPartGrabbed", kerbalEvaVessel, SendMessageOptions.DontRequireReceiver); }
private IEnumerator GrabCoroutine(Vessel kerbalEvaVessel) { KAS_Shared.DebugLog("Grab - Grabbing part :" + this.part.partInfo.name); //Send message to other modules base.SendMessage("OnPartGrab", kerbalEvaVessel, SendMessageOptions.DontRequireReceiver); //Set attach node on EVA SetEvaNode(kerbalEvaVessel); //Drop grabbed eva part if any KASModuleGrab grabbbedPartModule = KAS_Shared.GetGrabbedPartModule(kerbalEvaVessel); if (grabbbedPartModule) { grabbbedPartModule.Drop(); } //Unplug winch connected head if any KASModuleWinch moduleWinch = KAS_Shared.GetConnectedWinch(this.part); if (moduleWinch) { moduleWinch.UnplugHead(false); } //Disable all colliders on part DisableColliders(); //Detach if needed Detach(); //Decouple part (if not already done, in case of loading after a save with the part grabbed) if (this.part.vessel != kerbalEvaVessel) { KAS_Shared.DecoupleFromAll(this.part); } //Wait decouple action (x64 fix) yield return(new WaitForFixedUpdate()); //Move part to eva node KAS_Shared.MoveAlign(this.part.transform, partNode.nodeTransform, evaNodeTransform); //Grab winch connected head if any if (moduleWinch) { KASModulePort modulePort = this.part.GetComponent <KASModulePort>(); moduleWinch.GrabHead(kerbalEvaVessel, modulePort); } //Couple part to eva (if not already done, in case of loading after a save with the part grabbed) if (this.part.vessel != kerbalEvaVessel) { this.part.Couple(kerbalEvaVessel.rootPart); } //Destroy joint to avoid buggy eva move if (this.part.attachJoint) { this.part.attachJoint.DestroyJoint(); } //Set part to physic join or kinematic with parent if (physicJoint) { if (evaJoint) { Destroy(evaJoint); } evaJoint = this.part.gameObject.AddComponent <FixedJoint>(); evaJoint.connectedBody = evaCollider.attachedRigidbody; evaJoint.breakForce = 5; evaJoint.breakTorque = 5; KAS_Shared.ResetCollisionEnhancer(this.part); } else { syncGrab = true; KAS_Shared.ResetCollisionEnhancer(this.part, false); } //Add grabbed part mass to eva if (addPartMass && !physicJoint) { orgKerbalMass = kerbalEvaVessel.rootPart.mass; kerbalEvaVessel.rootPart.mass += this.part.mass; } //Add event GameEvents.onCrewBoardVessel.Add(new EventData <GameEvents.FromToAction <Part, Part> > .OnEvent(this.OnCrewBoardVessel)); //Set variables evaHolderVesselName = kerbalEvaVessel.vesselName; evaHolderPart = kerbalEvaVessel.rootPart; grabbed = true; grab_pending = false; //Refresh Context Menu RefreshContextMenu(); //Play grab sound fxSndGrab.audio.Play(); //Send message to other modules base.SendMessage("OnPartGrabbed", kerbalEvaVessel, SendMessageOptions.DontRequireReceiver); }