Disable DEBUG.
Disable DEBUG.

file:a/CoreStrut.cs (deleted)
--- a/CoreStrut.cs
+++ /dev/null
@@ -1,219 +1,1 @@
-using System;

-using System.Collections.Generic;

-using System.Linq;

-using System.Text;

-using System.Threading.Tasks;

-using UnityEngine;

-

-namespace QuantumStrut

-{

-    class CoreStrut

-    {

-        public bool isDestroyed = false;

-

-        Material _material = null;

-        public Material Material

-        {

-            set

-            {

-                _material = value;

-                if (Material != null)

-                    lr.material = Material;

-            }

-            get

-            {

-                return _material;

-            }

-        }

-

-        Color _startColor = Color.white;

-        public Color StartColor

-        {

-            set

-            {

-                _startColor = value;

-                if (StartColor != null && EndColor != null)

-                    lr.SetColors(StartColor, EndColor);

-            }

-            get

-            {

-                return _startColor;

-            }

-        }

-

-        Color _endColor = Color.white;

-        public Color EndColor

-        {

-            set

-            {

-                _endColor = value;

-                if (StartColor != null && EndColor != null)

-                    lr.SetColors(StartColor, EndColor);

-            }

-            get

-            {

-                return _endColor;

-            }

-        }

-

-        float _startSize = 0;

-        public float StartSize

-        {

-            set

-            {

-                _startSize = value;

-                lr.SetWidth(StartSize, EndSize);

-            }

-            get

-            {

-                return _startSize;

-            }

-        }

-

-        float _endSize = 0;

-        public float EndSize

-        {

-            set

-            {

-                _endSize = value;

-                lr.SetWidth(StartSize, EndSize);

-            }

-            get

-            {

-                return _endSize;

-            }

-        }

-

-        ConfigurableJoint joint;

-

-        public bool Active = true;

-        public bool Selected = false;

-        public Part parent = null;

-        public Vector3 parentOffset = Vector3.zero;

-

-        public Part target = null;

-        public Vector3 targetOffset = Vector3.zero;

-

-        GameObject LineObj;

-        LineRenderer lr = null;

-

-        public void print(object body, params object[] args)

-        {

-            string final = body.ToString();

-            for (int I = 0; I < args.Length; I++)

-            {

-                final = final.Replace("{" + I + "}", args[I].ToString());

-            }

-            MonoBehaviour.print("[AutoStrut] " + final);

-        }

-

-        void DrawLine(Vector3 origin, Vector3 end)

-        {

-            if (Util.isValid(lr))

-            {

-                lr.SetPosition(0, origin);

-                lr.SetPosition(1, end);

-            }

-        }

-

-        void createJoint()

-        {

-            if (!Util.isValid(joint))

-            {

-                joint = parent.gameObject.AddComponent<ConfigurableJoint>();

-                joint.connectedBody = target.rigidbody;

-

-                joint.anchor = new Vector3(0, 0, Vector3.Distance(parent.transform.TransformPoint(parentOffset), target.transform.TransformPoint(targetOffset)) / 2);

-                joint.axis = new Vector3(0, 0, 1);

-                joint.xMotion = ConfigurableJointMotion.Locked;

-                joint.yMotion = ConfigurableJointMotion.Locked;

-                joint.zMotion = ConfigurableJointMotion.Locked;

-                joint.angularXMotion = ConfigurableJointMotion.Locked;

-                joint.angularYMotion = ConfigurableJointMotion.Locked;

-                joint.angularZMotion = ConfigurableJointMotion.Locked;

-            }

-        }

-

-        void deleteJoint()

-        {

-            if (Util.isValid(joint))

-                GameObject.DestroyImmediate(joint);

-        }

-

-        public CoreStrut(Part parent, Vector3 parentOffset, Part target, Vector3 targetOffset)

-        {

-            this.parent = parent;

-            this.parentOffset = parentOffset;

-            this.target = target;

-            this.targetOffset = targetOffset;

-

-            createJoint();

-

-            LineObj = new GameObject();

-            LineObj.name = "quantumstrut";

-

-            lr = LineObj.AddComponent<LineRenderer>();

-            lr.useWorldSpace = true;

-

-            Material = QuantumStrut.LaserMaterial;

-            StartColor = Color.white;

-            EndColor = Color.white;

-            StartSize = 0.03f;

-            EndSize = 0.0075f;

-

-            lr.SetVertexCount(2);

-            lr.SetPosition(0, Vector3.zero);

-            lr.SetPosition(1, Vector3.zero);

-        }

-

-        public void Update()

-        {

-            if (Util.isValid(parent) && Util.isValid(target) && Util.isValid(parent.vessel) && parent.vessel.parts.Contains(target))

-            {

-                if (Active)

-                {

-                    createJoint();

-                    Vector3 start = parent.transform.TransformPoint(parentOffset);

-                    Vector3 end = target.transform.TransformPoint(targetOffset);

-                    if (Selected)

-                        lr.SetColors(Color.blue, Color.blue);

-                    else

-                        lr.SetColors(StartColor, EndColor);

-                    DrawLine(start, end);

-                }

-                else

-                {

-                    deleteJoint();

-                    DrawLine(Vector3.zero, Vector3.zero);

-                }

-            }

-            else

-            {

-                DrawLine(Vector3.zero, Vector3.zero);

-                Destroy();

-            }

-        }

-

-        public void Destroy()

-        {

-            DrawLine(Vector3.zero, Vector3.zero);

-            if (Util.isValid(joint))

-                GameObject.DestroyImmediate(joint);

-

-            if (Util.isValid(lr))

-                GameObject.DestroyImmediate(lr);

-

-            if (Util.isValid(LineObj))

-                GameObject.DestroyImmediate(LineObj);

-

-            joint = null;

-            LineObj = null;

-            lr = null;

-

-            parent = null;

-            target = null;

-            targetOffset = Vector3.zero;

-            isDestroyed = true;

-        }

-    }

-}
+

--- /dev/null
+++ b/GameData/QuantumStrutsContinued/LICENSE
@@ -1,1 +1,26 @@
+QuantumStrutsContinued
 
+Continued from QuantumStruts by BoJaN.  Used by permission.
+
+ModuleManager patches © 2014 K3|Chris.  Used by permission.
+
+Copyright © 2014-2015, toadicus
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

--- /dev/null
+++ b/GameData/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/part.cfg
@@ -1,1 +1,85 @@
+// QuantumStrutsContinued
+//
+// Continued from QuantumStruts by BoJaN.  Used by permission.
+//
+// ModuleManager patches © 2014 K3|Chris.  Used by permission.
+//
+// Copyright © 2014, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+PART
+{
+	// --- general parameters ---
+	name = QuantumStrut
+	module = Part
+	author = BoJaN
+
+	// --- asset parameters ---
+	MODEL
+	{
+		model = Squad/Parts/Utility/linearRCS/model
+	}
+	rescaleFactor = 0.6
+
+	// --- node definitions ---
+	// definition format is Position X, Position Y, Position Z, Up X, Up Y, Up Z
+	node_attach = 0.0, 0.0 , 0.0, 0.0, -1.0, 0.0
+
+	// --- editor parameters ---
+	TechRequired = advScienceTech
+	cost = 1500
+	category = Structural
+	subcategory = 0
+	title = Quantum Strut
+	manufacturer = Bojantek Corporation
+	description = Highly experimental quantum struts harness a form of quantum locking to add support for docked vessels.
+
+	// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
+	attachRules = 0,1,0,1,1
+
+	// --- standard part parameters ---
+	mass = 0.05
+	dragModelType = default
+	maximum_drag = 0.01
+	minimum_drag = 0.01
+	angularDrag = 0.1
+	crashTolerance = 50
+	breakingForce = 50
+	breakingTorque = 50
+	maxTemp = 3400
+
+	MODULE
+	{
+		name = QuantumStrut
+		IsEnabled = true
+		PowerConsumption = 0.01
+
+		Material = Particles/Additive
+		StartColor = 57, 146, 181
+		EndColor = 11, 29, 36
+		StartSize = 0.03
+		EndSize = 0.015
+
+		Start = 0,0,0
+		Dir = 0,1,0
+	}
+}
+

