Skip to content

Commit

Permalink
Implemented Majiir's CompatabilityCheck. Updated release files
Browse files Browse the repository at this point in the history
  • Loading branch information
snjo committed Apr 6, 2014
1 parent be84adb commit 9dbba7e
Show file tree
Hide file tree
Showing 71 changed files with 330 additions and 9,319 deletions.
1 change: 1 addition & 0 deletions Firespitter/Firespitter.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
<Compile Include="engine\FSengineHover.cs" />
<Compile Include="engine\FSheliLiftEngine.cs" />
<Compile Include="engine\FSengine.cs" />
<Compile Include="tools\CompatabilityChecker.cs" />
<Compile Include="tools\FSversionCheck.cs" />
<Compile Include="unused\FShelicopterEngine.cs" />
<Compile Include="engine\FSparticleFX.cs" />
Expand Down
149 changes: 149 additions & 0 deletions Firespitter/tools/CompatabilityChecker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
/**
* Copyright (c) 2014, Majiir
* 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.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;

namespace Firespitter
{
namespace Compatibility
{

/**
* This utility displays a warning with a list of mods that determine themselves
* to be incompatible with the current running version of Kerbal Space Program.
*
* See this forum thread for details:
* http://forum.kerbalspaceprogram.com/threads/65395-Voluntarily-Locking-Plugins-to-a-Particular-KSP-Version
*/

[KSPAddon(KSPAddon.Startup.MainMenu, true)]
internal class CompatibilityChecker : MonoBehaviour
{
public static bool IsCompatible()
{
/*-----------------------------------------------*\
| BEGIN IMPLEMENTATION-SPECIFIC EDITS HERE. |
\*-----------------------------------------------*/

// TODO: Implement your own compatibility check.
//
// If you want to disable some behavior when incompatible, other parts of the plugin
// should query this method:
//
// if (!CompatibilityChecker.IsCompatible()) {
// ...disable some features...
// }
//
// Even if you don't lock down functionality, you should return true if your users
// can expect a future update to be available.
//
return FSversionCheck.IsCompatible();

/*-----------------------------------------------*\
| IMPLEMENTERS SHOULD NOT EDIT BEYOND THIS POINT! |
\*-----------------------------------------------*/
}

// Version of the compatibility checker itself.
private static int _version = 2;

public void Start()
{
// Checkers are identified by the type name and version field name.
FieldInfo[] fields =
getAllTypes()
.Where(t => t.Name == "CompatibilityChecker")
.Select(t => t.GetField("_version", BindingFlags.Static | BindingFlags.NonPublic))
.Where(f => f != null)
.Where(f => f.FieldType == typeof(int))
.ToArray();

// Let the latest version of the checker execute.
if (_version != fields.Max(f => (int)f.GetValue(null))) { return; }

Debug.Log(String.Format("[CompatibilityChecker] Running checker version {0} from '{1}'", _version, Assembly.GetExecutingAssembly().GetName().Name));

// Other checkers will see this version and not run.
// This accomplishes the same as an explicit "ran" flag with fewer moving parts.
_version = int.MaxValue;

// A mod is incompatible if its compatibility checker has an IsCompatible method which returns false.
String[] incompatible =
fields
.Select(f => f.DeclaringType.GetMethod("IsCompatible", Type.EmptyTypes))
.Where(m => m.IsStatic)
.Where(m => m.ReturnType == typeof(bool))
.Where(m =>
{
try
{
return !(bool)m.Invoke(null, new object[0]);
}
catch (Exception e)
{
// If a mod throws an exception from IsCompatible, it's not compatible.
Debug.LogWarning(String.Format("[CompatibilityChecker] Exception while invoking IsCompatible() from '{0}':\n\n{1}", m.DeclaringType.Assembly.GetName().Name, e));
return true;
}
})
.Select(m => m.DeclaringType.Assembly.GetName().Name)
.ToArray();

Array.Sort(incompatible);

if (incompatible.Length > 0)
{
Debug.LogWarning("[CompatibilityChecker] Incompatible mods detected: " + String.Join(", ", incompatible));
PopupDialog.SpawnPopupDialog("Incompatible Mods Detected", "Some installed mods are incompatible with this version of Kerbal Space Program. Some features may be broken or disabled. Please check for updates to the following mods:\n\n" + String.Join("\n", incompatible), "OK", false, HighLogic.Skin);
}
}

private static IEnumerable<Type> getAllTypes()
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
Type[] types;
try
{
types = assembly.GetTypes();
}
catch (Exception)
{
types = Type.EmptyTypes;
}

foreach (var type in types)
{
yield return type;
}
}
}
}
}
}
57 changes: 19 additions & 38 deletions Firespitter/tools/FSversionCheck.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,19 @@ public class FSversionCheck : MonoBehaviour
static int CompatibleWithMinor = 23;
static int CompatibleWithRevision = 5;
static System.Version FSversion;
static bool versionError = false;
//static bool versionError = false;

