using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LCVR.Player;
using Microsoft.CodeAnalysis;
using TooManyEmotes;
using TooManyEmotes.Config;
using TooManyEmotes.Patches;
using TooManyEmotes.UI;
using TooManyEmotesAlternateControls.Compatibility;
using UnityEngine;
using UnityEngine.InputSystem;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("TooManyEmotesAlternateControls")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+5cf06ba6442ecec3ee777fa9542775e42d590e6f")]
[assembly: AssemblyProduct("My first plugin")]
[assembly: AssemblyTitle("TooManyEmotesAlternateControls")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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 TooManyEmotesAlternateControls
{
[BepInPlugin("TooManyEmotesAlternateControls", "Alternate Controls for Too Many Emotes", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
internal static ManualLogSource Logger;
private void Awake()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Expected O, but got Unknown
Logger = ((BaseUnityPlugin)this).Logger;
Harmony val = new Harmony("TooManyEmotesAlternateControls");
val.PatchAll();
Logger.LogInfo((object)"Plugin TooManyEmotesAlternateControls is loaded!");
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "TooManyEmotesAlternateControls";
public const string PLUGIN_NAME = "Alternate Controls for Too Many Emotes";
public const string PLUGIN_VERSION = "1.0.0";
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "TooManyEmotesAlternateControls";
public const string PLUGIN_NAME = "My first plugin";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace TooManyEmotesAlternateControls.Patchers
{
[HarmonyPatch]
internal class EmoteMenuPatcher
{
private static int lastEmoteIndex = -1;
private static bool hasMovedCursorInMenu = false;
[HarmonyPatch(typeof(EmoteMenu), "GetInput")]
[HarmonyPrefix]
private static bool SetLastEmoteUsed()
{
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: 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_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: 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_00db: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: 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)
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_0184: Unknown result type (might be due to invalid IL or missing references)
if (hasMovedCursorInMenu)
{
return true;
}
if (!EmoteMenu.isMenuOpen || ConfigSettings.disableEmotesForSelf.Value || LCVRCompat.LoadedAndEnabled)
{
return true;
}
if (AdditionalPanelUI.hovered || EmoteMenu.hoveredLoadoutUIIndex != -1)
{
return true;
}
RectTransform uiRectTransform = EmoteMenu.emoteUIElementsList[0].uiRectTransform;
float num = Vector2.Distance(Vector2.op_Implicit(EmoteMenu.menuGameObject.transform.position), Vector2.op_Implicit(((Transform)uiRectTransform).position)) * 0.815f;
Vector2 val2;
if (!EmoteMenu.usingController)
{
Vector3 val = Vector2.op_Implicit(((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue());
Camera worldCamera = HUDManager.Instance.HUDContainer.GetComponentInParent<Canvas>().worldCamera;
val.z = Mathf.Abs(((Component)worldCamera).transform.position.z - ((Transform)EmoteMenu.menuTransform).position.z);
val2 = Vector2.op_Implicit(worldCamera.ScreenToWorldPoint(val) - ((Transform)EmoteMenu.menuTransform).position);
}
else
{
val2 = EmoteMenu.currentThumbstickPosition;
}
int num2 = -1;
if (!hasMovedCursorInMenu)
{
num2 = lastEmoteIndex;
}
if ((!EmoteMenu.usingController && ((Vector2)(ref val2)).magnitude >= num) || (EmoteMenu.usingController && EmoteMenu.currentThumbstickPosition != Vector2.zero))
{
hasMovedCursorInMenu = true;
float num3 = Mathf.Atan2(val2.y, 0f - val2.x) * 57.29578f - 67.5f;
if (num3 < 0f)
{
num3 += 360f;
}
num2 = Mathf.FloorToInt(num3 / 45f);
}
if (num2 != EmoteMenu.hoveredEmoteUIIndex)
{
EmoteMenu.OnHoveredNewElement(num2);
}
return false;
}
[HarmonyPatch(typeof(EmoteMenu), "CloseEmoteMenu")]
[HarmonyPrefix]
private static void OnEmoteMenuClose()
{
if (EmoteMenu.hoveredEmoteUIIndex != -1)
{
lastEmoteIndex = EmoteMenu.hoveredEmoteUIIndex;
}
}
[HarmonyPatch(typeof(EmoteMenu), "OpenEmoteMenu")]
[HarmonyPostfix]
private static void ResetHasMovedCursorInMenu()
{
hasMovedCursorInMenu = false;
}
}
[HarmonyPatch]
internal class ThirdPersonEmoteControllerPatcher
{
private static EmoteController emoteControllerLocal = (EmoteController)(object)EmoteControllerPlayer.emoteControllerLocal;
private static PlayerControllerB localPlayerController = StartOfRound.Instance?.localPlayerController;
private static Camera emoteCamera = (Camera)Traverse.Create(typeof(ThirdPersonEmoteController)).Field("emoteCamera").GetValue();
private static Camera gameplayCamera = (Camera)Traverse.Create(typeof(ThirdPersonEmoteController)).Field("gameplayCamera").GetValue();
private static Transform localPlayerCameraContainer = (Transform)Traverse.Create(typeof(ThirdPersonEmoteController)).Property("localPlayerCameraContainer", (object[])null).GetValue();
private static Transform emoteCameraPivot = (Transform)Traverse.Create(typeof(ThirdPersonEmoteController)).Field("emoteCameraPivot").GetValue();
private static int cameraCollideLayerMask = (int)Traverse.Create(typeof(ThirdPersonEmoteController)).Field("cameraCollideLayerMask").GetValue();
private static float targetCameraDistance = (float)Traverse.Create(typeof(ThirdPersonEmoteController)).Field("targetCameraDistance").GetValue();
private static Vector2 clampCameraDistance = (Vector2)Traverse.Create(typeof(ThirdPersonEmoteController)).Field("clampCameraDistance").GetValue();
private static bool _isMovingWhileEmoting = (bool)Traverse.Create(typeof(ThirdPersonEmoteController)).Property("isMovingWhileEmoting", (object[])null).GetValue();
private static float _timeOfLastMovingCheck = 0f;
private static Vector3 prevCameraDirection = new Vector3(0f, 0f, 0f);
private static bool isMovingWhileEmoting => IsMovingWhileEmoting();
[HarmonyPatch(typeof(ThirdPersonEmoteController), "InitLocalPlayerController")]
[HarmonyPostfix]
private static void InitValues()
{
}
[HarmonyPatch(typeof(ThirdPersonEmoteController), "UseFreeCamWhileEmoting")]
[HarmonyPrefix]
private static bool IgnoreOriginalFreeCam(ref bool __result)
{
__result = true;
return false;
}
[HarmonyPatch(typeof(PlayerControllerB), "PlayerLookInput")]
[HarmonyPrefix]
private static bool UseFreeCam(PlayerControllerB __instance)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
//IL_020e: Unknown result type (might be due to invalid IL or missing references)
//IL_0213: Unknown result type (might be due to invalid IL or missing references)
//IL_0220: Unknown result type (might be due to invalid IL or missing references)
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
//IL_0273: Unknown result type (might be due to invalid IL or missing references)
//IL_0278: Unknown result type (might be due to invalid IL or missing references)
//IL_0281: Unknown result type (might be due to invalid IL or missing references)
//IL_028b: Unknown result type (might be due to invalid IL or missing references)
//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
//IL_02da: Unknown result type (might be due to invalid IL or missing references)
//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
//IL_0329: Unknown result type (might be due to invalid IL or missing references)
//IL_0338: Unknown result type (might be due to invalid IL or missing references)
//IL_03ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0409: Unknown result type (might be due to invalid IL or missing references)
//IL_040e: Unknown result type (might be due to invalid IL or missing references)
//IL_0418: Unknown result type (might be due to invalid IL or missing references)
//IL_035b: Unknown result type (might be due to invalid IL or missing references)
//IL_0374: Unknown result type (might be due to invalid IL or missing references)
//IL_038d: Unknown result type (might be due to invalid IL or missing references)
//IL_0392: Unknown result type (might be due to invalid IL or missing references)
//IL_03a8: Unknown result type (might be due to invalid IL or missing references)
//IL_03ad: Unknown result type (might be due to invalid IL or missing references)
//IL_03af: Unknown result type (might be due to invalid IL or missing references)
//IL_03bf: Unknown result type (might be due to invalid IL or missing references)
//IL_03d9: Unknown result type (might be due to invalid IL or missing references)
//IL_03db: Unknown result type (might be due to invalid IL or missing references)
//IL_03e0: Unknown result type (might be due to invalid IL or missing references)
//IL_03ec: Unknown result type (might be due to invalid IL or missing references)
//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
//IL_046f: Unknown result type (might be due to invalid IL or missing references)
//IL_0474: Unknown result type (might be due to invalid IL or missing references)
//IL_043e: Unknown result type (might be due to invalid IL or missing references)
//IL_045f: Unknown result type (might be due to invalid IL or missing references)
if (((Vector3)(ref prevCameraDirection)).magnitude < 0.1f)
{
prevCameraDirection = emoteCameraPivot.forward;
}
if ((Object)(object)__instance != (Object)(object)localPlayerController || (Object)(object)emoteControllerLocal == (Object)null)
{
return true;
}
if (ConfigSettings.disableEmotesForSelf.Value || LCVRCompat.LoadedAndEnabled)
{
return true;
}
if (emoteControllerLocal.IsPerformingCustomEmote())
{
if (ThirdPersonEmoteController.firstPersonEmotesEnabled)
{
Plugin.Logger.LogMessage((object)$"gamplayCamera: {gameplayCamera}, localPlayerCameraContainer: {localPlayerCameraContainer}");
if ((Object)(object)StartOfRound.Instance.activeCamera != (Object)(object)gameplayCamera)
{
StartOfRound.Instance.SwitchCamera(gameplayCamera);
ThirdPersonEmoteController.CallChangeAudioListenerToObject(((Component)gameplayCamera).gameObject);
((Behaviour)emoteCamera).enabled = false;
if ((Object)(object)localPlayerController.currentlyHeldObjectServer != (Object)null)
{
localPlayerController.currentlyHeldObjectServer.parentObject = localPlayerController.localItemHolder;
}
}
localPlayerCameraContainer.SetPositionAndRotation(localPlayerController.playerGlobalHead.position, ((Component)localPlayerController).transform.rotation);
return isMovingWhileEmoting;
}
if ((Object)(object)StartOfRound.Instance.activeCamera != (Object)(object)emoteCamera)
{
((Behaviour)emoteCamera).enabled = true;
StartOfRound.Instance.SwitchCamera(emoteCamera);
ThirdPersonEmoteController.CallChangeAudioListenerToObject(((Component)emoteCamera).gameObject);
if ((Object)(object)localPlayerController.currentlyHeldObjectServer != (Object)null)
{
localPlayerController.currentlyHeldObjectServer.parentObject = localPlayerController.serverItemHolder;
}
}
Vector3 val = Vector3.back * Mathf.Clamp(targetCameraDistance, clampCameraDistance.x, clampCameraDistance.y);
((Component)emoteCamera).transform.localPosition = Vector3.Lerp(((Component)emoteCamera).transform.localPosition, val, 10f * Time.deltaTime);
if (!localPlayerController.quickMenuManager.isMenuOpen && !EmoteMenu.isMenuOpen)
{
bool flag = ((Vector2)(ref localPlayerController.moveInputVector)).magnitude > 0.2f;
MovementActions movement = localPlayerController.playerActions.Movement;
Vector2 val2 = ((MovementActions)(ref movement)).Look.ReadValue<Vector2>() * 0.008f * (float)IngamePlayerSettings.Instance.settings.lookSensitivity;
if (!flag)
{
emoteCameraPivot.Rotate(new Vector3(0f, val2.x, 0f));
}
float num = emoteCameraPivot.localEulerAngles.x - val2.y;
num = ((num > 180f) ? (num - 360f) : num);
num = Mathf.Clamp(num, -45f, 45f);
((Component)emoteCameraPivot).transform.localEulerAngles = new Vector3(num, emoteCameraPivot.localEulerAngles.y, 0f);
if (flag)
{
Vector3 val3 = default(Vector3);
((Vector3)(ref val3))..ctor(((Component)emoteCameraPivot).transform.forward.x, 0f, ((Component)emoteCameraPivot).transform.forward.z);
Vector3 forward = ((Component)emoteCamera).transform.forward;
((Component)localPlayerController).transform.rotation = Quaternion.RotateTowards(((Component)localPlayerController).transform.rotation, Quaternion.LookRotation(val3), Time.deltaTime * 720f);
Vector3 val4 = ((Component)emoteCameraPivot).transform.parent.InverseTransformDirection(forward);
((Component)emoteCameraPivot).transform.localRotation = Quaternion.LookRotation(val4);
}
RaycastHit val5 = default(RaycastHit);
if (Physics.Raycast(emoteCameraPivot.position, -emoteCameraPivot.forward * targetCameraDistance, ref val5, targetCameraDistance, cameraCollideLayerMask))
{
((Component)emoteCamera).transform.localPosition = Vector3.back * Mathf.Clamp(((RaycastHit)(ref val5)).distance - 0.2f, 0f, targetCameraDistance);
}
prevCameraDirection = emoteCameraPivot.forward;
return flag;
}
}
return true;
}
private static bool IsMovingWhileEmoting()
{
if (Time.time - _timeOfLastMovingCheck > 0.1f)
{
_isMovingWhileEmoting = (bool)Traverse.Create(typeof(ThirdPersonEmoteController)).Property("isMovingWhileEmoting", (object[])null).GetValue();
}
return _isMovingWhileEmoting;
}
}
}
namespace TooManyEmotesAlternateControls.Compatibility
{
internal static class LCVRCompat
{
private static bool Enabled => Chainloader.PluginInfos.ContainsKey("io.daxcess.lcvr");
private static bool IsInVR => VRSession.InVR;
public static bool LoadedAndEnabled => Enabled && IsInVR;
}
}