Version 1.6
Version 1.6

file:b/.gitattributes (new)
--- /dev/null
+++ b/.gitattributes
@@ -1,1 +1,13 @@
+* text=auto
+* eol=lf
 
+# These files are text and should be normalized (convert crlf => lf)
+*.cs      text diff=csharp
+*.cfg     text
+*.csproj  text eol=crlf
+*.sln     text eol=crlf
+
+# Images should be treated as binary
+# (binary is a macro for -text -diff)
+*.png     binary
+

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

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

file:a/KASifyQSC.cfg (deleted)
--- a/KASifyQSC.cfg
+++ /dev/null
@@ -1,41 +1,1 @@
-// QuantumStrutsContinued
-// 
-// Continued from QuantumStruts by BoJaN.  Used by permission.
-//
-// ModuleManager patches © 2014 K3|Chris.  Used by permission.
-// 
-// Copyright © 2014, toadicus, K3|Chris
-// 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[*]:HAS[@MODULE[QuantumStrut]]
-{
-MODULE
-{
-	name = KASModuleGrab
-	evaPartPos = (0.0, 0.0, -0.15)
-	evaPartDir = (0,0,-1)
-	storable = true
-	storedSize = 2
-	attachOnPart = True
-	attachOnEva = False
-	attachOnStatic = False
-}
-}

 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,82 +1,1 @@
-// 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 ---

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

-TechRequired = advScienceTech

-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,82 +1,1 @@
-// 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 = 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,81 +1,1 @@
-// 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 ---

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

-TechRequired = advScienceTech

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

-	

-	Start = 0,0,0

-	Dir = 0,1,0

-}

-}
+

--- a/Properties/AssemblyInfo.cs
+++ b/Properties/AssemblyInfo.cs
@@ -57,5 +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.1.*")]
+[assembly: AssemblyVersion("1.6.*")]
 

--- a/QuantumStrut.cs
+++ b/QuantumStrut.cs
@@ -40,7 +40,6 @@
 		Strut strut = null;
 		GameObject lineObj;
 		LineRenderer lr;
-		bool Editor = false;
 		int I = 0;
 
 		#region Fields
@@ -64,7 +63,14 @@
 		[KSPField(isPersistant = false)]
 		public float StartSize = 0.03f;
 		[KSPField(isPersistant = false)]
-		public float EndSize = 0.0075f;
+		public float EndSize = 0.015f;
+
+		[KSPField(
+			isPersistant = false, guiActiveEditor = true,
+			guiName = "Max. Strut Length", guiUnits = "m", guiFormat = "F0"
+		)]
+		[UI_FloatRange(minValue = 2f, maxValue = 50f, stepIncrement = 2f)]
+		public float MaxStrutLength = 10f;
 
 		#endregion
 
@@ -176,32 +182,55 @@
 				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();
+			
+			switch (state)
+			{
+				case StartState.Editor:
+					InitLaser();
+					break;
+				case StartState.Docked:
+					CheckHit();
+					DestroyLaser();
+					break;
+				default:
+					DestroyLaser();
+					break;
 			}
 
 			base.OnStart(state);
 		}
 
+		public override bool IsStageable()
+		{
+			return false;
+		}
+
 		public void Update()
