Decompiled source of ExpertStreamerImplementation v1.1.0

ExpertStreamerImplementation.dll

Decompiled 3 months ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using REPOLib.Modules;
using TMPro;
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("ExpertStreamerImplementation")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ExpertStreamerImplementation")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("d4e12834-6d5d-4d53-84b2-c9f76e27c7d0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace ExpertStreamerImplementation
{
	[HarmonyPatch(typeof(SemiFunc))]
	internal class SemiFuncPatch
	{
		[HarmonyPatch("EnemySpawn")]
		[HarmonyPrefix]
		private static bool SemiFunc_Prefix(ref bool __result)
		{
			if (ExpertStreamerImplementation.Instance.AboutToSpawn)
			{
				__result = true;
				ExpertStreamerImplementation.Instance.AboutToSpawn = false;
				return false;
			}
			return true;
		}
	}
	[BepInPlugin("ExpertRobi.StreamerImplementation", "ExpertStreamerImplementation", "1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ExpertStreamerImplementation : BaseUnityPlugin
	{
		private const string modGUID = "ExpertRobi.StreamerImplementation";

		private const string modName = "ExpertStreamerImplementation";

		private const string modVersion = "1.0";

		internal static ExpertStreamerImplementation Instance;

		public bool AboutToSpawn = false;

		private HttpListener httpListener;

		private const string url = "http://localhost:29016/";

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		private void Awake()
		{
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!");
			new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID).PatchAll();
			StartServer();
		}

		private void StartServer()
		{
			httpListener = new HttpListener();
			httpListener.Prefixes.Add("http://localhost:29016/");
			httpListener.Start();
			Task.Run(() => ListenForRequests());
			Logger.LogInfo((object)"API Server Online: Use this for your Events:  http://localhost:29016/");
		}

		private async Task ListenForRequests()
		{
			while (httpListener.IsListening)
			{
				HandleRequest(await httpListener.GetContextAsync());
			}
		}

		private void HandleRequest(HttpListenerContext context)
		{
			try
			{
				Logger.LogInfo((object)$"Request Received: {context.Request.Url}");
				string absolutePath = context.Request.Url.AbsolutePath;
				if (context.Request.HttpMethod != "GET")
				{
					SendResponse(context, 405, "USE GET METHOD FOR SPAWN.");
					return;
				}
				Dictionary<string, string> dictionary = new Dictionary<string, string>
				{
					{ "/donations/spawnDuck", "Duck" },
					{ "/donations/spawnValuableThrower", "Valuable Thrower" },
					{ "/donations/spawnHead", "Head" },
					{ "/donations/spawnSlowMouth", "Slow Mouth" },
					{ "/donations/spawnRunner", "Runner" },
					{ "/donations/spawnAnimal", "Animal" },
					{ "/donations/spawnRobe", "Robe" },
					{ "/donations/spawnFloater", "Floater" },
					{ "/donations/spawnThinMan", "Thin Man" },
					{ "/donations/spawnSlowWalker", "Slow Walker" },
					{ "/donations/spawnCeilingEye", "Ceiling Eye" },
					{ "/donations/spawnTumbler", "Tumbler" },
					{ "/donations/spawnBowtie", "Bowtie" },
					{ "/donations/spawnHunter", "Hunter" },
					{ "/donations/spawnBeamer", "Beamer" },
					{ "/donations/spawnUpscream", "Upscream" },
					{ "/donations/spawnHidden", "Hidden" }
				};
				if (dictionary.ContainsKey(absolutePath))
				{
					TriggerEnemySpawn(dictionary[absolutePath]);
					SendResponse(context, 200, "Spawn " + dictionary[absolutePath] + " Executed.");
				}
				else
				{
					SendResponse(context, 404, "Endpoint not valid or not Implemented.");
				}
			}
			catch
			{
				Logger.LogInfo((object)"Error!");
			}
		}

		private void SendResponse(HttpListenerContext context, int statusCode, string message)
		{
			byte[] bytes = Encoding.UTF8.GetBytes(message);
			context.Response.StatusCode = statusCode;
			context.Response.ContentLength64 = bytes.Length;
			context.Response.OutputStream.Write(bytes, 0, bytes.Length);
			context.Response.OutputStream.Close();
		}

		private void TriggerEnemySpawn(string enemyType)
		{
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			string text = "Enemies/Enemy - " + enemyType;
			GameObject val = null;
			foreach (EnemySetup registeredEnemy in Enemies.RegisteredEnemies)
			{
				foreach (GameObject spawnObject in registeredEnemy.spawnObjects)
				{
					if (((Object)spawnObject).name.Contains(enemyType))
					{
						val = spawnObject;
						break;
					}
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				val = Resources.Load<GameObject>(text);
			}
			if (!((Object)(object)val != (Object)null))
			{
				return;
			}
			EnemySetup val2 = ScriptableObject.CreateInstance<EnemySetup>();
			val2.spawnObjects = new List<GameObject> { val };
			LevelPoint val3 = null;
			float num = 500f;
			foreach (LevelPoint levelPathPoint in LevelGenerator.Instance.LevelPathPoints)
			{
				float num2 = Vector3.Distance(((Component)levelPathPoint).transform.position, ((Component)PlayerController.instance).transform.position);
				if (num2 < num)
				{
					val3 = levelPathPoint;
					num = num2;
				}
			}
			if ((Object)(object)val3 != (Object)null)
			{
				Instance.AboutToSpawn = true;
				RunManager.instance.EnemiesSpawnedRemoveStart();
				LevelGenerator.Instance.EnemySpawn(val2, ((Component)val3).transform.position);
				EnemyDirector.instance.DebugResult();
				Logger.LogInfo((object)(enemyType + " spawned"));
				RunManager.instance.EnemiesSpawnedRemoveEnd();
			}
		}

		private void OnApplicationQuit()
		{
			if (httpListener != null)
			{
				httpListener.Stop();
				httpListener.Close();
			}
			Logger.LogInfo((object)"Server API Stopped.");
		}
	}
}
namespace ExpertStreamerImplementation.Patches
{
	[HarmonyPatch(typeof(SpectateNameUI), "SetName")]
	internal class SpectateNameUIPatch
	{
		[HarmonyPrefix]
		public static void Prefix(SpectateNameUI __instance, ref string name)
		{
			if (name == "ExpertRobiTv")
			{
				name = "<color=purple>[STREAMER]</color> ExpertRobiTv";
			}
			((TMP_Text)__instance.Text).text = name;
		}
	}
}