Relicensed.
Relicensed.

// QuantumStrutsContinued © 2014 toadicus // QuantumStrutsContinued
// //
// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a // CoreStrut.cs
// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ //
// // 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 System; using System;
using UnityEngine; using UnityEngine;
   
namespace QuantumStrut namespace QuantumStrut
{ {
class CoreStrut class CoreStrut
{ {
public bool isDestroyed = false; public bool isDestroyed = false;
Material _material = null; Material _material = null;
   
public Material Material public Material Material
{ {
set set
{ {
_material = value; _material = value;
if (Material != null) if (Material != null)
lr.material = Material; lr.material = Material;
} }
get get
{ {
return _material; return _material;
} }
} }
   
Color _startColor = Color.white; Color _startColor = Color.white;
   
public Color StartColor public Color StartColor
{ {
set set
{ {
_startColor = value; _startColor = value;
lr.SetColors(StartColor, EndColor); lr.SetColors(StartColor, EndColor);
} }
get get
{ {
return _startColor; return _startColor;
} }
} }
   
Color _endColor = Color.white; Color _endColor = Color.white;
   
public Color EndColor public Color EndColor
{ {
set set
{ {
_endColor = value; _endColor = value;
lr.SetColors(StartColor, EndColor); lr.SetColors(StartColor, EndColor);
} }
get get
{ {
return _endColor; return _endColor;
} }
} }
   
float _startSize = 0; float _startSize = 0;
   
public float StartSize public float StartSize
{ {
set set
{ {
_startSize = value; _startSize = value;
lr.SetWidth(StartSize, EndSize); lr.SetWidth(StartSize, EndSize);
} }
get get
{ {
return _startSize; return _startSize;
} }
} }
   
float _endSize = 0; float _endSize = 0;
   
public float EndSize public float EndSize
{ {
set set
{ {
_endSize = value; _endSize = value;
lr.SetWidth(StartSize, EndSize); lr.SetWidth(StartSize, EndSize);
} }
get get
{ {
return _endSize; return _endSize;
} }
} }
   
ConfigurableJoint joint; ConfigurableJoint joint;
public bool Active = true; public bool Active = true;
public bool Selected = false; public bool Selected = false;
public Part parent = null; public Part parent = null;
public Vector3 parentOffset = Vector3.zero; public Vector3 parentOffset = Vector3.zero;
public Part target = null; public Part target = null;
public Vector3 targetOffset = Vector3.zero; public Vector3 targetOffset = Vector3.zero;
GameObject LineObj; GameObject LineObj;
LineRenderer lr = null; LineRenderer lr = null;
   
public void print(object body, params object[] args) public void print(object body, params object[] args)
{ {
string final = body.ToString(); string final = body.ToString();
for (int I = 0; I < args.Length; I++) for (int I = 0; I < args.Length; I++)
{ {
final = final.Replace("{" + I + "}", args[I].ToString()); final = final.Replace("{" + I + "}", args[I].ToString());
} }
MonoBehaviour.print("[AutoStrut] " + final); MonoBehaviour.print("[AutoStrut] " + final);
} }
   
void DrawLine(Vector3 origin, Vector3 end) void DrawLine(Vector3 origin, Vector3 end)
{ {
if (Util.isValid(lr)) if (Util.isValid(lr))
{ {
lr.SetPosition(0, origin); lr.SetPosition(0, origin);
lr.SetPosition(1, end); lr.SetPosition(1, end);
} }
} }
   
void createJoint() void createJoint()
{ {
if (!Util.isValid(joint)) if (!Util.isValid(joint))
{ {
joint = parent.gameObject.AddComponent<ConfigurableJoint>(); joint = parent.gameObject.AddComponent<ConfigurableJoint>();
joint.connectedBody = target.rigidbody; joint.connectedBody = target.rigidbody;
   
joint.anchor = new Vector3( joint.anchor = new Vector3(
0, 0,
0, 0,
Vector3.Distance( Vector3.Distance(
parent.transform.TransformPoint(parentOffset), parent.transform.TransformPoint(parentOffset),
target.transform.TransformPoint(targetOffset) target.transform.TransformPoint(targetOffset)
) / 2 ) / 2
); );
joint.axis = new Vector3(0, 0, 1); joint.axis = new Vector3(0, 0, 1);
joint.xMotion = ConfigurableJointMotion.Locked; joint.xMotion = ConfigurableJointMotion.Locked;
joint.yMotion = ConfigurableJointMotion.Locked; joint.yMotion = ConfigurableJointMotion.Locked;
joint.zMotion = ConfigurableJointMotion.Locked; joint.zMotion = ConfigurableJointMotion.Locked;
joint.angularXMotion = ConfigurableJointMotion.Locked; joint.angularXMotion = ConfigurableJointMotion.Locked;
joint.angularYMotion = ConfigurableJointMotion.Locked; joint.angularYMotion = ConfigurableJointMotion.Locked;
joint.angularZMotion = ConfigurableJointMotion.Locked; joint.angularZMotion = ConfigurableJointMotion.Locked;
} }
} }
   
void deleteJoint() void deleteJoint()
{ {
if (Util.isValid(joint)) if (Util.isValid(joint))
GameObject.DestroyImmediate(joint); GameObject.DestroyImmediate(joint);
} }
   
public CoreStrut(Part parent, Vector3 parentOffset, Part target, Vector3 targetOffset) public CoreStrut(Part parent, Vector3 parentOffset, Part target, Vector3 targetOffset)
{ {
this.parent = parent; this.parent = parent;
this.parentOffset = parentOffset; this.parentOffset = parentOffset;
this.target = target; this.target = target;
this.targetOffset = targetOffset; this.targetOffset = targetOffset;
   
createJoint(); createJoint();
   
LineObj = new GameObject(); LineObj = new GameObject();
LineObj.name = "quantumstrut"; LineObj.name = "quantumstrut";
   
lr = LineObj.AddComponent<LineRenderer>(); lr = LineObj.AddComponent<LineRenderer>();
lr.useWorldSpace = true; lr.useWorldSpace = true;
   
Material = QuantumStrut.LaserMaterial; Material = QuantumStrut.LaserMaterial;
StartColor = Color.white; StartColor = Color.white;
EndColor = Color.white; EndColor = Color.white;
StartSize = 0.03f; StartSize = 0.03f;
EndSize = 0.0075f; EndSize = 0.0075f;
   
lr.SetVertexCount(2); lr.SetVertexCount(2);
lr.SetPosition(0, Vector3.zero); lr.SetPosition(0, Vector3.zero);
lr.SetPosition(1, Vector3.zero); lr.SetPosition(1, Vector3.zero);
} }
   
public void Update() public void Update()
{ {
if (Util.isValid(parent) && Util.isValid(target) && Util.isValid(parent.vessel) && parent.vessel.parts.Contains(target)) if (Util.isValid(parent) && Util.isValid(target) && Util.isValid(parent.vessel) && parent.vessel.parts.Contains(target))
{ {
if (Active) if (Active)
{ {
createJoint(); createJoint();
Vector3 start = parent.transform.TransformPoint(parentOffset); Vector3 start = parent.transform.TransformPoint(parentOffset);
Vector3 end = target.transform.TransformPoint(targetOffset); Vector3 end = target.transform.TransformPoint(targetOffset);
if (Selected) if (Selected)
lr.SetColors(Color.blue, Color.blue); lr.SetColors(Color.blue, Color.blue);
else else
lr.SetColors(StartColor, EndColor); lr.SetColors(StartColor, EndColor);
DrawLine(start, end); DrawLine(start, end);
} }
else else
{ {
deleteJoint(); deleteJoint();
DrawLine(Vector3.zero, Vector3.zero); DrawLine(Vector3.zero, Vector3.zero);
} }
} }
else else
{ {
DrawLine(Vector3.zero, Vector3.zero); DrawLine(Vector3.zero, Vector3.zero);
Destroy(); Destroy();
} }
} }
   
public void Destroy() public void Destroy()
{ {
DrawLine(Vector3.zero, Vector3.zero); DrawLine(Vector3.zero, Vector3.zero);
if (Util.isValid(joint)) if (Util.isValid(joint))
GameObject.DestroyImmediate(joint); GameObject.DestroyImmediate(joint);
   
if (Util.isValid(lr)) if (Util.isValid(lr))
GameObject.DestroyImmediate(lr); GameObject.DestroyImmediate(lr);
   
if (Util.isValid(LineObj)) if (Util.isValid(LineObj))
GameObject.DestroyImmediate(LineObj); GameObject.DestroyImmediate(LineObj);
   
joint = null; joint = null;
LineObj = null; LineObj = null;
lr = null; lr = null;
   
parent = null; parent = null;
target = null; target = null;
targetOffset = Vector3.zero; targetOffset = Vector3.zero;
isDestroyed = true; isDestroyed = true;
} }
} }
} }
 Binary files a/Parts/QuantumStruts/quantumStrut/model.mu and b/Parts/QuantumStruts/quantumStrut/model.mu differ
 Binary files a/Parts/QuantumStruts/quantumStrut/model000.mbm and b/Parts/QuantumStruts/quantumStrut/model000.mbm differ
 Binary files a/Parts/QuantumStruts/quantumStrut/model001.mbm and b/Parts/QuantumStruts/quantumStrut/model001.mbm differ
  // 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 PART
{ {
// --- general parameters --- // --- general parameters ---
name = QuantumStrut name = QuantumStrut
module = Part module = Part
author = BoJaN author = BoJaN
// --- asset parameters --- // --- asset parameters ---
mesh = model.mu mesh = model.mu
rescaleFactor = 0.6 rescaleFactor = 0.6
// --- node definitions --- // --- node definitions ---
// definition format is Position X, Position Y, Position Z, Up X, Up Y, Up Z // 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 node_attach = 0.0, 0.0 , 0.0, 0.0, -1.0, 0.0
// --- editor parameters --- // --- editor parameters ---
  TechRequired = advScienceTech
cost = 1500 cost = 1500
category = Utility category = Utility
subcategory = 0 subcategory = 0
title = Quantum Strut title = Quantum Strut
manufacturer = Bojantek Corporation manufacturer = Bojantek Corporation
description = Highly experimental quantum struts harness a form of quantum locking to add support for docked vessels. description = Highly experimental quantum struts harness a form of quantum locking to add support for docked vessels.
// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision // attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
attachRules = 0,1,0,1,1 attachRules = 0,1,0,1,1
// --- standard part parameters --- // --- standard part parameters ---
mass = 0.05 mass = 0.05
dragModelType = default dragModelType = default
maximum_drag = 0.01 maximum_drag = 0.01
minimum_drag = 0.01 minimum_drag = 0.01
angularDrag = 0.1 angularDrag = 0.1
crashTolerance = 50 crashTolerance = 50
breakingForce = 50 breakingForce = 50
breakingTorque = 50 breakingTorque = 50
maxTemp = 3400 maxTemp = 3400
MODULE MODULE
{ {
name = QuantumStrut name = QuantumStrut
IsEnabled = true IsEnabled = true
PowerConsumption = 0.01 PowerConsumption = 0.01
Material = Particles/Additive Material = Particles/Additive
StartColor = 57, 146, 181 StartColor = 57, 146, 181
EndColor = 11, 29, 36 EndColor = 11, 29, 36
StartSize = 0.03 StartSize = 0.03
EndSize = 0.0025 EndSize = 0.0025
Start = 0,0,0 Start = 0,0,0
Dir = 0,1,0 Dir = 0,1,0
} }
   
} }
  // 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 PART
{ {
// --- general parameters --- // --- general parameters ---
name = quantumStrutCore name = quantumStrutCore
module = Part module = Part
author = BoJaN author = BoJaN
// --- asset parameters --- // --- asset parameters ---
mesh = model.mu mesh = model.mu
scale = 1 scale = 1
rescaleFactor = 1 rescaleFactor = 1
iconCenter = 0, 3, 0 iconCenter = 0, 3, 0
// --- node definitions --- // --- node definitions ---
// definition format is Position X, Position Y, Position Z, Up X, Up Y, Up Z // 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_top = 0, 0.1990267, 0, 0.0, 1.0, 0.0
node_stack_bottom = 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 --- // --- FX definitions ---
// --- editor parameters --- // --- editor parameters ---
cost = 7500 cost = 7500
category = Utility category = Utility
subcategory = 0 subcategory = 0
title = Quantum Core title = Quantum Core
manufacturer = Bojantek Corporation manufacturer = Bojantek Corporation
description = A quantum core capable of sustaining a number of quantum struts. description = A quantum core capable of sustaining a number of quantum struts.
// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision // attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
attachRules = 1,0,1,1,0 attachRules = 1,0,1,1,0
// --- standard part parameters --- // --- standard part parameters ---
mass = 0.1 mass = 0.1
dragModelType = default dragModelType = default
maximum_drag = 0.2 maximum_drag = 0.2
minimum_drag = 0.2 minimum_drag = 0.2
angularDrag = 2 angularDrag = 2
crashTolerance = 9 crashTolerance = 9
maxTemp = 3400 maxTemp = 3400
MODULE MODULE
{ {
name = QuantumStrutCore name = QuantumStrutCore
IsEnabled = true IsEnabled = true
PowerConsumption = 0.012 PowerConsumption = 0.012
MaxStruts = 8 MaxStruts = 8
Material = Particles/Additive Material = Particles/Additive
StartColor = 57, 146, 181 StartColor = 57, 146, 181
EndColor = 11, 29, 36 EndColor = 11, 29, 36
StartSize = 0.03 StartSize = 0.03
EndSize = 0.0075 EndSize = 0.0075
} }
} }
 Binary files a/Parts/QuantumStruts/strutGun/model.mu and b/Parts/QuantumStruts/strutGun/model.mu differ
 Binary files a/Parts/QuantumStruts/strutGun/model000.mbm and b/Parts/QuantumStruts/strutGun/model000.mbm differ
 Binary files a/Parts/QuantumStruts/strutGun/model001.mbm and b/Parts/QuantumStruts/strutGun/model001.mbm differ
  // 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 PART
{ {
// --- general parameters --- // --- general parameters ---
name = StrutGun name = StrutGun
module = Part module = Part
author = BoJaN author = BoJaN
// --- asset parameters --- // --- asset parameters ---
mesh = model.mu mesh = model.mu
rescaleFactor = 0.6 rescaleFactor = 0.6
// --- node definitions --- // --- node definitions ---
// definition format is Position X, Position Y, Position Z, Up X, Up Y, Up Z // 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 node_attach = 0.0, 0.0 , 0.0, 0.0, -1.0, 0.0
// --- editor parameters --- // --- editor parameters ---
  TechRequired = advScienceTech
cost = 500 cost = 500
category = Utility category = Utility
subcategory = 0 subcategory = 0
title = Strut Gun title = Strut Gun
manufacturer = Bojantek Corporation manufacturer = Bojantek Corporation
description = A radial strut gun for attaching and detatching struts when needed description = A radial strut gun for attaching and detatching struts when needed
// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision // attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
attachRules = 0,1,0,1,1 attachRules = 0,1,0,1,1
// --- standard part parameters --- // --- standard part parameters ---
mass = 0.05 mass = 0.05
dragModelType = default dragModelType = default
maximum_drag = 0.01 maximum_drag = 0.01
minimum_drag = 0.01 minimum_drag = 0.01
angularDrag = 0.1 angularDrag = 0.1
crashTolerance = 50 crashTolerance = 50
breakingForce = 50 breakingForce = 50
breakingTorque = 50 breakingTorque = 50
maxTemp = 3400 maxTemp = 3400
MODULE MODULE
{ {
name = QuantumStrut name = QuantumStrut
IsEnabled = true IsEnabled = true
PowerConsumption = 0.01 PowerConsumption = 0.01
Material = KSP/Sprite Material = KSP/Sprite
StartColor = 50, 50, 50 StartColor = 50, 50, 50
EndColor = 50, 50, 50 EndColor = 50, 50, 50
StartSize = 0.03 StartSize = 0.03
EndSize = 0.0075 EndSize = 0.03
Start = 0,0,0 Start = 0,0,0
Dir = 0,1,0 Dir = 0,1,0
} }
} }
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.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
   
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("QuantumStrutsContinued")] [assembly: AssemblyTitle("QuantumStrutsContinued")]
[assembly: AssemblyDescription("A KSP part mod that provides magical struts for rigidifying vessels constructed outside the VAB.")] [assembly: AssemblyDescription("A KSP part mod that provides magical struts for rigidifying vessels constructed outside the VAB.")]
[assembly: AssemblyProduct("QuantumStrutsContinued")] [assembly: AssemblyProduct("QuantumStrutsContinued")]
[assembly: AssemblyCopyright("Copyright © 2014 toadicus")] [assembly: AssemblyCopyright("Copyright © 2014 toadicus")]
   
