diff --git a/Changelog.txt b/Changelog.txt index 16e9e66..d63cf02 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,12 @@ ChangeLog -0.1.10.13 (unreleased) - Fixed inputlogs not being cleared when canceling the window +0.1.10.13 + Fixed inputlocks not being cleared when canceling the window + Added mode toggle on new button to allow toggling between different modes during the game + Updated settings to make it clear if popup will be shown next time in the space center + Added code to disable the ShowPopup flag if the focusFollowsClick is changed in the settings + Thanks to github user @SteveBenz for this: + Make the configuration file not depend on Environment.CurrentDirectory and instead depend on the deployment location of the DLL 0.1.10.12 Fixed inputlocks not being cleared when setting FocusFollowsMouse diff --git a/ClickThroughBlocker.version b/ClickThroughBlocker.version index 1d74686..439eb7e 100644 --- a/ClickThroughBlocker.version +++ b/ClickThroughBlocker.version @@ -10,7 +10,7 @@ "MAJOR": 0, "MINOR": 1, "PATCH": 10, - "BUILD": 12 + "BUILD": 13 }, "KSP_VERSION_MIN": { "MAJOR": 1, diff --git a/ClickThroughBlocker/AssemblyVersion.cs b/ClickThroughBlocker/AssemblyVersion.cs index e2c8b6b..aad370f 100644 --- a/ClickThroughBlocker/AssemblyVersion.cs +++ b/ClickThroughBlocker/AssemblyVersion.cs @@ -5,4 +5,4 @@ using System.Reflection; - [assembly: AssemblyVersion("0.1.10.11")] + [assembly: AssemblyVersion("0.1.10.12")] diff --git a/ClickThroughBlocker/CBTGlobalMonitor.cs b/ClickThroughBlocker/CBTGlobalMonitor.cs index c33a6db..fb80189 100644 --- a/ClickThroughBlocker/CBTGlobalMonitor.cs +++ b/ClickThroughBlocker/CBTGlobalMonitor.cs @@ -29,7 +29,7 @@ void FixedUpdate() { globalTimeTics++; - if (HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick) + if (ClearInputLocks.focusFollowsclick) { foreach (var w in FocusLock.focusLockDict) { diff --git a/ClickThroughBlocker/CBTMonitor.cs b/ClickThroughBlocker/CBTMonitor.cs index cf8035e..506aadc 100644 --- a/ClickThroughBlocker/CBTMonitor.cs +++ b/ClickThroughBlocker/CBTMonitor.cs @@ -4,14 +4,13 @@ #if !DUMMY namespace ClickThroughFix { - //[KSPAddon(KSPAddon.Startup.SpaceCentre, true)] - [KSPAddon(KSPAddon.Startup.EditorAny, false)] + [KSPAddon(KSPAddon.Startup.SpaceCentre, true)] class CBTMonitor : MonoBehaviour { void Start() { - //DontDestroyOnLoad(this); - // GameEvents.onGameSceneLoadRequested.Add(onGameSceneLoadRequested); + DontDestroyOnLoad(this); + GameEvents.onGameSceneLoadRequested.Add(onGameSceneLoadRequested); ClickThruBlocker.CTBWin.activeBlockerCnt = 0; } @@ -26,10 +25,10 @@ void onGameSceneLoadRequested(GameScenes gs) // the mouse moved over a protected window void Update() { - if (HighLogic.CurrentGame == null || - HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick) // || + if (HighLogic.LoadedSceneIsEditor && ClearInputLocks.focusFollowsclick) // || //(!HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick && !HighLogic.LoadedSceneIsEditor)) return; + { if (ClickThruBlocker.CTBWin.activeBlockerCnt > 0) { @@ -69,8 +68,8 @@ void Update() int d; void LateUpdate() { - if (HighLogic.CurrentGame == null || - HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick) // || + if (HighLogic.CurrentGame == null || + ClearInputLocks.focusFollowsclick) // || //(!HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick && !HighLogic.LoadedSceneIsEditor)) return; diff --git a/ClickThroughBlocker/CBTMonitor.cs.bak b/ClickThroughBlocker/CBTMonitor.cs.bak new file mode 100644 index 0000000..cf8035e --- /dev/null +++ b/ClickThroughBlocker/CBTMonitor.cs.bak @@ -0,0 +1,97 @@ +using UnityEngine; +using KSP.UI.Screens; + +#if !DUMMY +namespace ClickThroughFix +{ + //[KSPAddon(KSPAddon.Startup.SpaceCentre, true)] + [KSPAddon(KSPAddon.Startup.EditorAny, false)] + class CBTMonitor : MonoBehaviour + { + void Start() + { + //DontDestroyOnLoad(this); + // GameEvents.onGameSceneLoadRequested.Add(onGameSceneLoadRequested); + ClickThruBlocker.CTBWin.activeBlockerCnt = 0; + } + + void onGameSceneLoadRequested(GameScenes gs) + { + ClickThruBlocker.CTBWin.activeBlockerCnt = 0; + } + + // this whole mess below is to work around a stock bug. + // The bug is that the editor ignores the lock when the Action Group pane is show. + // So we have to each time, clear all locks and then reset those which were active when + // the mouse moved over a protected window + void Update() + { + if (HighLogic.CurrentGame == null || + HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick) // || + //(!HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick && !HighLogic.LoadedSceneIsEditor)) + return; + { + if (ClickThruBlocker.CTBWin.activeBlockerCnt > 0) + { + //Log.Info("Setting Mouse.HoveredPart to null & deselecting all parts"); + Mouse.HoveredPart = null; + + if (EditorLogic.fetch == null) + { + return; + } + + for (int i = EditorLogic.fetch.ship.Parts.Count - 1; i >= 0; i--) + //for (int i = 0; i < EditorLogic.fetch.ship.Parts.Count; i++) + { + EditorActionPartSelector selector = EditorLogic.fetch.ship.Parts[i].GetComponent(); + if (selector != null) + selector.Deselect(); + } + + if (EditorActionGroups.Instance != null) + { + EditorActionGroups.Instance.ClearSelection(true); + for (int i = ClickThruBlocker.CTBWin.selectedParts.Count - 1; i >= 0; i--) + //for (int i = 0; i < ClickThruBlocker.CTBWin.selectedParts.Count; i++) + { + EditorActionPartSelector selector = ClickThruBlocker.CTBWin.selectedParts[i].GetComponent(); + if (selector != null) + EditorActionGroups.Instance.AddToSelection(selector); + } + } + } + + } + } + + //static internal long timeTics = 0; + int d; + void LateUpdate() + { + if (HighLogic.CurrentGame == null || + HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick) // || + //(!HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick && !HighLogic.LoadedSceneIsEditor)) + return; + + d = 0; + ClickThruBlocker.CTBWin win = null; + { + foreach (var w in ClickThruBlocker.winList) + { + if (w.Value.lastUpdated + 4 < CBTGlobalMonitor.globalTimeTics) //+ 0.05 < Planetarium.GetUniversalTime()) + { + d = w.Key; + win = w.Value; + break; + } + } + if (d != 0) + { + win.OnDestroy(); + } + } + } + } +} +#endif \ No newline at end of file diff --git a/ClickThroughBlocker/ClearInputLocks.cs b/ClickThroughBlocker/ClearInputLocks.cs index e0dc7b2..b91021c 100644 --- a/ClickThroughBlocker/ClearInputLocks.cs +++ b/ClickThroughBlocker/ClearInputLocks.cs @@ -7,14 +7,23 @@ using KSP.IO; using UnityEngine; -namespace ClearAllInputLocks +namespace ClickThroughFix { [KSPAddon(KSPAddon.Startup.AllGameScenes, false)] public class ClearInputLocks : MonoBehaviour { - internal const string MODID = "ClearInputLocks_ns"; - internal const string MODNAME = "Clear Input Locks"; + internal const string MODID = "CTB_ClearInputLocks_ns"; + internal const string MODID2 = "CTB_Toggle_ns"; + internal const string MODNAME = "ClickThroughBlocker: Clear Input Locks"; + internal const string MODNAME2 = "ClickThroughBlocker: Toggle Mode"; static internal ToolbarControl toolbarControl = null; + static internal ToolbarControl clickThroughToggleControl = null; + static internal bool focusFollowsclick = false; + + const string FFC_38 = "000_ClickThroughBlocker/PluginData/FFC-38"; + const string FFM_38 = "000_ClickThroughBlocker/PluginData/FFM-38"; + const string FFC_24 = "000_ClickThroughBlocker/PluginData/FFC-24"; + const string FFM_24 = "000_ClickThroughBlocker/PluginData/FFM-24"; void Start() @@ -26,10 +35,6 @@ void AddToolbarButton() { if (toolbarControl == null) { -#if false - public void AddToAllToolbars(TC_ClickHandler onTrue, TC_ClickHandler onFalse, TC_ClickHandler onHover, TC_ClickHandler onHoverOut, TC_ClickHandler onEnable, TC_ClickHandler onDisable, ApplicationLauncher.AppScenes visibleInScenes, string nameSpace, string toolbarId, string largeToolbarIcon, string smallToolbarIcon, string toolTip = ""); - -#endif toolbarControl = gameObject.AddComponent(); toolbarControl.AddToAllToolbars(null, null, ApplicationLauncher.AppScenes.SPACECENTER | @@ -42,9 +47,28 @@ void AddToolbarButton() "ClearInputLocks", "000_ClickThroughBlocker/PluginData/lock-38", "000_ClickThroughBlocker/PluginData/lock-24", - "Clear all input locks" + MODNAME ); toolbarControl.AddLeftRightClickCallbacks(ClearInputLocksToggle, CallModeWindow); + + + + clickThroughToggleControl = gameObject.AddComponent(); + clickThroughToggleControl.AddToAllToolbars(ToggleFocusSetting, ToggleFocusSetting, + ApplicationLauncher.AppScenes.SPACECENTER | + ApplicationLauncher.AppScenes.FLIGHT | + ApplicationLauncher.AppScenes.MAPVIEW | + ApplicationLauncher.AppScenes.VAB | + ApplicationLauncher.AppScenes.SPH | + ApplicationLauncher.AppScenes.TRACKSTATION, + MODID2, + "CTBToggle", + FFC_38, + FFM_38, + FFC_24, + FFM_24, + MODNAME2 + ); } } @@ -56,6 +80,15 @@ void OnDestroy() Destroy(toolbarControl); } } + + static internal void ToggleFocusSetting() + { + focusFollowsclick = !focusFollowsclick; + if (focusFollowsclick) + clickThroughToggleControl.SetTexture(FFC_38, FFC_24); + else + clickThroughToggleControl.SetTexture(FFM_38, FFM_24); + } static internal void ClearInputLocksToggle() { InputLockManager.ClearControlLocks(); diff --git a/ClickThroughBlocker/ClickThroughBlocker.cs b/ClickThroughBlocker/ClickThroughBlocker.cs index 00aa37b..46a38f8 100644 --- a/ClickThroughBlocker/ClickThroughBlocker.cs +++ b/ClickThroughBlocker/ClickThroughBlocker.cs @@ -69,7 +69,7 @@ internal void PreventEditorClickthrough(Rect r) //Log.Info("ClickThruBlocker: PreventEditorClickthrough"); bool mouseOverWindow = MouseIsOverWindow(r); //Log.Info("PreventEditorClickthrough, mouseOverWindow: " + mouseOverWindow); - if (HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick) + if (ClearInputLocks.focusFollowsclick) { bool mouseClicked = Input.GetMouseButton(0) || Input.GetMouseButton(1); if (mouseClicked) @@ -137,7 +137,7 @@ internal void PreventInFlightClickthrough(Rect r) // // This section for the Click to Focus option // - if (HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick) + if (ClearInputLocks.focusFollowsclick) { bool mouseClicked = Input.GetMouseButton(0) || Input.GetMouseButton(1); if (mouseClicked) diff --git a/ClickThroughBlocker/OnGUILoopCount.cs b/ClickThroughBlocker/OnGUILoopCount.cs index 769bee7..88b677b 100644 --- a/ClickThroughBlocker/OnGUILoopCount.cs +++ b/ClickThroughBlocker/OnGUILoopCount.cs @@ -22,7 +22,7 @@ private void Start() long lastonGuiCnt; private void DoGuiCounter() { - if (HighLogic.CurrentGame == null || HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick) + if (HighLogic.CurrentGame == null || ClearInputLocks.focusFollowsclick) return; lastonGuiCnt = (onguiCnt++) - 1; diff --git a/ClickThroughBlocker/OneTimePopup.cs b/ClickThroughBlocker/OneTimePopup.cs index 558f490..ba8c8b9 100644 --- a/ClickThroughBlocker/OneTimePopup.cs +++ b/ClickThroughBlocker/OneTimePopup.cs @@ -6,33 +6,41 @@ using ClickThroughFix; using System.Reflection; -namespace ClearAllInputLocks +namespace ClickThroughFix { - [KSPAddon(KSPAddon.Startup.SpaceCentre, true)] + [KSPAddon(KSPAddon.Startup.SpaceCentre, false)] public class OneTimePopup : MonoBehaviour { - const int WIDTH = 600; + internal static OneTimePopup Instance = null; + const int WIDTH = 600; const int HEIGHT = 350; Rect popupRect = new Rect(300, 50, WIDTH, HEIGHT); bool visible = false; string popUpShownCfgPath; string cancelStr = "Cancel (window will open next startup)"; - - public OneTimePopup() + Game curGame; + public void Awake() { popUpShownCfgPath = Path.Combine( - Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), - "../PluginData/PopUpShown.cfg"); + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "../PluginData/PopUpShown.cfg"); + if (HighLogic.CurrentGame != curGame) + { + ClearInputLocks.focusFollowsclick = HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick; + curGame = HighLogic.CurrentGame; + } + if (!HighLogic.CurrentGame.Parameters.CustomParams().showPopup) + Destroy(this); + Instance = this; } public void Start() { - if (HighLogic.CurrentGame.Parameters.CustomParams().showPopup || !System.IO.File.Exists(popUpShownCfgPath)) - visible = true; + + visible = true; if (ClearInputLocks.modeWindow != null) { visible = true; - focusFollowsClick = oldFocusFollowsClick = HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick; + focusFollowsClick = oldFocusFollowsClick = HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick; focusFollowsMouse = oldFocusFollowsMouse = !focusFollowsClick; cancelStr = "Cancel"; } @@ -45,12 +53,12 @@ public void Start() popupRect.y = (Screen.height - HEIGHT) / 2; } -#if false + void OnDestroy() { - InputLockManager.ClearControlLocks(); + Instance = null; } -#endif + public void OnGUI() { @@ -76,7 +84,7 @@ void PopUpWindow(int id) GUILayout.Label("you will need to click on a window for that window to have the focus, and the focus"); GUILayout.Label("won't leave the window without clicking outside the window"); GUILayout.Space(10); - GUILayout.Label("This window will only appear once to offer the choice of focus model. It can always"); + GUILayout.Label("This window will only appear once to offer the choice of focus model. It can always"); GUILayout.Label("be changed in the stock settings window, under the Click-Through-Blocker tab"); GUILayout.Space(20); focusFollowsMouse = GUILayout.Toggle(focusFollowsMouse, "Focus-Follows-Mouse"); @@ -85,7 +93,7 @@ void PopUpWindow(int id) { oldFocusFollowsMouse = true; focusFollowsClick = oldFocusFollowsClick = false; - } + } if (focusFollowsClick && !oldFocusFollowsClick) { oldFocusFollowsClick = true; @@ -96,15 +104,15 @@ void PopUpWindow(int id) GUILayout.BeginHorizontal(); if (GUILayout.Button("Accept")) { - HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick = focusFollowsClick; - HighLogic.CurrentGame.Parameters.CustomParams().showPopup = false; + HighLogic.CurrentGame.Parameters.CustomParams().focusFollowsclick = focusFollowsClick; + HighLogic.CurrentGame.Parameters.CustomParams().showPopup = false; CreatePopUpFlagFile(); ClearInputLocks.ClearInputLocksToggle(); visible = false; Destroy(this); } GUI.enabled = true; - + if (GUILayout.Button(cancelStr)) { visible = false; @@ -124,7 +132,7 @@ void CreatePopUpFlagFile() System.IO.File.WriteAllText(popUpShownCfgPath, "popupshown = true"); } - public static void RemovePopUpFlagFile() + public void RemovePopUpFlagFile() { System.IO.File.Delete(popUpShownCfgPath); } diff --git a/ClickThroughBlocker/RegisterToolbar.cs b/ClickThroughBlocker/RegisterToolbar.cs index 492d880..9071d2b 100644 --- a/ClickThroughBlocker/RegisterToolbar.cs +++ b/ClickThroughBlocker/RegisterToolbar.cs @@ -8,7 +8,7 @@ using UnityEngine; -namespace ClearAllInputLocks +namespace ClickThroughFix { [KSPAddon(KSPAddon.Startup.MainMenu, true)] public class RegisterToolbar : MonoBehaviour @@ -16,6 +16,7 @@ public class RegisterToolbar : MonoBehaviour void Start() { ToolbarControl.RegisterMod(ClearInputLocks.MODID, ClearInputLocks.MODNAME); + ToolbarControl.RegisterMod(ClearInputLocks.MODID2, ClearInputLocks.MODNAME2); } } } \ No newline at end of file diff --git a/ClickThroughBlocker/Settings.cs b/ClickThroughBlocker/Settings.cs index ecc337c..7e43d1c 100644 --- a/ClickThroughBlocker/Settings.cs +++ b/ClickThroughBlocker/Settings.cs @@ -26,17 +26,19 @@ public class CTB : GameParameters.CustomParameterNode public override int SectionOrder { get { return 1; } } public override bool HasPresets { get { return false; } } + [GameParameters.CustomParameterUI("Show Popup at next start", + toolTip = "Clearing this will allow the pop-up window to be displayed at the next game start.\nSetting it after clearing will allow the popup-window to be shown at the next start of a different save")] + public bool showPopup = true; + [GameParameters.CustomParameterUI("Focus follows mouse click", toolTip = "Click on a window to move the focus to it")] public bool focusFollowsclick = false; + [GameParameters.CustomParameterUI("Focus change is global", toolTip = "This will make it a global setting for all games")] public bool global = true; - [GameParameters.CustomParameterUI("Show Popup at next start", - toolTip = "Clearing this will allow the pop-up window to be displayed at the next game start.\nSetting it after clearing will allow the popup-window to be shown at the next start of a different save")] - public bool showPopup = true; [GameParameters.CustomFloatParameterUI("Cleanup delay", minValue = 0.1f, maxValue = 5f, displayFormat = "F2", toolTip = "Time to wait after scene change before clearing all the input locks")] @@ -44,10 +46,20 @@ public class CTB : GameParameters.CustomParameterNode public override bool Enabled(MemberInfo member, GameParameters parameters) { return true; } + bool? oldFocusFollowsClick; + public override bool Interactible(MemberInfo member, GameParameters parameters) { - if (showPopup) - ClearAllInputLocks.OneTimePopup.RemovePopUpFlagFile(); + if (oldFocusFollowsClick == null) + oldFocusFollowsClick = focusFollowsclick; + + if (oldFocusFollowsClick != focusFollowsclick) + { + oldFocusFollowsClick = focusFollowsclick; + showPopup = false; + } + if (showPopup && OneTimePopup.Instance != null) + OneTimePopup.Instance.RemovePopUpFlagFile(); return true; } diff --git a/GameData/000_ClickThroughBlocker/ClickThroughBlocker.version b/GameData/000_ClickThroughBlocker/ClickThroughBlocker.version index 31ccb6a..1d74686 100644 --- a/GameData/000_ClickThroughBlocker/ClickThroughBlocker.version +++ b/GameData/000_ClickThroughBlocker/ClickThroughBlocker.version @@ -10,7 +10,7 @@ "MAJOR": 0, "MINOR": 1, "PATCH": 10, - "BUILD": 11 + "BUILD": 12 }, "KSP_VERSION_MIN": { "MAJOR": 1, diff --git a/GameData/000_ClickThroughBlocker/PluginData/FFC-24.png b/GameData/000_ClickThroughBlocker/PluginData/FFC-24.png new file mode 100644 index 0000000..bb62671 Binary files /dev/null and b/GameData/000_ClickThroughBlocker/PluginData/FFC-24.png differ diff --git a/GameData/000_ClickThroughBlocker/PluginData/FFC-38.png b/GameData/000_ClickThroughBlocker/PluginData/FFC-38.png new file mode 100644 index 0000000..4cd100a Binary files /dev/null and b/GameData/000_ClickThroughBlocker/PluginData/FFC-38.png differ diff --git a/GameData/000_ClickThroughBlocker/PluginData/FFC.png b/GameData/000_ClickThroughBlocker/PluginData/FFC.png new file mode 100644 index 0000000..7b6dd4a Binary files /dev/null and b/GameData/000_ClickThroughBlocker/PluginData/FFC.png differ diff --git a/GameData/000_ClickThroughBlocker/PluginData/FFM-24.png b/GameData/000_ClickThroughBlocker/PluginData/FFM-24.png new file mode 100644 index 0000000..55c4dcf Binary files /dev/null and b/GameData/000_ClickThroughBlocker/PluginData/FFM-24.png differ diff --git a/GameData/000_ClickThroughBlocker/PluginData/FFM-38.png b/GameData/000_ClickThroughBlocker/PluginData/FFM-38.png new file mode 100644 index 0000000..f54b93b Binary files /dev/null and b/GameData/000_ClickThroughBlocker/PluginData/FFM-38.png differ diff --git a/GameData/000_ClickThroughBlocker/PluginData/FFM.png b/GameData/000_ClickThroughBlocker/PluginData/FFM.png new file mode 100644 index 0000000..e01b981 Binary files /dev/null and b/GameData/000_ClickThroughBlocker/PluginData/FFM.png differ diff --git a/GameData/000_ClickThroughBlocker/changelog.cfg b/GameData/000_ClickThroughBlocker/changelog.cfg index 2f18221..3dbfebf 100644 --- a/GameData/000_ClickThroughBlocker/changelog.cfg +++ b/GameData/000_ClickThroughBlocker/changelog.cfg @@ -5,6 +5,27 @@ KERBALCHANGELOG license = Lesser GPLv3 author = Linuxgurugamer + + + + VERSION + { + version = 0.1.10.13 + CHANGE + { + change = Fixed inputlogs not being cleared when canceling the window + type = update + } + } + VERSION + { + version = 0.1.10.12 + CHANGE + { + change = Fixed inputlocks not being cleared when setting FocusFollowsMouse + type = update + } + } VERSION { version = 0.1.10.11 diff --git a/changelog.cfg b/changelog.cfg index 3dbfebf..a1d4792 100644 --- a/changelog.cfg +++ b/changelog.cfg @@ -13,7 +13,11 @@ KERBALCHANGELOG version = 0.1.10.13 CHANGE { - change = Fixed inputlogs not being cleared when canceling the window + change = Fixed inputlocks not being cleared when canceling the window + change = Added mode toggle on new button to allow toggling between different modes during the game + change = Updated settings to make it clear if popup will be shown next time in the space center + change = Added code to disable the ShowPopup flag if the focusFollowsClick is changed in the settings + change = Thanks to github user @SteveBenz for this: Make the configuration file not depend on Environment.CurrentDirectory and instead depend on the deployment location of the DLL type = update } } diff --git a/deploy.bat b/deploy.bat index 1cfc034..f2b40ae 100644 --- a/deploy.bat +++ b/deploy.bat @@ -8,7 +8,7 @@ rem VERSIONFILE is the name of the version file, usually the same as GAMEDATA, rem but not always set H=%KSPDIR% - +set H=R:\KSP_1.10.1_dev set GAMEDIR=000_ClickThroughBlocker set GAMEDATA="GameData\" set VERSIONFILE=ClickThroughBlocker.version