diff --git a/src/main/java/mod/chiselsandbits/config/ModConfig.java b/src/main/java/mod/chiselsandbits/config/ModConfig.java index 5b0eab39..2891e8e5 100644 --- a/src/main/java/mod/chiselsandbits/config/ModConfig.java +++ b/src/main/java/mod/chiselsandbits/config/ModConfig.java @@ -299,6 +299,12 @@ public class ModConfig extends Configuration @Configured( category = "Balance Settings" ) public boolean fullBlockCrafting; + + @Configured( category = "Balance Settings" ) + public boolean requireBagSpace; + + @Configured( category = "Balance Settings" ) + public boolean voidExcessBits; // in game state public boolean replaceingBits = false; @@ -360,6 +366,8 @@ private void setDefaults() compatabilityMode = true; maxDrawnRegionSize = 4; bagStackSize = 512; + requireBagSpace = false; + voidExcessBits = false; maxUndoLevel = 32; maxTapeMeasures = 5; diff --git a/src/main/java/mod/chiselsandbits/helpers/ModUtil.java b/src/main/java/mod/chiselsandbits/helpers/ModUtil.java index f8412b11..b0a86cd1 100644 --- a/src/main/java/mod/chiselsandbits/helpers/ModUtil.java +++ b/src/main/java/mod/chiselsandbits/helpers/ModUtil.java @@ -411,7 +411,11 @@ public static void feedPlayer( if ( is != null && !player.inventory.addItemStackToInventory( is ) ) { ei.setEntityItemStack( is ); - spawnItem( world, ei ); + //Never spawn the items for dropped excess items if setting is enabled. + if ( !ChiselsAndBits.getConfig().voidExcessBits ) + { + spawnItem( world, ei ); + } } else { diff --git a/src/main/java/mod/chiselsandbits/items/ItemBitBag.java b/src/main/java/mod/chiselsandbits/items/ItemBitBag.java index 245547d9..b049301e 100644 --- a/src/main/java/mod/chiselsandbits/items/ItemBitBag.java +++ b/src/main/java/mod/chiselsandbits/items/ItemBitBag.java @@ -319,4 +319,23 @@ public double getDurabilityForDisplay( return 0; } + public static boolean hasBagSpace( + final EntityPlayer player, + final int blk ) + { + final List bags = getBags( player.inventory ); + for ( final BagPos bp : bags ) + { + for ( int x = 0; x < bp.inv.getSizeInventory(); x++ ) + { + final ItemStack is = bp.inv.getStackInSlot( x ); + if( ( ItemChiseledBit.sameBit( is, blk ) && ModUtil.getStackSize( is ) < bp.inv.getInventoryStackLimit() ) || ModUtil.isEmpty( is ) ) + { + return true; + } + } + } + return false; + } + } diff --git a/src/main/java/mod/chiselsandbits/items/ItemChisel.java b/src/main/java/mod/chiselsandbits/items/ItemChisel.java index 99071481..1e80233e 100644 --- a/src/main/java/mod/chiselsandbits/items/ItemChisel.java +++ b/src/main/java/mod/chiselsandbits/items/ItemChisel.java @@ -52,6 +52,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; @@ -127,6 +128,9 @@ public boolean onBlockStartBreak( return ItemChisel.fromBreakToChisel( ChiselMode.castMode( ChiselModeManager.getChiselMode( player, ChiselToolType.CHISEL, EnumHand.MAIN_HAND ) ), itemstack, pos, player, EnumHand.MAIN_HAND ); } + //The previous stateId, avoids spamming the require_bag message. + private static BlockPos lastPos = new BlockPos(0, -1, 0); + static public boolean fromBreakToChisel( final ChiselMode mode, final ItemStack itemstack, @@ -135,6 +139,22 @@ static public boolean fromBreakToChisel( final EnumHand hand ) { final IBlockState state = player.getEntityWorld().getBlockState( pos ); + if ( ChiselsAndBits.getConfig().requireBagSpace && !player.isCreative() ) + { + //Cycle every item in any bag, if the player can't store the clicked block then + //send them a message. + final int stateId = ModUtil.getStateId( state ); + if ( !ItemBitBag.hasBagSpace( player, stateId ) ) + { + if( player.worldObj.isRemote && !pos.equals( lastPos ) ) + { + //Only client should handle messaging. + player.addChatMessage( new TextComponentTranslation( "mod.chiselsandbits.result.require_bag" ) ); + lastPos = pos; + } + return false; + } + } if ( BlockBitInfo.canChisel( state ) || MCMultipartProxy.proxyMCMultiPart.isMultiPartTileEntity( player.getEntityWorld(), pos ) || LittleTiles.isLittleTilesBlock( player.getEntityWorld().getTileEntity( pos ) ) ) { if ( itemstack != null && ( timer == null || timer.elapsed( TimeUnit.MILLISECONDS ) > 150 ) ) diff --git a/src/main/java/mod/chiselsandbits/items/ItemChiseledBit.java b/src/main/java/mod/chiselsandbits/items/ItemChiseledBit.java index 8a6afb0f..9128cb46 100644 --- a/src/main/java/mod/chiselsandbits/items/ItemChiseledBit.java +++ b/src/main/java/mod/chiselsandbits/items/ItemChiseledBit.java @@ -458,4 +458,19 @@ public static boolean placeBit( return false; } + + public static boolean hasInventorySpace( + final EntityPlayer player, + final int blk ) + { + for ( int x = 0; x < 36; x++ ) + { + final ItemStack is = player.inventory.getStackInSlot( x ); + if( ( ItemChiseledBit.sameBit( is, blk ) && ModUtil.getStackSize( is ) < is.getMaxStackSize() ) || ModUtil.isEmpty( is ) ) + { + return true; + } + } + return ItemBitBag.hasBagSpace( player, blk ); + } } diff --git a/src/main/java/mod/chiselsandbits/items/ItemNegativePrint.java b/src/main/java/mod/chiselsandbits/items/ItemNegativePrint.java index 92cde512..f697bebf 100644 --- a/src/main/java/mod/chiselsandbits/items/ItemNegativePrint.java +++ b/src/main/java/mod/chiselsandbits/items/ItemNegativePrint.java @@ -38,6 +38,7 @@ import net.minecraft.util.EnumFacing.Axis; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -299,9 +300,32 @@ protected void applyPrint( } } + //The state id of the last item in spawnlist. + int entityItemState = 0; + for ( final EntityItem ei : spawnlist ) { ModUtil.feedPlayer( world, who, ei ); + entityItemState = ItemChiseledBit.getStackState( ei.getEntityItem() ); + } + + //entityItemState is always 0 when remote + if ( !world.isRemote && entityItemState != 0 ) + { + if( ChiselsAndBits.getConfig().requireBagSpace ) + { + if ( !ItemBitBag.hasBagSpace( who, entityItemState ) ) + { + who.addChatMessage( new TextComponentTranslation( "mod.chiselsandbits.result.require_bag_full" ) ); + } + } + else if( ChiselsAndBits.getConfig().voidExcessBits ) + { + if( !ItemChiseledBit.hasInventorySpace( who, entityItemState ) ) + { + who.addChatMessage( new TextComponentTranslation( "mod.chiselsandbits.result.void_excess" ) ); + } + } } } diff --git a/src/main/java/mod/chiselsandbits/network/packets/PacketChisel.java b/src/main/java/mod/chiselsandbits/network/packets/PacketChisel.java index be4a47c7..cf41e578 100644 --- a/src/main/java/mod/chiselsandbits/network/packets/PacketChisel.java +++ b/src/main/java/mod/chiselsandbits/network/packets/PacketChisel.java @@ -35,6 +35,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; @@ -206,13 +207,36 @@ else if ( extracted != null ) } } } - + + //The state id of the last item in spawnlist. + int entityItemState = 0; + for ( final EntityItem ei : spawnlist ) { ModUtil.feedPlayer( world, who, ei ); ItemBitBag.cleanupInventory( who, ei.getEntityItem() ); + entityItemState = ItemChiseledBit.getStackState( ei.getEntityItem() ); } + //entityItemState is always 0 when remote + if ( !world.isRemote && entityItemState != 0 ) + { + if( ChiselsAndBits.getConfig().requireBagSpace ) + { + if ( !ItemBitBag.hasBagSpace( who, entityItemState ) ) + { + who.addChatMessage( new TextComponentTranslation( "mod.chiselsandbits.result.require_bag_full" ) ); + } + } + else if( ChiselsAndBits.getConfig().voidExcessBits ) + { + if( !ItemChiseledBit.hasInventorySpace( who, entityItemState ) ) + { + who.addChatMessage( new TextComponentTranslation( "mod.chiselsandbits.result.void_excess" ) ); + } + } + } + if ( place.usesBits() ) { ItemBitBag.cleanupInventory( who, bitPlaced != null ? bitPlaced : new ItemStack( ChiselsAndBits.getItems().itemBlockBit, 1, OreDictionary.WILDCARD_VALUE ) ); diff --git a/src/main/resources/assets/chiselsandbits/lang/en_us.lang b/src/main/resources/assets/chiselsandbits/lang/en_us.lang index fb728ae4..d0b0a3be 100644 --- a/src/main/resources/assets/chiselsandbits/lang/en_us.lang +++ b/src/main/resources/assets/chiselsandbits/lang/en_us.lang @@ -70,6 +70,9 @@ mod.chiselsandbits.result.has_changed=Block has changed mod.chiselsandbits.result.missing_bits=Not enough bits or chisel durability! mod.chiselsandbits.result.nothing_to_undo=Nothing to Undo mod.chiselsandbits.result.nothing_to_redo=Nothing to Redo +mod.chiselsandbits.result.require_bag=You need a bag with empty slots before you can use the chisel! +mod.chiselsandbits.result.require_bag_full=Your bag has filled up! +mod.chiselsandbits.result.void_excess=Your inventory has filled up, any excess bits have been voided! mod.chiselsandbits.other.rotate.ccw=Rotate Held Counter Clockwise mod.chiselsandbits.other.rotate.cw=Rotate Held Clockwise @@ -255,3 +258,7 @@ mod.chiselsandbits.config.enableVivecraftCompatibility=Enable Vivecraft Compatib mod.chiselsandbits.config.enableChiselCrafting=Enable Chiseling Blocks in Crafting Table mod.chiselsandbits.config.dynamicRenderFullChunksOnly=Dynamic Renderer Full Chunks Only mod.chiselsandbits.config.dynamicRenderFullChunksOnly.tooltip=Prevents Subdividing of dynamically rendered chunks into single blocks. This increases performance for most common cases ( chunks with a handful of complicated blocks ), but decreases performance for the worst cases ( chunks full of super complicated designs ). +mod.chiselsandbits.config.requireBagSpace=Require Bag Space +mod.chiselsandbits.config.requireBagSpace.tooltip=Requires there to be an empty slot in a bag in the player's inventory before allowing them to use the chisel. +mod.chiselsandbits.config.voidExcessBits=Void Excess Bits +mod.chiselsandbits.config.voidExcessBits.tooltip=Voids any bits that couldn't be fit into a bag or your inventory. Improves server performance. The undo action could have issues as some bits are voided. \ No newline at end of file