Skip to content

Commit 4378086

Browse files
committed
Fixed bug where shift-clicking items into the jumbo furnace gui's input slots while the jumbo furnace was smelting caused the transferred items to be destroyed at the end of the smelt cycle unless items were placed into empty slots. Closes Commoble#10
1 parent cdbc8aa commit 4378086

File tree

3 files changed

+55
-13
lines changed

3 files changed

+55
-13
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
modid = jumbofurnace
3-
mod_version = 2.1.1.0
3+
mod_version = 2.2.0.0
44
mc_version = 1.16.3
55
forge_version = 34.1.11
66
mappings_version = 20200916-1.16.2

src/main/java/commoble/jumbofurnace/jumbo_furnace/JumboFurnaceContainer.java

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package commoble.jumbofurnace.jumbo_furnace;
22

3+
import java.util.Optional;
4+
35
import commoble.jumbofurnace.JumboFurnace;
46
import commoble.jumbofurnace.JumboFurnaceObjects;
57
import 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
}

src/main/java/commoble/jumbofurnace/jumbo_furnace/JumboFurnaceCoreTileEntity.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,34 @@ public void updateBurningBlockstates(boolean burning)
119119
}
120120
}
121121

122+
public void markFuelInventoryChanged()
123+
{
124+
this.markDirty();
125+
this.onFuelInventoryChanged();
126+
}
127+
122128
public void onFuelInventoryChanged()
123129
{
124130
this.needsFuelUpdate = true;
125131
}
126132

133+
public void markInputInventoryChanged()
134+
{
135+
this.markDirty();
136+
this.onInputInventoryChanged();
137+
}
138+
127139
public void onInputInventoryChanged()
128140
{
129141
this.needsRecipeUpdate = true;
130142
}
131143

144+
public void markOutputInventoryCHanged()
145+
{
146+
this.markDirty();
147+
this.onOutputInventoryChanged();
148+
}
149+
132150
public void onOutputInventoryChanged()
133151
{
134152
this.needsOutputUpdate = true;

0 commit comments

Comments
 (0)