--- /dev/null
+++ b/GameData/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/part.cfg
@@ -1,1 +1,85 @@
+// QuantumStrutsContinued
+//
+// Continued from QuantumStruts by BoJaN.  Used by permission.
+//
+// ModuleManager patches © 2014 K3|Chris.  Used by permission.
+//
+// Copyright © 2014, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+PART
+{
+	// --- general parameters ---
+	name = StrutGun
+	module = Part
+	author = BoJaN
+
+	// --- asset parameters ---
+	MODEL
+	{
+		model = Squad/Parts/Utility/linearRCS/model
+	}
+	rescaleFactor = 0.6
+
+	// --- node definitions ---
+	// definition format is Position X, Position Y, Position Z, Up X, Up Y, Up Z
+	node_attach = 0.0, 0.0 , 0.0, 0.0, -1.0, 0.0
+
+	// --- editor parameters ---
+	TechRequired = advScienceTech
+	cost = 500
+	category = Structural
+	subcategory = 0
+	title = Strut Gun
+	manufacturer = Bojantek Corporation
+	description = A radial strut gun for attaching and detatching struts when needed
+
+	// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
+	attachRules = 0,1,0,1,1
+
+	// --- standard part parameters ---
+	mass = 0.05
+	dragModelType = default
+	maximum_drag = 0.01
+	minimum_drag = 0.01
+	angularDrag = 0.1
+	crashTolerance = 50
+	breakingForce = 50
+	breakingTorque = 50
+	maxTemp = 3400
+
+	MODULE
+	{
+		name = QuantumStrut
+		IsEnabled = true
+		PowerConsumption = 0.01
+
+		Material = KSP/Sprite
+		StartColor = 50, 50, 50
+		EndColor = 50, 50, 50
+		StartSize = 0.03
+		EndSize = 0.03
+
+		Start = 0,0,0
+		Dir = 0,1,0
+	}
+}
+

--- a/Properties/AssemblyInfo.cs
+++ b/Properties/AssemblyInfo.cs
@@ -1,37 +1,61 @@
-using System.Reflection;

-using System.Runtime.CompilerServices;

-using System.Runtime.InteropServices;

-

-// General Information about an assembly is controlled through the following 

-// set of attributes. Change these attribute values to modify the information

-// associated with an assembly.

-[assembly: AssemblyTitle("AutoStrut")]

-[assembly: AssemblyDescription("")]

-[assembly: AssemblyConfiguration("")]

-[assembly: AssemblyCompany("")]

-[assembly: AssemblyProduct("AutoStrut")]

-[assembly: AssemblyCopyright("Copyright ©  2012")]

-[assembly: AssemblyTrademark("")]

-[assembly: AssemblyCulture("")]

-

-// Setting ComVisible to false makes the types in this assembly not visible 

-// to COM components.  If you need to access a type in this assembly from 

-// COM, set the ComVisible attribute to true on that type.

-[assembly: ComVisible(false)]

-

-// The following GUID is for the ID of the typelib if this project is exposed to COM

-[assembly: Guid("57e209db-4b94-46b4-be0e-bd6e830d4eb5")]

-

-// Version information for an assembly consists of the following four values:

-//

-//      Major Version

-//      Minor Version 

-//      Build Number

-//      Revision

-//

-// You can specify all the values or you can default the Build and Revision Numbers 

-// by using the '*' as shown below:

-// [assembly: AssemblyVersion("1.0.*")]

-[assembly: AssemblyVersion("1.0.0.0")]

-[assembly: AssemblyFileVersion("1.0.0.0")]

