From d41aff53e00284c90e00c6c771fbcf8f03996ab0 Mon Sep 17 00:00:00 2001 From: GTNH-Colen <54497873+GTNH-Colen@users.noreply.github.com> Date: Sun, 29 Oct 2023 01:06:18 +0100 Subject: [PATCH] Progress with not enough IDs --- dependencies.gradle | 5 +- gradle.properties | 2 +- .../colen/postea/API/ChunkFixerUtility.java | 22 ++++ .../API/TileEntityReplacementManager.java | 4 +- .../com/colen/postea/API/TileTransformer.java | 27 ++-- src/main/java/com/colen/postea/Postea.java | 12 +- .../mixins/early/MixinAnvilChunkLoader.java | 93 ++++++++++++-- .../early/MixinChunkProviderServer.java | 28 ++--- .../postea/mixins/early/MixinItemStack.java | 60 ++++----- .../postea/mixins/early/MixinTileEntity.java | 116 +++++++++--------- 10 files changed, 226 insertions(+), 143 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 3ebc8cc..5e5bca1 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,6 +34,7 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - api('com.github.GTNewHorizons:SpongePoweredMixin:0.8.5-GTNH-2:dev') - api('com.github.GTNewHorizons:GT5-Unofficial:5.09.44.30:dev') + api("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev") + api('com.github.GTNewHorizons:GT5-Unofficial:5.09.44.71:dev') + api('com.github.GTNewHorizons:NotEnoughIds:1.4.6:dev') } diff --git a/gradle.properties b/gradle.properties index a76e1f2..2267337 100644 --- a/gradle.properties +++ b/gradle.properties @@ -77,7 +77,7 @@ coreModClass = mixins.PosteaLoadingPlugin containsMixinsAndOrCoreModOnly = false # Enables Mixins even if this mod doesn't use them, useful if one of the dependencies uses mixins. -forceEnableMixins = false +forceEnableMixins = true # If enabled, you may use 'shadowCompile' for dependencies. They will be integrated in your jar. It is your # responsibility check the licence and request permission for distribution, if required. diff --git a/src/main/java/com/colen/postea/API/ChunkFixerUtility.java b/src/main/java/com/colen/postea/API/ChunkFixerUtility.java index 95f7c7c..1693e77 100644 --- a/src/main/java/com/colen/postea/API/ChunkFixerUtility.java +++ b/src/main/java/com/colen/postea/API/ChunkFixerUtility.java @@ -1,6 +1,8 @@ package com.colen.postea.API; import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; @@ -32,4 +34,24 @@ public class ChunkFixerUtility { } return chunk; } + + public static void processCode(NBTTagCompound compound) { + System.out.println(compound.toString()); + + swapTileEntities(compound); + } + + private static void swapTileEntities(NBTTagCompound compound) { + NBTTagList tileEntities = compound.getCompoundTag("Level").getTagList("TileEntities", 10); + for (int i = 0; i < tileEntities.tagCount(); i++) { + NBTTagCompound tileEntity = tileEntities.getCompoundTagAt(i); + String tileEntityStringName = tileEntity.getString("id"); + TileTransformer tileTransformer = TileEntityReplacementManager.getTileReplacementTransformer(tileEntityStringName); + + if (tileTransformer != null) { + tileTransformer.modifyNBT(tileEntity); + } + + } + } } diff --git a/src/main/java/com/colen/postea/API/TileEntityReplacementManager.java b/src/main/java/com/colen/postea/API/TileEntityReplacementManager.java index daa1de8..22662c7 100644 --- a/src/main/java/com/colen/postea/API/TileEntityReplacementManager.java +++ b/src/main/java/com/colen/postea/API/TileEntityReplacementManager.java @@ -8,8 +8,8 @@ public class TileEntityReplacementManager { private static final Map replacementMap = new HashMap<>(); @SuppressWarnings("unused") - public static void tileEntityReplacement(String tileName , TileTransformer tileTransformer) { - replacementMap.put(tileName, tileTransformer); + public static void tileEntityReplacement(String tileName , TileTransformer tileReplacer) { + replacementMap.put(tileName, tileReplacer); } @SuppressWarnings("unused") diff --git a/src/main/java/com/colen/postea/API/TileTransformer.java b/src/main/java/com/colen/postea/API/TileTransformer.java index bc837f3..741df49 100644 --- a/src/main/java/com/colen/postea/API/TileTransformer.java +++ b/src/main/java/com/colen/postea/API/TileTransformer.java @@ -11,11 +11,12 @@ 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; + private final Function NBTModifierFunction; + private final String tileName; + + public TileTransformer(String tileName, Function NBTModifierFunction) { + this.tileName = tileName; this.NBTModifierFunction = NBTModifierFunction; } @@ -23,28 +24,16 @@ public class TileTransformer { public boolean equals(Object o) { if (o == null) return false; if (o instanceof TileTransformer that) { - return (this.tileClass == that.tileClass); + return (this.tileName.equals(that.tileName)); } else return false; } - @Override - public int hashCode() { - return Objects.hash(tileClass); - } - public void modifyNBT(NBTTagCompound nbt) { NBTModifierFunction.apply(nbt); } - public Class getTileClass() { - return tileClass; + public String getTileName() { + return tileName; } - public void setBlock(NBTTagCompound nbt, World world) { - int x = nbt.getInteger("x"); - int y = nbt.getInteger("y"); - int z = nbt.getInteger("z"); - - Minecraft.getMinecraft().theWorld.setBlock(x, y, z, Blocks.chest); - } } diff --git a/src/main/java/com/colen/postea/Postea.java b/src/main/java/com/colen/postea/Postea.java index 6348080..c98d0bc 100644 --- a/src/main/java/com/colen/postea/Postea.java +++ b/src/main/java/com/colen/postea/Postea.java @@ -23,16 +23,20 @@ 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(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); +// 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) -> { + if (tag.getInteger("m") == 86) { + tag.setInteger("m", 323); + return tag; + } return tag; }; - TileEntityReplacementManager.tileEntityReplacement("GT_TileEntity_Ores", new TileTransformer(TileEntityChest.class, myTransformer)); + TileEntityReplacementManager.tileEntityReplacement("GT_TileEntity_Ores", new TileTransformer("GT_TileEntity_Ores", myTransformer)); } 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 3e0959a..d4574b8 100644 --- a/src/main/java/com/colen/postea/mixins/early/MixinAnvilChunkLoader.java +++ b/src/main/java/com/colen/postea/mixins/early/MixinAnvilChunkLoader.java @@ -1,31 +1,98 @@ 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; +import static com.colen.postea.API.ChunkFixerUtility.processCode; + @Mixin(AnvilChunkLoader.class) @SuppressWarnings("unused") 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 - ) - @SuppressWarnings("unused") - private void onChunkReloadFromWorldSaveData(World world, NBTTagCompound compound, CallbackInfoReturnable cir) { - Chunk chunk = cir.getReturnValue(); +// @Unique +// private static Class PendingChunkClass; +// +// static { +// try { +// for (Class declaredClass : AnvilChunkLoader.class.getDeclaredClasses()) { +// if (declaredClass.getSimpleName().equals("PendingChunk")) { +// PendingChunkClass = declaredClass; +// break; +// } +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// /** +// * @author Colen +// * @reason Reasons. +// */ +// @Unique +// @Overwrite(remap = false) +// public Object[] loadChunk__Async(World p_75815_1_, int p_75815_2_, int p_75815_3_) throws IOException +// { +// NBTTagCompound nbttagcompound = null; +// ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(p_75815_2_, p_75815_3_); +// Object object = this.syncLockObject; +// +// synchronized (this.syncLockObject) +// { +// if (this.pendingAnvilChunksCoordinates.contains(chunkcoordintpair)) { +// Iterator iter = this.chunksToRemove.iterator(); +// while (iter.hasNext()) { +// Object potentialPendingChunk = iter.next(); +// if (PendingChunkClass.isInstance(potentialPendingChunk)) { +// try { +// Field chunkCoordinateField = PendingChunkClass.getDeclaredField("chunkCoordinate"); +// chunkCoordinateField.setAccessible(true); +// ChunkCoordIntPair chunkCoordinate = (ChunkCoordIntPair) chunkCoordinateField.get(potentialPendingChunk); +// +// Field nbtTagsField = PendingChunkClass.getDeclaredField("nbtTags"); +// nbtTagsField.setAccessible(true); +// NBTTagCompound nbtTags = (NBTTagCompound) nbtTagsField.get(potentialPendingChunk); +// +// if (chunkCoordinate.equals(chunkcoordintpair)) { +// nbttagcompound = nbtTags; +// break; +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } +// +// } +// +// if (nbttagcompound == null) +// { +// DataInputStream datainputstream = RegionFileCache.getChunkInputStream(this.chunkSaveLocation, p_75815_2_, p_75815_3_); +// +// if (datainputstream == null) +// { +// return null; +// } +// +// nbttagcompound = CompressedStreamTools.read(datainputstream); +// } +// +// return this.checkedReadChunkFromNBT__Async(p_75815_1_, p_75815_2_, p_75815_3_, nbttagcompound); +// } +// +// @Unique +// protected native Object[] checkedReadChunkFromNBT__Async(World p_75822_1_, int p_75822_2_, int p_75822_3_, NBTTagCompound p_75822_4_); - Chunk fixedChunk = ChunkFixerUtility.fixChunk(chunk); - - cir.setReturnValue(fixedChunk); + @Inject(method = "checkedReadChunkFromNBT__Async", at = @At("HEAD"), remap = false) + private void onCheckedReadChunkFromNBT__Async(World world, int x, int z, NBTTagCompound compound, CallbackInfoReturnable cir) { + // Your injection code here + processCode(compound); } } 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 df78970..61ce854 100644 --- a/src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java +++ b/src/main/java/com/colen/postea/mixins/early/MixinChunkProviderServer.java @@ -12,18 +12,18 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @SuppressWarnings("unused") public class MixinChunkProviderServer { - @Inject( - method = "originalLoadChunk(II)Lnet/minecraft/world/chunk/Chunk;", - at = @At("RETURN"), - remap=false, - cancellable = true - ) - @SuppressWarnings("unused") - public void onChunkCreation(int chunkX, int chunkZ, CallbackInfoReturnable cir) { - Chunk chunk = cir.getReturnValue(); - - Chunk fixedChunk = ChunkFixerUtility.fixChunk(chunk); - - cir.setReturnValue(fixedChunk); - } +// @Inject( +// method = "originalLoadChunk(II)Lnet/minecraft/world/chunk/Chunk;", +// at = @At("RETURN"), +// remap=false, +// cancellable = true +// ) +// @SuppressWarnings("unused") +// 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/java/com/colen/postea/mixins/early/MixinItemStack.java b/src/main/java/com/colen/postea/mixins/early/MixinItemStack.java index 5321c3a..18865b1 100644 --- a/src/main/java/com/colen/postea/mixins/early/MixinItemStack.java +++ b/src/main/java/com/colen/postea/mixins/early/MixinItemStack.java @@ -18,34 +18,34 @@ import com.colen.postea.API.ItemStackReplacementManager; @SuppressWarnings("unused") public abstract class MixinItemStack { - @Shadow - private int itemDamage; // Metadata - @Shadow - 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); - - if (replacement == null) return; - - // Edit private variables here. - itemDamage = replacement.getDamage(); - func_150996_a(replacement.getItem()); - } - - @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; - - itemDamage = replacement.getDamage(); - func_150996_a(replacement.getItem()); - } - - @Unique - public native void func_150996_a(Item p_150996_1_); +// @Shadow +// private int itemDamage; // Metadata +// @Shadow +// 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); +// +// if (replacement == null) return; +// +// // Edit private variables here. +// itemDamage = replacement.getDamage(); +// func_150996_a(replacement.getItem()); +// } +// +// @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; +// +// itemDamage = replacement.getDamage(); +// func_150996_a(replacement.getItem()); +// } +// +// @Unique +// public native void func_150996_a(Item p_150996_1_); } diff --git a/src/main/java/com/colen/postea/mixins/early/MixinTileEntity.java b/src/main/java/com/colen/postea/mixins/early/MixinTileEntity.java index df274a3..5eeba87 100644 --- a/src/main/java/com/colen/postea/mixins/early/MixinTileEntity.java +++ b/src/main/java/com/colen/postea/mixins/early/MixinTileEntity.java @@ -18,68 +18,68 @@ import java.util.Map; @SuppressWarnings("unused") public class MixinTileEntity { - @Shadow - private static Logger logger; - - @Shadow - private static Map nameToClassMap; - - @Shadow - protected World worldObj; +// @Shadow +// private static Logger logger; +// +// @Shadow +// private static Map nameToClassMap; +// +// @Shadow +// protected World worldObj; /** * 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; - } +// @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; +// } }