From 0f747dfa7a0c9603be849f70152303320b1c5292 Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 00:50:48 +0200 Subject: [PATCH 01/13] - Bumped version to 1.2, compatbility with KSP 1.12.3 (untested with older versions, but should probably work fine) - Updated csproj with automatic references, debugging support, etc (add a ReferencePath to your KSP install for this stuff to work) - Added gitignore file - Removed AssetLoader, use standard KSP png loading instead with an on-demand pattern - Got ride of the PartModule, use stock method for getting the available SAS level instead - Handle available SAS changes - Prevent the VesselModule from running on unloaded vessels - Various optimizations --- .gitignore | 340 ++++++++++++++++++ .../SmartDockingAid/Assets/ParallelMinus.png | Bin 0 -> 257 bytes .../SmartDockingAid/Assets/ParallelPlus.png | Bin 0 -> 265 bytes GameData/SmartDockingAid/Assets/assets | Bin 3067 -> 0 bytes GameData/SmartDockingAid/Assets/assets.ksp | Bin 3067 -> 0 bytes GameData/SmartDockingAid/SDA.version | 12 +- GameData/SmartDockingAid/SmartDockingAid.cfg | 32 +- GameData/SmartDockingAid/SmartDockingAid.dll | Bin 17408 -> 15360 bytes Source/AssetLoader.cs | 61 ---- Source/Modules/ModuleDockingAid.cs | 18 - Source/Modules/VesselDockingAid.cs | 90 ----- Source/Properties/AssemblyInfo.cs | 4 +- Source/SmartDockingAid.cs | 176 ++++++--- Source/SmartDockingAid.csproj | 137 ++++--- Source/SmartDockingAid.sln | 6 + Source/VesselDockingAid.cs | 59 +++ 16 files changed, 648 insertions(+), 287 deletions(-) create mode 100644 .gitignore create mode 100644 GameData/SmartDockingAid/Assets/ParallelMinus.png create mode 100644 GameData/SmartDockingAid/Assets/ParallelPlus.png delete mode 100644 GameData/SmartDockingAid/Assets/assets delete mode 100644 GameData/SmartDockingAid/Assets/assets.ksp delete mode 100644 Source/AssetLoader.cs delete mode 100644 Source/Modules/ModuleDockingAid.cs delete mode 100644 Source/Modules/VesselDockingAid.cs create mode 100644 Source/VesselDockingAid.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ce6fdd --- /dev/null +++ b/.gitignore @@ -0,0 +1,340 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- Backup*.rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb \ No newline at end of file diff --git a/GameData/SmartDockingAid/Assets/ParallelMinus.png b/GameData/SmartDockingAid/Assets/ParallelMinus.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e4c756734164ea81e20083281f2202a9939a12 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!D*f@jv*HQYbRagY%t()VO{O z8MoN?7KDXtVUt^SGWOQ0Sg)0w@jcV*1*7x@>{51|;ExjBYnX1Z=IKjITP3qkj0y)Q z-82eroFmn!W|PNOHgSWT!v$yIdAH643UbRUl+3-%z&nxiSJQPpe+FOXj6X%K=k*0= x*(G1@S1C3zstY*}H1Fz%ud)l*O6z;x<-3++=d&Z#3bFexTy?RSw0CoUUZHre*Zzp+2c>cb^i4&=0J*hebOiE1z$KgmQFvh z?2BaPv^o`5hL_hnI8CK&f3`8SGCW()>9Fs@`(^XDykz0x)YEJ7J-Z0#QU*^~KbLh* G2~7Z#E@2@6 literal 0 HcmV?d00001 diff --git a/GameData/SmartDockingAid/Assets/assets b/GameData/SmartDockingAid/Assets/assets deleted file mode 100644 index 0749eb5cfc4d4f425598a7a87011f893b2e84aa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3067 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 literal 17408 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 BAR7Px diff --git a/Source/AssetLoader.cs b/Source/AssetLoader.cs deleted file mode 100644 index faf673c..0000000 --- a/Source/AssetLoader.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; - -namespace SmartDockingAid -{ - [KSPAddon(KSPAddon.Startup.Instantly, true)] - public class AssetLoader : MonoBehaviour - { - public static Texture2D parallelMinus = new Texture2D(16, 16, TextureFormat.DXT5, false); - public static Texture2D parallelPlus = new Texture2D(16, 16, TextureFormat.DXT5, false); - public static int minPilotLevel = 3; - //public static GameObject rotSlider; - - public void Awake() - { - string path = KSPUtil.ApplicationRootPath + "GameData/SmartDockingAid/"; - AssetBundle asset = AssetBundle.LoadFromFile(path + "Assets/assets"); - - if (asset == null) - { - Debug.Log($"[SmartDockingAid] Failed to load bundle"); - Debug.Log($"[SmartDockingAid] {path}"); - } - else - { - parallelMinus = asset.LoadAsset("ParallelMinus"); - parallelPlus = asset.LoadAsset("ParallelPlus"); - //rotSlider = textures.LoadAsset("SliderPanel") as GameObject; - - Debug.Log($"[SmartDockingAid] Bundle loaded sucessfully"); - Debug.Log($"[SmartDockingAid] {path}"); - } - - if (GameDatabase.Instance.ExistsConfigNode("SmartDockingAid/SDASETTINGS")) - { - ConfigNode node = GameDatabase.Instance.GetConfigNode("SmartDockingAid/SDASETTINGS"); - if (node.HasValue("minPilotExperience")) - { - if (Int32.TryParse(node.GetValue("minPilotExperience"), out minPilotLevel)) - { - Debug.Log($"[SmartDockingAid] Settings applied"); - } - else - { - Debug.Log($"[SmartDockingAid] minPilotExperience is not a valid number"); - Debug.Log($"[SmartDockingAid] Default settings will be applied"); - } - } - } - else - { - Debug.Log($"[SmartDockingAid] Settings file could not be located"); - Debug.Log($"[SmartDockingAid] Default settings will be applied"); - } - } - } -} diff --git a/Source/Modules/ModuleDockingAid.cs b/Source/Modules/ModuleDockingAid.cs deleted file mode 100644 index b6ef33b..0000000 --- a/Source/Modules/ModuleDockingAid.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; - -// Modifies DockingAidAutopilot to be active if this PartModule is presence on the current vessel - -namespace SmartDockingAid -{ - public class ModuleDockingAid : PartModule - { - [KSPField] - public bool active = true; - } -} diff --git a/Source/Modules/VesselDockingAid.cs b/Source/Modules/VesselDockingAid.cs deleted file mode 100644 index 29094fd..0000000 --- a/Source/Modules/VesselDockingAid.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Reflection; -using UnityEngine; -using SmartDockingAid.Flight; - -namespace SmartDockingAid -{ - class VesselDockingAid : VesselModule - { - public SmartDockingAid.TargetMode targetMode { get; private set; } - - private ITargetable target; - - private List crew = new List(); - - private bool pilotAvailable; - private bool moduleAvailable; - private bool active = false; - - public bool Setup() - { - pilotAvailable = false; - moduleAvailable = false; - - pilotAvailable = vessel.GetVesselCrew().Any(c => c.experienceTrait.CrewMemberExperienceLevel() > AssetLoader.minPilotLevel); - - foreach (Part part in vessel.parts) - { - if (part.HasModuleImplementing()) - { - ModuleDockingAid moduleDockingAid = part.Modules.GetModule(); - if (!moduleDockingAid.active) continue; - moduleAvailable = true; - } - } - - return (pilotAvailable || moduleAvailable || HighLogic.CurrentGame.Parameters.CustomParams().EnableFullSASInSandbox); - } - - public void changeSASstate(bool isOn) - { - if (isOn) - { - vessel.Autopilot.Enable(); - } - else - { - vessel.Autopilot.Disable(); - } - } - - - public void onModeChange(SmartDockingAid.TargetMode targetMode) - { - this.targetMode = targetMode; - if (targetMode != SmartDockingAid.TargetMode.OFF) - { - vessel.Autopilot.SetMode(VesselAutopilot.AutopilotMode.StabilityAssist); - active = true; - } - else - { - active = false; - if (vessel.Autopilot.Mode == VesselAutopilot.AutopilotMode.StabilityAssist) - { - vessel.Autopilot.SAS.lockedMode = true; - } - } - } - - public void Update() - { - if (HighLogic.LoadedScene == GameScenes.FLIGHT && active) - { - if (!vessel.IsControllable || !vessel.Autopilot.Enabled) - return; - - if (vessel.targetObject != null) - target = vessel.targetObject; - - vessel.Autopilot.SAS.lockedMode = false; - vessel.Autopilot.SAS.SetTargetOrientation(target.getAttitude(targetMode), false); - } - } - } -} diff --git a/Source/Properties/AssemblyInfo.cs b/Source/Properties/AssemblyInfo.cs index 7e4e2a5..6e29ed5 100644 --- a/Source/Properties/AssemblyInfo.cs +++ b/Source/Properties/AssemblyInfo.cs @@ -27,5 +27,5 @@ // You can specify all the values or you can use the default the Revision and // Build Numbers by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/Source/SmartDockingAid.cs b/Source/SmartDockingAid.cs index d8084ab..8156c32 100644 --- a/Source/SmartDockingAid.cs +++ b/Source/SmartDockingAid.cs @@ -1,18 +1,95 @@ -using UnityEngine; -using UnityEngine.UI; +using System; +using System.Collections; using KSP.UI; using KSP.UI.TooltipTypes; -using KSP.UI.Screens.Flight; using SmartDockingAid.UI; -using System; +using UnityEngine; +using UnityEngine.UI; namespace SmartDockingAid { [KSPAddon(KSPAddon.Startup.Flight, false)] public class SmartDockingAid : MonoBehaviour { + private static Sprite _parallelMinusSprite; + private static Sprite _parallelPlusSprite; + private static VesselAutopilot.AutopilotMode? _availableAtSASMode; + + + public static Sprite ParallelMinusSprite + { + get + { + if (_parallelMinusSprite == null) + { + Texture2D tex = GameDatabase.Instance.GetTexture("SmartDockingAid/Assets/ParallelMinus", false); + if (tex == null) + { + tex = new Texture2D(16, 16); + Debug.LogError($"[SmartDockingAid] Failed to load texture \"SmartDockingAid/Assets/ParallelMinus\""); + } + + _parallelMinusSprite = tex.toSprite(); + } + + return _parallelMinusSprite; + } + } + + public static Sprite ParallelPlusSprite + { + get + { + if (_parallelPlusSprite == null) + { + Texture2D tex = GameDatabase.Instance.GetTexture("SmartDockingAid/Assets/ParallelPlus", false); + if (tex == null) + { + tex = new Texture2D(16, 16); + Debug.LogError($"[SmartDockingAid] Failed to load texture \"SmartDockingAid/Assets/ParallelPlus\""); + } + + _parallelPlusSprite = tex.toSprite(); + } + + return _parallelPlusSprite; + } + } + + public static VesselAutopilot.AutopilotMode AvailableAtSASMode + { + get + { + if (_availableAtSASMode == null) + { + ConfigNode node = GameDatabase.Instance.GetConfigNode("SmartDockingAid/SDASETTINGS"); + if (node == null) + { + Debug.LogWarning($"[SmartDockingAid] Settings file could not be located"); + } + else + { + string val = node.GetValue("availableAtSASMode"); + if (string.IsNullOrEmpty(val) || !Enum.TryParse(val, out VesselAutopilot.AutopilotMode mode)) + Debug.LogWarning($"[SmartDockingAid] No valid \"minPilotExperience\" value found in settings file"); + else + _availableAtSASMode = mode; + } + + if (_availableAtSASMode == null) + { + _availableAtSASMode = VesselAutopilot.AutopilotMode.Target; + Debug.Log($"[SmartDockingAid] Default settings will be applied"); + } + } + + return (VesselAutopilot.AutopilotMode)_availableAtSASMode; + } + } + private const string DISPLAYNAME = "SmartDockingAid"; + private UIStateToggleButton[] modebuttons; private UIStateToggleButton.ButtonState buttonActive; @@ -21,10 +98,9 @@ public class SmartDockingAid : MonoBehaviour private UIStateToggleButton parallelPlus; private UIStateToggleButton parallelNegative; - private Vessel vessel; - private VesselDockingAid vesselDockingAid; + private VesselModuleDockingAid VesselModule => FlightGlobals.ActiveVessel.FindVesselModuleImplementing(); - private bool autopilotState; + private bool isAvailable; private bool buttonInit = false; private bool SASstate; @@ -42,13 +118,15 @@ public void Start() GameEvents.onDockingComplete.Add(onDockingComplete); GameEvents.onGameSceneSwitchRequested.Add(onGameScenceSwitch); GameEvents.OnGameSettingsApplied.Add(OnGameSettingsApplied); + GameEvents.onKerbalLevelUp.Add(OnKerbalLevelUp); } private void onFlightReady() { if (!buttonInit) { - modebuttons = FindObjectOfType().modeButtons; + VesselAutopilotUI autopilotUI = FlightUIModeController.Instance.navBall.GetComponentInChildren(); + modebuttons = autopilotUI.modeButtons; modebuttons[0].getSpriteStates(out buttonActive, out buttonDisabled); foreach (UIStateToggleButton button in modebuttons) @@ -87,36 +165,32 @@ private void onFlightReady() this.parallelPlus.transform.position = new Vector3(parallelPlus.gameObject.transform.position.x + ((4 * GameSettings.UI_SCALE_NAVBALL) * GameSettings.UI_SCALE), parallelPlus.gameObject.transform.position.y - ((25 * GameSettings.UI_SCALE_NAVBALL) * GameSettings.UI_SCALE)); parallelNegative.GetComponent().textString = "Parallel -"; - parallelNegative.GetChild("Image").GetComponent().sprite = AssetLoader.parallelMinus.toSprite(); - parallelNegative.transform.SetParent(UnityEngine.Object.FindObjectOfType().transform); + parallelNegative.GetChild("Image").GetComponent().sprite = ParallelMinusSprite; + parallelNegative.transform.SetParent(autopilotUI.transform); parallelPlus.GetComponent().textString = "Parallel +"; - parallelPlus.GetChild("Image").GetComponent().sprite = AssetLoader.parallelPlus.toSprite(); - parallelPlus.transform.SetParent(UnityEngine.Object.FindObjectOfType().transform); + parallelPlus.GetChild("Image").GetComponent().sprite = ParallelPlusSprite; + parallelPlus.transform.SetParent(autopilotUI.transform); buttonInit = true; - - Debug.Log($"[{DISPLAYNAME}] UI initiated"); } - vessel = FlightGlobals.ActiveVessel; - SetNewState(false, true); + SetNewState(true); } - private void SetNewState(bool disable, bool reset) + private void SetNewState(bool reset) { if (reset) { - vesselDockingAid = vessel.GetComponent() as VesselDockingAid; - autopilotState = vesselDockingAid.Setup(); - SASstate = vessel.Autopilot.Enabled; + SASstate = FlightGlobals.ActiveVessel.Autopilot.Enabled; + isAvailable = AvailableAtSASMode.AvailableAtLevel(FlightGlobals.ActiveVessel); } - if (autopilotState && !disable) + if (isAvailable) { parallelPlus.gameObject.SetActive(true); parallelNegative.gameObject.SetActive(true); - switch(vesselDockingAid.targetMode) + switch(VesselModule.targetMode) { case TargetMode.OFF: modebuttons[0].changeState(buttonActive); @@ -144,19 +218,29 @@ private void SetNewState(bool disable, bool reset) private void onVesselChange(Vessel vessel1, Vessel vessel2) { - vessel = vessel2 != null ? vessel2 : vessel1; - SetNewState(false, true); + SetNewState(true); } private void onDockingComplete(GameEvents.FromToAction part) { - vessel = FlightGlobals.ActiveVessel; - SetNewState(true, true); + SetNewState(true); } private void OnGameSettingsApplied() { - SetNewState(false, true); + SetNewState(true); + } + + private void OnKerbalLevelUp(ProtoCrewMember data) + { + StartCoroutine(OnKerbalLevelUpDelayed()); + } + + private IEnumerator OnKerbalLevelUpDelayed() + { + yield return new WaitForEndOfFrame(); + yield return new WaitForEndOfFrame(); + SetNewState(true); } private void onToggleButtonPressed(UIStateToggleButton button) @@ -165,24 +249,24 @@ private void onToggleButtonPressed(UIStateToggleButton button) if (button == parallelNegative) { - vesselDockingAid.onModeChange(TargetMode.PARALLEL_NEGATIVE); - SetNewState(false, false); + VesselModule.onModeChange(TargetMode.PARALLEL_NEGATIVE); + SetNewState(false); } else { - vesselDockingAid.onModeChange(TargetMode.PARALLEL_PLUS); - SetNewState(false, false); + VesselModule.onModeChange(TargetMode.PARALLEL_PLUS); + SetNewState(false); } } private void onSASbuttonPressed(UIStateToggleButton button) { - if (autopilotState) + if (isAvailable) { parallelNegative.SetState(false); parallelPlus.SetState(false); - vesselDockingAid.onModeChange(TargetMode.OFF); - SetNewState(false, false); + VesselModule.onModeChange(TargetMode.OFF); + SetNewState(false); } } @@ -193,8 +277,8 @@ private void onButtonInteractableStateChanged() if (!modebuttons[8].interactable) { - vesselDockingAid.onModeChange(TargetMode.OFF); - SetNewState(false, false); + VesselModule.onModeChange(TargetMode.OFF); + SetNewState(false); } } @@ -205,24 +289,24 @@ private void onButtonStateChanged() if (!modebuttons[8].gameObject.activeSelf) { - vesselDockingAid.onModeChange(TargetMode.OFF); + VesselModule.onModeChange(TargetMode.OFF); } } private void onSASStateChanged() { - SASstate = vessel.Autopilot.Enabled; + SASstate = FlightGlobals.ActiveVessel.Autopilot.Enabled; - if (!vessel.Autopilot.Enabled) + if (!FlightGlobals.ActiveVessel.Autopilot.Enabled) { - vesselDockingAid.onModeChange(TargetMode.OFF); - SetNewState(false, false); + VesselModule.onModeChange(TargetMode.OFF); + SetNewState(false); } } public void Update() { - if (autopilotState) + if (isAvailable) { if (modebuttons[8].gameObject.activeSelf != parallelNegative.gameObject.activeSelf) onButtonStateChanged(); @@ -230,15 +314,13 @@ public void Update() if (modebuttons[8].interactable != parallelNegative.interactable) onButtonInteractableStateChanged(); - if (vessel.Autopilot.Enabled != SASstate) + if (FlightGlobals.ActiveVessel.Autopilot.Enabled != SASstate) onSASStateChanged(); } } private void onGameScenceSwitch(GameEvents.FromToAction data) { - Debug.Log($"[{DISPLAYNAME}] Destroy()"); - parallelNegative.onClick.RemoveAllListeners(); parallelPlus.onClick.RemoveAllListeners(); @@ -251,8 +333,7 @@ private void onGameScenceSwitch(GameEvents.FromToAction Destroy(parallelPlus.gameObject); buttonInit = false; - vesselDockingAid = null; - autopilotState = false; + isAvailable = false; } public void OnDestroy() @@ -262,6 +343,7 @@ public void OnDestroy() GameEvents.onDockingComplete.Remove(onDockingComplete); GameEvents.onGameSceneSwitchRequested.Remove(onGameScenceSwitch); GameEvents.OnGameSettingsApplied.Remove(OnGameSettingsApplied); + GameEvents.onKerbalLevelUp.Remove(OnKerbalLevelUp); } } } diff --git a/Source/SmartDockingAid.csproj b/Source/SmartDockingAid.csproj index 2f5ce6d..1a6e6c9 100644 --- a/Source/SmartDockingAid.csproj +++ b/Source/SmartDockingAid.csproj @@ -1,6 +1,16 @@  + + + KSP_x64.exe + KSP.app + KSP.x86_64 + KSP_x64_Data\Managed + KSP.app\Contents\Resources\Data\Managed + KSP_Data\Managed + $(ReferencePath)\$(ManagedRelativePath) + Debug AnyCPU @@ -12,10 +22,13 @@ v4.7.2 512 true + Program + $(ReferencePath)\$(KSPExecutable) + $(ReferencePath) true - full + portable false bin\Debug\ DEBUG;TRACE @@ -31,63 +44,99 @@ 4 - - G:\SteamLibrary\steamapps\common\Kerbal Space Program\KSP_x64_Data\Managed\Assembly-CSharp.dll + + System (KSP/Mono) + False - - G:\SteamLibrary\steamapps\common\Kerbal Space Program\KSP_x64_Data\Managed\Assembly-CSharp-firstpass.dll + + System.Core (KSP/Mono) + False - - - - - - - - - - G:\SteamLibrary\steamapps\common\Kerbal Space Program\KSP_x64_Data\Managed\UnityEngine.dll + + System.Xml (KSP/Mono) + False - - False - G:\SteamLibrary\steamapps\common\Kerbal Space Program\KSP_x64_Data\Managed\UnityEngine.AssetBundleModule.dll + + UnityEngine + False - - G:\SteamLibrary\steamapps\common\Kerbal Space Program\KSP_x64_Data\Managed\UnityEngine.CoreModule.dll + + Assembly-CSharp + False - - G:\SteamLibrary\steamapps\common\Kerbal Space Program\KSP_x64_Data\Managed\UnityEngine.UI.dll - - - G:\SteamLibrary\steamapps\common\Kerbal Space Program\KSP_x64_Data\Managed\UnityEngine.UIModule.dll + + Assembly-CSharp-firstpass + False - - - + - - True - True - Settings.settings - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - + + - - - - - xcopy /Y "$(TargetPath)" "G:\KSP\1.8.1 QuickTest-Stock\GameData\SmartDockingAid\" + $(SolutionDir)\..\ + SmartDockingAid + false + true + + + + + + + + + + + + + + + + + + $(ReferencePath)\GameData\$(GameDataFolderName)\Plugins + $(ReferencePath)\GameData\$(GameDataFolderName) + + + + + + + + + $(RepoRootPath)\GameData\$(GameDataFolderName)\Plugins + $(RepoRootPath)\GameData\$(GameDataFolderName) + + + + + + + + $(RepoRootPath)\Releases + $(PublishFolder)\Temp + $(PublishTempFolderPath)\GameData\$(GameDataFolderName) + $(PublishPluginRootPath)\Plugins + $(PublishPluginRootPath) + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/SmartDockingAid.sln b/Source/SmartDockingAid.sln index a8121a7..7e52647 100644 --- a/Source/SmartDockingAid.sln +++ b/Source/SmartDockingAid.sln @@ -5,6 +5,12 @@ VisualStudioVersion = 16.0.30309.148 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartDockingAid", "SmartDockingAid.csproj", "{D0BC8A2F-ADE3-49FF-88CD-C606E356732B}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A61B2D5B-8B56-403E-A367-1BF8FE4B6933}" + ProjectSection(SolutionItems) = preProject + ..\README.md = ..\README.md + ..\GameData\SmartDockingAid\SDA.version = ..\GameData\SmartDockingAid\SDA.version + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/Source/VesselDockingAid.cs b/Source/VesselDockingAid.cs new file mode 100644 index 0000000..efebb85 --- /dev/null +++ b/Source/VesselDockingAid.cs @@ -0,0 +1,59 @@ +using SmartDockingAid.Flight; + +namespace SmartDockingAid +{ + class VesselModuleDockingAid : VesselModule + { + public SmartDockingAid.TargetMode targetMode { get; private set; } + + private bool active = false; + + public override Activation GetActivation() + { + return Activation.LoadedVessels; + } + + public void changeSASstate(bool isOn) + { + if (isOn) + { + vessel.Autopilot.Enable(); + } + else + { + vessel.Autopilot.Disable(); + } + } + + + public void onModeChange(SmartDockingAid.TargetMode targetMode) + { + this.targetMode = targetMode; + if (targetMode != SmartDockingAid.TargetMode.OFF) + { + vessel.Autopilot.SetMode(VesselAutopilot.AutopilotMode.StabilityAssist); + active = true; + } + else + { + active = false; + if (vessel.Autopilot.Mode == VesselAutopilot.AutopilotMode.StabilityAssist) + { + vessel.Autopilot.SAS.lockedMode = true; + } + } + } + + public void Update() + { + if (HighLogic.LoadedScene == GameScenes.FLIGHT && active) + { + if (!vessel.IsControllable || !vessel.Autopilot.Enabled || vessel.targetObject == null) + return; + + vessel.Autopilot.SAS.lockedMode = false; + vessel.Autopilot.SAS.SetTargetOrientation(vessel.targetObject.getAttitude(targetMode), false); + } + } + } +} From 7b07b0e51cb1cf48e7f44fbca0e8bd8358bab0e9 Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 00:53:31 +0200 Subject: [PATCH 02/13] Fix csproj --- Source/SmartDockingAid.csproj | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/Source/SmartDockingAid.csproj b/Source/SmartDockingAid.csproj index 1a6e6c9..0a37bab 100644 --- a/Source/SmartDockingAid.csproj +++ b/Source/SmartDockingAid.csproj @@ -1,7 +1,7 @@  - + KSP_x64.exe KSP.app @@ -78,39 +78,31 @@ - $(SolutionDir)\..\ SmartDockingAid false true - - - + - - + + - - $(ReferencePath)\GameData\$(GameDataFolderName)\Plugins $(ReferencePath)\GameData\$(GameDataFolderName) - - $(RepoRootPath)\GameData\$(GameDataFolderName)\Plugins @@ -119,7 +111,6 @@ - $(RepoRootPath)\Releases @@ -132,7 +123,6 @@ - From 5e84605a23d87dae63232213d01775a4d1ee82aa Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 01:01:47 +0200 Subject: [PATCH 03/13] Add csproj.user to solution items --- Source/SmartDockingAid.sln | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/SmartDockingAid.sln b/Source/SmartDockingAid.sln index 7e52647..88fd4f7 100644 --- a/Source/SmartDockingAid.sln +++ b/Source/SmartDockingAid.sln @@ -9,6 +9,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject ..\README.md = ..\README.md ..\GameData\SmartDockingAid\SDA.version = ..\GameData\SmartDockingAid\SDA.version + SmartDockingAid.csproj.user = SmartDockingAid.csproj.user EndProjectSection EndProject Global From ce1f3538e6897dc9f32a83e4a3cd9bf10b7c068c Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 01:14:21 +0200 Subject: [PATCH 04/13] Update readme with build instructions --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 40fbfe7..b6a9c95 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,19 @@ Smart Docking Aid adds two new SAS modes to level 3 probe cores and level 3 pilo ### License This work is licensed under the Attribution-NonCommercial-ShareAlike 4.0 International license (CC BY-NC-SA 4.0) + +### Building +After loading the solution in your IDE, add a `ReferencePath` to the root of your KSP install : + +For Visual Studio, right-click on the `SmartDockingAid` project > `Properties` > `Reference Paths`, then save, close and re-open the solution for the changes to propagate. + +Alternatively, create a `SmartDockingAid.csproj.user` file in the `Source` folder, with the follwowing content : +```xml + + + + Absolute\Path\To\Your\KSP\Install + + +``` +Then close / re-open the solution. \ No newline at end of file From 85dfd392b1733a0a9e508a86049d3896898dd1fc Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 01:56:15 +0200 Subject: [PATCH 05/13] Restore SAS GetInfo() override (wasn't in compile ???) Refactored it a bit for performance, error handling and not overriding stock localization. --- GameData/SmartDockingAid/SmartDockingAid.dll | Bin 15360 -> 16896 bytes Source/Extensions/OverwriteModuleText.cs | 61 +++++++++++-------- Source/SmartDockingAid.cs | 27 +++++++- Source/SmartDockingAid.csproj | 1 + 4 files changed, 61 insertions(+), 28 deletions(-) diff --git a/GameData/SmartDockingAid/SmartDockingAid.dll b/GameData/SmartDockingAid/SmartDockingAid.dll index a156289ca8cdcfd0e1b2aa6571778a1869a8fc36..d51a667fcb4e092cfc38972bb1062693398e8a08 100644 GIT binary patch delta 7757 zcmZu$349b)n*ZLbuIlRQBkAs>6G8%=07<8F7ziRT;YbLV1Pulu2nr!-FiS|sbaR9d zx+97LieM=U>JB=CE1o#GD&vY~yucmNxVo!59`GA=*JV8zo!J#yxZdzDUdeewpj^X7tsJ*!Vp>T`k$f=*UJG!YEVV%9Y7dU%27>xD#@3&t{{hm>9U zepiyn1-cf3@n$|RH5aiWW7c@Eg19D{+gJ&!GM{EeY^wPYD;P4e5o~;B;o_vyzKe){ zT|~sp(PJ+$>-lU}VD9A$fq&u;&hb|;nhH&Y$QuG^hBn=hGl^`ti%SGJ_|ie2yGryx zI4hhT9uf|icPaTXw#5Zp?^9V@sO zTU@8U!DQDs1GLf6%TlzfzYaP#$Osl&+$+ zQhk6%sj@}NlfjNo8IbYrLC!1_gPaLQ=MjZEqB93(1fp1eL?&c`=jx)q0Dbmfa)k1T={ow?b&c?GsNL0fr_$w3&GD35aS1AqiP?0dP zNWfKq9;eWj-6SQU#e(S&%x-}bUco|IvB}zIMQfm7m2og51p8Wa2q1y3#G(^?QW-9| zqVT|y%j$$iK<`|_R`Oz5tU?UZm5pKPo|jwmvSiVIPB&o%XDJMJ0%c)EMjc3{AVRk#+@Bl}ErNUQfDpRyVMLn*cN_o~T;>z5 zoKd12ArBP7IhPs5y4FF^OaPWK->IUJocW=ZkLq3QTHK8mSQG`LczrAFV*Iw%JYMtpe>IiL?Y_HvGs}ww(Vgo#F(+v=M?Ry85vKsw%uicT= zC?z{uLs&0k%t5_-3+|#+=L-^O!4`8O7vz>sp)$6RuE-=c&QRzww)JwRj<~w z9W)Ab3vLtNJ^RBCA9;LqHh?7<8pZi*d=ReA74IlSXl)vUqD{hub(5cAJhTEzVSfV8 z*<~rFl3f|*Yw(<~QZJ9*3VCz~AatA1OfhzzXIPr9L7Ib=!f>%mOuUqLi}wL8-vL5t zqH!i#A~Z?{>Te5M+aITE5eU{4&m7)cY4r$D47l$F4J?A>P^AzA}ac=sl#;f-W6#Wdl_e5J5~M zW?nhF7WX>Pjj9<)FHB&Mkjsbuq)J?fM!ZZCoXC3-?kJcXi#wit@!lYp8LKT{Fa<4S zM1OS%9>S-)>>FGfDZ0Q8iC=27Tz+~2?W0k^{*Iy1XZCmSWXaXOWoE7$=4ue);x0y-X(0U%4=&DyebV#dL;h2US1|2{bEG7r?Hz?%nV9oS@ zh|+@&tyc}ok^Bb{Yr;eS=@zVKk(fbGppXeVg$xY(9ZVQ>I~-`VRvnJu%4AM{*A%xw zM`RwaXd=IALrBlK1wLsL_&61CjS}`*E`u~Ueuf@JxE?a#UZa13^d%~Q1tUR+rJH`l z@~<>aI(tB7@G)Zaz^DlBP8s`VhnQUJ5c$~-NyjG=W=GfyIV!`Gts%zDhfW45EnLN7HQE zm_cQ5?4c&LUR_LoK+pzdW)|s#!hXu2Vkw*s;eN`3 zl9HcJ8OU)z+>ItL?bpUDUh0x~5P>kd#=V;{dQ(3Fe2xqJt-BWdBf7xNwi@`3djwW$ z0v9N=!2e9I;aWobhV}6U$u>4iS&;lx;#EM6s+_gJGp;(QR%v~hc5PaHiZfU`jw)D# z56a<0!MR;g>G2fh zNhr4?rx#P?>-=s|nIX&Q2~c*bOHmClqtl})DlVzKVoS4HQjL<@Lj9`Hd?zK_>i9=R zr}bf>xrM?=!aZbM9FJKwQOcw`N$sXfY@aBZ^xz;_7CkPh&Dd`kC9_97Ofn2CjO(UP=EjEhkCVzvYYZ<0EP+1T`I>SMPkbAa9IJnDy? zMmoj}*EQJK?$$%#XW2Tzx!7?Hy-)k~#CqyyQ`38>njKZIhf$8DLE z&nu1Jv3dOejiW3vkE_n(Y!RQw-UU7j>_UF;K^(CihiT#Fa}pD}SWdc-)&ZONRL3W* zm3J!t#jfMO)&30qTRh*h({xXooj*yx zO4AGZ$prgCe;TFxLjQoq0`pj{#Q75Upf-$J*$a*`7<~XHo}>d3-&00|^RjXY@EEJ& zTlpJG4d2CU)#>~+-3Fc0^sW0+@b54#=dH3o_V9Zh3;7;i<5|e>M=clg13V#ey`SDw zn-OES*1-?+x6^LpOK7<3SG+|w+Ac=?Y3^Wi&;fhczd8E&F7^-ZmwB69xHxqyCwM=b zmHr9qXRo>cm-q3w?N9s|UvB(`?_sOd8s5)ea{iUS&-c2R($62^HT)z$?$(t1*<}gm zC#;1;S3k)L<*Fo=qbTxb!>P>Uo1I75Y#IA$#LMVAiTAT%s&FfBbQqU}M6>R_~M!yDj zWji$F}u%^6nT8EI*4Zi+{iji%Yt+t;j)bT-AKouKMkV{vnNZo4`` z_%Zu)i%eVII&E&WWldYeT$fjz)d8QFzoKb5t&TNEJKI{9L$%p_DDMt^wN#rOGsg}) zs?2C@H_r_Fi>qN(Yg=1PMAfw1{9?G7Q4b52L9!-X*0kE(6s*-_@uv2crncyz7lOTt zI=3l)?Fw_s$OUPZ^6b?eZIRWH_PBZL$ZK;}M&e5wsvGJeYa?xhK|`c-ZEJG`wE3rz z6|U+v@n}bDTQm;u=I~K7_}o^rc~paQPD6cpU9`EWt#yNWa8&O()9ovw)Cw>w3hRqS ze09;LmPjXAp09|+qH8*vBeM`*8@Qd3m>iltg_o$7ttSez12ZG>^R=Y%W>get9xaS` z>+$z*Drd`>SzNSoNW*G)s*N_U!XL-gtu5u#*T*C6vDRq2xua-Gg;kr`h$==`L{>-F zMylJ|#QH?qBb_mtzP=;U*&1nYj+9Sdu_DqOH$N&Wb5D!5V_j)Rv~zV+{E!j)l$BJk zZE9_6THY2Bc~OS|**GLhDD!L)k{C>ze=9CXyL@e=b6sa^JYpqp=7fKNZ;Q?9lF5he z2*0Hy@J>lZ_0&Y2xZ3a&!4;%9MI{RUO7P-nYZ^WRI%}k?4*!6fMoVc7-bBWye#qWH z)zpCRH;(PAd88{cYtN-+>^c9#H;@t}W(zW=s{n7N7_N^Yf=DW_f#5+^HqSC&3*8E}{N}6j6l5Y`|xc6#bmmb8dYG3kB z-LA+WLK=zCK2$W+J;Fb@&HEwfg$V)84`{t2~yu>_j@0Bu?-bGn<9hH3r zvyaK&H+0>X?Dy#C7_2~_;G+cAz!4;=>!*P^!sd-4=;Rw*(?!{&YQLECF1T_atn@pB zSPRMZPZsBg$Kz47JP$^?u8VrDMpJok;xLa#Cs8H*s&=mXbm%}`e`dpy1w+Q3*lOmD zE*P1MTy?IATd8y_y@}472k>5vb3!-gkFK%j%C^ll?;Aa~@O^JC_zbC|P5N!RP}YUA zPC8zQ(5WHv<{tX*(PgZ10=~&&@|46zkC8ZL22PJtg+F{K&Jn?k?j{&bsfE``_13`=erZR4(&mHwta*Gp5n}s4|C-Y&>+P@>_PuGwzJSYsVk* LPW+1Ps<8hZ?=CSM delta 6200 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 parts = PartLoader.LoadedPartsList.Where(p => p.partPrefab.Modules.GetModule()).ToList(); - - foreach (AvailablePart part in parts) + foreach (AvailablePart part in PartLoader.LoadedPartsList) { - ModuleSAS SASmodule = part.partPrefab.FindModuleImplementing(); - AvailablePart.ModuleInfo moduleInfo = part.moduleInfos.Where(m => m.moduleName == "SAS").First(); - int serviceLevel = (SASmodule.SASServiceLevel + 1); - string moduleText = string.Empty; - for (int i = 0; i < serviceLevel; i++) - moduleText += $"{SASLevels[i]} \n"; + if (part.partPrefab == null) + continue; + + ModuleSAS sasModule = part.partPrefab.FindModuleImplementing(); + if (sasModule == null) + continue; + + int sasServiceLevel = sasModule.SASServiceLevel; + int sdaRequiredLevel = SmartDockingAid.SASLevel; + if (sasServiceLevel < sdaRequiredLevel) + continue; + + AvailablePart.ModuleInfo moduleInfo = part.moduleInfos.Find(p => p.moduleName == "SAS"); + if (moduleInfo == null) + continue; + + string text = string.Empty; + for (int i = 0; i < Mathf.Min(sasServiceLevel + 1, AutopilotSkill.SkillsReadable.Length); i++) + { + if (i != 0) + text += "\n"; - if (part.partPrefab.HasModuleImplementing()) - moduleText += $"{SASLevels[4]} \n"; + if (i == sdaRequiredLevel) + text += "Parallel to target\n"; - moduleInfo.info = moduleText; + text += AutopilotSkill.SkillsReadable[i]; + } + if (sasModule.standalone) + text += sasModule.resHandler.PrintModuleResources(); + + if (!sasModule.moduleIsEnabled) + text += Localizer.Format("#autoLOC_218888"); + + moduleInfo.info = text; } } - - private string[] SASLevels = new string[5] - { - $"S0: Stability Assist", - $"S1: Prograde / Retrograde", - $"S2: Radial / Normal", - $"S3: Maneuver / Target", - $"S{AssetLoader.minPilotLevel}: Parallel+ / Parallel-" - }; } } diff --git a/Source/SmartDockingAid.cs b/Source/SmartDockingAid.cs index 8156c32..1c2217d 100644 --- a/Source/SmartDockingAid.cs +++ b/Source/SmartDockingAid.cs @@ -87,8 +87,31 @@ public static VesselAutopilot.AutopilotMode AvailableAtSASMode } } - private const string DISPLAYNAME = "SmartDockingAid"; - + public static int SASLevel + { + get + { + switch (AvailableAtSASMode) + { + case VesselAutopilot.AutopilotMode.StabilityAssist: + return 0; + case VesselAutopilot.AutopilotMode.Prograde: + case VesselAutopilot.AutopilotMode.Retrograde: + return 1; + case VesselAutopilot.AutopilotMode.Normal: + case VesselAutopilot.AutopilotMode.Antinormal: + case VesselAutopilot.AutopilotMode.RadialIn: + case VesselAutopilot.AutopilotMode.RadialOut: + return 2; + case VesselAutopilot.AutopilotMode.Target: + case VesselAutopilot.AutopilotMode.AntiTarget: + case VesselAutopilot.AutopilotMode.Maneuver: + return 3; + default: + return 0; + } + } + } private UIStateToggleButton[] modebuttons; diff --git a/Source/SmartDockingAid.csproj b/Source/SmartDockingAid.csproj index 0a37bab..f93c579 100644 --- a/Source/SmartDockingAid.csproj +++ b/Source/SmartDockingAid.csproj @@ -71,6 +71,7 @@ + From 6eb02a8736f2221706d861a5d1eab1931c3cd6f9 Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 02:46:01 +0200 Subject: [PATCH 06/13] Fix incorrect state after vessel switch Fix VesselModule being always disabled (why this doesn't work anymore ?) --- Source/SmartDockingAid.cs | 6 +++--- Source/VesselDockingAid.cs | 16 ++++------------ 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/Source/SmartDockingAid.cs b/Source/SmartDockingAid.cs index 1c2217d..99dccb5 100644 --- a/Source/SmartDockingAid.cs +++ b/Source/SmartDockingAid.cs @@ -137,7 +137,7 @@ public enum TargetMode public void Start() { GameEvents.onFlightReady.Add(onFlightReady); - GameEvents.onVesselSwitching.Add(onVesselChange); + GameEvents.onVesselChange.Add(onVesselChange); GameEvents.onDockingComplete.Add(onDockingComplete); GameEvents.onGameSceneSwitchRequested.Add(onGameScenceSwitch); GameEvents.OnGameSettingsApplied.Add(OnGameSettingsApplied); @@ -239,7 +239,7 @@ private void SetNewState(bool reset) } } - private void onVesselChange(Vessel vessel1, Vessel vessel2) + private void onVesselChange(Vessel vessel) { SetNewState(true); } @@ -362,7 +362,7 @@ private void onGameScenceSwitch(GameEvents.FromToAction public void OnDestroy() { GameEvents.onFlightReady.Remove(onFlightReady); - GameEvents.onVesselSwitching.Remove(onVesselChange); + GameEvents.onVesselChange.Remove(onVesselChange); GameEvents.onDockingComplete.Remove(onDockingComplete); GameEvents.onGameSceneSwitchRequested.Remove(onGameScenceSwitch); GameEvents.OnGameSettingsApplied.Remove(OnGameSettingsApplied); diff --git a/Source/VesselDockingAid.cs b/Source/VesselDockingAid.cs index efebb85..5532ac0 100644 --- a/Source/VesselDockingAid.cs +++ b/Source/VesselDockingAid.cs @@ -8,11 +8,6 @@ class VesselModuleDockingAid : VesselModule private bool active = false; - public override Activation GetActivation() - { - return Activation.LoadedVessels; - } - public void changeSASstate(bool isOn) { if (isOn) @@ -46,14 +41,11 @@ public void onModeChange(SmartDockingAid.TargetMode targetMode) public void Update() { - if (HighLogic.LoadedScene == GameScenes.FLIGHT && active) - { - if (!vessel.IsControllable || !vessel.Autopilot.Enabled || vessel.targetObject == null) - return; + if (!active || !vessel.loaded || !vessel.IsControllable || !vessel.Autopilot.Enabled || vessel.targetObject == null) + return; - vessel.Autopilot.SAS.lockedMode = false; - vessel.Autopilot.SAS.SetTargetOrientation(vessel.targetObject.getAttitude(targetMode), false); - } + vessel.Autopilot.SAS.lockedMode = false; + vessel.Autopilot.SAS.SetTargetOrientation(vessel.targetObject.getAttitude(targetMode), false); } } } From 015beda4afbbfdd0a974483079778c66b7655e06 Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 03:14:21 +0200 Subject: [PATCH 07/13] Fix stability assist button not being revert to its default state on some occasions --- Source/SmartDockingAid.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/SmartDockingAid.cs b/Source/SmartDockingAid.cs index 99dccb5..e398b77 100644 --- a/Source/SmartDockingAid.cs +++ b/Source/SmartDockingAid.cs @@ -234,6 +234,9 @@ private void SetNewState(bool reset) } else { + modebuttons[0].changeState(buttonActive); + parallelPlus.SetState(false); + parallelNegative.SetState(false); parallelNegative.gameObject.SetActive(false); parallelPlus.gameObject.SetActive(false); } From 1b4c473dfbbb09f716f115a11f33bfca4aaf55c7 Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 03:25:49 +0200 Subject: [PATCH 08/13] Restre VesselModule activation check (helps to use the right override...) --- Source/VesselDockingAid.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Source/VesselDockingAid.cs b/Source/VesselDockingAid.cs index 5532ac0..153f129 100644 --- a/Source/VesselDockingAid.cs +++ b/Source/VesselDockingAid.cs @@ -8,6 +8,11 @@ class VesselModuleDockingAid : VesselModule private bool active = false; + public override bool ShouldBeActive() + { + return vessel.loaded && vessel.IsControllable && vessel.Autopilot.Enabled && vessel.targetObject != null; + } + public void changeSASstate(bool isOn) { if (isOn) @@ -41,11 +46,11 @@ public void onModeChange(SmartDockingAid.TargetMode targetMode) public void Update() { - if (!active || !vessel.loaded || !vessel.IsControllable || !vessel.Autopilot.Enabled || vessel.targetObject == null) - return; - - vessel.Autopilot.SAS.lockedMode = false; - vessel.Autopilot.SAS.SetTargetOrientation(vessel.targetObject.getAttitude(targetMode), false); + if (active) + { + vessel.Autopilot.SAS.lockedMode = false; + vessel.Autopilot.SAS.SetTargetOrientation(vessel.targetObject.getAttitude(targetMode), false); + } } } } From de7ceda0c61797e527d35a0aaadee2be27062a7a Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 11:08:57 +0200 Subject: [PATCH 09/13] Fix NRE when disabling a target --- Source/VesselDockingAid.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/VesselDockingAid.cs b/Source/VesselDockingAid.cs index 153f129..1a6e281 100644 --- a/Source/VesselDockingAid.cs +++ b/Source/VesselDockingAid.cs @@ -10,7 +10,7 @@ class VesselModuleDockingAid : VesselModule public override bool ShouldBeActive() { - return vessel.loaded && vessel.IsControllable && vessel.Autopilot.Enabled && vessel.targetObject != null; + return vessel.loaded && vessel.IsControllable && vessel.Autopilot.Enabled; } public void changeSASstate(bool isOn) @@ -46,7 +46,7 @@ public void onModeChange(SmartDockingAid.TargetMode targetMode) public void Update() { - if (active) + if (active && vessel.targetObject != null) { vessel.Autopilot.SAS.lockedMode = false; vessel.Autopilot.SAS.SetTargetOrientation(vessel.targetObject.getAttitude(targetMode), false); From 96d3f7d590a3f9e567b0270386856b285900b4da Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 13:46:54 +0200 Subject: [PATCH 10/13] Fixed trailing comma in version file --- GameData/SmartDockingAid/SDA.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GameData/SmartDockingAid/SDA.version b/GameData/SmartDockingAid/SDA.version index da3cb84..a26aa8b 100644 --- a/GameData/SmartDockingAid/SDA.version +++ b/GameData/SmartDockingAid/SDA.version @@ -6,7 +6,7 @@ { "USERNAME":"ValiZockt", "REPOSITORY":"SmartDockingAid", - "ALLOW_PRE_RELEASE":false, + "ALLOW_PRE_RELEASE":false }, "VERSION": { From 8f09c3b584ebf7e3c59438477af9351a563537dc Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 13:47:59 +0200 Subject: [PATCH 11/13] Automatic assembly version increment --- Source/Properties/AssemblyInfo.cs | 5 +- Source/SmartDockingAid.csproj | 126 +++++++++++++++++++++++++++++- 2 files changed, 126 insertions(+), 5 deletions(-) diff --git a/Source/Properties/AssemblyInfo.cs b/Source/Properties/AssemblyInfo.cs index 6e29ed5..fcab0ed 100644 --- a/Source/Properties/AssemblyInfo.cs +++ b/Source/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -24,8 +24,5 @@ // // Major.Minor.Build.Revision // -// You can specify all the values or you can use the default the Revision and -// Build Numbers by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.2.0.0")] [assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/Source/SmartDockingAid.csproj b/Source/SmartDockingAid.csproj index f93c579..a58bea8 100644 --- a/Source/SmartDockingAid.csproj +++ b/Source/SmartDockingAid.csproj @@ -84,7 +84,14 @@ SmartDockingAid false true + SDA.version + + + + + + @@ -128,6 +135,123 @@ - + + + + + + + + + + + + + + + + + + + = 0) + { + current += itemName.Length; + while (current < content.Length && char.IsNumber(content[current])) + { + Major += content[current]; + current++; + } + } + else + { + Major = "0"; + } + + itemName = "\"MINOR\":"; + current = content.IndexOf(itemName, StringComparison.OrdinalIgnoreCase); + if (current >= 0) + { + current += itemName.Length; + while (current < content.Length && char.IsNumber(content[current])) + { + Minor += content[current]; + current++; + } + } + else + { + Minor = "0"; + } + + itemName = "\"PATCH\":"; + current = content.IndexOf(itemName, StringComparison.OrdinalIgnoreCase); + if (current >= 0) + { + current += itemName.Length; + while (current < content.Length && char.IsNumber(content[current])) + { + Patch += content[current]; + current++; + } + } + else + { + Patch = "0"; + } + + itemName = "\"BUILD\":"; + current = content.IndexOf(itemName, StringComparison.OrdinalIgnoreCase); + if (current >= 0) + { + current += itemName.Length; + while (current < content.Length && char.IsNumber(content[current])) + { + Build += content[current]; + current++; + } + } + else + { + Build = "0"; + } + + FullVersion = Major + "." + Minor + "." + Patch + "." + Build; +]]> + + + + + + + + + + + + + + + + + + \ No newline at end of file From 08251cec3f03e69f194bd0fc1eef059459dfc20b Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 13:48:46 +0200 Subject: [PATCH 12/13] Updated binaries --- GameData/SmartDockingAid/SmartDockingAid.dll | Bin 16896 -> 16384 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/GameData/SmartDockingAid/SmartDockingAid.dll b/GameData/SmartDockingAid/SmartDockingAid.dll index d51a667fcb4e092cfc38972bb1062693398e8a08..64dfd776bf2e6166cd2c67e9b5034f5b20cf055a 100644 GIT binary patch delta 4409 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 Q3NIYm78rS&H4k+E7Ys2-CjbBd From a2b65be248fa690b94d7902b3446477d5e3a2e4d Mon Sep 17 00:00:00 2001 From: gotmachine <24925209+gotmachine@users.noreply.github.com> Date: Fri, 22 Apr 2022 13:55:09 +0200 Subject: [PATCH 13/13] Fix readme typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b6a9c95..ef60b7b 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,12 @@ After loading the solution in your IDE, add a `ReferencePath` to the root of you For Visual Studio, right-click on the `SmartDockingAid` project > `Properties` > `Reference Paths`, then save, close and re-open the solution for the changes to propagate. -Alternatively, create a `SmartDockingAid.csproj.user` file in the `Source` folder, with the follwowing content : +Alternatively, create a `SmartDockingAid.csproj.user` file in the `Source` folder, with the following content : ```xml - Absolute\Path\To\Your\KSP\Install + Absolute\Path\To\Your\KSP\Install\Folder ```