private FSGUIPopup warningPopup;
private string KSPversion = string.Empty;
private string expectedVersion = string.Empty;
//private FSGUIPopup warningPopup;
//private string KSPversion = string.Empty;
//private string expectedVersion = string.Empty;

public void Start()
//public void Start()
public static bool IsCompatible()
{
KSPversion = Versioning.version_major + "." + Versioning.version_minor + "." + Versioning.Revision;
expectedVersion = CompatibleWithMajor + "." + CompatibleWithMinor + "." + CompatibleWithRevision;
//string KSPversion = Versioning.version_major + "." + Versioning.version_minor + "." + Versioning.Revision;
//string expectedVersion = CompatibleWithMajor + "." + CompatibleWithMinor + "." + CompatibleWithRevision;

Debug.Log("Firespitter version check. KSP version: " + KSPversion);
//Debug.Log("Firespitter version check. KSP version: " + KSPversion);

FSversion = Assembly.GetExecutingAssembly().GetName().Version;

Expand All @@ -35,39 +36,19 @@ public void Start()
||
Versioning.Revision != CompatibleWithRevision)
{
warnPlayer();
//warnPlayer();
return false;
}

//createPopup();
}

private void warnPlayer()
{
//versionError = true;
PopupDialog.SpawnPopupDialog("Firespitter version warning", "This version of the firespitter plugin was made for KSP version "
+ expectedVersion + ". You are using " + KSPversion + "."
+ "\nThis may cause errors both in Firespitter parts, other mods, and in the game in general.\nProceed at your own risk, and don't submit bugs when running incompatible versions.", "OK", false, HighLogic.Skin);
Debug.Log("Warning player of incompatible version via popup");
else
return true;
}

//private void createPopup()
//{
// warningPopup = new FSGUIPopup(FSGUIwindowID.getNextID(), FSGUIwindowID.standardRect, "Firespitter version warning");
// warningPopup.showCloseButton = true;
// warningPopup.useInMenus = true;
// warningPopup.sections.Add(new PopupSection());
// warningPopup.sections[0].AddElement(new PopupElement("Warning: This version of Firespitter was made for KSP version "
// + KSPversion
// + "\nThis may cause errors both in Firespitter parts, other mods, and in the game in general. Proceed at your own risk, and don't submit bugs when running incompatible versions."));
// warningPopup.sections[0].elements[0].useTextArea = true;
// warningPopup.sections[0].elements[0].height = 100f;
//}

//public void OnGUI()
//private void warnPlayer()
//{
// if (versionError)
// {
// warningPopup.popup();
// }
// //versionError = true;
// PopupDialog.SpawnPopupDialog("Firespitter version warning", "This version of the firespitter plugin was made for KSP version "
// + expectedVersion + ". You are using " + KSPversion + "."
// + "\nThis may cause errors both in Firespitter parts, other mods, and in the game in general.\nProceed at your own risk, and don't submit bugs when running incompatible versions.", "OK", false, HighLogic.Skin);
// Debug.Log("Warning player of incompatible version via popup");
//}
}
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ TechRequired = aerodynamicSystems
cost = 550
category = Structural
subcategory = 0
title = FS1OF Oblong Nose
title = FS1ON Oblong Nose
manufacturer = Bitesized Industries
description = A nose fit for a wild horse of some kind. Or its equivalent fighter plane.

