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
136
137
138
139
140
141
142
143
144
|
package de.hysky.skyblocker.skyblock.quicknav;
import com.mojang.blaze3d.systems.RenderSystem;
import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
@Environment(value=EnvType.CLIENT)
public class QuickNavButton extends ClickableWidget {
private final int index;
private boolean toggled;
private final String command;
private final ItemStack icon;
/**
* Checks if the current tab is a top tab based on its index.
*
* @return true if the index is less than 6, false otherwise.
*/
private boolean isTopTab() {
if (!SkyblockerConfigManager.get().quickNav.enableExtendedQuickNav) {
return index < 6;
} else {
return index < 7;
}
}
/**
* Constructs a new QuickNavButton with the given parameters.
*
* @param index the index of the button.
* @param toggled the toggled state of the button.
* @param command the command to execute when the button is clicked.
* @param icon the icon to display on the button.
*/
public QuickNavButton(int index, boolean toggled, String command, ItemStack icon) {
super(0, 0, 26, 32, Text.empty());
this.index = index;
this.toggled = toggled;
this.command = command;
this.icon = icon;
}
private void updateCoordinates() {
Screen screen = MinecraftClient.getInstance().currentScreen;
if (screen instanceof HandledScreen<?> handledScreen) {
int x = ((HandledScreenAccessor) handledScreen).getX();
int y = ((HandledScreenAccessor) handledScreen).getY();
int h = ((HandledScreenAccessor) handledScreen).getBackgroundHeight();
if (h > 166) --h; // why is this even a thing
if (!SkyblockerConfigManager.get().quickNav.enableExtendedQuickNav) {
this.setX(x + this.index % 6 * 26 + 4);
this.setY(this.index < 6 ? y - 26 : y + h - 4);
} else {
this.setX(x + this.index % 7 * 25);
this.setY(this.index < 7 ? y - 25 : y + h - 4);
}
}
}
/**
* Handles click events. If the button is not currently toggled,
* it sets the toggled state to true and sends a message with the command after cooldown.
*
* @param mouseX the x-coordinate of the mouse click
* @param mouseY the y-coordinate of the mouse click
*/
@Override
public void onClick(double mouseX, double mouseY) {
if (!this.toggled) {
this.toggled = true;
MessageScheduler.INSTANCE.sendMessageAfterCooldown(command);
// TODO : add null check with log error
}
}
/**
* Renders the button on screen. This includes both its texture and its icon.
* The method first updates the coordinates of the button,
* then calculates appropriate values for rendering based on its current state,
* and finally draws both the background and icon of the button on screen.
*
* @param context the context in which to render the button
* @param mouseX the x-coordinate of the mouse cursor
* @param mouseY the y-coordinate of the mouse cursor
*/
@Override
public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
this.updateCoordinates();
RenderSystem.disableDepthTest();
// Construct the texture identifier based on the index and toggled state
String tabType = isTopTab() ? "top" : "bottom";
Identifier BUTTON_TEXTURES = new Identifier("container/creative_inventory/tab_" + tabType +
(toggled ? "_selected_" : "_unselected_") + 2);
// Render the button texture
int y = this.getY();
if (!SkyblockerConfigManager.get().quickNav.enableExtendedQuickNav) {
if (this.toggled) {
if (this.index < 6) y -= 2;
} else {
y += (this.index >= 6) ? 4 : -2;
}
int height = this.height - ((this.toggled) ? 0 : 4);
context.drawGuiTexture(BUTTON_TEXTURES, this.getX(), y, this.width, height);
// Render the button icon
int yOffset = !this.toggled && this.index < 6 ? 1 : 0;
context.drawItem(this.icon, this.getX() + 5, this.getY() + 6 + yOffset);
} else {
if (this.toggled) {
if (this.index < 7) y -= 2;
} else {
y += (this.index >= 7) ? 4 : -2;
}
int height = this.height - ((this.toggled) ? 0 : 4);
context.drawGuiTexture(BUTTON_TEXTURES, this.getX(), y, this.width - 1, height);
// Render the button icon
int yOffset = !this.toggled && this.index < 7 ? 1 : 0;
context.drawItem(this.icon, this.getX() + 4, this.getY() + 6 + yOffset);
}
RenderSystem.enableDepthTest();
}
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {
// TODO Auto-generated method stub
}
}
|