diff options
Diffstat (limited to 'src/main/java/gregtech')
6 files changed, 53 insertions, 7 deletions
diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java index 1d1f8cb0d6..351895636e 100644 --- a/src/main/java/gregtech/GT_Mod.java +++ b/src/main/java/gregtech/GT_Mod.java @@ -29,6 +29,7 @@ import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; import gregtech.api.enums.Textures; import gregtech.api.interfaces.internal.IGT_Mod; +import gregtech.api.metatileentity.BaseMetaPipeEntity; import gregtech.api.objects.GT_ItemStack; import gregtech.api.objects.ItemData; import gregtech.api.objects.ReverseShapedRecipe; @@ -180,6 +181,14 @@ public class GT_Mod implements IGT_Mod { GT_Values.DW = new GT_DummyWorld(); GT_Values.NW = new GT_Network(); GT_Values.RA = new GT_RecipeAdder(); + + for (int i = 0; i < 4; i++) { + GregTech_API.registerTileEntityConstructor(i, i2 -> GregTech_API.constructBaseMetaTileEntity()); + } + for (int i = 4; i < 12; i++) { + GregTech_API.registerTileEntityConstructor(i, i2 -> new BaseMetaPipeEntity()); + } + //noinspection deprecation// Need run-time initialization GregTech_API.sRecipeAdder = GT_Values.RA; 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); } } diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java index ea1df39932..b497ccaa8e 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Machines.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Machines.java @@ -587,10 +587,7 @@ public class GT_Block_Machines extends GT_Generic_Block implements IDebugableBlo @Override public TileEntity createTileEntity(World aWorld, int aMeta) { - if (aMeta < 4) { - return GregTech_API.constructBaseMetaTileEntity(); - } - return new BaseMetaPipeEntity(); + return GregTech_API.createTileEntity(aMeta); } @Override diff --git a/src/main/java/gregtech/loaders/misc/GT_Achievements.java b/src/main/java/gregtech/loaders/misc/GT_Achievements.java index c0a89e723c..eb556f0a44 100644 --- a/src/main/java/gregtech/loaders/misc/GT_Achievements.java +++ b/src/main/java/gregtech/loaders/misc/GT_Achievements.java @@ -367,6 +367,15 @@ public class GT_Achievements { } public Achievement registerAssAchievement(GT_Recipe recipe) { + if (recipe == null) { + GT_Mod.GT_FML_LOGGER.error("Invalid achievement registration attempt for null recipe", new Exception()); + return null; + } + if (recipe.getOutput(0) == null) { + GT_Mod.GT_FML_LOGGER.error( + "Invalid achievement registration attempt for recipe with null output", new Exception()); + return null; + } if (this.achievementList.get(recipe.getOutput(0).getUnlocalizedName()) == null) { assReg++; return registerAchievement( |