package net.minecraft.block; import com.google.common.base.Predicate; import java.util.List; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityHopper; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumWorldBlockLayer; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; /**+ * This portion of EaglercraftX contains deobfuscated Minecraft 1.8 source code. * * Minecraft 1.8.8 bytecode is (c) 2015 Mojang AB. "Do not distribute!" * Mod Coder Pack v9.18 deobfuscation configs are (c) Copyright by the MCP Team * * EaglercraftX 1.8 patch files are (c) 2022-2023 LAX1DUDE. All Rights Reserved. * * WITH THE EXCEPTION OF PATCH FILES, MINIFIED JAVASCRIPT, AND ALL FILES * NORMALLY FOUND IN AN UNMODIFIED MINECRAFT RESOURCE PACK, YOU ARE NOT ALLOWED * TO SHARE, DISTRIBUTE, OR REPURPOSE ANY FILE USED BY OR PRODUCED BY THE * SOFTWARE IN THIS REPOSITORY WITHOUT PRIOR PERMISSION FROM THE PROJECT AUTHOR. * * NOT FOR COMMERCIAL OR MALICIOUS USE * * (please read the 'LICENSE' file this repo's root directory for more info) * */ public class BlockHopper extends BlockContainer { public static final PropertyDirection FACING = PropertyDirection.create( "facing", new Predicate() { public boolean apply(EnumFacing enumfacing) { return enumfacing != EnumFacing.UP; } } ); public static final PropertyBool ENABLED = PropertyBool.create("enabled"); public BlockHopper() { super(Material.iron, MapColor.stoneColor); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.DOWN).withProperty(ENABLED, Boolean.valueOf(true))); this.setCreativeTab(CreativeTabs.tabRedstone); this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); } public void setBlockBoundsBasedOnState(IBlockAccess var1, BlockPos var2) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); } /**+ * Add all collision boxes of this Block to the list that * intersect with the given mask. */ public void addCollisionBoxesToList(World world, BlockPos blockpos, IBlockState iblockstate, AxisAlignedBB axisalignedbb, List list, Entity entity) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.625F, 1.0F); super.addCollisionBoxesToList(world, blockpos, iblockstate, axisalignedbb, list, entity); float f = 0.125F; this.setBlockBounds(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); super.addCollisionBoxesToList(world, blockpos, iblockstate, axisalignedbb, list, entity); this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); super.addCollisionBoxesToList(world, blockpos, iblockstate, axisalignedbb, list, entity); this.setBlockBounds(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); super.addCollisionBoxesToList(world, blockpos, iblockstate, axisalignedbb, list, entity); this.setBlockBounds(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); super.addCollisionBoxesToList(world, blockpos, iblockstate, axisalignedbb, list, entity); this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); } /**+ * Called by ItemBlocks just before a block is actually set in * the world, to allow for adjustments to the IBlockstate */ public IBlockState onBlockPlaced(World var1, BlockPos var2, EnumFacing enumfacing, float var4, float var5, float var6, int var7, EntityLivingBase var8) { EnumFacing enumfacing1 = enumfacing.getOpposite(); if (enumfacing1 == EnumFacing.UP) { enumfacing1 = EnumFacing.DOWN; } return this.getDefaultState().withProperty(FACING, enumfacing1).withProperty(ENABLED, Boolean.valueOf(true)); } /**+ * Returns a new instance of a block's tile entity class. Called * on placing the block. */ public TileEntity createNewTileEntity(World var1, int var2) { return new TileEntityHopper(); } /**+ * Called by ItemBlocks after a block is set in the world, to * allow post-place logic */ public void onBlockPlacedBy(World world, BlockPos blockpos, IBlockState iblockstate, EntityLivingBase entitylivingbase, ItemStack itemstack) { super.onBlockPlacedBy(world, blockpos, iblockstate, entitylivingbase, itemstack); if (itemstack.hasDisplayName()) { TileEntity tileentity = world.getTileEntity(blockpos); if (tileentity instanceof TileEntityHopper) { ((TileEntityHopper) tileentity).setCustomName(itemstack.getDisplayName()); } } } public void onBlockAdded(World world, BlockPos blockpos, IBlockState iblockstate) { this.updateState(world, blockpos, iblockstate); } public boolean onBlockActivated(World world, BlockPos blockpos, IBlockState var3, EntityPlayer entityplayer, EnumFacing var5, float var6, float var7, float var8) { return true; } /**+ * Called when a neighboring block changes. */ public void onNeighborBlockChange(World world, BlockPos blockpos, IBlockState iblockstate, Block var4) { this.updateState(world, blockpos, iblockstate); } private void updateState(World worldIn, BlockPos pos, IBlockState state) { boolean flag = !worldIn.isBlockPowered(pos); if (flag != ((Boolean) state.getValue(ENABLED)).booleanValue()) { worldIn.setBlockState(pos, state.withProperty(ENABLED, Boolean.valueOf(flag)), 4); } } public void breakBlock(World world, BlockPos blockpos, IBlockState iblockstate) { TileEntity tileentity = world.getTileEntity(blockpos); if (tileentity instanceof TileEntityHopper) { InventoryHelper.dropInventoryItems(world, blockpos, (TileEntityHopper) tileentity); world.updateComparatorOutputLevel(blockpos, this); } super.breakBlock(world, blockpos, iblockstate); } /**+ * The type of render function called. 3 for standard block * models, 2 for TESR's, 1 for liquids, -1 is no render */ public int getRenderType() { return 3; } public boolean isFullCube() { return false; } /**+ * Used to determine ambient occlusion and culling when * rebuilding chunks for render */ public boolean isOpaqueCube() { return false; } public boolean shouldSideBeRendered(IBlockAccess var1, BlockPos var2, EnumFacing var3) { return true; } public static EnumFacing getFacing(int meta) { return EnumFacing.getFront(meta & 7); } /**+ * Get's the hopper's active status from the 8-bit of the * metadata. Note that the metadata stores whether the block is * powered, so this returns true when that bit is 0. */ public static boolean isEnabled(int meta) { return (meta & 8) != 8; } public boolean hasComparatorInputOverride() { return true; } public int getComparatorInputOverride(World world, BlockPos blockpos) { return Container.calcRedstone(world.getTileEntity(blockpos)); } public EnumWorldBlockLayer getBlockLayer() { return EnumWorldBlockLayer.CUTOUT_MIPPED; } /**+ * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int i) { return this.getDefaultState().withProperty(FACING, getFacing(i)).withProperty(ENABLED, Boolean.valueOf(isEnabled(i))); } /**+ * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState iblockstate) { int i = 0; i = i | ((EnumFacing) iblockstate.getValue(FACING)).getIndex(); if (!((Boolean) iblockstate.getValue(ENABLED)).booleanValue()) { i |= 8; } return i; } protected BlockState createBlockState() { return new BlockState(this, new IProperty[] { FACING, ENABLED }); } }