11package commoble .jumbofurnace .jumbo_furnace ;
22
3+ import java .util .Optional ;
4+
35import commoble .jumbofurnace .JumboFurnace ;
46import commoble .jumbofurnace .JumboFurnaceObjects ;
57import commoble .jumbofurnace .advancements .UpgradeJumboFurnaceTrigger ;
@@ -64,14 +66,14 @@ public class JumboFurnaceContainer extends Container
6466
6567 /** Used by the Server to determine whether the player is close enough to use the Container **/
6668 private final IWorldPosCallable usabilityTest ;
67- private final PlayerEntity player ;
6869 private final IIntArray furnaceData ;
70+ private final Optional <JumboFurnaceCoreTileEntity > serverFurnace ;
6971
7072 /** Container factory for opening the container clientside **/
7173 public static JumboFurnaceContainer getClientContainer (int id , PlayerInventory playerInventory )
7274 {
7375 // init client inventory with dummy slots
74- return new JumboFurnaceContainer (id , playerInventory , BlockPos .ZERO , new ItemStackHandler (9 ), new ItemStackHandler (9 ), new UninsertableItemStackHandler (9 ), new ItemStackHandler (1 ), new IntArray (4 ));
76+ return new JumboFurnaceContainer (id , playerInventory , BlockPos .ZERO , new ItemStackHandler (9 ), new ItemStackHandler (9 ), new UninsertableItemStackHandler (9 ), new ItemStackHandler (1 ), new IntArray (4 ), Optional . empty () );
7577 }
7678
7779 /**
@@ -82,16 +84,17 @@ public static JumboFurnaceContainer getClientContainer(int id, PlayerInventory p
8284 */
8385 public static IContainerProvider getServerContainerProvider (JumboFurnaceCoreTileEntity te , BlockPos activationPos )
8486 {
85- return (id , playerInventory , serverPlayer ) -> new JumboFurnaceContainer (id , playerInventory , activationPos , te .input , te .fuel , te .output , te .multiprocessUpgradeHandler , new JumboFurnaceSyncData (te ));
87+ return (id , playerInventory , serverPlayer ) -> new JumboFurnaceContainer (id , playerInventory , activationPos , te .input , te .fuel , te .output , te .multiprocessUpgradeHandler , new JumboFurnaceSyncData (te ), Optional . of ( te ) );
8688 }
8789
88- protected JumboFurnaceContainer (int id , PlayerInventory playerInventory , BlockPos pos , IItemHandler inputs , IItemHandler fuel , IItemHandler outputs , IItemHandler multiprocessUpgrades , IIntArray furnaceData )
90+ protected JumboFurnaceContainer (int id , PlayerInventory playerInventory , BlockPos pos , IItemHandler inputs , IItemHandler fuel , IItemHandler outputs , IItemHandler multiprocessUpgrades , IIntArray furnaceData , Optional < JumboFurnaceCoreTileEntity > serverFurnace )
8991 {
9092 super (JumboFurnaceObjects .CONTAINER_TYPE , id );
9193
92- this . player = playerInventory .player ;
93- this .usabilityTest = IWorldPosCallable .of (this . player .world , pos );
94+ PlayerEntity player = playerInventory .player ;
95+ this .usabilityTest = IWorldPosCallable .of (player .world , pos );
9496 this .furnaceData = furnaceData ;
97+ this .serverFurnace = serverFurnace ;
9598
9699 // add input slots
97100 for (int row =0 ; row < SLOT_ROWS ; row ++)
@@ -125,7 +128,7 @@ protected JumboFurnaceContainer(int id, PlayerInventory playerInventory, BlockPo
125128 {
126129 int x = OUTPUT_START_X + SLOT_SPACING *column ;
127130 int index = row * SLOT_COLUMNS + column ;
128- this .addSlot (new JumboFurnaceOutputSlot (this . player , outputs , index , x , y ));
131+ this .addSlot (new JumboFurnaceOutputSlot (player , outputs , index , x , y ));
129132 }
130133 }
131134
@@ -195,18 +198,39 @@ public ItemStack transferStackInSlot(PlayerEntity player, int index)
195198 // otherwise, this is a player slot
196199 else
197200 {
201+ // note: mergeItemStack returns true if any slot contents were changed
198202 // if this is an upgrade item, try to put it in the upgrade slot first
199- if (JumboFurnace .MULTIPROCESSING_UPGRADE_TAG .contains (stackInSlot .getItem ()) && ! this . mergeItemStack ( stackInSlot , ORTHOFURNACE_SLOT , ORTHOFURNACE_SLOT + 1 , false ) )
203+ if (JumboFurnace .MULTIPROCESSING_UPGRADE_TAG .contains (stackInSlot .getItem ()))
200204 {
201- return ItemStack .EMPTY ;
205+ // if we altered any input slots
206+ if (this .mergeItemStack (stackInSlot , ORTHOFURNACE_SLOT , ORTHOFURNACE_SLOT +1 , false ))
207+ {
208+ this .serverFurnace .ifPresent (JumboFurnaceCoreTileEntity ::markInputInventoryChanged );
209+ }
210+ else
211+ {
212+ return ItemStack .EMPTY ;
213+ }
202214 }
203215 // if we can burn the item, try to put it in the fuel slots first
204- if (ForgeHooks .getBurnTime (stackInSlot ) > 0 && ! this . mergeItemStack ( stackInSlot , FIRST_FUEL_SLOT , END_FUEL_SLOTS , false ) )
216+ if (ForgeHooks .getBurnTime (stackInSlot ) > 0 )
205217 {
206- return ItemStack .EMPTY ;
218+ // if we changed any fuel item slots
219+ if (this .mergeItemStack (stackInSlot , FIRST_FUEL_SLOT , END_FUEL_SLOTS , false ))
220+ {
221+ this .serverFurnace .ifPresent (JumboFurnaceCoreTileEntity ::markFuelInventoryChanged );
222+ }
223+ else
224+ {
225+ return ItemStack .EMPTY ;
226+ }
207227 }
208228 // otherwise, try to put it in the input slots
209- if (!this .mergeItemStack (stackInSlot , FIRST_INPUT_SLOT , END_INPUT_SLOTS , false ))
229+ if (this .mergeItemStack (stackInSlot , FIRST_INPUT_SLOT , END_INPUT_SLOTS , false ))
230+ {
231+ this .serverFurnace .ifPresent (JumboFurnaceCoreTileEntity ::markInputInventoryChanged );
232+ }
233+ else
210234 {
211235 return ItemStack .EMPTY ;
212236 }
0 commit comments