Skip to content

Commit 70d589a

Browse files
committed
rework interaction processing & fix jei interactions
1 parent bca205c commit 70d589a

File tree

9 files changed

+491
-239
lines changed

9 files changed

+491
-239
lines changed

src/main/java/com/cleanroommc/modularui/api/widget/Interactable.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,21 +153,30 @@ static void playButtonClickSound() {
153153
}
154154

155155
enum Result {
156+
156157
/**
157158
* Nothing happens.
158159
*/
159-
IGNORE,
160+
IGNORE(false, false),
160161
/**
161162
* Interaction is accepted, but other widgets will get checked.
162163
*/
163-
ACCEPT,
164+
ACCEPT(true, false),
164165
/**
165166
* Interaction is rejected and no other widgets will get checked.
166167
*/
167-
STOP,
168+
STOP(false, true),
168169
/**
169170
* Interaction is accepted and no other widgets will get checked.
170171
*/
171-
SUCCESS
172+
SUCCESS(true, true);
173+
174+
public final boolean accepts;
175+
public final boolean stops;
176+
177+
Result(boolean accepts, boolean stops) {
178+
this.accepts = accepts;
179+
this.stops = stops;
180+
}
172181
}
173182
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.cleanroommc.modularui.integration.jei;
2+
3+
import com.cleanroommc.modularui.screen.ModularContainer;
4+
import com.cleanroommc.modularui.screen.ModularScreen;
5+
6+
import net.minecraft.entity.player.EntityPlayer;
7+
8+
import mezz.jei.api.IModRegistry;
9+
import mezz.jei.api.gui.IRecipeLayout;
10+
import mezz.jei.api.recipe.transfer.IRecipeTransferError;
11+
import mezz.jei.api.recipe.transfer.IRecipeTransferHandler;
12+
import org.jetbrains.annotations.NotNull;
13+
import org.jetbrains.annotations.Nullable;
14+
15+
public class ModularContainerJEIHandler<T extends ModularContainer> implements IRecipeTransferHandler<T> {
16+
17+
public static <T extends ModularContainer> void register(Class<T> clz, IModRegistry registry) {
18+
new ModularContainerJEIHandler<>(clz).register(registry);
19+
}
20+
21+
private final Class<T> clazz;
22+
23+
private ModularContainerJEIHandler(Class<T> clazz) {
24+
this.clazz = clazz;
25+
}
26+
27+
private void register(IModRegistry registry) {
28+
registry.getRecipeTransferRegistry().addUniversalRecipeTransferHandler(this);
29+
}
30+
31+
@Override
32+
public @NotNull Class<T> getContainerClass() {
33+
return clazz;
34+
}
35+
36+
@Nullable
37+
@Override
38+
public IRecipeTransferError transferRecipe(@NotNull ModularContainer container, @NotNull IRecipeLayout recipeLayout, @NotNull EntityPlayer player, boolean maxTransfer, boolean doTransfer) {
39+
ModularScreen screen = container.getScreen();
40+
if (screen instanceof JeiRecipeTransferHandler recipeTransferHandler) {
41+
return recipeTransferHandler.transferRecipe(recipeLayout, maxTransfer, !doTransfer);
42+
}
43+
return null;
44+
}
45+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.cleanroommc.modularui.integration.jei;
2+
3+
import com.cleanroommc.modularui.api.IMuiScreen;
4+
import com.cleanroommc.modularui.api.widget.IGuiElement;
5+
6+
import net.minecraft.client.gui.GuiScreen;
7+
import net.minecraft.client.gui.inventory.GuiContainer;
8+
9+
import mezz.jei.api.IModRegistry;
10+
import mezz.jei.api.gui.IAdvancedGuiHandler;
11+
import mezz.jei.api.gui.IGhostIngredientHandler;
12+
import mezz.jei.api.gui.IGuiProperties;
13+
import mezz.jei.api.gui.IGuiScreenHandler;
14+
import org.jetbrains.annotations.NotNull;
15+
import org.jetbrains.annotations.Nullable;
16+
17+
import java.awt.*;
18+
import java.util.List;
19+
20+
public class ModularScreenJEIHandler<T extends GuiScreen & IMuiScreen> implements IGhostIngredientHandler<T>, IGuiScreenHandler<T> {
21+
22+
public static <T extends GuiScreen & IMuiScreen, T2 extends GuiContainer & IMuiScreen> void register(Class<T> clz, IModRegistry registry) {
23+
if (GuiContainer.class.isAssignableFrom(clz)) {
24+
new ContainerScreen<>((Class<T2>) clz).register(registry);
25+
} else {
26+
new ModularScreenJEIHandler<>(clz).register(registry);
27+
}
28+
}
29+
30+
private final Class<T> clazz;
31+
32+
private ModularScreenJEIHandler(Class<T> clazz) {
33+
this.clazz = clazz;
34+
}
35+
36+
public void register(IModRegistry registry) {
37+
registry.addGhostIngredientHandler(this.clazz, this);
38+
registry.addGuiScreenHandler(this.clazz, this);
39+
}
40+
41+
public @NotNull Class<T> getGuiContainerClass() {
42+
return clazz;
43+
}
44+
45+
@Override
46+
public <I> @NotNull List<Target<I>> getTargets(T gui, @NotNull I ingredient, boolean doStart) {
47+
return gui.getScreen().getContext().getJeiSettings().getAllGhostIngredientTargets(ingredient);
48+
}
49+
50+
@Override
51+
public void onComplete() {}
52+
53+
@Override
54+
public boolean shouldHighlightTargets() {
55+
return false;
56+
}
57+
58+
@Nullable
59+
@Override
60+
public IGuiProperties apply(@NotNull T guiScreen) {
61+
return guiScreen.getScreen().getContext().getJeiSettings().isJeiEnabled(guiScreen.getScreen()) ? new ModularUIProperties(guiScreen) : null;
62+
}
63+
64+
public static class ContainerScreen<T extends GuiContainer & IMuiScreen> extends ModularScreenJEIHandler<T> implements IAdvancedGuiHandler<T> {
65+
66+
private ContainerScreen(Class<T> clazz) {
67+
super(clazz);
68+
}
69+
70+
@Override
71+
public void register(IModRegistry registry) {
72+
super.register(registry);
73+
registry.addAdvancedGuiHandlers(this);
74+
}
75+
76+
@Nullable
77+
@Override
78+
public List<Rectangle> getGuiExtraAreas(@NotNull T guiContainer) {
79+
return guiContainer.getScreen().getContext().getJeiSettings().getAllJeiExclusionAreas();
80+
}
81+
82+
@Nullable
83+
@Override
84+
public Object getIngredientUnderMouse(@NotNull T guiContainer, int mouseX, int mouseY) {
85+
IGuiElement hovered = guiContainer.getScreen().getContext().getHovered();
86+
return hovered instanceof JeiIngredientProvider jip ? jip.getIngredient() : null;
87+
}
88+
}
89+
}

src/main/java/com/cleanroommc/modularui/integration/jei/ModularUIHandler.java

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

src/main/java/com/cleanroommc/modularui/integration/jei/ModularUIJeiPlugin.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import com.cleanroommc.modularui.core.mixin.jei.GhostIngredientDragManagerAccessor;
44
import com.cleanroommc.modularui.core.mixin.jei.IngredientListOverlayAccessor;
55
import com.cleanroommc.modularui.screen.GuiContainerWrapper;
6+
import com.cleanroommc.modularui.screen.GuiScreenWrapper;
7+
import com.cleanroommc.modularui.screen.ModularContainer;
8+
import com.cleanroommc.modularui.test.CraftingModularContainer;
69

710
import mezz.jei.api.IJeiRuntime;
811
import mezz.jei.api.IModPlugin;
912
import mezz.jei.api.IModRegistry;
1013
import mezz.jei.api.JEIPlugin;
11-
1214
import mezz.jei.gui.ghost.GhostIngredientDrag;
1315
import mezz.jei.gui.ghost.GhostIngredientDragManager;
1416
import org.jetbrains.annotations.NotNull;
@@ -20,7 +22,10 @@ public class ModularUIJeiPlugin implements IModPlugin {
2022

2123
@Override
2224
public void register(@NotNull IModRegistry registry) {
23-
new ModularUIHandler<>(GuiContainerWrapper.class).register(registry);
25+
ModularScreenJEIHandler.register(GuiContainerWrapper.class, registry);
26+
ModularScreenJEIHandler.register(GuiScreenWrapper.class, registry);
27+
ModularContainerJEIHandler.register(ModularContainer.class, registry);
28+
ModularContainerJEIHandler.register(CraftingModularContainer.class, registry);
2429
}
2530

2631
@Override
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.cleanroommc.modularui.integration.jei;
2+
3+
import com.cleanroommc.modularui.api.IMuiScreen;
4+
import com.cleanroommc.modularui.widget.sizer.Area;
5+
6+
import net.minecraft.client.gui.GuiScreen;
7+
8+
import mezz.jei.api.gui.IGuiProperties;
9+
import org.apache.commons.lang3.builder.ToStringBuilder;
10+
import org.jetbrains.annotations.NotNull;
11+
12+
import java.util.Objects;
13+
14+
/**
15+
* This needs to be an immutable class, otherwise JEI shits itself.
16+
*/
17+
public class ModularUIProperties implements IGuiProperties {
18+
19+
private final Class<? extends GuiScreen> guiClass;
20+
private final int guiLeft;
21+
private final int guiTop;
22+
private final int guiXSize;
23+
private final int guiYSize;
24+
private final int screenWidth;
25+
private final int screenHeight;
26+
27+
public ModularUIProperties(IMuiScreen screen) {
28+
Area mainArea = screen.getScreen().getMainPanel().getArea();
29+
Area screenArea = screen.getScreen().getScreenArea();
30+
this.guiClass = screen.getGuiScreen().getClass();
31+
this.guiLeft = mainArea.x;
32+
this.guiTop = mainArea.y;
33+
this.guiXSize = mainArea.width;
34+
this.guiYSize = mainArea.height;
35+
this.screenWidth = screenArea.width;
36+
this.screenHeight = screenArea.height;
37+
}
38+
39+
@Override
40+
public @NotNull Class<? extends GuiScreen> getGuiClass() {
41+
return guiClass;
42+
}
43+
44+
@Override
45+
public int getGuiLeft() {
46+
return guiLeft;
47+
}
48+
49+
@Override
50+
public int getGuiTop() {
51+
return guiTop;
52+
}
53+
54+
@Override
55+
public int getGuiXSize() {
56+
return guiXSize;
57+
}
58+
59+
@Override
60+
public int getGuiYSize() {
61+
return guiYSize;
62+
}
63+
64+
@Override
65+
public int getScreenWidth() {
66+
return screenWidth;
67+
}
68+
69+
@Override
70+
public int getScreenHeight() {
71+
return screenHeight;
72+
}
73+
74+
@Override
75+
public String toString() {
76+
return new ToStringBuilder(this)
77+
.append("x", getGuiLeft())
78+
.append("y", getGuiTop())
79+
.append("width", getGuiXSize())
80+
.append("height", getGuiYSize())
81+
.append("screenWidth", getScreenWidth())
82+
.append("screenHeight", getScreenHeight())
83+
.toString();
84+
}
85+
86+
@Override
87+
public boolean equals(Object o) {
88+
if (this == o) return true;
89+
if (o == null || getClass() != o.getClass()) return false;
90+
ModularUIProperties that = (ModularUIProperties) o;
91+
return guiLeft == that.guiLeft && guiTop == that.guiTop && guiXSize == that.guiXSize && guiYSize == that.guiYSize &&
92+
screenWidth == that.screenWidth && screenHeight == that.screenHeight && Objects.equals(guiClass, that.guiClass);
93+
}
94+
95+
@Override
96+
public int hashCode() {
97+
return Objects.hash(guiClass, guiLeft, guiTop, guiXSize, guiYSize, screenWidth, screenHeight);
98+
}
99+
}

0 commit comments

Comments
 (0)