Decompiled source of Hikers Hunger v1.0.0

Hikers Hunger.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
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.Logging;
using HarmonyLib;
using Photon.Pun;
using Photon.Realtime;
using PhotonCustomPropsUtils;
using UnityEngine;
using UnityEngine.SceneManagement;
using Zorro.Core;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Secret Cannibal")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Secret Cannibal")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("99b406ad-6d25-4637-9908-9ab308ceb06e")]
[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")]
namespace HikersHunger;

[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("tony4twentys.Hikers_Hunger", "Hikers Hunger", "1.0.0")]
public class HikersHungerPlugin : BaseUnityPlugin
{
	[HarmonyPatch(typeof(Action_RestoreHunger), "RunAction")]
	public class RestoreHungerPatch
	{
		private static bool Prefix(Action_RestoreHunger __instance)
		{
			Debug.LogError((object)((Object)((Component)__instance).gameObject).name);
			if ((Object)(object)((Component)__instance).GetComponent<Character>() != (Object)null)
			{
				Debug.LogError((object)"We are eating a person");
				if (Instance.cannibalViewID == ((MonoBehaviourPun)Character.localCharacter).photonView.ViewID)
				{
					return true;
				}
			}
			else
			{
				Debug.LogError((object)"We are not eating a person");
				if (Instance.cannibalViewID == ((MonoBehaviourPun)Character.localCharacter).photonView.ViewID)
				{
					return false;
				}
			}
			return true;
		}
	}

	[HarmonyPatch(typeof(RunManager), "StartRun")]
	public class StartRunPatch
	{
		private static void Postfix()
		{
			if (!((Object)(object)Singleton<MapHandler>.Instance == (Object)null))
			{
				((BaseUnityPlugin)Instance).Logger.LogInfo((object)"[HikersHunger] RUN STARTED!");
				((MonoBehaviour)Instance).StartCoroutine(Instance.SelectCannibalAfterDelay());
			}
		}
	}

	[HarmonyPatch(typeof(Campfire), "Light_Rpc")]
	public class CampfireLight_RpcPatch
	{
		private static void Postfix(Campfire __instance)
		{
			Instance.fireCount++;
			((BaseUnityPlugin)Instance).Logger.LogInfo((object)$"[HikersHunger] Campfire lit! Total fires: {Instance.fireCount}");
			foreach (Character allCharacter in Character.AllCharacters)
			{
				if (!allCharacter.isBot && !allCharacter.data.dead && (Object)(object)allCharacter.refs?.customization != (Object)null && allCharacter.IsLocal)
				{
					allCharacter.refs.customization.BecomeHuman();
					float currentStatus = allCharacter.refs.afflictions.GetCurrentStatus((STATUSTYPE)5);
					allCharacter.refs.afflictions.SetStatus((STATUSTYPE)5, 0f);
					float currentStatus2 = allCharacter.refs.afflictions.GetCurrentStatus((STATUSTYPE)5);
					((BaseUnityPlugin)Instance).Logger.LogInfo((object)$"[HikersHunger] Cleared Curse from {((Object)((Component)allCharacter).gameObject).name}. Before: {currentStatus}, After: {currentStatus2}");
				}
			}
			((BaseUnityPlugin)Instance).Logger.LogInfo((object)"[HikersHunger] All players restored to human appearance and cleared of curse.");
			Instance.cannibalViewID = -1;
			UIPlayerNames.CANNIBAL_HUNGER_THRESHOLD = 2f;
			((MonoBehaviour)Instance).StartCoroutine(Instance.SelectCannibalAfterDelay());
		}
	}

	[CompilerGenerated]
	private sealed class <SelectCannibalAfterDelay>d__10 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public HikersHungerPlugin <>4__this;

		private float <delay>5__1;

		private float <elapsed>5__2;

		private List<Character> <validCandidates>5__3;

		private List<Character>.Enumerator <>s__4;

		private Character <character>5__5;

		private int <index>5__6;

		private Character <cannibal>5__7;

		private int <viewID>5__8;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <SelectCannibalAfterDelay>d__10(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<validCandidates>5__3 = null;
			<>s__4 = default(List<Character>.Enumerator);
			<character>5__5 = null;
			<cannibal>5__7 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<delay>5__1 = 120f;
				<elapsed>5__2 = 0f;
				((BaseUnityPlugin)<>4__this).Logger.LogInfo((object)"[HikersHunger] Waiting 2 minutes before selecting a cannibal...");
				break;
			case 1:
				<>1__state = -1;
				<elapsed>5__2 += Time.deltaTime;
				break;
			}
			if (<elapsed>5__2 < <delay>5__1)
			{
				<>2__current = null;
				<>1__state = 1;
				return true;
			}
			if (!PhotonNetwork.IsMasterClient)
			{
				return false;
			}
			<validCandidates>5__3 = new List<Character>();
			<>s__4 = Character.AllCharacters.GetEnumerator();
			try
			{
				while (<>s__4.MoveNext())
				{
					<character>5__5 = <>s__4.Current;
					if (!<character>5__5.isBot && !<character>5__5.data.dead)
					{
						<validCandidates>5__3.Add(<character>5__5);
					}
					<character>5__5 = null;
				}
			}
			finally
			{
				((IDisposable)<>s__4).Dispose();
			}
			<>s__4 = default(List<Character>.Enumerator);
			if (<validCandidates>5__3.Count > 0)
			{
				<index>5__6 = Random.Range(0, <validCandidates>5__3.Count);
				<cannibal>5__7 = <validCandidates>5__3[<index>5__6];
				<viewID>5__8 = <cannibal>5__7.refs.view.ViewID;
				<>4__this.cannibalViewID = <viewID>5__8;
				ManualLogSource logger = ((BaseUnityPlugin)<>4__this).Logger;
				Player owner = <cannibal>5__7.refs.view.Owner;
				logger.LogInfo((object)string.Format("[HikersHunger] Cannibal selected: {0} (ViewID: {1})", ((owner != null) ? owner.NickName : null) ?? "Unknown", <viewID>5__8));
				<>4__this.manager.SetRoomProperty("cannibalViewId", (object)<viewID>5__8);
				<cannibal>5__7 = null;
			}
			else
			{
				((BaseUnityPlugin)<>4__this).Logger.LogWarning((object)"[HikersHunger] No valid players found to become the cannibal.");
			}
			return false;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	public static HikersHungerPlugin Instance;

	private int cannibalViewID = -1;

	private int fireCount = 0;

	private PhotonScopedManager manager;

	private void Awake()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		Instance = this;
		Harmony val = new Harmony("tony4twentys.Hikers_Hunger");
		val.PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"HikersHunger loaded and StartRun patch applied.");
		manager = PhotonCustomPropsUtilsPlugin.GetManager("tony4twentys.Hikers_Hunger");
		manager.RegisterRoomProperty<int>("cannibalViewId", (RoomEventType)2, (Action<int>)delegate(int value)
		{
			cannibalViewID = value;
			Character localCharacter = Character.localCharacter;
			if ((Object)(object)localCharacter != (Object)null && (Object)(object)localCharacter.refs?.view != (Object)null && localCharacter.refs.view.ViewID == cannibalViewID)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"[HikersHunger] Local player is now the cannibal. Forcing low threshold.");
				UIPlayerNames.CANNIBAL_HUNGER_THRESHOLD = -1f;
			}
			else
			{
				UIPlayerNames.CANNIBAL_HUNGER_THRESHOLD = 2f;
			}
		});
		SceneManager.activeSceneChanged += OnSceneChanged;
		UIPlayerNames.CANNIBAL_HUNGER_THRESHOLD = 2f;
		((BaseUnityPlugin)this).Logger.LogInfo((object)"[HikersHunger] Hunger threshold for cannibal vision set to 2.0 to block natural cannibalism.");
	}

	private void OnSceneChanged(Scene oldScene, Scene newScene)
	{
		if (!(((Scene)(ref newScene)).name == "Airport"))
		{
			return;
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)"[HikersHunger] Returned to Airport. Resetting state.");
		cannibalViewID = -1;
		fireCount = 0;
		UIPlayerNames.CANNIBAL_HUNGER_THRESHOLD = 2f;
		foreach (Character allCharacter in Character.AllCharacters)
		{
			if ((Object)(object)allCharacter != (Object)null && (Object)(object)allCharacter.refs?.customization != (Object)null && (Object)(object)allCharacter.refs.afflictions != (Object)null)
			{
				allCharacter.refs.customization.BecomeHuman();
				allCharacter.refs.afflictions.SetStatus((STATUSTYPE)5, 0f);
			}
		}
	}

	private void OnDestroy()
	{
		SceneManager.activeSceneChanged -= OnSceneChanged;
		PhotonNetwork.RemoveCallbackTarget((object)this);
	}

	[IteratorStateMachine(typeof(<SelectCannibalAfterDelay>d__10))]
	private IEnumerator SelectCannibalAfterDelay()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <SelectCannibalAfterDelay>d__10(0)
		{
			<>4__this = this
		};
	}
}