+		{
+			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();
+				}
+			}
+		}
+
+		public void FixedUpdate()
 		{
 			Events["ActivateStrut"].guiActiveEditor = Events["ActivateStrut"].active = !IsEnabled;
 			Events["DeactivateStrut"].guiActiveEditor = Events["DeactivateStrut"].active = IsEnabled;
@@ -210,17 +239,7 @@
 			{
 				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 (strut == null || strut.isDestroyed)
 				{
 					if ((I % 10) == 0)
 					{
@@ -240,53 +259,74 @@
 			base.OnUpdate();
 		}
 
+		public void OnGUI()
+		{
+			if (HighLogic.LoadedSceneIsEditor && Util.isValid(part))
+			{
+				this.DrawBuildOverlay();
+			}
+			else
+			{
+				DestroyLaser();
+			}
+		}
+
+		public void OnDestroy()
+		{
+			DestroyLaser();
+		}
+
 		void CheckHit()
 		{
 			if (HighLogic.LoadedSceneIsEditor)
 			{
-				Tools.PostDebugMessage(this, "Checking bailing out: in the editor!");
+				Logging.PostDebugMessage(this, "Checking bailing out: in the editor!");
 				return;
 			}
 
 			if (!isEnabled)
 			{
-				Tools.PostDebugMessage(this, "Destroying strut.");
+				Logging.PostDebugMessage(this, "Destroying strut.");
 
 				strut.Destroy();
 				strut = null;
 				return;
 			}
 
-			Tools.PostDebugMessage(this, "Checking for ray hit.");
-
-			Tools.PostDebugMessage(this, "Enabled, continuing.");
+			Logging.PostDebugMessage(this, "Checking for ray hit.");
+
+			Logging.PostDebugMessage(this, "Enabled, continuing.");
 
 			if (strut == null || strut.isDestroyed)
 			{
-				Tools.PostDebugMessage(this, "We have no strut, or the strut has been destroyed.");
+				Logging.PostDebugMessage(this, "strut is {0}", strut == null ? "null" : strut.isDestroyed.ToString());
 
 				Vector3 dir = getTransform().TransformDirection(Dir);
 				Vector3 start = getTransform().TransformPoint(Start);
 
-				Tools.PostDebugMessage(this, "Got transforms.  Checking for raycast hit.");
+				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);
+				bool hit = Physics.Raycast(new UnityEngine.Ray(start + (dir * 0.05f), dir), out info, MaxStrutLength);
 
 				if (hit)
 				{
-					Tools.PostDebugMessage(this, "Found raycast hit.  Fetching target part.");
+					Logging.PostDebugMessage(this, "Found raycast hit.  Fetching target part.");
 
 					Part targetPart = Util.partFromRaycast(info);
 
-					Tools.PostDebugMessage(this, "Found target part.");
+					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
 					)
 					{
-						Tools.PostDebugMessage(this, "Target part is in our vessel and we have the energy to continue.");
+						Logging.PostDebugMessage(this, "Target part is in our vessel and we have the energy to continue.");
 
 						strut = new Strut(
 							part,
@@ -295,7 +335,7 @@
 							getTransform()
 						);
 
-						Tools.PostDebugMessage(this, "Built a new strut, setting material, colors, and sizes.");
+						Logging.PostDebugMessage(this, "Built a new strut, setting material, colors, and sizes.");
 
 						strut.Material = material;
 						strut.StartColor = startColor;
@@ -303,7 +343,7 @@
 						strut.StartSize = StartSize;
 						strut.EndSize = EndSize;
 
-						Tools.PostDebugMessage(this, "Strut all done!");
+						Logging.PostDebugMessage(this, "Strut all done!");
 					}
 				}
 			}
@@ -316,7 +356,7 @@
 				lineObj = new GameObject();
 
 				lr = lineObj.AddComponent<LineRenderer>();
-				lr.useWorldSpace = true;
+				lr.useWorldSpace = false;
 
 				lr.material = material;
 				lr.SetColors(startColor, endColor);
@@ -325,7 +365,7 @@
 				lr.SetVertexCount(2);
 				lr.SetPosition(0, Vector3.zero);
 				lr.SetPosition(1, Vector3.zero);
-				lr.castShadows = false;
+				lr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
 				lr.receiveShadows = true;
 			}
 		}
@@ -341,44 +381,33 @@
 
 		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);
+			if (Util.isValid(lr))
+			{
+				Vector3 dir = getTransform().TransformDirection(Dir);
+				Vector3 start = getTransform().TransformPoint(Start);
+
+				UnityEngine.RaycastHit info = new RaycastHit();
+				bool hit = Physics.Raycast(new UnityEngine.Ray(start + (dir * 0.05f), dir), out info, MaxStrutLength);
+				if (hit && IsEnabled)
+				{
+					if (Util.isValid(material))
+						lr.material = material;
+
+					lr.SetColors(startColor, endColor);
+					lr.SetWidth(StartSize, EndSize);
+
+					lr.SetPosition(0, start);
+					lr.SetPosition(1, info.point);
+				}
+				else
+				{
+					lr.material = LaserMaterial;
+					lr.SetColors(Color.red, Color.red);
+					lr.SetWidth(0.01f, 0.01f);
+
+					lr.SetPosition(0, start);
+					lr.SetPosition(1, start + (dir * MaxStrutLength));
+				}
 			}
 		}
 	}

