Version 1.4 1.4
Version 1.4

file:a/CoreStrut.cs (deleted)
--- a/CoreStrut.cs
+++ /dev/null
@@ -1,226 +1,1 @@
-// QuantumStrutsContinued © 2014 toadicus
-//
-// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a
-// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
-//
-// Continued from QuantumStrut, © 2013 BoJaN.  Used with permission.
 
-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,84 @@
+// 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.0025
+
+		Start = 0,0,0
+		Dir = 0,1,0
+	}
+}

--- /dev/null
+++ b/GameData/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/part.cfg
@@ -1,1 +1,84 @@
+// 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
+	}
+}

 Binary files a/Parts/QuantumStruts/quantumStrut/model.mu and /dev/null differ
 Binary files a/Parts/QuantumStruts/quantumStrut/model000.mbm and /dev/null differ
 Binary files a/Parts/QuantumStruts/quantumStrut/model001.mbm and /dev/null differ
--- a/Parts/QuantumStruts/quantumStrut/part.cfg
+++ /dev/null
@@ -1,53 +1,1 @@
-PART

-{

-// --- general parameters ---

-name = QuantumStrut

-module = Part

-author = BoJaN

-

-// --- asset parameters ---

-mesh = model.mu

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

-cost = 1500

-category = Utility

-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.0025

-	

-	Start = 0,0,0

-	Dir = 0,1,0

-}

-}
+

 Binary files a/Parts/QuantumStruts/quantumStrutCore/model.mu and /dev/null differ
 Binary files a/Parts/QuantumStruts/quantumStrutCore/model000.mbm and /dev/null differ
 Binary files a/Parts/QuantumStruts/quantumStrutCore/model001.mbm and /dev/null differ
--- a/Parts/QuantumStruts/quantumStrutCore/part.cfg
+++ /dev/null
@@ -1,55 +1,1 @@
-PART

-{

-// --- general parameters ---

-name = quantumStrutCore

-module = Part

-author = BoJaN

-

-// --- asset parameters ---

-mesh = model.mu

-scale = 1

-rescaleFactor = 1

-iconCenter = 0, 3, 0

-

-// --- node definitions ---

-// definition format is Position X, Position Y, Position Z, Up X, Up Y, Up Z

-node_stack_top = 0, 0.1990267, 0, 0.0, 1.0, 0.0

-node_stack_bottom = 0, -0.1990267, 0, 0.0, 1.0, 0.0

-

-// --- FX definitions ---

-

-

-// --- editor parameters ---

-cost = 7500

-category = Utility

-subcategory = 0

-title = Quantum Core

-manufacturer = Bojantek Corporation

-description = A quantum core capable of sustaining a number of quantum struts.

-

-// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision

-attachRules = 1,0,1,1,0

-

-// --- standard part parameters ---

-mass = 0.1

-dragModelType = default

-maximum_drag = 0.2

-minimum_drag = 0.2

-angularDrag = 2

-crashTolerance = 9

-maxTemp = 3400

-

-MODULE

-{

-    name = QuantumStrutCore

-	IsEnabled = true

-	PowerConsumption = 0.012

-	MaxStruts = 8

-	

-	Material = Particles/Additive

-	StartColor = 57, 146, 181

-	EndColor = 11, 29, 36

-	StartSize = 0.03

-	EndSize = 0.0075

-}

-}
+

 Binary files a/Parts/QuantumStruts/strutGun/model.mu and /dev/null differ
 Binary files a/Parts/QuantumStruts/strutGun/model000.mbm and /dev/null differ
 Binary files a/Parts/QuantumStruts/strutGun/model001.mbm and /dev/null differ
--- a/Parts/QuantumStruts/strutGun/part.cfg
+++ /dev/null
@@ -1,53 +1,1 @@
-PART

