/
GuiEventHandler.java
135 lines (117 loc) · 4.1 KB
/
GuiEventHandler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package mezz.jei;
import mezz.jei.gui.ItemListOverlay;
import mezz.jei.gui.RecipesGui;
import mezz.jei.gui.TooltipRenderer;
import mezz.jei.input.InputHandler;
import mezz.jei.util.Translator;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.lwjgl.input.Mouse;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class GuiEventHandler {
@Nonnull
private static final String showRecipesText = Translator.translateToLocal("jei.tooltip.show.recipes");
@Nullable
private ItemListOverlay itemListOverlay;
@Nullable
private InputHandler inputHandler;
@Nullable
private GuiContainer previousGui = null;
public void setItemListOverlay(@Nullable ItemListOverlay itemListOverlay) {
if (this.itemListOverlay != null && this.itemListOverlay.isOpen()) {
this.itemListOverlay.close();
}
this.itemListOverlay = itemListOverlay;
}
@SubscribeEvent
public void onGuiInit(@Nonnull GuiScreenEvent.InitGuiEvent.Post event) {
if (itemListOverlay == null) {
return;
}
GuiScreen gui = event.getGui();
if (gui instanceof GuiContainer) {
GuiContainer guiContainer = (GuiContainer) gui;
itemListOverlay.initGui(guiContainer);
RecipesGui recipesGui = new RecipesGui();
inputHandler = new InputHandler(recipesGui, itemListOverlay);
}
}
@SubscribeEvent
public void onGuiOpen(@Nonnull GuiOpenEvent event) {
if (itemListOverlay == null) {
return;
}
GuiScreen gui = event.getGui();
if (gui instanceof GuiContainer) {
GuiContainer guiContainer = (GuiContainer) gui;
if (previousGui != guiContainer) {
previousGui = guiContainer;
if (itemListOverlay.isOpen()) {
itemListOverlay.close();
}
}
} else if (!(gui instanceof RecipesGui)) {
if (itemListOverlay.isOpen()) {
itemListOverlay.close();
}
}
}
@SubscribeEvent
public void onDrawBackgroundEventPost(@Nonnull GuiScreenEvent.BackgroundDrawnEvent event) {
if (itemListOverlay != null && itemListOverlay.isOpen()) {
GuiScreen gui = event.getGui();
itemListOverlay.updateGui(gui);
itemListOverlay.drawScreen(gui.mc, event.getMouseX(), event.getMouseY());
}
}
@SubscribeEvent
public void onDrawScreenEventPost(@Nonnull GuiScreenEvent.DrawScreenEvent.Post event) {
if (itemListOverlay == null) {
return;
}
GuiScreen gui = event.getGui();
if (gui instanceof GuiContainer) {
GuiContainer guiContainer = (GuiContainer) gui;
RecipeRegistry recipeRegistry = Internal.getRuntime().getRecipeRegistry();
if (recipeRegistry.getRecipeClickableArea(guiContainer, event.getMouseX() - guiContainer.guiLeft, event.getMouseY() - guiContainer.guiTop) != null) {
TooltipRenderer.drawHoveringText(guiContainer.mc, showRecipesText, event.getMouseX(), event.getMouseY());
}
}
if (itemListOverlay.isOpen()) {
itemListOverlay.drawTooltips(gui.mc, event.getMouseX(), event.getMouseY());
}
}
@SubscribeEvent
public void onClientTick(@Nonnull TickEvent.ClientTickEvent event) {
if (itemListOverlay == null || event.phase == TickEvent.Phase.END) {
return;
}
if (itemListOverlay.isOpen()) {
itemListOverlay.handleTick();
}
}
@SubscribeEvent
public void onGuiKeyboardEvent(GuiScreenEvent.KeyboardInputEvent.Pre event) {
if (inputHandler != null) {
if (inputHandler.handleKeyEvent()) {
event.setCanceled(true);
}
}
}
@SubscribeEvent
public void onGuiMouseEvent(GuiScreenEvent.MouseInputEvent.Pre event) {
GuiScreen guiScreen = event.getGui();
if (inputHandler != null) {
int x = Mouse.getEventX() * guiScreen.width / guiScreen.mc.displayWidth;
int y = guiScreen.height - Mouse.getEventY() * guiScreen.height / guiScreen.mc.displayHeight - 1;
if (inputHandler.handleMouseEvent(guiScreen, x, y)) {
event.setCanceled(true);
}
}
}
}