// Setting ComVisible to false makes the types in this assembly not visible // 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 // to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type. // COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)] [assembly: ComVisible(false)]
   
// The following GUID is for the ID of the typelib if this project is exposed to COM // The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("57e209db-4b94-46b4-be0e-bd6e830d4eb5")] [assembly: Guid("57e209db-4b94-46b4-be0e-bd6e830d4eb5")]
   
// Version information for an assembly consists of the following four values: // Version information for an assembly consists of the following four values:
// //
// Major Version // Major Version
// Minor Version // Minor Version
// Build Number // Build Number
// Revision // Revision
// //
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.*")] [assembly: AssemblyVersion("1.1.*")]
   
// QuantumStrutsContinued © 2014 toadicus // QuantumStrutsContinued
// //
// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a // QuantumStrut.cs
// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ //
// // 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; using KSP;
using System; using System;
using ToadicusTools; using ToadicusTools;
using UnityEngine; using UnityEngine;
   
namespace QuantumStrut namespace QuantumStrut
{ {
public class QuantumStrut : PartModule public class QuantumStrut : PartModule
{ {
public static Material LaserMaterial; public static Material LaserMaterial;
Strut strut = null; Strut strut = null;
GameObject lineObj; GameObject lineObj;
LineRenderer lr; LineRenderer lr;
bool Editor = false; bool Editor = false;
int I = 0; int I = 0;
   
#region Fields #region Fields
   
[KSPField(isPersistant = true)] [KSPField(isPersistant = true)]
public bool IsEnabled = true; public bool IsEnabled = true;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public float PowerConsumption = 0; public float PowerConsumption = 0;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public string TransformName = ""; public string TransformName = "";
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public Vector3 Start = new Vector3(0, 0, 0); public Vector3 Start = new Vector3(0, 0, 0);
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public Vector3 Dir = new Vector3(0, 1, 0); public Vector3 Dir = new Vector3(0, 1, 0);
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public string Material = "Particles/Additive"; public string Material = "Particles/Additive";
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public Vector3 StartColor = Vector3.zero; public Vector3 StartColor = Vector3.zero;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public Vector3 EndColor = Vector3.zero; public Vector3 EndColor = Vector3.zero;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public float StartSize = 0.03f; public float StartSize = 0.03f;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public float EndSize = 0.0075f; public float EndSize = 0.0075f;
   
#endregion #endregion
   
#region Actions #region Actions
   
[KSPAction("Toggle")] [KSPAction("Toggle")]
public void ToggleStrut(KSPActionParam param) public void ToggleStrut(KSPActionParam param)
{ {
IsEnabled = !IsEnabled; IsEnabled = !IsEnabled;
CheckHit(); CheckHit();
} }
   
[KSPAction("Activate")] [KSPAction("Activate")]
public void ActivateStrut(KSPActionParam param) public void ActivateStrut(KSPActionParam param)
{ {
this.ActivateStrut(); this.ActivateStrut();
} }
   
[KSPAction("Deactivate")] [KSPAction("Deactivate")]
public void DeactivateStrut(KSPActionParam param) public void DeactivateStrut(KSPActionParam param)
{ {
this.DeactivateStrut(); this.DeactivateStrut();
} }
   
#endregion #endregion
   
#region Events #region Events
   
[KSPEvent(guiActive = true, guiName = "Activate", active = true, guiActiveUnfocused = true, unfocusedRange = 2f)] [KSPEvent(guiActive = true, guiName = "Activate", active = true, guiActiveUnfocused = true, unfocusedRange = 2f)]
public void ActivateStrut() public void ActivateStrut()
{ {
IsEnabled = true; IsEnabled = true;
CheckHit(); CheckHit();
this.Events["ActivateStrut"].guiActiveEditor = false; this.Events["ActivateStrut"].guiActiveEditor = false;
this.Events["DeactivateStrut"].guiActiveEditor = true; this.Events["DeactivateStrut"].guiActiveEditor = true;
} }
   
[KSPEvent(guiActive = true, guiName = "Deactivate", active = false, guiActiveUnfocused = true, unfocusedRange = 2f)] [KSPEvent(guiActive = true, guiName = "Deactivate", active = false, guiActiveUnfocused = true, unfocusedRange = 2f)]
public void DeactivateStrut() public void DeactivateStrut()
{ {
IsEnabled = false; IsEnabled = false;
CheckHit(); CheckHit();
this.Events["ActivateStrut"].guiActiveEditor = true; this.Events["ActivateStrut"].guiActiveEditor = true;
this.Events["DeactivateStrut"].guiActiveEditor = false; this.Events["DeactivateStrut"].guiActiveEditor = false;
} }
   
#endregion #endregion
   
public Material material = null; public Material material = null;
public Color startColor = Color.white; public Color startColor = Color.white;
public Color endColor = Color.white; public Color endColor = Color.white;
   
public Color Vector3toColor(Vector3 vec) public Color Vector3toColor(Vector3 vec)
{ {
return new Color(vec.x / 255, vec.y / 255, vec.z / 255); return new Color(vec.x / 255, vec.y / 255, vec.z / 255);
} }
   
Transform getTransform() Transform getTransform()
{ {
if (TransformName == "") if (TransformName == "")
return part.transform; return part.transform;
else else
return part.FindModelTransform(TransformName); return part.FindModelTransform(TransformName);
} }
   
public void print(object body, params object[] args) public void print(object body, params object[] args)
{ {
string final = body.ToString(); string final = body.ToString();
for (int I = 0; I < args.Length; I++) for (int I = 0; I < args.Length; I++)
{ {
final = final.Replace("{" + I + "}", args[I].ToString()); final = final.Replace("{" + I + "}", args[I].ToString());
} }
MonoBehaviour.print("[AutoStrut] " + final); MonoBehaviour.print("[AutoStrut] " + final);
} }
   
public override void OnLoad(ConfigNode node) public override void OnLoad(ConfigNode node)
{ {
base.OnLoad(node); base.OnLoad(node);
} }
   
public override void OnActive() public override void OnActive()
{ {
InitLaser(); InitLaser();
   
base.OnActive(); base.OnActive();
} }
   
public override void OnInactive() public override void OnInactive()
{ {
DestroyLaser(); DestroyLaser();
   
base.OnInactive(); base.OnInactive();
} }
   
public override string GetInfo() public override string GetInfo()
{ {
return "Requires:\n- ElectricCharge (" + PowerConsumption + "/s.)\n\n Costs 5 to create strut."; return "Requires:\n- ElectricCharge (" + PowerConsumption + "/s.)\n\n Costs 5 to create strut.";
} }
   
public override void OnStart(PartModule.StartState state) public override void OnStart(PartModule.StartState state)
{ {
try try
{ {
print("Material: {0}", Material); print("Material: {0}", Material);
material = new Material(Shader.Find(Material.Trim())); material = new Material(Shader.Find(Material.Trim()));
} }
catch catch
{ {
material = null; material = null;
} }
   
startColor = Vector3toColor(StartColor); startColor = Vector3toColor(StartColor);
endColor = Vector3toColor(EndColor); endColor = Vector3toColor(EndColor);
   
if (!Util.isValid(LaserMaterial)) if (!Util.isValid(LaserMaterial))
LaserMaterial = new Material(Shader.Find("Particles/Additive")); LaserMaterial = new Material(Shader.Find("Particles/Additive"));
   
if (state == StartState.Docked) if (state == StartState.Docked)
CheckHit(); CheckHit();
   
if (state == StartState.Editor) if (state == StartState.Editor)
{ {
Editor = true; Editor = true;
RenderingManager.AddToPostDrawQueue(0, DrawBuildOverlay); RenderingManager.AddToPostDrawQueue(0, DrawBuildOverlay);
InitLaser(); InitLaser();
} }
else else
{ {
Editor = false; Editor = false;
RenderingManager.RemoveFromPostDrawQueue(0, DrawBuildOverlay); RenderingManager.RemoveFromPostDrawQueue(0, DrawBuildOverlay);
DestroyLaser(); DestroyLaser();
} }
   
base.OnStart(state); base.OnStart(state);
} }
   
public void Update() public void Update()
{ {
Events["ActivateStrut"].guiActiveEditor = Events["ActivateStrut"].active = !IsEnabled; Events["ActivateStrut"].guiActiveEditor = Events["ActivateStrut"].active = !IsEnabled;
Events["DeactivateStrut"].guiActiveEditor = Events["DeactivateStrut"].active = IsEnabled; Events["DeactivateStrut"].guiActiveEditor = Events["DeactivateStrut"].active = IsEnabled;
   
if (IsEnabled) if (IsEnabled)
{ {
I = I + 1 % 255; I = I + 1 % 255;
   
if (strut != null && !strut.isDestroyed) if (strut != null && !strut.isDestroyed)
{ {
if (PowerConsumption == 0 || (Util.GetEnergy(part.vessel) > PowerConsumption * TimeWarp.fixedDeltaTime && part.RequestResource( if (PowerConsumption == 0 || (Util.GetEnergy(part.vessel) > PowerConsumption * TimeWarp.fixedDeltaTime && part.RequestResource(
"ElectricCharge", "ElectricCharge",
PowerConsumption * TimeWarp.fixedDeltaTime PowerConsumption * TimeWarp.fixedDeltaTime
) > 0)) ) > 0))
strut.Update(); strut.Update();
else else
strut.Destroy(); strut.Destroy();
} }
else else
{ {
if ((I % 10) == 0) if ((I % 10) == 0)
{ {
CheckHit(); CheckHit();
} }
} }
} }
else else
{ {
if (strut != null) if (strut != null)
{ {
strut.Destroy(); strut.Destroy();
strut = null; strut = null;
} }
} }
   
base.OnUpdate(); base.OnUpdate();
} }
   
void CheckHit() void CheckHit()
{ {
if (HighLogic.LoadedSceneIsEditor) if (HighLogic.LoadedSceneIsEditor)
{ {
Tools.PostDebugMessage(this, "Checking bailing out: in the editor!"); Tools.PostDebugMessage(this, "Checking bailing out: in the editor!");
return; return;
} }
   
if (!isEnabled) if (!isEnabled)
{ {
Tools.PostDebugMessage(this, "Destroying strut."); Tools.PostDebugMessage(this, "Destroying strut.");
   
strut.Destroy(); strut.Destroy();
strut = null; strut = null;
return; return;
} }
   
Tools.PostDebugMessage(this, "Checking for ray hit."); Tools.PostDebugMessage(this, "Checking for ray hit.");
   
Tools.PostDebugMessage(this, "Enabled, continuing."); Tools.PostDebugMessage(this, "Enabled, continuing.");
   
if (strut == null || strut.isDestroyed) if (strut == null || strut.isDestroyed)
{ {
Tools.PostDebugMessage(this, "We have no strut, or the strut has been destroyed."); Tools.PostDebugMessage(this, "We have no strut, or the strut has been destroyed.");
   
Vector3 dir = getTransform().TransformDirection(Dir); Vector3 dir = getTransform().TransformDirection(Dir);
Vector3 start = getTransform().TransformPoint(Start); Vector3 start = getTransform().TransformPoint(Start);
   
Tools.PostDebugMessage(this, "Got transforms. Checking for raycast hit."); Tools.PostDebugMessage(this, "Got transforms. Checking for raycast hit.");
   
UnityEngine.RaycastHit info = new RaycastHit(); 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, 10);
   
if (hit) if (hit)
{ {
Tools.PostDebugMessage(this, "Found raycast hit. Fetching target part."); Tools.PostDebugMessage(this, "Found raycast hit. Fetching target part.");
   
Part targetPart = Util.partFromRaycast(info); Part targetPart = Util.partFromRaycast(info);
   
Tools.PostDebugMessage(this, "Found target part."); Tools.PostDebugMessage(this, "Found target part.");
   
if ( if (
targetPart && vessel.parts.Contains(targetPart) && targetPart && vessel.parts.Contains(targetPart) &&
Util.GetEnergy(part.vessel) > 5 * TimeWarp.fixedDeltaTime Util.GetEnergy(part.vessel) > 5 * TimeWarp.fixedDeltaTime
) )
{ {
Tools.PostDebugMessage(this, "Target part is in our vessel and we have the energy to continue."); Tools.PostDebugMessage(this, "Target part is in our vessel and we have the energy to continue.");
   
strut = new Strut( strut = new Strut(
part, part,
targetPart, targetPart,
targetPart.transform.InverseTransformPoint(info.point), targetPart.transform.InverseTransformPoint(info.point),
getTransform() getTransform()
); );
   
Tools.PostDebugMessage(this, "Built a new strut, setting material, colors, and sizes."); Tools.PostDebugMessage(this, "Built a new strut, setting material, colors, and sizes.");
   
strut.Material = material; strut.Material = material;
strut.StartColor = startColor; strut.StartColor = startColor;
strut.EndColor = endColor; strut.EndColor = endColor;
strut.StartSize = StartSize; strut.StartSize = StartSize;
strut.EndSize = EndSize; strut.EndSize = EndSize;
   
Tools.PostDebugMessage(this, "Strut all done!"); Tools.PostDebugMessage(this, "Strut all done!");
} }
} }
} }
} }
   
void InitLaser() void InitLaser()
{ {
if (!Util.isValid(lr)) if (!Util.isValid(lr))
{ {
lineObj = new GameObject(); lineObj = new GameObject();
   
lr = lineObj.AddComponent<LineRenderer>(); lr = lineObj.AddComponent<LineRenderer>();
lr.useWorldSpace = true; lr.useWorldSpace = true;
   
lr.material = material; lr.material = material;
lr.SetColors(startColor, endColor); lr.SetColors(startColor, endColor);
lr.SetWidth(StartSize, EndSize); lr.SetWidth(StartSize, EndSize);
   
lr.SetVertexCount(2); lr.SetVertexCount(2);
lr.SetPosition(0, Vector3.zero); lr.SetPosition(0, Vector3.zero);
lr.SetPosition(1, Vector3.zero); lr.SetPosition(1, Vector3.zero);
lr.castShadows = false; lr.castShadows = false;
lr.receiveShadows = true; lr.receiveShadows = true;
} }
} }
   
void DestroyLaser() void DestroyLaser()
{ {
if (Util.isValid(lr)) if (Util.isValid(lr))
LineRenderer.DestroyImmediate(lr); LineRenderer.DestroyImmediate(lr);
   
if (Util.isValid(lineObj)) if (Util.isValid(lineObj))
GameObject.DestroyImmediate(lineObj); GameObject.DestroyImmediate(lineObj);
} }
   
public void DrawBuildOverlay() public void DrawBuildOverlay()
{ {
if (Util.isValid(part)) if (Util.isValid(part))
{ {
if (!Editor) if (!Editor)
return; return;
   
if (Util.isValid(lr)) if (Util.isValid(lr))
{ {
Vector3 dir = getTransform().TransformDirection(Dir); Vector3 dir = getTransform().TransformDirection(Dir);
Vector3 start = getTransform().TransformPoint(Start); Vector3 start = getTransform().TransformPoint(Start);
   
UnityEngine.RaycastHit info = new RaycastHit(); 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, 10);
if (hit && IsEnabled) if (hit && IsEnabled)
{ {
if (Util.isValid(material)) if (Util.isValid(material))
lr.material = material; lr.material = material;
   
lr.SetColors(startColor, endColor); lr.SetColors(startColor, endColor);
lr.SetWidth(StartSize, EndSize); lr.SetWidth(StartSize, EndSize);
   
lr.SetPosition(0, start); lr.SetPosition(0, start);
lr.SetPosition(1, info.point); lr.SetPosition(1, info.point);
} }
else else
{ {
lr.material = LaserMaterial; lr.material = LaserMaterial;
lr.SetColors(Color.red, Color.red); lr.SetColors(Color.red, Color.red);
lr.SetWidth(0.01f, 0.01f); lr.SetWidth(0.01f, 0.01f);
   
lr.SetPosition(0, start); lr.SetPosition(0, start);
lr.SetPosition(1, start + (dir * 10)); lr.SetPosition(1, start + (dir * 10));
} }
} }
} }
else else
{ {
DestroyLaser(); DestroyLaser();
RenderingManager.RemoveFromPostDrawQueue(0, DrawBuildOverlay); RenderingManager.RemoveFromPostDrawQueue(0, DrawBuildOverlay);
} }
} }
} }
} }
// QuantumStrutsContinued © 2014 toadicus // QuantumStrutsContinued
// //
// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a // QuantumStrutCore.cs
// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ //
// // 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; using KSP;
using KSP.IO; using KSP.IO;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using UnityEngine; using UnityEngine;
   
