A little post-pull cleanup.
A little post-pull cleanup.

file:a/CoreStrut.cs (deleted)
--- a/CoreStrut.cs
+++ /dev/null
@@ -1,231 +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 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;
-				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;
-		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,4 +1,33 @@
-using System.Reflection;
+// 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;
 
@@ -6,13 +35,9 @@
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
 [assembly: AssemblyTitle("QuantumStrutsContinued")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
+[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")]
-[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 
@@ -32,6 +57,5 @@
 // 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")]
+[assembly: AssemblyVersion("1.3.*")]
 

--- a/QuantumStrut.cs
+++ b/QuantumStrut.cs
@@ -1,14 +1,35 @@
-// 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.
+
+using KSP;
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using ToadicusTools;
 using UnityEngine;
 
 namespace QuantumStrut
@@ -59,33 +80,35 @@
 		[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();
-		}
-
-		[KSPAction("Deactivate")]
-		public void DeactivateStrut(KSPActionParam param)
+			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();
-		}
-
-		#endregion
-
-		#region Events
-
-		[KSPEvent(guiActive = true, guiName = "Activate", active = true, guiActiveUnfocused = true, unfocusedRange = 2f)]
-		public void ActivateStrut()
-		{
-			IsEnabled = true;
-			CheckHit();
-		}
-
-		[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
@@ -178,15 +201,10 @@
 			base.OnStart(state);
 		}
 
-		public override void OnFixedUpdate()
-		{
-			base.OnFixedUpdate();
-		}
-
-		public override void OnUpdate()
-		{
-			Events["ActivateStrut"].active = !IsEnabled;
-			Events["DeactivateStrut"].active = IsEnabled;
+		public void Update()
+		{
+			Events["ActivateStrut"].guiActiveEditor = Events["ActivateStrut"].active = !IsEnabled;
+			Events["DeactivateStrut"].guiActiveEditor = Events["DeactivateStrut"].active = IsEnabled;
 
 			if (IsEnabled)
 			{
@@ -224,37 +242,68 @@
 
 		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, "We have no strut, or the strut has been destroyed.");
+
 				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);
 
-					if (targetPart && vessel.parts.Contains(targetPart) && Util.GetEnergy(part.vessel) > 5 * TimeWarp.fixedDeltaTime)
+					Logging.PostDebugMessage(this, "Found target part.");
+
+					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!");
 					}
 				}
 			}
@@ -304,7 +353,7 @@
 
 					UnityEngine.RaycastHit info = new RaycastHit();
 					bool hit = Physics.Raycast(new UnityEngine.Ray(start + (dir * 0.05f), dir), out info, 10);
-					if (hit)
+					if (hit && IsEnabled)
 					{
 						if (Util.isValid(material))
 							lr.material = material;

file:a/QuantumStrutCore.cs (deleted)
--- a/QuantumStrutCore.cs
+++ /dev/null
@@ -1,499 +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 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.";
-		}
-
-		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;
-		}
-
-		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,14 +1,34 @@
-// 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 UnityEngine;
 
 namespace QuantumStrut

file:a/Util.cs -> file:b/Util.cs
--- a/Util.cs
+++ b/Util.cs
@@ -1,16 +1,35 @@
-// 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 KSP.IO;
 using UnityEngine;
 
 namespace QuantumStrut
@@ -77,8 +96,11 @@
 				prefix += "    ";
 			}
 
-			foreach (PropertyDescriptor d in collection)
+			PropertyDescriptor d;
+			for (int i = 0; i < collection.Count; i++)
 			{
+				d = collection[i];
+
 				str += "\n" + prefix + d.Name + " = " + d.GetValue(obj);
 			}
 			return str;
@@ -109,25 +131,19 @@
 			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)
+			Part p;
+			for (int pIdx = 0; pIdx < vessel.parts.Count; pIdx++)
 			{
-				foreach (PartResource r in p.Resources)
+				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;
 				}

 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