diff --git a/build.gradle b/build.gradle index 089946b79..e772bfad6 100644 --- a/build.gradle +++ b/build.gradle @@ -147,6 +147,13 @@ sourceSets { include 'appeng/container/ContainerOpenContext.java' include 'appeng/decorative/solid/BlockSkyStone.java' + include 'appeng/block/storage/BlockSkyChest.java' + include 'appeng/tile/storage/TileSkyChest.java' + include 'appeng/block/storage/SkyChestRenderingCustomizer.java' + include 'appeng/client/render/tesr/SkyChestTESR.java' + include 'appeng/tile/inventory/AppEngInternalInventory.java' + include 'appeng/util/inv/filter/**' + // include 'appeng/client/ClientHelper.java' // include 'appeng/server/ServerHelper.java' include 'appeng/block/AEBaseBlock.java' diff --git a/src/main/java/appeng/block/AEBaseTileBlock.java b/src/main/java/appeng/block/AEBaseTileBlock.java index 95a437fb4..e90b757fc 100644 --- a/src/main/java/appeng/block/AEBaseTileBlock.java +++ b/src/main/java/appeng/block/AEBaseTileBlock.java @@ -21,10 +21,13 @@ package appeng.block; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import appeng.bootstrap.definitions.TileEntityDefinition; +import appeng.core.features.TileDefinition; import com.google.common.collect.Lists; import net.minecraft.block.Block; @@ -37,6 +40,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.StateContainer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; @@ -59,11 +63,13 @@ import appeng.util.Platform; import appeng.util.SettingsFrom; -public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntityProvider +public abstract class AEBaseTileBlock extends AEBaseBlock { @Nonnull - private Class tileEntityType; + private Class tileEntityClass; + @Nonnull + private Supplier tileEntityFactory; public AEBaseTileBlock( final Block.Properties props ) { @@ -107,10 +113,11 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity } // TODO : Was this change needed? - public void setTileEntity( final Class c ) + public void setTileEntity( final Class tileEntityClass, Supplier factory ) { - this.tileEntityType = c; - this.setInventory( AEBaseInvTile.class.isAssignableFrom( c ) ); + this.tileEntityClass = tileEntityClass; + this.tileEntityFactory = factory; + this.setInventory( AEBaseInvTile.class.isAssignableFrom( tileEntityClass ) ); } @Override @@ -121,22 +128,22 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity private boolean hasBlockTileEntity() { - return this.tileEntityType != null; + return true; } - public Class getTileEntityClass() + public Class getTileEntityClass() { - return this.tileEntityType; + return this.tileEntityClass; } @Nullable - public T getTileEntity( final IBlockReader w, final int x, final int y, final int z ) + public T getTileEntity( final IBlockReader w, final int x, final int y, final int z ) { return this.getTileEntity( w, new BlockPos( x, y, z ) ); } @Nullable - public T getTileEntity( final IBlockReader w, final BlockPos pos ) + public T getTileEntity( final IBlockReader w, final BlockPos pos ) { if( !this.hasBlockTileEntity() ) { @@ -144,9 +151,9 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity } final TileEntity te = w.getTileEntity( pos ); - if( this.tileEntityType.isInstance( te ) ) + if( this.tileEntityClass.isInstance( te ) ) { - return (T) te; + return this.tileEntityClass.cast(te); } return null; @@ -155,23 +162,7 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity @Override public final TileEntity createTileEntity( BlockState state, IBlockReader world ) { - if( this.hasBlockTileEntity() ) - { - try - { - return this.tileEntityType.newInstance(); - } - catch( final InstantiationException e ) - { - throw new IllegalStateException( "Failed to create a new instance of an illegal class " + this.tileEntityType, e ); - } - catch( final IllegalAccessException e ) - { - throw new IllegalStateException( "Failed to create a new instance of " + this.tileEntityType + ", because lack of permissions", e ); - } - } - - return null; + return this.tileEntityFactory.get(); } @Override diff --git a/src/main/java/appeng/block/grindstone/CrankRendering.java b/src/main/java/appeng/block/grindstone/CrankRendering.java index 21e45e12b..8d29e1bd6 100644 --- a/src/main/java/appeng/block/grindstone/CrankRendering.java +++ b/src/main/java/appeng/block/grindstone/CrankRendering.java @@ -35,6 +35,6 @@ public class CrankRendering extends BlockRenderingCustomizer @OnlyIn( Dist.CLIENT ) public void customize( IBlockRendering rendering, IItemRendering itemRendering ) { - rendering.tesr( new CrankTESR() ); + rendering.tileEntityRenderer( new CrankTESR() ); } } diff --git a/src/main/java/appeng/block/misc/InscriberRendering.java b/src/main/java/appeng/block/misc/InscriberRendering.java index 7fe6f3435..1c839beef 100644 --- a/src/main/java/appeng/block/misc/InscriberRendering.java +++ b/src/main/java/appeng/block/misc/InscriberRendering.java @@ -18,7 +18,7 @@ public class InscriberRendering extends BlockRenderingCustomizer @Override public void customize( IBlockRendering rendering, IItemRendering itemRendering ) { - rendering.tesr( new InscriberTESR() ); + rendering.tileEntityRenderer( new InscriberTESR() ); } } diff --git a/src/main/java/appeng/block/misc/SkyCompassRendering.java b/src/main/java/appeng/block/misc/SkyCompassRendering.java index f90281e76..23c82f306 100644 --- a/src/main/java/appeng/block/misc/SkyCompassRendering.java +++ b/src/main/java/appeng/block/misc/SkyCompassRendering.java @@ -39,7 +39,7 @@ public class SkyCompassRendering extends BlockRenderingCustomizer @OnlyIn( Dist.CLIENT ) public void customize( IBlockRendering rendering, IItemRendering itemRendering ) { - rendering.tesr( new SkyCompassTESR() ); + rendering.tileEntityRenderer( new SkyCompassTESR() ); itemRendering.model( ITEM_MODEL ); itemRendering.builtInModel( "models/block/builtin/sky_compass", new SkyCompassModel() ); } diff --git a/src/main/java/appeng/block/storage/BlockSkyChest.java b/src/main/java/appeng/block/storage/BlockSkyChest.java index ade9c98c5..d78236ac2 100644 --- a/src/main/java/appeng/block/storage/BlockSkyChest.java +++ b/src/main/java/appeng/block/storage/BlockSkyChest.java @@ -24,29 +24,28 @@ import java.util.List; import javax.annotation.Nullable; -import net.minecraft.block.material.Material; +import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResultType; -import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import appeng.api.util.AEPartLocation; import appeng.block.AEBaseTileBlock; -import appeng.core.sync.GuiBridge; -import appeng.helpers.ICustomCollision; import appeng.tile.storage.TileSkyChest; import appeng.util.Platform; -public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision +public class BlockSkyChest extends AEBaseTileBlock { private static final double AABB_OFFSET_BOTTOM = 0.00; @@ -60,20 +59,20 @@ public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision public final SkyChestType type; - public BlockSkyChest( final SkyChestType type ) + public BlockSkyChest( final SkyChestType type, Properties props ) { - super( Material.ROCK ); - this.setOpaque( this.setFullSize( false ) ); - this.lightOpacity = 0; - this.setHardness( 50 ); - this.blockResistance = 150.0f; + super( props ); this.type = type; } @Override - public EnumBlockRenderType getRenderType( BlockState state ) - { - return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.ENTITYBLOCK_ANIMATED; + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return true; } @Override @@ -81,29 +80,20 @@ public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision { if( Platform.isServer() ) { - Platform.openGUI( player, this.getTileEntity( w, pos ), AEPartLocation.fromFacing(hit), GuiBridge.GUI_SKYCHEST ); + // FIXME Platform.openGUI( player, this.getTileEntity( w, pos ), AEPartLocation.fromFacing(hit.getFace()), GuiBridge.GUI_SKYCHEST ); } - return true; + return ActionResultType.SUCCESS; } @Override - public Iterable getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b ) - { - final AxisAlignedBB aabb = this.computeAABB( w, pos ); - - return Collections.singletonList( aabb ); + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + // TODO Cache this! It can't be that hard! + AxisAlignedBB aabb = computeAABB(worldIn, pos); + return VoxelShapes.create(aabb); } - @Override - public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List out, final Entity e ) - { - final AxisAlignedBB aabb = this.computeAABB( w, pos ); - - out.add( aabb ); - } - - private AxisAlignedBB computeAABB( final World w, final BlockPos pos ) + private AxisAlignedBB computeAABB(final IBlockReader w, final BlockPos pos ) { final TileSkyChest sk = this.getTileEntity( w, pos ); Direction o = Direction.UP; diff --git a/src/main/java/appeng/block/storage/SkyChestRenderingCustomizer.java b/src/main/java/appeng/block/storage/SkyChestRenderingCustomizer.java index f1f372862..552f680f8 100644 --- a/src/main/java/appeng/block/storage/SkyChestRenderingCustomizer.java +++ b/src/main/java/appeng/block/storage/SkyChestRenderingCustomizer.java @@ -19,7 +19,6 @@ package appeng.block.storage; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -31,7 +30,6 @@ import appeng.client.render.tesr.SkyChestTESR; public class SkyChestRenderingCustomizer extends BlockRenderingCustomizer { - private final BlockSkyChest.SkyChestType type; public SkyChestRenderingCustomizer( BlockSkyChest.SkyChestType type ) @@ -43,12 +41,11 @@ public class SkyChestRenderingCustomizer extends BlockRenderingCustomizer @Override public void customize( IBlockRendering rendering, IItemRendering itemRendering ) { - rendering.tesr( new SkyChestTESR() ); - // Register a custom non-tesr item model - String modelName = this.getModelFromType(); - ModelResourceLocation model = new ModelResourceLocation( "appliedenergistics2:" + modelName, "inventory" ); - itemRendering.model( model ).variants( model ); + // FIXME: This should not be required anymore! + // FIXME String modelName = this.getModelFromType(); + // FIXME ModelResourceLocation model = new ModelResourceLocation( "appliedenergistics2:" + modelName, "inventory" ); + // FIXME itemRendering.model( model ).variants( model ); } private String getModelFromType() diff --git a/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java index ee7a2cfc8..b582815bf 100644 --- a/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java +++ b/src/main/java/appeng/bootstrap/BlockDefinitionBuilder.java @@ -24,18 +24,17 @@ import java.util.Collections; import java.util.EnumSet; import java.util.List; import java.util.function.BiFunction; -import java.util.function.Function; import java.util.function.Supplier; import javax.annotation.Nullable; +import appeng.bootstrap.components.ITileEntityRegistrationComponent; import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -48,7 +47,6 @@ import appeng.bootstrap.components.IBlockRegistrationComponent; import appeng.bootstrap.components.IItemRegistrationComponent; import appeng.bootstrap.components.IPreInitComponent; import appeng.bootstrap.definitions.TileEntityDefinition; -import appeng.core.AEConfig; import appeng.core.AppEng; import appeng.core.CreativeTab; import appeng.core.features.AEFeature; @@ -201,27 +199,15 @@ class BlockDefinitionBuilder implements IBlockBuilder // Register all extra handlers this.bootstrapComponents.forEach( component -> this.factory.addBootstrapComponent( component.apply( block, item ) ) ); - if( this.tileEntityDefinition != null && block instanceof AEBaseTileBlock ) + if (this.tileEntityDefinition != null) { - ( (AEBaseTileBlock) block ).setTileEntity( this.tileEntityDefinition.getTileEntityClass() ); - if( this.tileEntityDefinition.getName() == null ) - { - this.tileEntityDefinition.setName( this.registryName ); - } - + // Tell the tile entity definition about the block we've registered + this.tileEntityDefinition.addBlock(block); } if( Platform.isClient() ) { - if( block instanceof AEBaseTileBlock ) - { - AEBaseTileBlock tileBlock = (AEBaseTileBlock) block; - this.blockRendering.apply( this.factory, block, tileBlock.getTileEntityClass() ); - } - else - { - this.blockRendering.apply( this.factory, block, null ); - } + this.blockRendering.apply( this.factory, block ); if( item != null ) { @@ -231,18 +217,6 @@ class BlockDefinitionBuilder implements IBlockBuilder if( block instanceof AEBaseTileBlock ) { - this.factory.addBootstrapComponent( (IPreInitComponent) side -> - { - AEBaseTile.registerTileItem( - this.tileEntityDefinition == null ? ( (AEBaseTileBlock) block ).getTileEntityClass() : this.tileEntityDefinition.getTileEntityClass(), - new BlockStackSrc( block, ActivityState.Enabled ) ); - } ); - - if( this.tileEntityDefinition != null ) - { - this.factory.tileEntityComponent.addTileEntity( this.tileEntityDefinition ); - } - return (T) new TileDefinition( this.registryName, (AEBaseTileBlock) block, item ); } else diff --git a/src/main/java/appeng/bootstrap/BlockRendering.java b/src/main/java/appeng/bootstrap/BlockRendering.java index d3df12b08..850502546 100644 --- a/src/main/java/appeng/bootstrap/BlockRendering.java +++ b/src/main/java/appeng/bootstrap/BlockRendering.java @@ -22,13 +22,15 @@ package appeng.bootstrap; import appeng.block.AEBaseTileBlock; import appeng.bootstrap.components.BlockColorComponent; import appeng.bootstrap.components.RenderTypeComponent; +import appeng.bootstrap.components.TileEntityRendererComponent; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.color.IBlockColor; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IUnbakedModel; -import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -36,6 +38,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import java.util.HashMap; import java.util.Map; import java.util.function.BiFunction; +import java.util.function.Function; class BlockRendering implements IBlockRendering @@ -47,12 +50,6 @@ class BlockRendering implements IBlockRendering @OnlyIn( Dist.CLIENT ) private IBlockColor blockColor; - @OnlyIn( Dist.CLIENT ) - private TileEntityRenderer tesr; - -// FIXME @OnlyIn( Dist.CLIENT ) -// FIXME private IStateMapper stateMapper; - @OnlyIn( Dist.CLIENT ) private Map builtInModels = new HashMap<>(); @@ -75,14 +72,6 @@ class BlockRendering implements IBlockRendering return this; } - @OnlyIn( Dist.CLIENT ) - @Override - public IBlockRendering tesr( TileEntityRenderer tesr ) - { - this.tesr = tesr; - return this; - } - @Override public IBlockRendering builtInModel( String name, IUnbakedModel model ) { @@ -104,17 +93,8 @@ class BlockRendering implements IBlockRendering // FIXME return this; // FIXME } - void apply( FeatureFactory factory, Block block, Class tileEntityClass ) + void apply( FeatureFactory factory, Block block ) { -// FIXME if( this.tesr != null ) -// FIXME { -// FIXME if( tileEntityClass == null ) -// FIXME { -// FIXME throw new IllegalStateException( "Tried to register a TESR for " + block + " even though no tile entity has been specified." ); -// FIXME } -// FIXME factory.addBootstrapComponent( new TesrComponent( tileEntityClass, this.tesr ) ); -// FIXME } - if( this.modelCustomizer != null ) { factory.addModelOverride( block.getRegistryName().getPath(), this.modelCustomizer ); diff --git a/src/main/java/appeng/bootstrap/FeatureFactory.java b/src/main/java/appeng/bootstrap/FeatureFactory.java index 1b3b7869b..9ebda838d 100644 --- a/src/main/java/appeng/bootstrap/FeatureFactory.java +++ b/src/main/java/appeng/bootstrap/FeatureFactory.java @@ -27,15 +27,17 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.function.BiFunction; +import java.util.function.Function; import java.util.function.Supplier; import appeng.bootstrap.components.BuiltInModelComponent; import appeng.bootstrap.components.ModelOverrideComponent; +import appeng.tile.AEBaseTile; import net.minecraft.block.Block; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IUnbakedModel; -import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -43,7 +45,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import appeng.api.definitions.IItemDefinition; import appeng.api.util.AEColor; import appeng.api.util.AEColoredItemDefinition; -import appeng.bootstrap.components.TileEntityComponent; import appeng.core.features.AEFeature; import appeng.core.features.ActivityState; import appeng.core.features.ColoredItemDefinition; @@ -64,16 +65,11 @@ public class FeatureFactory @OnlyIn( Dist.CLIENT ) private BuiltInModelComponent builtInModelComponent; - public final TileEntityComponent tileEntityComponent; - public FeatureFactory() { this.defaultFeatures = new AEFeature[] { AEFeature.CORE }; this.bootstrapComponents = new HashMap<>(); - this.tileEntityComponent = new TileEntityComponent(); - this.addBootstrapComponent( this.tileEntityComponent ); - if( Platform.isClient() ) { this.modelOverrideComponent = new ModelOverrideComponent(); @@ -87,7 +83,6 @@ public class FeatureFactory { this.defaultFeatures = defaultFeatures.clone(); this.bootstrapComponents = parent.bootstrapComponents; - this.tileEntityComponent = parent.tileEntityComponent; if( Platform.isClient() ) { this.modelOverrideComponent = parent.modelOverrideComponent; @@ -105,6 +100,11 @@ public class FeatureFactory return new ItemDefinitionBuilder( this, id, item ).features( this.defaultFeatures ); } + public TileEntityBuilder tileEntity(String id, Class teClass, Function, T> factory) + { + return new TileEntityBuilder<>( this, id, teClass, factory ).features( this.defaultFeatures ); + } + public AEColoredItemDefinition colored( IItemDefinition target, int offset ) { ColoredItemDefinition definition = new ColoredItemDefinition(); diff --git a/src/main/java/appeng/bootstrap/IBlockRendering.java b/src/main/java/appeng/bootstrap/IBlockRendering.java index 4169bb968..cb3433b2e 100644 --- a/src/main/java/appeng/bootstrap/IBlockRendering.java +++ b/src/main/java/appeng/bootstrap/IBlockRendering.java @@ -20,6 +20,7 @@ package appeng.bootstrap; import java.util.function.BiFunction; +import java.util.function.Function; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.color.IBlockColor; @@ -27,6 +28,7 @@ import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IUnbakedModel; import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -44,12 +46,6 @@ public interface IBlockRendering @OnlyIn( Dist.CLIENT ) IBlockRendering blockColor( IBlockColor blockColor ); -//FIXME @OnlyIn( Dist.CLIENT ) -// IBlockRendering stateMapper( IStateMapper mapper ); - - @OnlyIn( Dist.CLIENT ) - IBlockRendering tesr( TileEntityRenderer ter ); - /** * Registers a built-in model under the given resource path. */ diff --git a/src/main/java/appeng/bootstrap/TileEntityBuilder.java b/src/main/java/appeng/bootstrap/TileEntityBuilder.java new file mode 100644 index 000000000..e3162674f --- /dev/null +++ b/src/main/java/appeng/bootstrap/TileEntityBuilder.java @@ -0,0 +1,126 @@ +package appeng.bootstrap; + +import appeng.block.AEBaseTileBlock; +import appeng.bootstrap.components.ITileEntityRegistrationComponent; +import appeng.bootstrap.definitions.TileEntityDefinition; +import appeng.core.AppEng; +import appeng.core.features.AEFeature; +import appeng.core.features.ActivityState; +import appeng.core.features.BlockStackSrc; +import appeng.tile.AEBaseTile; +import appeng.util.Platform; +import com.google.common.base.Preconditions; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.client.registry.ClientRegistry; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumSet; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * Used to define our tile entities and all of their properties that are relevant to registering them. + * + * @param + */ +public class TileEntityBuilder { + + private final FeatureFactory factory; + + private final String registryName; + + // The tile entity class + private final Class tileClass; + + private TileEntityType type; + + // The factory for creating tile entity objects + private final Function, T> supplier; + + @OnlyIn(Dist.CLIENT) + private final TileEntityRendering tileEntityRendering = new TileEntityRendering(); + + private final List blocks = new ArrayList<>(); + + private final EnumSet features = EnumSet.noneOf(AEFeature.class); + + public TileEntityBuilder(FeatureFactory factory, String registryName, Class tileClass, Function, T> supplier) { + this.factory = factory; + this.registryName = registryName; + this.tileClass = tileClass; + this.supplier = supplier; + } + + public TileEntityBuilder features(AEFeature... features) { + this.features.clear(); + this.addFeatures(features); + return this; + } + + public TileEntityBuilder addFeatures(AEFeature... features) { + Collections.addAll(this.features, features); + return this; + } + + public TileEntityBuilder rendering(TileEntityRenderingCustomizer customizer) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> customizer.customize(tileEntityRendering)); + return this; + } + + @SuppressWarnings("unchecked") + public TileEntityDefinition build() { + + this.factory.addBootstrapComponent((ITileEntityRegistrationComponent) registry -> + { + if (blocks.isEmpty()) { + throw new IllegalStateException("No blocks make use of this tile entity: " + tileClass); + } + + Supplier factory = () -> supplier.apply(type); + type = TileEntityType.Builder.create(factory, blocks.toArray(new Block[0])) + .build(null); + type.setRegistryName(AppEng.MOD_ID, registryName); + registry.register(type); + + DistExecutor.runWhenOn(Dist.CLIENT, () -> this::registerClient); + + AEBaseTile.registerTileItem( + tileClass, + new BlockStackSrc(blocks.get(0), ActivityState.Enabled)); + + for (Block block : blocks) { + if (block instanceof AEBaseTileBlock) { + AEBaseTileBlock baseTileBlock = (AEBaseTileBlock) block; + baseTileBlock.setTileEntity(tileClass, factory); + } + } + + }); + + return new TileEntityDefinition(this::addBlock); + + } + + @OnlyIn(Dist.CLIENT) + private void registerClient() { + + if (tileEntityRendering.tileEntityRenderer != null) { + ClientRegistry.bindTileEntityRenderer(type, tileEntityRendering.tileEntityRenderer); + } + + } + + private void addBlock(Block block) { + Preconditions.checkState(type == null, "No more blocks can be added after registration completed."); + this.blocks.add(block); + } + +} diff --git a/src/main/java/appeng/bootstrap/TileEntityRendering.java b/src/main/java/appeng/bootstrap/TileEntityRendering.java new file mode 100644 index 000000000..eb62f9241 --- /dev/null +++ b/src/main/java/appeng/bootstrap/TileEntityRendering.java @@ -0,0 +1,41 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.bootstrap; + + +import appeng.tile.AEBaseTile; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Function; + +public class TileEntityRendering { + + @OnlyIn(Dist.CLIENT) + Function> tileEntityRenderer; + + @OnlyIn(Dist.CLIENT) + public TileEntityRendering tileEntityRenderer(Function> tileEntityRenderer) { + this.tileEntityRenderer = tileEntityRenderer; + return this; + } + +} diff --git a/src/main/java/appeng/bootstrap/TileEntityRenderingCustomizer.java b/src/main/java/appeng/bootstrap/TileEntityRenderingCustomizer.java new file mode 100644 index 000000000..85202781b --- /dev/null +++ b/src/main/java/appeng/bootstrap/TileEntityRenderingCustomizer.java @@ -0,0 +1,37 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.bootstrap; + + +import appeng.tile.AEBaseTile; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + + +/** + * A callback that allows the rendering of a tile entity to be customized. Sadly this class is required and no lambdas + * can be used due to them not being able to be annotated with @OnlyIn(CLIENT). + */ +public abstract class TileEntityRenderingCustomizer +{ + + @OnlyIn( Dist.CLIENT ) + public abstract void customize( TileEntityRendering rendering ); + +} diff --git a/src/main/java/appeng/bootstrap/components/ITileEntityRegistrationComponent.java b/src/main/java/appeng/bootstrap/components/ITileEntityRegistrationComponent.java new file mode 100644 index 000000000..eae8d36e4 --- /dev/null +++ b/src/main/java/appeng/bootstrap/components/ITileEntityRegistrationComponent.java @@ -0,0 +1,10 @@ +package appeng.bootstrap.components; + +import appeng.bootstrap.IBootstrapComponent; +import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.registries.IForgeRegistry; + +@FunctionalInterface +public interface ITileEntityRegistrationComponent extends IBootstrapComponent { + void register(IForgeRegistry> registry); +} diff --git a/src/main/java/appeng/bootstrap/components/TileEntityComponent.java b/src/main/java/appeng/bootstrap/components/TileEntityComponent.java deleted file mode 100644 index f8d22c101..000000000 --- a/src/main/java/appeng/bootstrap/components/TileEntityComponent.java +++ /dev/null @@ -1,46 +0,0 @@ - -package appeng.bootstrap.components; - - -import java.util.ArrayList; -import java.util.List; - -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.common.registry.GameRegistry; - -import appeng.bootstrap.definitions.TileEntityDefinition; -import appeng.core.AppEng; - - -/** - * @author GuntherDW - */ -public class TileEntityComponent implements IPreInitComponent -{ - private List tileEntityDefinitions = new ArrayList<>(); - - public TileEntityComponent() - { - } - - public void addTileEntity( TileEntityDefinition tileEntityDefinition ) - { - if( !this.tileEntityDefinitions.contains( tileEntityDefinition ) ) - { - this.tileEntityDefinitions.add( tileEntityDefinition ); - } - } - - @Override - public void preInitialize( Dist dist ) - { - for( TileEntityDefinition tileEntityDefinition : this.tileEntityDefinitions ) - { - if( !tileEntityDefinition.isRegistered() ) - { - // FIXME GameRegistry.registerTileEntity( tileEntityDefinition.getTileEntityClass(), AppEng.MOD_ID + ":" + tileEntityDefinition.getName() ); - tileEntityDefinition.setRegistered( true ); - } - } - } -} diff --git a/src/main/java/appeng/bootstrap/components/TesrComponent.java b/src/main/java/appeng/bootstrap/components/TileEntityRendererComponent.java similarity index 72% rename from src/main/java/appeng/bootstrap/components/TesrComponent.java rename to src/main/java/appeng/bootstrap/components/TileEntityRendererComponent.java index b69c121d3..bb9a20577 100644 --- a/src/main/java/appeng/bootstrap/components/TesrComponent.java +++ b/src/main/java/appeng/bootstrap/components/TileEntityRendererComponent.java @@ -35,23 +35,24 @@ import appeng.tile.AEBaseTile; * * @param */ -public class TesrComponent implements IPreInitComponent +public class TileEntityRendererComponent implements IPreInitComponent { - private final TileEntityType tileEntityClass; + private final TileEntityType tileEntityType; - private final Function> ter; + private final Function> tileEntityRenderer; - public TesrComponent( TileEntityType tileEntityClass, Function> ter ) + public TileEntityRendererComponent(TileEntityType tileEntityType, + Function> tileEntityRenderer) { - this.tileEntityClass = tileEntityClass; - this.ter = ter; + this.tileEntityType = tileEntityType; + this.tileEntityRenderer = tileEntityRenderer; } @Override // public void modelReg( Dist dist ) public void preInitialize( Dist dist ) { - ClientRegistry.bindTileEntityRenderer( this.tileEntityClass, this.ter ); + ClientRegistry.bindTileEntityRenderer( tileEntityType, tileEntityRenderer); } } diff --git a/src/main/java/appeng/bootstrap/definitions/TileEntityDefinition.java b/src/main/java/appeng/bootstrap/definitions/TileEntityDefinition.java index e10113ce9..9229a6e8f 100644 --- a/src/main/java/appeng/bootstrap/definitions/TileEntityDefinition.java +++ b/src/main/java/appeng/bootstrap/definitions/TileEntityDefinition.java @@ -20,53 +20,25 @@ package appeng.bootstrap.definitions; import appeng.tile.AEBaseTile; +import net.minecraft.block.Block; + +import java.util.function.Consumer; /** * @author GuntherDW */ -public class TileEntityDefinition -{ +public class TileEntityDefinition { - private final Class tileEntityClass; - private String name; - private boolean isRegistered = false; + // To be notified when a Block declares that it uses this tile entity + private final Consumer addBlockListener; - // This signals the BlockDefinitionBuilder to set the name of the TE to the blockname. - public TileEntityDefinition( Class tileEntityClass ) - { - this.tileEntityClass = tileEntityClass; - this.name = null; - } + public TileEntityDefinition(Consumer addBlockListener) { + this.addBlockListener = addBlockListener; + } - public TileEntityDefinition( Class tileEntityClass, String optionalName ) - { - this.tileEntityClass = tileEntityClass; - this.name = optionalName; - } + public void addBlock(Block block) { + this.addBlockListener.accept(block); + } - public Class getTileEntityClass() - { - return this.tileEntityClass; - } - - public void setName( String name ) - { - this.name = name; - } - - public String getName() - { - return this.name; - } - - public boolean isRegistered() - { - return this.isRegistered; - } - - public void setRegistered( boolean registered ) - { - this.isRegistered = registered; - } } diff --git a/src/main/java/appeng/client/render/crafting/CraftingCubeRendering.java b/src/main/java/appeng/client/render/crafting/CraftingCubeRendering.java index 67f0c8692..1499462c1 100644 --- a/src/main/java/appeng/client/render/crafting/CraftingCubeRendering.java +++ b/src/main/java/appeng/client/render/crafting/CraftingCubeRendering.java @@ -77,7 +77,7 @@ public class CraftingCubeRendering extends BlockRenderingCustomizer if( this.type == BlockCraftingUnit.CraftingUnitType.MONITOR ) { - rendering.tesr( new CraftingMonitorTESR() ); + rendering.tileEntityRenderer( new CraftingMonitorTESR() ); } } diff --git a/src/main/java/appeng/client/render/crafting/CraftingMonitorTESR.java b/src/main/java/appeng/client/render/crafting/CraftingMonitorTESR.java index ecc6c37d0..7215e314e 100644 --- a/src/main/java/appeng/client/render/crafting/CraftingMonitorTESR.java +++ b/src/main/java/appeng/client/render/crafting/CraftingMonitorTESR.java @@ -20,7 +20,7 @@ package appeng.client.render.crafting; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.util.Direction; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -34,7 +34,7 @@ import appeng.tile.crafting.TileCraftingMonitorTile; * Renders the item currently being crafted */ @OnlyIn( Dist.CLIENT ) -public class CraftingMonitorTESR extends TileEntitySpecialRenderer +public class CraftingMonitorTESR extends TileEntityRenderer { @Override diff --git a/src/main/java/appeng/client/render/tesr/CrankTESR.java b/src/main/java/appeng/client/render/tesr/CrankTESR.java index 69175678d..5f5b5d89c 100644 --- a/src/main/java/appeng/client/render/tesr/CrankTESR.java +++ b/src/main/java/appeng/client/render/tesr/CrankTESR.java @@ -30,7 +30,7 @@ import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -44,7 +44,7 @@ import appeng.tile.grindstone.TileCrank; * normal model. */ @OnlyIn( Dist.CLIENT ) -public class CrankTESR extends TileEntitySpecialRenderer +public class CrankTESR extends TileEntityRenderer { @Override diff --git a/src/main/java/appeng/client/render/tesr/InscriberTESR.java b/src/main/java/appeng/client/render/tesr/InscriberTESR.java index 85659e222..cab07930a 100644 --- a/src/main/java/appeng/client/render/tesr/InscriberTESR.java +++ b/src/main/java/appeng/client/render/tesr/InscriberTESR.java @@ -12,7 +12,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; @@ -30,7 +30,7 @@ import appeng.tile.misc.TileInscriber; /** * Renders the dynamic parts of an inscriber (the presses, the animation and the item being smashed) */ -public final class InscriberTESR extends TileEntitySpecialRenderer +public final class InscriberTESR extends TileEntityRenderer { private static final float ITEM_RENDER_SCALE = 1.0f / 1.2f; diff --git a/src/main/java/appeng/client/render/tesr/SkyChestTESR.java b/src/main/java/appeng/client/render/tesr/SkyChestTESR.java index d0fae310b..894067191 100644 --- a/src/main/java/appeng/client/render/tesr/SkyChestTESR.java +++ b/src/main/java/appeng/client/render/tesr/SkyChestTESR.java @@ -19,124 +19,100 @@ package appeng.client.render.tesr; +import appeng.block.storage.BlockSkyChest; +import appeng.block.storage.BlockSkyChest.SkyChestType; +import appeng.core.AppEng; +import appeng.tile.storage.TileSkyChest; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; import net.minecraft.block.Block; -import net.minecraft.client.model.ModelChest; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.util.Direction; +import net.minecraft.client.renderer.Atlases; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.model.Material; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.TextureStitchEvent; -import appeng.block.storage.BlockSkyChest; -import appeng.block.storage.BlockSkyChest.SkyChestType; -import appeng.client.render.FacingToRotation; -import appeng.core.AppEng; -import appeng.tile.storage.TileSkyChest; +// This is mostly a copy&paste job of the vanilla chest TESR +@OnlyIn(Dist.CLIENT) +public class SkyChestTESR extends TileEntityRenderer { + public static final Material TEXTURE_STONE = new Material(Atlases.CHEST_ATLAS, new ResourceLocation(AppEng.MOD_ID, "models/skychest")); + public static final Material TEXTURE_BLOCK = new Material(Atlases.CHEST_ATLAS, new ResourceLocation(AppEng.MOD_ID, "models/skyblockchest")); -@OnlyIn( Dist.CLIENT ) -public class SkyChestTESR extends TileEntitySpecialRenderer -{ + private final ModelRenderer singleLid; + private final ModelRenderer singleBottom; + private final ModelRenderer singleLatch; - private static final ResourceLocation TEXTURE_STONE = new ResourceLocation( AppEng.MOD_ID, "textures/models/skychest.png" ); - private static final ResourceLocation TEXTURE_BLOCK = new ResourceLocation( AppEng.MOD_ID, "textures/models/skyblockchest.png" ); + public SkyChestTESR(TileEntityRendererDispatcher rendererDispatcherIn) { + super(rendererDispatcherIn); - private final ModelChest simpleChest = new ModelChest(); + this.singleBottom = new ModelRenderer(64, 64, 0, 19); + this.singleBottom.addBox(1.0F, 0.0F, 1.0F, 14.0F, 10.0F, 14.0F, 0.0F); + this.singleLid = new ModelRenderer(64, 64, 0, 0); + this.singleLid.addBox(1.0F, 0.0F, 0.0F, 14.0F, 5.0F, 14.0F, 0.0F); + this.singleLid.rotationPointY = 9.0F; + this.singleLid.rotationPointZ = 1.0F; + this.singleLatch = new ModelRenderer(64, 64, 0, 0); + this.singleLatch.addBox(7.0F, -1.0F, 15.0F, 2.0F, 4.0F, 1.0F, 0.0F); + this.singleLatch.rotationPointY = 8.0F; + } - public SkyChestTESR() - { + public void render(TileSkyChest tileEntityIn, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, int combinedOverlayIn) { + matrixStackIn.push(); + float f = tileEntityIn.getForward().getHorizontalAngle(); + matrixStackIn.translate(0.5D, 0.5D, 0.5D); + matrixStackIn.rotate(Vector3f.YP.rotationDegrees(-f)); + matrixStackIn.translate(-0.5D, -0.5D, -0.5D); - } + float f1 = tileEntityIn.getLidAngle(partialTicks); + f1 = 1.0F - f1; + f1 = 1.0F - f1 * f1 * f1; + Material material = this.getMaterial(tileEntityIn); + IVertexBuilder ivertexbuilder = material.getBuffer(bufferIn, RenderType::getEntityCutout); + this.renderModels(matrixStackIn, ivertexbuilder, this.singleLid, this.singleLatch, this.singleBottom, f1, combinedLightIn, combinedOverlayIn); - @Override - public void render( TileSkyChest te, double x, double y, double z, float partialTicks, int destroyStage, float p_render_10_ ) - { - GlStateManager.enableDepth(); - GlStateManager.depthFunc( 515 ); - GlStateManager.depthMask( true ); + matrixStackIn.pop(); + } - ModelChest modelchest; + private void renderModels(MatrixStack matrixStackIn, IVertexBuilder bufferIn, ModelRenderer chestLid, ModelRenderer chestLatch, ModelRenderer chestBottom, float lidAngle, int combinedLightIn, int combinedOverlayIn) { + chestLid.rotateAngleX = -(lidAngle * 1.5707964F); + chestLatch.rotateAngleX = chestLid.rotateAngleX; + chestLid.render(matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn); + chestLatch.render(matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn); + chestBottom.render(matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn); + } - modelchest = this.simpleChest; + protected Material getMaterial(TileSkyChest tileEntity) { + SkyChestType type = SkyChestType.BLOCK; + if (tileEntity.getWorld() != null) { + Block blockType = tileEntity.getBlockState().getBlock(); - if( destroyStage >= 0 ) - { - this.bindTexture( DESTROY_STAGES[destroyStage] ); - GlStateManager.matrixMode( 5890 ); - GlStateManager.pushMatrix(); - GlStateManager.scale( 4.0F, 4.0F, 1.0F ); - GlStateManager.translate( 0.0625F, 0.0625F, 0.0625F ); - GlStateManager.matrixMode( 5888 ); - } - else - { - SkyChestType chestType = getChestType( te ); - this.bindTexture( chestType == SkyChestType.STONE ? TEXTURE_STONE : TEXTURE_BLOCK ); - } + if (blockType instanceof BlockSkyChest) { + type = ((BlockSkyChest) blockType).type; + } + } - GlStateManager.pushMatrix(); - GlStateManager.enableRescaleNormal(); - GlStateManager.color( 1.0F, 1.0F, 1.0F, 1.0F ); - GlStateManager.translate( (float) x, (float) y + 1.0F, (float) z + 1.0F ); - GlStateManager.scale( 1.0F, -1.0F, -1.0F ); - if( te != null ) - { - GlStateManager.translate( 0.5F, 0.5F, 0.5F ); - // In the vanilla chest model, north and south are flipped - Direction forward = te.getForward(); - Direction up = te.getUp(); - if( forward == Direction.SOUTH ) - { - forward = Direction.NORTH; - } - else if( forward == Direction.NORTH ) - { - forward = Direction.SOUTH; - } - if( up == Direction.SOUTH ) - { - up = Direction.NORTH; - } - else if( up == Direction.NORTH ) - { - up = Direction.SOUTH; - } - FacingToRotation.get( forward, up ).glRotateCurrentMat(); - GlStateManager.translate( -0.5F, -0.5F, -0.5F ); - } - float f = te != null ? te.getPrevLidAngle() + ( te.getLidAngle() - te.getPrevLidAngle() ) * partialTicks : 0; + switch (type) { + case STONE: + return TEXTURE_STONE; + default: + case BLOCK: + return TEXTURE_BLOCK; + } + } - f = 1.0F - f; - f = 1.0F - f * f * f; - modelchest.chestLid.rotateAngleX = -( f * ( (float) Math.PI / 2F ) ); - modelchest.renderAll(); - GlStateManager.disableRescaleNormal(); - GlStateManager.popMatrix(); - GlStateManager.color( 1.0F, 1.0F, 1.0F, 1.0F ); - - if( destroyStage >= 0 ) - { - GlStateManager.matrixMode( 5890 ); - GlStateManager.popMatrix(); - GlStateManager.matrixMode( 5888 ); - } - } - - // Defensively determine the sky chest type - private static SkyChestType getChestType( TileSkyChest te ) - { - if( te == null ) - { - return SkyChestType.BLOCK; - } - - Block blockType = te.getBlockType(); - if( blockType instanceof BlockSkyChest ) - { - return ( (BlockSkyChest) blockType ).type; - } - return SkyChestType.BLOCK; - } + public static void registerTextures(TextureStitchEvent.Pre evt) { + if (evt.getMap().getTextureLocation().equals(Atlases.CHEST_ATLAS)) { + evt.addSprite(TEXTURE_STONE.getTextureLocation()); + evt.addSprite(TEXTURE_BLOCK.getTextureLocation()); + } + } } diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index c322597f9..03ae73cb3 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -31,6 +31,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.item.Item; import net.minecraft.particles.ParticleType; import net.minecraft.stats.StatType; +import net.minecraft.tileentity.TileEntityType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.MinecraftForge; @@ -102,7 +103,9 @@ public final class AppEng modEventBus.addGenericListener(Item.class, registration::registerItems); modEventBus.addGenericListener(EntityType.class, registration::registerEntities); modEventBus.addGenericListener(ParticleType.class, registration::registerParticleTypes); + modEventBus.addGenericListener(TileEntityType.class, registration::registerTileEntities); modEventBus.addListener(registration::registerParticleFactories); + modEventBus.addListener(registration::registerTextures); modEventBus.addListener(this::commonSetup); diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 3fc1b8854..aef2c2f42 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -20,14 +20,12 @@ package appeng.core; import appeng.bootstrap.IModelRegistry; -import appeng.bootstrap.components.IBlockRegistrationComponent; -import appeng.bootstrap.components.IEntityRegistrationComponent; -import appeng.bootstrap.components.IItemRegistrationComponent; -import appeng.bootstrap.components.IModelRegistrationComponent; +import appeng.bootstrap.components.*; import appeng.client.render.effects.ChargedOreFX; import appeng.client.render.effects.LightningFX; import appeng.client.render.effects.VibrantFX; import appeng.client.render.model.GlassModelLoader; +import appeng.client.render.tesr.SkyChestTESR; import appeng.core.stats.AeStats; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -36,15 +34,13 @@ import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.entity.EntityType; import net.minecraft.item.Item; import net.minecraft.particles.ParticleType; -import net.minecraft.stats.IStatFormatter; -import net.minecraft.stats.StatType; -import net.minecraft.stats.Stats; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.registry.Registry; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.loading.FMLEnvironment; @@ -225,6 +221,13 @@ final class Registration definitions.getRegistry().getBootstrapComponents( IItemRegistrationComponent.class ).forEachRemaining( b -> b.itemRegistration( dist, registry ) ); } + public void registerTileEntities( RegistryEvent.Register> event ) + { + final IForgeRegistry> registry = event.getRegistry(); + final ApiDefinitions definitions = Api.INSTANCE.definitions(); + definitions.getRegistry().getBootstrapComponents( ITileEntityRegistrationComponent.class ).forEachRemaining(b -> b.register( registry ) ); + } + // @SubscribeEvent // public void registerRecipes( RegistryEvent.Register event ) // { @@ -525,4 +528,8 @@ final class Registration // // } + public void registerTextures(TextureStitchEvent.Pre event) { + SkyChestTESR.registerTextures(event); + } + } diff --git a/src/main/java/appeng/core/api/definitions/ApiBlocks.java b/src/main/java/appeng/core/api/definitions/ApiBlocks.java index 498fc384b..1df9d0837 100644 --- a/src/main/java/appeng/core/api/definitions/ApiBlocks.java +++ b/src/main/java/appeng/core/api/definitions/ApiBlocks.java @@ -24,14 +24,16 @@ import appeng.api.definitions.IBlocks; import appeng.api.definitions.ITileDefinition; import appeng.block.misc.BlockQuartzFixture; import appeng.block.spatial.BlockMatrixFrame; -import appeng.bootstrap.BlockRenderingCustomizer; -import appeng.bootstrap.FeatureFactory; -import appeng.bootstrap.IBlockRendering; -import appeng.bootstrap.IItemRendering; +import appeng.block.storage.BlockSkyChest; +import appeng.block.storage.SkyChestRenderingCustomizer; +import appeng.bootstrap.*; +import appeng.bootstrap.definitions.TileEntityDefinition; +import appeng.client.render.tesr.SkyChestTESR; import appeng.core.features.AEFeature; import appeng.core.features.registries.PartModels; import appeng.decorative.AEDecorativeBlock; import appeng.decorative.solid.*; +import appeng.tile.storage.TileSkyChest; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; @@ -197,17 +199,30 @@ public final class ApiBlocks implements IBlocks .addFeatures( AEFeature.SKY_STONE ) .build(); -// this.skyStoneChest = registry.block( "sky_stone_chest", () -> new BlockSkyChest( SkyChestType.STONE ) ) -// .features( AEFeature.SKY_STONE, AEFeature.SKY_STONE_CHESTS ) -// .tileEntity( new TileEntityDefinition( TileSkyChest.class, "sky_stone_chest" ) ) -// .rendering( new SkyChestRenderingCustomizer( SkyChestType.STONE ) ) -// .build(); -// this.smoothSkyStoneChest = registry.block( "smooth_sky_stone_chest", () -> new BlockSkyChest( SkyChestType.BLOCK ) ) -// .features( AEFeature.SKY_STONE, AEFeature.SKY_STONE_CHESTS ) -// .tileEntity( new TileEntityDefinition( TileSkyChest.class, "sky_stone_chest" ) ) -// .rendering( new SkyChestRenderingCustomizer( SkyChestType.BLOCK ) ) -// .build(); -// + Block.Properties skyStoneChestProps = Block.Properties.create(Material.ROCK) + .hardnessAndResistance(50, 150) + .notSolid(); + + TileEntityDefinition skyChestTile = registry.tileEntity("sky_chest", TileSkyChest.class, TileSkyChest::new) + .rendering(new TileEntityRenderingCustomizer() { + @Override + @OnlyIn(Dist.CLIENT) + public void customize(TileEntityRendering rendering) { + rendering.tileEntityRenderer(SkyChestTESR::new); + } + }) + .build(); + this.skyStoneChest = registry.block( "sky_stone_chest", () -> new BlockSkyChest( BlockSkyChest.SkyChestType.STONE, skyStoneChestProps ) ) + .features( AEFeature.SKY_STONE, AEFeature.SKY_STONE_CHESTS ) + .tileEntity( skyChestTile ) + // .rendering( new SkyChestRenderingCustomizer( BlockSkyChest.SkyChestType.STONE ) ) + .build(); + this.smoothSkyStoneChest = registry.block( "smooth_sky_stone_chest", () -> new BlockSkyChest( BlockSkyChest.SkyChestType.BLOCK, skyStoneChestProps ) ) + .features( AEFeature.SKY_STONE, AEFeature.SKY_STONE_CHESTS ) + .tileEntity( skyChestTile ) + // .rendering( new SkyChestRenderingCustomizer( BlockSkyChest.SkyChestType.BLOCK ) ) + .build(); + // this.skyCompass = registry.block( "sky_compass", BlockSkyCompass::new ) // .features( AEFeature.METEORITE_COMPASS ) // .tileEntity( new TileEntityDefinition( TileSkyCompass.class ) ) diff --git a/src/main/java/appeng/debug/TileChunkLoader.java b/src/main/java/appeng/debug/TileChunkLoader.java index 65cb96921..131a95413 100644 --- a/src/main/java/appeng/debug/TileChunkLoader.java +++ b/src/main/java/appeng/debug/TileChunkLoader.java @@ -23,7 +23,7 @@ import java.util.List; import net.minecraft.entity.player.PlayerEntityMP; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.ITickable; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.text.TextComponentString; import net.minecraftforge.common.ForgeChunkManager; @@ -37,14 +37,14 @@ import appeng.tile.AEBaseTile; import appeng.util.Platform; -public class TileChunkLoader extends AEBaseTile implements ITickable +public class TileChunkLoader extends AEBaseTile implements ITickableTileEntity { private boolean requestTicket = true; private Ticket ct = null; @Override - public void update() + public void tick() { if( this.requestTicket ) { diff --git a/src/main/java/appeng/debug/TileCubeGenerator.java b/src/main/java/appeng/debug/TileCubeGenerator.java index a4401749b..b239ae0b6 100644 --- a/src/main/java/appeng/debug/TileCubeGenerator.java +++ b/src/main/java/appeng/debug/TileCubeGenerator.java @@ -22,9 +22,9 @@ package appeng.debug; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Hand; -import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.StringTextComponent; @@ -33,7 +33,7 @@ import appeng.tile.AEBaseTile; import appeng.util.Platform; -public class TileCubeGenerator extends AEBaseTile implements ITickable +public class TileCubeGenerator extends AEBaseTile implements ITickableTileEntity { private int size = 3; @@ -42,7 +42,7 @@ public class TileCubeGenerator extends AEBaseTile implements ITickable private PlayerEntity who = null; @Override - public void update() + public void tick() { if( !this.is.isEmpty() && Platform.isServer() ) { diff --git a/src/main/java/appeng/debug/TileEnergyGenerator.java b/src/main/java/appeng/debug/TileEnergyGenerator.java index 44227ca2d..2868fa125 100644 --- a/src/main/java/appeng/debug/TileEnergyGenerator.java +++ b/src/main/java/appeng/debug/TileEnergyGenerator.java @@ -25,9 +25,9 @@ import javax.annotation.Nullable; import com.google.common.math.IntMath; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.IEnergyStorage; @@ -35,7 +35,7 @@ import net.minecraftforge.energy.IEnergyStorage; import appeng.tile.AEBaseTile; -public class TileEnergyGenerator extends AEBaseTile implements ITickable, IEnergyStorage +public class TileEnergyGenerator extends AEBaseTile implements ITickableTileEntity, IEnergyStorage { /** * The base energy injected each tick. @@ -44,7 +44,7 @@ public class TileEnergyGenerator extends AEBaseTile implements ITickable, IEnerg private static final int BASE_ENERGY = 8; @Override - public void update() + public void tick() { int tier = 1; final EnumSet validEnergyReceivers = EnumSet.noneOf( Direction.class ); diff --git a/src/main/java/appeng/spatial/CachedPlane.java b/src/main/java/appeng/spatial/CachedPlane.java index cd2da5486..d348f3bc1 100644 --- a/src/main/java/appeng/spatial/CachedPlane.java +++ b/src/main/java/appeng/spatial/CachedPlane.java @@ -26,7 +26,7 @@ import java.util.Map.Entry; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.texture.ITickable; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.NextTickListEntry; @@ -189,7 +189,7 @@ public class CachedPlane try { this.getWorld().loadedTileEntityList.remove( te ); - if( te instanceof ITickable ) + if( te instanceof ITickableTileEntity) { this.getWorld().tickableTileEntities.remove( te ); } diff --git a/src/main/java/appeng/tile/grindstone/TileCrank.java b/src/main/java/appeng/tile/grindstone/TileCrank.java index fc938e2b6..dc8b32c86 100644 --- a/src/main/java/appeng/tile/grindstone/TileCrank.java +++ b/src/main/java/appeng/tile/grindstone/TileCrank.java @@ -28,9 +28,9 @@ import io.netty.buffer.ByteBuf; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -41,7 +41,7 @@ import appeng.tile.AEBaseTile; import appeng.util.Platform; -public class TileCrank extends AEBaseTile implements ICustomCollision, ITickable +public class TileCrank extends AEBaseTile implements ICustomCollision, ITickableTileEntity { private final int ticksPerRotation = 18; @@ -54,7 +54,7 @@ public class TileCrank extends AEBaseTile implements ICustomCollision, ITickable private int rotation = 0; @Override - public void update() + public void tick() { if( this.rotation > 0 ) { diff --git a/src/main/java/appeng/tile/inventory/AppEngInternalAEInventory.java b/src/main/java/appeng/tile/inventory/AppEngInternalAEInventory.java index 925b83caa..400fcba49 100644 --- a/src/main/java/appeng/tile/inventory/AppEngInternalAEInventory.java +++ b/src/main/java/appeng/tile/inventory/AppEngInternalAEInventory.java @@ -23,6 +23,7 @@ import java.util.Iterator; import javax.annotation.Nonnull; +import appeng.core.Api; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraftforge.items.IItemHandlerModifiable; @@ -83,7 +84,7 @@ public class AppEngInternalAEInventory implements IItemHandlerModifiable, Iterab if( this.inv[x] != null ) { - this.inv[x].write(c); + this.inv[x].writeToNBT(c); } target.put( "#" + x, c ); diff --git a/src/main/java/appeng/tile/misc/TileLightDetector.java b/src/main/java/appeng/tile/misc/TileLightDetector.java index a6ab84b2e..e17525a5e 100644 --- a/src/main/java/appeng/tile/misc/TileLightDetector.java +++ b/src/main/java/appeng/tile/misc/TileLightDetector.java @@ -19,13 +19,13 @@ package appeng.tile.misc; -import net.minecraft.util.ITickable; import appeng.tile.AEBaseTile; import appeng.util.Platform; +import net.minecraft.tileentity.ITickableTileEntity; -public class TileLightDetector extends AEBaseTile implements ITickable +public class TileLightDetector extends AEBaseTile implements ITickableTileEntity { private int lastCheck = 30; @@ -37,7 +37,7 @@ public class TileLightDetector extends AEBaseTile implements ITickable } @Override - public void update() + public void tick() { this.lastCheck++; if( this.lastCheck > 30 ) diff --git a/src/main/java/appeng/tile/networking/CableBusTESR.java b/src/main/java/appeng/tile/networking/CableBusTESR.java index b03997e96..34a672a36 100644 --- a/src/main/java/appeng/tile/networking/CableBusTESR.java +++ b/src/main/java/appeng/tile/networking/CableBusTESR.java @@ -19,14 +19,14 @@ package appeng.tile.networking; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.util.Direction; import appeng.api.parts.IPart; import appeng.tile.AEBaseTile; -public class CableBusTESR extends TileEntitySpecialRenderer +public class CableBusTESR extends TileEntityRenderer { @Override diff --git a/src/main/java/appeng/tile/qnb/TileQuantumBridge.java b/src/main/java/appeng/tile/qnb/TileQuantumBridge.java index 3591e137c..74f426059 100644 --- a/src/main/java/appeng/tile/qnb/TileQuantumBridge.java +++ b/src/main/java/appeng/tile/qnb/TileQuantumBridge.java @@ -29,9 +29,9 @@ import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.EmptyHandler; @@ -53,7 +53,7 @@ import appeng.util.Platform; import appeng.util.inv.InvOperation; -public class TileQuantumBridge extends AENetworkInvTile implements IAEMultiBlock, ITickable +public class TileQuantumBridge extends AENetworkInvTile implements IAEMultiBlock, ITickableTileEntity { private final byte corner = 16; private final AppEngInternalInventory internalInventory = new AppEngInternalInventory( this, 1, 1 ); @@ -73,7 +73,7 @@ public class TileQuantumBridge extends AENetworkInvTile implements IAEMultiBlock } @Override - public void update() + public void tick() { if( this.updateStatus ) { diff --git a/src/main/java/appeng/tile/storage/TileChest.java b/src/main/java/appeng/tile/storage/TileChest.java index 622d2d9d9..4067a18d0 100644 --- a/src/main/java/appeng/tile/storage/TileChest.java +++ b/src/main/java/appeng/tile/storage/TileChest.java @@ -32,8 +32,8 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; import net.minecraftforge.common.capabilities.Capability; import net.minecraft.fluid.Fluid; import net.minecraftforge.fluids.FluidStack; @@ -106,7 +106,7 @@ import appeng.util.inv.filter.IAEItemFilter; import appeng.util.item.AEItemStack; -public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminalHost, IPriorityHost, IConfigManagerHost, IColorableTile, ITickable +public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminalHost, IPriorityHost, IConfigManagerHost, IColorableTile, ITickableTileEntity { private final AppEngInternalInventory inputInventory = new AppEngInternalInventory( this, 1 ); private final AppEngInternalInventory cellInventory = new AppEngInternalInventory( this, 1 ); @@ -347,7 +347,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminal } @Override - public void update() + public void tick() { if( this.world.isRemote ) { diff --git a/src/main/java/appeng/tile/storage/TileSkyChest.java b/src/main/java/appeng/tile/storage/TileSkyChest.java index 1020be483..a7e709d0e 100644 --- a/src/main/java/appeng/tile/storage/TileSkyChest.java +++ b/src/main/java/appeng/tile/storage/TileSkyChest.java @@ -21,22 +21,25 @@ package appeng.tile.storage; import java.io.IOException; +import appeng.block.storage.BlockSkyChest; import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ITickable; +import net.minecraft.tileentity.IChestLid; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraftforge.items.IItemHandler; import appeng.tile.AEBaseInvTile; import appeng.tile.inventory.AppEngInternalInventory; import appeng.util.inv.InvOperation; - -public class TileSkyChest extends AEBaseInvTile implements ITickable +public class TileSkyChest extends AEBaseInvTile implements ITickableTileEntity, IChestLid { private final AppEngInternalInventory inv = new AppEngInternalInventory( this, 9 * 4 ); @@ -47,6 +50,10 @@ public class TileSkyChest extends AEBaseInvTile implements ITickable private float lidAngle; private float prevLidAngle; + public TileSkyChest(TileEntityType type) { + super(type); + } + @Override protected void writeToStream( final PacketBuffer data ) throws IOException { @@ -92,9 +99,7 @@ public class TileSkyChest extends AEBaseInvTile implements ITickable if( !player.isSpectator() ) { this.setPlayerOpen( this.getPlayerOpen() + 1 ); - this.world.addBlockEvent( this.pos, this.getBlockType(), 1, this.numPlayersUsing ); - this.world.notifyNeighborsOfStateChange( this.pos, this.getBlockType(), true ); - this.world.notifyNeighborsOfStateChange( this.pos.down(), this.getBlockType(), true ); + onOpenOrClose(); if( this.getPlayerOpen() == 1 ) { @@ -111,9 +116,7 @@ public class TileSkyChest extends AEBaseInvTile implements ITickable if( !player.isSpectator() ) { this.setPlayerOpen( this.getPlayerOpen() - 1 ); - this.world.addBlockEvent( this.pos, this.getBlockType(), 1, this.numPlayersUsing ); - this.world.notifyNeighborsOfStateChange( this.pos, this.getBlockType(), true ); - this.world.notifyNeighborsOfStateChange( this.pos.down(), this.getBlockType(), true ); + onOpenOrClose(); if( this.getPlayerOpen() < 0 ) { @@ -130,8 +133,19 @@ public class TileSkyChest extends AEBaseInvTile implements ITickable } } + // See ChestTileEntity + private void onOpenOrClose() { + Block block = this.getBlockState().getBlock(); + if (block instanceof BlockSkyChest) { + this.world.addBlockEvent(this.pos, block, 1, this.numPlayersUsing); + this.world.notifyNeighborsOfStateChange(this.pos, block); + // FIXME: Uhm, we are we doing this? + this.world.notifyNeighborsOfStateChange(this.pos.down(), block); + } + } + @Override - public void update() + public void tick() { int i = this.pos.getX(); int j = this.pos.getY(); @@ -212,4 +226,11 @@ public class TileSkyChest extends AEBaseInvTile implements ITickable { this.lastEvent = lastEvent; } + + @Override + public float getLidAngle(float v) { + // FIXME: Do it nicely as the chest does it (interpolation, baby!) + return lidAngle; + } + }