From f80424f91d97989060ad1da1a882780645e1995e Mon Sep 17 00:00:00 2001 From: GTNH-Colen <54497873+GTNH-Colen@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:37:55 +0100 Subject: [PATCH] Some refactoring --- .../postea/API/BlockReplacementManager.java | 10 +++++-- .../ChunkFixerUtility.java} | 30 +++---------------- .../postea/mixins/PosteaLoadingPlugin.java | 3 +- .../mixins/early/MixinAnvilChunkLoader.java | 29 ++++++++++++++++++ .../early/MixinChunkProviderServer.java | 27 +++++++++++++++++ src/main/resources/mixins.postea.early.json | 3 +- 6 files changed, 71 insertions(+), 31 deletions(-) rename src/main/java/com/colen/postea/{mixins/early/MixinChunk.java => API/ChunkFixerUtility.java} (61%) create mode 100644 src/main/java/com/colen/postea/mixins/early/MixinAnvilChunkLoader.java create mode 100644 src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java diff --git a/src/main/java/com/colen/postea/API/BlockReplacementManager.java b/src/main/java/com/colen/postea/API/BlockReplacementManager.java index 3a4cede..552d44d 100644 --- a/src/main/java/com/colen/postea/API/BlockReplacementManager.java +++ b/src/main/java/com/colen/postea/API/BlockReplacementManager.java @@ -1,21 +1,25 @@ package com.colen.postea.API; import net.minecraft.block.Block; +import net.minecraft.item.Item; import java.util.HashMap; import java.util.Map; +import static com.colen.postea.API.ItemStackReplacementManager.addItemReplacement; + public class BlockReplacementManager { - private static final Map replacementMap = new HashMap<>(); + private static final Map blockReplacementMap = new HashMap<>(); @SuppressWarnings("unused") public static void addBlockReplacement(Block blockIn, int metadataIn, Block blockOut, int metadataOut) { - replacementMap.put(new BlockKey(blockIn, metadataIn), new BlockKey(blockOut, metadataOut)); + blockReplacementMap.put(new BlockKey(blockIn, metadataIn), new BlockKey(blockOut, metadataOut)); + addItemReplacement(Item.getItemFromBlock(blockIn), metadataIn, Item.getItemFromBlock(blockOut), metadataOut); } @SuppressWarnings("unused") public static BlockKey getBlockReplacement(Block blockIn, int metadataIn) { - return replacementMap.getOrDefault(new BlockKey(blockIn, metadataIn), null); + return blockReplacementMap.getOrDefault(new BlockKey(blockIn, metadataIn), null); } } diff --git a/src/main/java/com/colen/postea/mixins/early/MixinChunk.java b/src/main/java/com/colen/postea/API/ChunkFixerUtility.java similarity index 61% rename from src/main/java/com/colen/postea/mixins/early/MixinChunk.java rename to src/main/java/com/colen/postea/API/ChunkFixerUtility.java index f1a1979..95f7c7c 100644 --- a/src/main/java/com/colen/postea/mixins/early/MixinChunk.java +++ b/src/main/java/com/colen/postea/API/ChunkFixerUtility.java @@ -1,30 +1,11 @@ -package com.colen.postea.mixins.early; +package com.colen.postea.API; -import com.colen.postea.API.BlockKey; -import com.colen.postea.API.BlockReplacementManager; import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.storage.AnvilChunkLoader; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(AnvilChunkLoader.class) -public abstract class MixinChunk { - - @Inject( - method = "readChunkFromNBT(Lnet/minecraft/world/World;Lnet/minecraft/nbt/NBTTagCompound;)Lnet/minecraft/world/chunk/Chunk;", - at = @At("RETURN"), - cancellable = true - ) - private void modifyChunkData(World world, NBTTagCompound compound, CallbackInfoReturnable cir) { - Chunk chunk = cir.getReturnValue(); +public class ChunkFixerUtility { + public static Chunk fixChunk(Chunk chunk) { // Iterate over each ExtendedBlockStorage. Kinda ugly but does the job... for (ExtendedBlockStorage storage : chunk.getBlockStorageArray()) { if (storage != null) { // Always check if storage isn't null before using it @@ -49,9 +30,6 @@ public abstract class MixinChunk { } } } - - cir.setReturnValue(chunk); + return chunk; } - - } diff --git a/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java b/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java index 6f22a5a..d3536ed 100644 --- a/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java +++ b/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java @@ -44,7 +44,8 @@ public final class PosteaLoadingPlugin implements IEarlyMixinLoader, IFMLLoading public List getMixins(Set loadedCoreMods) { final List mixins = new ArrayList<>(); mixins.add("MixinItemStack"); - mixins.add("MixinChunk"); + mixins.add("MixinChunkProviderServer"); + mixins.add("MixinAnvilChunkLoader"); return mixins; } diff --git a/src/main/java/com/colen/postea/mixins/early/MixinAnvilChunkLoader.java b/src/main/java/com/colen/postea/mixins/early/MixinAnvilChunkLoader.java new file mode 100644 index 0000000..5ec4d70 --- /dev/null +++ b/src/main/java/com/colen/postea/mixins/early/MixinAnvilChunkLoader.java @@ -0,0 +1,29 @@ +package com.colen.postea.mixins.early; + +import com.colen.postea.API.ChunkFixerUtility; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.storage.AnvilChunkLoader; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(AnvilChunkLoader.class) +public abstract class MixinAnvilChunkLoader { + + @Inject( + method = "readChunkFromNBT(Lnet/minecraft/world/World;Lnet/minecraft/nbt/NBTTagCompound;)Lnet/minecraft/world/chunk/Chunk;", + at = @At("RETURN"), + cancellable = true + ) + private void onChunkReloadFromWorldSaveData(World world, NBTTagCompound compound, CallbackInfoReturnable cir) { + Chunk chunk = cir.getReturnValue(); + + Chunk fixedChunk = ChunkFixerUtility.fixChunk(chunk); + + cir.setReturnValue(fixedChunk); + } + +} diff --git a/src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java b/src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java new file mode 100644 index 0000000..8104ab2 --- /dev/null +++ b/src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java @@ -0,0 +1,27 @@ +package com.colen.postea.mixins.early; + +import com.colen.postea.API.ChunkFixerUtility; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.gen.ChunkProviderServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ChunkProviderServer.class) +public class MixinChunkProviderServer { + + @Inject( + method = "originalLoadChunk(II)Lnet/minecraft/world/chunk/Chunk;", + at = @At("RETURN"), + remap=false, + cancellable = true + ) + public void onChunkCreation(int chunkX, int chunkZ, CallbackInfoReturnable cir) { + Chunk chunk = cir.getReturnValue(); + + Chunk fixedChunk = ChunkFixerUtility.fixChunk(chunk); + + cir.setReturnValue(fixedChunk); + } +} diff --git a/src/main/resources/mixins.postea.early.json b/src/main/resources/mixins.postea.early.json index 4e52083..620a496 100644 --- a/src/main/resources/mixins.postea.early.json +++ b/src/main/resources/mixins.postea.early.json @@ -6,7 +6,8 @@ "target": "@env(DEFAULT)", "compatibilityLevel": "JAVA_8", "mixins": [ - "MixinChunk", + "MixinAnvilChunkLoader", + "MixinChunkProviderServer", "MixinItemStack" ], "client": [],