namespace Harmony.MultiBlockManagerPatches { [HarmonyPatch(typeof(MultiBlockManager))] [HarmonyPatch("TryRegisterPOIMultiBlock")] public class TryRegisterPOIMultiBlockPatch { public static bool Prefix(MultiBlockManager __instance, ref bool __result, Vector3i parentWorldPos, BlockValue blockValue) { if (!__instance.CheckFeatures(MultiBlockManager.FeatureFlags.POIMBTracking)) return false; using (MultiBlockManager.s_MultiBlockManagerTryAddPOIMultiBlock.Auto()) { lock (__instance.lockObj) { MultiBlockManager.TrackedBlockData trackedBlockData1; if (__instance.trackedDataMap.CrossChunkMultiBlocks.TryGetValue(parentWorldPos, out trackedBlockData1)) { UnityEngine.Debug.LogError((object)(string.Format("[MultiBlockManager] Failed to register POI multiblock at {0} due to previously registered CrossChunk data.", (object)parentWorldPos) + string.Format("\nOld value: {0} ", (object)trackedBlockData1.rawData) + string.Format("\nNew value: {0}", (object)blockValue.rawData))); __result = false; return false; } MultiBlockManager.TrackedBlockData trackedBlockData2; if (__instance.trackedDataMap.PoiMultiBlocks.TryGetValue(parentWorldPos, out trackedBlockData2)) { UnityEngine.Debug.LogError((object)(string.Format("[MultiBlockManager] Duplicate multiblock placement at {0}. New value will not be applied.", (object)parentWorldPos) + string.Format("\nOld value: {0} ", (object)trackedBlockData2.rawData) + string.Format("\nNew value: {0}", (object)blockValue.rawData))); __result = false; return false; } if (blockValue.ischild) { UnityEngine.Debug.LogError((object)"[MultiBlockManager] TryAddPOIMultiBlock failed: target block is not a parent: " + blockValue.Block.blockName); __result = false; return false; } RectInt flatChunkBounds; if (!blockValue.Block.isMultiBlock) { flatChunkBounds = new RectInt((UnityEngine.Vector2Int)World.toChunkXZ(parentWorldPos), UnityEngine.Vector2Int.zero); } else { Vector3i minPos; Vector3i maxPos; MultiBlockManager.GetMinMaxWorldPositions(parentWorldPos, blockValue, out minPos, out maxPos); Vector2i chunkXz1 = World.toChunkXZ(minPos); Vector2i chunkXz2 = World.toChunkXZ(maxPos); flatChunkBounds = new RectInt((UnityEngine.Vector2Int)chunkXz1, (UnityEngine.Vector2Int)(chunkXz2 - chunkXz1)); } __instance.trackedDataMap.AddOrMergeTrackedData(parentWorldPos, blockValue.rawData, flatChunkBounds, MultiBlockManager.TrackingTypeFlags.PoiMultiBlock); __instance.isDirty = true; __instance.UpdateProfilerCounters(); __result = true; return false; } } return false; } } }