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.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: AssemblyCompany("EmoteWhileInMotion")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("A template for Lethal Company")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+43206f0475d7dae18e393eaa115cfd192399712f")]
[assembly: AssemblyProduct("EmoteWhileInMotion")]
[assembly: AssemblyTitle("EmoteWhileInMotion")]
[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 EmoteWhileInMotion
{
[BepInPlugin("EmoteWhileInMotion", "EmoteWhileInMotion", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
private readonly Harmony harmony = new Harmony("EmoteWhileInMotion");
private static Plugin Instance;
public static ManualLogSource Logger;
public static ConfigEntry<bool> EmoteWhileJumping;
public static ConfigEntry<bool> EmoteWhileWalking;
public static ConfigEntry<bool> EmoteWhileCrouching;
public static ConfigEntry<bool> EmoteWhileGrabbingObject;
public static ConfigEntry<bool> EmoteWhileTyping;
public static ConfigEntry<string> DisableKey;
public static bool DisableKeyPressed;
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
Logger = ((BaseUnityPlugin)this).Logger;
Logger.LogInfo((object)"Plugin EmoteWhileInMotion is loaded!");
EmoteWhileJumping = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EmoteWhileJumping", true, "Whether or not to allow emotes while jumping.");
EmoteWhileWalking = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EmoteWhileWalking", true, "Whether or not to allow emotes while walking.");
EmoteWhileCrouching = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EmoteWhileCrouching", false, "Whether or not to allow emotes while crouching.");
EmoteWhileGrabbingObject = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EmoteWhileGrabbingObject", true, "Whether or not to allow emotes while grabbing an object.");
EmoteWhileTyping = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EmoteWhileTyping", true, "Whether or not to allow emotes while typing in chat.");
DisableKey = ((BaseUnityPlugin)this).Config.Bind<string>("General", "DisableKey", "0", "The key to hold to disable emotes.");
harmony.PatchAll(Assembly.GetExecutingAssembly());
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "EmoteWhileInMotion";
public const string PLUGIN_NAME = "EmoteWhileInMotion";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace EmoteWhileInMotion.Patches
{
[HarmonyPatch]
internal class PlayerControllerBPatch
{
[HarmonyPatch(typeof(PlayerControllerB), "CheckConditionsForEmote")]
[HarmonyPostfix]
private static void CheckConditionsForEmotePostfix(PlayerControllerB __instance, ref bool __result)
{
if (__instance.inSpecialInteractAnimation || __instance.isPlayerDead)
{
__result = false;
}
if (Plugin.EmoteWhileJumping.Value && __instance.isJumping)
{
__result = true;
}
if (Plugin.EmoteWhileWalking.Value && __instance.isWalking)
{
__result = true;
}
if (Plugin.EmoteWhileCrouching.Value && __instance.isCrouching)
{
__result = true;
}
if (Plugin.EmoteWhileGrabbingObject.Value && __instance.isGrabbingObjectAnimation)
{
__result = true;
}
if (Plugin.EmoteWhileTyping.Value && __instance.isTypingChat)
{
__result = true;
}
}
[HarmonyPatch(typeof(PlayerControllerB), "Update")]
[HarmonyPrefix]
private static void UpdatePrefix(PlayerControllerB __instance)
{
if (__instance.isPlayerControlled && ((NetworkBehaviour)__instance).IsOwner)
{
if (InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[Plugin.DisableKey.Value], 0f) && !Plugin.DisableKeyPressed)
{
Plugin.DisableKeyPressed = true;
__instance.performingEmote = false;
__instance.StopPerformingEmoteServerRpc();
__instance.timeSinceStartingEmote = 0f;
}
else if (!InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[Plugin.DisableKey.Value], 0f))
{
Plugin.DisableKeyPressed = false;
}
}
}
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}