using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using SpectateEnemies.Managers;
using SpectateEnemies.Patches;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("SpectateEnemies")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SpectateEnemies")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("510a54e9-60a5-4010-98a1-56bb2c2aee54")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SpectateEnemies
{
[BepInPlugin("DougHRito.SpectateEnemies", "Spectate Enemies", "1.0.0")]
public class SpectateEnemiesBase : BaseUnityPlugin
{
private const string modGUID = "DougHRito.SpectateEnemies";
private const string modName = "Spectate Enemies";
private const string modVersion = "1.0.0";
private readonly Harmony harmony = new Harmony("DougHRito.SpectateEnemies");
public ConfigEntry<string> _GnomeSpectateName;
public ConfigEntry<string> _ReaperSpectateName;
public ConfigEntry<string> _HuntsmanSpectateName;
public ConfigEntry<string> _ApexPredatorSpectateName;
public ConfigEntry<string> _AnimalSpectateName;
public ConfigEntry<string> _BangerSpectateName;
public ConfigEntry<string> _ClownSpectateName;
public ConfigEntry<string> _BowtieSpectateName;
public ConfigEntry<string> _PeeperSpectateName;
public ConfigEntry<string> _MentalistSpectateName;
public ConfigEntry<string> _HiddenSpectateName;
public ConfigEntry<string> _RobeSpectateName;
public ConfigEntry<string> _SpewerSpectateName;
public ConfigEntry<string> _TrudgeSpectateName;
public ConfigEntry<string> _ShadowChildSpectateName;
public ConfigEntry<string> _ChefSpectateName;
public ConfigEntry<string> _UpscreamSpectateName;
public ConfigEntry<string> _RugratSpectateName;
public ConfigEntry<string> _HeadmanSpectateName;
public ConfigEntry<float> _SpectateYSensitivity;
public ConfigEntry<float> _SpectateOrbitSensitivity;
public ConfigEntry<float> _SpectateZoomSensitivity;
public static SpectateEnemiesBase Instance;
internal ManualLogSource mls;
private void Awake()
{
//IL_0322: Unknown result type (might be due to invalid IL or missing references)
//IL_0331: Expected O, but got Unknown
//IL_032c: Unknown result type (might be due to invalid IL or missing references)
//IL_0336: Expected O, but got Unknown
//IL_0365: Unknown result type (might be due to invalid IL or missing references)
//IL_0374: Expected O, but got Unknown
//IL_036f: Unknown result type (might be due to invalid IL or missing references)
//IL_0379: Expected O, but got Unknown
//IL_03a8: Unknown result type (might be due to invalid IL or missing references)
//IL_03b7: Expected O, but got Unknown
//IL_03b2: Unknown result type (might be due to invalid IL or missing references)
//IL_03bc: Expected O, but got Unknown
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
mls = Logger.CreateLogSource("DougHRito.SpectateEnemies");
mls.LogInfo((object)"The Dougin has commenced");
_GnomeSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Gnome Spectate Name", "Gnome", "Sets the name for the Gnome in the top left corner of the screen while spectating them.");
_ReaperSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Reaper Spectate Name", "Reaper", "Sets the name for the Reaper in the top left corner of the screen while spectating them.");
_HuntsmanSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Huntsman Spectate Name", "Huntsman", "Sets the name for the Huntsman in the top left corner of the screen while spectating them.");
_ApexPredatorSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Apex Predator Spectate Name", "Apex Predator", "Sets the name for the Apex Predator in the top left corner of the screen while spectating them.");
_AnimalSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Animal Spectate Name", "Animal", "Sets the name for the Animal in the top left corner of the screen while spectating them.");
_BangerSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Banger Spectate Name", "Banger", "Sets the name for the Banger in the top left corner of the screen while spectating them.");
_ClownSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Clown Spectate Name", "Clown", "Sets the name for the Clown in the top left corner of the screen while spectating them.");
_BowtieSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Bowtie Spectate Name", "Bowtie", "Sets the name for the Bowtie in the top left corner of the screen while spectating them.");
_PeeperSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Peeper Spectate Name", "Peeper", "Sets the name for the Peeper in the top left corner of the screen while spectating them.");
_MentalistSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Mentalist Spectate Name", "Mentalist", "Sets the name for the Mentalist in the top left corner of the screen while spectating them.");
_HiddenSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Hidden Spectate Name", "Hidden", "Sets the name for the Hidden in the top left corner of the screen while spectating them.");
_RobeSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Robe Spectate Name", "Robe", "Sets the name for the Robe in the top left corner of the screen while spectating them.");
_SpewerSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Spewer Spectate Name", "Spewer", "Sets the name for the Spewer in the top left corner of the screen while spectating them.");
_TrudgeSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Trudge Spectate Name", "Trudge", "Sets the name for the Trudge in the top left corner of the screen while spectating them.");
_ShadowChildSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Shadow Child Spectate Name", "Shadow Child", "Sets the name for the Shadow Child in the top left corner of the screen while spectating them.");
_ChefSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Chef Spectate Name", "Chef", "Sets the name for the Chef in the top left corner of the screen while spectating them.");
_UpscreamSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Upscream Spectate Name", "Upscream", "Sets the name for the Upscream in the top left corner of the screen while spectating them.");
_RugratSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Rugrat Spectate Name", "Rugrat", "Sets the name for the Rugrat in the top left corner of the screen while spectating them.");
_HeadmanSpectateName = ((BaseUnityPlugin)this).Config.Bind<string>("Enemy Names", "Headman Spectate Name", "Headman", "Sets the name for the Headman in the top left corner of the screen while spectating them.");
_SpectateYSensitivity = ((BaseUnityPlugin)this).Config.Bind<float>("Spectate Sensitivity", "Y-Axis Sensitivity", 1f, new ConfigDescription("Sets the sensitivity of the camera's Y-Axis inputs (W for up, S for down)", (AcceptableValueBase)new AcceptableValueRange<float>(0.01f, 5f), Array.Empty<object>()));
_SpectateOrbitSensitivity = ((BaseUnityPlugin)this).Config.Bind<float>("Spectate Sensitivity", "Orbit Sensitivity", 1f, new ConfigDescription("Sets the sensitivity of the camera's rotation while orbiting the enemy (Controlled by mouse movement)", (AcceptableValueBase)new AcceptableValueRange<float>(0.01f, 5f), Array.Empty<object>()));
_SpectateZoomSensitivity = ((BaseUnityPlugin)this).Config.Bind<float>("Spectate Sensitivity", "Zoom Sensitivity", 1f, new ConfigDescription("Sets the sensitivity of the camera's zoom (Scroll Up/Down)", (AcceptableValueBase)new AcceptableValueRange<float>(0.01f, 5f), Array.Empty<object>()));
harmony.PatchAll(typeof(SpectateEnemiesBase));
harmony.PatchAll(typeof(EnemyParentPatch));
harmony.PatchAll(typeof(SpectateCameraPatch));
harmony.PatchAll(typeof(RunManagerPatch));
harmony.PatchAll(typeof(ChatManagerPatch));
}
}
}
namespace SpectateEnemies.Patches
{
[HarmonyPatch(typeof(SpectateCamera))]
internal class SpectateCameraPatch
{
[HarmonyPatch("LateUpdate")]
[HarmonyPostfix]
private static void tinyBoiPatch(ref Camera ___MainCamera, ref PlayerAvatar ___player, ref Transform ___normalTransformDistance)
{
//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: 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_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: 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_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
//IL_0189: Unknown result type (might be due to invalid IL or missing references)
//IL_019d: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
CameraManager.checkInputs();
if (CameraManager.checkSpectateEnemy())
{
try
{
Transform transform = ((Component)___MainCamera).transform;
transform.eulerAngles += new Vector3((0f - CameraManager.mouseY) * 1.2f, CameraManager.mouseX * 1.2f, 0f);
if (((Component)___MainCamera).transform.eulerAngles.x > 85f && ((Component)___MainCamera).transform.eulerAngles.x < 180f)
{
((Component)___MainCamera).transform.eulerAngles = new Vector3(85f, ((Component)___MainCamera).transform.eulerAngles.y, ((Component)___MainCamera).transform.eulerAngles.z);
}
if (((Component)___MainCamera).transform.eulerAngles.x < 275f && ((Component)___MainCamera).transform.eulerAngles.x > 180f)
{
((Component)___MainCamera).transform.eulerAngles = new Vector3(275f, ((Component)___MainCamera).transform.eulerAngles.y, ((Component)___MainCamera).transform.eulerAngles.z);
}
((Component)___MainCamera).transform.position = CameraManager.getEnemyTransform().position + new Vector3(0f, CameraManager.spectateY, 0f) - ((Component)___MainCamera).transform.forward * CameraManager.orbitRadius;
((Component)___MainCamera).transform.LookAt(CameraManager.getEnemyTransform().position + new Vector3(0f, CameraManager.spectateY, 0f));
return;
}
catch (Exception)
{
return;
}
}
try
{
SemiFunc.HUDSpectateSetName(SemiFunc.PlayerGetName(___player));
((Component)___MainCamera).transform.position = ___normalTransformDistance.position;
((Component)___MainCamera).transform.rotation = ___normalTransformDistance.rotation;
}
catch (Exception)
{
}
}
}
[HarmonyPatch(typeof(EnemyParent))]
internal class EnemyParentPatch
{
[HarmonyPostfix]
[HarmonyPatch(typeof(EnemyParent), "SpawnRPC")]
public static void EnemySpawned(ref Enemy ___Enemy)
{
while (GameDirector.instance.PlayerList.Count == 0)
{
}
CameraManager.addEnemyToList(___Enemy);
}
[HarmonyPostfix]
[HarmonyPatch(typeof(EnemyParent), "DespawnRPC")]
public static void EnemyDespawned(ref Enemy ___Enemy)
{
while (GameDirector.instance.PlayerList.Count == 0)
{
}
CameraManager.removeEnemyFromList(___Enemy);
}
}
[HarmonyPatch(typeof(RunManager))]
internal class RunManagerPatch
{
[HarmonyPatch("ChangeLevel")]
[HarmonyPrefix]
private static void wipeVariables()
{
CameraManager.cleanupVariable();
}
}
[HarmonyPatch(typeof(ChatManager))]
internal class ChatManagerPatch
{
[HarmonyPatch("Update")]
[HarmonyPostfix]
private static void toggleControls(ref ChatManager ___instance)
{
if (___instance.StateIsActive())
{
CameraManager.setChatBoxActive(isActive: true);
}
else
{
CameraManager.setChatBoxActive(isActive: false);
}
}
}
}
namespace SpectateEnemies.Managers
{
internal class CameraManager
{
public static List<Enemy> Enemies = new List<Enemy>();
public static int currentEnemyToSpectate = 0;
public static bool spectateEnemy = false;
public static float spectateSwitchDelay;
public static bool chatBoxActive;
public static float orbitRadius = 5f;
public static float spectateY;
public static float mouseX = 0f;
public static float mouseY = 0f;
public static void addEnemyToList(Enemy enemy)
{
bool flag = false;
for (int i = 0; i < Enemies.Count; i++)
{
if ((Object)(object)Enemies[i] == (Object)(object)enemy)
{
flag = true;
}
}
if (!flag)
{
Enemies.Add(enemy);
}
}
public static void setChatBoxActive(bool isActive)
{
chatBoxActive = isActive;
}
public static void cleanupVariable()
{
Enemies.Clear();
currentEnemyToSpectate = 0;
spectateEnemy = false;
spectateSwitchDelay = 0f;
chatBoxActive = false;
spectateY = 0f;
}
public static void removeEnemyFromList(Enemy enemy)
{
for (int i = 0; i < Enemies.Count; i++)
{
if ((Object)(object)Enemies[i] == (Object)(object)enemy)
{
if (currentEnemyToSpectate > i)
{
currentEnemyToSpectate--;
}
Enemies.RemoveAt(i);
}
}
}
public static Transform getEnemyTransform()
{
string text = ((Object)((Component)Enemies[currentEnemyToSpectate]).GetComponentInParent<EnemyParent>()).name;
switch (text)
{
case "Enemy - Gnome(Clone)":
text = SpectateEnemiesBase.Instance._GnomeSpectateName.Value;
break;
case "Enemy - Runner(Clone)":
text = SpectateEnemiesBase.Instance._ReaperSpectateName.Value;
break;
case "Enemy - Hunter(Clone)":
text = SpectateEnemiesBase.Instance._HuntsmanSpectateName.Value;
break;
case "Enemy - Duck(Clone)":
text = SpectateEnemiesBase.Instance._ApexPredatorSpectateName.Value;
break;
case "Enemy - Animal(Clone)":
text = SpectateEnemiesBase.Instance._AnimalSpectateName.Value;
break;
case "Enemy - Bang(Clone)":
text = SpectateEnemiesBase.Instance._BangerSpectateName.Value;
break;
case "Enemy - Beamer(Clone)":
text = SpectateEnemiesBase.Instance._ClownSpectateName.Value;
break;
case "Enemy - Bowtie(Clone)":
text = SpectateEnemiesBase.Instance._BowtieSpectateName.Value;
break;
case "Enemy - Ceiling Eye(Clone)":
text = SpectateEnemiesBase.Instance._PeeperSpectateName.Value;
break;
case "Enemy - Floater(Clone)":
text = SpectateEnemiesBase.Instance._MentalistSpectateName.Value;
break;
case "Enemy - Hidden(Clone)":
text = SpectateEnemiesBase.Instance._HiddenSpectateName.Value;
break;
case "Enemy - Robe(Clone)":
text = SpectateEnemiesBase.Instance._RobeSpectateName.Value;
break;
case "Enemy - Slow Mouth(Clone)":
text = SpectateEnemiesBase.Instance._SpewerSpectateName.Value;
break;
case "Enemy - Slow Walker(Clone)":
text = SpectateEnemiesBase.Instance._TrudgeSpectateName.Value;
break;
case "Enemy - Thin Man(Clone)":
text = SpectateEnemiesBase.Instance._ShadowChildSpectateName.Value;
break;
case "Enemy - Tumbler(Clone)":
text = SpectateEnemiesBase.Instance._ChefSpectateName.Value;
break;
case "Enemy - Upscream(Clone)":
text = SpectateEnemiesBase.Instance._UpscreamSpectateName.Value;
break;
case "Enemy - Valuable Thrower(Clone)":
text = SpectateEnemiesBase.Instance._RugratSpectateName.Value;
break;
case "Enemy - Head(Clone)":
text = SpectateEnemiesBase.Instance._HeadmanSpectateName.Value;
break;
}
SemiFunc.HUDSpectateSetName(text);
return ((Component)Enemies[currentEnemyToSpectate]).transform;
}
public static bool checkSpectateEnemy()
{
return spectateEnemy;
}
public static void checkInputs()
{
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
if (spectateSwitchDelay > 0f)
{
spectateSwitchDelay -= Time.deltaTime;
}
mouseX = Input.GetAxis("Mouse X") * SpectateEnemiesBase.Instance._SpectateOrbitSensitivity.Value;
mouseY = Input.GetAxis("Mouse Y") * SpectateEnemiesBase.Instance._SpectateOrbitSensitivity.Value;
orbitRadius -= Input.mouseScrollDelta.y / (7.5f / SpectateEnemiesBase.Instance._SpectateZoomSensitivity.Value);
orbitRadius = Mathf.Clamp(orbitRadius, 2f, 5f);
if (!chatBoxActive)
{
if (Input.GetKeyDown((KeyCode)114))
{
if (Enemies.Count > 0 && !spectateEnemy && spectateSwitchDelay <= 0f)
{
spectateEnemy = true;
spectateSwitchDelay = 0.1f;
}
else if (spectateEnemy && spectateSwitchDelay <= 0f)
{
spectateEnemy = false;
spectateSwitchDelay = 0.1f;
}
if (Enemies.Count > 0)
{
CameraGlitch.Instance.PlayTiny();
}
}
if (Input.GetKeyDown((KeyCode)101) && spectateSwitchDelay <= 0f && spectateEnemy)
{
currentEnemyToSpectate++;
if (Enemies.Count <= currentEnemyToSpectate)
{
currentEnemyToSpectate = 0;
}
spectateSwitchDelay = 0.1f;
if (Enemies.Count > 1)
{
CameraGlitch.Instance.PlayTiny();
}
}
if (Input.GetKeyDown((KeyCode)113) && spectateSwitchDelay <= 0f && spectateEnemy)
{
currentEnemyToSpectate--;
if (currentEnemyToSpectate < 0)
{
currentEnemyToSpectate = Enemies.Count - 1;
}
spectateSwitchDelay = 0.1f;
if (Enemies.Count > 1)
{
CameraGlitch.Instance.PlayTiny();
}
}
if (Input.GetKey((KeyCode)119) && spectateEnemy)
{
spectateY += Time.deltaTime * SpectateEnemiesBase.Instance._SpectateYSensitivity.Value;
spectateY = Mathf.Clamp(spectateY, -1f, 3f);
}
if (Input.GetKey((KeyCode)115) && spectateEnemy)
{
spectateY -= Time.deltaTime * SpectateEnemiesBase.Instance._SpectateYSensitivity.Value;
spectateY = Mathf.Clamp(spectateY, -1f, 3f);
}
}
if (Enemies.Count <= 0)
{
spectateEnemy = false;
}
}
}
}