From b412b7d14aad979ce9e943517de79a1eb5e2d8c7 Mon Sep 17 00:00:00 2001 From: D4VID Date: Sat, 10 May 2025 18:03:46 +0200 Subject: [PATCH] Initial mod structure --- .gitignore | 9 +++ CameraRoll.sln | 22 +++++++ CameraRoll/CameraRoll.csproj | 36 +++++++++++ .../FancyInput/ContextMetadata.jecs | 14 +++++ .../FancyInput/TriggerMetadata.jecs | 30 +++++++++ .../languages/English/English_input.jecs | 25 ++++++++ CameraRoll/CameraRoll/manifest.jecs | 8 +++ .../src/client/CameraRollClientMod.cs | 37 +++++++++++ .../src/client/CameraRollGameState.cs | 62 +++++++++++++++++++ .../client/keybindings/CameraRollContext.cs | 7 +++ .../client/keybindings/CameraRollTrigger.cs | 11 ++++ .../src/client/tool/CameraRollTool.cs | 28 +++++++++ 12 files changed, 289 insertions(+) create mode 100644 .gitignore create mode 100644 CameraRoll.sln create mode 100644 CameraRoll/CameraRoll.csproj create mode 100755 CameraRoll/CameraRoll/FancyInput/ContextMetadata.jecs create mode 100755 CameraRoll/CameraRoll/FancyInput/TriggerMetadata.jecs create mode 100755 CameraRoll/CameraRoll/languages/English/English_input.jecs create mode 100755 CameraRoll/CameraRoll/manifest.jecs create mode 100755 CameraRoll/CameraRoll/src/client/CameraRollClientMod.cs create mode 100755 CameraRoll/CameraRoll/src/client/CameraRollGameState.cs create mode 100755 CameraRoll/CameraRoll/src/client/keybindings/CameraRollContext.cs create mode 100755 CameraRoll/CameraRoll/src/client/keybindings/CameraRollTrigger.cs create mode 100755 CameraRoll/CameraRoll/src/client/tool/CameraRollTool.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1589a6f --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +bin/ +obj/ +/packages/ +riderModule.iml +/_ReSharper.Caches/ +.idea/ +HarmonyForLogicWorld +EccsLogicWorldAPI +CameraRoll.sln.DotSettings.user diff --git a/CameraRoll.sln b/CameraRoll.sln new file mode 100644 index 0000000..91fc9b3 --- /dev/null +++ b/CameraRoll.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CameraRoll", "CameraRoll\CameraRoll.csproj", "{B409AD9E-913D-40D7-B5B9-CD5624066153}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EccsLogicWorldAPI", "EccsLogicWorldAPI\EccsLogicWorldAPI.csproj", "{F22A64EF-2B7B-43CB-A02C-01EFA4DF5EF0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B409AD9E-913D-40D7-B5B9-CD5624066153}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B409AD9E-913D-40D7-B5B9-CD5624066153}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B409AD9E-913D-40D7-B5B9-CD5624066153}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B409AD9E-913D-40D7-B5B9-CD5624066153}.Release|Any CPU.Build.0 = Release|Any CPU + {F22A64EF-2B7B-43CB-A02C-01EFA4DF5EF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F22A64EF-2B7B-43CB-A02C-01EFA4DF5EF0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F22A64EF-2B7B-43CB-A02C-01EFA4DF5EF0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F22A64EF-2B7B-43CB-A02C-01EFA4DF5EF0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/CameraRoll/CameraRoll.csproj b/CameraRoll/CameraRoll.csproj new file mode 100644 index 0000000..59baea5 --- /dev/null +++ b/CameraRoll/CameraRoll.csproj @@ -0,0 +1,36 @@ + + + + net8.0 + disable + disable + + + + + + + + + $(LogicWorldGameLocation)\Logic_World_Data\Managed\FancyInput.dll + + + $(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicUI.dll + + + $(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicWorld.dll + + + $(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicWorld.GameStates.dll + + + $(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicAPI.dll + + + $(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicAPI.Client.dll + + + $(LogicWorldGameLocation)\Logic_World_Data\Managed\LogicLog.dll + + + diff --git a/CameraRoll/CameraRoll/FancyInput/ContextMetadata.jecs b/CameraRoll/CameraRoll/FancyInput/ContextMetadata.jecs new file mode 100755 index 0000000..c047045 --- /dev/null +++ b/CameraRoll/CameraRoll/FancyInput/ContextMetadata.jecs @@ -0,0 +1,14 @@ +# Define two contexts - one for keybindings used during the building state and one for the tool's state +CameraRoll.CameraRollBuilding: + # This keybinding is used during the game's standard building state - need to inject into the build actions + InjectTriggersInto: + - MHG.BuildActions + Triggers: + - CameraRoll.OpenCameraRollTool + +CameraRoll.CameraRollTool: + Triggers: + - CameraRoll.PlacePoint + - CameraRoll.Play + - CameraRoll.Stop + - CameraRoll.Clear diff --git a/CameraRoll/CameraRoll/FancyInput/TriggerMetadata.jecs b/CameraRoll/CameraRoll/FancyInput/TriggerMetadata.jecs new file mode 100755 index 0000000..14dcf19 --- /dev/null +++ b/CameraRoll/CameraRoll/FancyInput/TriggerMetadata.jecs @@ -0,0 +1,30 @@ +# Define all available keybindings of the mod +CameraRoll.OpenCameraRollTool: + Heading: "CameraRoll" + DefaultBinding: + Options: + - M + +CameraRoll.PlacePoint: + Heading: "CameraRoll" + DefaultBinding: + Options: + - P + +CameraRoll.Play: + Heading: "CameraRoll" + DefaultBinding: + Options: + - F6 + +CameraRoll.Stop: + Heading: "CameraRoll" + DefaultBinding: + Options: + - F7 + +CameraRoll.Clear: + Heading: "CameraRoll" + DefaultBinding: + Options: + - Delete diff --git a/CameraRoll/CameraRoll/languages/English/English_input.jecs b/CameraRoll/CameraRoll/languages/English/English_input.jecs new file mode 100755 index 0000000..30956fe --- /dev/null +++ b/CameraRoll/CameraRoll/languages/English/English_input.jecs @@ -0,0 +1,25 @@ +MHG.SettingsMenu.Pages.Controls.Headings.CameraRoll: "Mod: Camera Roll" + +FancyInput.Trigger.CameraRoll.OpenCameraRollTool: "Open the camera roll tool" +FancyInput.Trigger.CameraRoll.OpenCameraRollTool.Description: """ + Transitions into the CameraRoll state. + """ + +FancyInput.Trigger.CameraRoll.PlacePoint: "Place point" +FancyInput.Trigger.CameraRoll.PlacePoint.Description: """ + Save the current location as a point along the track. + """ + +FancyInput.Trigger.CameraRoll.Play: "Play" +FancyInput.Trigger.CameraRoll.Play.Description: """ + Start playing the track. + """ + +FancyInput.Trigger.CameraRoll.Stop: "Stop" +FancyInput.Trigger.CameraRoll.Stop.Description: """ + Stop playing the track and return to original position. + """ +FancyInput.Trigger.CameraRoll.Clear: "Clear placed points" +FancyInput.Trigger.CameraRoll.Clear.Description: """ + Deletes all previously placed points. + """ diff --git a/CameraRoll/CameraRoll/manifest.jecs b/CameraRoll/CameraRoll/manifest.jecs new file mode 100755 index 0000000..83569fa --- /dev/null +++ b/CameraRoll/CameraRoll/manifest.jecs @@ -0,0 +1,8 @@ +ID: D4VID_CameraRoll +Name: CameraRoll +Author: D4VID +Version: 0.0.1 +Priority: 0 +ClientOnly: true +Dependencies: + - EccsLogicWorldAPI diff --git a/CameraRoll/CameraRoll/src/client/CameraRollClientMod.cs b/CameraRoll/CameraRoll/src/client/CameraRollClientMod.cs new file mode 100755 index 0000000..0c6ff56 --- /dev/null +++ b/CameraRoll/CameraRoll/src/client/CameraRollClientMod.cs @@ -0,0 +1,37 @@ +using CameraRoll.Client.Keybindings; +using CameraRoll.Client.Tool; +using EccsLogicWorldAPI.Client.Injectors; +using FancyInput; +using LogicAPI.Client; +using LogicLog; +using LogicWorld; +using LogicWorld.GameStates; + +namespace CameraRoll.Client { + public class CameraRollClientMod : ClientMod { + public new static ILogicLogger Logger = null!; + + protected override void Initialize() { + Logger = base.Logger; + Logger.Info("CameraRoll mod loading"); + CameraRollTool.Init(Logger); + + // Register keybindings in the settings menu + CustomInput.Register("CameraRoll"); + + // Inject our own game state + GameStateInjector.inject(CameraRollGameState.Id, typeof(CameraRollGameState)); + + // Register the keybinding to enter the path analyzer game state + FirstPersonInteraction.RegisterBuildingKeybinding( + CameraRollTrigger.OpenCameraRollTool, + () => { + GameStateManager.TransitionTo(CameraRollGameState.Id); + return true; + } + ); + + Logger.Info("CameraRoll mod loaded"); + } + } +} \ No newline at end of file diff --git a/CameraRoll/CameraRoll/src/client/CameraRollGameState.cs b/CameraRoll/CameraRoll/src/client/CameraRollGameState.cs new file mode 100755 index 0000000..811a9ed --- /dev/null +++ b/CameraRoll/CameraRoll/src/client/CameraRollGameState.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using CameraRoll.Client.Keybindings; +using CameraRoll.Client.Tool; +using FancyInput; +using LogicUI; +using LogicWorld.GameStates; + +namespace CameraRoll.Client { + public class CameraRollGameState : GameState { + public const string Id = "CameraRollTool"; + + public override string TextID => Id; + + /// + /// Locked mouse means you look around when you move it. + /// False would display the cursor to be able to click on UI elements. + /// + public override bool MouseLocked => true; + + /// + /// This list gets printed on the game's top left UI panel which displays the currently available keybindings + /// + public override IEnumerable HelpScreenTriggers => new InputTrigger[] { + UITrigger.Back, + CameraRollTrigger.PlacePoint, + CameraRollTrigger.Play, + CameraRollTrigger.Stop, + CameraRollTrigger.Clear, + }; + + /// + /// Called when the game transitions into this game state i.e. after pressing the configured keybinding + /// + public override void OnEnter() { + CameraRollClientMod.Logger.Info("CameraRollGameState enter"); + } + + /// + /// Ran every frame when inside this game state + /// + public override void OnRun() { + if (CustomInput.DownThisFrame(UITrigger.Back)) { + GameStateManager.TransitionBackToBuildingState(); + } else if (CustomInput.DownThisFrame(CameraRollTrigger.PlacePoint)) { + CameraRollTool.PlacePoint(); + } else if (CustomInput.DownThisFrame(CameraRollTrigger.Play)) { + CameraRollTool.Play(); + } else if (CustomInput.DownThisFrame(CameraRollTrigger.Stop)) { + CameraRollTool.Stop(); + } else if (CustomInput.DownThisFrame(CameraRollTrigger.Clear)) { + CameraRollTool.Clear(); + } + } + + /// + /// Called when the game transitions away from this game state i.e. after pressing the back keybinding + /// + public override void OnExit() { + CameraRollClientMod.Logger.Info("CameraRollGameState exit"); + } + } +} \ No newline at end of file diff --git a/CameraRoll/CameraRoll/src/client/keybindings/CameraRollContext.cs b/CameraRoll/CameraRoll/src/client/keybindings/CameraRollContext.cs new file mode 100755 index 0000000..ebccb05 --- /dev/null +++ b/CameraRoll/CameraRoll/src/client/keybindings/CameraRollContext.cs @@ -0,0 +1,7 @@ +namespace CameraRoll.Client.Keybindings { + // Define two contexts - one for keybindings used during the building state and one for the tool's state + public enum CameraRollContext { + CameraRollBuilding, + CameraRollTool, + } +} \ No newline at end of file diff --git a/CameraRoll/CameraRoll/src/client/keybindings/CameraRollTrigger.cs b/CameraRoll/CameraRoll/src/client/keybindings/CameraRollTrigger.cs new file mode 100755 index 0000000..784cb27 --- /dev/null +++ b/CameraRoll/CameraRoll/src/client/keybindings/CameraRollTrigger.cs @@ -0,0 +1,11 @@ +namespace CameraRoll.Client.Keybindings { + // Define all available keybindings of the mod + public enum CameraRollTrigger { + None, + OpenCameraRollTool, + PlacePoint, + Play, + Stop, + Clear, + } +} \ No newline at end of file diff --git a/CameraRoll/CameraRoll/src/client/tool/CameraRollTool.cs b/CameraRoll/CameraRoll/src/client/tool/CameraRollTool.cs new file mode 100755 index 0000000..2c47e9d --- /dev/null +++ b/CameraRoll/CameraRoll/src/client/tool/CameraRollTool.cs @@ -0,0 +1,28 @@ +using LogicLog; + +namespace CameraRoll.Client.Tool { + + public class CameraRollTool { + private static ILogicLogger _logger = null!; + + public static void Init(ILogicLogger logger) { + _logger = logger; + } + + public static void PlacePoint() { + _logger.Info("PlacePoint"); + } + + public static void Play() { + _logger.Info("Play"); + } + + public static void Stop() { + _logger.Info("Stop"); + } + + public static void Clear() { + _logger.Info("Clear"); + } + } +} \ No newline at end of file