using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EmotesAPI;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCompanyInputUtils.Api;
using LethalEmotesAPI.ImportV2;
using LethalHands;
using LethalHands.NetcodePatcher;
using LethalHands.Patches;
using Microsoft.CodeAnalysis;
using Unity.Collections;
using Unity.Netcode;
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: AssemblyTitle("LethalHands")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LethalHands")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("3b5b33b2-35bc-42cf-8244-b7242ac50309")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
static <Module>()
{
}
}
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;
}
}
}
[Serializable]
public class SyncedInstance<T>
{
[NonSerialized]
protected static int IntSize = 4;
internal static CustomMessagingManager MessageManager => NetworkManager.Singleton.CustomMessagingManager;
internal static bool IsClient => NetworkManager.Singleton.IsClient;
internal static bool IsHost => NetworkManager.Singleton.IsHost;
public static T Default { get; private set; }
public static T Instance { get; private set; }
public static bool Synced { get; internal set; }
protected void InitInstance(T instance)
{
Default = instance;
Instance = instance;
IntSize = 4;
}
internal static void SyncInstance(byte[] data)
{
Instance = DeserializeFromBytes(data);
Synced = true;
}
internal static void RevertSync()
{
Instance = Default;
Synced = false;
}
public static byte[] SerializeToBytes(T val)
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
using MemoryStream memoryStream = new MemoryStream();
try
{
binaryFormatter.Serialize(memoryStream, val);
return memoryStream.ToArray();
}
catch (Exception arg)
{
LethalHandsPlugin.Instance.manualLogSource.LogError((object)$"Error serializing instance: {arg}");
return null;
}
}
public static T DeserializeFromBytes(byte[] data)
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
using MemoryStream serializationStream = new MemoryStream(data);
try
{
return (T)binaryFormatter.Deserialize(serializationStream);
}
catch (Exception arg)
{
LethalHandsPlugin.Instance.manualLogSource.LogError((object)$"Error deserializing instance: {arg}");
return default(T);
}
}
}
namespace LethalHands
{
internal class Animation
{
private static HumanBodyBones[] ignoredRootBones = (HumanBodyBones[])(object)new HumanBodyBones[2]
{
(HumanBodyBones)1,
(HumanBodyBones)2
};
private static HumanBodyBones[] ignoredSoloBones;
public static void instantiateAnimations()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Expected O, but got Unknown
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Expected O, but got Unknown
//IL_023c: Unknown result type (might be due to invalid IL or missing references)
//IL_0243: Expected O, but got Unknown
CustomEmoteParams val = new CustomEmoteParams();
val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("squareup.anim") };
val.secondaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("squaredupidle.anim") };
val.visible = false;
val.audioLevel = 0f;
val.audioLoops = false;
val.allowJoining = false;
val.thirdPerson = false;
val.forceCameraMode = true;
val.allowThirdPerson = false;
val.displayName = " ";
val.internalName = "squareup";
val.rootBonesToIgnore = ignoredRootBones;
val.soloBonesToIgnore = ignoredSoloBones;
val.useLocalTransforms = true;
val.animateHealthbar = false;
CustomEmoteParams val2 = val;
val = new CustomEmoteParams();
val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("squaredown.anim") };
val.visible = false;
val.audioLevel = 0f;
val.audioLoops = false;
val.allowJoining = false;
val.thirdPerson = false;
val.forceCameraMode = true;
val.allowThirdPerson = false;
val.displayName = " ";
val.internalName = "squaredown";
val.rootBonesToIgnore = ignoredRootBones;
val.soloBonesToIgnore = ignoredSoloBones;
val.useLocalTransforms = true;
val.animateHealthbar = false;
CustomEmoteParams val3 = val;
val = new CustomEmoteParams();
val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("lpunch.anim") };
val.secondaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("squaredupidle.anim") };
val.primaryAudioClips = (AudioClip[])(object)new AudioClip[2]
{
Assets.Load<AudioClip>("swing1.ogg"),
Assets.Load<AudioClip>("swing2.ogg")
};
val.visible = false;
val.audioLevel = 0f;
val.audioLoops = false;
val.allowJoining = false;
val.thirdPerson = false;
val.forceCameraMode = true;
val.allowThirdPerson = false;
val.displayName = " ";
val.internalName = "lpunch";
val.rootBonesToIgnore = ignoredRootBones;
val.soloBonesToIgnore = ignoredSoloBones;
val.useLocalTransforms = true;
val.animateHealthbar = false;
CustomEmoteParams val4 = val;
val = new CustomEmoteParams();
val.primaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("rpunch.anim") };
val.secondaryAnimationClips = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("squaredupidle.anim") };
val.primaryAudioClips = (AudioClip[])(object)new AudioClip[2]
{
Assets.Load<AudioClip>("swing1.ogg"),
Assets.Load<AudioClip>("swing2.ogg")
};
val.visible = false;
val.audioLevel = 0f;
val.audioLoops = false;
val.allowJoining = false;
val.thirdPerson = false;
val.forceCameraMode = true;
val.allowThirdPerson = false;
val.displayName = " ";
val.internalName = "rpunch";
val.rootBonesToIgnore = ignoredRootBones;
val.soloBonesToIgnore = ignoredSoloBones;
val.useLocalTransforms = true;
val.animateHealthbar = false;
CustomEmoteParams val5 = val;
EmoteImporter.ImportEmote(val2);
EmoteImporter.ImportEmote(val3);
EmoteImporter.ImportEmote(val4);
EmoteImporter.ImportEmote(val5);
}
static Animation()
{
HumanBodyBones[] array = new HumanBodyBones[4];
RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
ignoredSoloBones = (HumanBodyBones[])(object)array;
}
}
public static class Assets
{
internal static readonly List<AssetBundle> AssetBundles = new List<AssetBundle>();
private static readonly Dictionary<string, int> AssetIndices = new Dictionary<string, int>();
public static void LoadAssetBundlesFromFolder(string folderName)
{
folderName = Path.Combine(Path.GetDirectoryName(LethalHandsPlugin.PInfo.Location), folderName);
string[] files = Directory.GetFiles(folderName);
foreach (string text in files)
{
AssetBundle val = AssetBundle.LoadFromFile(text);
int count = AssetBundles.Count;
AssetBundles.Add(val);
string[] allAssetNames = val.GetAllAssetNames();
foreach (string text2 in allAssetNames)
{
string text3 = text2.ToLowerInvariant();
if (text3.StartsWith("assets/"))
{
text3 = text3.Remove(0, "assets/".Length);
}
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)$"paring [{text3}] with [{count}]");
AssetIndices[text3] = count;
}
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)("Loaded AssetBundle: " + Path.GetFileName(text)));
}
}
public static T Load<T>(string assetName) where T : Object
{
try
{
assetName = assetName.ToLowerInvariant();
if (assetName.Contains(":"))
{
string[] array = assetName.Split(new char[1] { ':' });
assetName = array[1].ToLowerInvariant();
}
if (assetName.StartsWith("assets/"))
{
assetName = assetName.Remove(0, "assets/".Length);
}
int index = AssetIndices[assetName];
return AssetBundles[index].LoadAsset<T>("assets/" + assetName);
}
catch (Exception arg)
{
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)$"Couldn't load asset [{assetName}] reason: {arg}");
return default(T);
}
}
}
public class EnemyFloatHealth
{
public static EnemyFloatHealth Instance;
private Dictionary<EnemyAI, float> enemyHitCounter;
public EnemyFloatHealth()
{
if (Instance == null)
{
Instance = this;
}
enemyHitCounter = new Dictionary<EnemyAI, float>();
}
public void Reset()
{
enemyHitCounter.Clear();
}
public int DamageEnemy(EnemyAI enemy)
{
if (!enemyHitCounter.ContainsKey(enemy))
{
enemyHitCounter.Add(enemy, 0f);
}
int num = 0;
if (enemy is NutcrackerEnemyAI)
{
NutcrackerEnemyAI val = (NutcrackerEnemyAI)(object)((enemy is NutcrackerEnemyAI) ? enemy : null);
FieldInfo field = typeof(NutcrackerEnemyAI).GetField("isInspecting", BindingFlags.Instance | BindingFlags.NonPublic);
if (!(bool)field.GetValue(val) && ((EnemyAI)val).currentBehaviourStateIndex != 2)
{
return 0;
}
}
enemyHitCounter[enemy] += LethalHands.Instance.enemyPunchDamage;
while (enemyHitCounter[enemy] >= 1f)
{
enemyHitCounter[enemy]--;
num++;
}
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)$"new damage : {num}");
return num;
}
}
[Serializable]
public class NetworkConfig : SyncedInstance<NetworkConfig>
{
public float punchRange;
public float punchCooldown;
public float enemyPunchDamage;
public int playerPunchDamage;
public int punchOffClingersChance;
public bool punchingHaltsStaminaRegen;
public int punchStaminaRequirement;
public int staminaDrain;
public ItemMode itemDropMode;
public bool allowItems;
public NetworkConfig()
{
InitInstance(this);
punchRange = LocalConfig.punchRange.Value;
punchCooldown = LocalConfig.punchCooldown.Value;
enemyPunchDamage = LocalConfig.enemyPunchDamage.Value;
playerPunchDamage = LocalConfig.playerPunchDamage.Value;
punchOffClingersChance = LocalConfig.punchOffClingersChance.Value;
staminaDrain = LocalConfig.staminaDrain.Value;
punchStaminaRequirement = LocalConfig.staminaRequirement.Value;
punchingHaltsStaminaRegen = LocalConfig.punchingHaltsStaminaRegen.Value;
itemDropMode = LocalConfig.itemDropMode.Value;
allowItems = LocalConfig.allowItems.Value;
}
public static void RequestSync()
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
if (!SyncedInstance<NetworkConfig>.IsClient)
{
return;
}
FastBufferWriter val = default(FastBufferWriter);
((FastBufferWriter)(ref val))..ctor(SyncedInstance<NetworkConfig>.IntSize, (Allocator)2, -1);
try
{
SyncedInstance<NetworkConfig>.MessageManager.SendNamedMessage("SlapitNow.LethalHands_OnRequestConfigSync", 0uL, val, (NetworkDelivery)3);
}
finally
{
((IDisposable)(FastBufferWriter)(ref val)).Dispose();
}
}
public static void OnRequestSync(ulong clientId, FastBufferReader _)
{
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
if (!SyncedInstance<NetworkConfig>.IsHost)
{
return;
}
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)$"Config sync request received from client: {clientId}");
byte[] array = SyncedInstance<NetworkConfig>.SerializeToBytes(SyncedInstance<NetworkConfig>.Instance);
int num = array.Length;
FastBufferWriter val = default(FastBufferWriter);
((FastBufferWriter)(ref val))..ctor(num + SyncedInstance<NetworkConfig>.IntSize, (Allocator)2, -1);
try
{
((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives));
((FastBufferWriter)(ref val)).WriteBytesSafe(array, -1, 0);
SyncedInstance<NetworkConfig>.MessageManager.SendNamedMessage("SlapitNow.LethalHands_OnReceiveConfigSync", clientId, val, (NetworkDelivery)3);
}
catch (Exception arg)
{
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)$"Error occurred syncing config with client: {clientId}\n{arg}");
}
finally
{
((IDisposable)(FastBufferWriter)(ref val)).Dispose();
}
}
public static void OnReceiveSync(ulong _, FastBufferReader reader)
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
if (!((FastBufferReader)(ref reader)).TryBeginRead(SyncedInstance<NetworkConfig>.IntSize))
{
LethalHandsPlugin.Instance.manualLogSource.LogError((object)"Config sync error: Could not begin reading buffer.");
return;
}
int num = default(int);
((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives));
if (!((FastBufferReader)(ref reader)).TryBeginRead(num))
{
LethalHandsPlugin.Instance.manualLogSource.LogError((object)"Config sync error: Host could not sync.");
return;
}
byte[] data = new byte[num];
((FastBufferReader)(ref reader)).ReadBytesSafe(ref data, num, 0);
SyncedInstance<NetworkConfig>.SyncInstance(data);
LethalHands.Instance.LoadConfigValues();
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)"Successfully synced config with host.");
}
}
internal class Input
{
public class SquareUpInput : LcInputActions
{
public static SquareUpInput Instance = new SquareUpInput();
[InputAction("<Keyboard>/j", Name = "Square up")]
public InputAction SquareUpKey { get; set; }
}
}
public class LethalHands : MonoBehaviour
{
public bool isSquaredUp = false;
private static int shovelMask = 11012424;
public PlayerControllerB playerControllerInstance = GameNetworkManager.Instance.localPlayerController;
private static readonly string[] controlTips = new string[2] { "Left Punch : [Left Click]", "Right Punch : [Right Click]" };
private AudioClip[] hitSounds = (AudioClip[])(object)new AudioClip[2]
{
Assets.Load<AudioClip>("hit1.ogg"),
Assets.Load<AudioClip>("hit2.ogg")
};
public float recordedStamina = 1f;
public bool freezeStaminaRegen = false;
private Coroutine punchingCoroutine = null;
private Coroutine unfreezeStaminaRegenCoroutine = null;
private float punchRange = SyncedInstance<NetworkConfig>.Default.punchRange;
private float punchDelay = SyncedInstance<NetworkConfig>.Default.punchCooldown;
public float enemyPunchDamage = SyncedInstance<NetworkConfig>.Default.enemyPunchDamage;
public int playerPunchDamage = SyncedInstance<NetworkConfig>.Default.playerPunchDamage;
private int punchOffClingersChance = SyncedInstance<NetworkConfig>.Default.punchOffClingersChance;
private float staminaDrain = (float)SyncedInstance<NetworkConfig>.Default.staminaDrain * 0.01f;
public bool punchingHaltsStaminaRegen = SyncedInstance<NetworkConfig>.Default.punchingHaltsStaminaRegen;
private float punchStaminaRequirement = (float)SyncedInstance<NetworkConfig>.Default.punchStaminaRequirement * 0.01f;
private ItemMode itemMode = SyncedInstance<NetworkConfig>.Default.itemDropMode;
public bool allowItems = SyncedInstance<NetworkConfig>.Default.allowItems;
private float punchConnectTime = Mathf.Min(0.1f * SyncedInstance<NetworkConfig>.Default.punchCooldown, 0.1f);
private float punchFinishingTime = Mathf.Min(0.9f * SyncedInstance<NetworkConfig>.Default.punchCooldown, 0.9f);
public static LethalHands Instance { get; private set; }
public void Awake()
{
if (!((Object)(object)Instance != (Object)null))
{
Instance = this;
Input.SquareUpInput.Instance.SquareUpKey.performed += SquareUpPerformed;
}
}
public void LoadConfigValues()
{
punchRange = SyncedInstance<NetworkConfig>.Instance.punchRange;
punchDelay = SyncedInstance<NetworkConfig>.Instance.punchCooldown * 4f;
enemyPunchDamage = SyncedInstance<NetworkConfig>.Instance.enemyPunchDamage;
playerPunchDamage = SyncedInstance<NetworkConfig>.Instance.playerPunchDamage;
punchOffClingersChance = SyncedInstance<NetworkConfig>.Instance.punchOffClingersChance;
staminaDrain = (float)SyncedInstance<NetworkConfig>.Instance.staminaDrain * 0.01f;
punchingHaltsStaminaRegen = SyncedInstance<NetworkConfig>.Instance.punchingHaltsStaminaRegen;
punchStaminaRequirement = (float)SyncedInstance<NetworkConfig>.Instance.punchStaminaRequirement * 0.01f;
itemMode = SyncedInstance<NetworkConfig>.Instance.itemDropMode;
allowItems = SyncedInstance<NetworkConfig>.Instance.allowItems;
punchConnectTime = Mathf.Min(0.2f * SyncedInstance<NetworkConfig>.Instance.punchCooldown, 0.1f);
}
public void SquareUpPerformed(CallbackContext context)
{
if (((CallbackContext)(ref context)).performed && !playerControllerInstance.quickMenuManager.isMenuOpen && ((((NetworkBehaviour)playerControllerInstance).IsOwner && playerControllerInstance.isPlayerControlled && (!((NetworkBehaviour)playerControllerInstance).IsServer || playerControllerInstance.isHostPlayerObject)) || playerControllerInstance.isTestingPlayer) && !playerControllerInstance.inSpecialInteractAnimation && !playerControllerInstance.isTypingChat)
{
if (isSquaredUp)
{
SquareDown(animate: true);
}
else
{
SquareUp();
}
}
}
public void LeftPunchPerformed(CallbackContext context)
{
if (((CallbackContext)(ref context)).performed && isSquaredUp && playerControllerInstance.sprintMeter >= punchStaminaRequirement && punchingCoroutine == null)
{
punchingCoroutine = ((MonoBehaviour)this).StartCoroutine(LeftPunch());
}
}
public void RightPunchPerformed(CallbackContext context)
{
if (((CallbackContext)(ref context)).performed && isSquaredUp && playerControllerInstance.sprintMeter >= punchStaminaRequirement && punchingCoroutine == null)
{
punchingCoroutine = ((MonoBehaviour)this).StartCoroutine(RightPunch());
}
}
public void SquareUp()
{
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
if (isSquaredUp || playerControllerInstance.inSpecialInteractAnimation)
{
return;
}
switch (itemMode)
{
case ItemMode.All:
playerControllerInstance.DropAllHeldItemsAndSync();
break;
case ItemMode.Current:
if (playerControllerInstance.isHoldingObject)
{
playerControllerInstance.DiscardHeldObject(false, (NetworkObject)null, default(Vector3), true);
}
break;
}
playerControllerInstance.performingEmote = false;
playerControllerInstance.StopPerformingEmoteServerRpc();
playerControllerInstance.timeSinceStartingEmote = 0f;
isSquaredUp = true;
CustomEmotesAPI.PlayAnimation("SlapitNow.LethalHands__squareup", -2);
IngamePlayerSettings.Instance.playerInput.actions.FindAction("ActivateItem", false).performed += LeftPunchPerformed;
IngamePlayerSettings.Instance.playerInput.actions.FindAction("PingScan", false).performed += RightPunchPerformed;
HUDManager.Instance.ClearControlTips();
HUDManager.Instance.ChangeControlTipMultiple(controlTips, false, (Item)null);
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)("Squaring up " + isSquaredUp));
}
public void SquareDown(bool animate)
{
if (isSquaredUp)
{
IngamePlayerSettings.Instance.playerInput.actions.FindAction("ActivateItem", false).performed -= LeftPunchPerformed;
IngamePlayerSettings.Instance.playerInput.actions.FindAction("PingScan", false).performed -= RightPunchPerformed;
if (animate)
{
CustomEmotesAPI.PlayAnimation("SlapitNow.LethalHands__squaredown", -2);
}
else
{
CustomEmotesAPI.PlayAnimation("none", -2);
}
HUDManager.Instance.ClearControlTips();
isSquaredUp = false;
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)("Squaring down " + isSquaredUp));
}
}
private IEnumerator LeftPunch()
{
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)"Left Punch");
playerControllerInstance.sprintMeter = Mathf.Max(playerControllerInstance.sprintMeter - staminaDrain, 0f);
recordedStamina = playerControllerInstance.sprintMeter;
freezeStaminaRegen = true;
CustomEmotesAPI.PlayAnimation("SlapitNow.LethalHands__lpunch", -2);
yield return (object)new WaitForSeconds(punchConnectTime);
PunchThrow();
yield return (object)new WaitForSeconds(punchFinishingTime);
punchingCoroutine = null;
if (unfreezeStaminaRegenCoroutine != null)
{
((MonoBehaviour)this).StopCoroutine(unfreezeStaminaRegenCoroutine);
}
unfreezeStaminaRegenCoroutine = ((MonoBehaviour)this).StartCoroutine(UnfreezeStaminaRegen());
}
private IEnumerator RightPunch()
{
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)"Right Punch");
playerControllerInstance.sprintMeter = Mathf.Max(playerControllerInstance.sprintMeter - staminaDrain, 0f);
recordedStamina = playerControllerInstance.sprintMeter;
freezeStaminaRegen = true;
CustomEmotesAPI.PlayAnimation("SlapitNow.LethalHands__rpunch", -2);
yield return (object)new WaitForSeconds(punchConnectTime);
PunchThrow();
yield return (object)new WaitForSeconds(punchFinishingTime);
punchingCoroutine = null;
if (unfreezeStaminaRegenCoroutine != null)
{
((MonoBehaviour)this).StopCoroutine(unfreezeStaminaRegenCoroutine);
}
unfreezeStaminaRegenCoroutine = ((MonoBehaviour)this).StartCoroutine(UnfreezeStaminaRegen());
}
private IEnumerator UnfreezeStaminaRegen()
{
yield return (object)new WaitForSeconds(0.5f);
freezeStaminaRegen = false;
}
public void PunchThrow()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_0377: Unknown result type (might be due to invalid IL or missing references)
//IL_0140: Unknown result type (might be due to invalid IL or missing references)
//IL_0145: Unknown result type (might be due to invalid IL or missing references)
//IL_0161: Unknown result type (might be due to invalid IL or missing references)
//IL_0168: Unknown result type (might be due to invalid IL or missing references)
//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
//IL_01cb: 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)
RaycastHit[] source = Physics.SphereCastAll(((Component)playerControllerInstance.gameplayCamera).transform.position, 0.8f, ((Component)playerControllerInstance.gameplayCamera).transform.forward, punchRange, shovelMask, (QueryTriggerInteraction)2);
List<RaycastHit> list = source.OrderBy((RaycastHit raycast) => ((RaycastHit)(ref raycast)).distance).ToList();
bool flag = false;
int terrainIndex = -1;
IHittable val = default(IHittable);
RaycastHit val2 = default(RaycastHit);
foreach (RaycastHit item in list)
{
RaycastHit current = item;
if ((((Component)((RaycastHit)(ref current)).transform).gameObject.layer == 8 || ((Component)((RaycastHit)(ref current)).transform).gameObject.layer == 11) && !((RaycastHit)(ref current)).collider.isTrigger)
{
flag = true;
string tag = ((Component)((RaycastHit)(ref current)).collider).gameObject.tag;
for (int i = 0; i < StartOfRound.Instance.footstepSurfaces.Length; i++)
{
if (StartOfRound.Instance.footstepSurfaces[i].surfaceTag == tag)
{
terrainIndex = i;
break;
}
}
}
else
{
if (!((Component)((RaycastHit)(ref current)).transform).TryGetComponent<IHittable>(ref val) || (!(((RaycastHit)(ref current)).point == Vector3.zero) && Physics.Linecast(((Component)playerControllerInstance.gameplayCamera).transform.position, ((RaycastHit)(ref current)).point, ref val2, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) || (Object)(object)((RaycastHit)(ref current)).transform == (Object)(object)((Component)playerControllerInstance).transform)
{
continue;
}
flag = true;
Vector3 forward = ((Component)playerControllerInstance.gameplayCamera).transform.forward;
bool flag2 = punchOffClingersChance > 0 && Random.Range(0, 100) < punchOffClingersChance;
if (!flag2)
{
BushWolfTongueCollider val3 = (BushWolfTongueCollider)(object)((val is BushWolfTongueCollider) ? val : null);
if (val3 != null && (Object)(object)val3.bushWolfScript.draggingPlayer == (Object)(object)playerControllerInstance)
{
continue;
}
}
EnemyAICollisionDetect val4 = (EnemyAICollisionDetect)(object)((val is EnemyAICollisionDetect) ? val : null);
if (val4 != null)
{
EnemyAI mainScript = val4.mainScript;
if (mainScript.isEnemyDead)
{
continue;
}
if (!flag2)
{
CentipedeAI val5 = (CentipedeAI)(object)((mainScript is CentipedeAI) ? mainScript : null);
if (val5 != null && (Object)(object)val5.clingingToPlayer == (Object)(object)playerControllerInstance)
{
continue;
}
}
if (!flag2)
{
FlowerSnakeEnemy val6 = (FlowerSnakeEnemy)(object)((mainScript is FlowerSnakeEnemy) ? mainScript : null);
if (val6 != null && (Object)(object)val6.clingingToPlayer == (Object)(object)playerControllerInstance)
{
continue;
}
}
val4.onlyCollideWhenGrounded = false;
}
try
{
val.Hit(-22, forward, playerControllerInstance, true, -1);
}
catch
{
}
break;
}
}
if (flag)
{
int soundIndex = Random.Range(0, hitSounds.Length);
LethalHandsNetworker.Instance.PunchHitSoundServerRpc((int)playerControllerInstance.playerClientId, soundIndex, terrainIndex);
RoundManager.PlayRandomClip(playerControllerInstance.movementAudio, hitSounds, true, 1f, 0, 1000);
RoundManager.Instance.PlayAudibleNoise(((Component)playerControllerInstance).transform.position, 10f, 0.5f, 0, false, 0);
}
}
public void PunchHitSound(int playerID, int soundIndex, int terrainIndex)
{
AudioSource movementAudio = StartOfRound.Instance.allPlayerScripts[playerID].movementAudio;
movementAudio.PlayOneShot(hitSounds[soundIndex]);
WalkieTalkie.TransmitOneShotAudio(movementAudio, hitSounds[soundIndex], 1f);
if (terrainIndex != -1)
{
movementAudio.PlayOneShot(StartOfRound.Instance.footstepSurfaces[terrainIndex].hitSurfaceSFX);
WalkieTalkie.TransmitOneShotAudio(movementAudio, StartOfRound.Instance.footstepSurfaces[terrainIndex].hitSurfaceSFX, 1f);
}
}
public void Sleep()
{
Input.SquareUpInput.Instance.SquareUpKey.performed -= SquareUpPerformed;
if (isSquaredUp)
{
IngamePlayerSettings.Instance.playerInput.actions.FindAction("ActivateItem", false).performed -= LeftPunchPerformed;
IngamePlayerSettings.Instance.playerInput.actions.FindAction("PingScan", false).performed -= RightPunchPerformed;
}
Instance = null;
}
}
internal class LethalHandsNetworker : NetworkBehaviour
{
public static LethalHandsNetworker Instance { get; private set; }
public override void OnNetworkSpawn()
{
if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer)
{
LethalHandsNetworker instance = Instance;
if (instance != null)
{
((Component)instance).gameObject.GetComponent<NetworkObject>().Despawn(true);
}
}
Instance = this;
((NetworkBehaviour)this).OnNetworkSpawn();
}
[ServerRpc(RequireOwnership = false)]
public void PunchHitSoundServerRpc(int playerID, int soundIndex, int terrainIndex)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Invalid comparison between Unknown and I4
//IL_005f: 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_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: 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)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams val = default(ServerRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3916256545u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerID);
BytePacker.WriteValueBitPacked(val2, soundIndex);
BytePacker.WriteValueBitPacked(val2, terrainIndex);
((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3916256545u, val, (RpcDelivery)0);
}
if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
{
PunchHitSoundClientRpc(playerID, soundIndex, terrainIndex);
}
}
}
[ClientRpc]
public void PunchHitSoundClientRpc(int playerID, int soundIndex, int terrainIndex)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Invalid comparison between Unknown and I4
//IL_005f: 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_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: 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)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams val = default(ClientRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3644235124u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerID);
BytePacker.WriteValueBitPacked(val2, soundIndex);
BytePacker.WriteValueBitPacked(val2, terrainIndex);
((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3644235124u, val, (RpcDelivery)0);
}
if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
{
LethalHands.Instance.PunchHitSound(playerID, soundIndex, terrainIndex);
}
}
}
protected override void __initializeVariables()
{
((NetworkBehaviour)this).__initializeVariables();
}
[RuntimeInitializeOnLoadMethod]
internal static void InitializeRPCS_LethalHandsNetworker()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
NetworkManager.__rpc_func_table.Add(3916256545u, new RpcReceiveHandler(__rpc_handler_3916256545));
NetworkManager.__rpc_func_table.Add(3644235124u, new RpcReceiveHandler(__rpc_handler_3644235124));
}
private static void __rpc_handler_3916256545(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: 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_003d: 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_0072: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int playerID = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref playerID);
int soundIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref soundIndex);
int terrainIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref terrainIndex);
target.__rpc_exec_stage = (__RpcExecStage)1;
((LethalHandsNetworker)(object)target).PunchHitSoundServerRpc(playerID, soundIndex, terrainIndex);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_3644235124(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: 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_003d: 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_0072: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int playerID = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref playerID);
int soundIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref soundIndex);
int terrainIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref terrainIndex);
target.__rpc_exec_stage = (__RpcExecStage)2;
((LethalHandsNetworker)(object)target).PunchHitSoundClientRpc(playerID, soundIndex, terrainIndex);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
protected internal override string __getTypeName()
{
return "LethalHandsNetworker";
}
}
public class LocalConfig
{
public static ConfigEntry<float> punchRange;
public static ConfigEntry<float> punchCooldown;
public static ConfigEntry<float> enemyPunchDamage;
public static ConfigEntry<int> playerPunchDamage;
public static ConfigEntry<int> punchOffClingersChance;
public static ConfigEntry<int> staminaDrain;
public static ConfigEntry<int> staminaRequirement;
public static ConfigEntry<bool> punchingHaltsStaminaRegen;
public static ConfigEntry<ItemMode> itemDropMode;
public static ConfigEntry<bool> allowItems;
public static NetworkConfig networkConfig;
public LocalConfig(ConfigFile cfg)
{
punchRange = cfg.Bind<float>("Balancing", "PunchRange", 1.2f, "Range of the punch (for reference, shovels are 1.5 and knives are 0.75)");
punchCooldown = cfg.Bind<float>("Balancing", "PunchCooldown", 1f, "Cooldown (in seconds) between punches");
enemyPunchDamage = cfg.Bind<float>("Balancing", "EnemyPunchDamage", 0.5f, "Damage dealt by a punch to enemies");
playerPunchDamage = cfg.Bind<int>("Balancing", "PlayerPunchDamage", 10, "Damage dealt by a punch to other players");
punchOffClingersChance = cfg.Bind<int>("Balancing", "PunchOffClingersChance", 100, "How likely (%) your own punches are to hit snarefleas/tulip snakes/fox tongues that are attached to yourself");
staminaDrain = cfg.Bind<int>("Stamina Balancing", "StaminaDrain", 0, "Max stamina drained (%) per punch");
staminaRequirement = cfg.Bind<int>("Stamina Balancing", "StaminaRequirement", 0, "Max stamina required (%) to punch");
punchingHaltsStaminaRegen = cfg.Bind<bool>("Stamina Balancing", "PunchingHaltsStaminaRegen", false, "Whether punching should halt stamina regeneration for a brief period");
itemDropMode = cfg.Bind<ItemMode>("Item Interaction", "ItemDropMode", ItemMode.All, "Whether to drop all items, only the current item, or no items upon squaring up");
allowItems = cfg.Bind<bool>("Item Interaction", "AllowItems", false, "Whether to allow items to be held while squared up");
networkConfig = new NetworkConfig();
}
}
public enum ItemMode
{
All,
Current,
None
}
[BepInPlugin("SlapitNow.LethalHands", "Lethal Hands", "22.1.5")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class LethalHandsPlugin : BaseUnityPlugin
{
private const string modGUID = "SlapitNow.LethalHands";
private const string modName = "Lethal Hands";
private const string modVersion = "22.1.5";
public static LethalHandsPlugin Instance;
private readonly Harmony harmony = new Harmony("SlapitNow.LethalHands");
public ManualLogSource manualLogSource;
public static LocalConfig MyConfig { get; internal set; }
public static PluginInfo PInfo { get; private set; }
private static void NetcodePatcher()
{
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
Type[] array = types;
foreach (Type type in array)
{
MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
MethodInfo[] array2 = methods;
foreach (MethodInfo methodInfo in array2)
{
object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
if (customAttributes.Length != 0)
{
methodInfo.Invoke(null, null);
}
}
}
}
private void Awake()
{
Instance = this;
PInfo = ((BaseUnityPlugin)this).Info;
manualLogSource = Logger.CreateLogSource("SlapitNow.LethalHands");
Assets.LoadAssetBundlesFromFolder("assetbundles");
MyConfig = new LocalConfig(((BaseUnityPlugin)this).Config);
harmony.PatchAll(typeof(LethalHandsPlugin));
harmony.PatchAll(typeof(NetworkingPatches));
harmony.PatchAll(typeof(PlayerControllerBPatch));
harmony.PatchAll(typeof(TerminalPatch));
harmony.PatchAll(typeof(StartMatchLeverPatch));
harmony.PatchAll(typeof(HudManagerPatch));
harmony.PatchAll(typeof(InteractTriggerPatch));
harmony.PatchAll(typeof(EnemyAIPatch));
harmony.PatchAll(typeof(StartOfRoundPatch));
harmony.PatchAll(typeof(VehicleControllerPatch));
Animation.instantiateAnimations();
NetcodePatcher();
manualLogSource.LogInfo((object)"Successfully caught these hands");
}
}
}
namespace LethalHands.Patches
{
[HarmonyPatch(typeof(HUDManager))]
internal class HudManagerPatch
{
[HarmonyPatch("CanPlayerScan")]
[HarmonyPostfix]
private static void CanPlayerScanPostfix(ref bool __result)
{
if ((Object)(object)LethalHands.Instance != (Object)null)
{
__result = __result && !LethalHands.Instance.isSquaredUp;
}
}
}
internal class EnemyAIPatch
{
[HarmonyPatch(typeof(EnemyAI), "HitEnemyOnLocalClient")]
[HarmonyPrefix]
private static bool PreHitEnemyOnLocalClient(EnemyAI __instance, int force, PlayerControllerB playerWhoHit, bool playHitSFX, int hitID)
{
if (force != -22)
{
return true;
}
__instance.HitEnemy(EnemyFloatHealth.Instance.DamageEnemy(__instance), playerWhoHit, playHitSFX, hitID);
__instance.HitEnemyServerRpc(force, (int)playerWhoHit.playerClientId, playHitSFX, hitID);
return false;
}
[HarmonyPatch(typeof(EnemyAI), "HitEnemyClientRpc")]
[HarmonyPrefix]
private static void PreHitEnemyClientRpc(EnemyAI __instance, ref int force, int playerWhoHit)
{
if (force == -22 && playerWhoHit != (int)GameNetworkManager.Instance.localPlayerController.playerClientId)
{
force = EnemyFloatHealth.Instance.DamageEnemy(__instance);
}
}
}
[HarmonyPatch(typeof(InteractTrigger))]
internal class InteractTriggerPatch
{
[HarmonyPatch("SetUsingLadderOnLocalClient")]
[HarmonyPrefix]
private static void PreSetUsingLadderOnLocalClient()
{
LethalHands.Instance.SquareDown(animate: false);
}
}
internal class NetworkingPatches
{
[CompilerGenerated]
private static class <>O
{
public static HandleNamedMessageDelegate <0>__OnRequestSync;
public static HandleNamedMessageDelegate <1>__OnReceiveSync;
}
private static GameObject networkPrefab;
[HarmonyPatch(typeof(GameNetworkManager), "Start")]
[HarmonyPostfix]
public static void Init()
{
if (!((Object)(object)networkPrefab != (Object)null))
{
networkPrefab = Assets.Load<GameObject>("lethalhandsnetworker.prefab");
networkPrefab.AddComponent<LethalHandsNetworker>();
NetworkManager.Singleton.AddNetworkPrefab(networkPrefab);
}
}
[HarmonyPatch(typeof(StartOfRound), "Awake")]
[HarmonyPostfix]
private static void SpawnLethalHandsNetworker()
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer)
{
GameObject val = Object.Instantiate<GameObject>(networkPrefab, Vector3.zero, Quaternion.identity);
val.GetComponent<NetworkObject>().Spawn(false);
}
}
[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
[HarmonyPostfix]
public static void InitializeLocalPlayer()
{
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Expected O, but got Unknown
//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_007d: Expected O, but got Unknown
if ((Object)(object)LethalHands.Instance == (Object)null)
{
LethalHands lethalHands = ((Component)GameNetworkManager.Instance.localPlayerController).gameObject.AddComponent<LethalHands>();
}
if (EnemyFloatHealth.Instance == null)
{
new EnemyFloatHealth();
}
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)"Player initialized, setting up config...");
if (SyncedInstance<NetworkConfig>.IsHost)
{
CustomMessagingManager messageManager = SyncedInstance<NetworkConfig>.MessageManager;
object obj = <>O.<0>__OnRequestSync;
if (obj == null)
{
HandleNamedMessageDelegate val = NetworkConfig.OnRequestSync;
<>O.<0>__OnRequestSync = val;
obj = (object)val;
}
messageManager.RegisterNamedMessageHandler("SlapitNow.LethalHands_OnRequestConfigSync", (HandleNamedMessageDelegate)obj);
SyncedInstance<NetworkConfig>.Synced = true;
return;
}
SyncedInstance<NetworkConfig>.Synced = false;
CustomMessagingManager messageManager2 = SyncedInstance<NetworkConfig>.MessageManager;
object obj2 = <>O.<1>__OnReceiveSync;
if (obj2 == null)
{
HandleNamedMessageDelegate val2 = NetworkConfig.OnReceiveSync;
<>O.<1>__OnReceiveSync = val2;
obj2 = (object)val2;
}
messageManager2.RegisterNamedMessageHandler("SlapitNow.LethalHands_OnReceiveConfigSync", (HandleNamedMessageDelegate)obj2);
NetworkConfig.RequestSync();
}
[HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")]
[HarmonyPostfix]
public static void PlayerLeave()
{
LethalHandsPlugin.Instance.manualLogSource.LogInfo((object)"Player disconnected, restoring config...");
LethalHands.Instance.Sleep();
SyncedInstance<NetworkConfig>.RevertSync();
EnemyFloatHealth.Instance = null;
}
}
[HarmonyPatch(typeof(PlayerControllerB))]
internal class PlayerControllerBPatch
{
[HarmonyPatch("GrabObject")]
[HarmonyPrefix]
private static void PreGrabObject()
{
if (!LethalHands.Instance.allowItems)
{
LethalHands.Instance.SquareDown(animate: false);
}
}
[HarmonyPatch("BeginGrabObject")]
[HarmonyPostfix]
private static void PostBeginGrabObject()
{
if (!LethalHands.Instance.allowItems && LethalHands.Instance.playerControllerInstance.isGrabbingObjectAnimation)
{
LethalHands.Instance.SquareDown(animate: false);
}
}
[HarmonyPatch("SwitchToItemSlot")]
[HarmonyPostfix]
private static void PostSwitchToItemSlot()
{
if (!LethalHands.Instance.allowItems && LethalHands.Instance.playerControllerInstance.isHoldingObject)
{
LethalHands.Instance.SquareDown(animate: false);
}
}
[HarmonyPatch("PerformEmote")]
[HarmonyPrefix]
private static void PrePerformEmote()
{
LethalHands.Instance.SquareDown(animate: false);
}
[HarmonyPatch("KillPlayer")]
[HarmonyPostfix]
private static void PostKillPlayer()
{
if (LethalHands.Instance.playerControllerInstance.isPlayerDead)
{
LethalHands.Instance.SquareDown(animate: false);
}
}
[HarmonyPatch("CancelSpecialTriggerAnimations")]
[HarmonyPrefix]
private static void PreCancelSpecialTriggerAnimations()
{
LethalHands.Instance?.SquareDown(animate: false);
}
[HarmonyPatch("LateUpdate")]
[HarmonyPostfix]
private static void PostLateUpdate()
{
if (!((Object)(object)LethalHands.Instance == (Object)null) && LethalHands.Instance.punchingHaltsStaminaRegen && LethalHands.Instance.freezeStaminaRegen)
{
LethalHands.Instance.playerControllerInstance.sprintMeter = Mathf.Clamp(LethalHands.Instance.playerControllerInstance.sprintMeter, 0f, LethalHands.Instance.recordedStamina);
LethalHands.Instance.playerControllerInstance.sprintMeterUI.fillAmount = LethalHands.Instance.playerControllerInstance.sprintMeter;
}
}
[HarmonyPatch("IHittable.Hit")]
[HarmonyPrefix]
private static bool PreHit(PlayerControllerB __instance, int force, Vector3 hitDirection, PlayerControllerB playerWhoHit)
{
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
if (force != -22)
{
return true;
}
if (!__instance.AllowPlayerDeath())
{
return false;
}
CentipedeAI[] array = Object.FindObjectsByType<CentipedeAI>((FindObjectsSortMode)0);
for (int i = 0; i < array.Length; i++)
{
if ((Object)(object)array[i].clingingToPlayer == (Object)(object)__instance)
{
return false;
}
}
if (Object.op_Implicit((Object)(object)__instance.inAnimationWithEnemy))
{
return false;
}
__instance.DamagePlayerFromOtherClientServerRpc(LethalHands.Instance.playerPunchDamage, hitDirection, (int)playerWhoHit.playerClientId);
return false;
}
}
[HarmonyPatch(typeof(StartMatchLever))]
internal class StartMatchLeverPatch
{
[HarmonyPatch("LeverAnimation")]
[HarmonyPrefix]
private static void PreLeverAnimation()
{
LethalHands.Instance.SquareDown(animate: false);
}
}
[HarmonyPatch(typeof(StartOfRound))]
internal class StartOfRoundPatch
{
[HarmonyPatch("StartGame")]
[HarmonyPostfix]
private static void PostStartGame()
{
EnemyFloatHealth.Instance.Reset();
}
}
[HarmonyPatch(typeof(Terminal))]
internal class TerminalPatch
{
[HarmonyPatch("BeginUsingTerminal")]
[HarmonyPrefix]
private static void PreBeginUsingTerminal()
{
LethalHands.Instance.SquareDown(animate: false);
}
}
[HarmonyPatch(typeof(VehicleController))]
internal class VehicleControllerPatch
{
[HarmonyPatch("TakeControlOfVehicle")]
[HarmonyPrefix]
private static void PreTakeControlOfVehicle()
{
LethalHands.Instance.SquareDown(animate: false);
}
[HarmonyPatch("SetPassengerInCar")]
[HarmonyPrefix]
private static void PreSetPassengerInCar(PlayerControllerB player)
{
if ((Object)(object)player == (Object)(object)GameNetworkManager.Instance.localPlayerController)
{
LethalHands.Instance.SquareDown(animate: false);
}
}
}
}
namespace LethalHands.NetcodePatcher
{
[AttributeUsage(AttributeTargets.Module)]
internal class NetcodePatchedAssemblyAttribute : Attribute
{
}
}