-{

-// --- general parameters ---

-name = StrutGun

-module = Part

-author = BoJaN

-

-// --- asset parameters ---

-mesh = model.mu

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

-cost = 500

-category = Utility

-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.0075

-	

-	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,339 +1,398 @@
-// QuantumStrutsContinued © 2014 toadicus
-//
-// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a
-// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
-//
-// Continued from QuantumStrut, © 2013 BoJaN.  Used with permission.
-
+// 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.
+
+#define DEBUG
+
+using KSP;
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-//using System.Threading.Tasks;
+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.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);
-            }
-        }
-    }
+	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)
+		{
+			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, 10);
+
+				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, 10);
+					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 * 10));
+					}
+				}
+			}
+			else
+			{
+				DestroyLaser();
+				RenderingManager.RemoveFromPostDrawQueue(0, DrawBuildOverlay);
+			}
+		}
+	}
 }

file:a/QuantumStrutCore.cs (deleted)
--- a/QuantumStrutCore.cs
+++ /dev/null
@@ -1,481 +1,1 @@
-// QuantumStrutsContinued © 2014 toadicus
-//
-// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a
-// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
-//
-// Continued from QuantumStrut, © 2013 BoJaN.  Used with permission.
 
-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,204 +1,230 @@
-// QuantumStrutsContinued © 2014 toadicus
-//
-// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a
-// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
-//
-// Continued from QuantumStrut, © 2013 BoJaN.  Used with permission.
-
+// 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 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;
-        }
-    }
+	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,139 +1,155 @@
-// QuantumStrutsContinued © 2014 toadicus
+// QuantumStrutsContinued
 //
-// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a
-// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
+// Util.cs
+// 
+// Continued from QuantumStruts by BoJaN.  Used by permission.
 //
-// Continued from QuantumStrut, © 2013 BoJaN.  Used with 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.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 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(float min, float max)
+		{
+			return (float)((r.NextDouble() * (max - min)) + min);
+		}
 
-        public static float Random()
-        {
-            return (float)r.NextDouble();
-        }
+		public static float Random()
+		{
+			return (float)r.NextDouble();
+		}
 
-        public static Part getTank(Part parent)
-        {
-            if (parent.Resources.Count != 0)
-                return parent;
+		public static Part getTank(Part parent)
+		{
+			if (parent.Resources.Count != 0)
+				return parent;
 
-            if (isValid(parent.parent) && parent.fuelCrossFeed)
-                return getTank(parent.parent);
+			if (isValid(parent.parent) && parent.fuelCrossFeed)
+				return getTank(parent.parent);
 
-            return null;
-        }
+			return null;
+		}
 
-        public static Vessel Kerbal
-        {
-            get
-            {
-                if (isValid(FlightGlobals.fetch.activeVessel) && FlightGlobals.fetch.activeVessel.isEVA)
-                    return FlightGlobals.fetch.activeVessel;
-                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 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);
-            }
-        }
+		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 "";
+		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 += "    ";
-            }
+			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;
-        }
+			PropertyDescriptor d;
+			for (int i = 0; i < collection.Count; i++)
+			{
+				d = collection[i];
 
-        public static Part partFromGameObject(GameObject ob)
-        {
-            GameObject o = ob;
+				str += "\n" + prefix + d.Name + " = " + d.GetValue(obj);
+			}
+			return str;
+		}
 
-            while (o)
-            {
-                Part p = Part.FromGO(o);
-                if (p && p != null)
-                {
-                    return p;
-                }
+		public static Part partFromGameObject(GameObject ob)
+		{
+			GameObject o = ob;
 
-                if (o.transform.parent)
-                    o = o.transform.parent.gameObject;
-                else
-                    return null;
-            }
-            return null;
-        }
+			while (o)
+			{
+				Part p = Part.FromGO(o);
+				if (p && p != null)
+				{
+					return p;
+				}
 
-        public static Part partFromRaycast(RaycastHit hit)
-        {
-            return partFromGameObject(hit.collider.gameObject);
-        }
+				if (o.transform.parent)
+					o = o.transform.parent.gameObject;
+				else
+					return null;
+			}
+			return null;
+		}
 
-        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 Part partFromRaycast(RaycastHit hit)
+		{
+			return partFromGameObject(hit.collider.gameObject);
+		}
 
-        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;
-        }
-    }
+		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