Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of 3rdPerson v1.1.0
3rdPerson.dll
Decompiled 2 years agousing System; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using MoreCompany.Cosmetics; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.Rendering; using _3rdPerson.Helper; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("3rdPerson")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("3rdPerson")] [assembly: AssemblyTitle("3rdPerson")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace _3rdPerson { [BepInPlugin("verity.3rdperson", "3rd Person", "1.1.0")] public class Plugin : BaseUnityPlugin { public static readonly Harmony Harmony = new Harmony("verity.3rdperson"); public static ManualLogSource LogSource = null; public static ConfigEntry<string> KeybindEntry = null; public static ConfigEntry<string> OrbitKeybindEntry = null; public static ConfigEntry<float> OrbitSpeedEntry = null; public static ConfigEntry<float> Distance = null; public static ConfigEntry<float> RightOffset = null; public static ConfigEntry<float> UpOffset = null; public static ConfigEntry<bool> MoreCompanyCosmetics = null; private void Awake() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown GameObject val = new GameObject("3rdPerson"); val.AddComponent<PluginLoader>(); ((Object)val).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)val); LogSource = ((BaseUnityPlugin)this).Logger; LogSource.LogInfo((object)"3rd Person Mod Loaded."); KeybindEntry = ((BaseUnityPlugin)this).Config.Bind<string>("Camera Settings", "Keybind", "c", "The keybind used to toggle third person."); Distance = ((BaseUnityPlugin)this).Config.Bind<float>("Camera Settings", "Distance", 2f, "Distance of the camera from the player."); RightOffset = ((BaseUnityPlugin)this).Config.Bind<float>("Camera Settings", "Right-Offset", 0.6f, "Offset of the camera to the right from the player."); UpOffset = ((BaseUnityPlugin)this).Config.Bind<float>("Camera Settings", "Up-Offset", 0.1f, "Offset of the camera upwards from the player."); OrbitKeybindEntry = ((BaseUnityPlugin)this).Config.Bind<string>("Orbit Settings", "Keybind", "<Mouse>/middleButton", "The keybind used to 'orbit' around the player."); OrbitSpeedEntry = ((BaseUnityPlugin)this).Config.Bind<float>("Orbit Settings", "Orbit-Speed", 75f, "The speed/sensitivity of the orbiting."); MoreCompanyCosmetics = ((BaseUnityPlugin)this).Config.Bind<bool>("Mod Support", "MoreCompany-Cosmetic-Support", false, "Displays MoreCompany Cosmetics in third person, this can mess with first person visibility if you have glasses on."); } } public class PluginLoader : MonoBehaviour { private void Start() { LocalPlayer localPlayer = ((Component)this).gameObject.AddComponent<LocalPlayer>(); ((Object)localPlayer).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)localPlayer); Keybinding keybinding = ((Component)this).gameObject.AddComponent<Keybinding>(); ((Object)keybinding).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)keybinding); ThirdPersonCamera thirdPersonCamera = ((Component)this).gameObject.AddComponent<ThirdPersonCamera>(); ((Object)thirdPersonCamera).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)thirdPersonCamera); Hooks.Init(); } } } namespace _3rdPerson.Helper { public static class Hooks { private class HarmonyHooks { private static bool _previousState; public static void MenuOpenedHook() { _previousState = ThirdPersonCamera.ViewState; if (LocalPlayer.IsActive() && ThirdPersonCamera.ViewState) { LocalPlayer.GetController().quickMenuManager.isMenuOpen = false; ThirdPersonCamera.Toggle(); } } public static void MenuClosedHook() { if (LocalPlayer.IsActive() && _previousState) { LocalPlayer.GetController().inTerminalMenu = false; ThirdPersonCamera.Toggle(); } } public static void MoreCompanyHook() { //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) CosmeticApplication val = Object.FindObjectOfType<CosmeticApplication>(); if (CosmeticRegistry.locallySelectedCosmetics.Count <= 0 || val.spawnedCosmetics.Count > 0) { return; } foreach (string locallySelectedCosmetic in CosmeticRegistry.locallySelectedCosmetics) { val.ApplyCosmetic(locallySelectedCosmetic, true); } foreach (CosmeticInstance spawnedCosmetic in val.spawnedCosmetics) { Transform transform = ((Component)spawnedCosmetic).transform; transform.localScale *= 0.38f; SetAllChildrenLayer(((Component)spawnedCosmetic).transform, 29); } } private static void SetAllChildrenLayer(Transform transform, int layer) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown ((Component)transform).gameObject.layer = layer; foreach (Transform item in transform) { SetAllChildrenLayer(item, layer); } } public static bool PlayerInputHook() { if (ThirdPersonCamera.ViewState) { return !Keybinding.orbitAction.IsPressed(); } return true; } public static void KillPlayerHook() { if (ThirdPersonCamera.ViewState) { ThirdPersonCamera.Toggle(); } } } public static void Init() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Expected O, but got Unknown //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Expected O, but got Unknown //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Expected O, but got Unknown //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Expected O, but got Unknown MethodInfo method = typeof(QuickMenuManager).GetMethod("OpenQuickMenu"); MethodInfo method2 = typeof(HarmonyHooks).GetMethod("MenuOpenedHook"); Plugin.Harmony.Patch((MethodBase)method, new HarmonyMethod(method2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Plugin.LogSource.LogInfo((object)"Open Menu Hooked."); MethodInfo method3 = typeof(QuickMenuManager).GetMethod("CloseQuickMenu"); MethodInfo method4 = typeof(HarmonyHooks).GetMethod("MenuClosedHook"); Plugin.Harmony.Patch((MethodBase)method3, new HarmonyMethod(method4), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Plugin.LogSource.LogInfo((object)"Close Menu Hooked."); MethodInfo method5 = typeof(Terminal).GetMethod("BeginUsingTerminal"); MethodInfo method6 = typeof(HarmonyHooks).GetMethod("MenuOpenedHook"); Plugin.Harmony.Patch((MethodBase)method5, new HarmonyMethod(method6), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Plugin.LogSource.LogInfo((object)"Open Terminal Hooked."); MethodInfo method7 = typeof(Terminal).GetMethod("QuitTerminal"); MethodInfo method8 = typeof(HarmonyHooks).GetMethod("MenuClosedHook"); Plugin.Harmony.Patch((MethodBase)method7, new HarmonyMethod(method8), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Plugin.LogSource.LogInfo((object)"Close Terminal Hooked."); MethodInfo method9 = typeof(PlayerControllerB).GetMethod("PlayerLookInput", BindingFlags.Instance | BindingFlags.NonPublic); MethodInfo method10 = typeof(HarmonyHooks).GetMethod("PlayerInputHook"); Plugin.Harmony.Patch((MethodBase)method9, new HarmonyMethod(method10), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Plugin.LogSource.LogInfo((object)"Player Look Input Hooked."); MethodInfo method11 = typeof(PlayerControllerB).GetMethod("KillPlayer"); MethodInfo method12 = typeof(HarmonyHooks).GetMethod("KillPlayerHook"); Plugin.Harmony.Patch((MethodBase)method11, new HarmonyMethod(method12), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Plugin.LogSource.LogInfo((object)"Player Killed Hooked."); if (Chainloader.PluginInfos.ContainsKey("me.swipez.melonloader.morecompany") && Plugin.MoreCompanyCosmetics.Value) { MethodInfo method13 = typeof(HUDManager).GetMethod("AddPlayerChatMessageClientRpc", BindingFlags.Instance | BindingFlags.NonPublic); MethodInfo method14 = typeof(HarmonyHooks).GetMethod("MoreCompanyHook"); Plugin.Harmony.Patch((MethodBase)method13, (HarmonyMethod)null, new HarmonyMethod(method14), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Plugin.LogSource.LogInfo((object)"MoreCompany Cosmetics Added."); } Plugin.LogSource.LogInfo((object)"Hooks Initialized."); } } public class Keybinding : MonoBehaviour { public static InputAction orbitAction; private void Awake() { //IL_0019: 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) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown InputAction val = new InputAction((string)null, (InputActionType)0, "<Keyboard>/" + Plugin.KeybindEntry.Value, (string)null, (string)null, (string)null); val.performed += KeyPressed; val.Enable(); orbitAction = new InputAction("MouseLeftClick", (InputActionType)0, Plugin.OrbitKeybindEntry.Value ?? "", (string)null, (string)null, (string)null); orbitAction.Enable(); } private void KeyPressed(CallbackContext obj) { ThirdPersonCamera.Toggle(); } private void OnEnable() { Plugin.LogSource.LogInfo((object)("Keybinding Initialized, Current Keybind " + Plugin.KeybindEntry.Value + ".")); } } public class LocalPlayer : MonoBehaviour { private static PlayerControllerB? _playerController; public void OnEnable() { Plugin.LogSource.LogInfo((object)"Local Player Caching Initialized."); } private void Update() { if (GameNetworkManager.Instance != null) { _playerController = GameNetworkManager.Instance.localPlayerController; } } public static bool IsActive() { if ((Object)(object)_playerController != (Object)null) { return !_playerController.isPlayerDead; } return false; } public static PlayerControllerB GetController() { return _playerController; } } public class ThirdPersonCamera : MonoBehaviour { private static Camera _camera; public static bool ViewState; public static Camera GetCamera => _camera; private void Awake() { _camera = ((Component)this).gameObject.AddComponent<Camera>(); ((Object)_camera).hideFlags = (HideFlags)61; _camera.fieldOfView = 66f; _camera.nearClipPlane = 0.1f; _camera.cullingMask = 557520895; if (Chainloader.PluginInfos.ContainsKey("quackandcheese.mirrordecor")) { _camera.cullingMask = 557520887; } ((Behaviour)_camera).enabled = false; Object.DontDestroyOnLoad((Object)(object)_camera); } private void OnEnable() { Plugin.LogSource.LogInfo((object)"Third Person Camera Initialized."); } private void Update() { if (!LocalPlayer.IsActive() || LocalPlayer.GetController().quickMenuManager.isMenuOpen || LocalPlayer.GetController().inTerminalMenu || LocalPlayer.GetController().isPlayerDead) { return; } if (Object.FindObjectsOfType<CentipedeAI>().Any((CentipedeAI centipede) => (Object)(object)centipede.clingingToPlayer != (Object)null && centipede.clingingToPlayer.playerClientId == NetworkManager.Singleton.LocalClientId)) { Plugin.LogSource.LogInfo((object)"Centipede On Player!"); if (ViewState) { Toggle(); } } else if (!Keybinding.orbitAction.IsPressed()) { ThirdPersonUpdate(); } else { ThirdPersonOrbitUpdate(); } } private void ThirdPersonUpdate() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: 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_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) Camera gameplayCamera = LocalPlayer.GetController().gameplayCamera; Vector3 val = ((Component)gameplayCamera).transform.forward * -1f; Vector3 val2 = ((Component)gameplayCamera).transform.TransformDirection(Vector3.right) * Plugin.RightOffset.Value; Vector3 val3 = Vector3.up * Plugin.UpOffset.Value; float value = Plugin.Distance.Value; ((Component)_camera).transform.position = ((Component)gameplayCamera).transform.position + val * value + val2 + val3; ((Component)_camera).transform.rotation = Quaternion.LookRotation(((Component)gameplayCamera).transform.forward); } private void ThirdPersonOrbitUpdate() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_0068: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) MovementActions movement = LocalPlayer.GetController().playerActions.Movement; Vector2 val = ((MovementActions)(ref movement)).Look.ReadValue<Vector2>() * (0.008f * (float)IngamePlayerSettings.Instance.settings.lookSensitivity); if (IngamePlayerSettings.Instance.settings.invertYAxis) { val.y *= -1f; } ((Component)_camera).transform.Rotate(Vector3.right, val.y * Plugin.OrbitSpeedEntry.Value * Time.deltaTime); ((Component)_camera).transform.RotateAround(((Component)LocalPlayer.GetController().gameplayCamera).transform.position, Vector3.up, val.x * Plugin.OrbitSpeedEntry.Value * Time.deltaTime); float value = Plugin.Distance.Value; ((Component)_camera).transform.position = ((Component)LocalPlayer.GetController().gameplayCamera).transform.position - ((Component)_camera).transform.forward * value; } public static void Toggle() { if (!LocalPlayer.IsActive() || LocalPlayer.GetController().isTypingChat || LocalPlayer.GetController().quickMenuManager.isMenuOpen || LocalPlayer.GetController().inTerminalMenu || LocalPlayer.GetController().isPlayerDead) { return; } ViewState = !ViewState; GameObject val = GameObject.Find("Systems/UI/Canvas/Panel/"); Canvas component = GameObject.Find("Systems/UI/Canvas/").GetComponent<Canvas>(); if (ViewState) { if (!Chainloader.PluginInfos.ContainsKey("quackandcheese.mirrordecor")) { ((Renderer)LocalPlayer.GetController().thisPlayerModel).shadowCastingMode = (ShadowCastingMode)1; } val.SetActive(false); component.worldCamera = _camera; component.renderMode = (RenderMode)0; GameObject.Find("Systems/Rendering/PlayerHUDHelmetModel/").SetActive(false); ((Renderer)LocalPlayer.GetController().thisPlayerModelArms).enabled = false; ((Behaviour)LocalPlayer.GetController().gameplayCamera).enabled = false; ((Behaviour)_camera).enabled = true; } else { if (!Chainloader.PluginInfos.ContainsKey("quackandcheese.mirrordecor")) { ((Renderer)LocalPlayer.GetController().thisPlayerModel).shadowCastingMode = (ShadowCastingMode)3; } val.SetActive(true); component.worldCamera = GameObject.Find("UICamera").GetComponent<Camera>(); component.renderMode = (RenderMode)1; GameObject.Find("Systems/Rendering/PlayerHUDHelmetModel/").SetActive(true); ((Renderer)LocalPlayer.GetController().thisPlayerModelArms).enabled = true; ((Behaviour)LocalPlayer.GetController().gameplayCamera).enabled = true; ((Behaviour)_camera).enabled = false; } } } }