11package org .cyclops .structurecrafting .craft ;
22
3- import net .minecraft .block .state .IBlockState ;
4- import net .minecraft .item .Item ;
3+ import com .google .common .collect .Lists ;
54import net .minecraft .item .ItemBlock ;
65import net .minecraft .item .ItemStack ;
76import net .minecraft .item .crafting .CraftingManager ;
87import net .minecraft .util .BlockPos ;
98import net .minecraft .util .EnumFacing ;
109import net .minecraft .world .World ;
10+ import org .apache .commons .lang3 .tuple .Pair ;
11+ import org .cyclops .structurecrafting .StructuredCrafting ;
12+ import org .cyclops .structurecrafting .craft .provider .IItemStackProvider ;
13+ import org .cyclops .structurecrafting .craft .provider .IItemStackProviderRegistry ;
14+
15+ import java .util .List ;
1116
1217/**
1318 * A crafting matrix represented with blockstates.
@@ -21,12 +26,16 @@ public class WorldCraftingMatrix {
2126 private final BlockPos centerPos ;
2227 private final EnumFacing .Axis axis ;
2328 private final BlockPos targetPos ;
29+ private final EnumFacing targetSide ;
30+ private final EnumFacing inputSide ;
2431
25- public WorldCraftingMatrix (World world , BlockPos centerPos , EnumFacing .Axis axis , BlockPos targetPos ) {
32+ public WorldCraftingMatrix (World world , BlockPos centerPos , EnumFacing .Axis axis , BlockPos targetPos , EnumFacing inputSide ) {
2633 this .world = world ;
2734 this .centerPos = centerPos ;
2835 this .axis = axis ;
2936 this .targetPos = targetPos ;
37+ this .targetSide = inputSide .getOpposite ();
38+ this .inputSide = inputSide ;
3039 }
3140
3241 protected BlockPos addInAxis (BlockPos pos , EnumFacing .Axis axis , int i , int j ) {
@@ -40,62 +49,86 @@ protected BlockPos addInAxis(BlockPos pos, EnumFacing.Axis axis, int i, int j) {
4049 return null ;
4150 }
4251
52+ protected List <IItemStackProvider > getItemStackProviders () {
53+ return StructuredCrafting ._instance .getRegistryManager ().
54+ getRegistry (IItemStackProviderRegistry .class ).getProviders ();
55+ }
56+
57+ protected Pair <ItemStack , IItemStackProvider > determineItemStackProviderForInput (World world , BlockPos pos , EnumFacing side ) {
58+ for (IItemStackProvider provider : getItemStackProviders ()) {
59+ if (provider .hasItemStack (world , pos , side )) {
60+ return Pair .of (provider .getItemStack (world , pos , side ), provider );
61+ }
62+ }
63+ return null ;
64+ }
65+
66+ protected boolean addItemStackForOutput (World world , BlockPos pos , EnumFacing side , List <IItemStackProvider > outputProviders , ItemStack itemStack ) {
67+ for (IItemStackProvider provider : outputProviders ) {
68+ if (provider .addItemStack (world , pos , side , itemStack )) {
69+ return true ;
70+ }
71+ }
72+ return false ;
73+ }
74+
4375 public boolean craft () {
44- if (!world .isAirBlock (targetPos )) {
76+ // Check if at least one of the providers can write to the output target.
77+ List <IItemStackProvider > outputProviders = Lists .newLinkedList ();
78+ for (IItemStackProvider provider : getItemStackProviders ()) {
79+ if (provider .isValidForResults (world , targetPos , targetSide )) {
80+ outputProviders .add (provider );
81+ }
82+ }
83+ if (outputProviders .isEmpty ()) {
4584 return false ;
4685 }
4786
4887 BlockPos [] positions = new BlockPos [9 ];
88+ IItemStackProvider [] providers = new IItemStackProvider [9 ];
4989
5090 // Set crafting grid
5191 for (int i = -1 ; i < 2 ; i ++) {
5292 for (int j = -1 ; j < 2 ; j ++) {
93+ int arrayIndex = (j + 1 ) * 3 + (i + 1 );
5394 BlockPos pos = addInAxis (centerPos , axis , i , j );
54- IBlockState blockState = world .getBlockState (pos );
55-
56- ItemStack itemStack = null ;
57- if (blockState != null ) {
58- Item item = blockState .getBlock ().getItem (world , pos );
59- if (item != null ) {
60- itemStack = new ItemStack (item , blockState .getBlock ().getDamageValue (world , pos ));
61- }
95+ Pair <ItemStack , IItemStackProvider > result = determineItemStackProviderForInput (world , pos , inputSide );
96+ ItemStack itemStack = result != null ? result .getLeft () : null ;
97+ if (itemStack != null ) {
98+ itemStack = itemStack .copy ();
99+ itemStack .stackSize = 1 ;
62100 }
63101 INVENTORY_CRAFTING .setItemStack (i + 1 , j + 1 , itemStack );
64- positions [(j + 1 ) * 3 + (i + 1 )] = pos ;
102+ positions [arrayIndex ] = pos ;
103+ providers [arrayIndex ] = result != null ? result .getRight () : null ;
65104 }
66105 }
67106
68107 // Determine output
69108 ItemStack itemStack = CraftingManager .getInstance ().findMatchingRecipe (INVENTORY_CRAFTING , world );
70- if (itemStack != null && itemStack .getItem () instanceof ItemBlock ) {
71- // replace blocks depending on what the crafting results are.
72- world .setBlockState (targetPos , ((ItemBlock ) itemStack .getItem ()).getBlock ().getStateFromMeta (itemStack .getItemDamage ()));
73-
109+ if (itemStack != null && addItemStackForOutput (world , targetPos , targetSide , outputProviders , itemStack )) {
74110 // Handle remaining container items: place blocks and drop items
75- for (int i = 0 ; i < INVENTORY_CRAFTING .getSizeInventory (); i ++) {
76- ItemStack remainingStack = INVENTORY_CRAFTING .getStackInSlot (i );
77- if (remainingStack != null && remainingStack .stackSize > 0 ) {
78- if (remainingStack .getItem () instanceof ItemBlock ) {
79- world .setBlockState (positions [i ],((ItemBlock ) remainingStack .getItem ()).getBlock ().
80- getStateFromMeta (remainingStack .getItemDamage ()));
81- } else {
82- // TODO: drop as entity, temp
111+ ItemStack [] remainingStacks = CraftingManager .getInstance ().func_180303_b (INVENTORY_CRAFTING , world );
112+ for (int i = 0 ; i < remainingStacks .length ; i ++) {
113+ ItemStack remainingStack = remainingStacks [i ];
114+ if (providers [i ] != null ) {
115+ providers [i ].reduceItemStack (world , positions [i ], inputSide );
116+ if (remainingStack != null && remainingStack .stackSize > 0 ) {
117+ providers [i ].addItemStack (world , positions [i ], inputSide , remainingStack );
83118 }
84- } else {
85- world .setBlockToAir (positions [i ]);
86119 }
87120 }
88121 return true ;
89122 }
90-
91123 return false ;
92124 }
93125
94126 public static WorldCraftingMatrix [] deriveMatrices (World world , BlockPos centerPos ) {
95127 final WorldCraftingMatrix [] matrices = new WorldCraftingMatrix [6 ]; // Test for all faces of the center position.
96128 for (int i = 0 ; i < EnumFacing .values ().length ; i ++) {
97129 EnumFacing side = EnumFacing .values ()[i ];
98- matrices [i ] = new WorldCraftingMatrix (world , centerPos .offset (side ), side .getAxis (), centerPos .offset (side .getOpposite ()));
130+ matrices [i ] = new WorldCraftingMatrix (world , centerPos .offset (side ), side .getAxis (),
131+ centerPos .offset (side .getOpposite ()), side .getOpposite ());
99132 }
100133 return matrices ;
101134 }
0 commit comments