Raycoms Posted September 8, 2016 Share Posted September 8, 2016 I'm currently porting to 1.10 and have a few questions. I had a TileEntity with a custom renderer. But a lot methods changed in the block. How do I set the following in 1.10: setBlockBounds((float) START_COLLISION, (float) BOTTOM_COLLISION, (float) START_COLLISION, (float) END_COLLISION, (float) HEIGHT_COLLISION, (float) END_COLLISION); @Override public boolean isFullCube(IBlockState state) { return false; } Currently the block doesn't move but it is planned for the future that's why we use the TileEntitySpecialRenderer. The entity is missing the texture and the bottom seems to be opaque. package com.minecolonies.client.render; import com.minecolonies.blocks.BlockHutField; import com.minecolonies.client.model.ModelScarecrowBoth; import com.minecolonies.lib.Constants; import com.minecolonies.tileentities.ScarecrowTileEntity; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.jetbrains.annotations.NotNull; /** * Class to render the scarecrow. */ @SideOnly(Side.CLIENT) public class TileEntityScarecrowRenderer extends TileEntitySpecialRenderer<ScarecrowTileEntity> { /** * Offset to the block middle. */ private static final double BLOCK_MIDDLE = 0.5; /** * Y-Offset in order to have the scarecrow over ground. */ private static final double YOFFSET = 1.5; /** * Which size the scarecrow should have ingame. */ private static final double SIZERATIO = .0625; /** * Rotate the model some degrees. */ private static final int ROTATION = 180; /** * Rotate it on the following x offset. */ private static final float XROTATIONOFFSET = 0.311F; /** * Rotate it on the following y offset. */ private static final float YROTATIONOFFSET = 0.0F; /** * Rotate it on the following z offset. */ private static final float ZROTATIONOFFSET = 2.845F; /** * Basic rotation to achieve a certain direction. */ private static final int BASIC_ROTATION = 90; /** * Rotate by amount to go east. */ private static final int ROTATE_EAST = 1; /** * Rotate by amount to go south. */ private static final int ROTATE_SOUTH = 2; /** * Rotate by amount to go west. */ private static final int ROTATE_WEST = 3; /** * The model of the scarecrow. */ @NotNull private final ModelScarecrowBoth model; /** * The public constructor for the renderer. */ public TileEntityScarecrowRenderer() { super(); this.model = new ModelScarecrowBoth(); } @Override public void renderTileEntityAt(@NotNull ScarecrowTileEntity te, double posX, double posY, double posZ, float partialTicks, int destroyStage) { //Store the transformation GlStateManager.pushMatrix(); //Set viewport to tile entity position to render it GlStateManager.translate(posX + BLOCK_MIDDLE, posY + YOFFSET, posZ + BLOCK_MIDDLE); this.bindTexture(getResourceLocation(te)); GlStateManager.rotate(ROTATION, XROTATIONOFFSET, YROTATIONOFFSET, ZROTATIONOFFSET); //In the case of worldLags tileEntities may sometimes disappear. if (getWorld().getBlockState(te.getPos()).getBlock() instanceof BlockHutField) { final EnumFacing facing = getWorld().getBlockState(te.getPos()).getValue(BlockHutField.FACING); switch (facing) { case EAST: GlStateManager.rotate((float) (BASIC_ROTATION * ROTATE_EAST), 0, 1, 0); break; case SOUTH: GlStateManager.rotate((float) (BASIC_ROTATION * ROTATE_SOUTH), 0, 1, 0); break; case WEST: GlStateManager.rotate((float) (BASIC_ROTATION * ROTATE_WEST), 0, 1, 0); break; default: //don't rotate at all. } } this.model.render((float) SIZERATIO); /* ============ Rendering Code stops here =========== */ //Restore the transformation, so other renderer's are not messed up. GlStateManager.popMatrix(); } /** * Returns the ResourceLocation of the scarecrow texture. * * @param tileEntity the tileEntity of the scarecrow. * @return the location. */ @NotNull private static ResourceLocation getResourceLocation(@NotNull ScarecrowTileEntity tileEntity) { String loc; if (tileEntity.getType() == ScarecrowTileEntity.ScareCrowType.PUMPKINHEAD) { loc = "textures/blocks/blockScarecrowPumpkin.pnh"; } else { loc = "textures/blocks/blockScarecrowNormal.png"; } return new ResourceLocation(Constants.MOD_ID + ":" + loc); } } package com.minecolonies.blocks; import com.minecolonies.MineColonies; import com.minecolonies.colony.Colony; import com.minecolonies.colony.ColonyManager; import com.minecolonies.creativetab.ModCreativeTabs; import com.minecolonies.inventory.InventoryField; import com.minecolonies.lib.Constants; import com.minecolonies.tileentities.ScarecrowTileEntity; import com.minecolonies.util.LanguageHandler; import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockDirectional; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static net.minecraft.util.EnumFacing.*; /** * The class handling the fieldBlocks, placement and activation. */ public class BlockHutField extends BlockContainer { /** * The position it faces. */ public static final PropertyDirection FACING = BlockDirectional.FACING; //public static final PropertyDirection FACING = PropertyDirection.create("FACING", Plane.HORIZONTAL); /** * Hardness of the block. */ private static final float HARDNESS = 10F; /** * Resistance of the block. */ private static final float RESISTANCE = 10F; /** * Start of the collision box at y. */ private static final double BOTTOM_COLLISION = 0.0; /** * Start of the collision box at x and z. */ private static final double START_COLLISION = 0.1; /** * End of the collision box. */ private static final double END_COLLISION = 0.9; /** * Height of the collision box. */ private static final double HEIGHT_COLLISION = 2.5; /** * Registry name for this block. */ private static final String REGISTRY_NAME = "blockHutField"; /** * Constructor called on block placement. */ BlockHutField() { super(Material.WOOD); initBlock(); } /** * Method called by constructor. * Sets basic details of the block. */ private void initBlock() { setRegistryName(REGISTRY_NAME); setUnlocalizedName(Constants.MOD_ID.toLowerCase() + "." + "blockHutField"); setCreativeTab(ModCreativeTabs.MINECOLONIES); //Blast resistance for creepers etc. makes them explosion proof. setResistance(RESISTANCE); //Hardness of 10 takes a long time to mine to not loose progress. setHardness(HARDNESS); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, NORTH)); GameRegistry.register(this); GameRegistry.register((new ItemBlock(this)).setRegistryName(this.getRegistryName())); } @Override public EnumBlockRenderType getRenderType(IBlockState state) { return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; } @Override public int getMetaFromState(@NotNull IBlockState state) { return state.getValue(FACING).getIndex(); } @Override public boolean isFullCube(IBlockState state) { return false; } @Override public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { return false; } @Deprecated public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return new AxisAlignedBB((float) START_COLLISION, (float) BOTTOM_COLLISION, (float) START_COLLISION, (float) END_COLLISION, (float) HEIGHT_COLLISION, (float) END_COLLISION); } @NotNull @Override @SideOnly(Side.CLIENT) public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.SOLID; } @Override public boolean onBlockActivated( World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { //If the world is server, open the inventory of the field. if (!worldIn.isRemote) { @Nullable final Colony colony = ColonyManager.getColony(worldIn, pos); if (colony != null) { playerIn.openGui(MineColonies.instance, 0, worldIn, pos.getX(), pos.getY(), pos.getZ()); return true; } } return false; } // ======================================================================= // ======================= Rendering & IBlockState ======================= // ======================================================================= @Override public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, @Nullable EntityLivingBase placer) { @NotNull final EnumFacing enumFacing = (placer == null) ? NORTH : fromAngle(placer.rotationYaw); return this.getDefaultState().withProperty(FACING, enumFacing); } @Override public void onBlockPlacedBy(@NotNull World worldIn, @NotNull BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) { //Only work on server side. if (worldIn.isRemote) { return; } if (placer instanceof EntityPlayer) { @Nullable final Colony colony = ColonyManager.getColony(worldIn, pos); if (colony != null) { @NotNull final InventoryField inventoryField = new InventoryField(LanguageHandler.getString("com.minecolonies.gui.inventory.scarecrow")); ((ScarecrowTileEntity) worldIn.getTileEntity(pos)).setInventoryField(inventoryField); colony.addNewField((ScarecrowTileEntity) worldIn.getTileEntity(pos), ((EntityPlayer) placer).inventory, pos, worldIn); } } } @NotNull @Override protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, new IProperty[] {FACING}); } @Override public boolean hasTileEntity(final IBlockState state) { return true; } @NotNull @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new ScarecrowTileEntity(); } // ======================================================================= // ===================== END of Rendering & Meta-Data ==================== // ======================================================================= } Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted September 9, 2016 Share Posted September 9, 2016 Where is that block animated? Quote Link to comment Share on other sites More sharing options...
Raycoms Posted September 9, 2016 Author Share Posted September 9, 2016 Currently the block doesn't move but it is planned for the future that's why we use the TileEntitySpecialRenderer. It's not animated yet but we're planning to. Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted September 9, 2016 Share Posted September 9, 2016 setBlockBounds((float) START_COLLISION, (float) BOTTOM_COLLISION, (float) START_COLLISION, (float) END_COLLISION, (float) HEIGHT_COLLISION, (float) END_COLLISION); Use the bounding box methods in Block. @Override public boolean isFullCube(IBlockState state) { return false; } Still exists. Quote Link to comment Share on other sites More sharing options...
Raycoms Posted September 9, 2016 Author Share Posted September 9, 2016 But both these methods are deprecated, so there should be something better to use? It still doesn't render the texture though. Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted September 9, 2016 Share Posted September 9, 2016 But both these methods are deprecated, so there should be something better to use? http://www.minecraftforge.net/forum/index.php/topic,41630.msg221131.html#msg221131 It still doesn't render the texture though. What is Constants.MOD_ID ? Show a screenshot of the texture file in the file explorer of your IDE, showing the file tree. Quote Link to comment Share on other sites More sharing options...
Raycoms Posted September 9, 2016 Author Share Posted September 9, 2016 /src/main/resources/assets/minecolonies/textures/blocks/blockScarecrowPumpkin.png But I'm sure that is correct (If I remove a bit of this resource location he will throw an exception that he is unable to find) Constants.modId is "minecolonies" Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted September 9, 2016 Share Posted September 9, 2016 Then what exactly is the issue? You said "it's not rendering the texture", which to me implies "it's using the missing texture". Quote Link to comment Share on other sites More sharing options...
Raycoms Posted September 9, 2016 Author Share Posted September 9, 2016 It just renders it black and not with the texture, although he is loading the texture correctly, therefore, something is going wrong while setting it. And renders the onclosing blocks transparent. Quote Link to comment Share on other sites More sharing options...
diesieben07 Posted September 9, 2016 Share Posted September 9, 2016 Who is "he"? Did you set the block bounds correctly now? You might also need isOpaqueCube set to false, depending on your model. Quote Link to comment Share on other sites More sharing options...
Raycoms Posted September 9, 2016 Author Share Posted September 9, 2016 Okay, great thank you, that opaque cube method fixed it. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.