The BepInEx console will not appear when launching like it does for other games on Thunderstore (you can turn it back on in your BepInEx.cfg file). If your PEAK crashes on startup, add -dx12 to your launch parameters.
Decompiled source of Hikers Hunger v1.0.0
Hikers Hunger.dll
Decompiled 3 weeks agousing 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 }; } }