namespace QuantumStrut namespace QuantumStrut
{ {
class QuantumStrutCore : PartModule class QuantumStrutCore : PartModule
{ {
GameObject lineObj = null; GameObject lineObj = null;
LineRenderer lr = null; LineRenderer lr = null;
ConfigNode nodeToLoad = null; ConfigNode nodeToLoad = null;
bool Placing = false; bool Placing = false;
bool Deleting = false; bool Deleting = false;
List<CoreStrut> struts = new List<CoreStrut>(); List<CoreStrut> struts = new List<CoreStrut>();
Part startPart = null; Part startPart = null;
Vector3 startOffset = Vector3.zero; Vector3 startOffset = Vector3.zero;
Part endPart = null; Part endPart = null;
Vector3 endOffset = Vector3.zero; Vector3 endOffset = Vector3.zero;
public Material material = null; public Material material = null;
public Color startColor = Color.white; public Color startColor = Color.white;
public Color endColor = Color.white; public Color endColor = Color.white;
   
#region Fields #region Fields
   
[KSPField(isPersistant = true)] [KSPField(isPersistant = true)]
public bool IsEnabled = true; public bool IsEnabled = true;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public float PowerConsumption = 0; public float PowerConsumption = 0;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public int MaxStruts = 8; public int MaxStruts = 8;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public string Material = "Particles/Additive"; public string Material = "Particles/Additive";
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public Vector3 StartColor = Vector3.zero; public Vector3 StartColor = Vector3.zero;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public Vector3 EndColor = Vector3.zero; public Vector3 EndColor = Vector3.zero;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public float StartSize = 0.03f; public float StartSize = 0.03f;
[KSPField(isPersistant = false)] [KSPField(isPersistant = false)]
public float EndSize = 0.0075f; public float EndSize = 0.0075f;
   
#endregion #endregion
   
#region Actions #region Actions
   
[KSPAction("Toggle")] [KSPAction("Toggle")]
public void ToggleCore(KSPActionParam param) public void ToggleCore(KSPActionParam param)
{ {
IsEnabled = !IsEnabled; IsEnabled = !IsEnabled;
} }
   
[KSPAction("Activate")] [KSPAction("Activate")]
public void ActivateCore(KSPActionParam param) public void ActivateCore(KSPActionParam param)
{ {
IsEnabled = true; IsEnabled = true;
} }
   
[KSPAction("Deactivate")] [KSPAction("Deactivate")]
public void DeactivateCore(KSPActionParam param) public void DeactivateCore(KSPActionParam param)
{ {
IsEnabled = false; IsEnabled = false;
} }
   
#endregion #endregion
   
#region Events #region Events
   
[KSPEvent( [KSPEvent(
guiActive = true, guiActive = true,
guiName = "Place Strut", guiName = "Place Strut",
active = false, active = false,
externalToEVAOnly = true, externalToEVAOnly = true,
guiActiveUnfocused = true, guiActiveUnfocused = true,
unfocusedRange = 5 unfocusedRange = 5
)] )]
public void BeginPlace() public void BeginPlace()
{ {
startPart = null; startPart = null;
startOffset = Vector3.zero; startOffset = Vector3.zero;
endPart = null; endPart = null;
endOffset = Vector3.zero; endOffset = Vector3.zero;
Placing = true; Placing = true;
} }
   
[KSPEvent( [KSPEvent(
guiActive = true, guiActive = true,
guiName = "Remove Strut", guiName = "Remove Strut",
active = false, active = false,
externalToEVAOnly = true, externalToEVAOnly = true,
guiActiveUnfocused = true, guiActiveUnfocused = true,
unfocusedRange = 2500 unfocusedRange = 2500
)] )]
public void BeginDelete() public void BeginDelete()
{ {
Deleting = true; Deleting = true;
} }
   
[KSPEvent(guiActive = true, guiName = "Activate", active = true)] [KSPEvent(guiActive = true, guiName = "Activate", active = true)]
public void ActivateCore() public void ActivateCore()
{ {
IsEnabled = true; IsEnabled = true;
} }
   
[KSPEvent(guiActive = true, guiName = "Deactivate", active = false)] [KSPEvent(guiActive = true, guiName = "Deactivate", active = false)]
public void DeactivateCore() public void DeactivateCore()
{ {
IsEnabled = false; IsEnabled = false;
} }
   
#endregion #endregion
   
public Vector3 StringToVector3(string str) public Vector3 StringToVector3(string str)
{ {
string[] vals = str.Split(','); string[] vals = str.Split(',');
float x = (float)Convert.ToDecimal(vals[0]); float x = (float)Convert.ToDecimal(vals[0]);
float y = (float)Convert.ToDecimal(vals[1]); float y = (float)Convert.ToDecimal(vals[1]);
float z = (float)Convert.ToDecimal(vals[2]); float z = (float)Convert.ToDecimal(vals[2]);
return new Vector3(x, y, z); return new Vector3(x, y, z);
} }
   
public Color Vector3toColor(Vector3 vec) public Color Vector3toColor(Vector3 vec)
{ {
return new Color(vec.x / 255, vec.y / 255, vec.z / 255); return new Color(vec.x / 255, vec.y / 255, vec.z / 255);
} }
   
Part partFromGameObject(GameObject ob) Part partFromGameObject(GameObject ob)
{ {
GameObject o = ob; GameObject o = ob;
   
while (o) while (o)
{ {
Part p = Part.FromGO(o); Part p = Part.FromGO(o);
if (p && p != null) if (p && p != null)
{ {
return p; return p;
} }
   
if (o.transform.parent) if (o.transform.parent)
o = o.transform.parent.gameObject; o = o.transform.parent.gameObject;
else else
return null; return null;
} }
return null; return null;
} }
   
Part partFromRaycast(RaycastHit hit) Part partFromRaycast(RaycastHit hit)
{ {
return partFromGameObject(hit.collider.gameObject); return partFromGameObject(hit.collider.gameObject);
} }
   
Part partFromId(long id) Part partFromId(long id)
{ {
Console.WriteLine("Vessel Parts: " + part.vessel.Parts.Count); Console.WriteLine("Vessel Parts: " + part.vessel.Parts.Count);
foreach (Part p in part.vessel.Parts) foreach (Part p in part.vessel.Parts)
{ {
print(p.uid + " ?= " + id + ": " + (p.uid == id)); print(p.uid + " ?= " + id + ": " + (p.uid == id));
if (p.uid == id) if (p.uid == id)
return p; return p;
} }
return null; return null;
} }
   
bool isValid(UnityEngine.Object obj) bool isValid(UnityEngine.Object obj)
{ {
return (obj && obj != null); return (obj && obj != null);
} }
   
void InitLaser() void InitLaser()
{ {
if (!isValid(lr)) if (!isValid(lr))
{ {
lineObj = new GameObject(); lineObj = new GameObject();
   
lr = lineObj.AddComponent<LineRenderer>(); lr = lineObj.AddComponent<LineRenderer>();
lr.useWorldSpace = true; lr.useWorldSpace = true;
   
lr.material = new Material(Shader.Find("Particles/Additive")); lr.material = new Material(Shader.Find("Particles/Additive"));
lr.SetColors(Color.white, Color.white); lr.SetColors(Color.white, Color.white);
lr.SetWidth(0.03f, 0.03f); lr.SetWidth(0.03f, 0.03f);
   
lr.SetVertexCount(2); lr.SetVertexCount(2);
lr.SetPosition(0, Vector3.zero); lr.SetPosition(0, Vector3.zero);
lr.SetPosition(1, Vector3.zero); lr.SetPosition(1, Vector3.zero);
lr.castShadows = false; lr.castShadows = false;
lr.receiveShadows = true; lr.receiveShadows = true;
} }
} }
   
void DestroyLaser() void DestroyLaser()
{ {
if (isValid(lr)) if (isValid(lr))
LineRenderer.DestroyImmediate(lr); LineRenderer.DestroyImmediate(lr);
if (isValid(lineObj)) if (isValid(lineObj))
GameObject.DestroyImmediate(lineObj); GameObject.DestroyImmediate(lineObj);
} }
   
float GetEnergy() float GetEnergy()
{ {
double energy = 0; double energy = 0;
foreach (Part p in part.vessel.parts) foreach (Part p in part.vessel.parts)
{ {
foreach (PartResource r in p.Resources) foreach (PartResource r in p.Resources)
{ {
if (r.resourceName == "ElectricCharge") if (r.resourceName == "ElectricCharge")
energy += r.amount; energy += r.amount;
} }
} }
return (float)energy; return (float)energy;
} }
   
void AddStrut(Part a, Vector3 aO, Part b, Vector3 bO) void AddStrut(Part a, Vector3 aO, Part b, Vector3 bO)
{ {
CoreStrut s = new CoreStrut(a, aO, b, bO); CoreStrut s = new CoreStrut(a, aO, b, bO);
s.Material = material; s.Material = material;
s.StartColor = startColor; s.StartColor = startColor;
s.EndColor = endColor; s.EndColor = endColor;
s.StartSize = StartSize; s.StartSize = StartSize;
s.EndSize = EndSize; s.EndSize = EndSize;
struts.Add(s); struts.Add(s);
} }
   
public override string GetInfo() public override string GetInfo()
{ {
return "Max Struts: " + MaxStruts + "\nRequires:\n- ElectricCharge (" + PowerConsumption + "/s.)\n\n Energy cost is per-strut."; return "Max Struts: " + MaxStruts + "\nRequires:\n- ElectricCharge (" + PowerConsumption + "/s.)\n\n Energy cost is per-strut.";
} }
   
public override void OnStart(PartModule.StartState state) public override void OnStart(PartModule.StartState state)
{ {
try try
{ {
material = new Material(Shader.Find(Material.Trim())); material = new Material(Shader.Find(Material.Trim()));
} }
catch catch
{ {
material = null; material = null;
} }
   
startColor = Vector3toColor(StartColor); startColor = Vector3toColor(StartColor);
endColor = Vector3toColor(EndColor); endColor = Vector3toColor(EndColor);
base.OnStart(state); base.OnStart(state);
} }
   
public override void OnSave(ConfigNode node) public override void OnSave(ConfigNode node)
{ {
foreach (CoreStrut strut in struts) foreach (CoreStrut strut in struts)
{ {
if (!strut.isDestroyed) if (!strut.isDestroyed)
{ {
ConfigNode n = node.AddNode("QuantumStrut"); ConfigNode n = node.AddNode("QuantumStrut");
n.AddValue("parent", part.vessel.parts.IndexOf(strut.parent)); n.AddValue("parent", part.vessel.parts.IndexOf(strut.parent));
n.AddValue( n.AddValue(
"parentOffset", "parentOffset",
strut.parentOffset.x + "," + strut.parentOffset.y + "," + strut.parentOffset.z strut.parentOffset.x + "," + strut.parentOffset.y + "," + strut.parentOffset.z
); );
n.AddValue("target", part.vessel.parts.IndexOf(strut.target)); n.AddValue("target", part.vessel.parts.IndexOf(strut.target));
n.AddValue( n.AddValue(
"targetOffset", "targetOffset",
strut.targetOffset.x + "," + strut.targetOffset.y + "," + strut.targetOffset.z strut.targetOffset.x + "," + strut.targetOffset.y + "," + strut.targetOffset.z
); );
} }
} }
   
base.OnSave(node); base.OnSave(node);
} }
   
public override void OnLoad(ConfigNode node) public override void OnLoad(ConfigNode node)
{ {
if (nodeToLoad == null) if (nodeToLoad == null)
nodeToLoad = node; nodeToLoad = node;
   
base.OnLoad(node); base.OnLoad(node);
} }
   
void printObj(object obj) void printObj(object obj)
{ {
using (KSP.IO.TextWriter writer = TextWriter.CreateForType<string>("obj.cs")) using (KSP.IO.TextWriter writer = TextWriter.CreateForType<string>("obj.cs"))
{ {
string str = printProperties(obj, TypeDescriptor.GetProperties(obj), 0); string str = printProperties(obj, TypeDescriptor.GetProperties(obj), 0);
writer.Write(str); writer.Write(str);
print(str); print(str);
} }
} }
   
string printProperties(object obj, PropertyDescriptorCollection collection, int I) string printProperties(object obj, PropertyDescriptorCollection collection, int I)
{ {
if (I > 2) if (I > 2)
return ""; return "";
   
string prefix = ""; string prefix = "";
string str = ""; string str = "";
for (int T = 0; T < I; T++) for (int T = 0; T < I; T++)
{ {
prefix += " "; prefix += " ";
} }
   
str += "\n" + prefix + "#region"; str += "\n" + prefix + "#region";
foreach (PropertyDescriptor d in collection) foreach (PropertyDescriptor d in collection)
{ {
str += "\n" + prefix + d.Name + " = " + d.GetValue(obj); str += "\n" + prefix + d.Name + " = " + d.GetValue(obj);
str += printProperties(obj, d.GetChildProperties(obj), I + 1); str += printProperties(obj, d.GetChildProperties(obj), I + 1);
} }
str += "\n" + prefix + "#endregion"; str += "\n" + prefix + "#endregion";
return str; return str;
} }
   
public override void OnUpdate() public override void OnUpdate()
{ {
bool eva = isValid(Util.Kerbal); bool eva = isValid(Util.Kerbal);
Events["ActivateCore"].active = !IsEnabled; Events["ActivateCore"].active = !IsEnabled;
Events["DeactivateCore"].active = IsEnabled; Events["DeactivateCore"].active = IsEnabled;
Events["BeginPlace"].active = !Placing && !Deleting && struts.Count < MaxStruts && eva; Events["BeginPlace"].active = !Placing && !Deleting && struts.Count < MaxStruts && eva;
Events["BeginDelete"].active = !Deleting && !Placing && struts.Count > 0 && eva; Events["BeginDelete"].active = !Deleting && !Placing && struts.Count > 0 && eva;
   
if (nodeToLoad != null) if (nodeToLoad != null)
{ {
foreach (ConfigNode strut in nodeToLoad.GetNodes("QuantumStrut")) foreach (ConfigNode strut in nodeToLoad.GetNodes("QuantumStrut"))
{ {
Part parent = part.vessel.parts[Convert.ToInt32(strut.GetValue("parent"))]; Part parent = part.vessel.parts[Convert.ToInt32(strut.GetValue("parent"))];
Vector3 parentOffset = StringToVector3(strut.GetValue("parentOffset")); Vector3 parentOffset = StringToVector3(strut.GetValue("parentOffset"));
Part target = part.vessel.parts[Convert.ToInt32(strut.GetValue("target"))]; Part target = part.vessel.parts[Convert.ToInt32(strut.GetValue("target"))];
Vector3 targetOffset = StringToVector3(strut.GetValue("targetOffset")); Vector3 targetOffset = StringToVector3(strut.GetValue("targetOffset"));
   
if (isValid(parent) && isValid(target)) if (isValid(parent) && isValid(target))
AddStrut(parent, parentOffset, target, targetOffset); AddStrut(parent, parentOffset, target, targetOffset);
} }
nodeToLoad = null; nodeToLoad = null;
} }
   
if (eva) if (eva)
{ {
InitLaser(); InitLaser();
if (Placing) if (Placing)
{ {
RaycastHit info = new RaycastHit(); RaycastHit info = new RaycastHit();
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
bool hit = Physics.Raycast(ray, out info, Mathf.Infinity); bool hit = Physics.Raycast(ray, out info, Mathf.Infinity);
if (isValid(startPart)) if (isValid(startPart))
{ {
Vector3 pos = startPart.transform.TransformPoint(startOffset); Vector3 pos = startPart.transform.TransformPoint(startOffset);
ray = new Ray(pos, (info.point - pos).normalized); ray = new Ray(pos, (info.point - pos).normalized);
hit = Physics.Raycast(ray, out info, 10); hit = Physics.Raycast(ray, out info, 10);
} }
   
if (Input.GetMouseButtonUp(0)) if (Input.GetMouseButtonUp(0))
{ {
if (hit) if (hit)
{ {
if (!isValid(startPart)) if (!isValid(startPart))
{ {
startPart = partFromRaycast(info); startPart = partFromRaycast(info);
if (isValid(startPart)) if (isValid(startPart))
startOffset = startPart.transform.InverseTransformPoint(info.point); startOffset = startPart.transform.InverseTransformPoint(info.point);
} }
else if (!isValid(endPart)) else if (!isValid(endPart))
{ {
Part p = partFromRaycast(info); Part p = partFromRaycast(info);
if (isValid(p)) if (isValid(p))
{ {
if (p != startPart && startPart.vessel.parts.Contains(p)) if (p != startPart && startPart.vessel.parts.Contains(p))
{ {
endPart = p; endPart = p;
endOffset = endPart.transform.InverseTransformPoint(info.point); endOffset = endPart.transform.InverseTransformPoint(info.point);
   
AddStrut(startPart, startOffset, endPart, endOffset); AddStrut(startPart, startOffset, endPart, endOffset);
} }
Placing = false; Placing = false;
} }
} }
} }
} }
   
if (isValid(startPart)) if (isValid(startPart))
{ {
if (hit) if (hit)
{ {
Part p = partFromRaycast(info); Part p = partFromRaycast(info);
Color c = Color.red; Color c = Color.red;
   
if (isValid(p)) if (isValid(p))
{ {
if (startPart.vessel.parts.Contains(p) && p != startPart) if (startPart.vessel.parts.Contains(p) && p != startPart)
c = Color.green; c = Color.green;
} }
   
lr.SetColors(c, c); lr.SetColors(c, c);
lr.SetPosition(0, startPart.transform.TransformPoint(startOffset)); lr.SetPosition(0, startPart.transform.TransformPoint(startOffset));
lr.SetPosition(1, info.point); lr.SetPosition(1, info.point);
} }
else else
{ {
lr.SetColors(Color.red, Color.red); lr.SetColors(Color.red, Color.red);
lr.SetPosition(0, startPart.transform.TransformPoint(startOffset)); lr.SetPosition(0, startPart.transform.TransformPoint(startOffset));
lr.SetPosition(1, ray.GetPoint(10)); lr.SetPosition(1, ray.GetPoint(10));
} }
} }
} }
else else
{ {
lr.SetPosition(0, Vector3.zero); lr.SetPosition(0, Vector3.zero);
lr.SetPosition(1, Vector3.zero); lr.SetPosition(1, Vector3.zero);
} }
   
if (Deleting) if (Deleting)
{ {
RaycastHit info = new RaycastHit(); RaycastHit info = new RaycastHit();
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
bool hit = Physics.Raycast(ray, out info, Mathf.Infinity); bool hit = Physics.Raycast(ray, out info, Mathf.Infinity);
   
CoreStrut closest = null; CoreStrut closest = null;
float closestDist = Mathf.Infinity; float closestDist = Mathf.Infinity;
foreach (CoreStrut strut in struts) foreach (CoreStrut strut in struts)
{ {
strut.Selected = false; strut.Selected = false;
if (hit) if (hit)
{ {
Vector3 start = strut.parent.transform.TransformPoint(strut.parentOffset); Vector3 start = strut.parent.transform.TransformPoint(strut.parentOffset);
float d = Vector3.Distance(start, info.point); float d = Vector3.Distance(start, info.point);
   
if (d < 0.05 && d < closestDist) if (d < 0.05 && d < closestDist)
{ {
closest = strut; closest = strut;
closestDist = d; closestDist = d;
} }
} }
} }
   
if (closest != null) if (closest != null)
closest.Selected = true; closest.Selected = true;
   
if (Input.GetMouseButtonUp(0)) if (Input.GetMouseButtonUp(0))
{ {
if (closest != null) if (closest != null)
{ {
closest.Destroy(); closest.Destroy();
struts.Remove(closest); struts.Remove(closest);
} }
Deleting = false; Deleting = false;
} }
} }
} }
else else
{ {
DestroyLaser(); DestroyLaser();
} }
   
foreach (CoreStrut s in struts.ToArray()) foreach (CoreStrut s in struts.ToArray())
{ {
if (IsEnabled) if (IsEnabled)
{ {
if (s.Active) if (s.Active)
{ {
if (PowerConsumption == 0 || (GetEnergy() > PowerConsumption * TimeWarp.fixedDeltaTime && part.RequestResource( if (PowerConsumption == 0 || (GetEnergy() > PowerConsumption * TimeWarp.fixedDeltaTime && part.RequestResource(
"ElectricCharge", "ElectricCharge",
PowerConsumption * TimeWarp.fixedDeltaTime PowerConsumption * TimeWarp.fixedDeltaTime
) > 0)) ) > 0))
{ {
s.Active = true; s.Active = true;
} }
else else
{ {
s.Active = false; s.Active = false;
} }
} }
else else
{ {
if (GetEnergy() > 5 * TimeWarp.fixedDeltaTime && part.RequestResource( if (GetEnergy() > 5 * TimeWarp.fixedDeltaTime && part.RequestResource(
"ElectricCharge", "ElectricCharge",
5 * TimeWarp.fixedDeltaTime 5 * TimeWarp.fixedDeltaTime
) > 0) ) > 0)
{ {
s.Active = true; s.Active = true;
} }
} }
} }
else else
{ {
s.Active = false; s.Active = false;
} }
   
s.Update(); s.Update();
if (s.isDestroyed) if (s.isDestroyed)
struts.Remove(s); struts.Remove(s);
} }
base.OnUpdate(); base.OnUpdate();
} }
} }
} }
   
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug_win</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug_win</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion> <ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{D6EC2150-27A5-4CB2-ACF9-C53FF7754A77}</ProjectGuid> <ProjectGuid>{D6EC2150-27A5-4CB2-ACF9-C53FF7754A77}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<RootNamespace>QuantumStrutsContinued</RootNamespace> <RootNamespace>QuantumStrutsContinued</RootNamespace>
<AssemblyName>QuantumStrutsContinued</AssemblyName> <AssemblyName>QuantumStrutsContinued</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<UseMSBuildEngine>False</UseMSBuildEngine> <UseMSBuildEngine>False</UseMSBuildEngine>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_win|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_win|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath> <OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants> <DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<CustomCommands> <CustomCommands>
<CustomCommands> <CustomCommands>
<Command type="AfterBuild" command="xcopy /Y ${TargetFile} ..\..\..\Games\KSP_win\GameData\QuantumStrutsContinued\Plugins\" /> <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ..\..\..\Games\KSP_win\GameData\QuantumStrutsContinued\Plugins\" />
</CustomCommands> </CustomCommands>
</CustomCommands> </CustomCommands>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_win|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_win|AnyCPU' ">
<Optimize>true</Optimize> <Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath> <OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<CustomCommands> <CustomCommands>
<CustomCommands> <CustomCommands>
<Command type="AfterBuild" command="xcopy /Y ${TargetFile} ..\..\..\Games\KSP_win\GameData\QuantumStrutsContinued\Plugins\" /> <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ..\..\..\Games\KSP_win\GameData\QuantumStrutsContinued\Plugins\" />
</CustomCommands> </CustomCommands>
</CustomCommands> </CustomCommands>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_linux|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_linux|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath> <OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants> <DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
<CustomCommands> <CustomCommands>
<CustomCommands> <CustomCommands>
<Command type="AfterBuild" command="cp -af ${TargetFile} /opt/games/KSP_linux/GameData/QuantumStrutsContinued/Plugins/" /> <Command type="AfterBuild" command="cp -af ${TargetFile} /opt/games/KSP_linux/GameData/QuantumStrutsContinued/Plugins/" />
</CustomCommands> </CustomCommands>
</CustomCommands> </CustomCommands>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_linux|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_linux|AnyCPU' ">
<Optimize>true</Optimize> <Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath> <OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<CustomCommands> <CustomCommands>
<CustomCommands> <CustomCommands>
<Command type="AfterBuild" command="cp -af ${TargetFile} /opt/games/KSP_linux/GameData/QuantumStrutsContinued/Plugins/" /> <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/" />
</CustomCommands> </CustomCommands>
</CustomCommands> </CustomCommands>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
</PropertyGroup> </PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>
<Compile Include="CoreStrut.cs" /> <Compile Include="CoreStrut.cs" />
<Compile Include="QuantumStrut.cs" /> <Compile Include="QuantumStrut.cs" />
<Compile Include="QuantumStrutCore.cs" /> <Compile Include="QuantumStrutCore.cs" />
<Compile Include="Strut.cs" /> <Compile Include="Strut.cs" />
<Compile Include="Util.cs" /> <Compile Include="Util.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="..\ToadicusTools\Tools.cs"> <Compile Include="..\ToadicusTools\Tools.cs">
<Link>Tools.cs</Link> <Link>Tools.cs</Link>
</Compile> </Compile>
</ItemGroup> </ItemGroup>
<ProjectExtensions> <ProjectExtensions>
<MonoDevelop> <MonoDevelop>
<Properties> <Properties>
<Policies> <Policies>
<StandardHeader Text="${ProjectName} © ${Year} ${AuthorName}&#xA;&#xA;This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a&#xA;copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/&#xA;&#xA;Continued from QuantumStrut, © 2013 BoJaN. Used with permission." IncludeInNewFiles="True" /> <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> </Policies>
</Properties> </Properties>
</MonoDevelop> </MonoDevelop>
</ProjectExtensions> </ProjectExtensions>
<ItemGroup> <ItemGroup>
<Reference Include="Assembly-CSharp"> <Reference Include="Assembly-CSharp">
<HintPath>..\_KSPAssemblies\Assembly-CSharp.dll</HintPath> <HintPath>..\_KSPAssemblies\Assembly-CSharp.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="System"> <Reference Include="System">
<HintPath>..\_KSPAssemblies\System.dll</HintPath> <HintPath>..\_KSPAssemblies\System.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="UnityEngine"> <Reference Include="UnityEngine">
<HintPath>..\_KSPAssemblies\UnityEngine.dll</HintPath> <HintPath>..\_KSPAssemblies\UnityEngine.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
</Project> </Project>
file:a/Strut.cs -> file:b/Strut.cs
// QuantumStrutsContinued © 2014 toadicus // QuantumStrutsContinued
// //
// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a // Strut.cs
// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ //
// // 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; using KSP;
using System; using System;
using UnityEngine; using UnityEngine;
   
