From 59766c69f7622309075efd577c9543a8ac24c3f9 Mon Sep 17 00:00:00 2001 From: Jason Mitchell Date: Sat, 29 Jun 2024 10:48:10 -0700 Subject: MultiTileEntityBlock work * Merge MultiTileEntityBlockRegistryInternal into MultiTileEntityBlock * Add a hard dep on NEID for meta extension * Use in world block meta for MuTE ID * Use one block per MuTE Registry * Add WeakTargetRef * Migrate `controller` reference for parts over to a non non cachable WeakTargetRef * Migrate controller WeakReference usage to WeakTargetRef --- dependencies.gradle | 1 + .../api/metatileentity/BaseTileEntity.java | 4 - .../api/multitileentity/MultiTileEntityBlock.java | 34 ++- .../MultiTileEntityBlockRegistryInternal.java | 47 ---- .../MultiTileEntityClassContainer.java | 49 ++-- .../multitileentity/MultiTileEntityContainer.java | 24 -- .../api/multitileentity/MultiTileEntityItem.java | 203 ++++++----------- .../multitileentity/MultiTileEntityRegistry.java | 174 +++++---------- .../api/multitileentity/WeakTargetRef.java | 88 ++++++++ .../api/multitileentity/base/MultiTileEntity.java | 20 +- .../multitileentity/interfaces/IItemUpdatable.java | 19 -- .../interfaces/IMultiBlockPart.java | 2 - .../interfaces/IMultiTileEntity.java | 5 +- .../machine/MultiTileBasicMachine.java | 2 +- .../multiblock/base/Controller.java | 97 ++++---- .../multiblock/base/MultiBlockPart.java | 86 +++---- .../multiblock/base/WallShareablePart.java | 34 +-- .../multiblock/casing/UpgradeCasing.java | 4 +- .../gregtech/api/util/GT_StructureUtilityMuTE.java | 30 +-- .../common/render/GT_MultiTile_Renderer.java | 7 +- .../automation/GT_MetaTileEntity_RecipeFilter.java | 8 +- .../machines/multiblock/DistillationTower.java | 13 +- .../preload/GT_Loader_MultiTileEntities.java | 248 +++------------------ 23 files changed, 438 insertions(+), 761 deletions(-) delete mode 100644 src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockRegistryInternal.java delete mode 100644 src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java create mode 100644 src/main/java/gregtech/api/multitileentity/WeakTargetRef.java delete mode 100644 src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java diff --git a/dependencies.gradle b/dependencies.gradle index 78b3c27480..842e51cd41 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -37,6 +37,7 @@ dependencies { api("com.github.GTNewHorizons:StructureLib:1.3.1:dev") api("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev") api("com.github.GTNewHorizons:NotEnoughItems:2.6.14-GTNH:dev") + api("com.github.GTNewHorizons:NotEnoughIds:2.1.0:dev") api("com.github.GTNewHorizons:GTNHLib:0.3.2:dev") api("com.github.GTNewHorizons:ModularUI:1.2.0:dev") api("com.github.GTNewHorizons:waila:1.8.1:dev") diff --git a/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java index ac523eb82c..f3c65a1bfe 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java @@ -1,10 +1,7 @@ package gregtech.api.metatileentity; -import static gregtech.api.enums.GT_Values.COMPASS_DIRECTIONS; import static gregtech.api.enums.GT_Values.GT; import static gregtech.api.enums.GT_Values.NW; -import static gregtech.api.enums.GT_Values.SIDE_DOWN; -import static gregtech.api.enums.GT_Values.SIDE_UP; import java.util.Arrays; import java.util.List; @@ -26,7 +23,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MathHelper; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java index 800e9af20a..1697eb03ce 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java @@ -14,6 +14,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -24,7 +25,6 @@ import net.minecraft.entity.EnumCreatureType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; @@ -62,11 +62,14 @@ import gregtech.common.render.GT_MultiTile_Renderer; * MultiTileEntityBlock ported from GT6 */ @Optional.Interface(iface = "com.cricketcraft.chisel.api.IFacade", modid = "ChiselAPI") -public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITileEntityProvider, IFacade { +public class MultiTileEntityBlock extends BlockContainer implements IDebugableBlock, ITileEntityProvider, IFacade { + + private MultiTileEntityRegistry registry; private static boolean LOCK = false; - private boolean registered = false, normalCube; + private boolean registered = false; + private boolean normalCube; protected String internalName, toolName, materialName, modID; public String getName() { @@ -125,7 +128,7 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil internalName = getName(); lightOpacity = isOpaqueCube() ? 255 : 0; - GameRegistry.registerBlock(this, ItemBlock.class, internalName); + GameRegistry.registerBlock(this, MultiTileEntityItem.class, internalName); return this; } @@ -382,6 +385,18 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil return 0; } + public MultiTileEntityRegistry getRegistry() { + return registry; + } + + public void setRegistry(MultiTileEntityRegistry registry) { + this.registry = registry; + } + + public boolean isRegistered() { + return registered; + } + @Override protected boolean canSilkHarvest() { return false; @@ -389,11 +404,13 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil @Override public final String getLocalizedName() { + // return StatCollector.translateToLocal(registry.getInternalName() + ".name"); return StatCollector.translateToLocal(internalName + ".name"); } @Override public final String getUnlocalizedName() { + // return registry.getInternalName(); return internalName; } @@ -571,12 +588,7 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil } @Override - public final TileEntity createTileEntity(World world, int meta) { - return null; - } - - @Override - public TileEntity createNewTileEntity(World world, int i) { - return null; + public TileEntity createNewTileEntity(World world, int meta) { + return registry.getNewTileEntity(meta); } } diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockRegistryInternal.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockRegistryInternal.java deleted file mode 100644 index 3d8da5d796..0000000000 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockRegistryInternal.java +++ /dev/null @@ -1,47 +0,0 @@ -package gregtech.api.multitileentity; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.util.StatCollector; - -import gregtech.common.render.GT_MultiTile_Renderer; - -/* - * The internal block used in the registry for lookup. - * - Not the same as the block spawned with the MuTE to allow for multiple different types of blocks/materials - * in each registry. - */ -public class MultiTileEntityBlockRegistryInternal extends Block { - - public MultiTileEntityRegistry registry; - - public MultiTileEntityBlockRegistryInternal() { - super(Material.anvil); - } - - @Override - public void registerBlockIcons(IIconRegister aIconRegister) { - /* Do Nothing */ - } - - @Override - public int getRenderType() { - return GT_MultiTile_Renderer.INSTANCE == null ? super.getRenderType() - : GT_MultiTile_Renderer.INSTANCE.getRenderId(); - } - - @Override - public final String getUnlocalizedName() { - return registry.getInternalName(); - } - - @Override - public final String getLocalizedName() { - return StatCollector.translateToLocal(registry.getInternalName() + ".name"); - } - - public MultiTileEntityRegistry getRegistry() { - return registry; - } -} diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java index 6eba28bad9..325f583149 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java @@ -21,15 +21,11 @@ public class MultiTileEntityClassContainer { private String localized; private String categoryName; - public final short muteID; - public Class muteClass; - public MultiTileEntityBlock block; - public MultiTileEntity referenceTileEntity; - public NBTTagCompound parameters; - - // These have defaults - public byte blockMetaData = 1; - public byte maxStackSize = 64; + private final short muteID; + private final Class muteClass; + private MultiTileEntity referenceTileEntity; + private NBTTagCompound parameters; + public boolean hidden = false; public MultiTileEntityClassContainer(MultiTileEntityRegistry aRegistry, int aID, @@ -72,26 +68,11 @@ public class MultiTileEntityClassContainer { return this; } - public MultiTileEntityClassContainer meta(int aMeta) { - blockMetaData = (byte) aMeta; - return this; - } - - public MultiTileEntityClassContainer stackSize(int aStackSize) { - maxStackSize = (byte) aStackSize; - return this; - } - public MultiTileEntityClassContainer hide() { hidden = true; return this; } - public MultiTileEntityClassContainer setBlock(MultiTileEntityBlock aBlock) { - block = aBlock; - return this; - } - /* These methods are builder methods for commonly used NBT tags */ // Need a base texture for the MTE machine, and then a separate texture set for the machine/active overlays @@ -177,6 +158,26 @@ public class MultiTileEntityClassContainer { return this; } + public WeakReference getRegistry() { + return registry; + } + + public Class getMuteClass() { + return muteClass; + } + + public short getMuteID() { + return muteID; + } + + public MultiTileEntity getReferenceTileEntity() { + return referenceTileEntity; + } + + public NBTTagCompound getParameters() { + return parameters; + } + private void verifyDescendentOf(Class cls) { // Check if cls is extended by mClass if (!cls.isAssignableFrom(muteClass)) { diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java deleted file mode 100644 index 3ca0ee46f4..0000000000 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java +++ /dev/null @@ -1,24 +0,0 @@ -package gregtech.api.multitileentity; - -import net.minecraft.world.World; - -import gregtech.api.multitileentity.base.MultiTileEntity; -import gregtech.api.util.GT_Util; - -public class MultiTileEntityContainer { - - public final MultiTileEntity tileEntity; - public final MultiTileEntityBlock block; - public final byte blockMetaData; - - public MultiTileEntityContainer(MultiTileEntity tileEntity, MultiTileEntityBlock block, byte blockMetaData) { - this.blockMetaData = blockMetaData; - this.tileEntity = tileEntity; - this.block = block; - } - - public void setMultiTile(World aWorld, int aX, int aY, int aZ) { - GT_Util.setBlock(aWorld, aX, aY, aZ, block, blockMetaData, 0, false); - GT_Util.setTileEntity(aWorld, aX, aY, aZ, tileEntity, true); - } -} diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java index 8dc1d348ff..e67ab61e96 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java @@ -16,44 +16,43 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidContainerItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.metatileentity.CoverableTileEntity; -import gregtech.api.multitileentity.interfaces.IItemUpdatable; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; -public class MultiTileEntityItem extends ItemBlock implements IFluidContainerItem, IItemUpdatable { +public class MultiTileEntityItem extends ItemBlock { - public final MultiTileEntityBlockRegistryInternal mBlock; + public final MultiTileEntityBlock block; - public MultiTileEntityItem(Block aBlock) { - super(aBlock); + public MultiTileEntityItem(Block block) { + super(block); setMaxDamage(0); setHasSubtypes(true); - mBlock = (MultiTileEntityBlockRegistryInternal) aBlock; + this.block = (MultiTileEntityBlock) block; } @Override @SuppressWarnings("unchecked") - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer == null) { - aList.add("INVALID ITEM!"); + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean F3_H) { + final IMultiTileEntity mute = block.getRegistry() + .getReferenceTileEntity(stack); + if (mute == null) { + list.add("INVALID ITEM!"); return; } try { - tTileEntityContainer.tileEntity.addToolTips(aList, aStack, aF3_H); + mute.addToolTips(list, stack, F3_H); } catch (Throwable e) { GT_FML_LOGGER.error("addInformation", e); } - final NBTTagCompound aNBT = aStack.getTagCompound(); - CoverableTileEntity.addInstalledCoversInformation(aNBT, aList); + final NBTTagCompound aNBT = stack.getTagCompound(); + CoverableTileEntity.addInstalledCoversInformation(aNBT, list); // TODO: Add anything else relevant } @@ -61,68 +60,68 @@ public class MultiTileEntityItem extends ItemBlock implements IFluidContainerIte @SideOnly(Side.CLIENT) @SuppressWarnings("unchecked") public void getSubItems(Item aItem, CreativeTabs aTab, List aList) { - for (MultiTileEntityClassContainer tClass : mBlock.registry.registrations) { - if (!tClass.hidden && ((IMultiTileEntity) tClass.referenceTileEntity) - .getSubItems(mBlock, aItem, aTab, aList, tClass.muteID)) { - aList.add(mBlock.registry.getItem(tClass.muteID)); + for (MultiTileEntityClassContainer tClass : block.getRegistry().registrations) { + if (!tClass.hidden && ((IMultiTileEntity) tClass.getReferenceTileEntity()) + .getSubItems(block, aItem, aTab, aList, tClass.getMuteID())) { + aList.add( + block.getRegistry() + .getItem(tClass.getMuteID())); } } } @Override - public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, - int ordinalSide, float aHitX, float aHitY, float aHitZ) { + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int ordinalSide, + float hitX, float hitY, float hitZ) { - if (aY < 0 || aY > aWorld.getHeight()) return false; + if (y < 0 || y > world.getHeight()) return false; - if (aPlayer == null) return false; + if (player == null) return false; try { ForgeDirection side = ForgeDirection.getOrientation(ordinalSide); - final Block tClickedBlock = aWorld.getBlock(aX, aY, aZ); + final Block clickedBlock = world.getBlock(x, y, z); - if (tClickedBlock instanceof BlockSnow && (aWorld.getBlockMetadata(aX, aY, aZ) & 7) < 1) { + if (clickedBlock instanceof BlockSnow && (world.getBlockMetadata(x, y, z) & 7) < 1) { ordinalSide = SIDE_TOP; side = ForgeDirection.UP; - } else if (tClickedBlock != Blocks.vine && tClickedBlock != Blocks.tallgrass - && tClickedBlock != Blocks.deadbush - && !tClickedBlock.isReplaceable(aWorld, aX, aY, aZ)) { - aX += side.offsetX; - aY += side.offsetY; - aZ += side.offsetZ; + } else if (clickedBlock != Blocks.vine && clickedBlock != Blocks.tallgrass + && clickedBlock != Blocks.deadbush + && !clickedBlock.isReplaceable(world, x, y, z)) { + x += side.offsetX; + y += side.offsetY; + z += side.offsetZ; } - final Block tReplacedBlock = aWorld.getBlock(aX, aY, aZ); + final Block tReplacedBlock = world.getBlock(x, y, z); - if (!tReplacedBlock.isReplaceable(aWorld, aX, aY, aZ) - || !mBlock.canReplace(aWorld, aX, aY, aZ, ordinalSide, aStack)) { + if (!tReplacedBlock.isReplaceable(world, x, y, z) + || !block.canReplace(world, x, y, z, ordinalSide, stack)) { return false; } - if (aStack.stackSize == 0 || (!aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack))) { + if (stack.stackSize == 0 || (!player.canPlayerEdit(x, y, z, ordinalSide, stack))) { return false; } + // final TileEntity tileEntity = block.getRegistry().getNewTileEntity(world, x, y, z, stack); - final MultiTileEntityContainer MuTEContainer = mBlock.registry - .getNewTileEntityContainer(aWorld, aX, aY, aZ, aStack); - - if (MuTEContainer == null) return false; - - if (!aWorld.setBlock(aX, aY, aZ, MuTEContainer.block, 15 - MuTEContainer.blockMetaData, 2)) { + if (!world.setBlock(x, y, z, block, Items.feather.getDamage(stack), 2)) { return false; } - - MuTEContainer.setMultiTile(aWorld, aX, aY, aZ); + final TileEntity te = world.getTileEntity(x, y, z); + if (!(te instanceof IMultiTileEntity mute)) { + throw new IllegalStateException("TileEntity is not an IMultiTileEntity"); + } + // MuTEContainer.setMultiTile(world, x, y, z); try { - if (((IMultiTileEntity) MuTEContainer.tileEntity) - .onPlaced(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ)) { - aWorld.playSoundEffect( - aX + 0.5, - aY + 0.5, - aZ + 0.5, - MuTEContainer.block.stepSound.func_150496_b(), - (MuTEContainer.block.stepSound.getVolume() + 1) / 2, - MuTEContainer.block.stepSound.getPitch() * 0.8F); + if (mute.onPlaced(stack, player, world, x, y, z, side, hitX, hitY, hitZ)) { + world.playSoundEffect( + x + 0.5, + y + 0.5, + z + 0.5, + block.stepSound.func_150496_b(), + (block.stepSound.getVolume() + 1) / 2, + block.stepSound.getPitch() * 0.8F); } } catch (Throwable e) { GT_FML_LOGGER.error("onPlaced", e); @@ -139,25 +138,25 @@ public class MultiTileEntityItem extends ItemBlock implements IFluidContainerIte // } // spotless:on try { - if (!aWorld.isRemote) { - aWorld.notifyBlockChange(aX, aY, aZ, tReplacedBlock); - aWorld.func_147453_f /* updateNeighborsAboutBlockChange */(aX, aY, aZ, MuTEContainer.block); + if (!world.isRemote) { + world.notifyBlockChange(x, y, z, tReplacedBlock); + world.func_147453_f /* updateNeighborsAboutBlockChange */(x, y, z, block); } } catch (Throwable e) { GT_FML_LOGGER.error("notifyBlockChange", e); } try { - ((IMultiTileEntity) MuTEContainer.tileEntity).onTileEntityPlaced(); + mute.onTileEntityPlaced(); } catch (Throwable e) { GT_FML_LOGGER.error("onTileEntityPlaced", e); } try { - aWorld.func_147451_t /* updateAllLightTypes */(aX, aY, aZ); + world.func_147451_t /* updateAllLightTypes */(x, y, z); } catch (Throwable e) { GT_FML_LOGGER.error("updateAllLightTypes", e); } - aStack.stackSize--; + stack.stackSize--; return true; } catch (Throwable e) { @@ -166,87 +165,6 @@ public class MultiTileEntityItem extends ItemBlock implements IFluidContainerIte return false; } - @Override - public void updateItemStack(ItemStack aStack) { - final MultiTileEntityClassContainer tContainer = mBlock.registry.getClassContainer(aStack); - if (tContainer == null) return; - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null && tTileEntityContainer.tileEntity instanceof IItemUpdatable itemUpdatable) { - itemUpdatable.updateItemStack(aStack); - } - } - - @Override - public void updateItemStack(ItemStack aStack, World aWorld, int aX, int aY, int aZ) { - final MultiTileEntityClassContainer tContainer = mBlock.registry.getClassContainer(aStack); - if (tContainer == null) return; - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null && tTileEntityContainer.tileEntity instanceof IItemUpdatable itemUpdatable) { - itemUpdatable.updateItemStack(aStack, aWorld, aX, aY, aZ); - } - } - - @Override - public int getItemStackLimit(ItemStack aStack) { - final MultiTileEntityClassContainer tContainer = mBlock.registry.getClassContainer(aStack); - if (tContainer == null) return 1; - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - return tContainer.maxStackSize; - } - - @Override - public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - updateItemStack(aStack); - } - - @Override - public FluidStack getFluid(ItemStack aStack) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null - && tTileEntityContainer.tileEntity instanceof IFluidContainerItem fluidContainerItem) { - final FluidStack rFluid = fluidContainerItem.getFluid(aStack); - updateItemStack(aStack); - return rFluid; - } - return null; - } - - @Override - public int getCapacity(ItemStack aStack) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null - && tTileEntityContainer.tileEntity instanceof IFluidContainerItem fluidContainerItem) { - final int rCapacity = fluidContainerItem.getCapacity(aStack); - updateItemStack(aStack); - return rCapacity; - } - return 0; - } - - @Override - public int fill(ItemStack aStack, FluidStack aFluid, boolean aDoFill) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null - && tTileEntityContainer.tileEntity instanceof IFluidContainerItem fluidContainerItem) { - final int tFilled = fluidContainerItem.fill(aStack, aFluid, aDoFill); - updateItemStack(aStack); - return tFilled; - } - return 0; - } - - @Override - public FluidStack drain(ItemStack aStack, int aMaxDrain, boolean aDoDrain) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null - && tTileEntityContainer.tileEntity instanceof IFluidContainerItem fluidContainerItem) { - final FluidStack rFluid = fluidContainerItem.drain(aStack, aMaxDrain, aDoDrain); - updateItemStack(aStack); - return rFluid; - } - return null; - } - @Override public boolean func_150936_a /* canPlaceAtSide */(World aWorld, int aX, int aY, int aZ, int ordinalSide, EntityPlayer aPlayer, ItemStack aStack) { @@ -255,12 +173,15 @@ public class MultiTileEntityItem extends ItemBlock implements IFluidContainerIte @Override public final String getUnlocalizedName() { - return mBlock.registry.getInternalName(); + return block.getRegistry() + .getInternalName(); } @Override public final String getUnlocalizedName(ItemStack aStack) { - return mBlock.registry.getInternalName() + "." + getDamage(aStack); + return block.getRegistry() + .getInternalName() + "." + + getDamage(aStack); } @Override diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java index 7fe83075cd..0b5afbb043 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java @@ -10,7 +10,6 @@ import java.util.List; import net.minecraft.block.Block; import net.minecraft.init.Items; import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -22,7 +21,6 @@ import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap; import appeng.core.CreativeTab; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.LoaderState; -import cpw.mods.fml.common.registry.GameRegistry; import gregtech.api.enums.GT_Values; import gregtech.api.multitileentity.base.MultiTileEntity; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; @@ -39,59 +37,50 @@ public class MultiTileEntityRegistry { // TODO: NBT sensitive or not? Starting with not for now private static final ItemStackMap REGISTRIES = new ItemStackMap<>(false); private static final HashSet> sRegisteredTileEntities = new HashSet<>(); - private final HashMap cachedTileEntityContainers = new HashMap<>(); public HashMap creativeTabs = new HashMap<>(); public final Short2ObjectMap registry = new Short2ObjectOpenHashMap<>(); public List registrations = new ArrayList<>(); private final String internalName; - private final MultiTileEntityBlockRegistryInternal block; - - private static MultiTileEntityBlockRegistryInternal regblock(String internalName, - MultiTileEntityBlockRegistryInternal block, Class itemClass) { - GameRegistry.registerBlock(block, itemClass == null ? ItemBlock.class : itemClass, internalName); - return block; - } - - /** - * @param internalName the internal Name of the Item - */ - public MultiTileEntityRegistry(String internalName) { - this(internalName, new MultiTileEntityBlockRegistryInternal(), MultiTileEntityItem.class); - } + private final MultiTileEntityBlock block; /** * @param internalName the internal Name of the Item */ - public MultiTileEntityRegistry(String internalName, MultiTileEntityBlockRegistryInternal block, - Class itemClass) { - this(internalName, regblock(internalName, block, itemClass)); - } - - /** - * @param internalName the internal Name of the Item - */ - public MultiTileEntityRegistry(String internalName, MultiTileEntityBlockRegistryInternal block) { + public MultiTileEntityRegistry(String internalName, MultiTileEntityBlock block) { if (!Loader.instance() .isInState(LoaderState.PREINITIALIZATION)) { throw new IllegalStateException( "The MultiTileEntity Registry must be initialized during Preload Phase and not before"); } + if (!block.isRegistered()) { + throw new IllegalStateException("Block not registered"); + } this.internalName = internalName; this.block = block; - GT_FML_LOGGER.info(internalName + " " + Block.getIdFromBlock(block) + "This is the answer"); - this.block.registry = this; + GT_FML_LOGGER.info(internalName + " " + Block.getIdFromBlock(block) + " This is the answer"); + this.block.setRegistry(this); REGISTRIES.put(new ItemStack(Item.getItemById(Block.getIdFromBlock(block)), 1, GT_Values.W), this); NAMED_REGISTRIES.put(internalName, this); } - public static TileEntity getCanonicalTileEntity(int aRegistryID, int aMultiTileEntityID) { + public static TileEntity getReferenceTileEntity(int aRegistryID, int aMultiTileEntityID) { final MultiTileEntityRegistry tRegistry = getRegistry(aRegistryID); if (tRegistry == null) return null; final MultiTileEntityClassContainer tClassContainer = tRegistry.getClassContainer(aMultiTileEntityID); if (tClassContainer == null) return null; - return tClassContainer.referenceTileEntity; + return tClassContainer.getReferenceTileEntity(); + } + + public MultiTileEntity getReferenceTileEntity(ItemStack stack) { + return getReferenceTileEntity(Items.feather.getDamage(stack)); + } + + public MultiTileEntity getReferenceTileEntity(int metaId) { + final MultiTileEntityClassContainer muteClass = registry.get((short) metaId); + if (muteClass == null) return null; + return muteClass.getReferenceTileEntity(); } public static MultiTileEntityRegistry getRegistry(int aRegistryID) { @@ -120,27 +109,27 @@ public class MultiTileEntityRegistry { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container is null!"); tFailed = true; } else { - if (aClassContainer.muteClass == null) { + if (aClassContainer.getMuteClass() == null) { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class inside Class Container is null!"); tFailed = true; } - if (aClassContainer.muteID == GT_Values.W) { + if (aClassContainer.getMuteID() == GT_Values.W) { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses Wildcard MetaData!"); tFailed = true; } - if (aClassContainer.muteID < 0) { + if (aClassContainer.getMuteID() < 0) { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses negative MetaData!"); tFailed = true; } - if (registry.containsKey(aClassContainer.muteID)) { + if (registry.containsKey(aClassContainer.getMuteID())) { GT_FML_LOGGER.error( - "MULTI-TILE REGISTRY ERROR: Class Container uses occupied MetaData! (" + aClassContainer.muteID + "MULTI-TILE REGISTRY ERROR: Class Container uses occupied MetaData! (" + aClassContainer.getMuteID() + ")"); tFailed = true; } } if (tFailed) { - GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: STACKTRACE START"); + GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR " + aLocalised + " : STACKTRACE START"); int i = 0; for (StackTraceElement tElement : new Exception().getStackTrace()) if (i++ < 5 && !tElement.getClassName() .startsWith("sun")) GT_FML_LOGGER.error("\tat " + tElement); @@ -149,16 +138,20 @@ public class MultiTileEntityRegistry { return null; } - GT_LanguageManager.addStringLocalization(internalName + "." + aClassContainer.muteID + ".name", aLocalised); - registry.put(aClassContainer.muteID, aClassContainer); - mLastRegisteredID = aClassContainer.muteID; + GT_LanguageManager + .addStringLocalization(internalName + "." + aClassContainer.getMuteID() + ".name", aLocalised); + registry.put(aClassContainer.getMuteID(), aClassContainer); + mLastRegisteredID = aClassContainer.getMuteID(); registrations.add(aClassContainer); - if (sRegisteredTileEntities.add(aClassContainer.referenceTileEntity.getClass())) { - aClassContainer.referenceTileEntity.onRegistrationFirst(this, aClassContainer.muteID); + if (sRegisteredTileEntities.add( + aClassContainer.getReferenceTileEntity() + .getClass())) { + aClassContainer.getReferenceTileEntity() + .onRegistrationFirst(this, aClassContainer.getMuteID()); } - return getItem(aClassContainer.muteID); + return getItem(aClassContainer.getMuteID()); } public short mLastRegisteredID = GT_Values.W; @@ -179,15 +172,15 @@ public class MultiTileEntityRegistry { return getItem(aID, aAmount, null); } - public ItemStack getItem(int aID, long aAmount, NBTTagCompound nbt) { - final ItemStack rStack = new ItemStack(block, (int) aAmount, aID); + public ItemStack getItem(int metaID, long amount, NBTTagCompound nbt) { + final ItemStack stack = new ItemStack(block, (int) amount, metaID); if (nbt == null || nbt.hasNoTags()) { nbt = new NBTTagCompound(); - final MultiTileEntityContainer tTileEntityContainer = getNewTileEntityContainer(aID, nbt); - if (tTileEntityContainer != null) ((IMultiTileEntity) tTileEntityContainer.tileEntity).writeItemNBT(nbt); + final TileEntity tileEntity = getNewTileEntity(metaID, nbt); + ((IMultiTileEntity) tileEntity).writeItemNBT(nbt); } - rStack.setTagCompound(nbt); - return rStack; + stack.setTagCompound(nbt); + return stack; } public String getLocal(int aID) { @@ -203,84 +196,37 @@ public class MultiTileEntityRegistry { } public TileEntity getNewTileEntity(int aID) { - final MultiTileEntityContainer tContainer = getNewTileEntityContainer(null, 0, 0, 0, aID, null); - return tContainer == null ? null : tContainer.tileEntity; - } - - public MultiTileEntityContainer getNewTileEntityContainer(World world, int x, int y, int z, int aID, - NBTTagCompound nbt) { - final MultiTileEntityClassContainer tClass = registry.get((short) aID); - if (tClass == null || tClass.block == null) return null; - final MultiTileEntityContainer container = new MultiTileEntityContainer( - (MultiTileEntity) GT_Utility.callConstructor(tClass.muteClass, -1, null, true), - tClass.block, - tClass.blockMetaData); - if (container.tileEntity == null) return null; - final MultiTileEntity tileEntity = container.tileEntity; - tileEntity.setWorldObj(world); - tileEntity.xCoord = x; - tileEntity.yCoord = y; - tileEntity.zCoord = z; - tileEntity.initFromNBT( - nbt == null || nbt.hasNoTags() ? tClass.parameters : GT_Util.fuseNBT(nbt, tClass.parameters), - (short) aID, - (short) Block.getIdFromBlock(block)); - return container; - } - - public TileEntity getNewTileEntity(World world, int x, int y, int z, int aID) { - final MultiTileEntityContainer tContainer = getNewTileEntityContainer(world, x, y, z, aID, null); - return tContainer == null ? null : tContainer.tileEntity; - } - - public TileEntity getNewTileEntity(ItemStack stack) { - final MultiTileEntityContainer tContainer = getNewTileEntityContainer( - null, - 0, - 0, - 0, - Items.feather.getDamage(stack), - stack.getTagCompound()); - return tContainer == null ? null : tContainer.tileEntity; - } - - public TileEntity getNewTileEntity(World world, int x, int y, int z, ItemStack stack) { - final MultiTileEntityContainer tContainer = getNewTileEntityContainer( - world, - x, - y, - z, - Items.feather.getDamage(stack), - stack.getTagCompound()); - return tContainer == null ? null : tContainer.tileEntity; - } - - public MultiTileEntityContainer getCachedTileEntityContainer(ItemStack stack) { - MultiTileEntityContainer container = cachedTileEntityContainers.get(Items.feather.getDamage(stack)); - if (container == null) { - container = getNewTileEntityContainer(stack); - cachedTileEntityContainers.put(Items.feather.getDamage(stack), container); - } - return container; + return getNewTileEntity(null, 0, 0, 0, aID); } - public MultiTileEntityContainer getNewTileEntityContainer(ItemStack stack) { - return getNewTileEntityContainer(null, 0, 0, 0, Items.feather.getDamage(stack), stack.getTagCompound()); + public TileEntity getNewTileEntity(World aWorld, int x, int y, int z, int metaID) { + return getNewTileEntity(aWorld, x, y, z, metaID, null); } - public MultiTileEntityContainer getNewTileEntityContainer(World world, int x, int y, int z, ItemStack stack) { - return getNewTileEntityContainer(world, x, y, z, Items.feather.getDamage(stack), stack.getTagCompound()); + public TileEntity getNewTileEntity(World aWorld, int x, int y, int z, int metaID, NBTTagCompound nbt) { + final MultiTileEntityClassContainer container = registry.get((short) metaID); + if (container == null) return null; + final MultiTileEntity te = (MultiTileEntity) GT_Utility + .callConstructor(container.getMuteClass(), -1, null, true); + te.setWorldObj(aWorld); + te.xCoord = x; + te.yCoord = y; + te.zCoord = z; + nbt = (nbt == null || nbt.hasNoTags()) ? container.getParameters() + : GT_Util.fuseNBT(nbt, container.getParameters()); + te.initFromNBT(nbt, (short) metaID, (short) Block.getIdFromBlock(block)); + return te; } - public MultiTileEntityContainer getNewTileEntityContainer(int aID, NBTTagCompound nbt) { - return getNewTileEntityContainer(null, 0, 0, 0, aID, nbt); + public TileEntity getNewTileEntity(int meta, NBTTagCompound nbt) { + return getNewTileEntity(null, 0, 0, 0, meta, nbt); } public String getInternalName() { return internalName; } - public MultiTileEntityBlockRegistryInternal getBlock() { + public MultiTileEntityBlock getBlock() { return block; } } diff --git a/src/main/java/gregtech/api/multitileentity/WeakTargetRef.java b/src/main/java/gregtech/api/multitileentity/WeakTargetRef.java new file mode 100644 index 0000000000..1509384f5e --- /dev/null +++ b/src/main/java/gregtech/api/multitileentity/WeakTargetRef.java @@ -0,0 +1,88 @@ +package gregtech.api.multitileentity; + +import java.lang.ref.WeakReference; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; + +import gregtech.api.multitileentity.interfaces.IMultiTileEntity; + +public class WeakTargetRef { + + protected final ChunkCoordinates position = new ChunkCoordinates(0, -1, 0); + protected final Class targetClass; + protected boolean shouldCache; + protected WeakReference target = new WeakReference<>(null); + protected World world = null; + + public WeakTargetRef(Class targetClass, boolean shouldCache) { + this.targetClass = targetClass; + this.shouldCache = shouldCache; + } + + public WeakTargetRef(T target, boolean shouldCache) { + this(target.getClass(), shouldCache); + setTarget(target); + } + + public void setTarget(T newTarget) { + if (!targetClass.isInstance(newTarget)) { + throw new IllegalArgumentException("Target is not of the correct type"); + } + position.set(newTarget.getXCoord(), newTarget.getYCoord(), newTarget.getZCoord()); + world = newTarget.getWorld(); + } + + public void setWorld(World world) { + this.world = world; + } + + public void setPosition(ChunkCoordinates position) { + this.position.set(position.posX, position.posY, position.posZ); + } + + public void setPosition(int x, int y, int z) { + this.position.set(x, y, z); + } + + public void setShouldCache(boolean shouldCache) { + this.shouldCache = shouldCache; + } + + public T get() { + if (!shouldCache) { + return resolveTarget(); + } + T result = target.get(); + if (result == null || result.isDead()) { + result = resolveTarget(); + if (result != null) { + target = new WeakReference<>(result); + } else { + target.clear(); + } + } + return result; + } + + @SuppressWarnings("unchecked") + protected T resolveTarget() { + if (world != null && position.posX >= 0 && world.blockExists(position.posX, position.posY, position.posZ)) { + final TileEntity te = world.getTileEntity(position.posX, position.posY, position.posZ); + return this.targetClass.isInstance(te) ? (T) te : null; + } + return null; + } + + public ChunkCoordinates getPosition() { + return position; + } + + public void invalidate() { + target.clear(); + world = null; + position.set(0, -1, 0); + } + +} diff --git a/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java index 85f9f2497a..eeadfe7602 100644 --- a/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java +++ b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java @@ -47,7 +47,7 @@ import gregtech.api.gui.modularui.GT_UIInfos; import gregtech.api.interfaces.ITexture; import gregtech.api.metatileentity.CoverableTileEntity; import gregtech.api.metatileentity.GregTechTileClientEvents; -import gregtech.api.multitileentity.MultiTileEntityBlockRegistryInternal; +import gregtech.api.multitileentity.MultiTileEntityBlock; import gregtech.api.multitileentity.MultiTileEntityClassContainer; import gregtech.api.multitileentity.MultiTileEntityRegistry; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; @@ -171,12 +171,11 @@ public abstract class MultiTileEntity extends CoverableTileEntity @Override public void copyTextures() { // Loading an instance - final TileEntity tCanonicalTileEntity = MultiTileEntityRegistry - .getCanonicalTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID()); - if (!(tCanonicalTileEntity instanceof MultiTileEntity)) { + final TileEntity referenceTileEntity = MultiTileEntityRegistry + .getReferenceTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID()); + if (!(referenceTileEntity instanceof MultiTileEntity canonicalEntity)) { return; } - final MultiTileEntity canonicalEntity = (MultiTileEntity) tCanonicalTileEntity; baseTexture = canonicalEntity.baseTexture; topOverlayTexture = canonicalEntity.topOverlayTexture; bottomOverlayTexture = canonicalEntity.bottomOverlayTexture; @@ -225,7 +224,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity if (tClass != null) { // Add the Default Parameters. Useful for things that differ between different tiers/types of the // same machine - nbt = GT_Util.fuseNBT(nbt, tClass.parameters); + nbt = GT_Util.fuseNBT(nbt, tClass.getParameters()); } } } @@ -996,8 +995,8 @@ public abstract class MultiTileEntity extends CoverableTileEntity } @Override - public boolean getSubItems(MultiTileEntityBlockRegistryInternal block, Item item, CreativeTabs tab, - List list, short aID) { + public boolean getSubItems(MultiTileEntityBlock block, Item item, CreativeTabs tab, List list, + short aID) { return true; } @@ -1378,4 +1377,9 @@ public abstract class MultiTileEntity extends CoverableTileEntity getTimedPacketData(timedPacket); GT_Values.NW.sendPacketToAllPlayersInRange(worldObj, timedPacket, getXCoord(), getZCoord()); } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + } } diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java b/src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java deleted file mode 100644 index 89d281eb27..0000000000 --- a/src/main/java/gregtech/api/multitileentity/interfaces/IItemUpdatable.java +++ /dev/null @@ -1,19 +0,0 @@ -package gregtech.api.multitileentity.interfaces; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public interface IItemUpdatable { - - /** - * Updates the Data of the ItemStack. Not called every tick but instead called whenever something important happens - * to the Stack. - */ - void updateItemStack(ItemStack aStack); - - /** - * Updates the Data of the ItemStack. Not called every tick but instead called whenever something important happens - * to the Stack. - */ - void updateItemStack(ItemStack aStack, World aWorld, int aX, int aY, int aZ); -} diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java index b239f4c4c0..f5bbbec7ab 100644 --- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java +++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java @@ -12,8 +12,6 @@ public interface IMultiBlockPart extends IMultiTileEntity, ItemInventoryLogicHos ChunkCoordinates getTargetPos(); - void setTargetPos(ChunkCoordinates aTargetPos); - void setLockedInventoryIndex(int aIndex); int getLockedInventoryIndex(); diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java index d504e34c25..b16ca8a376 100644 --- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java +++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java @@ -21,7 +21,7 @@ import net.minecraftforge.common.util.ForgeDirection; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IDebugableTileEntity; import gregtech.api.interfaces.tileentity.ITurnable; -import gregtech.api.multitileentity.MultiTileEntityBlockRegistryInternal; +import gregtech.api.multitileentity.MultiTileEntityBlock; import gregtech.api.multitileentity.MultiTileEntityRegistry; /* @@ -169,8 +169,7 @@ public interface IMultiTileEntity extends ICoverable, ITurnable, IDebugableTileE boolean recolourBlock(ForgeDirection side, byte aColor); /** Adds to the Creative Tab. return false to prevent it from being added. */ - boolean getSubItems(MultiTileEntityBlockRegistryInternal block, Item item, CreativeTabs tab, List list, - short aID); + boolean getSubItems(MultiTileEntityBlock block, Item item, CreativeTabs tab, List list, short aID); ItemStack getPickBlock(MovingObjectPosition aTarget); diff --git a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java index 4b348c2fec..0953b4905c 100644 --- a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java +++ b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java @@ -246,7 +246,7 @@ public abstract class MultiTileBasicMachine

> ex public void copyTextures() { super.copyTextures(); final TileEntity tCanonicalTileEntity = MultiTileEntityRegistry - .getCanonicalTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID()); + .getReferenceTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID()); if (!(tCanonicalTileEntity instanceof MultiTileBasicMachine)) { return; } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java index 442d37a47a..552cf6d94e 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java @@ -4,11 +4,9 @@ import static gregtech.api.util.GT_Utility.moveMultipleItemStacks; import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser; import static mcp.mobius.waila.api.SpecialChars.*; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -16,6 +14,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -31,6 +30,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidStack; +import org.jetbrains.annotations.NotNull; import org.lwjgl.input.Keyboard; import com.gtnewhorizon.structurelib.StructureLibAPI; @@ -57,6 +57,7 @@ import gregtech.api.logic.FluidInventoryLogic; import gregtech.api.logic.ItemInventoryLogic; import gregtech.api.logic.MuTEProcessingLogic; import gregtech.api.logic.PowerLogic; +import gregtech.api.multitileentity.WeakTargetRef; import gregtech.api.multitileentity.enums.MultiTileCasingPurpose; import gregtech.api.multitileentity.interfaces.IMultiBlockController; import gregtech.api.multitileentity.interfaces.IMultiBlockPart; @@ -81,8 +82,8 @@ public abstract class Controller, P extends MuTEProce protected static final int AUTO_OUTPUT_FREQUENCY_TICK = 20; private static final Map tooltip = new ConcurrentHashMap<>(); - private final List upgradeCasings = new ArrayList<>(); - private final List functionalCasings = new ArrayList<>(); + private final List> upgradeCasings = new ArrayList<>(); + private final List> functionalCasings = new ArrayList<>(); protected BuildState buildState = new BuildState(); private boolean structureOkay = false, structureChanged = false; @@ -104,20 +105,20 @@ public abstract class Controller, P extends MuTEProce // A list of sides // Each side has a list of parts that have a cover that need to be ticked - protected List>> registeredCoveredParts = Arrays.asList( - new LinkedList<>(), - new LinkedList<>(), - new LinkedList<>(), - new LinkedList<>(), - new LinkedList<>(), - new LinkedList<>()); + protected List>> registeredCoveredParts = Arrays.asList( + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>()); // A list for each purpose that a casing can register to, to be ticked - protected List>> registeredTickableParts = new ArrayList<>(); + protected List>> registeredTickableParts = new ArrayList<>(); public Controller() { for (int i = 0; i < MultiTileCasingPurpose.values().length; i++) { - registeredTickableParts.add(new LinkedList<>()); + registeredTickableParts.add(new ArrayList<>()); } } @@ -157,11 +158,13 @@ public abstract class Controller, P extends MuTEProce } protected void calculateTier() { - double sum = 0; - if (functionalCasings == null || functionalCasings.size() == 0) { + if (functionalCasings.size() == 0) { return; } - for (FunctionalCasing casing : functionalCasings) { + double sum = 0; + for (WeakTargetRef casingRef : functionalCasings) { + final FunctionalCasing casing = casingRef.get(); + if (casing == null) continue; sum += casing.getPartTier() * casing.getPartModifier(); } tier = (int) Math.min(Math.floor(sum / functionalCasings.size()), 14); @@ -432,17 +435,17 @@ public abstract class Controller, P extends MuTEProce public void registerCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part) { if (side == ForgeDirection.UNKNOWN) return; - final LinkedList> registeredCovers = registeredCoveredParts.get(side.ordinal()); + final List> registeredCovers = registeredCoveredParts.get(side.ordinal()); // TODO: Make sure that we're not already registered on this side - registeredCovers.add(new WeakReference<>(part)); + registeredCovers.add(new WeakTargetRef<>(part, true)); } @Override public void unregisterCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart aPart) { if (side == ForgeDirection.UNKNOWN) return; - final LinkedList> coveredParts = registeredCoveredParts.get(side.ordinal()); - final Iterator> it = coveredParts.iterator(); + final List> coveredParts = registeredCoveredParts.get(side.ordinal()); + final Iterator> it = coveredParts.listIterator(); while (it.hasNext()) { final IMultiBlockPart part = (it.next()).get(); if (part == null || part == aPart) it.remove(); @@ -451,8 +454,8 @@ public abstract class Controller, P extends MuTEProce @Override public void registerCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part) { - final LinkedList> tickableParts = registeredTickableParts.get(purpose.ordinal()); - final Iterator> it = tickableParts.iterator(); + final List> tickableParts = registeredTickableParts.get(purpose.ordinal()); + final Iterator> it = tickableParts.listIterator(); while (it.hasNext()) { final IMultiBlockPart next = (it.next()).get(); if (next == null) { @@ -461,13 +464,13 @@ public abstract class Controller, P extends MuTEProce return; } } - tickableParts.add(new WeakReference<>(part)); + tickableParts.add(new WeakTargetRef<>(part, true)); } @Override public void unregisterCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part) { - final LinkedList> tickableParts = registeredTickableParts.get(purpose.ordinal()); - final Iterator> it = tickableParts.iterator(); + final List> tickableParts = registeredTickableParts.get(purpose.ordinal()); + final Iterator> it = tickableParts.listIterator(); while (it.hasNext()) { final IMultiBlockPart next = (it.next()).get(); if (next == null || next == part) it.remove(); @@ -487,9 +490,8 @@ public abstract class Controller, P extends MuTEProce private boolean tickCovers() { for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { // TODO: Tick controller covers, if any - final LinkedList> coveredParts = this.registeredCoveredParts - .get(side.ordinal()); - final Iterator> it = coveredParts.iterator(); + final List> coveredParts = this.registeredCoveredParts.get(side.ordinal()); + final Iterator> it = coveredParts.listIterator(); while (it.hasNext()) { final IMultiBlockPart part = (it.next()).get(); if (part == null) { @@ -505,9 +507,7 @@ public abstract class Controller, P extends MuTEProce @Override public void onTick(long tick, boolean isServerSide) { - if (!tickCovers()) { - return; - } + tickCovers(); } @Override @@ -535,9 +535,9 @@ public abstract class Controller, P extends MuTEProce protected void pushItemOutputs(long tick) { if (tick % AUTO_OUTPUT_FREQUENCY_TICK != 0) return; - final LinkedList> registeredItemOutputs = registeredTickableParts + final List> registeredItemOutputs = registeredTickableParts .get(MultiTileCasingPurpose.ItemOutput.ordinal()); - final Iterator> itemOutputIterator = registeredItemOutputs.iterator(); + final Iterator> itemOutputIterator = registeredItemOutputs.listIterator(); while (itemOutputIterator.hasNext()) { final IMultiBlockPart part = (itemOutputIterator.next()).get(); if (part == null) { @@ -567,7 +567,8 @@ public abstract class Controller, P extends MuTEProce (byte) 1, part.getSizeInventory()); for (int i = 0; i < part.getSizeInventory(); i++) { - if (part.getStackInSlot(i) != null && part.getStackInSlot(i).stackSize <= 0) { + final ItemStack stack = part.getStackInSlot(i); + if (stack != null && stack.stackSize <= 0) { part.setInventorySlotContents(i, null); } } @@ -577,9 +578,9 @@ public abstract class Controller, P extends MuTEProce protected void pushFluidOutputs(long tick) { if (tick % AUTO_OUTPUT_FREQUENCY_TICK != 0) return; - final LinkedList> registeredFluidOutputs = registeredTickableParts + final List> registeredFluidOutputs = registeredTickableParts .get(MultiTileCasingPurpose.FluidOutput.ordinal()); - final Iterator> fluidOutputIterator = registeredFluidOutputs.iterator(); + final Iterator> fluidOutputIterator = registeredFluidOutputs.listIterator(); while (fluidOutputIterator.hasNext()) { final IMultiBlockPart part = (fluidOutputIterator.next()).get(); if (part == null) { @@ -694,11 +695,11 @@ public abstract class Controller, P extends MuTEProce } public void registerSpecialCasings(MultiBlockPart part) { - if (part instanceof UpgradeCasing) { - upgradeCasings.add((UpgradeCasing) part); + if (part instanceof UpgradeCasing upgradeCasing) { + upgradeCasings.add(new WeakTargetRef<>(upgradeCasing, true)); } - if (part instanceof FunctionalCasing) { - functionalCasings.add((FunctionalCasing) part); + if (part instanceof FunctionalCasing functionalCasing) { + functionalCasings.add(new WeakTargetRef<>(functionalCasing, true)); } } @@ -715,12 +716,13 @@ public abstract class Controller, P extends MuTEProce }; } - @Nullable - public FluidInventoryLogic getFluidLogic(@Nonnull InventoryType type, @Nullable UUID id) { + @Override + @Nonnull + public @NotNull FluidInventoryLogic getFluidLogic(@Nonnull InventoryType type, @Nullable UUID id) { return switch (type) { case Input -> controllerFluidInput.getInventoryLogic(id); case Output -> controllerFluidOutput.getInventoryLogic(id); - default -> null; + default -> throw new IllegalStateException("Unexpected value: " + type); }; } @@ -753,9 +755,8 @@ public abstract class Controller, P extends MuTEProce FluidInventoryLogic input = controllerFluidInput.removeInventory(id); FluidInventoryLogic output = controllerFluidOutput.removeInventory(id); yield new FluidInventoryLogic( - Arrays.asList(input, output) - .stream() - .map(inv -> inv.getInventory()) + Stream.of(input, output) + .map(FluidInventoryLogic::getInventory) .collect(Collectors.toList())); } }; @@ -794,12 +795,12 @@ public abstract class Controller, P extends MuTEProce } @Override - @Nullable + @Nonnull public ItemInventoryLogic getItemLogic(@Nonnull InventoryType type, @Nullable UUID id) { return switch (type) { case Input -> controllerItemInput.getInventoryLogic(id); case Output -> controllerItemOutput.getInventoryLogic(id); - default -> null; + default -> throw new IllegalStateException("Unexpected value: " + type); }; } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java index 2b030899ed..5a16ed4b38 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java @@ -48,6 +48,7 @@ import gregtech.api.logic.NullPowerLogic; import gregtech.api.logic.PowerLogic; import gregtech.api.logic.interfaces.PowerLogicHost; import gregtech.api.multitileentity.MultiTileEntityRegistry; +import gregtech.api.multitileentity.WeakTargetRef; import gregtech.api.multitileentity.base.NonTickableMultiTileEntity; import gregtech.api.multitileentity.enums.MultiTileCasingPurpose; import gregtech.api.multitileentity.interfaces.IMultiBlockController; @@ -70,7 +71,9 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity protected Set registeredPurposes = new HashSet<>(); - protected ChunkCoordinates targetPosition = null; + protected final WeakTargetRef controller = new WeakTargetRef<>( + IMultiBlockController.class, + false); protected int allowedModes = NOTHING; // BITMASK - Modes allowed for this part protected int mode = 0; // Mode selected for this part @@ -95,17 +98,17 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity return lockedInventory; } - public void setTarget(IMultiBlockController newTarget, int aAllowedModes) { - final IMultiBlockController currentTarget = getTarget(false); - if (currentTarget != null && currentTarget != newTarget) { + public void setTarget(IMultiBlockController newController, int aAllowedModes) { + final IMultiBlockController currentController = getTarget(false); + if (currentController != null && currentController != newController) { for (MultiTileCasingPurpose purpose : registeredPurposes) { unregisterPurpose(purpose); } } - targetPosition = (newTarget == null ? null : newTarget.getCoords()); + allowedModes = aAllowedModes; - if (newTarget != null) { - registerCovers(newTarget); + if (newController != currentController) { + registerCovers(newController); registerPurposes(); } } @@ -156,26 +159,11 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity } public IMultiBlockController getTarget(boolean aCheckValidity) { - if (targetPosition == null) { - return null; - } - - if (!worldObj.blockExists(targetPosition.posX, targetPosition.posY, targetPosition.posZ)) { - return null; - } - final TileEntity te = worldObj.getTileEntity(targetPosition.posX, targetPosition.posY, targetPosition.posZ); - IMultiBlockController target = null; - if (te instanceof IMultiBlockController targetFound) { - target = targetFound; - } else { - targetPosition = null; - return null; - } - - if (aCheckValidity) { - return target != null && target.checkStructure(false) ? target : null; + final IMultiBlockController res = controller.get(); + if (res != null && aCheckValidity) { + return res.checkStructure(false) ? res : null; } - return target; + return res; } public void registerCovers(IMultiBlockController controller) { @@ -232,10 +220,9 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity if (aNBT.hasKey(NBT.ALLOWED_MODES)) allowedModes = aNBT.getInteger(NBT.ALLOWED_MODES); if (aNBT.hasKey(NBT.MODE)) setMode(aNBT.getByte(NBT.MODE)); if (aNBT.hasKey(NBT.TARGET)) { - targetPosition = new ChunkCoordinates( - aNBT.getInteger(NBT.TARGET_X), - aNBT.getShort(NBT.TARGET_Y), - aNBT.getInteger(NBT.TARGET_Z)); + controller + .setPosition(aNBT.getInteger(NBT.TARGET_X), aNBT.getShort(NBT.TARGET_Y), aNBT.getInteger(NBT.TARGET_Z)); + controller.setWorld(worldObj); } if (aNBT.hasKey(NBT.LOCKED_INVENTORY)) { lockedInventory = UUID.fromString(aNBT.getString(NBT.LOCKED_INVENTORY)); @@ -255,27 +242,31 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity } @Override - public void writeMultiTileNBT(NBTTagCompound aNBT) { - if (allowedModes != NOTHING) aNBT.setInteger(NBT.ALLOWED_MODES, allowedModes); - if (mode != 0) aNBT.setInteger(NBT.MODE, mode); - if (targetPosition != null) { - aNBT.setBoolean(NBT.TARGET, true); - aNBT.setInteger(NBT.TARGET_X, targetPosition.posX); - aNBT.setShort(NBT.TARGET_Y, (short) targetPosition.posY); - aNBT.setInteger(NBT.TARGET_Z, targetPosition.posZ); + public void writeMultiTileNBT(NBTTagCompound nbt) { + if (allowedModes != NOTHING) nbt.setInteger(NBT.ALLOWED_MODES, allowedModes); + if (mode != 0) nbt.setInteger(NBT.MODE, mode); + + final ChunkCoordinates pos = controller.getPosition(); + if (pos.posY >= 0) { + // Valid position + nbt.setBoolean(NBT.TARGET, true); + nbt.setInteger(NBT.TARGET_X, pos.posX); + nbt.setShort(NBT.TARGET_Y, (short) pos.posY); + nbt.setInteger(NBT.TARGET_Z, pos.posZ); } + if (lockedInventory != null) { - aNBT.setString(NBT.LOCKED_INVENTORY, lockedInventory.toString()); + nbt.setString(NBT.LOCKED_INVENTORY, lockedInventory.toString()); } if (mLockedInventoryIndex != 0) { - aNBT.setInteger(NBT.LOCKED_INVENTORY_INDEX, mLockedInventoryIndex); + nbt.setInteger(NBT.LOCKED_INVENTORY_INDEX, mLockedInventoryIndex); } - configurationTank.writeToNBT(aNBT, NBT.LOCKED_FLUID); + configurationTank.writeToNBT(nbt, NBT.LOCKED_FLUID); } @Override - public void setLockedInventoryIndex(int aIndex) { - mLockedInventoryIndex = aIndex; + public void setLockedInventoryIndex(int index) { + mLockedInventoryIndex = index; } @Override @@ -283,16 +274,9 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity return mLockedInventoryIndex; } - @Override - public void setTargetPos(ChunkCoordinates aTargetPos) { - targetPosition = aTargetPos; - IMultiBlockController target = getTarget(false); - setTarget(target, allowedModes); - } - @Override public ChunkCoordinates getTargetPos() { - return targetPosition; + return controller.getPosition(); } @Override diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java index 7005e3a60a..238ce1eb2d 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java @@ -8,32 +8,34 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; import net.minecraftforge.common.util.ForgeDirection; +import gregtech.api.multitileentity.WeakTargetRef; import gregtech.api.multitileentity.interfaces.IMultiBlockController; public class WallShareablePart extends MultiBlockPart { - protected List targetPositions = new ArrayList<>(); + protected List> targets = new ArrayList<>(); @Override - public void setTarget(IMultiBlockController aTarget, int aAllowedModes) { - if (targetPositions.size() >= 1) { - allowedModes = 0; + public void setTarget(IMultiBlockController newController, int allowedModes) { + if (targets.size() >= 1) { + this.allowedModes = 0; setMode((byte) 0); - targetPosition = null; + controller.invalidate(); } else { - allowedModes = aAllowedModes; + this.allowedModes = allowedModes; + controller.setTarget(newController); } - if (aTarget == null) { + if (newController == null) { return; } - targetPositions.add(aTarget.getCoords()); + targets.add(new WeakTargetRef(IMultiBlockController.class, true)); } @Override public UUID getLockedInventory() { - if (targetPositions.size() > 1) { + if (targets.size() > 1) { return null; } return super.getLockedInventory(); @@ -41,11 +43,13 @@ public class WallShareablePart extends MultiBlockPart { @Override public IMultiBlockController getTarget(boolean aCheckValidity) { - if (targetPositions.size() != 1) { + if (targets.size() != 1) { return null; } - targetPosition = targetPositions.get(0); + controller.setTarget( + targets.get(0) + .get()); return super.getTarget(aCheckValidity); } @@ -56,8 +60,8 @@ public class WallShareablePart extends MultiBlockPart { @Override public boolean onBlockBroken() { - for (final ChunkCoordinates coordinates : targetPositions) { - IMultiBlockController target = getTarget(coordinates, false); + for (final WeakTargetRef tar : targets) { + IMultiBlockController target = getTarget(tar.getPosition(), false); if (target == null) { continue; } @@ -73,8 +77,8 @@ public class WallShareablePart extends MultiBlockPart { if (te instanceof MultiBlockPart part) { final IMultiBlockController tController = part.getTarget(false); if (tController != null) tController.onStructureChange(); - } else if (te instanceof IMultiBlockController controller) { - controller.onStructureChange(); + } else if (te instanceof IMultiBlockController tController) { + tController.onStructureChange(); } } } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java index fb045557e4..566afcd770 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java @@ -16,8 +16,8 @@ public abstract class UpgradeCasing extends MultiBlockPart { } @Override - public void setTarget(IMultiBlockController newTarget, int aAllowedModes) { - super.setTarget(newTarget, aAllowedModes); + public void setTarget(IMultiBlockController newController, int aAllowedModes) { + super.setTarget(newController, aAllowedModes); if (getTarget(false) != null) { customWork(getTarget(false)); diff --git a/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java b/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java index 4010fae3bc..a4c4630209 100644 --- a/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java +++ b/src/main/java/gregtech/api/util/GT_StructureUtilityMuTE.java @@ -19,11 +19,10 @@ import com.gtnewhorizon.structurelib.structure.IStructureElement; import gregtech.api.enums.GT_Values; import gregtech.api.enums.OrePrefixes; import gregtech.api.enums.TextureSet; -import gregtech.api.multitileentity.MultiTileEntityContainer; +import gregtech.api.multitileentity.MultiTileEntityBlock; import gregtech.api.multitileentity.MultiTileEntityRegistry; import gregtech.api.multitileentity.enums.GT_MultiTileUpgradeCasing; import gregtech.api.multitileentity.interfaces.IMultiBlockController; -import gregtech.api.multitileentity.interfaces.IMultiTileEntity; import gregtech.api.multitileentity.multiblock.base.Controller; import gregtech.api.multitileentity.multiblock.base.MultiBlockPart; @@ -189,25 +188,18 @@ public class GT_StructureUtilityMuTE { @Override public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { - final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry - .getRegistry(validCasings[0].getRegistryId()); - if (tRegistry == null) { + final int registryID = validCasings[0].getRegistryId(); + final MultiTileEntityRegistry registry = MultiTileEntityRegistry.getRegistry(registryID); + if (registry == null) { GT_FML_LOGGER.error("NULL REGISTRY"); return false; } - final MultiTileEntityContainer tContainer = tRegistry - .getNewTileEntityContainer(world, x, y, z, validCasings[0].defaultMeta, null); - if (tContainer == null) { - GT_FML_LOGGER.error("NULL CONTAINER"); - return false; - } - final IMultiTileEntity te = ((IMultiTileEntity) tContainer.tileEntity); - if (!(te instanceof MultiBlockPart)) { - GT_FML_LOGGER.error("Not a multiblock part"); - return false; - } - if (world.setBlock(x, y, z, tContainer.block, 15 - tContainer.blockMetaData, 2)) { - tContainer.setMultiTile(world, x, y, z); + final MultiTileEntityBlock block = registry.getBlock(); + if (world.setBlock(x, y, z, block, allowedCasings[0].getDefaultMeta(), 2)) { + final TileEntity te = world.getTileEntity(x, y, z); + if (!(te instanceof MultiBlockPart)) { + throw new IllegalStateException("TE is not an MultiBlockPart"); + } ((MultiBlockPart) te).setTarget((IMultiBlockController) t, modes); ((Controller) t).registerSpecialCasings((MultiBlockPart) te); @@ -233,7 +225,7 @@ public class GT_StructureUtilityMuTE { private final Integer[] validIds; public MuTEStructureCasing(String registryName, Integer... validIds) { - MultiTileEntityRegistry registry = MultiTileEntityRegistry.getRegistry(registryName); + final MultiTileEntityRegistry registry = MultiTileEntityRegistry.getRegistry(registryName); if (validIds == null || validIds.length == 0 || registry == null) { throw new IllegalArgumentException(); } diff --git a/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java b/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java index b34c577834..c8c1d832b0 100644 --- a/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java +++ b/src/main/java/gregtech/common/render/GT_MultiTile_Renderer.java @@ -16,7 +16,7 @@ import gregtech.GT_Mod; import gregtech.api.interfaces.ITexture; import gregtech.api.logic.ModelRenderLogic; import gregtech.api.logic.interfaces.ModelRenderLogicHost; -import gregtech.api.multitileentity.MultiTileEntityBlockRegistryInternal; +import gregtech.api.multitileentity.MultiTileEntityBlock; import gregtech.api.multitileentity.MultiTileEntityClassContainer; import gregtech.api.multitileentity.MultiTileEntityRegistry; import gregtech.api.multitileentity.interfaces.IMultiBlockController; @@ -35,7 +35,7 @@ public class GT_MultiTile_Renderer implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { - if (!(block instanceof MultiTileEntityBlockRegistryInternal muteBlock)) { + if (!(block instanceof MultiTileEntityBlock muteBlock)) { return; } @@ -49,7 +49,8 @@ public class GT_MultiTile_Renderer implements ISimpleBlockRenderingHandler { renderer.setRenderBoundsFromBlock(muteBlock); for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - ITexture texture = classContainer.referenceTileEntity.getTexture(side); + final ITexture texture = classContainer.getReferenceTileEntity() + .getTexture(side); if (texture == null) continue; switch (side) { case DOWN -> renderYNegative(null, renderer, 0, 0, 0, block, texture, side); diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java index 28cfc4e5a8..d446009ac7 100644 --- a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java +++ b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_RecipeFilter.java @@ -14,6 +14,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.Constants; @@ -34,7 +35,6 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.RecipeMapWorkable; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_SpecialFilter; -import gregtech.api.multitileentity.MultiTileEntityContainer; import gregtech.api.multitileentity.MultiTileEntityItem; import gregtech.api.recipe.RecipeMap; import gregtech.api.render.TextureFactory; @@ -90,10 +90,8 @@ public class GT_MetaTileEntity_RecipeFilter extends GT_MetaTileEntity_SpecialFil } private static RecipeMap getMuTeRecipeMap(@NotNull ItemStack stack) { - MultiTileEntityContainer muTeEntityContainer = GT_Loader_MultiTileEntities.MACHINE_REGISTRY - .getNewTileEntityContainer(stack); - if (muTeEntityContainer != null - && muTeEntityContainer.tileEntity instanceof RecipeMapWorkable recipeMapWorkable) { + final TileEntity tileEntity = GT_Loader_MultiTileEntities.MACHINE_REGISTRY.getReferenceTileEntity(stack); + if (tileEntity instanceof RecipeMapWorkable recipeMapWorkable) { return recipeMapWorkable.getRecipeMap(); } return null; diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java index a34246e045..9e76883a8b 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java +++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/DistillationTower.java @@ -7,6 +7,8 @@ import static gregtech.api.util.GT_StructureUtilityMuTE.ofMuTECasings; import javax.annotation.Nonnull; +import net.minecraft.util.StatCollector; + import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.StructureDefinition; import com.gtnewhorizon.structurelib.util.Vec3Impl; @@ -20,7 +22,6 @@ import gregtech.api.multitileentity.multiblock.base.StackableController; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import gregtech.api.util.GT_StructureUtility; import gregtech.common.tileentities.machines.multiblock.logic.DistillationTowerProcessingLogic; -import net.minecraft.util.StatCollector; public class DistillationTower extends StackableController { @@ -162,11 +163,11 @@ public class DistillationTower extends StackableController