future protocol for alternative block placement

This commit is contained in:
gnembon committed 2019-05-14 15:59:37 -03:00
1 parent e6a3d478ec
commit b88471a081
1 file changed
+47 -14
+47 -14
View File
@@ -1,7 +1,26 @@
package carpet.helpers; package carpet.helpers;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import net.minecraft.block.*; import net.minecraft.block.AbstractRedstoneGateBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.ComparatorBlock;
import net.minecraft.block.DispenserBlock;
import net.minecraft.block.EndRodBlock;
import net.minecraft.block.FacingBlock;
import net.minecraft.block.FenceGateBlock;
import net.minecraft.block.GlazedTerracottaBlock;
import net.minecraft.block.HopperBlock;
import net.minecraft.block.HorizontalFacingBlock;
import net.minecraft.block.LeverBlock;
import net.minecraft.block.ObserverBlock;
import net.minecraft.block.PistonBlock;
import net.minecraft.block.RailBlock;
import net.minecraft.block.RepeaterBlock;
import net.minecraft.block.SlabBlock;
import net.minecraft.block.StairsBlock;
import net.minecraft.block.TrapdoorBlock;
import net.minecraft.block.enums.BlockHalf; import net.minecraft.block.enums.BlockHalf;
import net.minecraft.block.enums.ComparatorMode; import net.minecraft.block.enums.ComparatorMode;
import net.minecraft.block.enums.SlabType; import net.minecraft.block.enums.SlabType;
@@ -12,7 +31,11 @@ import net.minecraft.item.ItemPlacementContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockRotation; import net.minecraft.util.BlockRotation;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.*; import net.minecraft.util.math.BlockPointer;
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; import net.minecraft.world.World;
public class BlockRotator public class BlockRotator
@@ -30,16 +53,26 @@ public class BlockRotator
{ {
//actual alternative block placement code //actual alternative block placement code
// //
if (true) throw new UnsupportedOperationException("Alternative Block Placement / client controlled / is not implemnted");
Direction facing; Direction facing;
Vec3d vec3d = context.getPos(); Vec3d vec3d = context.getPos();
float hitX = (float) vec3d.x; float hitX = (float) vec3d.x;
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(); PlayerEntity placer = context.getPlayer();
BlockPos pos = context.getBlockPos(); BlockPos pos = context.getBlockPos();
World world = context.getWorld(); World world = context.getWorld();
if (block instanceof GlazedTerracottaBlock) if (block instanceof GlazedTerracottaBlock)
{ {
facing = Direction.byId((int)hitX - 2); facing = Direction.byId(code);
if(facing == Direction.UP || facing == Direction.DOWN) if(facing == Direction.UP || facing == Direction.DOWN)
{ {
facing = placer.getHorizontalFacing().getOpposite(); facing = placer.getHorizontalFacing().getOpposite();
@@ -49,37 +82,37 @@ public class BlockRotator
else if (block instanceof ObserverBlock) else if (block instanceof ObserverBlock)
{ {
return block.getDefaultState() return block.getDefaultState()
.with(FacingBlock.FACING, Direction.byId((int)hitX - 2)) .with(FacingBlock.FACING, Direction.byId(code))
.with(ObserverBlock.POWERED, true); .with(ObserverBlock.POWERED, true);
} }
else if (block instanceof RepeaterBlock) else if (block instanceof RepeaterBlock)
{ {
facing = Direction.byId((((int)hitX) % 10) - 2); facing = Direction.byId(code % 16);
if(facing == Direction.UP || facing == Direction.DOWN) if(facing == Direction.UP || facing == Direction.DOWN)
{ {
facing = placer.getHorizontalFacing().getOpposite(); facing = placer.getHorizontalFacing().getOpposite();
} }
return block.getDefaultState() return block.getDefaultState()
.with(HorizontalFacingBlock.FACING, facing) .with(HorizontalFacingBlock.FACING, facing)
.with(RepeaterBlock.DELAY, MathHelper.clamp((((int) hitX) / 10) + 1, 1, 4)) .with(RepeaterBlock.DELAY, MathHelper.clamp(code / 16, 1, 4))
.with(RepeaterBlock.LOCKED, Boolean.FALSE); .with(RepeaterBlock.LOCKED, Boolean.FALSE);
} }
else if (block instanceof TrapdoorBlock) else if (block instanceof TrapdoorBlock)
{ {
return block.getDefaultState() return block.getDefaultState()
.with(TrapdoorBlock.FACING, Direction.byId((((int)hitX) % 10) - 2)) .with(TrapdoorBlock.FACING, Direction.byId(code % 16))
.with(TrapdoorBlock.OPEN, Boolean.FALSE) .with(TrapdoorBlock.OPEN, Boolean.FALSE)
.with(TrapdoorBlock.HALF, (hitX > 10) ? BlockHalf.TOP : BlockHalf.BOTTOM) .with(TrapdoorBlock.HALF, (code >= 16) ? BlockHalf.TOP : BlockHalf.BOTTOM)
.with(TrapdoorBlock.OPEN, world.isReceivingRedstonePower(pos)); .with(TrapdoorBlock.OPEN, world.isReceivingRedstonePower(pos));
} }
else if (block instanceof ComparatorBlock) else if (block instanceof ComparatorBlock)
{ {
facing = Direction.byId((((int)hitX) % 10) - 2); facing = Direction.byId(code % 16);
if((facing == Direction.UP) || (facing == Direction.DOWN)) if((facing == Direction.UP) || (facing == Direction.DOWN))
{ {
facing = placer.getHorizontalFacing().getOpposite(); facing = placer.getHorizontalFacing().getOpposite();
} }
ComparatorMode m = (hitX > 10)?ComparatorMode.SUBTRACT: ComparatorMode.COMPARE; ComparatorMode m = (hitX >= 16)?ComparatorMode.SUBTRACT: ComparatorMode.COMPARE;
return block.getDefaultState() return block.getDefaultState()
.with(HorizontalFacingBlock.FACING, facing) .with(HorizontalFacingBlock.FACING, facing)
.with(ComparatorBlock.POWERED, Boolean.FALSE) .with(ComparatorBlock.POWERED, Boolean.FALSE)
@@ -88,20 +121,20 @@ public class BlockRotator
else if (block instanceof DispenserBlock) else if (block instanceof DispenserBlock)
{ {
return block.getDefaultState() return block.getDefaultState()
.with(DispenserBlock.FACING, Direction.byId((int)hitX - 2)) .with(DispenserBlock.FACING, Direction.byId(code))
.with(DispenserBlock.TRIGGERED, Boolean.FALSE); .with(DispenserBlock.TRIGGERED, Boolean.FALSE);
} }
else if (block instanceof PistonBlock) else if (block instanceof PistonBlock)
{ {
return block.getDefaultState() return block.getDefaultState()
.with(FacingBlock.FACING, Direction.byId((int)hitX - 2) ) .with(FacingBlock.FACING, Direction.byId(code))
.with(PistonBlock.EXTENDED, Boolean.FALSE); .with(PistonBlock.EXTENDED, Boolean.FALSE);
} }
else if (block instanceof StairsBlock) else if (block instanceof StairsBlock)
{ {
return block.getPlacementState(context)//worldIn, pos, facing, hitX, hitY, hitZ, meta, placer) return block.getPlacementState(context)//worldIn, pos, facing, hitX, hitY, hitZ, meta, placer)
.with(StairsBlock.FACING, Direction.byId((((int)hitX) % 10) - 2)) .with(StairsBlock.FACING, Direction.byId(code % 16))
.with(StairsBlock.HALF, ( hitX > 10)?BlockHalf.TOP : BlockHalf.BOTTOM); .with(StairsBlock.HALF, ( hitX >= 16)?BlockHalf.TOP : BlockHalf.BOTTOM);
} }
return null; return null;
} }