Version 1.4 1.4
Version 1.4

file:a/CoreStrut.cs (deleted)
// 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;  
}  
}  
}  
// 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  
}  
}  
QuantumStrutsContinued QuantumStrutsContinued
   
Continued from QuantumStruts by BoJaN. Used by permission. Continued from QuantumStruts by BoJaN. Used by permission.
   
ModuleManager patches © 2014 K3|Chris. Used by permission. ModuleManager patches © 2014 K3|Chris. Used by permission.
   
Copyright © 2014, toadicus Copyright © 2014-2015, toadicus
All rights reserved. All rights reserved.
   
Redistribution and use in source and binary forms, with or without modification, Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met: are permitted provided that the following conditions are met:
   
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. this list of conditions and the following disclaimer.
   
2. Redistributions in binary form must reproduce the above copyright notice, 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 this list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution. materials provided with the distribution.
   
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 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 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, 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 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, 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 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. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 Binary files a/GameData/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model.mu and /dev/null differ
 Binary files a/GameData/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model000.mbm and /dev/null differ
 Binary files a/GameData/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model001.mbm and /dev/null differ
// QuantumStrutsContinued // QuantumStrutsContinued
// //
// Continued from QuantumStruts by BoJaN. Used by permission. // Continued from QuantumStruts by BoJaN. Used by permission.
// //
// ModuleManager patches © 2014 K3|Chris. Used by permission. // ModuleManager patches © 2014 K3|Chris. Used by permission.
// //
// Copyright © 2014, toadicus // Copyright © 2014, toadicus
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without modification, // Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met: // are permitted provided that the following conditions are met:
// //
// 1. Redistributions of source code must retain the above copyright notice, // 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer. // this list of conditions and the following disclaimer.
// //
// 2. Redistributions in binary form must reproduce the above copyright notice, // 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 // this list of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution. // materials provided with the distribution.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, // 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 // 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, // 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 // 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, // 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 // 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. // 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 MODEL
rescaleFactor = 0.6 {
  model = Squad/Parts/Utility/linearRCS/model
  }
  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 TechRequired = advScienceTech
cost = 1500 cost = 1500
category = Utility category = Structural
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
  }
} }
   
}  
 Binary files a/GameData/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrutCore/model.mu and /dev/null differ
 Binary files a/GameData/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrutCore/model000.mbm and /dev/null differ
 Binary files a/GameData/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrutCore/model001.mbm and /dev/null 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  
{  
// --- 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/GameData/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model.mu and /dev/null differ
 Binary files a/GameData/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model000.mbm and /dev/null differ
 Binary files a/GameData/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model001.mbm and /dev/null differ
// QuantumStrutsContinued // QuantumStrutsContinued
// //
// Continued from QuantumStruts by BoJaN. Used by permission. // Continued from QuantumStruts by BoJaN. Used by permission.
// //
// ModuleManager patches © 2014 K3|Chris. Used by permission. // ModuleManager patches © 2014 K3|Chris. Used by permission.
// //
// Copyright © 2014, toadicus // Copyright © 2014, toadicus
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without modification, // Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met: // are permitted provided that the following conditions are met:
// //
// 1. Redistributions of source code must retain the above copyright notice, // 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer. // this list of conditions and the following disclaimer.
// //
// 2. Redistributions in binary form must reproduce the above copyright notice, // 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 // this list of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution. // materials provided with the distribution.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, // 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 // 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, // 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 // 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, // 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 // 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. // 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 MODEL
rescaleFactor = 0.6 {
  model = Squad/Parts/Utility/linearRCS/model
  }
  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 TechRequired = advScienceTech
cost = 500 cost = 500
category = Utility category = Structural
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.03 EndSize = 0.03
   
Start = 0,0,0 Start = 0,0,0
Dir = 0,1,0 Dir = 0,1,0
  }
} }
}  
 Binary files a/GameData/QuantumStrutsContinued/Plugins/QuantumStrutsContinued.dll and /dev/null differ
