/** * MrCrayfish's Furniture Mod * Copyright (C) 2016 MrCrayfish (http://www.mrcrayfish.com/) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mrcrayfish.furniture.blocks; import java.util.List; import java.util.Random; import com.mrcrayfish.furniture.init.FurnitureAchievements; import com.mrcrayfish.furniture.init.FurnitureItems; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockDoorBell extends BlockFurniture { public static final PropertyBool POWERED = PropertyBool.create("powered"); public BlockDoorBell(Material material) { super(material); this.setStepSound(Block.soundTypeWood); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(POWERED, Boolean.valueOf(true))); this.setTickRandomly(true); } @Override public boolean isOpaqueCube() { return false; } @Override public boolean isFullCube() { return false; } @Override public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state) { return null; } @Override public int tickRate(World worldIn) { return 30; } @Override public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { EnumFacing[] aenumfacing = EnumFacing.values(); int i = aenumfacing.length; for (int j = 2; j < i; ++j) { EnumFacing enumfacing = aenumfacing[j]; if (worldIn.getBlockState(pos.offset(enumfacing)).getBlock().isNormalCube()) { return true; } } return false; } @Override public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { return this.getDefaultState().withProperty(FACING, facing.getOpposite()).withProperty(POWERED, Boolean.valueOf(false)); } @Override public void onNeighborBlockChange(World worldIn, BlockPos pos, IBlockState state, Block neighborBlock) { if (this.func_176583_e(worldIn, pos, state)) { EnumFacing enumfacing = (EnumFacing) state.getValue(FACING); if (!worldIn.getBlockState(pos.offset(enumfacing)).getBlock().isNormalCube()) { this.dropBlockAsItem(worldIn, pos, state, 0); worldIn.setBlockToAir(pos); } } } private boolean func_176583_e(World worldIn, BlockPos p_176583_2_, IBlockState p_176583_3_) { if (!this.canPlaceBlockAt(worldIn, p_176583_2_)) { this.dropBlockAsItem(worldIn, p_176583_2_, p_176583_3_, 0); worldIn.setBlockToAir(p_176583_2_); return false; } else { return true; } } @Override public void setBlockBoundsBasedOnState(IBlockAccess access, BlockPos pos) { this.func_180681_d(access.getBlockState(pos)); } private void func_180681_d(IBlockState state) { float f = 0.3F; float f1 = 0.7F; float f2 = 0.1F; float f3 = 0.15F; EnumFacing enumfacing = (EnumFacing) state.getValue(FACING); switch (enumfacing.getIndex()) { case 5: this.setBlockBounds(1.0F - f3, f, 0.5F - f2, 1.0F, f1, 0.5F + f2); break; case 4: this.setBlockBounds(0.0F, f, 0.5F - f2, f3, f1, 0.5F + f2); break; case 2: this.setBlockBounds(0.5F - f2, f, 0.0F, 0.5F + f2, f1, f3); break; case 3: this.setBlockBounds(0.5F - f2, f, 1.0F - f3, 0.5F + f2, f1, 1.0F); break; } } @Override public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) { if (state.getValue(POWERED)) { return true; } else { worldIn.setBlockState(pos, state.withProperty(POWERED, Boolean.valueOf(true)), 3); worldIn.markBlockRangeForRenderUpdate(pos, pos); worldIn.playSoundEffect((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, "cfm:doorbell", 1.0F, 1.0F); worldIn.scheduleUpdate(pos, this, this.tickRate(worldIn)); playerIn.triggerAchievement(FurnitureAchievements.dingDong); return true; } } public void randomTick(World worldIn, BlockPos pos, IBlockState state, Random random) { } @Override public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { if (!worldIn.isRemote) { if (((Boolean) state.getValue(POWERED)).booleanValue()) { this.handleArrow(worldIn, pos, state); } } } @Override public void setBlockBoundsForItemRender() { float f = 0.1875F; float f1 = 0.125F; float f2 = 0.125F; this.setBlockBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2); } @Override public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) { if (!worldIn.isRemote) { if (!((Boolean) state.getValue(POWERED)).booleanValue()) { this.handleArrow(worldIn, pos, state); } } } private void handleArrow(World worldIn, BlockPos p_180680_2_, IBlockState p_180680_3_) { this.func_180681_d(p_180680_3_); List list = worldIn.getEntitiesWithinAABB(EntityArrow.class, new AxisAlignedBB((double) p_180680_2_.getX() + this.minX, (double) p_180680_2_.getY() + this.minY, (double) p_180680_2_.getZ() + this.minZ, (double) p_180680_2_.getX() + this.maxX, (double) p_180680_2_.getY() + this.maxY, (double) p_180680_2_.getZ() + this.maxZ)); boolean flag = !list.isEmpty(); boolean flag1 = ((Boolean) p_180680_3_.getValue(POWERED)).booleanValue(); if (flag && !flag1) { worldIn.setBlockState(p_180680_2_, p_180680_3_.withProperty(POWERED, Boolean.valueOf(true))); worldIn.markBlockRangeForRenderUpdate(p_180680_2_, p_180680_2_); worldIn.playSoundEffect((double) p_180680_2_.getX() + 0.5D, (double) p_180680_2_.getY() + 0.5D, (double) p_180680_2_.getZ() + 0.5D, "random.click", 0.3F, 0.6F); } if (!flag && flag1) { worldIn.setBlockState(p_180680_2_, p_180680_3_.withProperty(POWERED, Boolean.valueOf(false))); worldIn.markBlockRangeForRenderUpdate(p_180680_2_, p_180680_2_); worldIn.playSoundEffect((double) p_180680_2_.getX() + 0.5D, (double) p_180680_2_.getY() + 0.5D, (double) p_180680_2_.getZ() + 0.5D, "random.click", 0.3F, 0.5F); } if (flag) { worldIn.scheduleUpdate(p_180680_2_, this, this.tickRate(worldIn)); } } @Override public IBlockState getStateFromMeta(int meta) { EnumFacing enumfacing; switch (meta) { case 0: enumfacing = EnumFacing.NORTH; break; case 1: enumfacing = EnumFacing.EAST; break; case 2: enumfacing = EnumFacing.SOUTH; break; case 3: enumfacing = EnumFacing.WEST; break; default: enumfacing = EnumFacing.NORTH; } return this.getDefaultState().withProperty(FACING, enumfacing).withProperty(POWERED, Boolean.valueOf(meta > 3)); } @Override public int getMetaFromState(IBlockState state) { int meta = ((EnumFacing) state.getValue(FACING)).getIndex(); if (((Boolean) state.getValue(POWERED)).booleanValue()) { meta += 4; } return meta; } @Override protected BlockState createBlockState() { return new BlockState(this, new IProperty[] { FACING, POWERED }); } }