+// QuantumStrutsContinued
+//
+// AssemblyInfo.cs
+// 
+// Continued from QuantumStruts by BoJaN.  Used by permission.
+//
+// ModuleManager patches © 2014 K3|Chris.  Used by permission.
+//
+// Copyright © 2014, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("QuantumStrutsContinued")]
+[assembly: AssemblyDescription("A KSP part mod that provides magical struts for rigidifying vessels constructed outside the VAB.")]
+[assembly: AssemblyProduct("QuantumStrutsContinued")]
+[assembly: AssemblyCopyright("Copyright © 2014 toadicus")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("57e209db-4b94-46b4-be0e-bd6e830d4eb5")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.4.*")]
+

--- a/QuantumStrut.cs
+++ b/QuantumStrut.cs
@@ -1,332 +1,403 @@
-using System;

-using System.Collections.Generic;

-using System.Linq;

-using System.Text;

-using System.Threading.Tasks;

-using UnityEngine;

-

-namespace QuantumStrut

-{

-    public class QuantumStrut : PartModule

-    {

-        public static Material LaserMaterial;

-

-        Strut strut = null;

-        GameObject lineObj;

-        LineRenderer lr;

-        bool Editor = false;

-        int I = 0;

-

-        #region Fields

-        [KSPField(isPersistant = true)]

-        public bool IsEnabled = true;

-

-        [KSPField(isPersistant = false)]

-        public float PowerConsumption = 0;

-

-

-        [KSPField(isPersistant = false)]

-        public string TransformName = "";

-

-        [KSPField(isPersistant = false)]

-        public Vector3 Start = new Vector3(0,0,0);

-

-        [KSPField(isPersistant = false)]

-        public Vector3 Dir = new Vector3(0, 1, 0);

-

-

-        [KSPField(isPersistant = false)]

-        public string Material = "Particles/Additive";

-

-        [KSPField(isPersistant = false)]

-        public Vector3 StartColor = Vector3.zero;

-

-        [KSPField(isPersistant = false)]

-        public Vector3 EndColor = Vector3.zero;

-

-

-        [KSPField(isPersistant = false)]

-        public float StartSize = 0.03f;

-

-        [KSPField(isPersistant = false)]

-        public float EndSize = 0.0075f;

-        #endregion

-

-        #region Actions

-        [KSPAction("Toggle")]

-        public void ToggleStrut(KSPActionParam param)

-        {

-            IsEnabled = !IsEnabled;

-            CheckHit();

-        }

-

-        [KSPAction("Activate")]

-        public void ActivateStrut(KSPActionParam param)

-        {

-            IsEnabled = true;

-            CheckHit();

-        }

-

-        [KSPAction("Deactivate")]

-        public void DeactivateStrut(KSPActionParam param)

-        {

-            IsEnabled = false;

-            CheckHit();

-        }

-        #endregion

-

-        #region Events

-        [KSPEvent(guiActive = true, guiName = "Activate", active = true)]

-        public void ActivateStrut()

-        {

-            IsEnabled = true;

-            CheckHit();

-        }

-

-        [KSPEvent(guiActive = true, guiName = "Deactivate", active = false)]

-        public void DeactivateStrut()

-        {

-            IsEnabled = false;

-            CheckHit();

-        }

-        #endregion

-

-        public Material material = null;

-        public Color startColor = Color.white;

-        public Color endColor = Color.white;

-

-        public Color Vector3toColor(Vector3 vec)

-        {

-            return new Color(vec.x/255, vec.y/255, vec.z/255);

-        }

-

-        Transform getTransform()

-        {

-            if (TransformName == "")

-                return part.transform;

-            else

-                return part.FindModelTransform(TransformName);

-        }

-

-        public void print(object body, params object[] args)

-        {

-            string final = body.ToString();

-            for (int I = 0; I < args.Length; I++)

-            {

-                final = final.Replace("{" + I + "}", args[I].ToString());

-            }

-            MonoBehaviour.print("[AutoStrut] " + final);

-        }

-

-        public override void OnLoad(ConfigNode node)

-        {

-            base.OnLoad(node);

-        }

-

-        public override void OnActive()

-        {

-            InitLaser();

-

-            base.OnActive();

-        }

-

-        public override void OnInactive()

-        {

-            DestroyLaser();

-

-            base.OnInactive();

-        }

-

-        public override string GetInfo()

-        {

-            return "Requires:\n- ElectricCharge (" + PowerConsumption + "/s.)\n\n Costs 5 to create strut.";

-            return base.GetInfo();

-        }

-

-        public override void OnStart(PartModule.StartState state)

-        {

-            try

-            {

-                print("Material: {0}", Material);

-                material = new Material(Shader.Find(Material.Trim()));

-            }

-            catch

-            {

-                material = null;

-            }

-

-            startColor = Vector3toColor(StartColor);

-            endColor = Vector3toColor(EndColor);

-

-            if (!Util.isValid(LaserMaterial))

-                LaserMaterial = new Material(Shader.Find("Particles/Additive"));

-

-            if (state == StartState.Docked)

-                CheckHit();

-

-            if (state == StartState.Editor)

-            {

-                Editor = true;

-                RenderingManager.AddToPostDrawQueue(0, DrawBuildOverlay);

-                InitLaser();

-            }

-            else

-            {

-                Editor = false;

-                RenderingManager.RemoveFromPostDrawQueue(0, DrawBuildOverlay);

-                DestroyLaser();

-            }

-

-            base.OnStart(state);

-        }

-

-        public override void OnFixedUpdate()

-        {

-            base.OnFixedUpdate();

-        }

-

-

-        public override void OnUpdate()

-        {

-            Events["ActivateStrut"].active = !IsEnabled;

-            Events["DeactivateStrut"].active = IsEnabled;

-

-            if (IsEnabled)

-            {

-                I = I + 1 % 255;

-

-                if (strut != null && !strut.isDestroyed)

-                {

-                    if (PowerConsumption == 0 || (Util.GetEnergy(part.vessel) > PowerConsumption * TimeWarp.fixedDeltaTime && part.RequestResource("ElectricCharge", PowerConsumption * TimeWarp.fixedDeltaTime) > 0))

-                        strut.Update();

-                    else

-                        strut.Destroy();

-                }

-                else

-                {

-                    if ((I % 10)==0)

-                    {

-                        CheckHit();

-                    }

-                }

-            }

-            else

-            {

-                if (strut != null)

-                {

-                    strut.Destroy();

-                    strut = null;

-                }

-            }

-

-            base.OnUpdate();

-        }

-

-        void CheckHit()

-        {

-            if (!isEnabled)

-            {

-                strut.Destroy();

-                strut = null;

-                return;

-            }

-

-            if (strut == null || strut.isDestroyed)

-            {

-                Vector3 dir = getTransform().TransformDirection(Dir);

-                Vector3 start = getTransform().TransformPoint(Start);

-

-                UnityEngine.RaycastHit info = new RaycastHit();

-                bool hit = Physics.Raycast(new UnityEngine.Ray(start + (dir * 0.05f), dir), out info, 10);

-                if (hit)

-                {

-                    Part targetPart = Util.partFromRaycast(info);

-

-                    if (targetPart && vessel.parts.Contains(targetPart) && Util.GetEnergy(part.vessel) > 5 * TimeWarp.fixedDeltaTime)

-                    {

-                        float energy = part.RequestResource("ElectricCharge", 5 * TimeWarp.fixedDeltaTime);

-

-                        strut = new Strut(part, targetPart, targetPart.transform.InverseTransformPoint(info.point), getTransform());

-                        strut.Material = material;

-                        strut.StartColor = startColor;

-                        strut.EndColor = endColor;

-                        strut.StartSize = StartSize;

-                        strut.EndSize = EndSize;

-                    }

-                }

-            }

-        }

-

-        void InitLaser()

-        {

-            if (!Util.isValid(lr))

-            {

-                lineObj = new GameObject();

-

-                lr = lineObj.AddComponent<LineRenderer>();

-                lr.useWorldSpace = true;

-

-                lr.material = material;

-                lr.SetColors(startColor, endColor);

-                lr.SetWidth(StartSize, EndSize);

-

-                lr.SetVertexCount(2);

-                lr.SetPosition(0, Vector3.zero);

-                lr.SetPosition(1, Vector3.zero);

-                lr.castShadows = false;

-                lr.receiveShadows = true;

-            }

-        }

-

-        void DestroyLaser()

-        {

-            if (Util.isValid(lr))

-                LineRenderer.DestroyImmediate(lr);

-

-            if (Util.isValid(lineObj))

-                GameObject.DestroyImmediate(lineObj);

-        }

-

-        public void DrawBuildOverlay()

-        {

-            if (Util.isValid(part))

-            {

-                if (!Editor) return;

-

-                if (Util.isValid(lr))

-                {

-                    Vector3 dir = getTransform().TransformDirection(Dir);

-                    Vector3 start = getTransform().TransformPoint(Start);

-

-                    UnityEngine.RaycastHit info = new RaycastHit();

-                    bool hit = Physics.Raycast(new UnityEngine.Ray(start + (dir * 0.05f), dir), out info, 10);

-                    if (hit)

-                    {

-                        if (Util.isValid(material))

-                            lr.material = material;

-

-                        lr.SetColors(startColor, endColor);

-                        lr.SetWidth(StartSize, EndSize);

-

-                        lr.SetPosition(0, start);

-                        lr.SetPosition(1, info.point);

-                    }

-                    else

-                    {

-                        lr.material = LaserMaterial;

-                        lr.SetColors(Color.red, Color.red);

-                        lr.SetWidth(0.01f, 0.01f);

-

-                        lr.SetPosition(0, start);

-                        lr.SetPosition(1, start + (dir * 10));

-                    }

-                }

-            }

-            else

-            {

-                DestroyLaser();

-                RenderingManager.RemoveFromPostDrawQueue(0, DrawBuildOverlay);

-            }

-        }

-    }

+// QuantumStrutsContinued
+//
+// QuantumStrut.cs
+// 
+// Continued from QuantumStruts by BoJaN.  Used by permission.
+//
+// ModuleManager patches © 2014 K3|Chris.  Used by permission.
+//
+// Copyright © 2014, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using KSP;
+using System;
+using ToadicusTools;
+using UnityEngine;
+
+namespace QuantumStrut
+{
+	public class QuantumStrut : PartModule
+	{
+		public static Material LaserMaterial;
+		Strut strut = null;
+		GameObject lineObj;
+		LineRenderer lr;
+		bool Editor = false;
+		int I = 0;
+
+		#region Fields
+
+		[KSPField(isPersistant = true)]
+		public bool IsEnabled = true;
+		[KSPField(isPersistant = false)]
+		public float PowerConsumption = 0;
+		[KSPField(isPersistant = false)]
+		public string TransformName = "";
+		[KSPField(isPersistant = false)]
+		public Vector3 Start = new Vector3(0, 0, 0);
+		[KSPField(isPersistant = false)]
+		public Vector3 Dir = new Vector3(0, 1, 0);
+		[KSPField(isPersistant = false)]
+		public string Material = "Particles/Additive";
+		[KSPField(isPersistant = false)]
+		public Vector3 StartColor = Vector3.zero;
+		[KSPField(isPersistant = false)]
+		public Vector3 EndColor = Vector3.zero;
+		[KSPField(isPersistant = false)]
+		public float StartSize = 0.03f;
+		[KSPField(isPersistant = false)]
+		public float EndSize = 0.015f;
+
+		[KSPField(
+			isPersistant = false, guiActiveEditor = true,
+			guiName = "Max. Strut Length", guiUnits = "m", guiFormat = "F0"
+		)]
+		[UI_FloatRange(minValue = 2f, maxValue = 50f, stepIncrement = 2f)]
+		public float MaxStrutLength = 10f;
+
+		#endregion
+
+		#region Actions
+
+		[KSPAction("Toggle")]
+		public void ToggleStrut(KSPActionParam param)
+		{
+			IsEnabled = !IsEnabled;
+			CheckHit();
+		}
+
+		[KSPAction("Activate")]
+		public void ActivateStrut(KSPActionParam param)
+		{
+			this.ActivateStrut();
+		}
+
+		[KSPAction("Deactivate")]
+		public void DeactivateStrut(KSPActionParam param)
+		{
+			this.DeactivateStrut();
+		}
+
+		#endregion
+
+		#region Events
+
+		[KSPEvent(guiActive = true, guiName = "Activate", active = true, guiActiveUnfocused = true, unfocusedRange = 2f)]
+		public void ActivateStrut()
+		{
+			IsEnabled = true;
+			CheckHit();
+			this.Events["ActivateStrut"].guiActiveEditor = false;
+			this.Events["DeactivateStrut"].guiActiveEditor = true;
+		}
+
+		[KSPEvent(guiActive = true, guiName = "Deactivate", active = false, guiActiveUnfocused = true, unfocusedRange = 2f)]
+		public void DeactivateStrut()
+		{
+			IsEnabled = false;
+			CheckHit();
+			this.Events["ActivateStrut"].guiActiveEditor = true;
+			this.Events["DeactivateStrut"].guiActiveEditor = false;
+		}
+
+		#endregion
+
+		public Material material = null;
+		public Color startColor = Color.white;
+		public Color endColor = Color.white;
+
+		public Color Vector3toColor(Vector3 vec)
+		{
+			return new Color(vec.x / 255, vec.y / 255, vec.z / 255);
+		}
+
+		Transform getTransform()
+		{
+			if (TransformName == "")
+				return part.transform;
+			else
+				return part.FindModelTransform(TransformName);
+		}
+
+		public void print(object body, params object[] args)
+		{
+			string final = body.ToString();
+			for (int I = 0; I < args.Length; I++)
+			{
+				final = final.Replace("{" + I + "}", args[I].ToString());
+			}
+			MonoBehaviour.print("[AutoStrut] " + final);
+		}
+
+		public override void OnLoad(ConfigNode node)
+		{
+			base.OnLoad(node);
+		}
+
+		public override void OnActive()
+		{
+			InitLaser();
+
+			base.OnActive();
+		}
+
+		public override void OnInactive()
+		{
+			DestroyLaser();
+
+			base.OnInactive();
+		}
+
+		public override string GetInfo()
+		{
+			return "Requires:\n- ElectricCharge (" + PowerConsumption + "/s.)\n\n Costs 5 to create strut.";
+		}
+
+		public override void OnStart(PartModule.StartState state)
+		{
+			try
+			{
+				print("Material: {0}", Material);
+				material = new Material(Shader.Find(Material.Trim()));
+			}
+			catch
+			{
+				material = null;
+			}
+
+			base.stagingEnabled = false;
+
+			startColor = Vector3toColor(StartColor);
+			endColor = Vector3toColor(EndColor);
+
+			if (!Util.isValid(LaserMaterial))
+				LaserMaterial = new Material(Shader.Find("Particles/Additive"));
+
+			if (state == StartState.Docked)
+				CheckHit();
+
+			if (state == StartState.Editor)
+			{
+				Editor = true;
+				RenderingManager.AddToPostDrawQueue(0, DrawBuildOverlay);
+				InitLaser();
+			}
+			else
+			{
+				Editor = false;
+				RenderingManager.RemoveFromPostDrawQueue(0, DrawBuildOverlay);
+				DestroyLaser();
+			}
+
+			base.OnStart(state);
+		}
+
+		public override bool IsStageable()
+		{
+			return false;
+		}
+
+		public void FixedUpdate()
+		{
+			Events["ActivateStrut"].guiActiveEditor = Events["ActivateStrut"].active = !IsEnabled;
+			Events["DeactivateStrut"].guiActiveEditor = Events["DeactivateStrut"].active = IsEnabled;
+
+			if (IsEnabled)
+			{
+				I = I + 1 % 255;
+
+				if (strut != null && !strut.isDestroyed)
+				{
+					if (PowerConsumption == 0 || (Util.GetEnergy(part.vessel) > PowerConsumption * TimeWarp.fixedDeltaTime && part.RequestResource(
+						    "ElectricCharge",
+						    PowerConsumption * TimeWarp.fixedDeltaTime
+					    ) > 0))
+						strut.Update();
+					else
+						strut.Destroy();
+				}
+				else
+				{
+					if ((I % 10) == 0)
+					{
+						CheckHit();
+					}
+				}
+			}
+			else
+			{
+				if (strut != null)
+				{
+					strut.Destroy();
+					strut = null;
+				}
+			}
+
+			base.OnUpdate();
+		}
+
+		void CheckHit()
+		{
+			if (HighLogic.LoadedSceneIsEditor)
+			{
+				Logging.PostDebugMessage(this, "Checking bailing out: in the editor!");
+				return;
+			}
+
+			if (!isEnabled)
+			{
+				Logging.PostDebugMessage(this, "Destroying strut.");
+
+				strut.Destroy();
+				strut = null;
+				return;
+			}
+
+			Logging.PostDebugMessage(this, "Checking for ray hit.");
+
+			Logging.PostDebugMessage(this, "Enabled, continuing.");
+
+			if (strut == null || strut.isDestroyed)
+			{
+				Logging.PostDebugMessage(this, "strut is {0}", strut == null ? "null" : strut.isDestroyed.ToString());
+
+				Vector3 dir = getTransform().TransformDirection(Dir);
+				Vector3 start = getTransform().TransformPoint(Start);
+
+				Logging.PostDebugMessage(this, "Got transforms.  Checking for raycast hit.");
+
+				UnityEngine.RaycastHit info = new RaycastHit();
+				bool hit = Physics.Raycast(new UnityEngine.Ray(start + (dir * 0.05f), dir), out info, MaxStrutLength);
+
+				if (hit)
+				{
+					Logging.PostDebugMessage(this, "Found raycast hit.  Fetching target part.");
+
+					Part targetPart = Util.partFromRaycast(info);
+
+					Logging.PostDebugMessage(this,
+						"Found target part {0} on {1}.",
+						targetPart.partName,
+						targetPart.vessel == null ? "null vessel" : targetPart.vessel.vesselName
+					);
+
+					if (
+						targetPart && vessel.parts.Contains(targetPart) &&
+						Util.GetEnergy(part.vessel) > 5 * TimeWarp.fixedDeltaTime
+					)
+					{
+						Logging.PostDebugMessage(this, "Target part is in our vessel and we have the energy to continue.");
+
+						strut = new Strut(
+							part,
+							targetPart,
+							targetPart.transform.InverseTransformPoint(info.point),
+							getTransform()
+						);
+
+						Logging.PostDebugMessage(this, "Built a new strut, setting material, colors, and sizes.");
+
+						strut.Material = material;
+						strut.StartColor = startColor;
+						strut.EndColor = endColor;
+						strut.StartSize = StartSize;
+						strut.EndSize = EndSize;
+
+						Logging.PostDebugMessage(this, "Strut all done!");
+					}
+				}
+			}
+		}
+
+		void InitLaser()
+		{
+			if (!Util.isValid(lr))
+			{
+				lineObj = new GameObject();
+
+				lr = lineObj.AddComponent<LineRenderer>();
+				lr.useWorldSpace = true;
+
+				lr.material = material;
+				lr.SetColors(startColor, endColor);
+				lr.SetWidth(StartSize, EndSize);
+
+				lr.SetVertexCount(2);
+				lr.SetPosition(0, Vector3.zero);
+				lr.SetPosition(1, Vector3.zero);
+				lr.castShadows = false;
+				lr.receiveShadows = true;
+			}
+		}
+
+		void DestroyLaser()
+		{
+			if (Util.isValid(lr))
+				LineRenderer.DestroyImmediate(lr);
+
+			if (Util.isValid(lineObj))
+				GameObject.DestroyImmediate(lineObj);
+		}
+
+		public void DrawBuildOverlay()
+		{
+			if (Util.isValid(part))
+			{
+				if (!Editor)
+					return;
+
+				if (Util.isValid(lr))
+				{
+					Vector3 dir = getTransform().TransformDirection(Dir);
+					Vector3 start = getTransform().TransformPoint(Start);
+
+					UnityEngine.RaycastHit info = new RaycastHit();
+					bool hit = Physics.Raycast(new UnityEngine.Ray(start + (dir * 0.05f), dir), out info, MaxStrutLength);
+					if (hit && IsEnabled)
+					{
+						if (Util.isValid(material))
+							lr.material = material;
+
+						lr.SetColors(startColor, endColor);
+						lr.SetWidth(StartSize, EndSize);
+
+						lr.SetPosition(0, start);
+						lr.SetPosition(1, info.point);
+					}
+					else
+					{
+						lr.material = LaserMaterial;
+						lr.SetColors(Color.red, Color.red);
+						lr.SetWidth(0.01f, 0.01f);
+
+						lr.SetPosition(0, start);
+						lr.SetPosition(1, start + (dir * MaxStrutLength));
+					}
+				}
+			}
+			else
+			{
+				DestroyLaser();
+				RenderingManager.RemoveFromPostDrawQueue(0, DrawBuildOverlay);
+			}
+		}
+	}
 }

file:a/QuantumStrutCore.cs (deleted)
--- a/QuantumStrutCore.cs
+++ /dev/null
@@ -1,474 +1,1 @@
-using System;

-using System.Collections.Generic;

-using System.ComponentModel;

-using System.Linq;

-using System.Text;

-using System.Threading.Tasks;

-using UnityEngine;

-using KSP.IO;

-

-

-namespace QuantumStrut

-{

-    class QuantumStrutCore : PartModule

-    {

-        GameObject lineObj = null;

-        LineRenderer lr = null;

-        ConfigNode nodeToLoad = null;

-

-        bool Placing = false;

-        bool Deleting = false;

-        List<CoreStrut> struts = new List<CoreStrut>();

-

-        Part startPart = null;

-        Vector3 startOffset = Vector3.zero;

-        Part endPart = null;

-        Vector3 endOffset = Vector3.zero;

-

-        public Material material = null;

-        public Color startColor = Color.white;

-        public Color endColor = Color.white;

-

-        #region Fields

-        [KSPField(isPersistant = true)]

-        public bool IsEnabled = true;

-

-        [KSPField(isPersistant = false)]

-        public float PowerConsumption = 0;

-

-        [KSPField(isPersistant = false)]

-        public int MaxStruts = 8;

-

-        [KSPField(isPersistant = false)]

-        public string Material = "Particles/Additive";

-

-        [KSPField(isPersistant = false)]

-        public Vector3 StartColor = Vector3.zero;

-

-        [KSPField(isPersistant = false)]

-        public Vector3 EndColor = Vector3.zero;

-

-

-        [KSPField(isPersistant = false)]

-        public float StartSize = 0.03f;

-

-        [KSPField(isPersistant = false)]

-        public float EndSize = 0.0075f;

-        #endregion

-

-        #region Actions

-        [KSPAction("Toggle")]

-        public void ToggleCore(KSPActionParam param)

-        {

-            IsEnabled = !IsEnabled;

-        }

-

-        [KSPAction("Activate")]

-        public void ActivateCore(KSPActionParam param)

-        {

-            IsEnabled = true;

-        }

-

-        [KSPAction("Deactivate")]

-        public void DeactivateCore(KSPActionParam param)

-        {

-            IsEnabled = false;

-        }

-        #endregion

-

-        #region Events

-        [KSPEvent(guiActive = true, guiName = "Place Strut", active = false, externalToEVAOnly=true, guiActiveUnfocused=true, unfocusedRange = 5)]

-        public void BeginPlace()

-        {

-            startPart = null;

-            startOffset = Vector3.zero;

-            endPart = null;

-            endOffset = Vector3.zero;

-            Placing = true;

-        }

-

-        [KSPEvent(guiActive = true, guiName = "Remove Strut", active = false, externalToEVAOnly = true, guiActiveUnfocused = true, unfocusedRange = 2500)]

-        public void BeginDelete()

-        {

-            Deleting = true;

-        }

-

-        [KSPEvent(guiActive = true, guiName = "Activate", active = true)]

-        public void ActivateCore()

-        {

-            IsEnabled = true;

-        }

-

-        [KSPEvent(guiActive = true, guiName = "Deactivate", active = false)]

-        public void DeactivateCore()

-        {

-            IsEnabled = false;

-        }

-        #endregion

-

-        public Vector3 StringToVector3(string str)

-        {

-            string[] vals = str.Split(',');

-            float x = (float)Convert.ToDecimal(vals[0]);

-            float y = (float)Convert.ToDecimal(vals[1]);

-            float z = (float)Convert.ToDecimal(vals[2]);

-            return new Vector3(x, y, z);

-        }

-

-        public Color Vector3toColor(Vector3 vec)

-        {

-            return new Color(vec.x / 255, vec.y / 255, vec.z / 255);

-        }

-

-        Part partFromGameObject(GameObject ob)

-        {

-            GameObject o = ob;

-

-            while (o)

-            {

-                Part p = Part.FromGO(o);

-                if (p && p != null)

-                {

-                    return p;

-                }

-

-                if (o.transform.parent)

-                    o = o.transform.parent.gameObject;

-                else

-                    return null;

-            }

-            return null;

-        }

-

-        Part partFromRaycast(RaycastHit hit)

-        {

-            return partFromGameObject(hit.collider.gameObject);

-        }

-

-        Part partFromId(long id)

-        {

-            Console.WriteLine("Vessel Parts: " + part.vessel.Parts.Count);

-            foreach (Part p in part.vessel.Parts)

-            {

-                print(p.uid + " ?= " + id + ": " + (p.uid == id));

-                if (p.uid == id)

-                    return p;

-            }

-            return null;

-        }

-

-        bool isValid(UnityEngine.Object obj)

-        {

-            return (obj && obj != null);

-        }

-

-        void InitLaser()

-        {

-            if (!isValid(lr))

-            {

-                lineObj = new GameObject();

-

-                lr = lineObj.AddComponent<LineRenderer>();

-                lr.useWorldSpace = true;

-

-                lr.material = new Material(Shader.Find("Particles/Additive"));

-                lr.SetColors(Color.white, Color.white);

-                lr.SetWidth(0.03f, 0.03f);

-

-                lr.SetVertexCount(2);

-                lr.SetPosition(0, Vector3.zero);

-                lr.SetPosition(1, Vector3.zero);

-                lr.castShadows = false;

-                lr.receiveShadows = true;

-            }

-        }

-

-        void DestroyLaser()

-        {

-            if (isValid(lr))

-                LineRenderer.DestroyImmediate(lr);

-            if (isValid(lineObj))

-                GameObject.DestroyImmediate(lineObj);

-        }

-

-        float GetEnergy()

-        {

-            double energy = 0;

-            foreach (Part p in part.vessel.parts)

-            {

-                foreach (PartResource r in p.Resources)

-                {

-                    if (r.resourceName == "ElectricCharge")

-                        energy += r.amount;

-                }

-            }

-            return (float)energy;

-        }

-

-        void AddStrut(Part a, Vector3 aO, Part b, Vector3 bO)

-        {

-            CoreStrut s = new CoreStrut(a, aO, b, bO);

-            s.Material = material;

-            s.StartColor = startColor;

-            s.EndColor = endColor;

-            s.StartSize = StartSize;

-            s.EndSize = EndSize;

-            struts.Add(s);

-        }

-

-        public override string GetInfo()

-        {

-            return "Max Struts: " + MaxStruts + "\nRequires:\n- ElectricCharge (" + PowerConsumption + "/s.)\n\n Energy cost is per-strut.";

-            return base.GetInfo();

-        }

-

-        public override void OnStart(PartModule.StartState state)

-        {

-            try

-            {

-                material = new Material(Shader.Find(Material.Trim()));

-            }

-            catch

-            {

-                material = null;

-            }

-

-            startColor = Vector3toColor(StartColor);

-            endColor = Vector3toColor(EndColor);

-            base.OnStart(state);

-        }

-

-        public override void OnSave(ConfigNode node)

-        {

-            foreach (CoreStrut strut in struts)

-            {

-                if (!strut.isDestroyed)

-                {

-                    ConfigNode n = node.AddNode("QuantumStrut");

-                    n.AddValue("parent", part.vessel.parts.IndexOf(strut.parent));

-                    n.AddValue("parentOffset", strut.parentOffset.x + "," + strut.parentOffset.y + "," + strut.parentOffset.z);

-                    n.AddValue("target", part.vessel.parts.IndexOf(strut.target));

-                    n.AddValue("targetOffset", strut.targetOffset.x + "," + strut.targetOffset.y + "," + strut.targetOffset.z);

-                }

-            }

-

-            base.OnSave(node);

-        }

-

-        public override void OnLoad(ConfigNode node)

-        {

-            if (nodeToLoad == null)

-                nodeToLoad = node;

-

-            base.OnLoad(node);

-        }

-

-        void printObj(object obj)

-        {

-            using (KSP.IO.TextWriter writer = TextWriter.CreateForType<string>("obj.cs"))

-            {

-                string str = printProperties(obj, TypeDescriptor.GetProperties(obj), 0);

-                writer.Write(str);

-                print(str);

-            }

-        }

-

-        string printProperties(object obj, PropertyDescriptorCollection collection, int I)

-        {

-            if (I > 2) return "";

-

-            string prefix = "";

-            string str = "";

-            for (int T = 0; T < I; T++)

-            {

-                prefix += "    ";

-            }

-

-            str += "\n" + prefix + "#region";

-            foreach (PropertyDescriptor d in collection)

-            {

-                str += "\n" + prefix + d.Name + " = " + d.GetValue(obj);

-                str += printProperties(obj, d.GetChildProperties(obj), I+1);

-            }

-            str += "\n" + prefix + "#endregion";

-            return str;

-        }

-

-        bool kerbalPrinted = false;

-        public override void OnUpdate()

-        {

-            bool eva = isValid(Util.Kerbal);

-            Events["ActivateCore"].active = !IsEnabled;

-            Events["DeactivateCore"].active = IsEnabled;

-            Events["BeginPlace"].active = !Placing && !Deleting && struts.Count < MaxStruts && eva;

-            Events["BeginDelete"].active = !Deleting && !Placing && struts.Count > 0 && eva;

-

-            if (nodeToLoad != null)

-            {

-                foreach (ConfigNode strut in nodeToLoad.GetNodes("QuantumStrut"))

-                {

-                    Part parent = part.vessel.parts[Convert.ToInt32(strut.GetValue("parent"))];

-                    Vector3 parentOffset = StringToVector3(strut.GetValue("parentOffset"));

-                    Part target = part.vessel.parts[Convert.ToInt32(strut.GetValue("target"))];

-                    Vector3 targetOffset = StringToVector3(strut.GetValue("targetOffset"));

-

-                    if (isValid(parent) && isValid(target))

-                        AddStrut(parent, parentOffset, target, targetOffset);

-                }

-                nodeToLoad = null;

-            }

-

-            if (eva)

-            {

-                InitLaser();

-                if (Placing)

-                {

-                    RaycastHit info = new RaycastHit();

-                    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

-                    bool hit = Physics.Raycast(ray, out info, Mathf.Infinity);

-                    if (isValid(startPart))

-                    {

-                        Vector3 pos = startPart.transform.TransformPoint(startOffset);

-                        ray = new Ray(pos, (info.point - pos).normalized);

-                        hit = Physics.Raycast(ray, out info, 10);

-                    }

-

-                    if (Input.GetMouseButtonUp(0))

-                    {

-                        if (hit)

-                        {

-                            if (!isValid(startPart))

-                            {

-                                startPart = partFromRaycast(info);

-                                if (isValid(startPart))

-                                    startOffset = startPart.transform.InverseTransformPoint(info.point);

-                            }

-                            else if (!isValid(endPart))

-                            {

-                                Part p = partFromRaycast(info);

-                                if (isValid(p))

-                                {

-                                    if (p != startPart && startPart.vessel.parts.Contains(p))

-                                    {

-                                        endPart = p;

-                                        endOffset = endPart.transform.InverseTransformPoint(info.point);

-

-                                        AddStrut(startPart, startOffset, endPart, endOffset);

-                                    }

-                                    Placing = false;

-                                }

-                            }

-                        }

-                    }

-

-                    if(isValid(startPart))

-                    {

-                        if (hit)

-                        {

-                            Part p = partFromRaycast(info);

-                            Color c = Color.red;

-

-                            if (isValid(p))

-                            {

-                                if (startPart.vessel.parts.Contains(p) && p != startPart)

-                                    c = Color.green;

-                            }

-

-                            lr.SetColors(c, c);

-                            lr.SetPosition(0, startPart.transform.TransformPoint(startOffset));

-                            lr.SetPosition(1, info.point);

-                        }

-                        else

-                        {

-                            lr.SetColors(Color.red, Color.red);

-                            lr.SetPosition(0, startPart.transform.TransformPoint(startOffset));

-                            lr.SetPosition(1, ray.GetPoint(10));

-                        }

-                    }

-                }

-                else

-                {

-                    lr.SetPosition(0, Vector3.zero);

-                    lr.SetPosition(1, Vector3.zero);

-                }

-

-                if (Deleting)

-                {

-                    RaycastHit info = new RaycastHit();

-                    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

-                    bool hit = Physics.Raycast(ray, out info, Mathf.Infinity);

-

-                    CoreStrut closest = null;

-                    float closestDist = Mathf.Infinity;

-                    foreach (CoreStrut strut in struts)

-                    {

-                        strut.Selected = false;

-                        if (hit)

-                        {

-                            Vector3 start = strut.parent.transform.TransformPoint(strut.parentOffset);

-                            float d = Vector3.Distance(start, info.point);

-

-                            if (d < 0.05 && d < closestDist)

-                            {

-                                closest = strut;

-                                closestDist = d;

-                            }

-                        }

-                    }

-

-                    if(closest != null)

-                        closest.Selected = true;

-

-                    if (Input.GetMouseButtonUp(0))

-                    {

-                        if (closest != null)

-                        {

-                            closest.Destroy();

-                            struts.Remove(closest);

-                        }

-                        Deleting = false;

-                    }

-                }

-            }

-            else

-            {

-                DestroyLaser();

-            }

-

-            foreach (CoreStrut s in struts.ToArray())

-            {

-                if (IsEnabled)

-                {

-                    if (s.Active)

-                    {

-                        if (PowerConsumption == 0 || (GetEnergy() > PowerConsumption * TimeWarp.fixedDeltaTime && part.RequestResource("ElectricCharge", PowerConsumption * TimeWarp.fixedDeltaTime) > 0))

-                        {

-                            s.Active = true;

-                        }

-                        else

-                        {

-                            s.Active = false;

-                        }

-                    }

-                    else

-                    {

-                        if (GetEnergy() > 5 * TimeWarp.fixedDeltaTime && part.RequestResource("ElectricCharge", 5 * TimeWarp.fixedDeltaTime) > 0)

-                        {

-                            s.Active = true;

-                        }

-                    }

-                }

-                else

-                {

-                    s.Active = false;

-                }

-

-                s.Update();

-                if (s.isDestroyed)

-                    struts.Remove(s);

-            }

-            base.OnUpdate();

-        }

-    }

-}

 

--- /dev/null
+++ b/QuantumStrutsContinued.csproj
@@ -1,1 +1,147 @@
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug_win</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D6EC2150-27A5-4CB2-ACF9-C53FF7754A77}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>QuantumStrutsContinued</RootNamespace>
+    <AssemblyName>QuantumStrutsContinued</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <UseMSBuildEngine>False</UseMSBuildEngine>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_win|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <PlatformTarget>x86</PlatformTarget>
+    <ConsolePause>false</ConsolePause>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ${ProjectDir}\GameData\QuantumStrutsContinued\Plugins\" />
+      </CustomCommands>
+    </CustomCommands>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_win|AnyCPU' ">
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <PlatformTarget>x86</PlatformTarget>
+    <ConsolePause>false</ConsolePause>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ${ProjectDir}\GameData\QuantumStrutsContinued\Plugins\" />
+      </CustomCommands>
+    </CustomCommands>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_linux|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+    <PlatformTarget>x86</PlatformTarget>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="AfterBuild" command="cp -af ${TargetFile} ${ProjectDir}/GameData/QuantumStrutsContinued/Plugins/" />
+      </CustomCommands>
+    </CustomCommands>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_linux|AnyCPU' ">
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="AfterBuild" command="cp -af ${TargetFile} ${ProjectDir}/GameData/QuantumStrutsContinued/Plugins/" />
+      </CustomCommands>
+    </CustomCommands>
+    <ConsolePause>false</ConsolePause>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <Compile Include="QuantumStrut.cs" />
+    <Compile Include="Strut.cs" />
+    <Compile Include="Util.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="..\ToadicusTools\Extensions\ComponentExtensions.cs">
+      <Link>ToadicusTools\ComponentExtensions.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\Text\Extensions.cs">
+      <Link>ToadicusTools\Extensions.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\Logging.cs">
+      <Link>ToadicusTools\Logging.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\MathTools.cs">
+      <Link>ToadicusTools\MathTools.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\MuMechTools\MuMech_Tools.cs">
+      <Link>ToadicusTools\MuMech_Tools.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\Extensions\PartExtensions.cs">
+      <Link>ToadicusTools\PartExtensions.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\Debug\PooledDebugLogger.cs">
+      <Link>ToadicusTools\PooledDebugLogger.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\APIHelpers\PooledObject.cs">
+      <Link>ToadicusTools\PooledObject.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\Text\PooledStringBuilder.cs">
+      <Link>ToadicusTools\PooledStringBuilder.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\Text\SIFormatProvider.cs">
+      <Link>ToadicusTools\SIFormatProvider.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\Text\TextTools.cs">
+      <Link>ToadicusTools\TextTools.cs</Link>
+    </Compile>
+    <Compile Include="..\ToadicusTools\Enums.cs">
+      <Link>ToadicusTools\Enums.cs</Link>
+    </Compile>
+  </ItemGroup>
+  <ProjectExtensions>
+    <MonoDevelop>
+      <Properties>
+        <Policies>
+          <StandardHeader Text="${ProjectName}&#xD;&#xA;&#xD;&#xA;${FileName}&#xD;&#xA;&#xD;&#xA;Copyright © ${Year}, ${AuthorName}&#xD;&#xA;All rights reserved.&#xD;&#xA;&#xD;&#xA;Redistribution and use in source and binary forms, with or without modification,&#xD;&#xA;are permitted provided that the following conditions are met:&#xD;&#xA;&#xD;&#xA;1. Redistributions of source code must retain the above copyright notice,&#xD;&#xA;   this list of conditions and the following disclaimer.&#xD;&#xA;&#xD;&#xA;2. Redistributions in binary form must reproduce the above copyright notice,&#xD;&#xA;   this list of conditions and the following disclaimer in the documentation and/or other&#xD;&#xA;   materials provided with the distribution.&#xD;&#xA;&#xD;&#xA;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,&#xD;&#xA;INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE&#xD;&#xA;DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,&#xD;&#xA;SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR&#xD;&#xA;SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,&#xD;&#xA;WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&#xD;&#xA;OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." IncludeInNewFiles="True" />
+        </Policies>
+      </Properties>
+    </MonoDevelop>
+  </ProjectExtensions>
+  <ItemGroup>
+    <Reference Include="Assembly-CSharp">
+      <HintPath>..\_KSPAssemblies\Assembly-CSharp.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System">
+      <HintPath>..\_KSPAssemblies\System.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="UnityEngine">
+      <HintPath>..\_KSPAssemblies\UnityEngine.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="GameData\QuantumStrutsContinued\Parts\QuantumStruts\quantumStrut\part.cfg" />
+    <None Include="GameData\QuantumStrutsContinued\Parts\QuantumStruts\strutGun\part.cfg" />
+    <None Include="GameData\QuantumStrutsContinued\LICENSE" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="ToadicusTools\" />
+  </ItemGroup>
+</Project>

file:a/Strut.cs -> file:b/Strut.cs
--- a/Strut.cs
+++ b/Strut.cs
@@ -1,197 +1,230 @@
-using System;

-using System.Collections.Generic;

-using System.Linq;

-using System.Text;

-using System.Threading.Tasks;

-using UnityEngine;

-

-namespace QuantumStrut

-{

-    class Strut

-    {

-        public bool isDestroyed = false;

-

-        Material _material = null;

-        public Material Material

-        {

-            set

-            {

-                _material = value;

-                if(Material!=null)

-                    lr.material = Material;

-            }

-            get

-            {

-                return _material;

-            }

-        }

-

-        Color _startColor = Color.white;

-        public Color StartColor

-        {

-            set

-            {

-                _startColor = value;

-                if (StartColor != null && EndColor != null)

-                    lr.SetColors(StartColor, EndColor);

-            }

-            get

-            {

-                return _startColor;

-            }

-        }

-

-        Color _endColor = Color.white;

-        public Color EndColor

-        {

-            set

-            {

-                _endColor = value;

-                if (StartColor != null && EndColor != null)

-                    lr.SetColors(StartColor, EndColor);

-            }

-            get

-            {

-                return _endColor;

-            }

-        }

-

-        float _startSize = 0;

-        public float StartSize

-        {

-            set

-            {

-                _startSize = value;

-                lr.SetWidth(StartSize, EndSize);

-            }

-            get

-            {

-                return _startSize;

-            }

-        }

-

-        float _endSize = 0;

-        public float EndSize

-        {

-            set

-            {

-                _endSize = value;

-                lr.SetWidth(StartSize, EndSize);

-            }

-            get

-            {

-                return _endSize;

-            }

-        }

-

-        ConfigurableJoint joint;

-

-        Transform parentTransform = null;

-        Part parent = null;

-        Part target = null;

-        Vector3 targetOffset = Vector3.zero;

-

-        GameObject LineObj = null;

-        LineRenderer lr = null;

-

-        public void print(object body, params object[] args)

-        {

-            string final = body.ToString();

-            for (int I = 0; I < args.Length; I++)

-            {

-                final = final.Replace("{" + I + "}", args[I].ToString());

-            }

-            MonoBehaviour.print("[AutoStrut] " + final);

-        }

-

-        void DrawLine(Vector3 origin, Vector3 end)

-        {

-            if (Util.isValid(lr))

-            {

-                lr.SetPosition(0, origin);

-                lr.SetPosition(1, end);

-            }

-        }

-

-        public Strut(Part parent, Part target, Vector3 targetOffset, Transform parentTransform)

-        {

-            this.parent = parent;

-            this.target = target;

-            this.targetOffset = targetOffset;

-            this.parentTransform = parentTransform;

-

-            if (parent.vessel.parts.Contains(target))

-            {

-                joint = parent.parent.gameObject.AddComponent<ConfigurableJoint>();

-                joint.connectedBody = target.rigidbody;

-

-                joint.anchor = new Vector3(0, 0, Vector3.Distance(parentTransform.position, target.transform.TransformPoint(targetOffset)) / 2);

-                joint.axis = new Vector3(0, 0, 1);

-                joint.xMotion = ConfigurableJointMotion.Locked;

-                joint.yMotion = ConfigurableJointMotion.Locked;

-                joint.zMotion = ConfigurableJointMotion.Locked;

-                joint.angularXMotion = ConfigurableJointMotion.Locked;

-                joint.angularYMotion = ConfigurableJointMotion.Locked;

-                joint.angularZMotion = ConfigurableJointMotion.Locked;

-

-                LineObj = new GameObject();

-                LineObj.name = "quantumstrut";

-

-                lr = LineObj.AddComponent<LineRenderer>();

-                lr.useWorldSpace = true;

-

-                Material = QuantumStrut.LaserMaterial;

-                StartColor = Color.white;

-                EndColor = Color.white;

-                StartSize = 0.03f;

-                EndSize = 0.0075f;

-

-                lr.SetVertexCount(2);

-                lr.SetPosition(0, Vector3.zero);

-                lr.SetPosition(1, Vector3.zero);

-            }

-            else

-            {

-                Destroy();

-            }

-        }

-

-        public void Update()

-        {

-            if (Util.isValid(parent) && Util.isValid(target) && Util.isValid(parent.vessel) && parent.vessel.parts.Contains(target))

-            {

-                Vector3 start = parentTransform.position;

-                Vector3 end = target.transform.TransformPoint(targetOffset);

-                DrawLine(start, end);

-            }

-            else

-            {

-                DrawLine(Vector3.zero, Vector3.zero);

-                Destroy();

-            }

-        }

-

-        public void Destroy()

-        {

-            DrawLine(Vector3.zero, Vector3.zero);

-            if (Util.isValid(joint))

-                GameObject.DestroyImmediate(joint);

-

-            if (Util.isValid(lr))

-                GameObject.DestroyImmediate(lr);

-

-            if (Util.isValid(LineObj))

-                GameObject.DestroyImmediate(LineObj);

-

-            joint = null;

-            LineObj = null;

-            lr = null;

-

-            parentTransform = null;

-            parent = null;

-            target = null;

-            targetOffset = Vector3.zero;

-            isDestroyed = true;

-        }

-    }

+// QuantumStrutsContinued
+//
+// Strut.cs
+// 
+// Continued from QuantumStruts by BoJaN.  Used by permission.
+//
+// ModuleManager patches © 2014 K3|Chris.  Used by permission.
+//
+// Copyright © 2014, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using KSP;
+using System;
+using UnityEngine;
+
+namespace QuantumStrut
+{
+	class Strut
+	{
+		public bool isDestroyed = false;
+		Material _material = null;
+
+		public Material Material
+		{
+			set
+			{
+				_material = value;
+				if (Material != null)
+					lr.material = Material;
+			}
+			get
+			{
+				return _material;
+			}
+		}
+
+		Color _startColor = Color.white;
+
+		public Color StartColor
+		{
+			set
+			{
+				_startColor = value;
+				lr.SetColors(StartColor, EndColor);
+			}
+			get
+			{
+				return _startColor;
+			}
+		}
+
+		Color _endColor = Color.white;
+
+		public Color EndColor
+		{
+			set
+			{
+				_endColor = value;
+				lr.SetColors(StartColor, EndColor);
+			}
+			get
+			{
+				return _endColor;
+			}
+		}
+
+		float _startSize = 0;
+
+		public float StartSize
+		{
+			set
+			{
+				_startSize = value;
+				lr.SetWidth(StartSize, EndSize);
+			}
+			get
+			{
+				return _startSize;
+			}
+		}
+
+		float _endSize = 0;
+
+		public float EndSize
+		{
+			set
+			{
+				_endSize = value;
+				lr.SetWidth(StartSize, EndSize);
+			}
+			get
+			{
+				return _endSize;
+			}
+		}
+
+		ConfigurableJoint joint;
+		Transform parentTransform = null;
+		Part parent = null;
+		Part target = null;
+		Vector3 targetOffset = Vector3.zero;
+		GameObject LineObj = null;
+		LineRenderer lr = null;
+
+		public void print(object body, params object[] args)
+		{
+			string final = body.ToString();
+			for (int I = 0; I < args.Length; I++)
+			{
+				final = final.Replace("{" + I + "}", args[I].ToString());
+			}
+			MonoBehaviour.print("[AutoStrut] " + final);
+		}
+
+		void DrawLine(Vector3 origin, Vector3 end)
+		{
+			if (Util.isValid(lr))
+			{
+				lr.SetPosition(0, origin);
+				lr.SetPosition(1, end);
+			}
+		}
+
+		public Strut(Part parent, Part target, Vector3 targetOffset, Transform parentTransform)
+		{
+			this.parent = parent;
+			this.target = target;
+			this.targetOffset = targetOffset;
+			this.parentTransform = parentTransform;
+
+			if (parent.vessel.parts.Contains(target))
+			{
+				joint = parent.parent.gameObject.AddComponent<ConfigurableJoint>();
+				joint.connectedBody = target.rigidbody;
+
+				joint.anchor = new Vector3(
+					0,
+					0,
+					Vector3.Distance(
+						parentTransform.position,
+						target.transform.TransformPoint(targetOffset)
+					) / 2
+				);
+				joint.axis = new Vector3(0, 0, 1);
+				joint.xMotion = ConfigurableJointMotion.Locked;
+				joint.yMotion = ConfigurableJointMotion.Locked;
+				joint.zMotion = ConfigurableJointMotion.Locked;
+				joint.angularXMotion = ConfigurableJointMotion.Locked;
+				joint.angularYMotion = ConfigurableJointMotion.Locked;
+				joint.angularZMotion = ConfigurableJointMotion.Locked;
+
+				LineObj = new GameObject();
+				LineObj.name = "quantumstrut";
+
+				lr = LineObj.AddComponent<LineRenderer>();
+				lr.useWorldSpace = true;
+
+				Material = QuantumStrut.LaserMaterial;
+				StartColor = Color.white;
+				EndColor = Color.white;
+				StartSize = 0.03f;
+				EndSize = 0.0075f;
+
+				lr.SetVertexCount(2);
+				lr.SetPosition(0, Vector3.zero);
+				lr.SetPosition(1, Vector3.zero);
+			}
+			else
+			{
+				Destroy();
+			}
+		}
+
+		public void Update()
+		{
+			if (Util.isValid(parent) && Util.isValid(target) && Util.isValid(parent.vessel) && parent.vessel.parts.Contains(target))
+			{
+				Vector3 start = parentTransform.position;
+				Vector3 end = target.transform.TransformPoint(targetOffset);
+				DrawLine(start, end);
+			}
+			else
+			{
+				DrawLine(Vector3.zero, Vector3.zero);
+				Destroy();
+			}
+		}
+
+		public void Destroy()
+		{
+			DrawLine(Vector3.zero, Vector3.zero);
+			if (Util.isValid(joint))
+				GameObject.DestroyImmediate(joint);
+
+			if (Util.isValid(lr))
+				GameObject.DestroyImmediate(lr);
+
+			if (Util.isValid(LineObj))
+				GameObject.DestroyImmediate(LineObj);
+
+			joint = null;
+			LineObj = null;
+			lr = null;
+
+			parentTransform = null;
+			parent = null;
+			target = null;
+			targetOffset = Vector3.zero;
+			isDestroyed = true;
+		}
+	}
 }

file:a/Util.cs -> file:b/Util.cs
--- a/Util.cs
+++ b/Util.cs
@@ -1,132 +1,155 @@
-using System;

-using System.Collections.Generic;

-using System.ComponentModel;

-using System.Linq;

-using System.Text;

-using System.Threading.Tasks;

-using KSP.IO;

-using UnityEngine;

-

-namespace QuantumStrut

-{

-    public static class Util

-    {

-        static System.Random r = new System.Random();

-

-        public static float Random(float min, float max)

-        {

-            return (float)((r.NextDouble() * (max - min)) + min);

-        }

-

-        public static float Random()

-        {

-            return (float)r.NextDouble();

-        }

-

-        public static Part getTank(Part parent)

-        {

-            if (parent.Resources.Count != 0)

-                return parent;

-

-            if (isValid(parent.parent) && parent.fuelCrossFeed)

-                return getTank(parent.parent);

-

-            return null;

-        }

-

-        public static Vessel Kerbal

-        {

-            get

-            {

-                if (isValid(FlightGlobals.fetch.activeVessel) && FlightGlobals.fetch.activeVessel.isEVA)

-                    return FlightGlobals.fetch.activeVessel;

-                return null;

-            }

-        }

-

-        public static bool isValid(UnityEngine.Object obj)

-        {

-            return (obj && obj != null);

-        }

-

-        public static void printObj(object obj)

-        {

-            using (KSP.IO.TextWriter writer = TextWriter.CreateForType<string>("obj.cs"))

-            {

-                string str = printProperties(obj, TypeDescriptor.GetProperties(obj), 0);

-                writer.Write(str);

-                MonoBehaviour.print(str);

-            }

-        }

-

-        static string printProperties(object obj, PropertyDescriptorCollection collection, int I)

-        {

-            if (I > 2) return "";

-

-            string prefix = "";

-            string str = "";

-            for (int T = 0; T < I; T++)

-            {

-                prefix += "    ";

-            }

-

-            foreach (PropertyDescriptor d in collection)

-            {

-                str += "\n" + prefix + d.Name + " = " + d.GetValue(obj);

-            }

-            return str;

-        }

-

-        public static Part partFromGameObject(GameObject ob)

-        {

-            GameObject o = ob;

-

-            while (o)

-            {

-                Part p = Part.FromGO(o);

-                if (p && p != null)

-                {

-                    return p;

-                }

-

-                if (o.transform.parent)

-                    o = o.transform.parent.gameObject;

-                else

-                    return null;

-            }

-            return null;

-        }

-

-        public static Part partFromRaycast(RaycastHit hit)

-        {

-            return partFromGameObject(hit.collider.gameObject);

-        }

-

-        public static Part partFromId(Vessel vessel, long id)

-        {

-            Console.WriteLine("Vessel Parts: " + vessel.Parts.Count);

-            foreach (Part p in vessel.Parts)

-            {

-                MonoBehaviour.print(p.uid + " ?= " + id + ": " + (p.uid == id));

-                if (p.uid == id)

-                    return p;

-            }

-            return null;

-        }

-

-        public static float GetEnergy(Vessel vessel)

-        {

-            double energy = 0;

-            foreach (Part p in vessel.parts)

-            {

-                foreach (PartResource r in p.Resources)

-                {

-                    if (r.resourceName == "ElectricCharge")

-                        energy += r.amount;

-                }

-            }

-            return (float)energy;

-        }

-    }

-}

+// QuantumStrutsContinued
+//
+// Util.cs
+// 
+// Continued from QuantumStruts by BoJaN.  Used by permission.
+//
+// ModuleManager patches © 2014 K3|Chris.  Used by permission.
+//
+// Copyright © 2014, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+using KSP.IO;
+using System;
+using System.ComponentModel;
+using UnityEngine;
+
+namespace QuantumStrut
+{
+	public static class Util
+	{
+		static System.Random r = new System.Random();
+
+		public static float Random(float min, float max)
+		{
+			return (float)((r.NextDouble() * (max - min)) + min);
+		}
+
+		public static float Random()
+		{
+			return (float)r.NextDouble();
+		}
+
+		public static Part getTank(Part parent)
+		{
+			if (parent.Resources.Count != 0)
+				return parent;
+
+			if (isValid(parent.parent) && parent.fuelCrossFeed)
+				return getTank(parent.parent);
+
+			return null;
+		}
+
+		public static Vessel Kerbal
+		{
+			get
+			{
+				if (isValid(FlightGlobals.fetch.activeVessel) && FlightGlobals.fetch.activeVessel.isEVA)
+					return FlightGlobals.fetch.activeVessel;
+				return null;
+			}
+		}
+
+		public static bool isValid(UnityEngine.Object obj)
+		{
+			return (obj && obj != null);
+		}
+
+		public static void printObj(object obj)
+		{
+			using (KSP.IO.TextWriter writer = TextWriter.CreateForType<string>("obj.cs"))
+			{
+				string str = printProperties(obj, TypeDescriptor.GetProperties(obj), 0);
+				writer.Write(str);
+				MonoBehaviour.print(str);
+			}
+		}
+
+		static string printProperties(object obj, PropertyDescriptorCollection collection, int I)
+		{
+			if (I > 2)
+				return "";
+
+			string prefix = "";
+			string str = "";
+			for (int T = 0; T < I; T++)
+			{
+				prefix += "    ";
+			}
+
+			PropertyDescriptor d;
+			for (int i = 0; i < collection.Count; i++)
+			{
+				d = collection[i];
+
+				str += "\n" + prefix + d.Name + " = " + d.GetValue(obj);
+			}
+			return str;
+		}
+
+		public static Part partFromGameObject(GameObject ob)
+		{
+			GameObject o = ob;
+
+			while (o)
+			{
+				Part p = Part.FromGO(o);
+				if (p && p != null)
+				{
+					return p;
+				}
+
+				if (o.transform.parent)
+					o = o.transform.parent.gameObject;
+				else
+					return null;
+			}
+			return null;
+		}
+
+		public static Part partFromRaycast(RaycastHit hit)
+		{
+			return partFromGameObject(hit.collider.gameObject);
+		}
+
+		public static float GetEnergy(Vessel vessel)
+		{
+			double energy = 0;
+			Part p;
+			for (int pIdx = 0; pIdx < vessel.parts.Count; pIdx++)
+			{
+				p = vessel.parts[pIdx];
+
+				PartResource r;
+				for (int rIdx = 0; rIdx < p.Resources.Count; rIdx++)
+				{
+					r = p.Resources[rIdx];
+
+					if (r.resourceName == "ElectricCharge")
+						energy += r.amount;
+				}
+			}
+			return (float)energy;
+		}
+	}
+}
+

 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model.mu differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model000.dds differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model000.mbm differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model001.dds differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model001.mbm differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model.mu differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model000.dds differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model000.mbm differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model001.dds differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model001.mbm differ