From e4264188060ac5ed0f69b3656689323179a7aba0 Mon Sep 17 00:00:00 2001 From: kafeijao Date: Sat, 8 Apr 2023 19:31:57 +0100 Subject: [PATCH] Added a unity editor script to toggle ragdoll via animation on your avatar --- ml_prm/Main.cs | 6 ++++++ ml_prm/README.md | 12 ++++++++++++ ml_prm/RagdollController.cs | 9 +++++++++ ml_prm/RagdollToggle.cs | 12 ++++++++++++ ml_prm/ml_prm_editor_script.unitypackage | Bin 0 -> 862 bytes .../resources/ragdoll_toggle_editor_script.png | Bin 0 -> 6326 bytes 6 files changed, 39 insertions(+) create mode 100644 ml_prm/RagdollToggle.cs create mode 100644 ml_prm/ml_prm_editor_script.unitypackage create mode 100644 ml_prm/resources/ragdoll_toggle_editor_script.png diff --git a/ml_prm/Main.cs b/ml_prm/Main.cs index 06479de..75852e7 100644 --- a/ml_prm/Main.cs +++ b/ml_prm/Main.cs @@ -3,7 +3,9 @@ using ABI_RC.Core.InteractionSystem; using ABI_RC.Core.Player; using ABI_RC.Systems.IK.SubSystems; using System; +using System.Collections.Generic; using System.Reflection; +using ABI_RC.Core.Util.AssetFiltering; namespace ml_prm { @@ -46,6 +48,10 @@ namespace ml_prm null ); + // Whitelist the toggle script + var l_localComponentWhitelist = typeof(SharedFilter).GetField("_localComponentWhitelist", BindingFlags.NonPublic | BindingFlags.Static)!.GetValue(null) as HashSet; + l_localComponentWhitelist!.Add(typeof(RagdollToggle)); + MelonLoader.MelonCoroutines.Start(WaitForLocalPlayer()); } diff --git a/ml_prm/README.md b/ml_prm/README.md index 3bb96a7..cffb93c 100644 --- a/ml_prm/README.md +++ b/ml_prm/README.md @@ -23,3 +23,15 @@ Optional mod's settings with [BTKUILib](https://github.com/BTK-Development/BTKUI * Incompatible with `Follow hips on IK override` option in AvatarMotionTweaker. * Not suggested to activate fly mode with enabled ragdoll state. * Can't be activated in worlds that don't allow flying and spawnables. + +# Unity Editor Script +You can also trigger the ragdoll via animations on your avatar. To do this you need to download and import the +`ml_prm_editor_script.unitypackage` into your unity project. Then add the component `Ragdoll Toggle` anywhere inside of +your avatar's hierarchy. Now you can animate both parameters available: + +- **Should Override:** Whether the animation should override the toggled state of the ragdoll. +- **Is On:** Whether the ragdoll state is On or Off (only works if `Should Override` is also On). + +![](resources/ragdoll_toggle_editor_script.png) + +**Note:** In order to work the game object needs to be active and the component enabled. diff --git a/ml_prm/RagdollController.cs b/ml_prm/RagdollController.cs index 6c7d2ab..ecd7fdc 100644 --- a/ml_prm/RagdollController.cs +++ b/ml_prm/RagdollController.cs @@ -30,6 +30,8 @@ namespace ml_prm Vector3 m_lastPosition = Vector3.zero; Vector3 m_velocity = Vector3.zero; + RagdollToggle m_avatarRagdollToggle = null; + internal RagdollController() { m_rigidBodies = new List(); @@ -67,6 +69,11 @@ namespace ml_prm if(Settings.Hotkey && Input.GetKeyDown(KeyCode.R) && !ViewManager.Instance.isGameMenuOpen()) SwitchRagdoll(); + + if (m_avatarRagdollToggle != null && m_avatarRagdollToggle.isActiveAndEnabled && m_avatarRagdollToggle.shouldOverride) { + if (m_enabled != m_avatarRagdollToggle.isOn) + SwitchRagdoll(); + } } void LateUpdate() @@ -182,6 +189,8 @@ namespace ml_prm m_vrIK.onPostSolverUpdate.AddListener(this.OnIKPostUpdate); } + m_avatarRagdollToggle = PlayerSetup.Instance._avatar.GetComponentInChildren(true); + m_avatarReady = true; } } diff --git a/ml_prm/RagdollToggle.cs b/ml_prm/RagdollToggle.cs new file mode 100644 index 0000000..63343a2 --- /dev/null +++ b/ml_prm/RagdollToggle.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace ml_prm +{ + public class RagdollToggle : MonoBehaviour + { + [Tooltip("Whether or not is should use the isOn property to override the current Ragdoll State of the Avatar.")] + [SerializeField] public bool shouldOverride; + [Tooltip("Whether Ragdoll State is active or not on the Avatar. Requires shouldOverride to be true to work.")] + [SerializeField] public bool isOn; + } +} diff --git a/ml_prm/ml_prm_editor_script.unitypackage b/ml_prm/ml_prm_editor_script.unitypackage new file mode 100644 index 0000000000000000000000000000000000000000..7efa88414692edbe958af130773feebf8f7203f6 GIT binary patch literal 862 zcmV-k1EKsMiwFpmqcLOz0AX@tXmn+5a4vLVascg_-EPw`6vuN*q`rgIE4bP6;W$aT z0u3ZCVAA-yKofG}lh%;N#dZc`+LLj?Bk>BHbS<*!;VwQ^$>+{(bE8Pgo&> ztjKwumsyfVG%jdRmKCRE!9j!cev#ff?t+1>~Y(O8eZ@@Y}UQuTJpwXwdc5U`b6Gda64;I7VqNp#eYDO+iR*+`4)fZ3kc?-zRRIc_tl2#TP{7|m0fLWW@|2GI{_`klX;s2d9I_LMl(I@gC{x3;4{a;K&7ym=h z>;G287B_PNmFKu!WLZWbV{shDoM$l=1xuIVkO_IN8ub`v{6MN!FMqM(-7BSPD;M|2Z)ad-$j6pCcf9@Trv=%tjC0?G*T_ z+vVYBr9b||XuE%AHOAwsGU(@v|LgUCF^hk{|BG3d|Anc0{yzw3_`klX;djyA@A%Am zMvLD)V6`}TSGWfiU_h6E&EM@WF9K!TC7`=n;AKgGb+YV!btD_q3Y$LL!D?qFuY?|v ohw*#u_GK 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