Files
zzz_REBIRTH__Utils/Harmony/Inactive/Harmony_MultiBlockManager.cs
2025-06-04 16:44:53 +09:30

61 lines
3.4 KiB
C#

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;
}
}
}