diff options
Diffstat (limited to 'src/main/java/gregtech/api')
3 files changed, 34 insertions, 3 deletions
diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index b565190507..7a52021eea 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -55,6 +55,7 @@ import java.util.Map; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; +import java.util.function.IntFunction; import java.util.function.Predicate; import java.util.stream.Collectors; import net.minecraft.block.Block; @@ -63,6 +64,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; @@ -368,6 +370,9 @@ public class GregTech_API { private static Class<BaseMetaTileEntity> sBaseMetaTileEntityClass = null; + @SuppressWarnings("unchecked") + private static final IntFunction<TileEntity>[] teCreators = new IntFunction[16]; + static { sItemStackMappings.add(sCovers); sItemStackMappings.add(sCoverBehaviors); @@ -1039,4 +1044,18 @@ public class GregTech_API { public static void setItemIconRegister(IIconRegister aIconRegister) { GregTech_API.sItemIcons = aIconRegister; } + + public static void registerTileEntityConstructor(int meta, IntFunction<TileEntity> constructor) { + if (meta < 0 || meta > 15 || constructor == null) throw new IllegalArgumentException(); + if (teCreators[meta] != null) + throw new IllegalStateException( + "previous constructor: " + teCreators[meta] + " new constructor: " + constructor + " meta:" + meta); + teCreators[meta] = constructor; + } + + public static TileEntity createTileEntity(int meta) { + meta = GT_Utility.clamp(meta, 0, 15); + if (teCreators[meta] == null) return null; + return teCreators[meta].apply(meta); + } } diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index 76a6d3237e..cdc81220e6 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -1839,7 +1839,14 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity @Override public void setMetaTileEntity(IMetaTileEntity aMetaTileEntity) { - mMetaTileEntity = (MetaTileEntity) aMetaTileEntity; + if (aMetaTileEntity instanceof MetaTileEntity || aMetaTileEntity == null) + mMetaTileEntity = (MetaTileEntity) aMetaTileEntity; + else { + GT_FML_LOGGER.error( + "Unknown meta tile entity set! Class {}, inventory name {}.", + aMetaTileEntity.getClass(), + aMetaTileEntity.getInventoryName()); + } } public byte getLightValue() { diff --git a/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java index f805fee76c..b7aa229530 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java +++ b/src/main/java/gregtech/api/net/GT_Packet_TileEntity.java @@ -1,6 +1,7 @@ package gregtech.api.net; import com.google.common.io.ByteArrayDataInput; +import gregtech.GT_Mod; import gregtech.api.metatileentity.BaseMetaPipeEntity; import gregtech.api.metatileentity.BaseMetaTileEntity; import gregtech.api.multitileentity.MultiTileEntityBlock; @@ -160,8 +161,9 @@ public class GT_Packet_TileEntity extends GT_Packet_New { @Override public void process(IBlockAccess aWorld) { - if (aWorld != null) { - final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); + if (aWorld == null) return; + final TileEntity tTileEntity = aWorld.getTileEntity(mX, mY, mZ); + try { final Block tBlock; if (tTileEntity instanceof BaseMetaTileEntity) ((BaseMetaTileEntity) tTileEntity) @@ -192,6 +194,9 @@ public class GT_Packet_TileEntity extends GT_Packet_New { mRedstone, mColor); } + } catch (Exception e) { + GT_Mod.GT_FML_LOGGER.error( + "Exception setting tile entity data for tile entity {} at ({}, {}, {})", tTileEntity, mX, mY, mZ); } } |