-
-
Notifications
You must be signed in to change notification settings - Fork 509
/
GuiTankBar.java
124 lines (107 loc) · 5.03 KB
/
GuiTankBar.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
package mekanism.client.gui.element.bar;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import mekanism.client.gui.GuiMekanismTile;
import mekanism.client.gui.GuiUtils.TilingDirection;
import mekanism.client.gui.IGuiWrapper;
import mekanism.client.gui.element.bar.GuiTankBar.TankInfoProvider;
import mekanism.client.jei.interfaces.IJEIIngredientHelper;
import mekanism.client.render.MekanismRenderer;
import mekanism.common.Mekanism;
import mekanism.common.item.ItemGaugeDropper;
import mekanism.common.network.to_server.PacketDropperUse;
import mekanism.common.network.to_server.PacketDropperUse.DropperAction;
import mekanism.common.network.to_server.PacketDropperUse.TankType;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.renderer.Rect2i;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.lwjgl.glfw.GLFW;
public abstract class GuiTankBar<STACK> extends GuiBar<TankInfoProvider<STACK>> implements IJEIIngredientHelper {
public GuiTankBar(IGuiWrapper gui, TankInfoProvider<STACK> infoProvider, int x, int y, int width, int height, boolean horizontal) {
super(TextureAtlas.LOCATION_BLOCKS, gui, infoProvider, x, y, width, height, horizontal);
}
protected abstract boolean isEmpty(STACK stack);
@Nullable
protected abstract TankType getType(STACK stack);
@Override
public void renderToolTip(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY) {
STACK stored = getHandler().getStack();
if (isEmpty(stored)) {
super.renderToolTip(guiGraphics, mouseX, mouseY);
} else {
displayTooltips(guiGraphics, mouseX, mouseY, getTooltip(stored));
}
}
protected List<Component> getTooltip(STACK stack) {
List<Component> tooltips = new ArrayList<>();
Component tooltip = getHandler().getTooltip();
if (tooltip != null) {
tooltips.add(tooltip);
}
return tooltips;
}
protected abstract void applyRenderColor(GuiGraphics guiGraphics, STACK stack);
protected abstract TextureAtlasSprite getIcon(STACK stack);
@Override
protected void renderBarOverlay(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks, double handlerLevel) {
STACK stored = getHandler().getStack();
if (!isEmpty(stored)) {
int displayInt = (int) (handlerLevel * ((horizontal ? width : height) - 2));
if (displayInt > 0) {
applyRenderColor(guiGraphics, stored);
TextureAtlasSprite icon = getIcon(stored);
if (horizontal) {
drawTiledSprite(guiGraphics, relativeX + 1, relativeY + 1, height - 2, displayInt, height - 2, icon, TilingDirection.DOWN_RIGHT);
} else {
drawTiledSprite(guiGraphics, relativeX + 1, relativeY + 1, height - 2, width - 2, displayInt, icon, TilingDirection.DOWN_RIGHT);
}
MekanismRenderer.resetColor(guiGraphics);
}
}
}
@Override
public void onClick(double mouseX, double mouseY, int button) {
ItemStack stack = gui().getCarriedItem();
if (gui() instanceof GuiMekanismTile<?, ?> gui && !stack.isEmpty() && stack.getItem() instanceof ItemGaugeDropper) {
TankType tankType = getType(getHandler().getStack());
if (tankType != null) {
int index = getHandler().getTankIndex();
if (index != -1) {
DropperAction action;
if (button == GLFW.GLFW_MOUSE_BUTTON_1) {
action = Screen.hasShiftDown() ? DropperAction.DUMP_TANK : DropperAction.FILL_DROPPER;
} else { //GLFW.GLFW_MOUSE_BUTTON_2
action = DropperAction.DRAIN_DROPPER;
}
Mekanism.packetHandler().sendToServer(new PacketDropperUse(gui.getTileEntity().getBlockPos(), action, tankType, index));
}
}
}
}
@Override
public boolean isValidClickButton(int button) {
return button == GLFW.GLFW_MOUSE_BUTTON_1 || button == GLFW.GLFW_MOUSE_BUTTON_2;
}
@Override
public Optional<?> getIngredient(double mouseX, double mouseY) {
STACK stack = getHandler().getStack();
return isEmpty(stack) ? Optional.empty() : Optional.of(stack);
}
@Override
public Rect2i getIngredientBounds(double mouseX, double mouseY) {
return new Rect2i(getX() + 1, getY() + 1, width - 2, height - 2);
}
//Note the GuiBar.IBarInfoHandler is needed, as it cannot compile and resolve just IBarInfoHandler
public interface TankInfoProvider<STACK> extends GuiBar.IBarInfoHandler {
@NotNull
STACK getStack();
int getTankIndex();
}
}