// QuantumStrutsContinued // QuantumStrutsContinued
// //
// AssemblyInfo.cs // AssemblyInfo.cs
// //
// Continued from QuantumStruts by BoJaN. Used by permission. // Continued from QuantumStruts by BoJaN. Used by permission.
// //
// ModuleManager patches © 2014 K3|Chris. Used by permission. // ModuleManager patches © 2014 K3|Chris. Used by permission.
// //
// Copyright © 2014, toadicus // Copyright © 2014, toadicus
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without modification, // Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met: // are permitted provided that the following conditions are met:
// //
// 1. Redistributions of source code must retain the above copyright notice, // 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer. // this list of conditions and the following disclaimer.
// //
// 2. Redistributions in binary form must reproduce the above copyright notice, // 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 // this list of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution. // materials provided with the distribution.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, // 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 // 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, // 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 // 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, // 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 // 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. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   
using System.Reflection; 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.2.*")] [assembly: AssemblyVersion("1.4.*")]
   
// QuantumStrutsContinued // QuantumStrutsContinued
// //
// QuantumStrut.cs // QuantumStrut.cs
// //
// Continued from QuantumStruts by BoJaN. Used by permission. // Continued from QuantumStruts by BoJaN. Used by permission.
// //
// ModuleManager patches © 2014 K3|Chris. Used by permission. // ModuleManager patches © 2014 K3|Chris. Used by permission.
// //
// Copyright © 2014, toadicus // Copyright © 2014, toadicus
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without modification, // Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met: // are permitted provided that the following conditions are met:
// //
// 1. Redistributions of source code must retain the above copyright notice, // 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer. // this list of conditions and the following disclaimer.
// //
// 2. Redistributions in binary form must reproduce the above copyright notice, // 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 // this list of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution. // materials provided with the distribution.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, // 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 // 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, // 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 // 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, // 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 // 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. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   
  #define DEBUG
   
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;
} }
   
  base.stagingEnabled = false;
   
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 override bool IsStageable()
  {
  return false;
  }
   
  public void FixedUpdate()
{ {
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!"); Logging.PostDebugMessage(this, "Checking bailing out: in the editor!");
return; return;
} }
   
if (!isEnabled) if (!isEnabled)
{ {
Tools.PostDebugMessage(this, "Destroying strut."); Logging.PostDebugMessage(this, "Destroying strut.");
   
strut.Destroy(); strut.Destroy();
strut = null; strut = null;
return; return;
} }
   
Tools.PostDebugMessage(this, "Checking for ray hit."); Logging.PostDebugMessage(this, "Checking for ray hit.");
   
Tools.PostDebugMessage(this, "Enabled, continuing."); Logging.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."); Logging.PostDebugMessage(this, "strut is {0}", strut == null ? "null" : strut.isDestroyed.ToString());
   
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."); Logging.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."); Logging.PostDebugMessage(this, "Found raycast hit. Fetching target part.");
   
Part targetPart = Util.partFromRaycast(info); 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 ( 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."); Logging.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."); Logging.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!"); Logging.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);
} }
} }
} }
} }
file:a/QuantumStrutCore.cs (deleted)
// 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();  
}  
}  
}  
 
