61 lines
3.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|