From 66943235c1f3166f272fea6c22cc0657b1056251 Mon Sep 17 00:00:00 2001 From: NotAKidoS <37721153+NotAKidOnSteam@users.noreply.github.com> Date: Tue, 11 Apr 2023 23:34:08 -0500 Subject: [PATCH] init --- PropUndoButton/Main.cs | 147 ++++++++++++++++++++++ PropUndoButton/PropUndoButton.csproj | 50 ++++++++ PropUndoButton/PropUndoButton.sln | 25 ++++ PropUndoButton/Properties/AssemblyInfo.cs | 32 +++++ PropUndoButton/SFX/sfx_spawn.wav | Bin 0 -> 15476 bytes PropUndoButton/SFX/sfx_undo.wav | Bin 0 -> 12496 bytes PropUndoButton/SFX/sfx_warn.wav | Bin 0 -> 12684 bytes PropUndoButton/format.json | 23 ++++ 8 files changed, 277 insertions(+) create mode 100644 PropUndoButton/Main.cs create mode 100644 PropUndoButton/PropUndoButton.csproj create mode 100644 PropUndoButton/PropUndoButton.sln create mode 100644 PropUndoButton/Properties/AssemblyInfo.cs create mode 100644 PropUndoButton/SFX/sfx_spawn.wav create mode 100644 PropUndoButton/SFX/sfx_undo.wav create mode 100644 PropUndoButton/SFX/sfx_warn.wav create mode 100644 PropUndoButton/format.json diff --git a/PropUndoButton/Main.cs b/PropUndoButton/Main.cs new file mode 100644 index 0000000..2d8bb3e --- /dev/null +++ b/PropUndoButton/Main.cs @@ -0,0 +1,147 @@ +using ABI_RC.Core.AudioEffects; +using ABI_RC.Core.Savior; +using ABI_RC.Core.Util; +using MelonLoader; +using System.Reflection; +using UnityEngine; + +namespace NAK.Melons.UndoPropButton; + +// https://pixabay.com/sound-effects/selection-sounds-73225/ + +public class PropUndoButton : MelonMod +{ + private static readonly MelonPreferences_Category Category = + MelonPreferences.CreateCategory(nameof(PropUndoButton)); + + public static readonly MelonPreferences_Entry EntryEnabled = + Category.CreateEntry("Enabled", true, description: "Toggle Undo Prop Button."); + + public static readonly MelonPreferences_Entry EntryUseSFX = + Category.CreateEntry("Use SFX", true, description: "Enable or disable undo SFX."); + + // audio clip names, InterfaceAudio adds "PropUndo_" prefix + public const string sfx_spawn = "PropUndo_sfx_spawn"; + public const string sfx_undo = "PropUndo_sfx_undo"; + public const string sfx_warn = "PropUndo_sfx_warn"; + + public override void OnInitializeMelon() + { + HarmonyInstance.Patch( // prop spawn sfx + typeof(CVRSyncHelper).GetMethod(nameof(CVRSyncHelper.SpawnProp)), + null, + new HarmonyLib.HarmonyMethod(typeof(PropUndoButton).GetMethod(nameof(OnSpawnProp), BindingFlags.NonPublic | BindingFlags.Static)) + ); + HarmonyInstance.Patch( // desktop input patch so we don't run in menus/gui + typeof(InputModuleMouseKeyboard).GetMethod(nameof(InputModuleMouseKeyboard.UpdateInput)), + null, + new HarmonyLib.HarmonyMethod(typeof(PropUndoButton).GetMethod(nameof(OnUpdateInput), BindingFlags.NonPublic | BindingFlags.Static)) + ); + SetupDefaultAudioClips(); + } + + private void SetupDefaultAudioClips() + { + // PropUndo and audio folders do not exist, create them if dont exist yet + string path = Application.streamingAssetsPath + "/Cohtml/UIResources/GameUI/mods/PropUndo/audio/"; + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + LoggerInstance.Msg("Created PropUndo/audio directory!"); + } + + // copy embedded resources to this folder if they do not exist + string[] clipNames = { "sfx_spawn.wav", "sfx_undo.wav", "sfx_warn.wav" }; + foreach (string clipName in clipNames) + { + string clipPath = Path.Combine(path, clipName); + if (!File.Exists(clipPath)) + { + // read the clip data from embedded resources + byte[] clipData = null; + string resourceName = "PropUndoButton.SFX." + clipName; + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) + { + clipData = new byte[stream.Length]; + stream.Read(clipData, 0, clipData.Length); + } + + // write the clip data to the file + using (FileStream fileStream = new FileStream(clipPath, FileMode.CreateNew)) + { + fileStream.Write(clipData, 0, clipData.Length); + } + + LoggerInstance.Msg("Placed missing sfx in audio folder: " + clipName); + } + } + } + + private static void OnUpdateInput() + { + if (Input.GetKeyDown(KeyCode.Z)) + { + DeleteLatestSpawnable(); + } + } + + private static void OnSpawnProp() + { + if (!EntryEnabled.Value) return; + + if (!MetaPort.Instance.worldAllowProps || !MetaPort.Instance.settings.GetSettingsBool("ContentFilterPropsEnabled", false)) + { + PlayAudioModule(sfx_warn); + return; + } + + if (GetAllProps().Count >= 20) + { + PlayAudioModule(sfx_warn); + return; + } + + PlayAudioModule(sfx_spawn); + } + + private static void DeleteLatestSpawnable() + { + if (!EntryEnabled.Value) return; + + var propData = GetLatestProp(); + + if (propData == null) + { + PlayAudioModule(sfx_warn); + return; + } + + if (propData.Spawnable == null) + { + propData.Recycle(); + // what should i do here? + return; + } + + propData.Spawnable.Delete(); + PlayAudioModule(sfx_undo); + } + + private static void PlayAudioModule(string module) + { + if (!EntryUseSFX.Value) return; + InterfaceAudio.PlayModule(module); + } + + private static CVRSyncHelper.PropData GetLatestProp() + { + // should already be sorted by spawn order + return CVRSyncHelper.Props.LastOrDefault((CVRSyncHelper.PropData match) => match.SpawnedBy == MetaPort.Instance.ownerId); + } + + private static List GetAllProps() + { + // im not storing the count because there is good chance itll desync from server + return CVRSyncHelper.Props.FindAll((CVRSyncHelper.PropData match) => match.SpawnedBy == MetaPort.Instance.ownerId); + } +} \ No newline at end of file diff --git a/PropUndoButton/PropUndoButton.csproj b/PropUndoButton/PropUndoButton.csproj new file mode 100644 index 0000000..fda9805 --- /dev/null +++ b/PropUndoButton/PropUndoButton.csproj @@ -0,0 +1,50 @@ + + + + + net472 + enable + latest + false + True + + + + + + + + + + + + + + + + + C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\MelonLoader\0Harmony.dll + + + C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Assembly-CSharp.dll + + + C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Assembly-CSharp-firstpass.dll + + + C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\MelonLoader\MelonLoader.dll + + + C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.CoreModule.dll + + + C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.InputLegacyModule.dll + + + + + + + + + diff --git a/PropUndoButton/PropUndoButton.sln b/PropUndoButton/PropUndoButton.sln new file mode 100644 index 0000000..0d15d70 --- /dev/null +++ b/PropUndoButton/PropUndoButton.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32630.192 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PropUndoButton", "PropUndoButton.csproj", "{240E33F2-E4DD-458D-8E79-96073872CE65}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {240E33F2-E4DD-458D-8E79-96073872CE65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {240E33F2-E4DD-458D-8E79-96073872CE65}.Debug|Any CPU.Build.0 = Debug|Any CPU + {240E33F2-E4DD-458D-8E79-96073872CE65}.Release|Any CPU.ActiveCfg = Release|Any CPU + {240E33F2-E4DD-458D-8E79-96073872CE65}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C8F281CB-C5D8-4C4B-A7F6-9F1702C436EB} + EndGlobalSection +EndGlobal diff --git a/PropUndoButton/Properties/AssemblyInfo.cs b/PropUndoButton/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0249734 --- /dev/null +++ b/PropUndoButton/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using NAK.Melons.UndoPropButton.Properties; +using MelonLoader; +using System.Reflection; + + +[assembly: AssemblyVersion(AssemblyInfoParams.Version)] +[assembly: AssemblyFileVersion(AssemblyInfoParams.Version)] +[assembly: AssemblyInformationalVersion(AssemblyInfoParams.Version)] +[assembly: AssemblyTitle(nameof(NAK.Melons.UndoPropButton))] +[assembly: AssemblyCompany(AssemblyInfoParams.Author)] +[assembly: AssemblyProduct(nameof(NAK.Melons.UndoPropButton))] + +[assembly: MelonInfo( + typeof(NAK.Melons.UndoPropButton.PropUndoButton), + nameof(NAK.Melons.UndoPropButton), + AssemblyInfoParams.Version, + AssemblyInfoParams.Author, + downloadLink: "https://github.com/NotAKidOnSteam/UndoPropButton" +)] + +[assembly: MelonGame("Alpha Blend Interactive", "ChilloutVR")] +[assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] +[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)] +[assembly: MelonOptionalDependencies("BTKUILib")] +[assembly: HarmonyDontPatchAll] + +namespace NAK.Melons.UndoPropButton.Properties; +internal static class AssemblyInfoParams +{ + public const string Version = "1.0.0"; + public const string Author = "NotAKidoS"; +} \ No newline at end of file diff --git a/PropUndoButton/SFX/sfx_spawn.wav b/PropUndoButton/SFX/sfx_spawn.wav new file mode 100644 index 0000000000000000000000000000000000000000..069a4789a2f72c8bfd66b09f9faf9c6d5fbd49d0 GIT binary patch literal 15476 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 literal 0 HcmV?d00001 diff --git a/PropUndoButton/SFX/sfx_warn.wav b/PropUndoButton/SFX/sfx_warn.wav new file mode 100644 index 0000000000000000000000000000000000000000..d27b30a451056551de1b0a0d0022fb835645bbc1 GIT binary patch literal 12684 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 K5Gz_FO#cT(1n5Bk literal 0 HcmV?d00001 diff --git a/PropUndoButton/format.json b/PropUndoButton/format.json new file mode 100644 index 0000000..b243e12 --- /dev/null +++ b/PropUndoButton/format.json @@ -0,0 +1,23 @@ +{ + "_id": -1, + "name": "PropUndoButton", + "modversion": "1.0.0", + "gameversion": "2022r170", + "loaderversion": "0.5.7", + "modtype": "Mod", + "author": "NotAKidoS", + "description": "Press Z to undo latest spawned prop. Includes SFX for prop spawn, undo, and warning, which can be disabled in settings.", + "searchtags": [ + "prop", + "undo", + "bind", + "button" + ], + "requirements": [ + "None" + ], + "downloadlink": "https://github.com/NotAKidOnSteam/PropUndoButton/releases/download/v1.0.0/PropUndoButton.dll", + "sourcelink": "https://github.com/NotAKidOnSteam/PropUndoButton/", + "changelog": "- Initial Release", + "embedcolor": "#00FFFF" +} \ No newline at end of file