From 4d2c1ba3fcdda2144d08273950d563d725f7c212 Mon Sep 17 00:00:00 2001 From: Guillaume Mercier <10gui-gui10@live.ca> Date: Mon, 19 Jan 2026 11:52:40 -0500 Subject: [PATCH] Add support for multiple mods remapping the same item/block/tile entity. --- .../postea/api/BlockReplacementManager.java | 19 ++++++++----------- .../api/ItemStackReplacementManager.java | 10 ++++++---- .../api/TileEntityReplacementManager.java | 10 ++++++---- .../postea/utility/ChunkFixerUtility.java | 17 ++++++++--------- .../postea/utility/ItemFixerUtility.java | 8 +++----- 5 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/gtnewhorizons/postea/api/BlockReplacementManager.java b/src/main/java/com/gtnewhorizons/postea/api/BlockReplacementManager.java index 44259dd..21ec216 100644 --- a/src/main/java/com/gtnewhorizons/postea/api/BlockReplacementManager.java +++ b/src/main/java/com/gtnewhorizons/postea/api/BlockReplacementManager.java @@ -1,18 +1,18 @@ package com.gtnewhorizons.postea.api; -import java.util.HashMap; -import java.util.Map; import java.util.function.BiFunction; import net.minecraft.world.World; +import com.google.common.collect.LinkedListMultimap; import com.gtnewhorizons.postea.utility.BlockConversionInfo; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; public class BlockReplacementManager { - public static final Map> blockReplacementMap = new HashMap<>(); + public static final LinkedListMultimap> blockReplacementMap = LinkedListMultimap + .create(); public static final IntOpenHashSet posteaMarkedIDs = new IntOpenHashSet(); @SuppressWarnings("unused") @@ -22,15 +22,12 @@ public class BlockReplacementManager { } public static BlockConversionInfo getBlockReplacement(BlockConversionInfo blockConversionInfo, World world) { - - BiFunction transformer = blockReplacementMap - .getOrDefault(blockConversionInfo.blockName, null); - - if (transformer == null) { - return null; - } else { - return transformer.apply(blockConversionInfo, world); + for (BiFunction transformer : blockReplacementMap + .get(blockConversionInfo.blockName)) { + BlockConversionInfo result = transformer.apply(blockConversionInfo, world); + if (result != null) return result; } + return null; } // We need this to save reprocessing blocks. diff --git a/src/main/java/com/gtnewhorizons/postea/api/ItemStackReplacementManager.java b/src/main/java/com/gtnewhorizons/postea/api/ItemStackReplacementManager.java index bdcc674..6f207c4 100644 --- a/src/main/java/com/gtnewhorizons/postea/api/ItemStackReplacementManager.java +++ b/src/main/java/com/gtnewhorizons/postea/api/ItemStackReplacementManager.java @@ -1,14 +1,16 @@ package com.gtnewhorizons.postea.api; -import java.util.HashMap; -import java.util.Map; +import java.util.Collection; import java.util.function.Function; import net.minecraft.nbt.NBTTagCompound; +import com.google.common.collect.LinkedListMultimap; + public class ItemStackReplacementManager { - private static final Map> replacementMap = new HashMap<>(); + private static final LinkedListMultimap> replacementMap = LinkedListMultimap + .create(); // Public API for converting ItemStacks. @@ -18,7 +20,7 @@ public class ItemStackReplacementManager { } @SuppressWarnings("unused") - public static Function getItemReplacement(String itemNameInternal) { + public static Collection> getItemReplacement(String itemNameInternal) { return replacementMap.get(itemNameInternal); } } diff --git a/src/main/java/com/gtnewhorizons/postea/api/TileEntityReplacementManager.java b/src/main/java/com/gtnewhorizons/postea/api/TileEntityReplacementManager.java index eb5e171..845596c 100644 --- a/src/main/java/com/gtnewhorizons/postea/api/TileEntityReplacementManager.java +++ b/src/main/java/com/gtnewhorizons/postea/api/TileEntityReplacementManager.java @@ -1,18 +1,20 @@ package com.gtnewhorizons.postea.api; -import java.util.HashMap; +import java.util.Collection; import java.util.function.BiFunction; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; +import com.google.common.collect.LinkedListMultimap; import com.gtnewhorizons.postea.utility.BlockInfo; @SuppressWarnings("unused") public class TileEntityReplacementManager { - private static final HashMap> tileEntityToNormalBlockTransformer = new HashMap<>(); + private static final LinkedListMultimap> tileEntityToNormalBlockTransformer = LinkedListMultimap + .create(); /** * @deprecated Superseded by {@link #tileEntityTransformer(String, TriFunction)}. @@ -38,8 +40,8 @@ public class TileEntityReplacementManager { tileEntityToNormalBlockTransformer.put(tileEntityId, transformerFunction); } - public static TriFunction getTileEntityToNormalBlockTransformerFunction( + public static Collection> getTileEntityToNormalBlockTransformerFunction( String tileEntityId) { - return tileEntityToNormalBlockTransformer.getOrDefault(tileEntityId, null); + return tileEntityToNormalBlockTransformer.get(tileEntityId); } } diff --git a/src/main/java/com/gtnewhorizons/postea/utility/ChunkFixerUtility.java b/src/main/java/com/gtnewhorizons/postea/utility/ChunkFixerUtility.java index d7ecc49..8f56fde 100644 --- a/src/main/java/com/gtnewhorizons/postea/utility/ChunkFixerUtility.java +++ b/src/main/java/com/gtnewhorizons/postea/utility/ChunkFixerUtility.java @@ -128,27 +128,26 @@ public class ChunkFixerUtility { String tileEntityId = tileEntity.getString("id"); // Check if we have a transformer registered for this tile entity ID - TriFunction transformationFunction = TileEntityReplacementManager - .getTileEntityToNormalBlockTransformerFunction(tileEntityId); + boolean found = false; + for (TriFunction transformationFunction : TileEntityReplacementManager + .getTileEntityToNormalBlockTransformerFunction(tileEntityId)) { - if (transformationFunction != null) { int x = tileEntity.getInteger("x"); int y = tileEntity.getInteger("y"); int z = tileEntity.getInteger("z"); BlockInfo blockInfo = transformationFunction.apply(tileEntity, world, chunk); - if (blockInfo == null) { - // Do nothing. - tileEntitiesCopy.appendTag(tileEntity); - continue; - } + if (blockInfo == null) continue; if (blockInfo.tileTransformer != null) { tileEntitiesCopy.appendTag(blockInfo.tileTransformer.apply(tileEntity)); } // Otherwise they are removed, therefore not appended. conversionInfo.add(new ConversionInfo(x, y, z, blockInfo)); - } else { + found = true; + break; + } + if (!found) { // Do nothing. tileEntitiesCopy.appendTag(tileEntity); } diff --git a/src/main/java/com/gtnewhorizons/postea/utility/ItemFixerUtility.java b/src/main/java/com/gtnewhorizons/postea/utility/ItemFixerUtility.java index e8cb46b..c50d824 100644 --- a/src/main/java/com/gtnewhorizons/postea/utility/ItemFixerUtility.java +++ b/src/main/java/com/gtnewhorizons/postea/utility/ItemFixerUtility.java @@ -23,11 +23,9 @@ public abstract class ItemFixerUtility { String itemNameInternal = GameRegistry.findUniqueIdentifierFor(item).modId + ":" + GameRegistry.findUniqueIdentifierFor(item).name; - Function transformer = ItemStackReplacementManager - .getItemReplacement(itemNameInternal); - - if (transformer != null) { - transformer.apply(tag); + for (Function transformer : ItemStackReplacementManager + .getItemReplacement(itemNameInternal)) { + if (transformer.apply(tag) != null) break; } } }