using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using LCLobotomyFireInTheHole.Patches;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("LCLobotomyFireInTheHole")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LCLobotomyFireInTheHole")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("6ba09646-f0eb-4a47-beb4-bc6e8f09c497")]
[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")]
public static class DictionaryExtensions
{
public static bool HasNullKeys<TKey, TValue>(this Dictionary<TKey, TValue> dictionary) where TKey : Object
{
foreach (TKey key in dictionary.Keys)
{
if ((Object)(object)key == (Object)null)
{
return true;
}
}
return false;
}
public static void RemoveNullKeys<TKey, TValue>(this Dictionary<TKey, TValue> dictionary) where TKey : Object
{
if (!dictionary.HasNullKeys())
{
return;
}
TKey[] array = dictionary.Keys.ToArray();
foreach (TKey val in array)
{
if ((Object)(object)val == (Object)null)
{
dictionary.Remove(val);
}
}
}
}
namespace LCLobotomyFireInTheHole
{
[BepInPlugin("z33r0x.lclobotomy", "Lethal Company Lobotomy", "1.0.0.0")]
public class LobotomyModBase : BaseUnityPlugin
{
private const string modGUID = "z33r0x.lclobotomy";
private const string modName = "Lethal Company Lobotomy";
private const string modVersion = "1.0.0.0";
private readonly Harmony harmony = new Harmony("z33r0x.lclobotomy");
private static LobotomyModBase Instance;
internal static AudioClip[] demonSFX;
internal static AudioClip normalSFX;
internal static ManualLogSource mls;
internal static Dictionary<GameObject, long> lastNormalSFX = new Dictionary<GameObject, long>();
internal static Dictionary<GameObject, int> nextDelays = new Dictionary<GameObject, int>();
internal static Texture2D normalTexture;
internal static Texture2D demonTexture;
internal static Sprite normalSprite;
internal static Sprite demonSprite;
internal static GameObject billboardPrefab;
internal static Dictionary<AudioSource, GameObject> currentObjects = new Dictionary<AudioSource, GameObject>();
private const string dllName = "LCLobotomyFireInTheHole.dll";
private void Awake()
{
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
mls = Logger.CreateLogSource("z33r0x.lclobotomy");
mls.LogInfo((object)"Lethal Company Lobotomy has awaken");
string text = ((BaseUnityPlugin)Instance).Info.Location.TrimEnd("LCLobotomyFireInTheHole.dll".ToCharArray());
AssetBundle val = AssetBundle.LoadFromFile(text + "fireinthehole");
AssetBundle val2 = AssetBundle.LoadFromFile(text + "highpitchfireinthehole");
AssetBundle val3 = AssetBundle.LoadFromFile(text + "normalface");
AssetBundle val4 = AssetBundle.LoadFromFile(text + "demonface");
AssetBundle val5 = AssetBundle.LoadFromFile(text + "billboardbundle");
if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
{
mls.LogError((object)"failed to load assets!");
return;
}
demonSFX = val.LoadAllAssets<AudioClip>();
normalSFX = val2.LoadAllAssets<AudioClip>()[0];
normalTexture = val3.LoadAllAssets<Texture2D>()[0];
demonTexture = val4.LoadAllAssets<Texture2D>()[0];
billboardPrefab = val5.LoadAllAssets<GameObject>()[0];
demonSprite = Sprite.Create(demonTexture, new Rect(0f, 0f, (float)((Texture)demonTexture).width, (float)((Texture)demonTexture).height), new Vector2(0.5f, 0.5f), 100f);
normalSprite = Sprite.Create(normalTexture, new Rect(0f, 0f, (float)((Texture)normalTexture).width, (float)((Texture)normalTexture).height), new Vector2(0.5f, 0.5f), 100f);
mls.LogInfo((object)normalSFX);
harmony.PatchAll(typeof(CrawlerAIPatch));
mls.LogInfo((object)"Loaded Lobotomy mod!");
}
}
}
namespace LCLobotomyFireInTheHole.Patches
{
[HarmonyPatch(typeof(CrawlerAI))]
internal class CrawlerAIPatch
{
[HarmonyPatch("MakeScreech")]
[HarmonyPrefix]
private static void MakeScreechPatch(ref AudioClip[] ___longRoarSFX)
{
AudioClip[] demonSFX = LobotomyModBase.demonSFX;
___longRoarSFX = demonSFX;
LobotomyModBase.mls.LogInfo((object)"Replaced longRoarSFX");
}
[HarmonyPatch("HitPlayerClientRpc")]
[HarmonyPrefix]
private static void HitPlayerPatch(ref AudioClip ___bitePlayerSFX)
{
AudioClip val = LobotomyModBase.demonSFX[0];
___bitePlayerSFX = val;
LobotomyModBase.mls.LogInfo((object)"Replaced bitePlayerSFX");
}
[HarmonyPatch("Update")]
[HarmonyPostfix]
private static void UpdatePatch(ref bool ___hasEnteredChaseMode, ref AudioSource ___creatureVoice, CrawlerAI __instance)
{
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Expected O, but got Unknown
//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)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_0199: Unknown result type (might be due to invalid IL or missing references)
if (!LobotomyModBase.lastNormalSFX.ContainsKey(((Component)___creatureVoice).gameObject))
{
LobotomyModBase.lastNormalSFX.Add(((Component)___creatureVoice).gameObject, 0L);
}
if (!LobotomyModBase.nextDelays.ContainsKey(((Component)___creatureVoice).gameObject))
{
LobotomyModBase.nextDelays.Add(((Component)___creatureVoice).gameObject, Random.Range(1, 4));
}
Transform transform = ((Component)__instance).transform;
GameObject gameObject = ((Component)transform).gameObject;
bool flag = false;
foreach (Transform item in transform)
{
Transform val = item;
if (((Object)val).name == "billboard")
{
flag = true;
Vector3 forward = ((Component)StartOfRound.Instance.activeCamera).gameObject.transform.forward;
val.forward = forward;
SpriteRenderer component = ((Component)val).GetComponent<SpriteRenderer>();
if (___hasEnteredChaseMode && (Object)(object)component.sprite != (Object)(object)LobotomyModBase.demonSprite)
{
component.sprite = LobotomyModBase.demonSprite;
}
else if (!___hasEnteredChaseMode && (Object)(object)component.sprite != (Object)(object)LobotomyModBase.normalSprite)
{
component.sprite = LobotomyModBase.normalSprite;
}
break;
}
}
if (!flag)
{
SkinnedMeshRenderer[] componentsInChildren = gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
for (int i = 0; i < componentsInChildren.Length; i++)
{
((Renderer)componentsInChildren[i]).enabled = false;
LobotomyModBase.mls.LogInfo((object)"disabled meshrenderer");
}
GameObject obj = Object.Instantiate<GameObject>(LobotomyModBase.billboardPrefab);
((Object)obj).name = "billboard";
obj.transform.SetParent(transform, false);
obj.transform.localPosition = new Vector3(0f, 1f, 0f);
}
LobotomyModBase.nextDelays.RemoveNullKeys<GameObject, int>();
LobotomyModBase.lastNormalSFX.RemoveNullKeys<GameObject, long>();
long num = LobotomyModBase.lastNormalSFX[((Component)___creatureVoice).gameObject];
long num2 = DateTimeOffset.Now.ToUnixTimeSeconds();
if (num2 - num > LobotomyModBase.nextDelays[((Component)___creatureVoice).gameObject])
{
LobotomyModBase.nextDelays[((Component)___creatureVoice).gameObject] = Random.Range(1, 4);
LobotomyModBase.lastNormalSFX[((Component)___creatureVoice).gameObject] = num2;
if (___hasEnteredChaseMode)
{
___creatureVoice.PlayOneShot(LobotomyModBase.demonSFX[0]);
LobotomyModBase.mls.LogInfo((object)"Played Demon SFX");
}
else
{
___creatureVoice.PlayOneShot(LobotomyModBase.normalSFX);
LobotomyModBase.mls.LogInfo((object)"Played Normal SFX");
}
}
}
}
}