<?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} ${ProjectDir}\GameData\QuantumStrutsContinued\Plugins\" /> <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ${ProjectDir}\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} ${ProjectDir}\GameData\QuantumStrutsContinued\Plugins\" /> <Command type="AfterBuild" command="xcopy /Y ${TargetFile} ${ProjectDir}\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} ${ProjectDir}/GameData/QuantumStrutsContinued/Plugins/" /> <Command type="AfterBuild" command="cp -af ${TargetFile} ${ProjectDir}/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} ${ProjectDir}/GameData/QuantumStrutsContinued/Plugins/" /> <Command type="AfterBuild" command="cp -af ${TargetFile} ${ProjectDir}/GameData/QuantumStrutsContinued/Plugins/" />
</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="QuantumStrut.cs" /> <Compile Include="QuantumStrut.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\Extensions\ComponentExtensions.cs">
<Link>Tools.cs</Link> <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> </Compile>
</ItemGroup> </ItemGroup>
<ProjectExtensions> <ProjectExtensions>
<MonoDevelop> <MonoDevelop>
<Properties> <Properties>
<Policies> <Policies>
<StandardHeader Text="${ProjectName}&#xD;&#xA;&#xD;&#xA;${FileName}&#xD;&#xA;&#xD;&#xA;Copyright © ${Year}, ${AuthorName}&#xD;&#xA;All rights reserved.&#xD;&#xA;&#xD;&#xA;Redistribution and use in source and binary forms, with or without modification,&#xD;&#xA;are permitted provided that the following conditions are met:&#xD;&#xA;&#xD;&#xA;1. Redistributions of source code must retain the above copyright notice,&#xD;&#xA; this list of conditions and the following disclaimer.&#xD;&#xA;&#xD;&#xA;2. Redistributions in binary form must reproduce the above copyright notice,&#xD;&#xA; this list of conditions and the following disclaimer in the documentation and/or other&#xD;&#xA; materials provided with the distribution.&#xD;&#xA;&#xD;&#xA;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,&#xD;&#xA;INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE&#xD;&#xA;DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,&#xD;&#xA;SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR&#xD;&#xA;SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,&#xD;&#xA;WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&#xD;&#xA;OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." IncludeInNewFiles="True" /> <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>
<ItemGroup> <ItemGroup>
<None Include="GameData\QuantumStrutsContinued\KASifyQSC.cfg" />  
<None Include="GameData\QuantumStrutsContinued\Parts\QuantumStruts\quantumStrut\part.cfg" /> <None Include="GameData\QuantumStrutsContinued\Parts\QuantumStruts\quantumStrut\part.cfg" />
<None Include="GameData\QuantumStrutsContinued\Parts\QuantumStruts\quantumStrutCore\part.cfg" />  
<None Include="GameData\QuantumStrutsContinued\Parts\QuantumStruts\strutGun\part.cfg" /> <None Include="GameData\QuantumStrutsContinued\Parts\QuantumStruts\strutGun\part.cfg" />
  <None Include="GameData\QuantumStrutsContinued\LICENSE" />
  </ItemGroup>
  <ItemGroup>
  <Folder Include="ToadicusTools\" />
</ItemGroup> </ItemGroup>
</Project> </Project>
file:a/Util.cs -> file:b/Util.cs
// QuantumStrutsContinued // QuantumStrutsContinued
// //
// Util.cs // Util.cs
// //
// Continued from QuantumStruts by BoJaN. Used by permission. // Continued from QuantumStruts by BoJaN. Used by permission.
// //
// ModuleManager patches © 2014 K3|Chris. Used by permission. // ModuleManager patches © 2014 K3|Chris. Used by permission.
// //
// Copyright © 2014, toadicus // Copyright © 2014, toadicus
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without modification, // Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met: // are permitted provided that the following conditions are met:
// //
// 1. Redistributions of source code must retain the above copyright notice, // 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer. // this list of conditions and the following disclaimer.
// //
// 2. Redistributions in binary form must reproduce the above copyright notice, // 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 // this list of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution. // materials provided with the distribution.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, // 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 // 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, // 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 // 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, // 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 // 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. // 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) PropertyDescriptor d;
  for (int i = 0; i < collection.Count; i++)
{ {
  d = collection[i];
   
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 float GetEnergy(Vessel vessel) public static float GetEnergy(Vessel vessel)
{ {
double energy = 0; 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") if (r.resourceName == "ElectricCharge")
energy += r.amount; energy += r.amount;
} }
} }
return (float)energy; return (float)energy;
} }
} }
} }
   
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model.mu differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model000.dds differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model000.mbm differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model001.dds differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/quantumStrut/model001.mbm differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model.mu differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model000.dds differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model000.mbm differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model001.dds differ
 Binary files /dev/null and b/backup/QuantumStrutsContinued/Parts/QuantumStruts/strutGun/model001.mbm differ