Skip to content

Commit 4733593

Browse files
ghzdudebruberu
andauthored
Port/Rework Crafting Station to MUI2 + Misc Fixes (#2455)
Co-authored-by: bruberu <[email protected]>
1 parent 102e4e0 commit 4733593

40 files changed

+2195
-1363
lines changed

dependencies.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ dependencies {
4242
api("codechicken:codechickenlib:3.2.3.358")
4343
api("com.cleanroommc:modularui:2.5.0-rc3") { transitive = false }
4444
api("com.cleanroommc:groovyscript:1.2.0-hotfix1") { transitive = false }
45+
api("curse.maven:inventory-bogosorter-632327:4951607-deobf-4951608-sources-4951609")
4546
api("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.700")
4647
api("appeng:ae2-uel:v0.56.4") { transitive = false }
4748
api rfg.deobf("curse.maven:ctm-267602:2915363") // CTM 1.0.2.31

src/main/java/gregtech/api/capability/GregtechDataCodes.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ public static int assignId() {
4646
// Misc TEs (Transformer, World Accelerator)
4747
public static final int SYNC_TILE_MODE = assignId();
4848

49+
// Crafting Station
50+
public static final int UPDATE_CLIENT_HANDLER = assignId();
51+
4952
// Clipboard
5053
public static final int CREATE_FAKE_UI = assignId();
5154
public static final int MOUSE_POSITION = assignId();

src/main/java/gregtech/api/capability/IQuantumController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@ public interface IQuantumController extends ICapabilityProvider {
3030

3131
long getTypeEnergy(IQuantumStorage<?> storage);
3232

33-
void updateHandler();
33+
void onHandlerUpdate();
3434
}

src/main/java/gregtech/api/capability/impl/ItemHandlerList.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
88
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
9+
import it.unimi.dsi.fastutil.objects.Object2IntArrayMap;
10+
import it.unimi.dsi.fastutil.objects.Object2IntMap;
911
import org.jetbrains.annotations.NotNull;
1012

1113
import java.util.*;
@@ -16,7 +18,7 @@
1618
public class ItemHandlerList implements IItemHandlerModifiable {
1719

1820
private final Int2ObjectMap<IItemHandler> handlerBySlotIndex = new Int2ObjectOpenHashMap<>();
19-
private final Map<IItemHandler, Integer> baseIndexOffset = new IdentityHashMap<>();
21+
private final Object2IntMap<IItemHandler> baseIndexOffset = new Object2IntArrayMap<>();
2022

2123
public ItemHandlerList(List<? extends IItemHandler> itemHandlerList) {
2224
int currentSlotIndex = 0;
@@ -33,43 +35,55 @@ public ItemHandlerList(List<? extends IItemHandler> itemHandlerList) {
3335
}
3436
}
3537

38+
public int getIndexOffset(IItemHandler handler) {
39+
return baseIndexOffset.getOrDefault(handler, -1);
40+
}
41+
3642
@Override
3743
public int getSlots() {
3844
return handlerBySlotIndex.size();
3945
}
4046

4147
@Override
4248
public void setStackInSlot(int slot, @NotNull ItemStack stack) {
49+
if (invalidSlot(slot)) return;
4350
IItemHandler itemHandler = handlerBySlotIndex.get(slot);
44-
if (!(itemHandler instanceof IItemHandlerModifiable))
45-
throw new UnsupportedOperationException("Handler " + itemHandler + " does not support this method");
46-
((IItemHandlerModifiable) itemHandler).setStackInSlot(slot - baseIndexOffset.get(itemHandler), stack);
51+
int actualSlot = slot - baseIndexOffset.get(itemHandler);
52+
if (itemHandler instanceof IItemHandlerModifiable modifiable) {
53+
modifiable.setStackInSlot(actualSlot, stack);
54+
} else {
55+
itemHandler.extractItem(actualSlot, Integer.MAX_VALUE, false);
56+
itemHandler.insertItem(actualSlot, stack, false);
57+
}
4758
}
4859

4960
@NotNull
5061
@Override
5162
public ItemStack getStackInSlot(int slot) {
63+
if (invalidSlot(slot)) return ItemStack.EMPTY;
5264
IItemHandler itemHandler = handlerBySlotIndex.get(slot);
53-
int realSlot = slot - baseIndexOffset.get(itemHandler);
5465
return itemHandler.getStackInSlot(slot - baseIndexOffset.get(itemHandler));
5566
}
5667

5768
@Override
5869
public int getSlotLimit(int slot) {
70+
if (invalidSlot(slot)) return 0;
5971
IItemHandler itemHandler = handlerBySlotIndex.get(slot);
6072
return itemHandler.getSlotLimit(slot - baseIndexOffset.get(itemHandler));
6173
}
6274

6375
@NotNull
6476
@Override
6577
public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) {
78+
if (invalidSlot(slot)) return stack;
6679
IItemHandler itemHandler = handlerBySlotIndex.get(slot);
6780
return itemHandler.insertItem(slot - baseIndexOffset.get(itemHandler), stack, simulate);
6881
}
6982

7083
@NotNull
7184
@Override
7285
public ItemStack extractItem(int slot, int amount, boolean simulate) {
86+
if (invalidSlot(slot)) return ItemStack.EMPTY;
7387
IItemHandler itemHandler = handlerBySlotIndex.get(slot);
7488
return itemHandler.extractItem(slot - baseIndexOffset.get(itemHandler), amount, simulate);
7589
}
@@ -78,4 +92,8 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) {
7892
public Collection<IItemHandler> getBackingHandlers() {
7993
return Collections.unmodifiableCollection(handlerBySlotIndex.values());
8094
}
95+
96+
private boolean invalidSlot(int slot) {
97+
return slot < 0 && slot >= this.getSlots();
98+
}
8199
}

src/main/java/gregtech/api/gui/widgets/CraftingStationInputWidgetGroup.java

Lines changed: 0 additions & 68 deletions
This file was deleted.

src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,16 @@ public GTItemStackHandler(MetaTileEntity metaTileEntity, NonNullList<ItemStack>
2525
this.metaTileEntity = metaTileEntity;
2626
}
2727

28+
@Override
29+
public void setStackInSlot(int slot, ItemStack stack) {
30+
if (ItemStack.areItemStacksEqual(stack, getStackInSlot(slot)))
31+
return;
32+
33+
super.setStackInSlot(slot, stack);
34+
}
35+
2836
@Override
2937
public void onContentsChanged(int slot) {
30-
super.onContentsChanged(slot);
3138
metaTileEntity.markDirty();
3239
}
3340
}

src/main/java/gregtech/api/items/toolitem/ItemGTToolbelt.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager
116116

117117
int heightBonus = (handler.getSlots() / 9) * 18;
118118

119-
SlotGroup group = new SlotGroup("toolbelt_inventory", 9);
119+
SlotGroup group = new SlotGroup("toolbelt_inventory", Math.min(handler.getSlots(), 9));
120120
guiSyncManager.registerSlotGroup(group);
121121

122122
List<ItemSlot> slots = new ArrayList<>();
@@ -675,7 +675,6 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) {
675675

676676
@Override
677677
protected void onContentsChanged(int slot) {
678-
if (this.selectedSlot == slot) this.selectedSlot = -1;
679678
this.updateSlot(slot);
680679
this.update();
681680

src/main/java/gregtech/api/mui/GTGuiTextures.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ public static class IDs {
214214

215215
public static final UITexture MENU_OVERLAY = fullImage("textures/gui/overlay/menu_overlay.png");
216216

217+
public static final UITexture RECIPE_LOCK = fullImage("textures/gui/widget/lock.png");
218+
217219
// todo bronze/steel/primitive fluid slots?
218220

219221
// SLOT OVERLAYS
@@ -355,6 +357,7 @@ public static class IDs {
355357
public static final UITexture BUTTON_AUTO_COLLAPSE = fullImage(
356358
"textures/gui/widget/button_auto_collapse_overlay.png");
357359
public static final UITexture BUTTON_X = fullImage("textures/gui/widget/button_x_overlay.png", true);
360+
public static final UITexture BUTTON_CLEAR_GRID = fullImage("textures/gui/widget/button_clear_grid.png", false);
358361

359362
public static final UITexture BUTTON_CROSS = fullImage("textures/gui/widget/button_cross.png");
360363
public static final UITexture BUTTON_REDSTONE_ON = fullImage("textures/gui/widget/button_redstone_on.png");
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package gregtech.api.mui;
2+
3+
import gregtech.api.mui.sync.PagedWidgetSyncHandler;
4+
import gregtech.common.metatileentities.storage.CraftingRecipeLogic;
5+
6+
import net.minecraft.entity.player.EntityPlayer;
7+
import net.minecraft.item.ItemStack;
8+
9+
import com.cleanroommc.modularui.screen.ModularContainer;
10+
import com.cleanroommc.modularui.value.sync.PanelSyncManager;
11+
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
12+
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
13+
import mezz.jei.api.gui.IGuiItemStackGroup;
14+
import mezz.jei.api.gui.IRecipeLayout;
15+
import mezz.jei.api.recipe.transfer.IRecipeTransferError;
16+
import mezz.jei.api.recipe.transfer.IRecipeTransferHandler;
17+
import mezz.jei.api.recipe.transfer.IRecipeTransferHandlerHelper;
18+
import org.jetbrains.annotations.NotNull;
19+
import org.jetbrains.annotations.Nullable;
20+
21+
public class GregTechGuiTransferHandler implements IRecipeTransferHandler<ModularContainer> {
22+
23+
private final IRecipeTransferHandlerHelper handlerHelper;
24+
25+
public GregTechGuiTransferHandler(IRecipeTransferHandlerHelper handlerHelper) {
26+
this.handlerHelper = handlerHelper;
27+
}
28+
29+
@Override
30+
public @NotNull Class<ModularContainer> getContainerClass() {
31+
return ModularContainer.class;
32+
}
33+
34+
@Override
35+
public @Nullable IRecipeTransferError transferRecipe(ModularContainer container,
36+
@NotNull IRecipeLayout recipeLayout,
37+
@NotNull EntityPlayer player, boolean maxTransfer,
38+
boolean doTransfer) {
39+
if (!container.getSyncManager().isOpen("workbench")) {
40+
return null;
41+
}
42+
PanelSyncManager syncManager = container.getSyncManager().getPanelSyncManager("workbench");
43+
var recipeLogic = (CraftingRecipeLogic) syncManager.getSyncHandler("recipe_logic:0");
44+
var pageController = (PagedWidgetSyncHandler) syncManager.getSyncHandler("page_controller:0");
45+
46+
if (!doTransfer) {
47+
// todo highlighting in JEI?
48+
return null;
49+
}
50+
51+
var matrix = extractMatrix(recipeLayout.getItemStacks());
52+
recipeLogic.fillCraftingGrid(matrix);
53+
pageController.setPage(0);
54+
return null;
55+
}
56+
57+
private Int2ObjectMap<ItemStack> extractMatrix(IGuiItemStackGroup stackGroup) {
58+
var ingredients = stackGroup.getGuiIngredients();
59+
Int2ObjectMap<ItemStack> matrix = new Int2ObjectArrayMap<>(9);
60+
for (var slot : ingredients.keySet()) {
61+
if (slot != 0) {
62+
var ing = ingredients.get(slot).getDisplayedIngredient();
63+
if (ing == null) continue;
64+
matrix.put(slot - 1, ingredients.get(slot).getDisplayedIngredient());
65+
}
66+
}
67+
return matrix;
68+
}
69+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package gregtech.api.mui;
2+
3+
import com.cleanroommc.modularui.api.widget.Interactable;
4+
import com.cleanroommc.modularui.screen.viewport.LocatedWidget;
5+
6+
// todo remove on next mui2 update
7+
// this can't be a true accessor because of illegal classloading
8+
public interface InputAccessor {
9+
10+
boolean held();
11+
12+
void held(boolean held);
13+
14+
void timeHeld(long a);
15+
16+
LocatedWidget lastPressed();
17+
18+
void lastPressed(LocatedWidget last);
19+
20+
void lastButton(int b);
21+
22+
void addInteractable(Interactable i);
23+
}

0 commit comments

Comments
 (0)