using System;
using System.Collections;
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.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LobotomyMod.Patches;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("LobotomyMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Lobotomy Mod for Lethal Company")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("LobotomyMod")]
[assembly: AssemblyTitle("LobotomyMod")]
[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 LobotomyMod
{
[BepInPlugin("LobotomyMod", "LobotomyMod", "1.0.0")]
public class LobotomyMod : BaseUnityPlugin
{
private protected Harmony harmony = new Harmony("rudynakodach.LobotomyMod");
public static ManualLogSource LogSource { get; private set; }
private void Awake()
{
LogSource = Logger.CreateLogSource("rudynakodach.LobotomyMod");
harmony.PatchAll(typeof(LobotomyPatch));
harmony.PatchAll(typeof(StartOfRoundPatch));
LogSource.LogInfo((object)"Plugin LobotomyMod is loaded!");
}
}
public class LobotomyControllerB : MonoBehaviour
{
private PlayerControllerB playerController;
private RawImage rawImage;
private bool isLobotomyAttackActive = false;
private bool isUiReady = false;
public bool lobotomyControllerStarted = false;
public bool isActive = true;
public static LobotomyControllerB instance { get; private set; }
private void Awake()
{
playerController = GameNetworkManager.Instance.localPlayerController;
}
private void Update()
{
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Expected O, but got Unknown
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Expected O, but got Unknown
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Expected O, but got Unknown
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0151: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
if (!isUiReady)
{
if (!((Object)(object)GameNetworkManager.Instance == (Object)null) && !((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null) && !((Object)(object)GameNetworkManager.Instance.localPlayerController.gameplayCamera == (Object)null))
{
GameObject val = new GameObject("LobotomyModCanvas");
val = Object.Instantiate<GameObject>(val);
val.transform.parent = ((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).gameObject.transform;
Canvas val2 = val.AddComponent<Canvas>();
val2.renderMode = (RenderMode)0;
val2.sortingOrder = 100;
GameObject val3 = new GameObject("LobotomyModOverlay");
val3 = Object.Instantiate<GameObject>(val3);
val3.transform.parent = val.transform;
rawImage = val3.AddComponent<RawImage>();
((Graphic)rawImage).material = new Material(((Graphic)rawImage).material);
((Object)((Graphic)rawImage).material).name = "LobotomyModUIMaterial";
((Graphic)rawImage).raycastTarget = false;
((Graphic)rawImage).rectTransform.sizeDelta = new Vector2((float)Screen.width, (float)Screen.height);
((Graphic)rawImage).rectTransform.anchoredPosition = Vector2.zero;
((Graphic)rawImage).color = Color.white;
((Component)rawImage).gameObject.SetActive(false);
isUiReady = true;
instance = this;
LobotomyMod.LogSource.LogDebug((object)"Lobotomy UI ready!");
}
}
else if (isActive)
{
if (!((Object)(object)playerController == (Object)null))
{
if (playerController.criticallyInjured && !lobotomyControllerStarted)
{
LobotomyMod.LogSource.LogDebug((object)"Started invoking LobotomyContorller.");
((MonoBehaviour)this).InvokeRepeating("LobotomyController", 1f, 1f);
lobotomyControllerStarted = true;
}
else if ((!playerController.criticallyInjured || playerController.isPlayerDead) && lobotomyControllerStarted)
{
LobotomyMod.LogSource.LogDebug((object)"Stopped invoking LobotomyContorller.");
((MonoBehaviour)this).CancelInvoke("LobotomyController");
lobotomyControllerStarted = false;
}
}
}
else if (lobotomyControllerStarted)
{
((MonoBehaviour)this).CancelInvoke();
}
}
private IEnumerator fadeLobotomyOut(Action callback)
{
Color originalColor = ((Graphic)rawImage).color;
Color targetColor = new Color(originalColor.r, originalColor.g, originalColor.b, 0f);
float fadeOutTime = Random.Range(0.75f, 1.75f);
for (float elapsedTime = 0f; elapsedTime < fadeOutTime; elapsedTime += Time.deltaTime)
{
((Graphic)rawImage).color = Color.Lerp(originalColor, targetColor, elapsedTime / fadeOutTime);
yield return null;
}
((Graphic)rawImage).color = targetColor;
callback();
}
private IEnumerator recordFrame(Action<Texture2D> callback)
{
yield return (object)new WaitForEndOfFrame();
Texture2D texture = ScreenCapture.CaptureScreenshotAsTexture();
callback(texture);
}
private IEnumerator stopAttack()
{
yield return (object)new WaitForSeconds(Random.Range(0.35f, 0.75f));
((MonoBehaviour)this).StartCoroutine(fadeLobotomyOut(delegate
{
isLobotomyAttackActive = false;
((Component)rawImage).gameObject.SetActive(false);
}));
}
private IEnumerator startAttack(Texture2D texture)
{
yield return (object)new WaitForSeconds(Random.Range(0.35f, 0.75f));
((Graphic)rawImage).material.mainTexture = (Texture)(object)texture;
((Component)rawImage).gameObject.SetActive(true);
((MonoBehaviour)this).StartCoroutine(stopAttack());
}
private void LobotomyController()
{
if (!isLobotomyAttackActive && Random.Range(0f, 100f) < 5f)
{
((MonoBehaviour)this).StartCoroutine(recordFrame(delegate(Texture2D texture)
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
LobotomyMod.LogSource.LogInfo((object)"Starting a lobotomy attack...");
((Graphic)rawImage).color = new Color(0.85f, 0.85f, 0.85f, 0.85f);
isLobotomyAttackActive = true;
((MonoBehaviour)this).StartCoroutine(startAttack(texture));
}));
}
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "LobotomyMod";
public const string PLUGIN_NAME = "LobotomyMod";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace LobotomyMod.Patches
{
[HarmonyPatch(typeof(PlayerControllerB))]
internal class LobotomyPatch
{
[HarmonyPostfix]
[HarmonyPatch("Start")]
private static void patch(PlayerControllerB __instance)
{
if ((Object)(object)((Component)__instance).gameObject.GetComponent<LobotomyControllerB>() == (Object)null)
{
if (!((Component)__instance).gameObject.activeInHierarchy)
{
LobotomyMod.LogSource.LogDebug((object)("Player " + ((Object)((Component)__instance).gameObject).name + " isn't active in hierarchy - skipping the lobotomy controller."));
}
else
{
((MonoBehaviour)__instance).StartCoroutine(WaitForLocalPlayerControllerAndAddALobotomyControllerIfItIsTheLocalPlayer(__instance));
}
}
}
private static IEnumerator WaitForLocalPlayerControllerAndAddALobotomyControllerIfItIsTheLocalPlayer(PlayerControllerB other)
{
while ((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null)
{
yield return null;
}
if ((Object)(object)other == (Object)(object)GameNetworkManager.Instance.localPlayerController)
{
LobotomyMod.LogSource.LogDebug((object)("Ownership of player controller for " + ((Object)other).name + " confirmed!"));
((Component)other).gameObject.AddComponent<LobotomyControllerB>();
}
else
{
LobotomyMod.LogSource.LogDebug((object)("Ownership of player controller for " + ((Object)other).name + " failed."));
}
}
}
[HarmonyPatch(typeof(StartOfRound))]
internal class StartOfRoundPatch
{
[HarmonyPatch("EndOfGame")]
[HarmonyPrefix]
private static void EndOfGamePatch()
{
if ((Object)(object)LobotomyControllerB.instance != (Object)null)
{
LobotomyControllerB.instance.isActive = false;
}
}
[HarmonyPatch("StartGame")]
[HarmonyPrefix]
private static void StartOfGamePatch()
{
if ((Object)(object)LobotomyControllerB.instance != (Object)null)
{
LobotomyControllerB.instance.isActive = true;
}
}
}
}