using System;
using System.Collections;
using System.Collections.Generic;
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.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCompanyInputUtils.Api;
using Microsoft.CodeAnalysis;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Dash")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("A Dash mod for Lethal Company")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3421b26455eed0caf2df65dccf377dc2ba0344bb")]
[assembly: AssemblyProduct("Dash")]
[assembly: AssemblyTitle("Dash")]
[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 Dash
{
public sealed class Config : LcInputActions
{
[HarmonyPatch]
public class SyncLimitations
{
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static HandleNamedMessageDelegate <>9__2_0;
internal void <Initialize>b__2_0(ulong clientId, FastBufferReader reader)
{
Instance.Enabled.Value = false;
Plugin.mls.LogMessage((object)"Disabled by host.");
}
}
private const string DISABLED_RECEIVE = "Niro.Dash_DisabledReceive";
private const string DISABLED_REQUEST = "Niro.Dash_DisabledRequest";
[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
[HarmonyPostfix]
public static void Initialize()
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Expected O, but got Unknown
if (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost)
{
NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Niro.Dash_DisabledRequest", new HandleNamedMessageDelegate(DisabledRequest));
return;
}
CustomMessagingManager customMessagingManager = NetworkManager.Singleton.CustomMessagingManager;
object obj = <>c.<>9__2_0;
if (obj == null)
{
HandleNamedMessageDelegate val = delegate
{
Instance.Enabled.Value = false;
Plugin.mls.LogMessage((object)"Disabled by host.");
};
<>c.<>9__2_0 = val;
obj = (object)val;
}
customMessagingManager.RegisterNamedMessageHandler("Niro.Dash_DisabledReceive", (HandleNamedMessageDelegate)obj);
NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("Niro.Dash_DisabledRequest", 0uL, new FastBufferWriter(0, (Allocator)2, -1), (NetworkDelivery)3);
}
public static void DisabledRequest(ulong clientId, FastBufferReader reader)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
if (!Instance.Enabled.Value)
{
NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("Niro.Dash_DisabledReceive", clientId, new FastBufferWriter(0, (Allocator)2, -1), (NetworkDelivery)3);
}
}
}
private static Config instance;
public ConfigEntry<bool> Enabled { get; set; }
public ConfigEntry<float> StaminaCost { get; set; }
public ConfigEntry<float> Cooldown { get; set; }
public ConfigEntry<float> Precision { get; set; }
public ConfigEntry<float> Power { get; set; }
public ConfigEntry<float> Speed { get; set; }
public ConfigEntry<float> FromSize { get; set; }
public ConfigEntry<float> ToSize { get; set; }
public InputAction DashKey => ((LcInputActions)this).Asset["dashkey"];
public ConfigEntry<bool> UseDashKey { get; set; }
public static Config Instance
{
get
{
if (instance == null)
{
instance = new Config();
}
return instance;
}
}
public void Setup()
{
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Expected O, but got Unknown
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Expected O, but got Unknown
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Expected O, but got Unknown
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Expected O, but got Unknown
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Expected O, but got Unknown
Enabled = Plugin.BepInExConfig().Bind<bool>("General", "Enabled", true, "Enable / Disable this mod (Syncing with host!)");
StaminaCost = Plugin.BepInExConfig().Bind<float>("General", "StaminaCost", 0.15f, new ConfigDescription("Stamina cost for one dash.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
Cooldown = Plugin.BepInExConfig().Bind<float>("General", "Cooldown", 0.75f, new ConfigDescription("Cooldown in seconds.", (AcceptableValueBase)null, Array.Empty<object>()));
Precision = Plugin.BepInExConfig().Bind<float>("General", "Precision", 0.2f, new ConfigDescription("Time in which a key of the double-tap has to follow to the previous one. Higher = Easier.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 0.5f), Array.Empty<object>()));
Power = Plugin.BepInExConfig().Bind<float>("General", "Power", 15f, new ConfigDescription("The power of a dash.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 100f), Array.Empty<object>()));
Speed = Plugin.BepInExConfig().Bind<float>("General", "Speed", 0.4f, new ConfigDescription("The duration / speed of the dash.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 1f), Array.Empty<object>()));
FromSize = Plugin.BepInExConfig().Bind<float>("General", "FromSize", 0f, "Player minimum size to be able to dash (value included). Default player size is 1.");
ToSize = Plugin.BepInExConfig().Bind<float>("General", "ToSize", 0f, "Player maximum size to be able to dash (value included). Default player size is 1. Use 0 to enable dashing for any size.");
UseDashKey = Plugin.BepInExConfig().Bind<bool>("SeperateKey", "UseDashKey", false, "Use a seperate key for dashing.");
}
public override void CreateInputActions(in InputActionMapBuilder builder)
{
string value = Plugin.BepInExConfig().Bind<string>("SeperateKey", "DashKeyKeyboard", "<Keyboard>/f", "Seperate keyboard key for dashing. Requires a restart after changing.").Value;
Plugin.mls.LogInfo((object)("CreateInputActions -> " + value));
string value2 = Plugin.BepInExConfig().Bind<string>("SeperateKey", "DashKeyGamepad", "<Gamepad>/rightShoulder", "Seperate gamepad key for dashing. Requires a restart after changing.").Value;
Plugin.mls.LogInfo((object)("CreateInputActions -> " + value2));
builder.NewActionBinding().WithActionId("dashkey").WithActionType((InputActionType)1)
.WithBindingName("DashKey")
.WithKbmPath(value)
.WithGamepadPath(value2)
.Finish();
}
}
internal class DashHandler
{
public enum Direction
{
Forward,
Backward,
Left,
Right
}
public float lastDashedAt;
private bool DashKeyRegistered;
internal Dictionary<Direction, int> dashProgressMap = new Dictionary<Direction, int>
{
{
Direction.Forward,
0
},
{
Direction.Backward,
0
},
{
Direction.Left,
0
},
{
Direction.Right,
0
}
};
internal Dictionary<Direction, float> lastKeyChangeMap = new Dictionary<Direction, float>
{
{
Direction.Forward,
0f
},
{
Direction.Backward,
0f
},
{
Direction.Left,
0f
},
{
Direction.Right,
0f
}
};
public void RegisterDashKey()
{
if (DashKeyRegistered)
{
if (!InputUtilsCompat.Enabled || !InputUtilsCompat.UseDashKey)
{
InputUtilsCompat.DashKey.performed -= OnDashKeyPressed;
DashKeyRegistered = false;
}
}
else if (InputUtilsCompat.Enabled && InputUtilsCompat.UseDashKey)
{
InputUtilsCompat.DashKey.performed += OnDashKeyPressed;
DashKeyRegistered = true;
}
}
internal void OnUpdate()
{
if (FulfillsDashConditions())
{
if (((ButtonControl)Keyboard.current.wKey).wasPressedThisFrame || ((ButtonControl)Keyboard.current.wKey).wasReleasedThisFrame)
{
HandleDashInDirection(Direction.Forward);
}
else if (((ButtonControl)Keyboard.current.sKey).wasPressedThisFrame || ((ButtonControl)Keyboard.current.sKey).wasReleasedThisFrame)
{
HandleDashInDirection(Direction.Backward);
}
else if (((ButtonControl)Keyboard.current.aKey).wasPressedThisFrame || ((ButtonControl)Keyboard.current.aKey).wasReleasedThisFrame)
{
HandleDashInDirection(Direction.Left);
}
else if (((ButtonControl)Keyboard.current.dKey).wasPressedThisFrame || ((ButtonControl)Keyboard.current.dKey).wasReleasedThisFrame)
{
HandleDashInDirection(Direction.Right);
}
}
}
internal void OnDashKeyPressed(CallbackContext dashContext)
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
if (FulfillsDashConditions())
{
PerformDash(((Component)StartOfRound.Instance.localPlayerController.gameplayCamera).transform.forward);
}
}
internal bool FulfillsDashConditions()
{
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)StartOfRound.Instance.localPlayerController == (Object)null)
{
return false;
}
if (!Config.Instance.Enabled.Value)
{
return false;
}
if (Config.Instance.ToSize.Value > 0f)
{
float y = ((Component)StartOfRound.Instance.localPlayerController).gameObject.transform.localScale.y;
if (y < Config.Instance.FromSize.Value || y > Config.Instance.ToSize.Value)
{
return false;
}
}
if (StartOfRound.Instance.localPlayerController.sprintMeter < Config.Instance.StaminaCost.Value)
{
return false;
}
if (Time.time - lastDashedAt < Config.Instance.Cooldown.Value)
{
return false;
}
return true;
}
internal void HandleDashInDirection(Direction direction)
{
float num = Time.time - lastKeyChangeMap[direction];
lastKeyChangeMap[direction] = Time.time;
if (num < Config.Instance.Precision.Value)
{
dashProgressMap[direction]++;
if (dashProgressMap[direction] >= 3)
{
PerformDash(direction);
dashProgressMap[direction] = 0;
}
}
else
{
dashProgressMap[direction] = 0;
}
}
internal void PerformDash(Direction direction)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: 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_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_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: 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)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: 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)
Vector3 val = ((Component)StartOfRound.Instance.localPlayerController.gameplayCamera).transform.forward;
switch (direction)
{
case Direction.Backward:
val *= -1f;
break;
case Direction.Left:
val = Quaternion.Euler(0f, -90f, 0f) * val;
break;
case Direction.Right:
val = Quaternion.Euler(0f, 90f, 0f) * val;
break;
}
PerformDash(val);
}
internal void PerformDash(Vector3 direction)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
direction.y = 0f;
DashRoutine.StartRoutine(StartOfRound.Instance.localPlayerController, direction, Config.Instance.Power.Value, Config.Instance.Speed.Value);
StartOfRound.Instance.localPlayerController.sprintMeter = Mathf.Clamp(StartOfRound.Instance.localPlayerController.sprintMeter - Config.Instance.StaminaCost.Value, 0f, 1f);
lastDashedAt = Time.time;
}
}
internal class DashRoutine : MonoBehaviour
{
public static void StartRoutine(PlayerControllerB targetPlayer, Vector3 direction, float force, float duration = 0.5f, Action onComplete = null)
{
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)((targetPlayer != null) ? ((Component)targetPlayer).gameObject : null) == (Object)null))
{
DashRoutine dashRoutine = ((Component)targetPlayer).gameObject.AddComponent<DashRoutine>();
((MonoBehaviour)dashRoutine).StartCoroutine(dashRoutine.Run(targetPlayer, direction, force, duration));
}
}
private IEnumerator Run(PlayerControllerB targetPlayer, Vector3 direction, float force, float duration)
{
//IL_000e: 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)
float time = 0f;
Vector3 startForce = direction * force;
while (time < duration)
{
float num = Mathf.Lerp(MathF.PI / 2f, 0f, time / duration);
Vector3 externalForces = startForce * num;
targetPlayer.externalForces = externalForces;
time += Time.deltaTime;
yield return null;
}
targetPlayer.externalForces = Vector3.zero;
}
}
internal static class InputUtilsCompat
{
public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.rune580.LethalCompanyInputUtils");
public static bool UseDashKey => Config.Instance.UseDashKey.Value;
public static InputAction DashKey => Config.Instance.DashKey;
}
[HarmonyPatch]
internal class PlayerControllerBPatch
{
[HarmonyPatch(typeof(PlayerControllerB), "Update")]
[HarmonyPostfix]
public static void OnUpdate(PlayerControllerB __instance)
{
if ((!InputUtilsCompat.Enabled || !InputUtilsCompat.UseDashKey) && !((Object)(object)StartOfRound.Instance.localPlayerController == (Object)null) && StartOfRound.Instance.localPlayerController.playerClientId == __instance.playerClientId)
{
Plugin.dashHandler.OnUpdate();
}
}
[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
[HarmonyPostfix]
public static void ConnectClientToPlayerObject()
{
Plugin.dashHandler.RegisterDashKey();
}
}
[BepInPlugin("Niro.Dash", "Dash", "1.1.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
public const string modGUID = "Niro.Dash";
public const string modName = "Dash";
public const string modVersion = "1.1.1";
private readonly Harmony harmony = new Harmony("Niro.Dash");
private static Plugin instance;
internal static ManualLogSource mls;
internal static DashHandler dashHandler = new DashHandler();
public static ConfigFile BepInExConfig()
{
return ((BaseUnityPlugin)instance).Config;
}
public void Awake()
{
if ((Object)(object)instance == (Object)null)
{
instance = this;
}
mls = Logger.CreateLogSource("Niro.Dash");
Config.Instance.Setup();
mls.LogMessage((object)"Plugin Dash loaded!");
harmony.PatchAll(typeof(Config.SyncLimitations));
harmony.PatchAll(typeof(PlayerControllerBPatch));
}
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}