aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/quicknav
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/quicknav')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java80
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java107
2 files changed, 187 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java
new file mode 100644
index 00000000..51a3d409
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java
@@ -0,0 +1,80 @@
+package de.hysky.skyblocker.skyblock.quicknav;
+
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+
+import de.hysky.skyblocker.config.SkyblockerConfig;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
+import net.fabricmc.fabric.api.client.screen.v1.Screens;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.screen.ingame.HandledScreen;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.StringNbtReader;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.regex.PatternSyntaxException;
+
+public class QuickNav {
+ private static final String skyblockHubIconNbt = "{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}}";
+ private static final String dungeonHubIconNbt = "{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}}";
+
+ public static void init() {
+ ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
+ if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().quickNav.enableQuickNav && screen instanceof HandledScreen<?> && client.player != null && !client.player.isCreative()) {
+ String screenTitle = screen.getTitle().getString().trim();
+ List<QuickNavButton> buttons = QuickNav.init(screenTitle);
+ for (QuickNavButton button : buttons) Screens.getButtons(screen).add(button);
+ }
+ });
+ }
+
+ public static List<QuickNavButton> init(String screenTitle) {
+ List<QuickNavButton> buttons = new ArrayList<>();
+ SkyblockerConfig.QuickNav data = SkyblockerConfigManager.get().quickNav;
+ try {
+ if (data.button1.render) buttons.add(parseButton(data.button1, screenTitle, 0));
+ if (data.button2.render) buttons.add(parseButton(data.button2, screenTitle, 1));
+ if (data.button3.render) buttons.add(parseButton(data.button3, screenTitle, 2));
+ if (data.button4.render) buttons.add(parseButton(data.button4, screenTitle, 3));
+ if (data.button5.render) buttons.add(parseButton(data.button5, screenTitle, 4));
+ if (data.button6.render) buttons.add(parseButton(data.button6, screenTitle, 5));
+ if (data.button7.render) buttons.add(parseButton(data.button7, screenTitle, 6));
+ if (data.button8.render) buttons.add(parseButton(data.button8, screenTitle, 7));
+ if (data.button9.render) buttons.add(parseButton(data.button9, screenTitle, 8));
+ if (data.button10.render) buttons.add(parseButton(data.button10, screenTitle, 9));
+ if (data.button11.render) buttons.add(parseButton(data.button11, screenTitle, 10));
+ if (data.button12.render) buttons.add(parseButton(data.button12, screenTitle, 11));
+ } catch (CommandSyntaxException e) {
+ e.printStackTrace();
+ }
+ return buttons;
+ }
+
+ private static QuickNavButton parseButton(SkyblockerConfig.QuickNavItem buttonInfo, String screenTitle, int id) throws CommandSyntaxException {
+ SkyblockerConfig.ItemData itemData = buttonInfo.item;
+ String nbtString = "{id:\"minecraft:" + itemData.itemName.toLowerCase(Locale.ROOT) + "\",Count:1";
+ if (itemData.nbt.length() > 2) nbtString += "," + itemData.nbt;
+ nbtString += "}";
+ boolean uiTitleMatches = false;
+ try {
+ uiTitleMatches = screenTitle.matches(buttonInfo.uiTitle);
+ } catch (PatternSyntaxException e) {
+ e.printStackTrace();
+ ClientPlayerEntity player = MinecraftClient.getInstance().player;
+ if (player != null) {
+ player.sendMessage(Text.of(Formatting.RED + "[Skyblocker] Invalid regex in quicknav button " + (id + 1) + "!"), false);
+ }
+ }
+ return new QuickNavButton(id,
+ uiTitleMatches,
+ buttonInfo.clickEvent,
+ ItemStack.fromNbt(StringNbtReader.parse(nbtString))
+ );
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
new file mode 100644
index 00000000..5e76427a
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
@@ -0,0 +1,107 @@
+package de.hysky.skyblocker.skyblock.quicknav;
+
+import com.mojang.blaze3d.systems.RenderSystem;
+
+import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor;
+import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
+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.client.util.math.MatrixStack;
+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 static final Identifier BUTTON_TEXTURE = new Identifier("textures/gui/container/creative_inventory/tabs.png");
+
+ private final int index;
+ private boolean toggled;
+ private int u;
+ private int v;
+ private final String command;
+ private final ItemStack icon;
+
+ 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
+ this.setX(x + this.index % 6 * 26 + 4);
+ this.setY(this.index < 6 ? y - 26 : y + h - 4);
+ this.u = 26;
+ this.v = (index < 6 ? 0 : 64) + (toggled ? 32 : 0);
+ }
+ }
+
+ @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
+ }
+ }
+
+ @Override
+ public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) {
+ this.updateCoordinates();
+ MatrixStack matrices = context.getMatrices();
+ RenderSystem.disableDepthTest();
+ // render button background
+ if (!this.toggled) {
+ if (this.index >= 6)
+ // this.drawTexture(matrices, this.x, this.y + 4, this.u, this.v + 4, this.width, this.height - 4);
+ context.drawTexture(BUTTON_TEXTURE, this.getX(), this.getY() + 4, this.u, this.v + 4, this.width, this.height - 4);
+ else
+ // this.drawTexture(matrices, this.x, this.y, this.u, this.v, this.width, this.height - 4);
+ context.drawTexture(BUTTON_TEXTURE, this.getX(), this.getY() - 2, this.u, this.v, this.width, this.height - 4);
+ // } else this.drawTexture(matrices, this.x, this.y, this.u, this.v, this.width, this.height);
+ } else {
+ matrices.push();
+ //Move the top buttons 2 pixels up if they're selected
+ if (this.index < 6) matrices.translate(0f, -2f, 0f);
+ context.drawTexture(BUTTON_TEXTURE, this.getX(), this.getY(), this.u, this.v, this.width, this.height);
+ matrices.pop();
+ }
+ // render button icon
+ if (!this.toggled) {
+ if (this.index >= 6)
+ // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6);
+ context.drawItem(this.icon,this.getX() + 5, this.getY() + 6);
+ else
+ // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9);
+ context.drawItem(this.icon,this.getX() + 5, this.getY() + 7);
+ } else {
+ if (this.index >= 6)
+ // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9);
+ context.drawItem(this.icon,this.getX() + 5, this.getY() + 9);
+ else
+ // CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6);
+ context.drawItem(this.icon,this.getX() + 5, this.getY() + 6);
+ }
+ RenderSystem.enableDepthTest();
+ }
+
+ @Override
+ protected void appendClickableNarrations(NarrationMessageBuilder builder) {
+ // TODO Auto-generated method stub
+
+ }
+}