namespace QuantumStrut namespace QuantumStrut
{ {
class Strut class Strut
{ {
public bool isDestroyed = false; public bool isDestroyed = false;
Material _material = null; Material _material = null;
   
public Material Material public Material Material
{ {
set set
{ {
_material = value; _material = value;
if (Material != null) if (Material != null)
lr.material = Material; lr.material = Material;
} }
get get
{ {
return _material; return _material;
} }
} }
   
Color _startColor = Color.white; Color _startColor = Color.white;
   
public Color StartColor public Color StartColor
{ {
set set
{ {
_startColor = value; _startColor = value;
lr.SetColors(StartColor, EndColor); lr.SetColors(StartColor, EndColor);
} }
get get
{ {
return _startColor; return _startColor;
} }
} }
   
Color _endColor = Color.white; Color _endColor = Color.white;
   
public Color EndColor public Color EndColor
{ {
set set
{ {
_endColor = value; _endColor = value;
lr.SetColors(StartColor, EndColor); lr.SetColors(StartColor, EndColor);
} }
get get
{ {
return _endColor; return _endColor;
} }
} }
   
float _startSize = 0; float _startSize = 0;
   
public float StartSize public float StartSize
{ {
set set
{ {
_startSize = value; _startSize = value;
lr.SetWidth(StartSize, EndSize); lr.SetWidth(StartSize, EndSize);
} }
get get
{ {
return _startSize; return _startSize;
} }
} }
   
float _endSize = 0; float _endSize = 0;
   
public float EndSize public float EndSize
{ {
set set
{ {
_endSize = value; _endSize = value;
lr.SetWidth(StartSize, EndSize); lr.SetWidth(StartSize, EndSize);
} }
get get
{ {
return _endSize; return _endSize;
} }
} }
   
ConfigurableJoint joint; ConfigurableJoint joint;
Transform parentTransform = null; Transform parentTransform = null;
Part parent = null; Part parent = null;
Part target = null; Part target = null;
Vector3 targetOffset = Vector3.zero; Vector3 targetOffset = Vector3.zero;
GameObject LineObj = null; GameObject LineObj = null;
LineRenderer lr = null; LineRenderer lr = null;
   
public void print(object body, params object[] args) public void print(object body, params object[] args)
{ {
string final = body.ToString(); string final = body.ToString();
for (int I = 0; I < args.Length; I++) for (int I = 0; I < args.Length; I++)
{ {
final = final.Replace("{" + I + "}", args[I].ToString()); final = final.Replace("{" + I + "}", args[I].ToString());
} }
MonoBehaviour.print("[AutoStrut] " + final); MonoBehaviour.print("[AutoStrut] " + final);
} }
   
void DrawLine(Vector3 origin, Vector3 end) void DrawLine(Vector3 origin, Vector3 end)
{ {
if (Util.isValid(lr)) if (Util.isValid(lr))
{ {
lr.SetPosition(0, origin); lr.SetPosition(0, origin);
lr.SetPosition(1, end); lr.SetPosition(1, end);
} }
} }
   
public Strut(Part parent, Part target, Vector3 targetOffset, Transform parentTransform) public Strut(Part parent, Part target, Vector3 targetOffset, Transform parentTransform)
{ {
this.parent = parent; this.parent = parent;
this.target = target; this.target = target;
this.targetOffset = targetOffset; this.targetOffset = targetOffset;
this.parentTransform = parentTransform; this.parentTransform = parentTransform;
   
if (parent.vessel.parts.Contains(target)) if (parent.vessel.parts.Contains(target))
{ {
joint = parent.parent.gameObject.AddComponent<ConfigurableJoint>(); joint = parent.parent.gameObject.AddComponent<ConfigurableJoint>();
joint.connectedBody = target.rigidbody; joint.connectedBody = target.rigidbody;
   
joint.anchor = new Vector3( joint.anchor = new Vector3(
0, 0,
0, 0,
Vector3.Distance( Vector3.Distance(
parentTransform.position, parentTransform.position,
target.transform.TransformPoint(targetOffset) target.transform.TransformPoint(targetOffset)
) / 2 ) / 2
); );
joint.axis = new Vector3(0, 0, 1); joint.axis = new Vector3(0, 0, 1);
joint.xMotion = ConfigurableJointMotion.Locked; joint.xMotion = ConfigurableJointMotion.Locked;
joint.yMotion = ConfigurableJointMotion.Locked; joint.yMotion = ConfigurableJointMotion.Locked;
joint.zMotion = ConfigurableJointMotion.Locked; joint.zMotion = ConfigurableJointMotion.Locked;
joint.angularXMotion = ConfigurableJointMotion.Locked; joint.angularXMotion = ConfigurableJointMotion.Locked;
joint.angularYMotion = ConfigurableJointMotion.Locked; joint.angularYMotion = ConfigurableJointMotion.Locked;
joint.angularZMotion = ConfigurableJointMotion.Locked; joint.angularZMotion = ConfigurableJointMotion.Locked;
   
LineObj = new GameObject(); LineObj = new GameObject();
LineObj.name = "quantumstrut"; LineObj.name = "quantumstrut";
   
lr = LineObj.AddComponent<LineRenderer>(); lr = LineObj.AddComponent<LineRenderer>();
lr.useWorldSpace = true; lr.useWorldSpace = true;
   
Material = QuantumStrut.LaserMaterial; Material = QuantumStrut.LaserMaterial;
StartColor = Color.white; StartColor = Color.white;
EndColor = Color.white; EndColor = Color.white;
StartSize = 0.03f; StartSize = 0.03f;
EndSize = 0.0075f; EndSize = 0.0075f;
   
lr.SetVertexCount(2); lr.SetVertexCount(2);
lr.SetPosition(0, Vector3.zero); lr.SetPosition(0, Vector3.zero);
lr.SetPosition(1, Vector3.zero); lr.SetPosition(1, Vector3.zero);
} }
else else
{ {
Destroy(); Destroy();
} }
} }
   
public void Update() public void Update()
{ {
if (Util.isValid(parent) && Util.isValid(target) && Util.isValid(parent.vessel) && parent.vessel.parts.Contains(target)) if (Util.isValid(parent) && Util.isValid(target) && Util.isValid(parent.vessel) && parent.vessel.parts.Contains(target))
{ {
Vector3 start = parentTransform.position; Vector3 start = parentTransform.position;
Vector3 end = target.transform.TransformPoint(targetOffset); Vector3 end = target.transform.TransformPoint(targetOffset);
DrawLine(start, end); DrawLine(start, end);
} }
else else
{ {
DrawLine(Vector3.zero, Vector3.zero); DrawLine(Vector3.zero, Vector3.zero);
Destroy(); Destroy();
} }
} }
   
public void Destroy() public void Destroy()
{ {
DrawLine(Vector3.zero, Vector3.zero); DrawLine(Vector3.zero, Vector3.zero);
if (Util.isValid(joint)) if (Util.isValid(joint))
GameObject.DestroyImmediate(joint); GameObject.DestroyImmediate(joint);
   
if (Util.isValid(lr)) if (Util.isValid(lr))
GameObject.DestroyImmediate(lr); GameObject.DestroyImmediate(lr);
   
if (Util.isValid(LineObj)) if (Util.isValid(LineObj))
GameObject.DestroyImmediate(LineObj); GameObject.DestroyImmediate(LineObj);
   
joint = null; joint = null;
LineObj = null; LineObj = null;
lr = null; lr = null;
   
parentTransform = null; parentTransform = null;
parent = null; parent = null;
target = null; target = null;
targetOffset = Vector3.zero; targetOffset = Vector3.zero;
isDestroyed = true; isDestroyed = true;
} }
} }
} }
file:a/Util.cs -> file:b/Util.cs
// QuantumStrutsContinued © 2014 toadicus // QuantumStrutsContinued
// //
// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a // Util.cs
// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ //
  // 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 KSP.IO;
