diff --git a/src/main/java/mod/chiselsandbits/api/ModKeyBinding.java b/src/main/java/mod/chiselsandbits/api/ModKeyBinding.java index 57c48e54..86eb9699 100644 --- a/src/main/java/mod/chiselsandbits/api/ModKeyBinding.java +++ b/src/main/java/mod/chiselsandbits/api/ModKeyBinding.java @@ -6,7 +6,7 @@ @SideOnly( Side.CLIENT ) public enum ModKeyBinding { - //Misc + // Misc ROTATE_CCW, ROTATE_CW, UNDO, @@ -14,8 +14,9 @@ public enum ModKeyBinding MODE_MENU, ADD_TO_CLIPBOARD, PICK_BIT, + OFFGRID_PLACEMENT, - //Chisel Modes + // Chisel Modes SINGLE, SNAP2, SNAP4, @@ -30,13 +31,13 @@ public enum ModKeyBinding DRAWN_REGION, CONNECTED_MATERIAL, - //Positive Pattern Modes + // Positive Pattern Modes REPLACE, ADDITIVE, PLACEMENT, IMPOSE, - //Tape Measure Modes + // Tape Measure Modes BIT, BLOCK, DISTANCE; diff --git a/src/main/java/mod/chiselsandbits/chiseledblock/ItemBlockChiseled.java b/src/main/java/mod/chiselsandbits/chiseledblock/ItemBlockChiseled.java index f6aad627..416c51d8 100644 --- a/src/main/java/mod/chiselsandbits/chiseledblock/ItemBlockChiseled.java +++ b/src/main/java/mod/chiselsandbits/chiseledblock/ItemBlockChiseled.java @@ -69,7 +69,7 @@ public void addInformation( super.addInformation( stack, worldIn, tooltip, advanced ); ChiselsAndBits.getConfig().helpText( LocalStrings.HelpChiseledBlock, tooltip, ClientSide.instance.getKeyName( Minecraft.getMinecraft().gameSettings.keyBindUseItem ), - ClientSide.instance.getKeyName( Minecraft.getMinecraft().gameSettings.keyBindSneak ) ); + ClientSide.instance.getKeyName( ClientSide.getOffGridPlacementKey() ) ); if ( stack.hasTagCompound() ) { @@ -99,7 +99,7 @@ public boolean canPlaceBlockOnSide( final EntityPlayer player, final ItemStack stack ) { - return canPlaceBlockHere( worldIn, pos, side, player, stack ); + return canPlaceBlockHere( worldIn, pos, side, player, stack, false ); } public boolean vanillaStylePlacementTest( @@ -128,14 +128,15 @@ public boolean canPlaceBlockHere( final @Nonnull BlockPos pos, final @Nonnull EnumFacing side, final EntityPlayer player, - final ItemStack stack ) + final ItemStack stack, + boolean offgrid ) { if ( vanillaStylePlacementTest( worldIn, pos, side, player, stack ) ) { return true; } - if ( player.isSneaking() ) + if ( offgrid ) { return true; } @@ -150,8 +151,8 @@ public boolean canPlaceBlockHere( @Override public EnumActionResult onItemUse( - final EntityPlayer playerIn, - final World worldIn, + final EntityPlayer player, + final World world, final BlockPos pos, final EnumHand hand, final EnumFacing side, @@ -159,37 +160,32 @@ public EnumActionResult onItemUse( final float hitY, final float hitZ ) { - final ItemStack stack = playerIn.getHeldItem( hand ); + final ItemStack stack = player.getHeldItem( hand ); - if ( playerIn.isSneaking() ) + if ( !world.isRemote ) { - if ( !worldIn.isRemote ) - { - // Say it "worked", Don't do anything we'll get a better packet. - return EnumActionResult.SUCCESS; - } - else - { - // send accurate packet. - final PacketAccurateSneakPlace pasp = new PacketAccurateSneakPlace(); - - pasp.hand = hand; - pasp.pos = pos; - pasp.side = side; - pasp.stack = stack; - pasp.hitX = hitX; - pasp.hitY = hitY; - pasp.hitZ = hitZ; - - NetworkRouter.instance.sendToServer( pasp ); - } + // Say it "worked", Don't do anything we'll get a better packet. + return EnumActionResult.SUCCESS; } - return doItemUse( stack, playerIn, worldIn, pos, hand, side, hitX, hitY, hitZ ); + // send accurate packet. + final PacketAccurateSneakPlace pasp = new PacketAccurateSneakPlace(); + + pasp.hand = hand; + pasp.pos = pos; + pasp.side = side; + pasp.stack = stack; + pasp.offgrid = ClientSide.offGridPlacement( player ); + pasp.hitX = hitX; + pasp.hitY = hitY; + pasp.hitZ = hitZ; + + NetworkRouter.instance.sendToServer( pasp ); + return placeItem( stack, player, world, pos, hand, side, hitX, hitY, hitZ, ClientSide.offGridPlacement( player ) ); } @Override - public EnumActionResult doItemUse( + public EnumActionResult placeItem( final ItemStack stack, final EntityPlayer playerIn, final World worldIn, @@ -198,7 +194,8 @@ public EnumActionResult doItemUse( EnumFacing side, final float hitX, final float hitY, - final float hitZ ) + final float hitZ, + boolean offgrid ) { final IBlockState state = worldIn.getBlockState( pos ); final Block block = state.getBlock(); @@ -221,7 +218,7 @@ public EnumActionResult doItemUse( } } - if ( !canMerge && !playerIn.isSneaking() && !block.isReplaceable( worldIn, pos ) ) + if ( !canMerge && !offgrid && !block.isReplaceable( worldIn, pos ) ) { pos = pos.offset( side ); } @@ -239,12 +236,12 @@ else if ( pos.getY() == 255 && DeprecationHelper.getStateFromItem( stack ).getMa { return EnumActionResult.FAIL; } - else if ( canPlaceBlockHere( worldIn, pos, side, playerIn, stack ) ) + else if ( canPlaceBlockHere( worldIn, pos, side, playerIn, stack, offgrid ) ) { final int i = this.getMetadata( stack.getMetadata() ); final IBlockState iblockstate1 = this.block.getStateForPlacement( worldIn, pos, side, hitX, hitY, hitZ, i, playerIn, hand ); - if ( placeBlockAt( stack, playerIn, worldIn, pos, side, hitX, hitY, hitZ, iblockstate1 ) ) + if ( placeBitBlock( stack, playerIn, worldIn, pos, side, hitX, hitY, hitZ, iblockstate1, offgrid ) ) { worldIn.playSound( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, DeprecationHelper.getSoundType( this.block ).getPlaceSound(), SoundCategory.BLOCKS, ( DeprecationHelper.getSoundType( this.block ).getVolume() + 1.0F ) / 2.0F, @@ -272,7 +269,22 @@ public boolean placeBlockAt( final float hitZ, final IBlockState newState ) { - if ( player.isSneaking() ) + return placeBitBlock( stack, player, world, pos, side, hitX, hitY, hitZ, newState, false ); + } + + public boolean placeBitBlock( + final ItemStack stack, + final EntityPlayer player, + final World world, + final BlockPos pos, + final EnumFacing side, + final float hitX, + final float hitY, + final float hitZ, + final IBlockState newState, + boolean offgrid ) + { + if ( offgrid ) { final BitLocation bl = new BitLocation( new RayTraceResult( RayTraceResult.Type.BLOCK, new Vec3d( hitX, hitY, hitZ ), side, pos ), false, BitOperation.PLACE ); return tryPlaceBlockAt( block, stack, player, world, bl.blockPos, side, EnumHand.MAIN_HAND, new BlockPos( bl.bitX, bl.bitY, bl.bitZ ), true ); diff --git a/src/main/java/mod/chiselsandbits/client/ModConflictContext.java b/src/main/java/mod/chiselsandbits/client/ModConflictContext.java index 47cb6c5f..8e260d3b 100644 --- a/src/main/java/mod/chiselsandbits/client/ModConflictContext.java +++ b/src/main/java/mod/chiselsandbits/client/ModConflictContext.java @@ -9,6 +9,7 @@ import mod.chiselsandbits.helpers.ChiselToolType; import mod.chiselsandbits.helpers.ModUtil; import mod.chiselsandbits.interfaces.IVoxelBlobItem; +import mod.chiselsandbits.network.packets.PacketAccurateSneakPlace.IItemBlockAccurate; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -18,6 +19,36 @@ public enum ModConflictContext implements IKeyConflictContext { + HOLDING_OFFGRID + { + @Override + public boolean isActive() + { + if ( super.isActive() ) + { + return true; + } + + try + { + final ItemStack held = getPlayer().getHeldItemMainhand(); + return !ModUtil.isEmpty( held ) && held.getItem() instanceof IItemBlockAccurate; + } + catch ( final NoPlayerException e ) + { + // just fail. + } + + return false; + } + + @Override + public boolean conflicts( + final IKeyConflictContext other ) + { + return this == other || other == KeyConflictContext.IN_GAME; + } + }, HOLDING_ROTATEABLE { diff --git a/src/main/java/mod/chiselsandbits/core/ClientSide.java b/src/main/java/mod/chiselsandbits/core/ClientSide.java index 30971889..9210d34a 100644 --- a/src/main/java/mod/chiselsandbits/core/ClientSide.java +++ b/src/main/java/mod/chiselsandbits/core/ClientSide.java @@ -147,6 +147,7 @@ public class ClientSide private KeyBinding modeMenu; private KeyBinding addToClipboard; private KeyBinding pickBit; + private KeyBinding offgridPlacement; private Stopwatch rotateTimer; final public TapeMeasures tapeMeasures = new TapeMeasures(); @@ -168,6 +169,8 @@ public KeyBinding getKeyBinding( return addToClipboard; case PICK_BIT: return pickBit; + case OFFGRID_PLACEMENT: + return ClientSide.getOffGridPlacementKey(); default: return modeMenu; } @@ -209,6 +212,7 @@ public void init( rotateCCW = registerKeybind( "mod.chiselsandbits.other.rotate.ccw", 0, "itemGroup.chiselsandbits", ModConflictContext.HOLDING_ROTATEABLE ); rotateCW = registerKeybind( "mod.chiselsandbits.other.rotate.cw", 0, "itemGroup.chiselsandbits", ModConflictContext.HOLDING_ROTATEABLE ); pickBit = registerKeybind( "mod.chiselsandbits.other.pickbit", 0, "itemGroup.chiselsandbits", ModConflictContext.HOLDING_ROTATEABLE ); + offgridPlacement = registerKeybind( "mod.chiselsandbits.other.offgrid", 0, "itemGroup.chiselsandbits", ModConflictContext.HOLDING_OFFGRID ); undo = registerKeybind( "mod.chiselsandbits.other.undo", 0, "itemGroup.chiselsandbits", KeyConflictContext.IN_GAME ); redo = registerKeybind( "mod.chiselsandbits.other.redo", 0, "itemGroup.chiselsandbits", KeyConflictContext.IN_GAME ); addToClipboard = registerKeybind( "mod.chiselsandbits.other.add_to_clipboard", 0, "itemGroup.chiselsandbits", KeyConflictContext.IN_GAME ); @@ -1242,7 +1246,7 @@ private void doGhostForChiseledBlock( { final BlockPos offset = mop.getBlockPos(); - if ( player.isSneaking() ) + if ( ClientSide.offGridPlacement( player ) ) { final BitLocation bl = new BitLocation( mop, true, BitOperation.PLACE ); showGhost( currentItem, item, bl.blockPos, player, rotations, x, y, z, mop.sideHit, new BlockPos( bl.bitX, bl.bitY, bl.bitZ ), null ); @@ -1263,7 +1267,7 @@ private void doGhostForChiseledBlock( BlockPos newOffset = offset; final Block block = theWorld.getBlockState( newOffset ).getBlock(); - if ( !canMerge && !player.isSneaking() && !block.isReplaceable( theWorld, newOffset ) ) + if ( !canMerge && !ClientSide.offGridPlacement( player ) && !block.isReplaceable( theWorld, newOffset ) ) { newOffset = offset.offset( mop.sideHit ); } @@ -1673,4 +1677,21 @@ private String makeMoreFrendly( .replace( "RSHIFT", LocalStrings.rightShift.getLocal() ); } + public static boolean offGridPlacement( + EntityPlayer player ) + { + if ( player.getEntityWorld().isRemote ) + return getOffGridPlacementKey().isKeyDown(); + + throw new RuntimeException( "checking keybinds on server." ); + } + + public static KeyBinding getOffGridPlacementKey() + { + if ( ClientSide.instance.offgridPlacement.isSetToDefaultValue() ) + return Minecraft.getMinecraft().gameSettings.keyBindSneak; + + return ClientSide.instance.offgridPlacement; + } + } diff --git a/src/main/java/mod/chiselsandbits/items/ItemPositivePrint.java b/src/main/java/mod/chiselsandbits/items/ItemPositivePrint.java index 84067ee7..5ea288be 100644 --- a/src/main/java/mod/chiselsandbits/items/ItemPositivePrint.java +++ b/src/main/java/mod/chiselsandbits/items/ItemPositivePrint.java @@ -122,43 +122,41 @@ public EnumActionResult onItemUse( final ItemStack stack = player.getHeldItem( hand ); final IBlockState blkstate = world.getBlockState( pos ); - if ( ItemChiseledBit.checkRequiredSpace( player, blkstate ) ) { + if ( ItemChiseledBit.checkRequiredSpace( player, blkstate ) ) + { return EnumActionResult.FAIL; } + boolean offgrid = false; + if ( PositivePatternMode.getMode( stack ) == PositivePatternMode.PLACEMENT ) { - if ( player.isSneaking() ) + if ( !world.isRemote ) { - if ( !world.isRemote ) - { - // Say it "worked", Don't do anything we'll get a better - // packet. - return EnumActionResult.SUCCESS; - } - else - { - // send accurate packet. - final PacketAccurateSneakPlace pasp = new PacketAccurateSneakPlace(); - - pasp.hand = hand; - pasp.pos = pos; - pasp.side = side; - pasp.stack = stack; - pasp.hitX = hitX; - pasp.hitY = hitY; - pasp.hitZ = hitZ; - - NetworkRouter.instance.sendToServer( pasp ); - } + // Say it "worked", Don't do anything we'll get a better + // packet. + return EnumActionResult.SUCCESS; } + + // send accurate packet. + final PacketAccurateSneakPlace pasp = new PacketAccurateSneakPlace(); + + pasp.hand = hand; + pasp.pos = pos; + pasp.side = side; + pasp.stack = stack; + pasp.hitX = hitX; + pasp.hitY = hitY; + pasp.hitZ = hitZ; + offgrid = pasp.offgrid = ClientSide.offGridPlacement( player ); + + NetworkRouter.instance.sendToServer( pasp ); } - return doItemUse( stack, player, world, pos, hand, side, hitX, hitY, hitZ ); + return placeItem( stack, player, world, pos, hand, side, hitX, hitY, hitZ, offgrid ); } - @Override - public final EnumActionResult doItemUse( + public final EnumActionResult placeItem( final ItemStack stack, final EntityPlayer player, final World world, @@ -167,7 +165,8 @@ public final EnumActionResult doItemUse( final EnumFacing side, final float hitX, final float hitY, - final float hitZ ) + final float hitZ, + boolean offgrid ) { if ( PositivePatternMode.getMode( stack ) == PositivePatternMode.PLACEMENT ) { @@ -180,7 +179,7 @@ public final EnumActionResult doItemUse( if ( consumeEntirePattern( pattern, stats, pos, ActingPlayer.testingAs( player, hand ) ) && output.getItem() instanceof ItemBlockChiseled ) { final ItemBlockChiseled ibc = (ItemBlockChiseled) output.getItem(); - final EnumActionResult res = ibc.doItemUse( output, player, world, pos, hand, side, hitX, hitY, hitZ ); + final EnumActionResult res = ibc.placeItem( output, player, world, pos, hand, side, hitX, hitY, hitZ, offgrid ); if ( res == EnumActionResult.SUCCESS ) { @@ -312,7 +311,7 @@ else if ( bit.isValid() ) BitInventoryFeeder feeder = new BitInventoryFeeder( who, world ); for ( final EntityItem ei : spawnlist ) { - feeder.addItem(ei); + feeder.addItem( ei ); ItemBitBag.cleanupInventory( who, ei.getEntityItem() ); } diff --git a/src/main/java/mod/chiselsandbits/network/packets/PacketAccurateSneakPlace.java b/src/main/java/mod/chiselsandbits/network/packets/PacketAccurateSneakPlace.java index 7c1a0251..27e6658e 100644 --- a/src/main/java/mod/chiselsandbits/network/packets/PacketAccurateSneakPlace.java +++ b/src/main/java/mod/chiselsandbits/network/packets/PacketAccurateSneakPlace.java @@ -22,7 +22,7 @@ public class PacketAccurateSneakPlace extends ModPacket public interface IItemBlockAccurate { - EnumActionResult doItemUse( + EnumActionResult placeItem( @Nonnull ItemStack inHand, @Nonnull EntityPlayer playerEntity, @Nonnull World worldObj, @@ -31,7 +31,8 @@ EnumActionResult doItemUse( @Nonnull EnumFacing side, float hitX, float hitY, - float hitZ ); + float hitZ, + boolean offgrid ); }; @@ -42,6 +43,7 @@ EnumActionResult doItemUse( public EnumHand hand; public EnumFacing side; public float hitX, hitY, hitZ; + public boolean offgrid; @Override public void server( @@ -58,7 +60,7 @@ public void server( } final IItemBlockAccurate ibc = (IItemBlockAccurate) stack.getItem(); - ibc.doItemUse( inHand, playerEntity, playerEntity.worldObj, pos, hand, side, hitX, hitY, hitZ ); + ibc.placeItem( inHand, playerEntity, playerEntity.worldObj, pos, hand, side, hitX, hitY, hitZ, offgrid ); if ( !playerEntity.capabilities.isCreativeMode && ModUtil.getStackSize( inHand ) <= 0 ) { @@ -79,6 +81,7 @@ public void getPayload( buffer.writeFloat( hitX ); buffer.writeFloat( hitY ); buffer.writeFloat( hitZ ); + buffer.writeBoolean( offgrid ); } @Override @@ -94,6 +97,7 @@ public void readPayload( hitX = buffer.readFloat(); hitY = buffer.readFloat(); hitZ = buffer.readFloat(); + offgrid = buffer.readBoolean(); } catch ( final IOException e ) { diff --git a/src/main/resources/assets/chiselsandbits/lang/en_us.lang b/src/main/resources/assets/chiselsandbits/lang/en_us.lang index 066723ad..7908d4f7 100644 --- a/src/main/resources/assets/chiselsandbits/lang/en_us.lang +++ b/src/main/resources/assets/chiselsandbits/lang/en_us.lang @@ -79,6 +79,7 @@ mod.chiselsandbits.other.mode=Radial Menu mod.chiselsandbits.other.undo=Undo mod.chiselsandbits.other.redo=Redo mod.chiselsandbits.other.pickbit=Pick Bit +mod.chiselsandbits.other.offgrid=Place Off Grid mod.chiselsandbits.other.add_to_clipboard=Pick Block to Clipboard mod.chiselsandbits.help.shiftdetails=