package carpetextra.utils; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.ComparatorBlock; import net.minecraft.block.DispenserBlock; import net.minecraft.block.FacingBlock; import net.minecraft.block.GlazedTerracottaBlock; import net.minecraft.block.HorizontalFacingBlock; import net.minecraft.block.ObserverBlock; import net.minecraft.block.PistonBlock; import net.minecraft.block.RepeaterBlock; import net.minecraft.block.StairsBlock; import net.minecraft.block.TrapdoorBlock; import net.minecraft.block.enums.BlockHalf; import net.minecraft.block.enums.ComparatorMode; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemPlacementContext; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; public class BlockPlacer { public static BlockState alternativeBlockPlacement(Block block, ItemPlacementContext context)//World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { //actual alternative block placement code Direction facing; Vec3d vec3d = context.getHitPos(); BlockPos pos = context.getBlockPos(); float hitX = (float) vec3d.x - pos.getX(); if (hitX<2) // vanilla return null; int code = (int)(hitX-2)/2; // // now it would be great if hitX was adjusted in context to original range from 0.0 to 1.0 // since its actually using it. Its private - maybe with Reflections? // PlayerEntity placer = context.getPlayer(); World world = context.getWorld(); if (block instanceof GlazedTerracottaBlock) { facing = Direction.byId(code); if(facing == Direction.UP || facing == Direction.DOWN) { facing = placer.getHorizontalFacing().getOpposite(); } return block.getDefaultState().with(HorizontalFacingBlock.FACING, facing); } else if (block instanceof ObserverBlock) { return block.getDefaultState() .with(FacingBlock.FACING, Direction.byId(code)) .with(ObserverBlock.POWERED, true); } else if (block instanceof RepeaterBlock) { facing = Direction.byId(code % 16); if(facing == Direction.UP || facing == Direction.DOWN) { facing = placer.getHorizontalFacing().getOpposite(); } return block.getDefaultState() .with(HorizontalFacingBlock.FACING, facing) .with(RepeaterBlock.DELAY, MathHelper.clamp(code / 16, 1, 4)) .with(RepeaterBlock.LOCKED, Boolean.FALSE); } else if (block instanceof TrapdoorBlock) { return block.getDefaultState() .with(TrapdoorBlock.FACING, Direction.byId(code % 16)) .with(TrapdoorBlock.OPEN, Boolean.FALSE) .with(TrapdoorBlock.HALF, (code >= 16) ? BlockHalf.TOP : BlockHalf.BOTTOM) .with(TrapdoorBlock.OPEN, world.isReceivingRedstonePower(pos)); } else if (block instanceof ComparatorBlock) { facing = Direction.byId(code % 16); if((facing == Direction.UP) || (facing == Direction.DOWN)) { facing = placer.getHorizontalFacing().getOpposite(); } ComparatorMode m = (hitX >= 16)?ComparatorMode.SUBTRACT: ComparatorMode.COMPARE; return block.getDefaultState() .with(HorizontalFacingBlock.FACING, facing) .with(ComparatorBlock.POWERED, Boolean.FALSE) .with(ComparatorBlock.MODE, m); } else if (block instanceof DispenserBlock) { return block.getDefaultState() .with(DispenserBlock.FACING, Direction.byId(code)) .with(DispenserBlock.TRIGGERED, Boolean.FALSE); } else if (block instanceof PistonBlock) { return block.getDefaultState() .with(FacingBlock.FACING, Direction.byId(code)) .with(PistonBlock.EXTENDED, Boolean.FALSE); } else if (block instanceof StairsBlock) { return block.getPlacementState(context)//worldIn, pos, facing, hitX, hitY, hitZ, meta, placer) .with(StairsBlock.FACING, Direction.byId(code % 16)) .with(StairsBlock.HALF, ( hitX >= 16)?BlockHalf.TOP : BlockHalf.BOTTOM); } return null; } }