using System; using System;
using System.ComponentModel; using System.ComponentModel;
using UnityEngine; using UnityEngine;
   
namespace QuantumStrut namespace QuantumStrut
{ {
public static class Util public static class Util
{ {
static System.Random r = new System.Random(); static System.Random r = new System.Random();
   
public static float Random(float min, float max) public static float Random(float min, float max)
{ {
return (float)((r.NextDouble() * (max - min)) + min); return (float)((r.NextDouble() * (max - min)) + min);
} }
   
public static float Random() public static float Random()
{ {
return (float)r.NextDouble(); return (float)r.NextDouble();
} }
   
public static Part getTank(Part parent) public static Part getTank(Part parent)
{ {
if (parent.Resources.Count != 0) if (parent.Resources.Count != 0)
return parent; return parent;
   
if (isValid(parent.parent) && parent.fuelCrossFeed) if (isValid(parent.parent) && parent.fuelCrossFeed)
return getTank(parent.parent); return getTank(parent.parent);
   
return null; return null;
} }
   
public static Vessel Kerbal public static Vessel Kerbal
{ {
get get
{ {
if (isValid(FlightGlobals.fetch.activeVessel) && FlightGlobals.fetch.activeVessel.isEVA) if (isValid(FlightGlobals.fetch.activeVessel) && FlightGlobals.fetch.activeVessel.isEVA)
return FlightGlobals.fetch.activeVessel; return FlightGlobals.fetch.activeVessel;
return null; return null;
} }
} }
   
public static bool isValid(UnityEngine.Object obj) public static bool isValid(UnityEngine.Object obj)
{ {
return (obj && obj != null); return (obj && obj != null);
} }
   
public static void printObj(object obj) public static void printObj(object obj)
{ {
using (KSP.IO.TextWriter writer = TextWriter.CreateForType<string>("obj.cs")) using (KSP.IO.TextWriter writer = TextWriter.CreateForType<string>("obj.cs"))
{ {
string str = printProperties(obj, TypeDescriptor.GetProperties(obj), 0); string str = printProperties(obj, TypeDescriptor.GetProperties(obj), 0);
writer.Write(str); writer.Write(str);
MonoBehaviour.print(str); MonoBehaviour.print(str);
} }
} }
   
static string printProperties(object obj, PropertyDescriptorCollection collection, int I) static string printProperties(object obj, PropertyDescriptorCollection collection, int I)
{ {
if (I > 2) if (I > 2)
return ""; return "";
   
string prefix = ""; string prefix = "";
string str = ""; string str = "";
for (int T = 0; T < I; T++) for (int T = 0; T < I; T++)
{ {
prefix += " "; prefix += " ";
} }
   
foreach (PropertyDescriptor d in collection) foreach (PropertyDescriptor d in collection)
{ {
str += "\n" + prefix + d.Name + " = " + d.GetValue(obj); str += "\n" + prefix + d.Name + " = " + d.GetValue(obj);
} }
return str; return str;
} }
   
public static Part partFromGameObject(GameObject ob) public static Part partFromGameObject(GameObject ob)
{ {
GameObject o = ob; GameObject o = ob;
   
while (o) while (o)
{ {
Part p = Part.FromGO(o); Part p = Part.FromGO(o);
if (p && p != null) if (p && p != null)
{ {
return p; return p;
} }
   
if (o.transform.parent) if (o.transform.parent)
o = o.transform.parent.gameObject; o = o.transform.parent.gameObject;
else else
return null; return null;
} }
return null; return null;
} }
   
public static Part partFromRaycast(RaycastHit hit) public static Part partFromRaycast(RaycastHit hit)
{ {
return partFromGameObject(hit.collider.gameObject); return partFromGameObject(hit.collider.gameObject);
} }
   
public static Part partFromId(Vessel vessel, long id) public static Part partFromId(Vessel vessel, long id)
{ {
Console.WriteLine("Vessel Parts: " + vessel.Parts.Count); Console.WriteLine("Vessel Parts: " + vessel.Parts.Count);
foreach (Part p in vessel.Parts) foreach (Part p in vessel.Parts)
{ {
MonoBehaviour.print(p.uid + " ?= " + id + ": " + (p.uid == id)); MonoBehaviour.print(p.uid + " ?= " + id + ": " + (p.uid == id));
if (p.uid == id) if (p.uid == id)
return p; return p;
} }
return null; return null;
} }
   
public static float GetEnergy(Vessel vessel) public static float GetEnergy(Vessel vessel)
{ {
double energy = 0; double energy = 0;
foreach (Part p in vessel.parts) foreach (Part p in vessel.parts)
{ {
foreach (PartResource r in p.Resources) foreach (PartResource r in p.Resources)
{ {
if (r.resourceName == "ElectricCharge") if (r.resourceName == "ElectricCharge")
energy += r.amount; energy += r.amount;
} }
} }
return (float)energy; return (float)energy;
} }
} }
} }