Skip to content

Commit

Permalink
Allow Crafting Chisel + Block + Bag; inserts bits into the bag, modif…
Browse files Browse the repository at this point in the history
…ying the chisel and the block in the grid. Resolves #162

Added option to disable said recipe.
  • Loading branch information
AlgorithmX2 committed Dec 10, 2016
1 parent 4dd386d commit e7c3a59
Show file tree
Hide file tree
Showing 4 changed files with 347 additions and 1 deletion.
4 changes: 4 additions & 0 deletions src/main/java/mod/chiselsandbits/config/ModConfig.java
Expand Up @@ -270,6 +270,9 @@ public class ModConfig extends Configuration
@Configured( category = "Balance Settings" )
public boolean fullBlockCrafting;

@Configured( category = "Balance Settings" )
public boolean enableChiselCrafting;

// in game state
public boolean replaceingBits = false;

Expand Down Expand Up @@ -321,6 +324,7 @@ private void setDefaults()
enableTapeMeasure_Distance = !TapeMeasureModes.DISTANCE.isDisabled;
displayMeasuringTapeInChat = false;
perChiselMode = true;
enableChiselCrafting = true;
fullBlockCrafting = true;
radialMenuVolume = 0.1f;
chatModeNotification = false;
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/mod/chiselsandbits/core/ChiselsAndBits.java
Expand Up @@ -15,6 +15,7 @@
import mod.chiselsandbits.core.api.ChiselAndBitsAPI;
import mod.chiselsandbits.core.api.IMCHandler;
import mod.chiselsandbits.crafting.BitSawCrafting;
import mod.chiselsandbits.crafting.ChiselBlockCrafting;
import mod.chiselsandbits.crafting.ChiselCrafting;
import mod.chiselsandbits.crafting.MirrorTransferCrafting;
import mod.chiselsandbits.crafting.NegativeInversionCrafting;
Expand Down Expand Up @@ -165,7 +166,13 @@ public void init(
if ( getConfig().enablePositivePrintCrafting )
{
GameRegistry.addRecipe( new ChiselCrafting() );
RecipeSorter.register( MODID + ":chiselcrafting", ChiselCrafting.class, Category.SHAPELESS, craftingOrder );
RecipeSorter.register( MODID + ":positiveprintcrafting", ChiselCrafting.class, Category.SHAPELESS, craftingOrder );
}

if ( getConfig().enableChiselCrafting )
{
GameRegistry.addRecipe( new ChiselBlockCrafting() );
RecipeSorter.register( MODID + ":chiselcrafting", ChiselBlockCrafting.class, Category.SHAPELESS, craftingOrder );
}

if ( getConfig().enableStackableCrafting )
Expand Down
297 changes: 297 additions & 0 deletions src/main/java/mod/chiselsandbits/crafting/ChiselBlockCrafting.java
@@ -0,0 +1,297 @@
package mod.chiselsandbits.crafting;

import java.util.Random;

import mod.chiselsandbits.api.APIExceptions.InvalidBitItem;
import mod.chiselsandbits.api.IBitAccess;
import mod.chiselsandbits.api.IBitBag;
import mod.chiselsandbits.api.IBitBrush;
import mod.chiselsandbits.api.IBitVisitor;
import mod.chiselsandbits.api.ItemType;
import mod.chiselsandbits.chiseledblock.ItemBlockChiseled;
import mod.chiselsandbits.core.ChiselsAndBits;
import mod.chiselsandbits.helpers.ModUtil;
import mod.chiselsandbits.items.ItemBitBag;
import mod.chiselsandbits.items.ItemChisel;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.NonNullList;
import net.minecraft.world.World;

public class ChiselBlockCrafting implements IRecipe
{

static private class ChiselBlockInfo
{
public ItemStack chisel = ModUtil.getEmptyStack();
public int chisel_slot = -1;

public ItemStack bag = ModUtil.getEmptyStack();
public int bag_slot = -1;

public ItemStack block = ModUtil.getEmptyStack();
public int block_slot = -1;

public boolean isValid;
public boolean modified = false;

private static class Chiseler implements IBitVisitor
{
private final ItemStack chisel;
private final IBitBag bbag;
private final Random r = new Random();
final IBitBrush airBrush;
public boolean isSolid = false;
public boolean modified = false;

public Chiseler(
final ItemStack chisel,
final IBitBag bag ) throws InvalidBitItem
{
airBrush = ChiselsAndBits.getApi().createBrushFromState( null );
this.chisel = chisel;
bbag = bag;
r.setSeed( 0 ); // ensure that the results are always the same,
// crafting needs to be 'regular'
}

@Override
public IBitBrush visitBit(
final int x,
final int y,
final int z,
final IBitBrush currentValue )
{
if ( chisel.getItemDamage() < chisel.getMaxDamage() )
{
ModUtil.damageItem( chisel, r );

final ItemStack is = currentValue.getItemStack( 1 );
if ( is != null )
{
for ( int idx = 0; idx < bbag.getSlots(); ++idx )
{
if ( ModUtil.isEmpty( bbag.insertItem( idx, is, false ) ) )
{
modified = true;
return airBrush;
}
}
}
}

isSolid = true;
return currentValue;
};
};

public void doLogic()
{
bag = ModUtil.copy( bag );
block = ModUtil.copy( block );
chisel = ModUtil.copy( chisel );

try
{
final IBitAccess ba = ChiselsAndBits.getApi().createBitItem( block );
final Chiseler c = new Chiseler( chisel, ChiselsAndBits.getApi().getBitbag( bag ) );

ba.visitBits( c );

modified = c.modified;

if ( c.isSolid )
{
if ( ModUtil.getStackSize( block ) == 1 )
{
block = ba.getBitsAsItem( EnumFacing.NORTH, ItemType.CHISLED_BLOCK, false );
}
else
{
modified = false;
}
}
else
{
block = ModUtil.getEmptyStack();
}
}
catch ( final InvalidBitItem e )
{

}
}
};

private ChiselBlockInfo getInfo(
final InventoryCrafting inv )
{
final ChiselBlockInfo i = new ChiselBlockInfo();
boolean noDuplicates = true;
boolean noStrangeitems = true;

for ( int x = 0; x < inv.getSizeInventory(); ++x )
{
final ItemStack is = inv.getStackInSlot( x );

if ( ModUtil.isEmpty( is ) )
{
continue;
}

if ( is.getItem() instanceof ItemBitBag )
{
if ( i.bag_slot != -1 )
{
noDuplicates = false;
}

i.bag = is;
i.bag_slot = x;
continue;
}

if ( is.getItem() instanceof ItemChisel )
{
if ( i.chisel_slot != -1 )
{
noDuplicates = false;
}

i.chisel = is;
i.chisel_slot = x;
continue;
}

if ( is.getItem() instanceof ItemBlock )
{
if ( i.block_slot != -1 )
{
noDuplicates = false;
}

final IBlockState actingState = ModUtil.getStateFromItem( is );
if ( actingState.getBlock() != Blocks.AIR )
{
try
{
final IBitBrush state = ChiselsAndBits.getApi().createBrushFromState( actingState );
final IBitAccess item = ChiselsAndBits.getApi().createBitItem( null );

item.visitBits( new IBitVisitor() {

@Override
public IBitBrush visitBit(
final int x,
final int y,
final int z,
final IBitBrush currentValue )
{
return state;
}
} );

i.block = item.getBitsAsItem( EnumFacing.EAST, ItemType.CHISLED_BLOCK, false );
if ( i.block != null )
{
ModUtil.setStackSize( i.block, ModUtil.getStackSize( is ) );
i.block_slot = x;
continue;
}
}
catch ( final InvalidBitItem err )
{
// not supported.
}
}
}

if ( is.getItem() instanceof ItemBlockChiseled )
{
if ( i.block_slot != -1 )
{
noDuplicates = false;
}

i.block = is;
i.block_slot = x;
continue;
}

noStrangeitems = false;
}

i.isValid = i.chisel_slot != -1 && i.bag_slot != -1 && i.block_slot != -1 && noDuplicates && noStrangeitems;

return i;
}

@Override
public boolean matches(
final InventoryCrafting inv,
final World worldIn )
{
return getInfo( inv ).isValid;
}

@Override
public ItemStack getCraftingResult(
final InventoryCrafting inv )
{
final ChiselBlockInfo cbc = getInfo( inv );
cbc.doLogic();

if ( cbc.isValid && cbc.modified )
{
return cbc.bag;
}

return ModUtil.getEmptyStack();
}

@Override
public int getRecipeSize()
{
return 3;
}

@Override
public ItemStack getRecipeOutput()
{
return ModUtil.getEmptyStack();
}

@Override
public NonNullList<ItemStack> getRemainingItems(
final InventoryCrafting inv )
{
final NonNullList<ItemStack> list = NonNullList.func_191196_a();

final ChiselBlockInfo cbc = getInfo( inv );
cbc.doLogic();

for ( int x = 0; x < inv.getSizeInventory(); ++x )
{
if ( cbc.isValid && x == cbc.chisel_slot && !ModUtil.isEmpty( cbc.chisel ) && cbc.chisel.getItemDamage() < cbc.chisel.getMaxDamage() )
{
list.add( cbc.chisel );
}
else if ( cbc.isValid && x == cbc.block_slot && !ModUtil.isEmpty( cbc.block ) )
{
list.add( cbc.block );
}
else
{
list.add( ModUtil.getEmptyStack() );
}
}

return list;
}

}
38 changes: 38 additions & 0 deletions src/main/java/mod/chiselsandbits/helpers/ModUtil.java
Expand Up @@ -783,4 +783,42 @@ public static boolean isEmpty(
return c;
}

public static IBlockState getStateFromItem(
final ItemStack is )
{
try
{
if ( !ModUtil.isEmpty( is ) && is.getItem() instanceof ItemBlock )
{
final ItemBlock iblk = (ItemBlock) is.getItem();
final IBlockState state = iblk.getBlock().getStateFromMeta( iblk.getMetadata( is.getItemDamage() ) );
final ItemStack out = ModUtil.getItemFromBlock( state );

if ( out.getItem() == is.getItem() && is.getItemDamage() == out.getItemDamage() )
{
return state;
}
}
}
catch ( final Throwable t )
{
// : (
}

return Blocks.AIR.getDefaultState();
}

public static void damageItem(
final ItemStack is,
final Random r )
{
if ( is.isItemStackDamageable() )
{
if ( is.attemptDamageItem( 1, r ) )
{
is.func_190918_g( 1 );
}
}
}

}

0 comments on commit e7c3a59

Please sign in to comment.