From 34fb4500f689467c81c8f908b90722abcb483504 Mon Sep 17 00:00:00 2001 From: morse Date: Sat, 12 Oct 2019 17:08:16 +0300 Subject: [PATCH] ver 2.4.3 --- ChangeLog | 5 + PreciseManeuver.csproj | 1 - PreciseManeuver.version | 8 +- properties/AssemblyInfo.Unity.cs | 4 +- properties/AssemblyInfo.cs | 4 +- src/CompatibilityChecker.cs | 202 ------------------------------- src/NodeManager.cs | 29 +---- src/NodeTools.cs | 3 + src/PreciseManeuver.cs | 19 ++- src/PreciseManeuverToolbar.cs | 9 +- 10 files changed, 35 insertions(+), 249 deletions(-) delete mode 100644 src/CompatibilityChecker.cs diff --git a/ChangeLog b/ChangeLog index 2ea1324..940a6f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2.4.3, 2019-10-12 +- KSP 1.7 +- Small correction to maneuver select logic +- Remove compatibility checker. It's more annoyance than help. + 2.4.2, 2019-03-23 - KSP 1.6 - German translation diff --git a/PreciseManeuver.csproj b/PreciseManeuver.csproj index b5fee5b..d5115f1 100644 --- a/PreciseManeuver.csproj +++ b/PreciseManeuver.csproj @@ -57,7 +57,6 @@ - diff --git a/PreciseManeuver.version b/PreciseManeuver.version index 66cb525..9c4e500 100644 --- a/PreciseManeuver.version +++ b/PreciseManeuver.version @@ -9,22 +9,22 @@ "VERSION": { "MAJOR": 2, "MINOR": 4, - "PATCH": 2, + "PATCH": 3, "BUILD": 0 }, "KSP_VERSION": { "MAJOR": 1, - "MINOR": 6, + "MINOR": 7, "PATCH": 0 }, "KSP_VERSION_MIN": { "MAJOR": 1, - "MINOR": 6, + "MINOR": 7, "PATCH": 0 }, "KSP_VERSION_MAX": { "MAJOR": 1, - "MINOR": 6, + "MINOR": 7, "PATCH": 99 } } \ No newline at end of file diff --git a/properties/AssemblyInfo.Unity.cs b/properties/AssemblyInfo.Unity.cs index caf4b38..2826682 100644 --- a/properties/AssemblyInfo.Unity.cs +++ b/properties/AssemblyInfo.Unity.cs @@ -6,5 +6,5 @@ [assembly: AssemblyCopyright("Copyleft (ɔ) 2017. Modify and distribute it at will! Hail open source!")] [assembly: ComVisible(false)] [assembly: Guid("3ebb00a5-1bbe-46c1-ae28-01b5f6c603f6")] -[assembly: AssemblyVersion("2.4.0.0")] -[assembly: AssemblyFileVersion("2.4.0.0")] +[assembly: AssemblyVersion("2.4.3.0")] +[assembly: AssemblyFileVersion("2.4.3.0")] diff --git a/properties/AssemblyInfo.cs b/properties/AssemblyInfo.cs index 450e9e4..11eaf71 100644 --- a/properties/AssemblyInfo.cs +++ b/properties/AssemblyInfo.cs @@ -31,8 +31,8 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.4.2")] -[assembly: AssemblyFileVersion("2.4.2")] +[assembly: AssemblyVersion("2.4.3")] +[assembly: AssemblyFileVersion("2.4.3")] [assembly: AssemblyInformationalVersion("")] [assembly: KSPAssembly("PreciseManeuver", 2, 4)] diff --git a/src/CompatibilityChecker.cs b/src/CompatibilityChecker.cs deleted file mode 100644 index 5dddf8b..0000000 --- a/src/CompatibilityChecker.cs +++ /dev/null @@ -1,202 +0,0 @@ -/** - * 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; - -/*-----------------------------------------*\ -| SUBSTITUTE YOUR MOD'S NAMESPACE HERE. | -\*-----------------------------------------*/ -namespace KSPPreciseManeuver { - - /** - * 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.Instantly, 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 Versioning.version_major == 1 && Versioning.version_minor == 6; - - /*-----------------------------------------------*\ - | IMPLEMENTERS SHOULD NOT EDIT BEYOND THIS POINT! | - \*-----------------------------------------------*/ - } - - public static bool IsUnityCompatible() { - /*-----------------------------------------------*\ - | BEGIN IMPLEMENTATION-SPECIFIC EDITS HERE. | - \*-----------------------------------------------*/ - - // TODO: Implement your own Unity compatibility check. - // - // MJ is not going to care about the fact that KSP .25 OSX uses a different Unity. - return true; - - /*-----------------------------------------------*\ - | IMPLEMENTERS SHOULD NOT EDIT BEYOND THIS POINT! | - \*-----------------------------------------------*/ - } - - // Version of the compatibility checker itself. - private static int _version = 5; - - 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(); - - // A mod is incompatible with Unity if its compatibility checker has an IsUnityCompatible method which returns false. - String[] incompatibleUnity = - fields - .Select(f => f.DeclaringType.GetMethod("IsUnityCompatible", Type.EmptyTypes)) - .Where(m => m != null) // Mods without IsUnityCompatible() are assumed to be compatible. - .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 IsUnityCompatible, it's not compatible. - Debug.LogWarning(String.Format("[CompatibilityChecker] Exception while invoking IsUnityCompatible() from '{0}':\n\n{1}", m.DeclaringType.Assembly.GetName().Name, e)); - return true; - } - }) - .Select(m => m.DeclaringType.Assembly.GetName().Name) - .ToArray(); - - Array.Sort(incompatible); - Array.Sort(incompatibleUnity); - - String message = String.Empty; - - /*if (IsWin64()) - { - message += "WARNING: You are using 64-bit KSP on Windows. This version of KSP is known to cause crashes. It's highly recommended that you use either 32-bit KSP on Windows or switch to Linux."; - }*/ - - if ((incompatible.Length > 0) || (incompatibleUnity.Length > 0)) { - message += ((message == String.Empty) ? "Some" : "\n\nAdditionally, some") + " installed mods may be incompatible with this version of Kerbal Space Program. Features may be broken or disabled. Please check for updates to the listed mods."; - - if (incompatible.Length > 0) { - Debug.LogWarning("[CompatibilityChecker] Incompatible mods detected: " + String.Join(", ", incompatible)); - message += String.Format("\n\nThese mods are incompatible with KSP {0}.{1}.{2}:\n\n", Versioning.version_major, Versioning.version_minor, Versioning.Revision); - message += String.Join("\n", incompatible); - } - - if (incompatibleUnity.Length > 0) { - Debug.LogWarning("[CompatibilityChecker] Incompatible mods (Unity) detected: " + String.Join(", ", incompatibleUnity)); - message += String.Format("\n\nThese mods are incompatible with Unity {0}:\n\n", Application.unityVersion); - message += String.Join("\n", incompatibleUnity); - } - } - - if ((incompatible.Length > 0) || (incompatibleUnity.Length > 0)) { - PopupDialog.SpawnPopupDialog(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), "CompatibilityCheckerDialog", "Incompatible Mods Detected", message, "OK", true, HighLogic.UISkin); - } - } - - public static bool IsWin64() { - return (IntPtr.Size == 8) && (Environment.OSVersion.Platform == PlatformID.Win32NT); - } - - public static bool IsAllCompatible() { - return IsCompatible() && IsUnityCompatible();// && !IsWin64(); - } - - private static IEnumerable 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; - } - } - } - } -} diff --git a/src/NodeManager.cs b/src/NodeManager.cs index 5d43473..f697bf2 100644 --- a/src/NodeManager.cs +++ b/src/NodeManager.cs @@ -60,8 +60,6 @@ internal ManeuverNode CurrentNode { } internal int CurrentNodeIdx { get; private set; } = -1; private int nodeCount = 0; - /* list that helps find the newly selected nodes */ - private List prevGizmos = null; /* Internal copy of the node */ private SavedNode currentSavedNode = null; private SavedNode CurrentSavedNode { @@ -333,30 +331,11 @@ internal void CircularizeOrbit () { internal void SearchNewGizmo () { var solver = FlightGlobals.ActiveVessel.patchedConicSolver; - var curList = solver.maneuverNodes.Where (a => a.attachedGizmo != null); - var tmp = curList.ToList (); - /* let's see if user is hovering a mouse * - * over any gizmo. That would be a hint. */ - if (curList.Count (a => a.attachedGizmo.MouseOverGizmo) == 1) { - var node = curList.First (a => a.attachedGizmo.MouseOverGizmo); - if (node != currentNode) { - currentNode = node; - NotifyNodeChanged (); - } - } else { - /* then, let's see if we can find any * - * new gizmos that were created recently. */ - if (prevGizmos != null) - curList = curList.Except (prevGizmos); - if (curList.Count () == 1) { - var node = curList.First (); - if (node != currentNode) { - currentNode = node; - NotifyNodeChanged (); - } - } + var curList = solver.maneuverNodes.Where (a => a.attachedGizmo != null && a != currentNode).ToArray(); + + if (curList.Length == 1) { + currentNode = curList.First (); } - prevGizmos = tmp; } private void UpdateCurrentNode () { diff --git a/src/NodeTools.cs b/src/NodeTools.cs index 709b7f4..ba4644e 100644 --- a/src/NodeTools.cs +++ b/src/NodeTools.cs @@ -38,6 +38,9 @@ internal static Orbit GetTargetOrbit (CelestialBody refbody) { return null; Orbit o = tgt.GetOrbit (); + if (o == null) + return null; + if (o.referenceBody == refbody) return o; diff --git a/src/PreciseManeuver.cs b/src/PreciseManeuver.cs index 6a8be05..c7fdad0 100644 --- a/src/PreciseManeuver.cs +++ b/src/PreciseManeuver.cs @@ -31,7 +31,7 @@ using KSP.Localization; namespace KSPPreciseManeuver { - [KSPAddon (KSPAddon.Startup.Flight, false)] + [KSPAddon (KSPAddon.Startup.Flight, true)] internal class PreciseManeuver : MonoBehaviour { private MainWindow mainWindow = new MainWindow(); private PreciseManeuverHotkeys hotkeys = new PreciseManeuverHotkeys(); @@ -47,12 +47,18 @@ internal class PreciseManeuver : MonoBehaviour { private GameObject m_WindowPrefab = PreciseManeuverConfig.Instance.Prefabs.LoadAsset ("PreciseManeuverWindow"); - private int waitForGizmo = 0; - internal void Start () { + DontDestroyOnLoad (this); + + GameEvents.onManeuverNodeSelected.Add (new EventVoid.OnEvent (manager.SearchNewGizmo)); + KACWrapper.InitKACWrapper (); } + internal void OnDestroy() { + GameEvents.onManeuverNodeSelected.Remove (new EventVoid.OnEvent (manager.SearchNewGizmo)); + } + internal void OnDisable () { CloseKeybindingsWindow (); CloseMainWindow (); @@ -81,13 +87,6 @@ internal void Update () { if (m_MainWindowObject != null) { hotkeys.ProcessRegularHotkeys (); - if (Input.GetMouseButtonUp (0)) - waitForGizmo = 3; - if (waitForGizmo > 0) { - if (waitForGizmo == 1) - manager.SearchNewGizmo (); - waitForGizmo--; - } manager.UpdateNodes (); } } diff --git a/src/PreciseManeuverToolbar.cs b/src/PreciseManeuverToolbar.cs index c783b14..1f9f385 100644 --- a/src/PreciseManeuverToolbar.cs +++ b/src/PreciseManeuverToolbar.cs @@ -34,11 +34,11 @@ namespace KSPPreciseManeuver { class PreciseManeuverToolbar : MonoBehaviour, UI.IMenuControl { private ApplicationLauncherButton appButton = null; - private Texture appButtonTexture = PreciseManeuverConfig.Instance.Prefabs.LoadAsset ("PreciseManeuverIcon"); + private Texture appButtonTexture; private UI.ToolbarMenu m_ToolbarMenu; private GameObject m_MenuObject; - private GameObject m_MenuPrefab = PreciseManeuverConfig.Instance.Prefabs.LoadAsset("PreciseManeuverMenu"); + private GameObject m_MenuPrefab; private bool m_MenuPointerIn = false; @@ -138,9 +138,12 @@ public void OnMenuPointerExit () { InputLockManager.RemoveControlLock ("PreciseManeuverMenuControlLock"); } - internal void Awake () { + internal void Start () { DontDestroyOnLoad (this); + appButtonTexture = PreciseManeuverConfig.Instance.Prefabs.LoadAsset ("PreciseManeuverIcon"); + m_MenuPrefab = PreciseManeuverConfig.Instance.Prefabs.LoadAsset ("PreciseManeuverMenu"); + // subscribe event listeners GameEvents.onGUIApplicationLauncherReady.Add (OnGUIApplicationLauncherReady); GameEvents.onGUIApplicationLauncherUnreadifying.Add (OnGUIApplicationLauncherUnreadifying);