From ce84d5a3e512cd8d25dbadde5b05944c68212e31 Mon Sep 17 00:00:00 2001 From: Connor Colenso Date: Tue, 24 Oct 2023 01:05:53 +0100 Subject: [PATCH] Kinda there for tile entities, need to change actual block --- dependencies.gradle | 2 +- .../API/TileEntityReplacementManager.java | 20 +++++ .../com/colen/postea/API/TileTransformer.java | 40 ++++++++++ src/main/java/com/colen/postea/Postea.java | 23 +++++- .../postea/mixins/PosteaLoadingPlugin.java | 1 + .../mixins/early/MixinAnvilChunkLoader.java | 2 + .../early/MixinChunkProviderServer.java | 2 + .../postea/mixins/early/MixinItemStack.java | 5 +- .../postea/mixins/early/MixinTileEntity.java | 80 +++++++++++++++++++ src/main/resources/mixins.postea.early.json | 3 +- 10 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/colen/postea/API/TileEntityReplacementManager.java create mode 100644 src/main/java/com/colen/postea/API/TileTransformer.java create mode 100644 src/main/java/com/colen/postea/mixins/early/MixinTileEntity.java diff --git a/dependencies.gradle b/dependencies.gradle index fca978f..3ebc8cc 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -35,5 +35,5 @@ */ dependencies { api('com.github.GTNewHorizons:SpongePoweredMixin:0.8.5-GTNH-2:dev') - //api('com.github.GTNewHorizons:GT5-Unofficial:5.09.44.30:dev') + api('com.github.GTNewHorizons:GT5-Unofficial:5.09.44.30:dev') } diff --git a/src/main/java/com/colen/postea/API/TileEntityReplacementManager.java b/src/main/java/com/colen/postea/API/TileEntityReplacementManager.java new file mode 100644 index 0000000..a663e82 --- /dev/null +++ b/src/main/java/com/colen/postea/API/TileEntityReplacementManager.java @@ -0,0 +1,20 @@ +package com.colen.postea.API; + +import java.util.HashMap; +import java.util.Map; + +public class TileEntityReplacementManager { + + private static final Map replacementMap = new HashMap<>(); + + @SuppressWarnings("unused") + public static void addItemReplacement(String tileName , TileTransformer tileTransformer) { + replacementMap.put(tileName, tileTransformer); + } + + @SuppressWarnings("unused") + public static TileTransformer getTileReplacementTransformer(String tileName) { + return replacementMap.getOrDefault(tileName, null); + } + +} diff --git a/src/main/java/com/colen/postea/API/TileTransformer.java b/src/main/java/com/colen/postea/API/TileTransformer.java new file mode 100644 index 0000000..118ab26 --- /dev/null +++ b/src/main/java/com/colen/postea/API/TileTransformer.java @@ -0,0 +1,40 @@ +package com.colen.postea.API; + +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +import java.util.Objects; +import java.util.function.Function; + +public class TileTransformer { + + private final Class tileClass; + private final Function NBTModifierFunction; + + public TileTransformer(Class tileClass, Function NBTModifierFunction) { + this.tileClass = tileClass; + this.NBTModifierFunction = NBTModifierFunction; + } + + @Override + public boolean equals(Object o) { + if (o == null) return false; + if (o instanceof TileTransformer that) { + return (this.tileClass == that.tileClass); + } else return false; + } + + @Override + public int hashCode() { + return Objects.hash(tileClass); + } + + public void modifyNBT(NBTTagCompound nbt) { + NBTModifierFunction.apply(nbt); + } + + public Class getTileClass() { + return tileClass; + } +} diff --git a/src/main/java/com/colen/postea/Postea.java b/src/main/java/com/colen/postea/Postea.java index 593a2f0..4ee362c 100644 --- a/src/main/java/com/colen/postea/Postea.java +++ b/src/main/java/com/colen/postea/Postea.java @@ -2,10 +2,19 @@ package com.colen.postea; import com.colen.postea.API.BlockReplacementManager; import com.colen.postea.API.ItemStackReplacementManager; +import com.colen.postea.API.TileEntityReplacementManager; +import com.colen.postea.API.TileTransformer; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.Item; +import gregtech.api.GregTech_API; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.tileentity.TileEntityFurnace; + +import java.util.function.Function; @Mod(modid = Tags.MODID, version = Tags.VERSION, name = Tags.MODNAME, acceptedMinecraftVersions = "[1.7.10]") @SuppressWarnings("unused") @@ -13,7 +22,17 @@ 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); + //ItemStackReplacementManager.addItemReplacement(Item.getItemFromBlock(Blocks.grass), 0, Item.getItemFromBlock(Blocks.coal_ore), 10); + BlockReplacementManager.addBlockReplacement(GregTech_API.sBlockOres1, 6, Blocks.emerald_ore, 0); + BlockReplacementManager.addBlockReplacement(GregTech_API.sBlockOres1, 16022, Blocks.nether_brick, 0); + BlockReplacementManager.addBlockReplacement(GregTech_API.sBlockOres1, 1018, Blocks.end_stone, 0); + + // Define the transformation function + Function myTransformer = (tag) -> { + return tag; + }; + + TileEntityReplacementManager.addItemReplacement("BlockController", new TileTransformer(TileEntityChest.class, myTransformer)); + } } diff --git a/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java b/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java index d3536ed..36d36dd 100644 --- a/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java +++ b/src/main/java/com/colen/postea/mixins/PosteaLoadingPlugin.java @@ -46,6 +46,7 @@ public final class PosteaLoadingPlugin implements IEarlyMixinLoader, IFMLLoading mixins.add("MixinItemStack"); mixins.add("MixinChunkProviderServer"); mixins.add("MixinAnvilChunkLoader"); + mixins.add("MixinTileEntity"); 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 index 5ec4d70..3e0959a 100644 --- a/src/main/java/com/colen/postea/mixins/early/MixinAnvilChunkLoader.java +++ b/src/main/java/com/colen/postea/mixins/early/MixinAnvilChunkLoader.java @@ -11,6 +11,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(AnvilChunkLoader.class) +@SuppressWarnings("unused") public abstract class MixinAnvilChunkLoader { @Inject( @@ -18,6 +19,7 @@ public abstract class MixinAnvilChunkLoader { at = @At("RETURN"), cancellable = true ) + @SuppressWarnings("unused") private void onChunkReloadFromWorldSaveData(World world, NBTTagCompound compound, CallbackInfoReturnable cir) { Chunk chunk = cir.getReturnValue(); diff --git a/src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java b/src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java index 8104ab2..df78970 100644 --- a/src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java +++ b/src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java @@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ChunkProviderServer.class) +@SuppressWarnings("unused") public class MixinChunkProviderServer { @Inject( @@ -17,6 +18,7 @@ public class MixinChunkProviderServer { remap=false, cancellable = true ) + @SuppressWarnings("unused") public void onChunkCreation(int chunkX, int chunkZ, CallbackInfoReturnable cir) { Chunk chunk = cir.getReturnValue(); 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 85b072e..5321c3a 100644 --- a/src/main/java/com/colen/postea/mixins/early/MixinItemStack.java +++ b/src/main/java/com/colen/postea/mixins/early/MixinItemStack.java @@ -15,6 +15,7 @@ import com.colen.postea.API.ItemStackKey; import com.colen.postea.API.ItemStackReplacementManager; @Mixin(ItemStack.class) +@SuppressWarnings("unused") public abstract class MixinItemStack { @Shadow @@ -23,6 +24,7 @@ public abstract class MixinItemStack { private Item field_151002_e; @Inject(method = "(Lnet/minecraft/item/Item;II)V", at = @At("RETURN")) + @SuppressWarnings("unused") private void onConstructorReturn(Item item, int size, int metadata, CallbackInfo ci) { ItemStackKey replacement = ItemStackReplacementManager.getItemReplacement(item, metadata); @@ -34,13 +36,14 @@ public abstract class MixinItemStack { } @Inject(method = "readFromNBT(Lnet/minecraft/nbt/NBTTagCompound;)V", at = @At("RETURN")) + @SuppressWarnings("unused") private void onReadFromNBTReturn(NBTTagCompound p_77963_1_, CallbackInfo ci) { ItemStackKey replacement = ItemStackReplacementManager.getItemReplacement(field_151002_e, itemDamage); if (replacement == null) return; - func_150996_a(replacement.getItem()); itemDamage = replacement.getDamage(); + func_150996_a(replacement.getItem()); } @Unique diff --git a/src/main/java/com/colen/postea/mixins/early/MixinTileEntity.java b/src/main/java/com/colen/postea/mixins/early/MixinTileEntity.java new file mode 100644 index 0000000..5a1d171 --- /dev/null +++ b/src/main/java/com/colen/postea/mixins/early/MixinTileEntity.java @@ -0,0 +1,80 @@ +package com.colen.postea.mixins.early; + +import com.colen.postea.API.TileEntityReplacementManager; +import com.colen.postea.API.TileTransformer; +import cpw.mods.fml.common.FMLLog; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + +@Mixin(TileEntity.class) +@SuppressWarnings("unused") +public class MixinTileEntity { + + @Shadow + private static Logger logger; + + @Shadow + private static Map nameToClassMap; + + /** + * Creates a new entity and loads its data from the specified NBT. + */ + @Overwrite + @SuppressWarnings("unused") + public static TileEntity createAndLoadEntity(NBTTagCompound nbt) { + TileEntity tileentity = null; + + Class oclass = null; + try + { + String tileEntityStringName = nbt.getString("id"); + TileTransformer tileTransformer = TileEntityReplacementManager.getTileReplacementTransformer(tileEntityStringName); + + + if (tileTransformer == null) { + oclass = (Class)nameToClassMap.get(tileEntityStringName); + } else { + oclass = tileTransformer.getTileClass(); + tileTransformer.modifyNBT(nbt); + } + + if (oclass != null) + { + tileentity = (TileEntity)oclass.newInstance(); + } + } + catch (Exception exception) + { + exception.printStackTrace(); + } + + if (tileentity != null) + { + try + { + tileentity.readFromNBT(nbt); + } + catch (Exception ex) + { + FMLLog.log(Level.ERROR, ex, + "A TileEntity %s(%s) has thrown an exception during loading, its state cannot be restored. Report this to the mod author", + nbt.getString("id"), oclass.getName()); + tileentity = null; + } + } + else + { + logger.warn("Skipping BlockEntity with id " + nbt.getString("id")); + } + + return tileentity; + } + +} diff --git a/src/main/resources/mixins.postea.early.json b/src/main/resources/mixins.postea.early.json index 620a496..ddc0558 100644 --- a/src/main/resources/mixins.postea.early.json +++ b/src/main/resources/mixins.postea.early.json @@ -8,7 +8,8 @@ "mixins": [ "MixinAnvilChunkLoader", "MixinChunkProviderServer", - "MixinItemStack" + "MixinItemStack", + "MixinTileEntity" ], "client": [], "server": []