Angel-125 / KerbalActuators

A plugin used to create VTOL engines and robotic parts
6 stars 5 forks source link

magnet code #2

Closed flagmaggot closed 6 years ago

flagmaggot commented 6 years ago
    GameObject _hook;
    GameObject _target;
    Rigidbody _rb;
    Rigidbody _targetRb;
    ConfigurableJoint _joint;

[KSPEvent(guiActive = true, guiName = "Magnet: Off", active = true, guiActiveUnfocused = true, unfocusedRange = 40f)] public void MagnetToggle() { if (_target != null && connected == false) { //_joint = new ConfigurableJoint(); _rb = _hook.AddComponent(); _rb.isKinematic = true; //_rb.mass = 0.1f; //_rb.useGravity = false; //_rb.constraints = RigidbodyConstraints.FreezeAll;

            _joint = _hook.AddComponent<ConfigurableJoint>();

            _joint.xMotion = ConfigurableJointMotion.Locked;
            _joint.yMotion = ConfigurableJointMotion.Locked;
            _joint.zMotion = ConfigurableJointMotion.Locked;

            _joint.angularXMotion = ConfigurableJointMotion.Locked;
            _joint.angularYMotion = ConfigurableJointMotion.Locked;
            _joint.angularZMotion = ConfigurableJointMotion.Locked;

            _joint.connectedBody = _targetRb;
            connected = true;
            Events["MagnetToggle"].guiName = "Magnet: On";

        }
        else if (connected == true)
        {
            UnityEngine.Object.Destroy(_joint.GetComponent<ConfigurableJoint>());
            UnityEngine.Object.Destroy(_rb.GetComponent<Rigidbody>());
            connected = false;
            Events["MagnetToggle"].guiName = "Magnet: Off";
        }
    }

    public override void OnStart(PartModule.StartState state)
    {
        base.OnStart(state);
        if (HighLogic.LoadedSceneIsFlight)
        {
            //Debug.LogError(hookObjectName);
            //_hook = transform.Search(hookObjectName).gameObject;
            _hook = part.FindModelTransform(attachNode).gameObject;
            isReady = true;

        }

    }

    [KSPField(guiName = "Ray", guiActive = true)]
    public string ravInfo;

    //private Rigidbody hitBody = null; //current hit reference
    //bool connectable;
    bool connected;
    //Part hitPart;
    private ConfigurableJoint joint_rotate;
    //DockedVesselInfo vesselRef;
    Part ref_hitPart;
    //String partRef;

    RaycastHit hit;
    public Vector3 cameraPosition; //{ get { return armTip.position + armTip.up.normalized * 0.4f; } }
    public Vector3 cameraForward; //{ get { return armTip.up; } }
    //public Vector3 cameraNormal; //{ get { return armTip.forward; } }
    void FixedUpdate()
    {

        if (drawAttachRay && HighLogic.LoadedSceneIsFlight)
        {
            //DebugDrawer.DebugLine(cameraPosition, cameraPosition + cameraForward * attachRange, Color.red);
            //DrawLine

        }

        cameraPosition = part.FindModelTransform(attachNode).position;
        cameraForward = part.FindModelTransform(attachNode).forward;
        RaycastHit hit;
        int tempLayerMask = ~layerMask;
        if (!connected && Physics.Raycast(cameraPosition, cameraForward, out hit, attachRange, tempLayerMask))
        {
            ravInfo = hit.collider.gameObject.name.ToString();
            try
            {
                _target = hit.collider.gameObject;
                _targetRb = (hit.rigidbody);
            }
            catch (NullReferenceException) { }
        }
        else
        {
            ravInfo = "";
            _target = null;
        }
    }

