using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BoneLib; using BoneLib.BoneMenu; using FieldInjector; using FlatPlayer; using FlatPlayerPlus; using FlatPlayerPlus.MonoBehaviours; using Il2CppSLZ.Bonelab; using Il2CppSLZ.Bonelab.SaveData; using Il2CppSLZ.Marrow; using Il2CppSLZ.Marrow.Input; using Il2CppSLZ.Marrow.Pool; using Il2CppSLZ.VRMK; using Il2CppTMPro; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using RagdollPlayer; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(Mod), "FlatPlayerPlus", "2.1.0", "HL2H0", "https://thunderstore.io/c/bonelab/p/HL2H0/FlatPlayerPlus/")] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: MelonOptionalDependencies(new string[] { "RagdollPlayer" })] [assembly: AssemblyTitle("")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("HL2H0")] [assembly: AssemblyProduct("FlatPlayerPlus")] [assembly: AssemblyFileVersion("2.1.0")] [assembly: AssemblyInformationalVersion("2.1.0")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyVersion("2.1.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace FlatPlayerPlus { public class Mod : MelonMod { public enum HandLocation { Right, Left } public const string Version = "2.1.0"; private static GameObject _uiPrefab; public static Page MainPage { get; private set; } public static Page GraphicsPage { get; private set; } public static Page TogglesPage { get; private set; } public static Page UIPage { get; private set; } public static Page FlatPlayerPage { get; private set; } public static HandLocation ReloadHand { get { Save activeSave = DataManager.ActiveSave; bool? obj; if (activeSave == null) { obj = null; } else { PlayerSettings playerSettings = activeSave.PlayerSettings; obj = ((playerSettings != null) ? new bool?(!playerSettings.BeltLocationRight) : null); } bool? flag = obj; return (!flag.GetValueOrDefault(true)) ? HandLocation.Left : HandLocation.Right; } } public static EnumElement FullscreenModeElement { get; private set; } public static BoolElement VSyncElement { get; private set; } public static FloatElement FOVElement { get; private set; } public static IntElement FPSLimit { get; private set; } public static BoolElement ToggleRightGripElement { get; private set; } public static BoolElement ToggleLeftGripElement { get; private set; } public static EnumElement HealthBarPositionElement { get; private set; } public static EnumElement AmmoPositionElement { get; private set; } public static FloatElement HandsExtendSensitivity { get; private set; } public static FloatElement CameraSmoothness { get; private set; } public static bool RightGripToggled { get; private set; } public static bool LeftGripToggled { get; private set; } private static GameObject UI { get; set; } public static FPP_UI_Handler UIHandler { get; set; } public static bool HasRagdollPlayer => MelonBase.FindMelon("Ragdoll Player", "Lakatrazz") != null; private static void ReloadGun() { Gun componentInHand = Player.GetComponentInHand(GetHand()); Magazine componentInHand2 = Player.GetComponentInHand(GetHand(inverse: true)); if (Object.op_Implicit((Object)(object)componentInHand) && Object.op_Implicit((Object)(object)componentInHand2) && !componentInHand.HasMagazine()) { ((SpawnEvents)componentInHand2).Despawn(); componentInHand.InstantLoadAsync(); componentInHand.CompleteSlidePull(); componentInHand.CompleteSlideReturn(); } } private static Hand GetHand(bool inverse = false) { if (inverse) { return (ReloadHand == HandLocation.Right) ? Player.LeftHand : Player.RightHand; } return (ReloadHand == HandLocation.Right) ? Player.RightHand : Player.LeftHand; } private static void SetupBoneMenu() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_02ba: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) FPSLimit = new IntElement("FPS Limit", Color.white, 60, 1, 0, int.MaxValue, (Action)delegate(int v) { Application.targetFrameRate = v; ModPreferences.SavePreferences(); }); MainPage = Page.Root.CreatePage("FlatPlayerPlus", Color.green, 0, true); TogglesPage = MainPage.CreatePage("Toggles", Color.yellow, 0, true); ToggleRightGripElement = TogglesPage.CreateBool("Toggle Right Grip", Color.white, false, (Action)delegate { ModPreferences.SavePreferences(); }); ToggleLeftGripElement = TogglesPage.CreateBool("Toggle Left Grip", Color.white, false, (Action)delegate { ModPreferences.SavePreferences(); }); UIPage = MainPage.CreatePage("UI", Color.magenta, 0, true); HealthBarPositionElement = UIPage.CreateEnum("Health Bar Position", Color.white, (Enum)FPP_UI_Handler.HealthBarUIPosition, (Action)delegate(Enum v) { UIHandler.UpdateUIPosition((FPP_UI_Handler.UIPosition)(object)v, (FPP_UI_Handler.UIPosition)(object)AmmoPositionElement.Value); ModPreferences.SavePreferences(); }); AmmoPositionElement = UIPage.CreateEnum("Ammo Position", Color.white, (Enum)FPP_UI_Handler.AmmoUIPosition, (Action)delegate(Enum v) { UIHandler.UpdateUIPosition((FPP_UI_Handler.UIPosition)(object)HealthBarPositionElement.Value, (FPP_UI_Handler.UIPosition)(object)v); ModPreferences.SavePreferences(); }); FlatPlayerPage = MainPage.CreatePage("FlatPlayer Settings", Color.yellow, 0, true); HandsExtendSensitivity = FlatPlayerPage.CreateFloat("Hand Extend Sensitivity", Color.white, 0.1f, 0.1f, 0f, 2.1474836E+09f, (Action)delegate { ModPreferences.SavePreferences(); FlatBooter.Instance.ReloadConfig(); }); CameraSmoothness = FlatPlayerPage.CreateFloat("Camera Smoothness", Color.white, 0.3f, 0.1f, 0f, 1f, (Action)delegate { ModPreferences.SavePreferences(); FlatBooter.Instance.ReloadConfig(); }); GraphicsPage = MainPage.CreatePage("Graphics", Color.green, 0, true); FOVElement = GraphicsPage.CreateFloat("FOV", Color.white, 90f, 1f, 0f, 2.1474836E+09f, (Action)delegate(float v) { FlatBooter.MainCamera.fieldOfView = v; ModPreferences.SavePreferences(); }); FullscreenModeElement = GraphicsPage.CreateEnum("Full Screen Mode", Color.white, (Enum)(object)Screen.fullScreenMode, (Action)delegate(Enum v) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) Screen.fullScreenMode = (FullScreenMode)(object)v; ModPreferences.SavePreferences(); }); VSyncElement = GraphicsPage.CreateBool("V-Sync", Color.white, false, (Action)delegate(bool v) { QualitySettings.vSyncCount = (v ? 1 : 0); if (v) { MainPage.Remove((Element)(object)FPSLimit); } else { MainPage.Add((Element)(object)FPSLimit); Application.targetFrameRate = FPSLimit.Value; } ModPreferences.SavePreferences(); }); } private static void InitializeBundles() { SerialisationHandler.Inject(0); AssetBundle val = HelperMethods.LoadEmbeddedAssetBundle(Assembly.GetExecutingAssembly(), "FlatPlayerPlus.Resources.flatplayerplus.pack"); _uiPrefab = HelperMethods.LoadPersistentAsset(val, "FP+ UI"); } public override void OnInitializeMelon() { if (MelonBase.FindMelon("FlatPlayer", "LlamasHere") == null) { ((MelonBase)this).LoggerInstance.Warning("FlatPlayer not found! Deinitializing..."); ((MelonBase)this).Unregister("FlatPlayer is required for FlatPlayerPlus to work!", true); return; } SetupBoneMenu(); InitializeBundles(); ModPreferences.CreatePreferences(); Hooking.OnUIRigCreated += HookingOnOnUIRigCreated; Hooking.OnSwitchAvatarPostfix += OnAvatarSwitch; ((MelonBase)this).LoggerInstance.Msg("FlatPlayer+ 2.0.0 Initialized."); } private static void OnAvatarSwitch(Avatar obj) { UIHandler.MaxHealth = Player.RigManager.health.max_Health; } private static void HookingOnOnUIRigCreated() { if ((Object)(object)_uiPrefab != (Object)null) { UI = Object.Instantiate(_uiPrefab); UIHandler = UI.GetComponent(); UIHandler.MaxHealth = Player.RigManager.health.max_Health; ModPreferences.LoadPreferences(); } } public override void OnUpdate() { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) ((MelonBase)this).OnLateUpdate(); if (!FlatBooter.IsReady) { return; } UIHandler.CurrHealth = Player.RigManager.health.curr_Health; int lightAmmo = AmmoInventory.Instance._groupCounts["light"]; int mediumAmmo = AmmoInventory.Instance._groupCounts["medium"]; int heavyAmmo = AmmoInventory.Instance._groupCounts["heavy"]; UIHandler.UpdateAmmoText(lightAmmo, mediumAmmo, heavyAmmo); if (Input.GetKeyDown(ModPreferences.ReloadKey.Value)) { ReloadGun(); } if (Input.GetKey(ModPreferences.DriveForwardKey.Value) && Object.op_Implicit((Object)(object)Player.RigManager.activeSeat)) { Player.RightController._thumbstickAxis = new Vector2(0f, 1f); Player.LeftController._thumbstickAxis = new Vector2(0f, -1f); } if (Input.GetKeyDown(ModPreferences.RagdollKey.Value)) { if (HasRagdollPlayer) { Ragdoll(); } else { ((MelonBase)this).LoggerInstance.Warning("RagdollPlayer not found! It is required for the ragdoll functionality to work"); } } } private static void Ragdoll() { RigManager rigManager = Player.RigManager; if (!Object.op_Implicit((Object)(object)((rigManager != null) ? rigManager.activeSeat : null)) && !UIRig.Instance.popUpMenu.m_IsCursorShown) { PhysicsRig physicsRig = Player.PhysicsRig; if (!physicsRig.torso.shutdown && physicsRig.ballLocoEnabled) { RagdollPlayerMod.RagdollRig(rigManager); } else { RagdollPlayerMod.UnragdollRig(rigManager); } } } public override void OnLateUpdate() { ((MelonBase)this).OnLateUpdate(); if (FlatBooter.IsReady) { if (Input.GetMouseButtonDown(0)) { LeftGripToggled = !LeftGripToggled; } if (Input.GetMouseButtonDown(1)) { RightGripToggled = !RightGripToggled; } int num = (RightGripToggled ? 1 : 0); int num2 = (LeftGripToggled ? 1 : 0); if (ToggleRightGripElement.Value) { ((XRController)FlatBooter.RightController).Grip = num; } if (ToggleLeftGripElement.Value) { ((XRController)FlatBooter.LeftController).Grip = num2; } } } } public static class ModPreferences { private static MelonPreferences_Category _category; private static MelonPreferences_Category _fpCategory; private static MelonPreferences_Entry _fpCameraFOV; private static MelonPreferences_Entry _fpHandsExtendSensitivity; private static MelonPreferences_Entry _fpCameraSmoothness; private static MelonPreferences_Entry _healthBarPosition; private static MelonPreferences_Entry _ammoPosition; private static MelonPreferences_Entry _toggleLeftGrip; private static MelonPreferences_Entry _toggleRightGrip; private static MelonPreferences_Entry _fpsLimit; private static MelonPreferences_Entry _fullscreenMode; private static MelonPreferences_Entry _vSync; public static MelonPreferences_Entry ReloadKey { get; private set; } public static MelonPreferences_Entry DriveForwardKey { get; private set; } public static MelonPreferences_Entry RagdollKey { get; private set; } public static void CreatePreferences() { _category = MelonPreferences.CreateCategory("FlatPlayerPlus"); _fpCategory = MelonPreferences.GetCategory("FlatPlayer"); _healthBarPosition = _category.CreateEntry("healthBarPosition", FPP_UI_Handler.UIPosition.Top, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _ammoPosition = _category.CreateEntry("ammoPosition", FPP_UI_Handler.UIPosition.Bottom, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _toggleLeftGrip = _category.CreateEntry("toggleLeftGrip", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _toggleRightGrip = _category.CreateEntry("toggleRightGrip", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _fpsLimit = _category.CreateEntry("fpsLimit", 60, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _fullscreenMode = _category.CreateEntry("fullscreenMode", (FullScreenMode)1, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _vSync = _category.CreateEntry("vSyncEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); ReloadKey = _category.CreateEntry("ReloadKey", (KeyCode)114, (string)null, "For more info about key names, go to https://docs.unity3d.com/2021.3/Documentation/ScriptReference/KeyCode.html", false, false, (ValueValidator)null, (string)null); DriveForwardKey = _category.CreateEntry("DriveForward", (KeyCode)119, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); RagdollKey = _category.CreateEntry("RagdollKey", (KeyCode)306, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _fpCameraFOV = _fpCategory.GetEntry("CameraFOV"); _fpHandsExtendSensitivity = _fpCategory.GetEntry("HandsExtendSensitivity"); _fpCameraSmoothness = _fpCategory.GetEntry("CameraSmoothness"); } public static void SavePreferences() { //IL_0083: Unknown result type (might be due to invalid IL or missing references) _healthBarPosition.Value = (FPP_UI_Handler.UIPosition)(object)Mod.HealthBarPositionElement.Value; _ammoPosition.Value = (FPP_UI_Handler.UIPosition)(object)Mod.AmmoPositionElement.Value; _toggleLeftGrip.Value = Mod.ToggleLeftGripElement.Value; _toggleRightGrip.Value = Mod.ToggleRightGripElement.Value; _fpsLimit.Value = Mod.FPSLimit.Value; _fullscreenMode.Value = (FullScreenMode)(object)Mod.FullscreenModeElement.Value; _vSync.Value = Mod.VSyncElement.Value; _fpCameraFOV.Value = Mod.FOVElement.Value; _fpHandsExtendSensitivity.Value = Mod.HandsExtendSensitivity.Value; _fpCameraSmoothness.Value = Mod.CameraSmoothness.Value; _fpCategory.SaveToFile(false); _category.SaveToFile(false); } public static void LoadPreferences() { //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) Mod.HealthBarPositionElement.Value = _healthBarPosition.Value; Mod.AmmoPositionElement.Value = _ammoPosition.Value; Mod.ToggleLeftGripElement.Value = _toggleLeftGrip.Value; Mod.ToggleRightGripElement.Value = _toggleRightGrip.Value; Mod.FPSLimit.Value = _fpsLimit.Value; Mod.FullscreenModeElement.Value = (Enum)(object)_fullscreenMode.Value; Mod.FOVElement.Value = _fpCameraFOV.Value; Mod.VSyncElement.Value = _vSync.Value; Mod.HandsExtendSensitivity.Value = _fpHandsExtendSensitivity.Value; Mod.CameraSmoothness.Value = _fpCameraFOV.Value; Mod.UIHandler.UpdateUIPosition(_healthBarPosition.Value, _ammoPosition.Value); QualitySettings.vSyncCount = (_vSync.Value ? 1 : 0); if (_vSync.Value) { Application.targetFrameRate = _fpsLimit.Value; } Screen.fullScreenMode = _fullscreenMode.Value; FlatBooter.MainCamera.fieldOfView = _fpCameraFOV.Value; FlatBooter.Instance.ReloadConfig(); } } } namespace FlatPlayerPlus.MonoBehaviours { public class FPP_UI_Handler : MonoBehaviour { public enum UIPosition { Top, Bottom } public TextMeshProUGUI ammoTextSmall; public TextMeshProUGUI ammoTextMedium; public TextMeshProUGUI ammoTextLarge; public TextMeshProUGUI healthText; public Image healthBar; public GameObject healthBarUIParent; public GameObject ammoUIParent; public static UIPosition HealthBarUIPosition { get; set; } = UIPosition.Bottom; public static UIPosition AmmoUIPosition { get; set; } = UIPosition.Top; public float CurrHealth { get; set; } public float MaxHealth { get; set; } private void Start() { ((TMP_Text)ammoTextSmall).text = "0"; ((TMP_Text)ammoTextMedium).text = "0"; ((TMP_Text)ammoTextLarge).text = "0"; CurrHealth = 0f; } private void Update() { int num = Mathf.FloorToInt((MaxHealth > 0f) ? (CurrHealth / MaxHealth * 100f) : 0f); num = Mathf.Clamp(num, 0, 100); ((TMP_Text)healthText).text = $"{num}%"; healthBar.fillAmount = Mathf.Lerp(healthBar.fillAmount, CurrHealth / MaxHealth, Time.deltaTime * 5f); } public void UpdateAmmoText(int lightAmmo, int mediumAmmo, int heavyAmmo) { ((TMP_Text)ammoTextSmall).text = $"{lightAmmo}"; ((TMP_Text)ammoTextMedium).text = $"{mediumAmmo}"; ((TMP_Text)ammoTextLarge).text = $"{heavyAmmo}"; } public void UpdateUIPosition(UIPosition healthBarPosition, UIPosition ammoPosition) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) switch (healthBarPosition) { case UIPosition.Bottom: healthBarUIParent.transform.localPosition = new Vector3(-840f, -450f, 0f); break; case UIPosition.Top: healthBarUIParent.transform.localPosition = new Vector3(-840f, 510f, 0f); break; } switch (ammoPosition) { case UIPosition.Bottom: ammoUIParent.transform.localPosition = new Vector3(750f, -450f, 0f); break; case UIPosition.Top: ammoUIParent.transform.localPosition = new Vector3(750f, 440f, 0f); break; } } } }