file:a/QuantumStrutCore.cs (deleted)
--- a/QuantumStrutCore.cs
+++ /dev/null
@@ -1,508 +1,1 @@
-// QuantumStrutsContinued
-//
-// QuantumStrutCore.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 KSP.IO;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using UnityEngine;
-
-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);
-		}
-
-		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();
-		}
-	}
-}
-

--- a/QuantumStrutsContinued.csproj
+++ b/QuantumStrutsContinued.csproj
@@ -24,7 +24,7 @@
     <ConsolePause>false</ConsolePause>
     <CustomCommands>
       <CustomCommands>
-        <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ..\..\..\Games\KSP_win\GameData\QuantumStrutsContinued\Plugins\" />
+        <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ${ProjectDir}\GameData\QuantumStrutsContinued\Plugins\" />
       </CustomCommands>
     </CustomCommands>
   </PropertyGroup>
@@ -37,7 +37,7 @@
     <ConsolePause>false</ConsolePause>
     <CustomCommands>
       <CustomCommands>
-        <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ..\..\..\Games\KSP_win\GameData\QuantumStrutsContinued\Plugins\" />
+        <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ${ProjectDir}\GameData\QuantumStrutsContinued\Plugins\" />
       </CustomCommands>
     </CustomCommands>
   </PropertyGroup>
@@ -53,7 +53,7 @@
     <PlatformTarget>x86</PlatformTarget>
     <CustomCommands>
       <CustomCommands>
-        <Command type="AfterBuild" command="cp -af ${TargetFile} /opt/games/KSP_linux/GameData/QuantumStrutsContinued/Plugins/" />
+        <Command type="AfterBuild" command="cp -af ${TargetFile} ${ProjectDir}/GameData/QuantumStrutsContinued/Plugins/" />
       </CustomCommands>
     </CustomCommands>
   </PropertyGroup>
@@ -64,8 +64,7 @@
     <WarningLevel>4</WarningLevel>
     <CustomCommands>
       <CustomCommands>
-        <Command type="AfterBuild" command="cp -af ${TargetFile} /opt/games/KSP_linux/GameData/QuantumStrutsContinued/Plugins/" />
-        <Command type="AfterBuild" command="cp -raf ${ProjectDir}/Parts ${ProjectDir}/KASifyQSC.cfg /opt/games/KSP_linux/GameData/QuantumStrutsContinued/" />
+        <Command type="AfterBuild" command="cp -af ${TargetFile} ${ProjectDir}/GameData/QuantumStrutsContinued/Plugins/" />
       </CustomCommands>
     </CustomCommands>
     <ConsolePause>false</ConsolePause>
@@ -73,14 +72,45 @@
   </PropertyGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
-    <Compile Include="CoreStrut.cs" />
     <Compile Include="QuantumStrut.cs" />
-    <Compile Include="QuantumStrutCore.cs" />
     <Compile Include="Strut.cs" />
     <Compile Include="Util.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="..\ToadicusTools\Tools.cs">
-      <Link>Tools.cs</Link>
+    <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>
@@ -105,5 +135,19 @@
       <HintPath>..\_KSPAssemblies\UnityEngine.dll</HintPath>
       <Private>False</Private>
     </Reference>
+    <Reference Include="KSPUtil">
+      <HintPath>..\_KSPAssemblies\KSPUtil.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine.UI">
+      <HintPath>..\_KSPAssemblies\UnityEngine.UI.dll</HintPath>
+    </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
@@ -149,7 +149,7 @@
 			if (parent.vessel.parts.Contains(target))
 			{
 				joint = parent.parent.gameObject.AddComponent<ConfigurableJoint>();
-				joint.connectedBody = target.rigidbody;
+				joint.connectedBody = target.Rigidbody;
 
 				joint.anchor = new Vector3(
 					0,
@@ -171,7 +171,7 @@
 				LineObj.name = "quantumstrut";
 
 				lr = LineObj.AddComponent<LineRenderer>();
-				lr.useWorldSpace = true;
+				lr.useWorldSpace = false;
 
 				Material = QuantumStrut.LaserMaterial;
 				StartColor = Color.white;

file:a/Util.cs -> file:b/Util.cs
--- a/Util.cs
+++ b/Util.cs
@@ -96,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;
@@ -131,10 +134,16 @@
 		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