---PART CONFIG MODULE { name = WhateverYouHaveYourModuleAs attachNode = MagnetTrigger //<------name of the mesh you want to use as a raycast attachRange = 0.5 drawAttachRay = true }

Angel-125 commented 6 years ago
    const int kPanelHeight = 70;
    const string kRequiredResource = "ElectricCharge";

    [KSPField]
    public bool debugMode;

    [KSPField]
    public float ecPerSec = 5.0f;

    [KSPField]
    public string magnetTransformName = "magnetTransform";

    [KSPField]
    public float attachRange = 0.5f;

    [KSPField(guiName = "Ray", guiActive = true)]
    public string rayInfo;

    [KSPField]
    public bool drawAttachRay = true;

    Vector2 scrollVector = new Vector2();
    GUILayoutOption[] panelOptions = new GUILayoutOption[] { GUILayout.Height(kPanelHeight) };
    GameObject magnetObject;
    GameObject targetObject;
    Part targetPart;
    Rigidbody magnetRigidBody;
    Rigidbody targetRigidBody;
    ConfigurableJoint attachmentJoint;
    bool magnetIsReady = false;
    int layerMask = 1;
    bool isConnected;
    Transform magnetTransform = null;

    protected void DebugLog(string message)
    {
        if (!debugMode)
            return;

        Debug.Log("[WBIMagnetController] - " + message);
    }

    [KSPEvent(guiActive = true, guiName = "Magnet: Off", active = true, guiActiveUnfocused = true, unfocusedRange = 40f)]
    public void MagnetToggle()
    {
        if (targetObject == null)
            DebugLog("targetObject is null");
        else
            DebugLog("targetObject is not null");
        if (targetObject != null && isConnected == false)
        {
            magnetRigidBody = magnetObject.AddComponent<Rigidbody>();
            magnetRigidBody.isKinematic = true;

            attachmentJoint = magnetObject.AddComponent<ConfigurableJoint>();

            attachmentJoint.xMotion = ConfigurableJointMotion.Locked;
            attachmentJoint.yMotion = ConfigurableJointMotion.Locked;
            attachmentJoint.zMotion = ConfigurableJointMotion.Locked;

            attachmentJoint.angularXMotion = ConfigurableJointMotion.Locked;
            attachmentJoint.angularYMotion = ConfigurableJointMotion.Locked;
            attachmentJoint.angularZMotion = ConfigurableJointMotion.Locked;

            attachmentJoint.connectedBody = targetRigidBody;
            isConnected = true;
            Events["MagnetToggle"].guiName = "Magnet: On";
            DebugLog("Created attachment joint");
        }
        else if (isConnected == true)
        {
            UnityEngine.Object.Destroy(attachmentJoint.GetComponent<ConfigurableJoint>());
            UnityEngine.Object.Destroy(magnetRigidBody.GetComponent<Rigidbody>());
            isConnected = false;
            Events["MagnetToggle"].guiName = "Magnet: Off";
        }
    }

    public override void OnStart(PartModule.StartState state)
    {
        base.OnStart(state);
        if (HighLogic.LoadedSceneIsFlight)
        {
            magnetTransform = part.FindModelTransform(magnetTransformName);
            if (magnetTransform != null)
            {
                DebugLog("Found magnet transform");
                magnetObject = magnetTransform.gameObject;
                magnetIsReady = true;
            }
            else
            {
                DebugLog("Magnet transform not found");
            }
        }
    }

    void FixedUpdate()
    {
        if (!HighLogic.LoadedSceneIsFlight)
            return;
        if (magnetTransform == null)
            return;
        if (isConnected)
            return;

        if (drawAttachRay)
        {
            //DebugDrawer.DebugLine(magnetTransform.position, magnetTransform.position + magnetTransform.forward * attachRange, Color.red);
            //DrawLine
        }

        RaycastHit rayCastHit;
        int tempLayerMask = ~layerMask;
        if (Physics.Raycast(magnetTransform.position, magnetTransform.forward, out rayCastHit, attachRange, tempLayerMask))
        {
            rayInfo = rayCastHit.collider.gameObject.name.ToString();
            try
            {
                targetObject = rayCastHit.collider.gameObject;
                targetRigidBody = rayCastHit.rigidbody;
            }
            catch (Exception ex) 
            { 
                DebugLog("Exception encountered while trying to get targetObject: " + ex.ToString());
            }
        }
        else
        {
            rayInfo = "";
            targetObject = null;
        }
    }
flagmaggot commented 6 years ago

change layerMask to 0

int layerMask = 0;

flagmaggot commented 6 years ago

In your CFG for the "Rotator Hand" portion I have this:

MODULE { //This module handles mesh rotation operations such as an engine nacelle pivot. name = WBIRotationController

    //(Optional, defaults to Actuator) User-friendly name of the rotation controller.
    rotatorName = Rotate Hand

    //(Optional, defaults to Engine) Group ID for the actuator. Allows you to differentiate
    //between the VTOL manager (which uses the Engine group), and, say, a robot arm manager.
    groupID = Arm

    //Name of the pivot z+ points down the length of the arm. See Unity model.
    rotationMeshName = Hand

    //Rotation axis of the pivot (x, y, z)
    rotationMeshAxis = 0,0,1

    //We'll use the Servo Manager to control the rotation
    //(defaults to true, so we have the buttons in the right-click menu)
    guiVisible = false

    //We don't do symmetry with this part. This is used for engines for the most part.
    canMirrorRotation = false

    //How fast to rotate the pivot
    rotationDegPerSec = 15
    //magnetTransformName = MagnetTrigger
    magnetTransformName = magnetTransform

}