From 1c9822dba208ae046f2c982c8a2eb900e2f646f0 Mon Sep 17 00:00:00 2001 From: SDraw Date: Sun, 31 Dec 2023 17:54:39 +0300 Subject: [PATCH] Fall damage _(flops)_ --- README.md | 8 +++---- ml_amt/Properties/AssemblyInfo.cs | 2 +- ml_amt/Utils.cs | 1 - ml_amt/ml_amt.csproj | 2 +- ml_pin/Main.cs | 18 +++++++------- ml_pin/Properties/AssemblyInfo.cs | 2 +- ml_pin/ml_pin.csproj | 1 + ml_prm/ModUi.cs | 20 +++++++++++++++- ml_prm/Properties/AssemblyInfo.cs | 2 +- ml_prm/README.md | 4 +++- ml_prm/RagdollController.cs | 39 +++++++++++++++++++++++++++++++ ml_prm/Settings.cs | 26 ++++++++++++++++++++- ml_prm/Utils.cs | 2 +- ml_prm/ml_prm.csproj | 2 +- 14 files changed, 106 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 20937c3..97f0787 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,13 @@ Merged set of MelonLoader mods for ChilloutVR. **Table for game build 2023r173:** | 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 | +| [Avatar Motion Tweaker](/ml_amt/README.md) | ml_amt | 1.3.6 [:arrow_down:](../../releases/latest/download/ml_amt.dll)| ✔ Yes
:hourglass: Update review | +| [Avatar Synced Look](/ml_asl/README.md) | ml_asl | 1.0.0 [:arrow_down:](../../releases/latest/download/ml_asl.dll)| ✔ Yes | | [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 | +| [Player Ragdoll Mod](/ml_prm/README.md) | ml_prm | 1.1.2 [:arrow_down:](../../releases/latest/download/ml_prm.dll)| ✔ Yes
:hourglass: Update review | +| [Players Instance Notifier](/ml_pin/README.md) | ml_pin | 1.0.1 [:arrow_down:](../../releases/latest/download/ml_ml_pin.dll)| ✔ Yes
:hourglass: Update 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/Properties/AssemblyInfo.cs b/ml_amt/Properties/AssemblyInfo.cs index 3c34172..89aeb24 100644 --- a/ml_amt/Properties/AssemblyInfo.cs +++ b/ml_amt/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -[assembly: MelonLoader.MelonInfo(typeof(ml_amt.AvatarMotionTweaker), "AvatarMotionTweaker", "1.3.5", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_amt.AvatarMotionTweaker), "AvatarMotionTweaker", "1.3.6", "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_amt/Utils.cs b/ml_amt/Utils.cs index 1d649a7..d6d28b5 100644 --- a/ml_amt/Utils.cs +++ b/ml_amt/Utils.cs @@ -16,7 +16,6 @@ namespace ml_amt public static bool IsInVR() => ((ABI_RC.Core.Savior.CheckVR.Instance != null) && ABI_RC.Core.Savior.CheckVR.Instance.hasVrDeviceLoaded); - public static bool IsGrounded(this MovementSystem p_instance) => (bool)ms_grounded.GetValue(MovementSystem.Instance); public static bool IsGroundedRaw(this MovementSystem p_instance) => (bool)ms_groundedRaw.GetValue(MovementSystem.Instance); public static bool HasToes(this IKSolverVR p_instance) => (bool)ms_hasToes.GetValue(p_instance); diff --git a/ml_amt/ml_amt.csproj b/ml_amt/ml_amt.csproj index 3b37445..df42050 100644 --- a/ml_amt/ml_amt.csproj +++ b/ml_amt/ml_amt.csproj @@ -6,7 +6,7 @@ None AvatarMotionTweaker AvatarMotionTweaker - 1.3.5 + 1.3.6 x64 ml_amt diff --git a/ml_pin/Main.cs b/ml_pin/Main.cs index 662ca9b..f89d611 100644 --- a/ml_pin/Main.cs +++ b/ml_pin/Main.cs @@ -42,7 +42,7 @@ namespace ml_pin try { bool l_isFriend = Friends.FriendsWith(p_player.ownerId); - bool l_notify = true; + bool l_notify = false; switch(Settings.NotifyType) { @@ -50,13 +50,13 @@ namespace ml_pin l_notify = false; break; case Settings.NotificationType.Friends: - l_notify = (ShouldNotifyInCurrentInstance() && l_isFriend); + l_notify = (l_isFriend && ShouldNotifyInCurrentInstance()); break; case Settings.NotificationType.All: l_notify = ShouldNotifyInCurrentInstance(); break; } - l_notify |= (Settings.FriendsAlways && l_isFriend); + l_notify |= (l_isFriend && Settings.FriendsAlways); if(l_notify) m_soundManager?.PlaySound(l_isFriend ? SoundManager.SoundType.FriendJoin : SoundManager.SoundType.PlayerJoin); @@ -71,7 +71,7 @@ namespace ml_pin try { bool l_isFriend = Friends.FriendsWith(p_player.ownerId); - bool l_notify = true; + bool l_notify = false; switch(Settings.NotifyType) { @@ -79,13 +79,13 @@ namespace ml_pin l_notify = false; break; case Settings.NotificationType.Friends: - l_notify = (ShouldNotifyInCurrentInstance() && l_isFriend); + l_notify = (l_isFriend && ShouldNotifyInCurrentInstance()); break; case Settings.NotificationType.All: l_notify = ShouldNotifyInCurrentInstance(); break; } - l_notify |= (Settings.FriendsAlways && l_isFriend); + l_notify |= (l_isFriend && Settings.FriendsAlways); if(l_notify) m_soundManager?.PlaySound(l_isFriend ? SoundManager.SoundType.FriendLeave : SoundManager.SoundType.PlayerLeave); @@ -98,9 +98,9 @@ namespace ml_pin 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")); + bool l_isInPublic = (MetaPort.Instance.CurrentInstancePrivacy.Contains("Public") && Settings.NotifyInPublic); + bool l_isInFriends = (MetaPort.Instance.CurrentInstancePrivacy.Contains("Friends") && Settings.NotifyInFriends); + bool l_isInPrivate = (MetaPort.Instance.CurrentInstancePrivacy.Contains("invite") && Settings.NotifyInPrivate); return (l_isInPublic || l_isInFriends || l_isInPrivate); } } diff --git a/ml_pin/Properties/AssemblyInfo.cs b/ml_pin/Properties/AssemblyInfo.cs index 2f15188..99b7e2a 100644 --- a/ml_pin/Properties/AssemblyInfo.cs +++ b/ml_pin/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -[assembly: MelonLoader.MelonInfo(typeof(ml_pin.PlayersInstanceNotifier), "PlayersInstanceNotifier", "1.0.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_pin.PlayersInstanceNotifier), "PlayersInstanceNotifier", "1.0.1", "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/ml_pin.csproj b/ml_pin/ml_pin.csproj index 3e5f704..83a6959 100644 --- a/ml_pin/ml_pin.csproj +++ b/ml_pin/ml_pin.csproj @@ -7,6 +7,7 @@ SDraw None PlayersInstanceNotifier + 1.0.1 diff --git a/ml_prm/ModUi.cs b/ml_prm/ModUi.cs index 179adea..b19f00f 100644 --- a/ml_prm/ModUi.cs +++ b/ml_prm/ModUi.cs @@ -21,10 +21,12 @@ namespace ml_prm ViewVelocity, JumpRecover, Buoyancy, + FallDamage, VelocityMultiplier, MovementDrag, AngularDrag, - RecoverDelay + RecoverDelay, + FallLimit } static public event Action SwitchChange; @@ -85,6 +87,9 @@ namespace ml_prm ms_uiElements.Add(l_modCategory.AddToggle("Buoyancy", "Enable buoyancy in fluid volumes. Warning: constantly changes movement and air drag of hips, spine and chest.", Settings.Buoyancy)); (ms_uiElements[(int)UiIndex.Buoyancy] as BTKUILib.UIObjects.Components.ToggleButton).OnValueUpdated += (state) => OnToggleUpdate(UiIndex.Buoyancy, state); + ms_uiElements.Add(l_modCategory.AddToggle("Fall damage", "Enable ragdoll when falling from height", Settings.FallDamage)); + (ms_uiElements[(int)UiIndex.FallDamage] as BTKUILib.UIObjects.Components.ToggleButton).OnValueUpdated += (state) => OnToggleUpdate(UiIndex.FallDamage, state); + ms_uiElements.Add(l_modRoot.AddSlider("Velocity multiplier", "Velocity multiplier upon entering ragdoll state", Settings.VelocityMultiplier, 1f, 50f)); (ms_uiElements[(int)UiIndex.VelocityMultiplier] as BTKUILib.UIObjects.Components.SliderFloat).OnValueUpdated += (value) => OnSliderUpdate(UiIndex.VelocityMultiplier, value); @@ -97,6 +102,9 @@ namespace ml_prm ms_uiElements.Add(l_modRoot.AddSlider("Recover delay (seconds)", "Recover delay for automatic recover", Settings.RecoverDelay, 1f, 10f)); (ms_uiElements[(int)UiIndex.RecoverDelay] as BTKUILib.UIObjects.Components.SliderFloat).OnValueUpdated += (value) => OnSliderUpdate(UiIndex.RecoverDelay, value); + ms_uiElements.Add(l_modRoot.AddSlider("Fall limit", "Height limit for fall damage", Settings.FallLimit, 0f, 100f)); + (ms_uiElements[(int)UiIndex.FallLimit] as BTKUILib.UIObjects.Components.SliderFloat).OnValueUpdated += (value) => OnSliderUpdate(UiIndex.FallLimit, value); + l_modCategory.AddButton("Reset settings", "", "Reset mod settings to default").OnPress += Reset; } @@ -147,6 +155,10 @@ namespace ml_prm case UiIndex.Buoyancy: Settings.SetSetting(Settings.ModSetting.Buoyancy, p_state); break; + + case UiIndex.FallDamage: + Settings.SetSetting(Settings.ModSetting.FallDamage, p_state); + break; } if(p_force) @@ -172,6 +184,10 @@ namespace ml_prm case UiIndex.RecoverDelay: Settings.SetSetting(Settings.ModSetting.RecoverDelay, p_value); break; + + case UiIndex.FallLimit: + Settings.SetSetting(Settings.ModSetting.FallLimit, p_value); + break; } if(p_force) @@ -191,10 +207,12 @@ namespace ml_prm OnToggleUpdate(UiIndex.ViewVelocity, false, true); OnToggleUpdate(UiIndex.JumpRecover, false, true); OnToggleUpdate(UiIndex.Buoyancy, true, true); + OnToggleUpdate(UiIndex.FallDamage, true, true); OnSliderUpdate(UiIndex.VelocityMultiplier, 2f, true); OnSliderUpdate(UiIndex.MovementDrag, 1f, true); OnSliderUpdate(UiIndex.AngularDrag, 1f, true); OnSliderUpdate(UiIndex.RecoverDelay, 3f, true); + OnSliderUpdate(UiIndex.FallLimit, 5f, true); } static Stream GetIconStream(string p_name) diff --git a/ml_prm/Properties/AssemblyInfo.cs b/ml_prm/Properties/AssemblyInfo.cs index 72d550e..f2a0605 100644 --- a/ml_prm/Properties/AssemblyInfo.cs +++ b/ml_prm/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -[assembly: MelonLoader.MelonInfo(typeof(ml_prm.PlayerRagdollMod), "PlayerRagdollMod", "1.1.1", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_prm.PlayerRagdollMod), "PlayerRagdollMod", "1.1.2", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonPriority(2)] [assembly: MelonLoader.MelonOptionalDependencies("BTKUILib")] diff --git a/ml_prm/README.md b/ml_prm/README.md index 11ce0b4..8fc4126 100644 --- a/ml_prm/README.md +++ b/ml_prm/README.md @@ -26,8 +26,9 @@ Optional mod's settings page with [BTKUILib](https://github.com/BTK-Development/ * **View direction velocity:** apply velocity to camera view direction instead of player movement direction; `false` by default. * Note: Forcibly disabled in worlds that don't allow flight. * **Jump recover:** enables recovering from ragdoll state by jumping; `false` by default. -* **Buoyancy:** enabled floating in fluid volumes; `true` by default. +* **Buoyancy:** enables floating in fluid volumes; `true` by default. * Note: Forcibly enabled in worlds that don't allow flight. +* **Fall damage:** enables ragdoll when falling from specific height; `true` by default. * **Velocity multiplier:** velocity force multiplier based on player's movement direction; `2.0` by default. * Note: Limited according to world's fly multiplier. * Note: Forcibly set to `1.0` in worlds that don't allow flight. @@ -35,6 +36,7 @@ Optional mod's settings page with [BTKUILib](https://github.com/BTK-Development/ * Note: Forcibly set to `1.0` in worlds that don't allow flight. * **Angular movement drag:** angular movement resistance; `2.0` by default. * **Recover delay:** time delay for enabled `Auto recover` in seconds; `3.0` by default. +* **Fall limit:** height limit for fall damage; `5.0` by default. * **Reset settings:** resets mod settings to default. Optional mod's settings in [UIExpansionKit](https://github.com/ddakebono/ChilloutMods): diff --git a/ml_prm/RagdollController.cs b/ml_prm/RagdollController.cs index b41cf14..1f4cff1 100644 --- a/ml_prm/RagdollController.cs +++ b/ml_prm/RagdollController.cs @@ -52,6 +52,9 @@ namespace ml_prm float m_groundedTime = 0f; float m_downTime = float.MinValue; + bool m_inAir = false; + float m_inAirDistance = 0f; + internal RagdollController() { m_rigidBodies = new List(); @@ -88,6 +91,7 @@ namespace ml_prm Settings.SlipperinessChange += this.OnPhysicsMaterialChange; Settings.BouncinessChange += this.OnPhysicsMaterialChange; Settings.BuoyancyChange += this.OnBuoyancyChange; + Settings.FallDamageChange += this.OnFallDamageChange; } void OnDestroy() @@ -124,12 +128,29 @@ namespace ml_prm Settings.SlipperinessChange -= this.OnPhysicsMaterialChange; Settings.BouncinessChange -= this.OnPhysicsMaterialChange; Settings.BuoyancyChange -= this.OnBuoyancyChange; + Settings.FallDamageChange -= this.OnFallDamageChange; } void Update() { + if(m_avatarReady && !m_enabled && Settings.FallDamage && !MovementSystem.Instance.flying) + { + bool l_grounded = MovementSystem.Instance.IsGroundedRaw(); + if(m_inAir && l_grounded && (m_inAirDistance > Settings.FallLimit)) + { + m_inAirDistance = 0f; + SwitchRagdoll(); + } + + m_inAir = !l_grounded; + if(l_grounded) + m_inAirDistance = 0f; + } + if(m_avatarReady && m_enabled) { + m_inAirDistance = 0f; + Vector3 l_dif = m_puppetReferences.hips.position - m_ragdollLastPos; PlayerSetup.Instance.transform.position += l_dif; m_puppetReferences.hips.position -= l_dif; @@ -142,6 +163,12 @@ namespace ml_prm { Vector3 l_pos = PlayerSetup.Instance.transform.position; m_velocity = (m_velocity + (l_pos - m_lastPosition) / Time.deltaTime) * 0.5f; + if(m_inAir) + { + m_inAirDistance += (m_lastPosition - l_pos).y; + m_inAirDistance = Mathf.Clamp(m_inAirDistance, 0f, float.MaxValue); + } + m_lastPosition = l_pos; if(!m_reachedGround && MovementSystem.Instance.IsGrounded()) @@ -233,6 +260,8 @@ namespace ml_prm m_groundedTime = 0f; m_downTime = float.MinValue; m_puppetRoot.localScale = Vector3.one; + m_inAir = false; + m_inAirDistance = 0f; } internal void OnAvatarSetup() @@ -410,6 +439,7 @@ namespace ml_prm OnPhysicsMaterialChange(true); OnMovementDragChange(Settings.MovementDrag); OnBuoyancyChange(Settings.Buoyancy); + OnFallDamageChange(Settings.FallDamage); } internal void OnCombatDown() @@ -425,6 +455,8 @@ namespace ml_prm internal void OnChangeFlight() { + OnFallDamageChange(Settings.FallDamage); + if(m_avatarReady && m_enabled && MovementSystem.Instance.flying) { m_forcedSwitch = true; @@ -435,6 +467,8 @@ namespace ml_prm internal void OnPlayerTeleport() { + OnFallDamageChange(Settings.FallDamage); + if(m_avatarReady && m_enabled) m_ragdollLastPos = m_puppetReferences.hips.position; } @@ -530,6 +564,11 @@ namespace ml_prm } } } + void OnFallDamageChange(bool p_state) + { + m_inAir = false; + m_inAirDistance = 0f; + } // Arbitrary public void SwitchRagdoll() diff --git a/ml_prm/Settings.cs b/ml_prm/Settings.cs index 1685450..112dfae 100644 --- a/ml_prm/Settings.cs +++ b/ml_prm/Settings.cs @@ -23,7 +23,9 @@ namespace ml_prm Bounciness, ViewVelocity, JumpRecover, - Buoyancy + Buoyancy, + FallDamage, + FallLimit } public static bool Hotkey { get; private set; } = true; @@ -42,6 +44,8 @@ namespace ml_prm public static bool ViewVelocity { get; private set; } = false; public static bool JumpRecover { get; private set; } = false; public static bool Buoyancy { get; private set; } = true; + public static bool FallDamage { get; private set; } = true; + public static float FallLimit { get; private set; } = 5f; static public event Action HotkeyChange; static public event Action HotkeyKeyChange; @@ -59,6 +63,8 @@ namespace ml_prm static public event Action ViewVelocityChange; static public event Action JumpRecoverChange; static public event Action BuoyancyChange; + static public event Action FallDamageChange; + static public event Action FallLimitChange; static MelonLoader.MelonPreferences_Category ms_category = null; static List ms_entries = null; @@ -85,6 +91,8 @@ namespace ml_prm ms_category.CreateEntry(ModSetting.ViewVelocity.ToString(), ViewVelocity, null, null, true), ms_category.CreateEntry(ModSetting.JumpRecover.ToString(), JumpRecover, null, null, true), ms_category.CreateEntry(ModSetting.Buoyancy.ToString(), Buoyancy, null, null, true), + ms_category.CreateEntry(ModSetting.FallDamage.ToString(), FallDamage, null, null, true), + ms_category.CreateEntry(ModSetting.FallLimit.ToString(), FallLimit, null, null, true), }; ms_entries[(int)ModSetting.HotkeyKey].OnEntryValueChangedUntyped.Subscribe(OnMelonSettingSave_HotkeyKey); @@ -105,6 +113,8 @@ namespace ml_prm ViewVelocity = (bool)ms_entries[(int)ModSetting.ViewVelocity].BoxedValue; JumpRecover = (bool)ms_entries[(int)ModSetting.JumpRecover].BoxedValue; Buoyancy = (bool)ms_entries[(int)ModSetting.Buoyancy].BoxedValue; + FallDamage = (bool)ms_entries[(int)ModSetting.FallDamage].BoxedValue; + FallLimit = Mathf.Clamp((float)ms_entries[(int)ModSetting.FallLimit].BoxedValue, 0f, 100f); } static void OnMelonSettingSave_HotkeyKey(object p_oldValue, object p_newValue) @@ -198,6 +208,13 @@ namespace ml_prm } break; + case ModSetting.FallDamage: + { + FallDamage = (bool)p_value; + FallDamageChange?.Invoke((bool)p_value); + } + break; + // Floats case ModSetting.VelocityMultiplier: { @@ -226,6 +243,13 @@ namespace ml_prm RecoverDelayChange?.Invoke((float)p_value); } break; + + case ModSetting.FallLimit: + { + FallLimit = (float)p_value; + FallLimitChange?.Invoke((float)p_value); + } + break; } if(ms_entries != null) diff --git a/ml_prm/Utils.cs b/ml_prm/Utils.cs index 22226e1..909f656 100644 --- a/ml_prm/Utils.cs +++ b/ml_prm/Utils.cs @@ -31,7 +31,7 @@ namespace ml_prm return l_result; } - public static bool IsGrounded(this MovementSystem p_instance) => (bool)ms_groundedRaw.GetValue(p_instance); + public static bool IsGroundedRaw(this MovementSystem p_instance) => (bool)ms_groundedRaw.GetValue(p_instance); public static Vector3 GetAppliedGravity(this MovementSystem p_instance) => (Vector3)ms_appliedGravity.GetValue(p_instance); public static void SetAppliedGravity(this MovementSystem p_instance, Vector3 p_vec) => ms_appliedGravity.SetValue(p_instance, p_vec); public static void ClearFluidVolumes(this MovementSystem p_instance) => (ms_touchingVolumes.GetValue(p_instance) as List)?.Clear(); diff --git a/ml_prm/ml_prm.csproj b/ml_prm/ml_prm.csproj index e4fd07b..4eb706f 100644 --- a/ml_prm/ml_prm.csproj +++ b/ml_prm/ml_prm.csproj @@ -4,7 +4,7 @@ netstandard2.1 x64 PlayerRagdollMod - 1.1.1 + 1.1.2 SDraw None PlayerRagdollMod