From e13bb8af2354bb2a4cad888c3b1b110e43622162 Mon Sep 17 00:00:00 2001 From: SDraw Date: Sun, 24 Dec 2023 11:53:57 +0300 Subject: [PATCH] New mods: `AvatarSyncedLook` and `PlayersInstanceNotifier` Minor changes --- README.md | 2 + ml_amt/{Scripts.cs => ResourcesHandler.cs} | 4 +- ml_amt/Settings.cs | 4 +- ml_asl/Main.cs | 25 ++++ ml_asl/Properties/AssemblyInfo.cs | 4 + ml_asl/ResourcesHandler.cs | 26 ++++ ml_asl/Settings.cs | 75 ++++++++++ ml_asl/Utils.cs | 13 ++ ml_asl/ml_asl.csproj | 56 +++++++ ml_asl/resources/mod_menu.js | 22 +++ ml_lme/{Scripts.cs => ResourcesHandler.cs} | 4 +- ml_lme/Settings.cs | 4 +- ml_mods_cvr.sln | 10 ++ ml_pam/{Scripts.cs => ResourcesHandler.cs} | 4 +- ml_pam/Settings.cs | 4 +- ml_pin/Main.cs | 117 +++++++++++++++ ml_pin/Properties/AssemblyInfo.cs | 4 + ml_pin/ResourcesHandler.cs | 82 ++++++++++ ml_pin/Settings.cs | 166 +++++++++++++++++++++ ml_pin/SoundManager.cs | 70 +++++++++ ml_pin/Utils.cs | 12 ++ ml_pin/ml_pin.csproj | 75 ++++++++++ ml_pin/resources/Chime.wav | Bin 0 -> 62480 bytes ml_pin/resources/DoorClose.wav | Bin 0 -> 33556 bytes ml_pin/resources/mod_menu.js | 64 ++++++++ ml_vei/{Scripts.cs => ResourcesHandler.cs} | 4 +- ml_vei/Settings.cs | 4 +- ml_vei/ml_vei.csproj | 2 + 28 files changed, 841 insertions(+), 16 deletions(-) rename ml_amt/{Scripts.cs => ResourcesHandler.cs} (86%) create mode 100644 ml_asl/Main.cs create mode 100644 ml_asl/Properties/AssemblyInfo.cs create mode 100644 ml_asl/ResourcesHandler.cs create mode 100644 ml_asl/Settings.cs create mode 100644 ml_asl/Utils.cs create mode 100644 ml_asl/ml_asl.csproj create mode 100644 ml_asl/resources/mod_menu.js rename ml_lme/{Scripts.cs => ResourcesHandler.cs} (86%) rename ml_pam/{Scripts.cs => ResourcesHandler.cs} (86%) create mode 100644 ml_pin/Main.cs create mode 100644 ml_pin/Properties/AssemblyInfo.cs create mode 100644 ml_pin/ResourcesHandler.cs create mode 100644 ml_pin/Settings.cs create mode 100644 ml_pin/SoundManager.cs create mode 100644 ml_pin/Utils.cs create mode 100644 ml_pin/ml_pin.csproj create mode 100644 ml_pin/resources/Chime.wav create mode 100644 ml_pin/resources/DoorClose.wav create mode 100644 ml_pin/resources/mod_menu.js rename ml_vei/{Scripts.cs => ResourcesHandler.cs} (86%) diff --git a/README.md b/README.md index 1cea0ac..20937c3 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,12 @@ Merged set of MelonLoader mods for ChilloutVR. | Full name | Short name | Latest version | Available in [CVRMA](https://github.com/knah/CVRMelonAssistant) | |:---------:|:----------:|:--------------:| :----------------------------------------------------------------| | [Avatar Motion Tweaker](/ml_amt/README.md) | ml_amt | 1.3.5 [:arrow_down:](../../releases/latest/download/ml_amt.dll)| ✔ Yes | +| [Avatar Synced Look](/ml_asl/README.md) | ml_asl | 1.0.0 [:arrow_down:](../../releases/latest/download/ml_asl.dll)| :hourglass: On review | | [Leap Motion Extension](/ml_lme/README.md)| ml_lme | 1.4.5 [:arrow_down:](../../releases/latest/download/ml_lme.dll)| ✔ Yes | | [Pickup Arm Movement](/ml_pam/README.md)| ml_pam | 1.0.9 [:arrow_down:](../../releases/latest/download/ml_pam.dll)| ✔ Yes | | [Player Movement Copycat](/ml_pmc/README.md)| ml_pmc | 1.0.4 [:arrow_down:](../../releases/latest/download/ml_pmc.dll)| ✔ Yes | | [Player Ragdoll Mod](/ml_prm/README.md) | ml_prm | 1.1.1 [:arrow_down:](../../releases/latest/download/ml_prm.dll)| ✔ Yes | +| [Players Instance Notifier](/ml_pin/README.md) | ml_pin | 1.0.0 [:arrow_down:](../../releases/latest/download/ml_ml_pin.dll)| :hourglass: On review | | [Vive Extended Input](/ml_vei/README.md) | ml_vei | 1.0.0 [:arrow_down:](../../releases/latest/download/ml_vei.dll)| ✔ Yes | **Archived mods:** diff --git a/ml_amt/Scripts.cs b/ml_amt/ResourcesHandler.cs similarity index 86% rename from ml_amt/Scripts.cs rename to ml_amt/ResourcesHandler.cs index 243c0e6..7c1479c 100644 --- a/ml_amt/Scripts.cs +++ b/ml_amt/ResourcesHandler.cs @@ -4,9 +4,9 @@ using System.Reflection; namespace ml_amt { - static class Scripts + static class ResourcesHandler { - public static string GetEmbeddedScript(string p_name) + public static string GetEmbeddedResource(string p_name) { string l_result = ""; Assembly l_assembly = Assembly.GetExecutingAssembly(); diff --git a/ml_amt/Settings.cs b/ml_amt/Settings.cs index 0e2de51..0253865 100644 --- a/ml_amt/Settings.cs +++ b/ml_amt/Settings.cs @@ -73,8 +73,8 @@ namespace ml_amt }; ViewManager.Instance.gameMenuView.Listener.FinishLoad += (_) => { - ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("mods_extension.js")); - ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("mod_menu.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mods_extension.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mod_menu.js")); foreach(var l_entry in ms_entries) ViewManager.Instance.gameMenuView.View.TriggerEvent("updateModSetting", ms_category.Identifier, l_entry.DisplayName, l_entry.GetValueAsString()); }; diff --git a/ml_asl/Main.cs b/ml_asl/Main.cs new file mode 100644 index 0000000..66f77d0 --- /dev/null +++ b/ml_asl/Main.cs @@ -0,0 +1,25 @@ +using ABI_RC.Core.Player; +using System.Reflection; + +namespace ml_asl +{ + public class AvatarSyncedLook : MelonLoader.MelonMod + { + public override void OnInitializeMelon() + { + Settings.Init(); + + HarmonyInstance.Patch( + typeof(PlayerSetup).GetMethod("UpdatePlayerAvatarMovementData", BindingFlags.NonPublic | BindingFlags.Instance), + null, + new HarmonyLib.HarmonyMethod(typeof(AvatarSyncedLook).GetMethod(nameof(OnPlayerAvatarMovementDataUpdate_Postfix), BindingFlags.NonPublic | BindingFlags.Static)) + ); + } + + static void OnPlayerAvatarMovementDataUpdate_Postfix(ref PlayerSetup __instance, PlayerAvatarMovementData ____playerAvatarMovementData) + { + if(Settings.Enabled && (__instance.eyeMovement != null)) + ____playerAvatarMovementData.EyeTrackingOverride = true; + } + } +} diff --git a/ml_asl/Properties/AssemblyInfo.cs b/ml_asl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..641578e --- /dev/null +++ b/ml_asl/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +[assembly: MelonLoader.MelonInfo(typeof(ml_asl.AvatarSyncedLook), "AvatarSyncedLook", "1.0.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonGame(null, "ChilloutVR")] +[assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] +[assembly: MelonLoader.MelonPlatformDomain(MelonLoader.MelonPlatformDomainAttribute.CompatibleDomains.MONO)] diff --git a/ml_asl/ResourcesHandler.cs b/ml_asl/ResourcesHandler.cs new file mode 100644 index 0000000..77a0c35 --- /dev/null +++ b/ml_asl/ResourcesHandler.cs @@ -0,0 +1,26 @@ +using System; +using System.IO; +using System.Reflection; + +namespace ml_asl +{ + static class ResourcesHandler + { + public static string GetEmbeddedResource(string p_name) + { + string l_result = ""; + Assembly l_assembly = Assembly.GetExecutingAssembly(); + string l_assemblyName = l_assembly.GetName().Name; + + try + { + Stream l_libraryStream = l_assembly.GetManifestResourceStream(l_assemblyName + ".resources." + p_name); + StreamReader l_streadReader = new StreamReader(l_libraryStream); + l_result = l_streadReader.ReadToEnd(); + } + catch(Exception) { } + + return l_result; + } + } +} diff --git a/ml_asl/Settings.cs b/ml_asl/Settings.cs new file mode 100644 index 0000000..251d8ae --- /dev/null +++ b/ml_asl/Settings.cs @@ -0,0 +1,75 @@ +using ABI_RC.Core.InteractionSystem; +using System; +using System.Collections.Generic; + +namespace ml_asl +{ + static class Settings + { + public enum ModSetting + { + Enabled = 0 + } + + public static bool Enabled { get; private set; } = true; + + static MelonLoader.MelonPreferences_Category ms_category = null; + static List ms_entries = null; + + static public event Action EnabledChange; + + internal static void Init() + { + ms_category = MelonLoader.MelonPreferences.CreateCategory("ASL", null, true); + + ms_entries = new List() + { + ms_category.CreateEntry(ModSetting.Enabled.ToString(), Enabled) + }; + + Enabled = (bool)ms_entries[(int)ModSetting.Enabled].BoxedValue; + + MelonLoader.MelonCoroutines.Start(WaitMainMenuUi()); + } + + static System.Collections.IEnumerator WaitMainMenuUi() + { + while(ViewManager.Instance == null) + yield return null; + while(ViewManager.Instance.gameMenuView == null) + yield return null; + while(ViewManager.Instance.gameMenuView.Listener == null) + yield return null; + + ViewManager.Instance.gameMenuView.Listener.ReadyForBindings += () => + { + ViewManager.Instance.gameMenuView.View.BindCall("OnToggleUpdate_" + ms_category.Identifier, new Action(OnToggleUpdate)); + }; + ViewManager.Instance.gameMenuView.Listener.FinishLoad += (_) => + { + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mods_extension.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mod_menu.js")); + foreach(var l_entry in ms_entries) + ViewManager.Instance.gameMenuView.View.TriggerEvent("updateModSetting", ms_category.Identifier, l_entry.DisplayName, l_entry.GetValueAsString()); + }; + } + + static void OnToggleUpdate(string p_name, string p_value) + { + if(Enum.TryParse(p_name, out ModSetting l_setting)) + { + switch(l_setting) + { + case ModSetting.Enabled: + { + Enabled = bool.Parse(p_value); + EnabledChange?.Invoke(Enabled); + } + break; + } + + ms_entries[(int)l_setting].BoxedValue = bool.Parse(p_value); + } + } + } +} diff --git a/ml_asl/Utils.cs b/ml_asl/Utils.cs new file mode 100644 index 0000000..ad7ddb3 --- /dev/null +++ b/ml_asl/Utils.cs @@ -0,0 +1,13 @@ +using ABI_RC.Core.UI; +using System.Reflection; +using UnityEngine; + +namespace ml_asl +{ + static class Utils + { + static readonly FieldInfo ms_view = typeof(CohtmlControlledViewWrapper).GetField("_view", BindingFlags.NonPublic | BindingFlags.Instance); + + static public void ExecuteScript(this CohtmlControlledViewWrapper p_instance, string p_script) => ((cohtml.Net.View)ms_view.GetValue(p_instance)).ExecuteScript(p_script); + } +} diff --git a/ml_asl/ml_asl.csproj b/ml_asl/ml_asl.csproj new file mode 100644 index 0000000..a80c681 --- /dev/null +++ b/ml_asl/ml_asl.csproj @@ -0,0 +1,56 @@ + + + + netstandard2.1 + x64 + AvatarSyncedLook + SDraw + None + AvatarSyncedLook + + + + + + + + + D:\Games\Steam\steamapps\common\ChilloutVR\MelonLoader\net35\0Harmony.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Assembly-CSharp.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Assembly-CSharp-firstpass.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\cohtml.Net.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Cohtml.Runtime.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\MelonLoader\net35\MelonLoader.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.CoreModule.dll + false + + + + + + + + + + + + + diff --git a/ml_asl/resources/mod_menu.js b/ml_asl/resources/mod_menu.js new file mode 100644 index 0000000..edcb0c3 --- /dev/null +++ b/ml_asl/resources/mod_menu.js @@ -0,0 +1,22 @@ +// Add own menu +{ + let l_block = document.createElement('div'); + l_block.innerHTML = ` +
+
Avatar Synced Look
+
+
+ +
+
Enabled:
+
+
+
+
+ `; + document.getElementById('settings-interaction').appendChild(l_block); + + // Toggles + for (let l_toggle of l_block.querySelectorAll('.inp_toggle')) + modsExtension.addSetting('ASL', l_toggle.id, modsExtension.createToggle(l_toggle, 'OnToggleUpdate_ASL')); +} diff --git a/ml_lme/Scripts.cs b/ml_lme/ResourcesHandler.cs similarity index 86% rename from ml_lme/Scripts.cs rename to ml_lme/ResourcesHandler.cs index 9f38c99..302657d 100644 --- a/ml_lme/Scripts.cs +++ b/ml_lme/ResourcesHandler.cs @@ -4,9 +4,9 @@ using System.Reflection; namespace ml_lme { - static class Scripts + static class ResourcesHandler { - public static string GetEmbeddedScript(string p_name) + public static string GetEmbeddedResource(string p_name) { string l_result = ""; Assembly l_assembly = Assembly.GetExecutingAssembly(); diff --git a/ml_lme/Settings.cs b/ml_lme/Settings.cs index 5a06b90..5c6b94c 100644 --- a/ml_lme/Settings.cs +++ b/ml_lme/Settings.cs @@ -121,8 +121,8 @@ namespace ml_lme }; ViewManager.Instance.gameMenuView.Listener.FinishLoad += (_) => { - ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("mods_extension.js")); - ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("mod_menu.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mods_extension.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mod_menu.js")); foreach(var l_entry in ms_entries) ViewManager.Instance.gameMenuView.View.TriggerEvent("updateModSetting", ms_category.Identifier, l_entry.DisplayName, l_entry.GetValueAsString()); }; diff --git a/ml_mods_cvr.sln b/ml_mods_cvr.sln index 8a8dfbb..35b3cf5 100644 --- a/ml_mods_cvr.sln +++ b/ml_mods_cvr.sln @@ -18,6 +18,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ml_vei", "ml_vei\ml_vei.csp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ml_prm", "ml_prm\ml_prm.csproj", "{C4C3F080-379F-49DB-ADC6-6328BE884AE3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ml_asl", "ml_asl\ml_asl.csproj", "{5B4EC6EF-541A-47D2-B602-915205590553}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ml_pin", "ml_pin\ml_pin.csproj", "{7E493C28-7202-46F8-9789-D6C6FF7E5241}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -44,6 +48,12 @@ Global {C4C3F080-379F-49DB-ADC6-6328BE884AE3}.Debug|x64.Build.0 = Debug|x64 {C4C3F080-379F-49DB-ADC6-6328BE884AE3}.Release|x64.ActiveCfg = Release|x64 {C4C3F080-379F-49DB-ADC6-6328BE884AE3}.Release|x64.Build.0 = Release|x64 + {5B4EC6EF-541A-47D2-B602-915205590553}.Debug|x64.ActiveCfg = Debug|x64 + {5B4EC6EF-541A-47D2-B602-915205590553}.Release|x64.ActiveCfg = Release|x64 + {5B4EC6EF-541A-47D2-B602-915205590553}.Release|x64.Build.0 = Release|x64 + {7E493C28-7202-46F8-9789-D6C6FF7E5241}.Debug|x64.ActiveCfg = Debug|x64 + {7E493C28-7202-46F8-9789-D6C6FF7E5241}.Release|x64.ActiveCfg = Release|x64 + {7E493C28-7202-46F8-9789-D6C6FF7E5241}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ml_pam/Scripts.cs b/ml_pam/ResourcesHandler.cs similarity index 86% rename from ml_pam/Scripts.cs rename to ml_pam/ResourcesHandler.cs index 5509d9e..748dac3 100644 --- a/ml_pam/Scripts.cs +++ b/ml_pam/ResourcesHandler.cs @@ -4,9 +4,9 @@ using System.Reflection; namespace ml_pam { - static class Scripts + static class ResourcesHandler { - public static string GetEmbeddedScript(string p_name) + public static string GetEmbeddedResources(string p_name) { string l_result = ""; Assembly l_assembly = Assembly.GetExecutingAssembly(); diff --git a/ml_pam/Settings.cs b/ml_pam/Settings.cs index c0ee537..ff841ac 100644 --- a/ml_pam/Settings.cs +++ b/ml_pam/Settings.cs @@ -70,8 +70,8 @@ namespace ml_pam }; ViewManager.Instance.gameMenuView.Listener.FinishLoad += (_) => { - ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("mods_extension.js")); - ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("mod_menu.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResources("mods_extension.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResources("mod_menu.js")); foreach(var l_entry in ms_entries) ViewManager.Instance.gameMenuView.View.TriggerEvent("updateModSetting", ms_category.Identifier, l_entry.DisplayName, l_entry.GetValueAsString()); }; diff --git a/ml_pin/Main.cs b/ml_pin/Main.cs new file mode 100644 index 0000000..17a7c51 --- /dev/null +++ b/ml_pin/Main.cs @@ -0,0 +1,117 @@ +using ABI_RC.Core.AudioEffects; +using ABI_RC.Core.Networking.IO.Social; +using ABI_RC.Core.Player; +using ABI_RC.Core.Savior; +using ABI_RC.Systems.GameEventSystem; +using System; +using System.Collections; + +namespace ml_pin +{ + public class PlayersInstanceNotifier : MelonLoader.MelonMod + { + SoundManager m_soundManager = null; + + public override void OnInitializeMelon() + { + Settings.Init(); + ResourcesHandler.ExtractAudioResources(); + + MelonLoader.MelonCoroutines.Start(WaitForInstances()); + } + + public override void OnDeinitializeMelon() + { + m_soundManager = null; + } + + IEnumerator WaitForInstances() + { + if(InterfaceAudio.Instance == null) + yield return null; + + m_soundManager = new SoundManager(); + m_soundManager.LoadSounds(); + + CVRGameEventSystem.Player.OnJoin.AddListener(OnPlayerJoin); + CVRGameEventSystem.Player.OnLeave.AddListener(OnPlayerLeave); + } + + void OnPlayerJoin(PlayerDescriptor p_player) + { + try + { + bool l_isFriend = Friends.FriendsWith(p_player.ownerId); + bool l_notify = true; + + switch(Settings.NotifyType) + { + case Settings.NotificationType.None: + l_notify = false; + break; + case Settings.NotificationType.Friends: + l_notify = (ShouldNotifyInCurrentInstance() && l_isFriend); + break; + case Settings.NotificationType.All: + l_notify = ShouldNotifyInCurrentInstance(); + break; + } + l_notify |= (Settings.FriendsAlways && l_isFriend); + + if(l_notify) + { + if(l_isFriend) + m_soundManager?.PlaySound(SoundManager.SoundType.FriendJoin); + else + m_soundManager?.PlaySound(SoundManager.SoundType.PlayerJoin); + } + } + catch(Exception e) + { + MelonLoader.MelonLogger.Warning(e); + } + } + void OnPlayerLeave(PlayerDescriptor p_player) + { + try + { + bool l_isFriend = Friends.FriendsWith(p_player.ownerId); + bool l_notify = true; + + switch(Settings.NotifyType) + { + case Settings.NotificationType.None: + l_notify = false; + break; + case Settings.NotificationType.Friends: + l_notify = (ShouldNotifyInCurrentInstance() && l_isFriend); + break; + case Settings.NotificationType.All: + l_notify = ShouldNotifyInCurrentInstance(); + break; + } + l_notify |= (Settings.FriendsAlways && l_isFriend); + + if(l_notify) + { + if(l_isFriend) + m_soundManager?.PlaySound(SoundManager.SoundType.FriendLeave); + else + m_soundManager?.PlaySound(SoundManager.SoundType.PlayerLeave); + } + } + catch(Exception e) + { + MelonLoader.MelonLogger.Warning(e); + } + } + + bool ShouldNotifyInCurrentInstance() + { + bool l_isInPublic = Settings.NotifyInPublic && MetaPort.Instance.CurrentInstancePrivacy.Contains("Public"); + bool l_isInFriends = Settings.NotifyInFriends && MetaPort.Instance.CurrentInstancePrivacy.Contains("Friends"); + bool l_isInPrivate = Settings.NotifyInPrivate && MetaPort.Instance.CurrentInstancePrivacy.Contains("invite"); + return (l_isInPublic || l_isInFriends || l_isInPrivate); + } + } +} diff --git a/ml_pin/Properties/AssemblyInfo.cs b/ml_pin/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2f15188 --- /dev/null +++ b/ml_pin/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +[assembly: MelonLoader.MelonInfo(typeof(ml_pin.PlayersInstanceNotifier), "PlayersInstanceNotifier", "1.0.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonGame(null, "ChilloutVR")] +[assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] +[assembly: MelonLoader.MelonPlatformDomain(MelonLoader.MelonPlatformDomainAttribute.CompatibleDomains.MONO)] diff --git a/ml_pin/ResourcesHandler.cs b/ml_pin/ResourcesHandler.cs new file mode 100644 index 0000000..8a60dda --- /dev/null +++ b/ml_pin/ResourcesHandler.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; + +namespace ml_pin +{ + static class ResourcesHandler + { + const string c_modName = "PlayersInstanceNotifier"; + + static readonly List ms_audioResources = new List() + { + "Chime.wav", + "DoorClose.wav" + }; + + public static void ExtractAudioResources() + { + string l_dirPath = MelonLoader.Utils.MelonEnvironment.UserDataDirectory; + if(!Directory.Exists(l_dirPath)) + Directory.CreateDirectory(l_dirPath); + + l_dirPath = Path.Combine(l_dirPath, c_modName); + if(!Directory.Exists(l_dirPath)) + Directory.CreateDirectory(l_dirPath); + + string l_filePath = Path.Combine(l_dirPath, "player_join.wav"); + if(!File.Exists(l_filePath)) + ExtractAudioFile(ms_audioResources[0], l_filePath); + + l_filePath = Path.Combine(l_dirPath, "player_leave.wav"); + if(!File.Exists(l_filePath)) + ExtractAudioFile(ms_audioResources[1], l_filePath); + + l_filePath = Path.Combine(l_dirPath, "friend_join.wav"); + if(!File.Exists(l_filePath)) + ExtractAudioFile(ms_audioResources[0], l_filePath); + + l_filePath = Path.Combine(l_dirPath, "friend_leave.wav"); + if(!File.Exists(l_filePath)) + ExtractAudioFile(ms_audioResources[1], l_filePath); + } + + static void ExtractAudioFile(string p_name, string p_path) + { + Assembly l_assembly = Assembly.GetExecutingAssembly(); + string l_assemblyName = l_assembly.GetName().Name; + + try + { + Stream l_resourceStream = l_assembly.GetManifestResourceStream(l_assemblyName + ".resources." + p_name); + Stream l_fileStream = File.Create(p_path); + l_resourceStream.CopyTo(l_fileStream); + l_fileStream.Flush(); + l_fileStream.Close(); + l_resourceStream.Close(); + } + catch(Exception) + { + MelonLoader.MelonLogger.Warning("Unable to write '" + p_path + "' file, problems can occur."); + } + } + + public static string GetEmbeddedResource(string p_name) + { + string l_result = ""; + Assembly l_assembly = Assembly.GetExecutingAssembly(); + string l_assemblyName = l_assembly.GetName().Name; + + try + { + Stream l_libraryStream = l_assembly.GetManifestResourceStream(l_assemblyName + ".resources." + p_name); + StreamReader l_streadReader = new StreamReader(l_libraryStream); + l_result = l_streadReader.ReadToEnd(); + } + catch(Exception) { } + + return l_result; + } + } +} diff --git a/ml_pin/Settings.cs b/ml_pin/Settings.cs new file mode 100644 index 0000000..d8a45f9 --- /dev/null +++ b/ml_pin/Settings.cs @@ -0,0 +1,166 @@ +using ABI_RC.Core.InteractionSystem; +using System; +using System.Collections.Generic; + +namespace ml_pin +{ + static class Settings + { + public enum NotificationType + { + None = 0, + Friends, + All + }; + + enum ModSetting + { + NotifyType, + Volume, + NotifyInPublic, + NotifyInFriends, + NotifyInPrivate, + FriendsAlways + }; + + public static NotificationType NotifyType { get; private set; } = NotificationType.All; + public static float Volume { get; private set; } = 1.0f; + public static bool NotifyInPublic { get; private set; } = true; + public static bool NotifyInFriends { get; private set; } = true; + public static bool NotifyInPrivate { get; private set; } = true; + public static bool FriendsAlways { get; private set; } = false; + + static MelonLoader.MelonPreferences_Category ms_category = null; + static List ms_entries = null; + + static public event Action NotifyTypeChange; + static public event Action VolumeChange; + static public event Action NotifyInPublicChange; + static public event Action NotifyInFriendsChange; + static public event Action NotifyInPrivateChange; + static public event Action FriendsAlwaysChange; + + internal static void Init() + { + ms_category = MelonLoader.MelonPreferences.CreateCategory("PIN", null, true); + + ms_entries = new List() + { + ms_category.CreateEntry(ModSetting.NotifyType.ToString(), (int)NotifyType), + ms_category.CreateEntry(ModSetting.Volume.ToString(), (int)(Volume * 100f)), + ms_category.CreateEntry(ModSetting.NotifyInPublic.ToString(), NotifyInPublic), + ms_category.CreateEntry(ModSetting.NotifyInFriends.ToString(), NotifyInFriends), + ms_category.CreateEntry(ModSetting.NotifyInPrivate.ToString(), NotifyInPrivate), + ms_category.CreateEntry(ModSetting.FriendsAlways.ToString(), FriendsAlways), + }; + + NotifyType = (NotificationType)(int)ms_entries[(int)ModSetting.NotifyType].BoxedValue; + Volume = (int)ms_entries[(int)ModSetting.Volume].BoxedValue * 0.01f; + NotifyInPublic = (bool)ms_entries[(int)ModSetting.NotifyInPublic].BoxedValue; + NotifyInFriends = (bool)ms_entries[(int)ModSetting.NotifyInFriends].BoxedValue; + NotifyInPrivate = (bool)ms_entries[(int)ModSetting.NotifyInPrivate].BoxedValue; + FriendsAlways = (bool)ms_entries[(int)ModSetting.FriendsAlways].BoxedValue; + + MelonLoader.MelonCoroutines.Start(WaitMainMenuUi()); + } + + static System.Collections.IEnumerator WaitMainMenuUi() + { + while(ViewManager.Instance == null) + yield return null; + while(ViewManager.Instance.gameMenuView == null) + yield return null; + while(ViewManager.Instance.gameMenuView.Listener == null) + yield return null; + + ViewManager.Instance.gameMenuView.Listener.ReadyForBindings += () => + { + ViewManager.Instance.gameMenuView.View.BindCall("OnToggleUpdate_" + ms_category.Identifier, new Action(OnToggleUpdate)); + ViewManager.Instance.gameMenuView.View.BindCall("OnSliderUpdate_" + ms_category.Identifier, new Action(OnSliderUpdate)); + ViewManager.Instance.gameMenuView.View.BindCall("OnDropdownUpdate_" + ms_category.Identifier, new Action(OnDropdownUpdate)); + }; + ViewManager.Instance.gameMenuView.Listener.FinishLoad += (_) => + { + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mods_extension.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mod_menu.js")); + foreach(var l_entry in ms_entries) + ViewManager.Instance.gameMenuView.View.TriggerEvent("updateModSetting", ms_category.Identifier, l_entry.DisplayName, l_entry.GetValueAsString()); + }; + } + + static void OnToggleUpdate(string p_name, string p_value) + { + if(Enum.TryParse(p_name, out ModSetting l_setting)) + { + switch(l_setting) + { + case ModSetting.NotifyInPublic: + { + NotifyInPublic = bool.Parse(p_value); + NotifyInPublicChange?.Invoke(NotifyInPublic); + } + break; + + case ModSetting.NotifyInFriends: + { + NotifyInFriends = bool.Parse(p_value); + NotifyInFriendsChange?.Invoke(NotifyInFriends); + } + break; + + case ModSetting.NotifyInPrivate: + { + NotifyInPrivate = bool.Parse(p_value); + NotifyInPrivateChange?.Invoke(NotifyInPrivate); + } + break; + + case ModSetting.FriendsAlways: + { + FriendsAlways = bool.Parse(p_value); + FriendsAlwaysChange?.Invoke(FriendsAlways); + } + break; + } + + ms_entries[(int)l_setting].BoxedValue = bool.Parse(p_value); + } + } + + static void OnSliderUpdate(string p_name, string p_value) + { + if(Enum.TryParse(p_name, out ModSetting l_setting)) + { + switch(l_setting) + { + case ModSetting.Volume: + { + Volume = int.Parse(p_value) * 0.01f; + VolumeChange?.Invoke(Volume); + } + break; + } + + ms_entries[(int)l_setting].BoxedValue = int.Parse(p_value); + } + } + + static void OnDropdownUpdate(string p_name, string p_value) + { + if(Enum.TryParse(p_name, out ModSetting l_setting)) + { + switch(l_setting) + { + case ModSetting.NotifyType: + { + NotifyType = (NotificationType)int.Parse(p_value); + NotifyTypeChange?.Invoke(NotifyType); + } + break; + } + + ms_entries[(int)l_setting].BoxedValue = int.Parse(p_value); + } + } + } +} diff --git a/ml_pin/SoundManager.cs b/ml_pin/SoundManager.cs new file mode 100644 index 0000000..417e04f --- /dev/null +++ b/ml_pin/SoundManager.cs @@ -0,0 +1,70 @@ +using ABI_RC.Core.AudioEffects; +using System.Collections; +using System.IO; +using UnityEngine; +using UnityEngine.Networking; + +namespace ml_pin +{ + class SoundManager + { + public enum SoundType + { + PlayerJoin = 0, + PlayerLeave, + FriendJoin, + FriendLeave + } + + const string c_modName = "PlayersInstanceNotifier"; + + bool m_loaded = false; + readonly AudioClip[] m_clips = null; + + internal SoundManager() + { + m_clips = new AudioClip[4]; + for(int i = 0; i < 4; i++) + m_clips[i] = null; + } + public void LoadSounds() + { + if(!m_loaded) + { + MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.PlayerJoin, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "player_join.wav"))); + MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.PlayerLeave, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "player_leave.wav"))); + MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.FriendJoin, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "friend_join.wav"))); + MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.FriendLeave, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "friend_leave.wav"))); + + m_loaded = true; + } + } + + IEnumerator LoadAudioClip(SoundType p_type, string p_path) + { + using UnityWebRequest l_uwr = UnityWebRequestMultimedia.GetAudioClip("file://" + p_path, AudioType.WAV); + ((DownloadHandlerAudioClip)l_uwr.downloadHandler).streamAudio = true; + yield return l_uwr.SendWebRequest(); + + if(l_uwr.isNetworkError || l_uwr.isHttpError) + { + MelonLoader.MelonLogger.Warning(l_uwr.error); + yield break; + } + + AudioClip l_content; + AudioClip l_clip = (l_content = DownloadHandlerAudioClip.GetContent(l_uwr)); + yield return l_content; + if(!l_uwr.isDone || (l_clip == null)) + yield break; + + m_clips[(int)p_type] = l_clip; + } + + public void PlaySound(SoundType p_type) + { + if(m_loaded && (m_clips[(int)p_type] != null)) + InterfaceAudio.Instance.UserInterfaceAudio.PlayOneShot(m_clips[(int)p_type], Settings.Volume); + } + } +} diff --git a/ml_pin/Utils.cs b/ml_pin/Utils.cs new file mode 100644 index 0000000..105f01a --- /dev/null +++ b/ml_pin/Utils.cs @@ -0,0 +1,12 @@ +using ABI_RC.Core.UI; +using System.Reflection; + +namespace ml_pin +{ + static class Utils + { + static readonly FieldInfo ms_view = typeof(CohtmlControlledViewWrapper).GetField("_view", BindingFlags.NonPublic | BindingFlags.Instance); + + static public void ExecuteScript(this CohtmlControlledViewWrapper p_instance, string p_script) => ((cohtml.Net.View)ms_view.GetValue(p_instance)).ExecuteScript(p_script); + } +} diff --git a/ml_pin/ml_pin.csproj b/ml_pin/ml_pin.csproj new file mode 100644 index 0000000..3e5f704 --- /dev/null +++ b/ml_pin/ml_pin.csproj @@ -0,0 +1,75 @@ + + + + netstandard2.1 + x64 + PlayersInstanceNotifier + SDraw + None + PlayersInstanceNotifier + + + + + + + + + + + + + + + + + + + + + D:\Games\Steam\steamapps\common\ChilloutVR\MelonLoader\net35\0Harmony.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Assembly-CSharp.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\cohtml.Net.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Cohtml.Runtime.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\MelonLoader\net35\MelonLoader.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.AudioModule.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.CoreModule.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll + false + + + D:\Games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.UnityWebRequestModule.dll + false + + + + + + + + diff --git a/ml_pin/resources/Chime.wav b/ml_pin/resources/Chime.wav new file mode 100644 index 0000000000000000000000000000000000000000..1692babeadec73fd80c380f65f567b346a8bf305 GIT binary patch literal 62480 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 eKFR;UU!T$lTC|tq- literal 0 HcmV?d00001 diff --git a/ml_pin/resources/DoorClose.wav b/ml_pin/resources/DoorClose.wav new file mode 100644 index 0000000000000000000000000000000000000000..2af0329ab8e8560152d39b980b36426072b017cd GIT binary patch literal 33556 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 f2VUX`mw9I8cdtfxM1 +
Players Instance Notifier
+
+ + +
+
Notify of:
+
+
+
+
+ +
+
Mixed volume:
+
+
+
+
+ +
+
Notify in public instances:
+
+
+
+
+ +
+
Notify in friends instances:
+
+
+
+
+ +
+
Notify in private instances:
+
+
+
+
+ +
+
Always notify of friends:
+
+
+
+
+ `; + document.getElementById('settings-audio').appendChild(l_block); + + // Toggles + for (let l_toggle of l_block.querySelectorAll('.inp_toggle')) + modsExtension.addSetting('PIN', l_toggle.id, modsExtension.createToggle(l_toggle, 'OnToggleUpdate_PIN')); + + // Sliders + for (let l_slider of l_block.querySelectorAll('.inp_slider')) + modsExtension.addSetting('PIN', l_slider.id, modsExtension.createSlider(l_slider, 'OnSliderUpdate_PIN')); + + // Dropdowns + for (let l_dropdown of l_block.querySelectorAll('.inp_dropdown')) + modsExtension.addSetting('PIN', l_dropdown.id, modsExtension.createDropdown(l_dropdown, 'OnDropdownUpdate_PIN')); +} diff --git a/ml_vei/Scripts.cs b/ml_vei/ResourcesHandler.cs similarity index 86% rename from ml_vei/Scripts.cs rename to ml_vei/ResourcesHandler.cs index 82ef9de..dc85942 100644 --- a/ml_vei/Scripts.cs +++ b/ml_vei/ResourcesHandler.cs @@ -4,9 +4,9 @@ using System.Reflection; namespace ml_vei { - static class Scripts + static class ResourcesHandler { - public static string GetEmbeddedScript(string p_name) + public static string GetEmbeddedResource(string p_name) { string l_result = ""; Assembly l_assembly = Assembly.GetExecutingAssembly(); diff --git a/ml_vei/Settings.cs b/ml_vei/Settings.cs index d8d2eea..72f9d6c2 100644 --- a/ml_vei/Settings.cs +++ b/ml_vei/Settings.cs @@ -64,8 +64,8 @@ namespace ml_vei }; ViewManager.Instance.gameMenuView.Listener.FinishLoad += (_) => { - ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("mods_extension.js")); - ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("mod_menu.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mods_extension.js")); + ViewManager.Instance.gameMenuView.View.ExecuteScript(ResourcesHandler.GetEmbeddedResource("mod_menu.js")); foreach(var l_entry in ms_entries) ViewManager.Instance.gameMenuView.View.TriggerEvent("updateModSetting", ms_category.Identifier, l_entry.DisplayName, l_entry.GetValueAsString()); }; diff --git a/ml_vei/ml_vei.csproj b/ml_vei/ml_vei.csproj index fe15f35..10674f2 100644 --- a/ml_vei/ml_vei.csproj +++ b/ml_vei/ml_vei.csproj @@ -26,9 +26,11 @@ D:\games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\cohtml.Net.dll + false D:\games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Cohtml.Runtime.dll + false D:\games\Steam\steamapps\common\ChilloutVR\MelonLoader\net35\MelonLoader.dll