using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BoneLib; using BoneLib.BoneMenu; using Flip; using Il2CppSLZ.Marrow; using LabFusion.Entities; using LabFusion.Network; using LabFusion.Network.Serialization; using LabFusion.SDK.Modules; using MelonLoader; using MelonLoader.Preferences; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(FlipMod), "Flip", "1.1.0", "Spoon1606", null)] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: MelonOptionalDependencies(new string[] { "RagdollPlayer", "LabFusion" })] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyVersion("0.0.0.0")] namespace Flip; public class FlipMod : MelonMod { private static MelonPreferences_Category _prefCategory; private static MelonPreferences_Entry _prefEnabled; private static MelonPreferences_Entry _prefStrength; private static bool _enabled = true; private static int _strength = 6; private static bool _fusionAvailable; private static Page _mainPage; private static BoolElement _enabledElement; private static IntElement _strengthElement; private const float Deadzone = 0.3f; private const float StrengthMultiplier = 100f; public override void OnInitializeMelon() { SetupPreferences(); SetupBoneMenu(); TryRegisterFusionModule(); MelonLogger.Msg("Flip by Spoon1606 loaded! Only works when Ragdoll Player mod is active. Move left thumbstick forward/back while ragdolled."); } private void TryRegisterFusionModule() { try { ModuleManager.LoadModules(Assembly.GetExecutingAssembly()); _fusionAvailable = true; MelonLogger.Msg("LabFusion detected - multiplayer flip sync enabled."); } catch { _fusionAvailable = false; MelonLogger.Msg("LabFusion not detected - multiplayer sync unavailable."); } } private void SetupPreferences() { _prefCategory = MelonPreferences.CreateCategory("Flip"); _prefEnabled = _prefCategory.CreateEntry("IsEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _prefStrength = _prefCategory.CreateEntry("Strength", 6, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _enabled = _prefEnabled.Value; _strength = _prefStrength.Value; } private void SetupBoneMenu() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) _mainPage = Page.Root.CreatePage("Flip", new Color(0f, 0.8f, 1f), 0, true); _enabledElement = _mainPage.CreateBool("Enabled", Color.yellow, _enabled, (Action)OnSetEnabled); _strengthElement = _mainPage.CreateInt("Strength", Color.white, _strength, 1, 1, 50, (Action)OnSetStrength); } private void OnSetEnabled(bool value) { _enabled = value; _prefEnabled.Value = value; _prefCategory.SaveToFile(false); } private void OnSetStrength(int value) { _strength = value; _prefStrength.Value = value; _prefCategory.SaveToFile(false); } private bool IsRagdollActive() { PhysicsRig physicsRig = Player.PhysicsRig; if ((Object)(object)physicsRig == (Object)null) { return false; } bool num = (Object)(object)physicsRig.torso != (Object)null && physicsRig.torso.shutdown; bool flag = !physicsRig.ballLocoEnabled; return num || flag; } public override void OnUpdate() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (!_enabled || (Object)(object)Player.RigManager == (Object)null || (Object)(object)Player.PhysicsRig == (Object)null || !IsRagdollActive()) { return; } BaseController leftController = Player.LeftController; if (!((Object)(object)leftController == (Object)null)) { float y = leftController.GetThumbStickAxis().y; if (!(Mathf.Abs(y) < 0.3f)) { PerformFlip(y); } } } private void PerformFlip(float direction) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) PhysicsRig physicsRig = Player.PhysicsRig; if ((Object)(object)physicsRig == (Object)null) { return; } Transform pelvis = ((Rig)physicsRig).m_pelvis; if ((Object)(object)pelvis == (Object)null) { return; } Rigidbody component = ((Component)pelvis).GetComponent(); if (!((Object)(object)component == (Object)null)) { float num = direction * (float)_strength * 100f; Vector3 angularVelocity = (component.angularVelocity = ((Component)pelvis).transform.right * num); if (_fusionAvailable) { MessageRelay.RelayModule(FlipSyncData.Create(angularVelocity), CommonMessageRoutes.UnreliableToOtherClients); } } } public override void OnPreferencesLoaded() { _enabled = _prefEnabled.Value; _strength = _prefStrength.Value; if (_enabledElement != null) { _enabledElement.Value = _enabled; } if (_strengthElement != null) { _strengthElement.Value = _strength; } } } public class FlipModule : Module { public override string Name => "Flip"; public override string Author => "Spoon1606"; public override Version Version => new Version(1, 1, 0); public override ConsoleColor Color => ConsoleColor.Cyan; protected override void OnModuleRegistered() { ModuleMessageManager.LoadHandlers(Assembly.GetExecutingAssembly()); } } public class FlipSyncData : INetSerializable { public float x; public float y; public float z; public int? GetSize() { return 12; } public void Serialize(INetSerializer serializer) { serializer.SerializeValue(ref x); serializer.SerializeValue(ref y); serializer.SerializeValue(ref z); } public static FlipSyncData Create(Vector3 angularVelocity) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) return new FlipSyncData { x = angularVelocity.x, y = angularVelocity.y, z = angularVelocity.z }; } } [SkipHandleWhileLoading] public class FlipSyncMessage : ModuleMessageHandler { protected override void OnHandleMessage(ReceivedMessage received) { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) FlipSyncData flipSyncData = ((ReceivedMessage)(ref received)).ReadData(); byte? sender = ((ReceivedMessage)(ref received)).Sender; NetworkPlayer val = default(NetworkPlayer); if (!sender.HasValue || !NetworkPlayerManager.TryGetPlayer(sender.Value, ref val) || val.NetworkEntity.IsOwner || !val.HasRig) { return; } RigManager rigManager = val.RigRefs.RigManager; if ((Object)(object)rigManager == (Object)null) { return; } PhysicsRig physicsRig = rigManager.physicsRig; if ((Object)(object)physicsRig == (Object)null) { return; } Transform pelvis = ((Rig)physicsRig).m_pelvis; if (!((Object)(object)pelvis == (Object)null)) { Rigidbody component = ((Component)pelvis).GetComponent(); if (!((Object)(object)component == (Object)null)) { component.angularVelocity = new Vector3(flipSyncData.x, flipSyncData.y, flipSyncData.z); } } } }