Expand Down
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
44 changes: 44 additions & 0 deletions For release/Firespitter/Parts/Fuselage/FS_oblongNoseLong/part.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
PART
{

// --- general parameters ---
name = FSoblongNoseLong
module = Part
author = Snjo

// --- asset parameters ---
mesh = model.mu
scale = 1


// --- node definitions ---
node_stack_top = 0.0, 1.691, 0.0, 0.0, 1.0, 0.0
node_stack_bottom = 0.0, -0.155, 0.0, 0.0, 1.0, 0.0
node_attach = 0.0, -0.155, 0.0, 0.0, 1.0, 0.0, 1



// --- editor parameters ---
TechRequired = aerodynamicSystems
cost = 200
category = Structural
subcategory = 0
title = FS1ONL Oblong Long Nose
manufacturer = Bitesized Industries
description = A long rounded end piece for oblong fuselages

// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
attachRules = 1,1,1,1,0

// --- standard part parameters ---
mass = 0.1
dragModelType = default
maximum_drag = 0.1
minimum_drag = 0.1
angularDrag = 2
crashTolerance = 20
maxTemp = 3000
fuelCrossFeed = True

// PART END
}
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
44 changes: 44 additions & 0 deletions For release/Firespitter/Parts/Fuselage/FS_oblongNoseRound/part.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
PART
{

// --- general parameters ---
name = FSoblongNoseRound
module = Part
author = Snjo

// --- asset parameters ---
mesh = model.mu
scale = 1


// --- node definitions ---
node_stack_top = 0.0, 0.47, 0.0, 0.0, 1.0, 0.0
node_stack_bottom = 0.0, -0.155, 0.0, 0.0, 1.0, 0.0
node_attach = 0.0, -0.155, 0.0, 0.0, 1.0, 0.0, 1



// --- editor parameters ---
TechRequired = aerodynamicSystems
cost = 100
category = Structural
subcategory = 0
title = FS1ONR Oblong Rounded Nose
manufacturer = Bitesized Industries
description = A rounded end piece for oblong fuselages

// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
attachRules = 1,1,1,1,0

// --- standard part parameters ---
mass = 0.05
dragModelType = default
maximum_drag = 0.1
minimum_drag = 0.1
angularDrag = 2
crashTolerance = 20
maxTemp = 3000
fuelCrossFeed = True

// PART END
}
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
PART
{

// --- general parameters ---
name = FSoblongToSmallAdapter
module = Part
author = Snjo

// --- asset parameters ---
mesh = model.mu
scale = 1


// --- node definitions ---
node_stack_top = 0.0, 0.245, 0.0, 0.0, 1.0, 0.0
node_stack_bottom = 0.0, -0.207, 0.0, 0.0, 1.0, 0.0
node_attach = 0.0, -0.207, 0.0, 0.0, 1.0, 0.0, 1



// --- editor parameters ---
TechRequired = aerodynamicSystems
cost = 100
category = Structural
subcategory = 0
title = FS1OSA Oblong to Small Adapter
manufacturer = Bitesized Industries
description = Easily mix and match regular round 0.625m parts and oblong parts with this stylish adapter.

// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
attachRules = 1,1,1,1,0

// --- standard part parameters ---
mass = 0.05
dragModelType = default
maximum_drag = 0.1
minimum_drag = 0.1
angularDrag = 2
crashTolerance = 20
maxTemp = 3000
fuelCrossFeed = True

// PART END
}
Binary file modified For release/Firespitter/Plugins/Firespitter.dll
Binary file not shown.
12 changes: 0 additions & 12 deletions For release/Firespitter/Source/Documentation.txt

This file was deleted.

Loading

0 comments on commit 9dbba7e

Please sign in to comment.