From a3d9aac95e5d63a99ad78fdfa818da68cb465ec7 Mon Sep 17 00:00:00 2001 From: GTNH-Colen <54497873+GTNH-Colen@users.noreply.github.com> Date: Mon, 23 Oct 2023 14:02:09 +0100 Subject: [PATCH] Block replacement working, but only on reload, not initial generation. --- .../java/com/colen/postea/API/BlockKey.java | 38 +++++++++++++ .../postea/API/BlockReplacementManager.java | 21 +++++++ ....java => ItemStackReplacementManager.java} | 8 +-- src/main/java/com/colen/postea/Postea.java | 10 ++++ .../postea/mixins/PosteaLoadingPlugin.java | 1 + .../colen/postea/mixins/early/MixinChunk.java | 57 +++++++++++++++++++ .../postea/mixins/early/MixinItemStack.java | 6 +- src/main/resources/mixins.postea.early.json | 1 + 8 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/colen/postea/API/BlockKey.java create mode 100644 src/main/java/com/colen/postea/API/BlockReplacementManager.java rename src/main/java/com/colen/postea/API/{ReplacementManager.java => ItemStackReplacementManager.java} (63%) create mode 100644 src/main/java/com/colen/postea/mixins/early/MixinChunk.java diff --git a/src/main/java/com/colen/postea/API/BlockKey.java b/src/main/java/com/colen/postea/API/BlockKey.java new file mode 100644 index 0000000..e3c0ad3 --- /dev/null +++ b/src/main/java/com/colen/postea/API/BlockKey.java @@ -0,0 +1,38 @@ +package com.colen.postea.API; + +import java.util.Objects; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; + +public class BlockKey { + + private final Block block; + private final int meta; + + public BlockKey(Block block, int meta) { + this.block = block; + this.meta = meta; + } + + @Override + public boolean equals(Object o) { + if (o == null) return false; + if (o instanceof BlockKey that) { + return (this.meta == that.meta) && (this.block == that.block); + } else return false; + } + + @Override + public int hashCode() { + return Objects.hash(block, meta); + } + + public int getDamage() { + return meta; + } + + public Block getBlock() { + return block; + } +} diff --git a/src/main/java/com/colen/postea/API/BlockReplacementManager.java b/src/main/java/com/colen/postea/API/BlockReplacementManager.java new file mode 100644 index 0000000..3a4cede --- /dev/null +++ b/src/main/java/com/colen/postea/API/BlockReplacementManager.java @@ -0,0 +1,21 @@ +package com.colen.postea.API; + +import net.minecraft.block.Block; + +import java.util.HashMap; +import java.util.Map; + +public class BlockReplacementManager { + + private static final Map replacementMap = 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)); + } + + @SuppressWarnings("unused") + public static BlockKey getBlockReplacement(Block blockIn, int metadataIn) { + return replacementMap.getOrDefault(new BlockKey(blockIn, metadataIn), null); + } +} diff --git a/src/main/java/com/colen/postea/API/ReplacementManager.java b/src/main/java/com/colen/postea/API/ItemStackReplacementManager.java similarity index 63% rename from src/main/java/com/colen/postea/API/ReplacementManager.java rename to src/main/java/com/colen/postea/API/ItemStackReplacementManager.java index 22fde06..aa6c2db 100644 --- a/src/main/java/com/colen/postea/API/ReplacementManager.java +++ b/src/main/java/com/colen/postea/API/ItemStackReplacementManager.java @@ -5,19 +5,19 @@ import java.util.Map; import net.minecraft.item.Item; -public class ReplacementManager { +public class ItemStackReplacementManager { private static final Map replacementMap = new HashMap<>(); - // Public API for adding replacements. + // Public API for adding replacement ItemStacks. @SuppressWarnings("unused") - public static void addReplacement(Item itemIn, int metaIn, Item itemOut, int metaOut) { + public static void addItemReplacement(Item itemIn, int metaIn, Item itemOut, int metaOut) { replacementMap.put(new ItemStackKey(itemIn, metaIn), new ItemStackKey(itemOut, metaOut)); } @SuppressWarnings("unused") - public static ItemStackKey getReplacement(Item itemIn, int metaIn) { + public static ItemStackKey getItemReplacement(Item itemIn, int metaIn) { return replacementMap.getOrDefault(new ItemStackKey(itemIn, metaIn), null); } } diff --git a/src/main/java/com/colen/postea/Postea.java b/src/main/java/com/colen/postea/Postea.java index 1312ed8..593a2f0 100644 --- a/src/main/java/com/colen/postea/Postea.java +++ b/src/main/java/com/colen/postea/Postea.java @@ -1,9 +1,19 @@ package com.colen.postea; +import com.colen.postea.API.BlockReplacementManager; +import com.colen.postea.API.ItemStackReplacementManager; import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; @Mod(modid = Tags.MODID, version = Tags.VERSION, name = Tags.MODNAME, acceptedMinecraftVersions = "[1.7.10]") @SuppressWarnings("unused") public class Postea { + @Mod.EventHandler + public void preInit(FMLPreInitializationEvent event) { + ItemStackReplacementManager.addItemReplacement(Item.getItemFromBlock(Blocks.grass), 0, Item.getItemFromBlock(Blocks.coal_ore), 10); + BlockReplacementManager.addBlockReplacement(Blocks.bedrock, 0, Blocks.wool, 2); + } } diff --git a/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java b/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java index 1c0d4ac..6f22a5a 100644 --- a/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java +++ b/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java @@ -44,6 +44,7 @@ public final class PosteaLoadingPlugin implements IEarlyMixinLoader, IFMLLoading public List getMixins(Set loadedCoreMods) { final List mixins = new ArrayList<>(); mixins.add("MixinItemStack"); + mixins.add("MixinChunk"); return mixins; } diff --git a/src/main/java/com/colen/postea/mixins/early/MixinChunk.java b/src/main/java/com/colen/postea/mixins/early/MixinChunk.java new file mode 100644 index 0000000..f1a1979 --- /dev/null +++ b/src/main/java/com/colen/postea/mixins/early/MixinChunk.java @@ -0,0 +1,57 @@ +package com.colen.postea.mixins.early; + +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(); + + // 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 + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { // This is not a mistake, we do this on purpose because of how minecraft stores stuff. + for (int z = 0; z < 16; z++) { + + // Get the current block and metadata at the position + Block currentBlock = storage.getBlockByExtId(x, y, z); + int currentMeta = storage.getExtBlockMetadata(x, y, z); + + // Check if there's a replacement for this block+metadata combination + BlockKey replacement = BlockReplacementManager.getBlockReplacement(currentBlock, currentMeta); + + // If there's a replacement, set the new block and metadata + if (replacement != null) { + storage.func_150818_a(x, y, z, replacement.getBlock()); + storage.setExtBlockMetadata(x, y, z, replacement.getDamage()); + } + } + } + } + } + } + + cir.setReturnValue(chunk); + } + + +} diff --git a/src/main/java/com/colen/postea/mixins/early/MixinItemStack.java b/src/main/java/com/colen/postea/mixins/early/MixinItemStack.java index d384a2b..85b072e 100644 --- a/src/main/java/com/colen/postea/mixins/early/MixinItemStack.java +++ b/src/main/java/com/colen/postea/mixins/early/MixinItemStack.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.colen.postea.API.ItemStackKey; -import com.colen.postea.API.ReplacementManager; +import com.colen.postea.API.ItemStackReplacementManager; @Mixin(ItemStack.class) public abstract class MixinItemStack { @@ -24,7 +24,7 @@ public abstract class MixinItemStack { @Inject(method = "(Lnet/minecraft/item/Item;II)V", at = @At("RETURN")) private void onConstructorReturn(Item item, int size, int metadata, CallbackInfo ci) { - ItemStackKey replacement = ReplacementManager.getReplacement(item, metadata); + ItemStackKey replacement = ItemStackReplacementManager.getItemReplacement(item, metadata); if (replacement == null) return; @@ -35,7 +35,7 @@ public abstract class MixinItemStack { @Inject(method = "readFromNBT(Lnet/minecraft/nbt/NBTTagCompound;)V", at = @At("RETURN")) private void onReadFromNBTReturn(NBTTagCompound p_77963_1_, CallbackInfo ci) { - ItemStackKey replacement = ReplacementManager.getReplacement(field_151002_e, itemDamage); + ItemStackKey replacement = ItemStackReplacementManager.getItemReplacement(field_151002_e, itemDamage); if (replacement == null) return; diff --git a/src/main/resources/mixins.postea.early.json b/src/main/resources/mixins.postea.early.json index 9fe8afc..4e52083 100644 --- a/src/main/resources/mixins.postea.early.json +++ b/src/main/resources/mixins.postea.early.json @@ -6,6 +6,7 @@ "target": "@env(DEFAULT)", "compatibilityLevel": "JAVA_8", "mixins": [ + "MixinChunk", "MixinItemStack" ], "client": [],