using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; 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("CheckpointWard")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("CheckpointWard")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("2cd44209-f1a3-4d96-bd15-469a91117d1a")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace MyBepInExPlugin; [HarmonyPatch(typeof(Bed), "IsMine")] public static class Bed_IsMine_Patch { private static void Postfix(Bed __instance, ref bool __result) { if (((Object)((Component)__instance).gameObject).name.Contains("CheckpointWard")) { __result = true; } } } [HarmonyPatch(typeof(Bed), "GetOwner")] public static class Bed_GetOwner_Patch { private static void Postfix(Bed __instance, ref long __result) { if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && __result == 0) { __result = 1L; } } } [HarmonyPatch(typeof(Bed), "Interact")] public static class Bed_Interact_Override { private static bool Prefix(Bed __instance, Humanoid human, bool repeat, bool alt, ref bool __result) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((Component)__instance).GetComponent() != (Object)null) { if (repeat) { __result = false; return false; } Player val = (Player)(object)((human is Player) ? human : null); if ((Object)(object)val == (Object)null) { __result = false; return false; } PlayerProfile playerProfile = Game.instance.GetPlayerProfile(); Vector3 spawnPoint = __instance.GetSpawnPoint(); Vector3 customSpawnPoint = playerProfile.GetCustomSpawnPoint(); if (Input.GetKey((KeyCode)304)) { if (Vector3.Distance(customSpawnPoint, spawnPoint) < 1f) { playerProfile.SetCustomSpawnPoint(Vector3.zero); ((Character)val).Message((MessageType)2, "Checkpoint cleared", 0, (Sprite)null); EffectList wardDeactivateEffect = Main.WardDeactivateEffect; if (wardDeactivateEffect != null) { wardDeactivateEffect.Create(((Component)__instance).transform.position, Quaternion.identity, (Transform)null, 1f, -1); } } else { ((Character)val).Message((MessageType)2, "This is not your active checkpoint", 0, (Sprite)null); } __result = true; return false; } if (Vector3.Distance(customSpawnPoint, spawnPoint) < 1f) { ((Character)val).Message((MessageType)2, "Checkpoint already active", 0, (Sprite)null); __result = true; return false; } playerProfile.SetCustomSpawnPoint(spawnPoint); ((Character)val).Message((MessageType)2, "Checkpoint set", 0, (Sprite)null); EffectList wardActivateEffect = Main.WardActivateEffect; if (wardActivateEffect != null) { wardActivateEffect.Create(((Component)__instance).transform.position, Quaternion.identity, (Transform)null, 1f, -1); } __result = true; return false; } return true; } } [HarmonyPatch(typeof(EnvMan), "CanSleep")] public static class EnvMan_CanSleep_Patch { private static void Postfix(ref bool __result) { if (CheckpointContext.IsCheckpointInteraction) { __result = true; } } } [HarmonyPatch(typeof(Bed), "GetHoverText")] public static class Bed_GetHoverText_Patch { private static bool Prefix(Bed __instance, ref string __result) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((Component)__instance).GetComponent() != (Object)null) { PlayerProfile playerProfile = Game.instance.GetPlayerProfile(); Vector3 customSpawnPoint = playerProfile.GetCustomSpawnPoint(); Vector3 spawnPoint = __instance.GetSpawnPoint(); if (Vector3.Distance(customSpawnPoint, spawnPoint) < 1f) { __result = "Checkpoint Ward (Current)\n[Shift+E] Clear Spawn Point"; } else { __result = "Checkpoint Ward\n[E] Set Spawn Point"; } return false; } return true; } } public class CheckpointWardInteract : MonoBehaviour { } public class CheckpointWardTag : MonoBehaviour { } public static class CheckpointContext { private static int _depth; public static bool IsCheckpointInteraction => _depth > 0; public static void Enter() { _depth++; } public static void Exit() { if (_depth > 0) { _depth--; } } } [BepInPlugin("com.example.checkpointward", "Checkpoint Ward", "1.0.0")] public class Main : BaseUnityPlugin { private const string pluginGUID = "com.example.checkpointward"; private const string pluginName = "Checkpoint Ward"; private const string pluginVersion = "1.0.0"; public static EffectList WardActivateEffect; public static EffectList WardDeactivateEffect; private readonly Harmony HarmonyInstance = new Harmony("com.example.checkpointward"); public static ManualLogSource logger = Logger.CreateLogSource("Checkpoint Ward"); private AssetBundle assetBundle; private void Awake() { logger.LogInfo((object)"CheckpointWard loaded"); HarmonyInstance.PatchAll(Assembly.GetExecutingAssembly()); PrefabManager.OnVanillaPrefabsAvailable += OnPrefabsReady; } private void OnPrefabsReady() { PrefabManager.OnVanillaPrefabsAvailable -= OnPrefabsReady; LoadAssetBundle(); GameObject prefab = PrefabManager.Instance.GetPrefab("guard_stone"); if ((Object)(object)prefab != (Object)null) { PrivateArea component = prefab.GetComponent(); WardActivateEffect = component.m_activateEffect; WardDeactivateEffect = component.m_deactivateEffect; logger.LogInfo((object)"Ward effects loaded"); } else { logger.LogError((object)"guard_stone prefab not found"); } } private void LoadAssetBundle() { string text = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "checkpointward"); assetBundle = AssetBundle.LoadFromFile(text); if ((Object)(object)assetBundle == (Object)null) { logger.LogError((object)"Failed to load AssetBundle"); return; } logger.LogInfo((object)"AssetBundle loaded"); RegisterPrefab(); } private void RegisterPrefab() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown GameObject val = assetBundle.LoadAsset("CheckpointWard"); if ((Object)(object)val == (Object)null) { logger.LogError((object)"Prefab not found in AssetBundle"); return; } val.AddComponent(); val.AddComponent(); logger.LogInfo((object)("Prefab loaded OK: " + ((Object)val).name)); CustomPrefab val2 = new CustomPrefab(val, true); PrefabManager.Instance.AddPrefab(val2); logger.LogInfo((object)"Prefab registered"); RegisterPiece(val); } private void RegisterPiece(GameObject prefab) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Expected O, but got Unknown PieceConfig val = new PieceConfig { Name = "Checkpoint Ward", Description = "Sets a multiplayer spawn point anywhere.", PieceTable = "Hammer", Category = PieceCategories.Misc, CraftingStation = "piece_stonecutter" }; val.Requirements = (RequirementConfig[])(object)new RequirementConfig[3] { new RequirementConfig("Stone", 5, 0, true), new RequirementConfig("GreydwarfEye", 5, 0, true), new RequirementConfig("Wisp", 1, 0, true) }; CustomPiece val2 = new CustomPiece(prefab, false, val); PieceManager.Instance.AddPiece(val2); logger.LogInfo((object)"Piece registered"); } }