From 1b1d968d3d4248d9b7b943ab46656b3cc0a6e0c9 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Fri, 28 Jan 2022 15:53:12 +0100 Subject: Made item list use the vanilla recipe book --- .../skyblocker/mixin/HandledScreenMixin.java | 26 --- .../skyblocker/mixin/InventoryScreenMixin.java | 22 +++ .../skyblocker/mixin/RecipeBookWidgetAccessor.java | 16 ++ .../skyblock/itemlist/ItemListWidget.java | 210 +++++---------------- .../skyblock/itemlist/ResultButtonWidget.java | 54 ++++++ .../skyblock/itemlist/SearchResultsWidget.java | 110 +++++++++++ .../skyblocker/skyblock/itemlist/SearchWidget.java | 25 --- src/main/resources/skyblocker.mixins.json | 6 +- 8 files changed, 253 insertions(+), 216 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/RecipeBookWidgetAccessor.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchWidget.java (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java deleted file mode 100644 index 0ed976f3..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.xmrvizzy.skyblocker.mixin; - -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemListWidget; -import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(HandledScreen.class) -public abstract class HandledScreenMixin extends Screen { - protected HandledScreenMixin(Text title) { - super(title); - } - - @Inject(method = "init()V", at = @At("TAIL")) - private void init(CallbackInfo ci) { - if (Utils.isSkyblock && SkyblockerConfig.get().general.itemList.enableItemList) { - super.addDrawableChild(new ItemListWidget((HandledScreen)(Object)this)); - } - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java new file mode 100644 index 00000000..c6c892a0 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java @@ -0,0 +1,22 @@ +package me.xmrvizzy.skyblocker.mixin; + +import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemListWidget; +import net.minecraft.client.gui.screen.ingame.InventoryScreen; +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(InventoryScreen.class) +public class InventoryScreenMixin { + @Redirect( + method = "", + at = @At( + value = "NEW", + target = "net/minecraft/client/gui/screen/recipebook/RecipeBookWidget" + ) + ) + RecipeBookWidget constructor() { + return new ItemListWidget(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/RecipeBookWidgetAccessor.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/RecipeBookWidgetAccessor.java new file mode 100644 index 00000000..ef8319a0 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/RecipeBookWidgetAccessor.java @@ -0,0 +1,16 @@ +package me.xmrvizzy.skyblocker.mixin; + +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; +import net.minecraft.client.gui.widget.TextFieldWidget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(RecipeBookWidget.class) +public interface RecipeBookWidgetAccessor { + @Accessor + String getSearchText(); + @Accessor + int getLeftOffset(); + @Accessor + TextFieldWidget getSearchField(); +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java index e01d58a5..7560d43d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -1,194 +1,78 @@ package me.xmrvizzy.skyblocker.skyblock.itemlist; -import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; +import me.xmrvizzy.skyblocker.mixin.RecipeBookWidgetAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.AbstractParentElement; import net.minecraft.client.gui.Drawable; -import net.minecraft.client.gui.Element; import net.minecraft.client.gui.Selectable; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; +import net.minecraft.screen.AbstractRecipeScreenHandler; import net.minecraft.text.Text; - -import java.util.ArrayList; -import java.util.List; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.Formatting; @Environment(value= EnvType.CLIENT) -public class ItemListWidget extends AbstractParentElement implements Drawable, Selectable { - private static final List entries = new ArrayList<>(); - private static String searchString = ""; - private static double scroll = 0.0; - - private final int gridX; - private final int gridY; - private final int rows; - private final int cols; - - private double maxScroll; - private boolean isHovered; - - private final HandledScreen screen; - private final MinecraftClient client; - private final List children = Lists.newArrayList(); - private final List selectables = Lists.newArrayList(); - private final List drawables = Lists.newArrayList(); - - public ItemListWidget(HandledScreen screen) { - this.screen = screen; - this.client = MinecraftClient.getInstance(); - - this.cols = (screen.width - 200) / 2 / 16; - this.rows = (screen.height - 40) / 16; - this.gridX = 8; - this.gridY = 40; - - this.maxScroll = Math.max(0, entries.size() / this.cols - this.rows + 1); - - SearchWidget search = new SearchWidget(this.client.textRenderer, 8, 8, this.cols * 16); - search.setText(searchString); - search.setChangedListener(this::setSearch); - this.addDrawableChild(search); - - this.setSearch(searchString); - } - - private void setSearch(String search) { - searchString = search; - entries.clear(); - search = search.toLowerCase(); - for (Entry entry : ItemRegistry.registry) { - String name = entry.itemStack.getName().toString().toLowerCase(); - String lore = entry.itemStack.getNbt().toString().toLowerCase(); - if (name.contains(search) || lore.contains(search)) - entries.add(entry); - } - this.maxScroll = Math.max(0, entries.size() / this.cols - this.rows + 1); - scroll = Math.min(scroll, this.maxScroll); - } +public class ItemListWidget extends RecipeBookWidget implements Drawable, Selectable { + private int parentWidth; + private int parentHeight; + private int leftOffset; + private TextFieldWidget searchField; + private SearchResultsWidget results; - protected T addDrawableChild(T drawableElement) { - this.drawables.add(drawableElement); - return this.addSelectableChild(drawableElement); - } + public ItemListWidget() { super(); } - protected T addDrawable(T drawable) { - this.drawables.add(drawable); - return drawable; + public void updateSearchResult() { + this.results.updateSearchResult(((RecipeBookWidgetAccessor)this).getSearchText()); } - protected T addSelectableChild(T child) { - this.children.add(child); - this.selectables.add(child); - return child; + @Override + public void initialize(int parentWidth, int parentHeight, MinecraftClient client, boolean narrow, AbstractRecipeScreenHandler craftingScreenHandler) { + super.initialize(parentWidth, parentHeight, client, narrow, craftingScreenHandler); + this.parentWidth = parentWidth; + this.parentHeight = parentHeight; + this.leftOffset = ((RecipeBookWidgetAccessor)this).getLeftOffset(); + this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField(); + int x = (this.parentWidth - 147) / 2 - this.leftOffset; + int y = (this.parentHeight - 166) / 2; + this.results = new SearchResultsWidget(this.client, x , y); + this.updateSearchResult(); } @Override public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - this.isHovered = this.isMouseOver(mouseX, mouseY); - ItemRenderer itemRenderer = client.getItemRenderer(); - RenderSystem.disableDepthTest(); - // slot hover - int mouseOverIndex = getMouseOverIndex(mouseX, mouseY); - if (mouseOverIndex != -1) { - int x = this.gridX + mouseOverIndex % this.cols * 16; - int y = this.gridY + (mouseOverIndex / this.cols - (int)scroll) * 16; - fill(matrices, x, y, x + 16, y + 16, 0x20ffffff); - } - // item list - for (int i = 0; i < rows; ++i) - for (int j = 0; j < cols; ++j) { - int index = (i + (int)scroll) * cols + j; - if (index < entries.size()) { - int x = gridX + j * 16; - int y = gridY + i * 16; - itemRenderer.renderInGui(entries.get(index).itemStack, x, y); - } + if (this.isOpen()) { + matrices.push(); + matrices.translate(0.0D, 0.0D, 100.0D); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderTexture(0, TEXTURE); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + int i = (this.parentWidth - 147) / 2 - this.leftOffset; + int j = (this.parentHeight - 166) / 2; + this.drawTexture(matrices, i, j, 1, 1, 147, 166); + this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField(); + if (!this.searchField.isFocused() && this.searchField.getText().isEmpty()) { + Text hintText = (new TranslatableText("gui.recipebook.search_hint")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY); + drawTextWithShadow(matrices, this.client.textRenderer, hintText, i + 25, j + 14, -1); + } else { + this.searchField.render(matrices, mouseX, mouseY, delta); } - // item tooltip - if (mouseOverIndex != -1) { - ItemStack stack = entries.get(mouseOverIndex).itemStack; - List tooltip = this.screen.getTooltipFromItem(stack); - this.screen.renderTooltip(matrices, tooltip, mouseX, mouseY); - } - RenderSystem.enableDepthTest(); - // render children - for (Drawable drawable : this.drawables) { - drawable.render(matrices, mouseX, mouseY, delta); - } - } - - private boolean isMouseOverList(double mouseX, double mouseY) { - return gridX <= mouseX && mouseX < gridX + cols * 16 && gridY <= mouseY && mouseY < gridY + rows * 16; - } - - private int getMouseOverIndex(double mouseX, double mouseY) { - if (isMouseOverList(mouseX, mouseY)) { - int i = (int)(mouseY - this.gridY) / 16; - int j = (int)(mouseX - this.gridX) / 16; - int index = (i + (int)scroll) * this.cols + j; - if (index < entries.size()) return index; + this.updateSearchResult(); + this.results.render(matrices, mouseX, mouseY, delta); + matrices.pop(); } - return -1; - } - - @Override - public boolean isMouseOver(double mouseX, double mouseY) { - for (Element child : this.children) { - if (child.isMouseOver(mouseX, mouseY)) return true; - } - return this.isMouseOverList(mouseX, mouseY); - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double amount) { - if (super.mouseScrolled(mouseX, mouseY, amount)) { - return true; - } else if (this.isMouseOverList(mouseX, mouseY)) { - scroll = Math.min(this.maxScroll, Math.max(0.0, scroll - amount)); - return true; - } - return false; - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (super.keyPressed(keyCode, scanCode, modifiers)) return true; - return this.getFocused() instanceof TextFieldWidget && ((TextFieldWidget) this.getFocused()).isFocused() && keyCode != 256; - } - - @Override - public List children() { - return this.children; } @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (super.mouseClicked(mouseX, mouseY, button)) return true; - int index = getMouseOverIndex(mouseX, mouseY); - if (index != -1 && entries.get(index).clickCommand != null) { - this.client.player.sendChatMessage(entries.get(index).clickCommand); - return true; + if (this.isOpen() && !this.client.player.isSpectator()) { + if (this.searchField.mouseClicked(mouseX, mouseY, button)) return true; + if (this.results.mouseClicked(mouseX, mouseY, button)) return true; } return false; } - - @Override - public void appendNarrations(NarrationMessageBuilder builder) { - - } - - @Override - public SelectionType getType() { - for (Selectable selectable : selectables) - if (selectable.getType().isFocused()) return SelectionType.FOCUSED; - if (this.isHovered) return SelectionType.HOVERED; - return SelectionType.NONE; - } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java new file mode 100644 index 00000000..65558ac3 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java @@ -0,0 +1,54 @@ +package me.xmrvizzy.skyblocker.skyblock.itemlist; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; +import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.List; + +public class ResultButtonWidget extends ClickableWidget { + private static final Identifier BACKGROUND_TEXTURE = new Identifier("textures/gui/recipe_book.png"); + + private ItemStack itemStack = null; + + public ResultButtonWidget(int x, int y) { + super(x, y, 25, 25, Text.of("")); + } + + protected void setItemStack(ItemStack itemStack) { + this.visible = true; + this.itemStack = itemStack; + } + + protected void clearItemStack() { + this.visible = false; + this.itemStack = null; + } + + @Override + public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { + MinecraftClient client = MinecraftClient.getInstance(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderTexture(0, BACKGROUND_TEXTURE); + this.drawTexture(matrices, this.x, this.y, 29, 206, this.width, this.height); + client.getItemRenderer().renderInGui(this.itemStack, this.x + 4, this.y + 4); + } + + @Override + public void renderTooltip(MatrixStack matrices, int mouseX, int mouseY) { + MinecraftClient client = MinecraftClient.getInstance(); + List tooltip = client.currentScreen.getTooltipFromItem(this.itemStack); + client.currentScreen.renderTooltip(matrices, tooltip, mouseX, mouseY); + } + + @Override + public void appendNarrations(NarrationMessageBuilder builder) { + + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java new file mode 100644 index 00000000..59d81f33 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -0,0 +1,110 @@ +package me.xmrvizzy.skyblocker.skyblock.itemlist; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.widget.ToggleButtonWidget; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; + +import java.util.ArrayList; +import java.util.List; + +public class SearchResultsWidget implements Drawable { + private static final Identifier TEXTURE = new Identifier("textures/gui/recipe_book.png"); + + private final MinecraftClient client; + private final int parentX; + private final int parentY; + private final int rows = 4; + private final int cols = 5; + + private final List searchResults = new ArrayList<>(); + private String searchText = null; + private List resultButtons = new ArrayList<>(); + private ToggleButtonWidget nextPageButton; + private ToggleButtonWidget prevPageButton; + private int currentPage = 0; + private int pageCount = 0; + + public SearchResultsWidget(MinecraftClient client, int parentX, int parentY) { + this.client = client; + this.parentX = parentX; + this.parentY = parentY; + int gridX = parentX + 11; + int gridY = parentY + 31; + for (int i = 0; i < this.rows; ++i) + for (int j = 0; j < this.cols; ++j) { + int x = gridX + j * 25; + int y = gridY + i * 25; + resultButtons.add(new ResultButtonWidget(x, y)); + } + this.nextPageButton = new ToggleButtonWidget(parentX + 93, parentY + 137, 12, 17, false); + this.nextPageButton.setTextureUV(1, 208, 13, 18, TEXTURE); + this.prevPageButton = new ToggleButtonWidget(parentX + 38, parentY + 137, 12, 17, true); + this.prevPageButton.setTextureUV(1, 208, 13, 18, TEXTURE); + } + + protected void updateSearchResult(String searchText) { + if (!searchText.equals(this.searchText)) { + this.searchText = searchText; + this.searchResults.clear(); + for (Entry entry : ItemRegistry.registry) { + String name = entry.itemStack.getName().toString().toLowerCase(); + String lore = entry.itemStack.getNbt().toString().toLowerCase(); + if (name.contains(this.searchText) || lore.contains(this.searchText)) + this.searchResults.add(entry); + } + this.currentPage = 0; + this.pageCount = (this.searchResults.size() - 1) / resultButtons.size() + 1; + this.updateButtons(); + } + } + + private void updateButtons() { + for (int i = 0; i < resultButtons.size(); ++i) { + int index = this.currentPage * resultButtons.size() + i; + if (index < this.searchResults.size()) { + resultButtons.get(i).setItemStack(this.searchResults.get(index).itemStack); + } else { + resultButtons.get(i).clearItemStack(); + } + } + this.prevPageButton.active = this.currentPage > 0; + this.nextPageButton.active = this.currentPage < this.pageCount - 1; + } + + public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + RenderSystem.disableDepthTest(); + for (ResultButtonWidget button : resultButtons) + button.render(matrices, mouseX, mouseY, delta); + if (this.pageCount > 1) { + String string = (this.currentPage + 1) + "/" + this.pageCount; + int dx = this.client.textRenderer.getWidth(string) / 2; + this.client.textRenderer.draw(matrices, string, this.parentX - dx + 73, this.parentY + 141, -1); + } + if (this.prevPageButton.active) this.prevPageButton.render(matrices, mouseX, mouseY, delta); + if (this.nextPageButton.active) this.nextPageButton.render(matrices, mouseX, mouseY, delta); + for (ResultButtonWidget button : resultButtons) + if (button.isMouseOver(mouseX, mouseY)) + button.renderTooltip(matrices, mouseX, mouseY); + RenderSystem.enableDepthTest(); + } + + public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { + for (ResultButtonWidget button : resultButtons) + if (button.mouseClicked(mouseX, mouseY, mouseButton)) return true; + if (this.prevPageButton.mouseClicked(mouseX, mouseY, mouseButton)) { + --this.currentPage; + this.updateButtons(); + return true; + } + if (this.nextPageButton.mouseClicked(mouseX, mouseY, mouseButton)) { + ++this.currentPage; + this.updateButtons(); + return true; + } + return false; + } + +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchWidget.java deleted file mode 100644 index 4acf91b2..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchWidget.java +++ /dev/null @@ -1,25 +0,0 @@ -package me.xmrvizzy.skyblocker.skyblock.itemlist; - -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; - -public class SearchWidget extends TextFieldWidget { - protected final int x; - protected final int y; - protected final TextRenderer textRenderer; - - public SearchWidget(TextRenderer textRenderer, int x, int y, int width) { - super(textRenderer, x + 1, y + 12, width - 2, 16, Text.of("Search")); - this.x = x; - this.y = y; - this.textRenderer = textRenderer; - } - - @Override - public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { - super.renderButton(matrices, mouseX, mouseY, delta); - this.textRenderer.drawWithShadow(matrices, "Search", this.x, this.y, 0xff9e9e9e); - } -} diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 6efba1f9..3bf7625e 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -9,11 +9,13 @@ "InGameHudMixin", "ItemRendererMixin", "LeverBlockMixin", - "MinecraftClientMixin" + "MinecraftClientMixin", "AccessorWorldRenderer", "GenericContainerScreenMixin", "GenericContainerScreenHandlerMixin", - "HandledScreenMixin" + "HandledScreenMixin", + "InventoryScreenMixin", + "RecipeBookWidgetAccessor" ], "injectors": { "defaultRequire": 1 -- cgit From 4d8e146384a6d7f11b3126ffc8e43451e993c506 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Fri, 28 Jan 2022 16:01:18 +0100 Subject: Merge upstream --- README.md | 10 ++- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 23 +++++- .../skyblocker/config/SkyblockerConfig.java | 11 ++- .../skyblocker/discord/DiscordRPCManager.java | 2 +- .../skyblocker/mixin/HandledScreenMixin.java | 42 +++++++++++ .../skyblocker/skyblock/quicknav/QuickNav.java | 35 +++++++++ .../skyblock/quicknav/QuickNavButton.java | 86 ++++++++++++++++++++++ .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 18 +++-- .../resources/assets/skyblocker/lang/en_us.json | 2 + src/main/resources/fabric.mod.json | 2 +- 10 files changed, 213 insertions(+), 18 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java (limited to 'src/main') diff --git a/README.md b/README.md index f3f960d2..48dd09db 100644 --- a/README.md +++ b/README.md @@ -43,10 +43,14 @@ ___ ___ ## Images -
-open (no images yet) +
+open - + + + + +
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index ceb55549..29e98038 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -7,6 +7,8 @@ import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; +import java.util.Objects; + public class SkyblockerMod { public static final String NAMESPACE = "skyblocker"; private static final SkyblockerMod instance = new SkyblockerMod(); @@ -36,7 +38,7 @@ public class SkyblockerMod { } catch (Exception e) { //System.out.println("Blazesolver: " + e); } - if (ticks % 20 == 0) { + if (ticks % 20 == 0 ) { rpTimer++; if (rpTimer == 5){ discordRPCManager.updatePresence(); @@ -44,10 +46,25 @@ public class SkyblockerMod { } if (client.world != null && !client.isInSingleplayer()) Utils.sbChecker(); - if (!discordRPCManager.isConnected && Utils.isSkyblock && SkyblockerConfig.get().general.richPresence.enableRichPresence) discordRPCManager.start(); + if (!discordRPCManager.isConnected && Utils.isSkyblock && SkyblockerConfig.get().general.richPresence.enableRichPresence && onHypxiel()) discordRPCManager.start(); if (discordRPCManager.isConnected && !SkyblockerConfig.get().general.richPresence.enableRichPresence) discordRPCManager.stop(); - if (client.world == null || client.isInSingleplayer() || !Utils.isSkyblock) if (discordRPCManager.isConnected)discordRPCManager.stop(); + if (client.world == null || client.isInSingleplayer() || !Utils.isSkyblock || !onHypxiel()) if (discordRPCManager.isConnected)discordRPCManager.stop(); ticks = 0; } } + public static MinecraftClient client() { + try { + return MinecraftClient.getInstance(); + } + catch(NullPointerException e) { + return null; + } + } + public static boolean onHypxiel() { + try { + return client() != null && !client().isInSingleplayer() && client().getCurrentServerEntry().address != null && client().getCurrentServerEntry().address.contains("hypixel.net"); + } catch (NullPointerException exception) { + return false; + } + } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 59781b4f..3eca5fd2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -39,6 +39,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) public ItemList itemList = new ItemList(); + @ConfigEntry.Category("quicknav") + @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + public Quicknav quicknav = new Quicknav(); + @ConfigEntry.Gui.Excluded public List lockedSlots = new ArrayList<>(); } @@ -47,8 +51,7 @@ public class SkyblockerConfig implements ConfigData { public boolean enableBars = true; } public static class RichPresence { - @ConfigEntry.Gui.Tooltip() - public boolean enableRichPresence = true; + public boolean enableRichPresence = false; @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) public Info info = Info.LOCATION; public String customMessage; @@ -58,6 +61,10 @@ public class SkyblockerConfig implements ConfigData { public boolean enableItemList = true; } + public static class Quicknav { + public boolean enableQuicknav = true; + } + public static class Locations { @ConfigEntry.Category("dungeons") @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index fc151371..a3599196 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -47,7 +47,7 @@ public class DiscordRPCManager implements IPCListener{ public String getInfo(){ String info = null; - if (SkyblockerConfig.get().general.richPresence.info == SkyblockerConfig.Info.BITS) info = "Bits: " + Utils.getBits(); + if (SkyblockerConfig.get().general.richPresence.info == SkyblockerConfig.Info.BITS) info = "Bits: " + dFormat.format(Utils.getBits()); if (SkyblockerConfig.get().general.richPresence.info == SkyblockerConfig.Info.PURSE) info = "Purse: " + dFormat.format(Utils.getPurse()); if (SkyblockerConfig.get().general.richPresence.info == SkyblockerConfig.Info.LOCATION) info = "⏣ " + Utils.getLocation(); return info; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java new file mode 100644 index 00000000..9ae5bf92 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -0,0 +1,42 @@ +package me.xmrvizzy.skyblocker.mixin; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav; +import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNavButton; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +@Mixin(HandledScreen.class) +public abstract class HandledScreenMixin extends Screen { + @Shadow protected int backgroundWidth; + @Shadow protected int backgroundHeight; + + protected HandledScreenMixin(Text title) { + super(title); + } + + @Inject(method = "init()V", at = @At("TAIL")) + private void init(CallbackInfo ci) { + // quicknav + if (Utils.isSkyblock && SkyblockerConfig.get().general.quicknav.enableQuicknav) { + String title = super.getTitle().getString().trim(); + int left_x = (super.width - this.backgroundWidth) / 2 + 4; + int right_x = (super.width + this.backgroundWidth) / 2 - 3; + int top_y = (super.height - this.backgroundHeight) / 2 - 28; + int bottom_y = (super.height + this.backgroundHeight) / 2 - 4; + if (this.backgroundHeight > 166) --bottom_y; // why is this even a thing + List buttons = QuickNav.init(title, left_x, right_x, top_y, bottom_y); + for (QuickNavButton button : buttons) super.addDrawableChild(button); + + } + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java new file mode 100644 index 00000000..b86e6e32 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java @@ -0,0 +1,35 @@ +package me.xmrvizzy.skyblocker.skyblock.quicknav; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.StringNbtReader; + +import java.util.ArrayList; +import java.util.List; + +public class QuickNav { + public static List init(String title, int left_x, int right_x, int top_y, int bottom_y) { + List buttons = new ArrayList<>(); + + buttons.add(new QuickNavButton(left_x + 29 * 0, top_y, QuickNavButton.Type.TOP, title.contains("Your Skills"), "/skills", new ItemStack(Items.DIAMOND_SWORD))); + buttons.add(new QuickNavButton(left_x + 29 * 1, top_y, QuickNavButton.Type.TOP, title.contains("Collection"), "/collection", new ItemStack(Items.PAINTING))); + + buttons.add(new QuickNavButton(right_x - 29 * 1, bottom_y, QuickNavButton.Type.BOTTOM, title.contains("Craft Item"), "/craft", new ItemStack(Items.CRAFTING_TABLE))); + buttons.add(new QuickNavButton(right_x - 29 * 2, bottom_y, QuickNavButton.Type.BOTTOM, title.contains("Anvil"), "/anvil", new ItemStack(Items.ANVIL))); + buttons.add(new QuickNavButton(right_x - 29 * 3, bottom_y, QuickNavButton.Type.BOTTOM, title.contains("Enchant Item"), "/etable", new ItemStack(Items.ENCHANTING_TABLE))); + + buttons.add(new QuickNavButton(left_x + 29 * 0, bottom_y, QuickNavButton.Type.BOTTOM, false, "/warp hub", new ItemStack(Items.COMPASS))); + buttons.add(new QuickNavButton(left_x + 29 * 1, bottom_y, QuickNavButton.Type.BOTTOM, false, "/warp dungeon_hub", new ItemStack(Items.WITHER_SKELETON_SKULL))); + + buttons.add(new QuickNavButton(right_x - 29 * 1, top_y, QuickNavButton.Type.TOP, title.contains("Storage"), "/storage", new ItemStack(Items.ENDER_CHEST))); + try { + buttons.add(new QuickNavButton(right_x - 29 * 2, top_y, QuickNavButton.Type.TOP, title.contains("Wardrobe"), "/wardrobe", ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:leather_chestplate\", Count:1, tag:{display:{color:8991416}}}")))); + } catch (CommandSyntaxException e) { + e.printStackTrace(); + } + buttons.add(new QuickNavButton(right_x - 29 * 3, top_y, QuickNavButton.Type.TOP, title.contains("Pets"), "/pets", new ItemStack(Items.BONE))); + + return buttons; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java new file mode 100644 index 00000000..8e79b08e --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -0,0 +1,86 @@ +package me.xmrvizzy.skyblocker.skyblock.quicknav; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +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.LiteralText; +import net.minecraft.util.Identifier; + +@Environment(value=EnvType.CLIENT) +public class QuickNavButton extends ClickableWidget { + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + private static final Identifier BUTTON_TEXTURE = new Identifier("textures/gui/container/creative_inventory/tabs.png"); + + @Override + public void appendNarrations(NarrationMessageBuilder builder) { + + } + + public enum Type { + TOP, + BOTTOM, + } + + private final Type type; + private boolean toggled; + private int u; + private int v; + private final String command; + private final ItemStack icon; + + public QuickNavButton(int x, int y, Type type, boolean toggled, String command, ItemStack icon) { + super(x, y, 28, 32, LiteralText.EMPTY); + this.type = type; + if (type == Type.BOTTOM) { + this.u = 28; + this.v = 64; + } else { + this.u = 28; + this.v = 0; + } + this.toggled = toggled; + if (toggled) this.v += 32; + this.command = command; + this.icon = icon; + } + + @Override + public void onClick(double mouseX, double mouseY) { + if (!this.toggled) { + this.toggled = true; + this.v += 32; + CLIENT.player.sendChatMessage(command); + } + } + + @Override + public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { + RenderSystem.setShaderTexture(0, BUTTON_TEXTURE); + RenderSystem.disableDepthTest(); + // render button background + if (!this.toggled) { + if (this.type == Type.BOTTOM) + this.drawTexture(matrices, this.x, this.y + 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); + } else this.drawTexture(matrices, this.x, this.y, this.u, this.v, this.width, this.height); + // render button icon + if (!this.toggled) { + if (this.type == Type.BOTTOM) + CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6); + else + CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9); + } else { + if (this.type == Type.BOTTOM) + CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9); + else + CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6); + } + RenderSystem.enableDepthTest(); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 8f299ac5..71f4954a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -49,8 +49,8 @@ public class Utils { String location = null; List sidebarLines = getSidebar(); try{ - for (int i = 0; i < sidebarLines.size(); i++) { - if(sidebarLines.get(i).contains("⏣")) location = sidebarLines.get(i); + for (String sidebarLine : sidebarLines) { + if (sidebarLine.contains("⏣")) location = sidebarLine; } if (location == null) location = "Unknown"; location = location.replace('⏣', ' ').strip(); @@ -65,9 +65,9 @@ public class Utils { List sidebarLines = getSidebar(); try{ - for (int i = 0; i < sidebarLines.size(); i++) { - if(sidebarLines.get(i).contains("Piggy:")) purseString = sidebarLines.get(i); - if(sidebarLines.get(i).contains("Purse:")) purseString = sidebarLines.get(i); + for (String sidebarLine : sidebarLines) { + if (sidebarLine.contains("Piggy:")) purseString = sidebarLine; + if (sidebarLine.contains("Purse:")) purseString = sidebarLine; } if (purseString != null) purse = Double.parseDouble(purseString.replaceAll("[^0-9.]", "").strip()); else purse = 0; @@ -82,10 +82,12 @@ public class Utils { String bitsString = null; List sidebarLines = getSidebar(); try{ - for (int i = 0; i < sidebarLines.size(); i++) { - if(sidebarLines.get(i).contains("Bits")) bitsString = sidebarLines.get(i); + for (String sidebarLine : sidebarLines) { + if (sidebarLine.contains("Bits")) bitsString = sidebarLine; + } + if (bitsString !=null) { + bits = Integer.parseInt(bitsString.replaceAll("[^0-9.]", "").strip()); } - bits = Integer.parseInt(bitsString.replaceAll("Bits:", "").strip()); } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index cda4bcaf..dbdc3c1a 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -9,6 +9,8 @@ "text.autoconfig.skyblocker.option.general.apiKey": "Hypixel API Key (WIP)", "text.autoconfig.skyblocker.option.general.bars": "Health, Mana, Defence & XP Bars", "text.autoconfig.skyblocker.option.general.bars.enableBars": "Enable Bars", + "text.autoconfig.skyblocker.option.general.quicknav": "Quicknav", + "text.autoconfig.skyblocker.option.general.quicknav.enableQuicknav": "Enable Quicknav", "text.autoconfig.skyblocker.option.general.richPresence": "Discord Rich Presence", "text.autoconfig.skyblocker.option.general.richPresence.info": "Skyblock Info", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 8ef1482d..fa04da47 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -5,7 +5,7 @@ "name": "Skyblocker", "description": "Hypixel Skyblock Mod", "authors": ["xMrVizzy", "d3dx9", "LifeIsAParadox"], - "contributors": ["ExternalTime", "Zailer43", "TacoMonkey"], + "contributors": ["ExternalTime", "Zailer43", "TacoMonkey", "KonaeAkira"], "contact": { "homepage": "https://hysky.de", "sources": "https://github.com/LifeIsAParadox/Skyblocker", -- cgit From fd16a51c49ba9cd7f5d5af8614f92369666c97fe Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Fri, 28 Jan 2022 16:20:50 +0100 Subject: Fix recipe book sometimes being rendered in the wrong position --- .../java/me/xmrvizzy/skyblocker/mixin/RecipeBookWidgetAccessor.java | 2 -- .../java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/RecipeBookWidgetAccessor.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/RecipeBookWidgetAccessor.java index ef8319a0..808b2950 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/RecipeBookWidgetAccessor.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/RecipeBookWidgetAccessor.java @@ -10,7 +10,5 @@ public interface RecipeBookWidgetAccessor { @Accessor String getSearchText(); @Accessor - int getLeftOffset(); - @Accessor TextFieldWidget getSearchField(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java index 7560d43d..5555ee9d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -35,7 +35,7 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select super.initialize(parentWidth, parentHeight, client, narrow, craftingScreenHandler); this.parentWidth = parentWidth; this.parentHeight = parentHeight; - this.leftOffset = ((RecipeBookWidgetAccessor)this).getLeftOffset(); + this.leftOffset = narrow ? 0 : 86; this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField(); int x = (this.parentWidth - 147) / 2 - this.leftOffset; int y = (this.parentHeight - 166) / 2; @@ -51,6 +51,7 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select RenderSystem.setShader(GameRenderer::getPositionTexShader); RenderSystem.setShaderTexture(0, TEXTURE); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField(); int i = (this.parentWidth - 147) / 2 - this.leftOffset; int j = (this.parentHeight - 166) / 2; this.drawTexture(matrices, i, j, 1, 1, 147, 166); -- cgit From 40f754aee847d8da34ff8ac717667a285ee67332 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Fri, 28 Jan 2022 16:25:12 +0100 Subject: Fix item list tooltips being rendered under other elements --- .../me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java | 7 +++++++ .../xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java | 6 ++++++ 2 files changed, 13 insertions(+) (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java index 5555ee9d..0b42ece8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -68,6 +68,13 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select } } + @Override + public void drawTooltip(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { + if (this.isOpen()) { + this.results.drawTooltip(matrices, mouseX, mouseY); + } + } + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (this.isOpen() && !this.client.player.isSpectator()) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java index 59d81f33..a5d5917b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -85,12 +85,18 @@ public class SearchResultsWidget implements Drawable { } if (this.prevPageButton.active) this.prevPageButton.render(matrices, mouseX, mouseY, delta); if (this.nextPageButton.active) this.nextPageButton.render(matrices, mouseX, mouseY, delta); + RenderSystem.enableDepthTest(); + } + + public void drawTooltip(MatrixStack matrices, int mouseX, int mouseY) { + RenderSystem.disableDepthTest(); for (ResultButtonWidget button : resultButtons) if (button.isMouseOver(mouseX, mouseY)) button.renderTooltip(matrices, mouseX, mouseY); RenderSystem.enableDepthTest(); } + public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { for (ResultButtonWidget button : resultButtons) if (button.mouseClicked(mouseX, mouseY, mouseButton)) return true; -- cgit From d81a655b095175396a13dc6d9a2a60cde2f844a0 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Fri, 28 Jan 2022 17:13:58 +0100 Subject: Fix quicknav buttons not updating positions when opening recipe book --- .../skyblocker/mixin/HandledScreenAccessor.java | 17 ++++++++ .../skyblocker/skyblock/quicknav/QuickNav.java | 24 +++++------ .../skyblock/quicknav/QuickNavButton.java | 47 ++++++++++++---------- src/main/resources/skyblocker.mixins.json | 3 +- 4 files changed, 56 insertions(+), 35 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenAccessor.java (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenAccessor.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenAccessor.java new file mode 100644 index 00000000..ea497b75 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenAccessor.java @@ -0,0 +1,17 @@ +package me.xmrvizzy.skyblocker.mixin; + +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(HandledScreen.class) +public interface HandledScreenAccessor { + @Accessor + int getX(); + @Accessor + int getY(); + @Accessor + int getBackgroundWidth(); + @Accessor + int getBackgroundHeight(); +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java index b86e6e32..ced2b783 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java @@ -11,25 +11,23 @@ import java.util.List; public class QuickNav { public static List init(String title, int left_x, int right_x, int top_y, int bottom_y) { List buttons = new ArrayList<>(); + try { + buttons.add(new QuickNavButton(0, title.contains("Your Skills"), "/skills", new ItemStack(Items.DIAMOND_SWORD))); + buttons.add(new QuickNavButton(1, title.contains("Collection"), "/collection", new ItemStack(Items.PAINTING))); - buttons.add(new QuickNavButton(left_x + 29 * 0, top_y, QuickNavButton.Type.TOP, title.contains("Your Skills"), "/skills", new ItemStack(Items.DIAMOND_SWORD))); - buttons.add(new QuickNavButton(left_x + 29 * 1, top_y, QuickNavButton.Type.TOP, title.contains("Collection"), "/collection", new ItemStack(Items.PAINTING))); - - buttons.add(new QuickNavButton(right_x - 29 * 1, bottom_y, QuickNavButton.Type.BOTTOM, title.contains("Craft Item"), "/craft", new ItemStack(Items.CRAFTING_TABLE))); - buttons.add(new QuickNavButton(right_x - 29 * 2, bottom_y, QuickNavButton.Type.BOTTOM, title.contains("Anvil"), "/anvil", new ItemStack(Items.ANVIL))); - buttons.add(new QuickNavButton(right_x - 29 * 3, bottom_y, QuickNavButton.Type.BOTTOM, title.contains("Enchant Item"), "/etable", new ItemStack(Items.ENCHANTING_TABLE))); + buttons.add(new QuickNavButton(3, title.contains("Pets"), "/pets", new ItemStack(Items.BONE))); + buttons.add(new QuickNavButton(4, title.contains("Wardrobe"), "/wardrobe", ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:leather_chestplate\", Count:1, tag:{display:{color:8991416}}}")))); + buttons.add(new QuickNavButton(5, title.contains("Storage"), "/storage", new ItemStack(Items.ENDER_CHEST))); - buttons.add(new QuickNavButton(left_x + 29 * 0, bottom_y, QuickNavButton.Type.BOTTOM, false, "/warp hub", new ItemStack(Items.COMPASS))); - buttons.add(new QuickNavButton(left_x + 29 * 1, bottom_y, QuickNavButton.Type.BOTTOM, false, "/warp dungeon_hub", new ItemStack(Items.WITHER_SKELETON_SKULL))); + buttons.add(new QuickNavButton(6, false, "/warp hub", new ItemStack(Items.COMPASS))); + buttons.add(new QuickNavButton(7, false, "/warp dungeon_hub", new ItemStack(Items.WITHER_SKELETON_SKULL))); - buttons.add(new QuickNavButton(right_x - 29 * 1, top_y, QuickNavButton.Type.TOP, title.contains("Storage"), "/storage", new ItemStack(Items.ENDER_CHEST))); - try { - buttons.add(new QuickNavButton(right_x - 29 * 2, top_y, QuickNavButton.Type.TOP, title.contains("Wardrobe"), "/wardrobe", ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:leather_chestplate\", Count:1, tag:{display:{color:8991416}}}")))); + buttons.add(new QuickNavButton(9, title.contains("Enchant Item"), "/etable", new ItemStack(Items.ENCHANTING_TABLE))); + buttons.add(new QuickNavButton(10, title.contains("Anvil"), "/anvil", new ItemStack(Items.ANVIL))); + buttons.add(new QuickNavButton(11, title.contains("Craft Item"), "/craft", new ItemStack(Items.CRAFTING_TABLE))); } catch (CommandSyntaxException e) { e.printStackTrace(); } - buttons.add(new QuickNavButton(right_x - 29 * 3, top_y, QuickNavButton.Type.TOP, title.contains("Pets"), "/pets", new ItemStack(Items.BONE))); - return buttons; } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java index 8e79b08e..77181332 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -1,9 +1,12 @@ package me.xmrvizzy.skyblocker.skyblock.quicknav; import com.mojang.blaze3d.systems.RenderSystem; +import me.xmrvizzy.skyblocker.mixin.HandledScreenAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; +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; @@ -21,62 +24,64 @@ public class QuickNavButton extends ClickableWidget { } - public enum Type { - TOP, - BOTTOM, - } - - private final Type type; + private int index; private boolean toggled; private int u; private int v; private final String command; private final ItemStack icon; - public QuickNavButton(int x, int y, Type type, boolean toggled, String command, ItemStack icon) { - super(x, y, 28, 32, LiteralText.EMPTY); - this.type = type; - if (type == Type.BOTTOM) { - this.u = 28; - this.v = 64; - } else { - this.u = 28; - this.v = 0; - } + public QuickNavButton(int index, boolean toggled, String command, ItemStack icon) { + super(0, 0, 28, 32, LiteralText.EMPTY); + this.index = index; this.toggled = toggled; - if (toggled) this.v += 32; this.command = command; this.icon = icon; } + private void updateCoordinates() { + Screen screen = MinecraftClient.getInstance().currentScreen; + if (screen instanceof HandledScreen) { + HandledScreen handledScreen = (HandledScreen) screen; + int x = ((HandledScreenAccessor)handledScreen).getX(); + int y = ((HandledScreenAccessor)handledScreen).getY(); + int w = ((HandledScreenAccessor)handledScreen).getBackgroundWidth(); + int h = ((HandledScreenAccessor)handledScreen).getBackgroundHeight(); + this.x = x + this.index % 6 * 28 + 4; + this.y = this.index < 6 ? y - 28 : y + h - 4; + this.u = 28; + this.v = (index < 6 ? 0 : 64) + (toggled ? 32 : 0); + } + } + @Override public void onClick(double mouseX, double mouseY) { if (!this.toggled) { this.toggled = true; - this.v += 32; CLIENT.player.sendChatMessage(command); } } @Override public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { + this.updateCoordinates(); RenderSystem.setShaderTexture(0, BUTTON_TEXTURE); RenderSystem.disableDepthTest(); // render button background if (!this.toggled) { - if (this.type == Type.BOTTOM) + if (this.index >= 6) this.drawTexture(matrices, this.x, this.y + 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); } else this.drawTexture(matrices, this.x, this.y, this.u, this.v, this.width, this.height); // render button icon if (!this.toggled) { - if (this.type == Type.BOTTOM) + if (this.index >= 6) CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6); else CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9); } else { - if (this.type == Type.BOTTOM) + if (this.index >= 6) CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 9); else CLIENT.getItemRenderer().renderInGui(this.icon,this.x + 6, this.y + 6); diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 3bf7625e..f07fbfc8 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -15,7 +15,8 @@ "GenericContainerScreenHandlerMixin", "HandledScreenMixin", "InventoryScreenMixin", - "RecipeBookWidgetAccessor" + "RecipeBookWidgetAccessor", + "HandledScreenAccessor" ], "injectors": { "defaultRequire": 1 -- cgit From 4e8c2829717c6d220d4c0300f0f881ad0d702c6c Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Fri, 28 Jan 2022 17:28:24 +0100 Subject: Change hub and dungeon_hub warp quicknav icons --- .../skyblocker/mixin/HandledScreenMixin.java | 9 ++------ .../skyblocker/skyblock/quicknav/QuickNav.java | 24 ++++++++++++---------- .../skyblock/quicknav/QuickNavButton.java | 1 + 3 files changed, 16 insertions(+), 18 deletions(-) (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 9ae5bf92..7dae036d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -28,13 +28,8 @@ public abstract class HandledScreenMixin extends Screen { private void init(CallbackInfo ci) { // quicknav if (Utils.isSkyblock && SkyblockerConfig.get().general.quicknav.enableQuicknav) { - String title = super.getTitle().getString().trim(); - int left_x = (super.width - this.backgroundWidth) / 2 + 4; - int right_x = (super.width + this.backgroundWidth) / 2 - 3; - int top_y = (super.height - this.backgroundHeight) / 2 - 28; - int bottom_y = (super.height + this.backgroundHeight) / 2 - 4; - if (this.backgroundHeight > 166) --bottom_y; // why is this even a thing - List buttons = QuickNav.init(title, left_x, right_x, top_y, bottom_y); + String screenTitle = super.getTitle().getString().trim(); + List buttons = QuickNav.init(screenTitle); for (QuickNavButton button : buttons) super.addDrawableChild(button); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java index ced2b783..bcc57a00 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java @@ -9,22 +9,24 @@ import java.util.ArrayList; import java.util.List; public class QuickNav { - public static List init(String title, int left_x, int right_x, int top_y, int bottom_y) { + 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 List init(String screenTitle) { List buttons = new ArrayList<>(); try { - buttons.add(new QuickNavButton(0, title.contains("Your Skills"), "/skills", new ItemStack(Items.DIAMOND_SWORD))); - buttons.add(new QuickNavButton(1, title.contains("Collection"), "/collection", new ItemStack(Items.PAINTING))); + buttons.add(new QuickNavButton(0, screenTitle.contains("Your Skills"), "/skills", new ItemStack(Items.DIAMOND_SWORD))); + buttons.add(new QuickNavButton(1, screenTitle.contains("Collection"), "/collection", new ItemStack(Items.PAINTING))); - buttons.add(new QuickNavButton(3, title.contains("Pets"), "/pets", new ItemStack(Items.BONE))); - buttons.add(new QuickNavButton(4, title.contains("Wardrobe"), "/wardrobe", ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:leather_chestplate\", Count:1, tag:{display:{color:8991416}}}")))); - buttons.add(new QuickNavButton(5, title.contains("Storage"), "/storage", new ItemStack(Items.ENDER_CHEST))); + buttons.add(new QuickNavButton(3, screenTitle.contains("Pets"), "/pets", new ItemStack(Items.BONE))); + buttons.add(new QuickNavButton(4, screenTitle.contains("Wardrobe"), "/wardrobe", ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:leather_chestplate\", Count:1, tag:{display:{color:8991416}}}")))); + buttons.add(new QuickNavButton(5, screenTitle.contains("Storage"), "/storage", new ItemStack(Items.ENDER_CHEST))); - buttons.add(new QuickNavButton(6, false, "/warp hub", new ItemStack(Items.COMPASS))); - buttons.add(new QuickNavButton(7, false, "/warp dungeon_hub", new ItemStack(Items.WITHER_SKELETON_SKULL))); + buttons.add(new QuickNavButton(6, false, "/warp hub", ItemStack.fromNbt(StringNbtReader.parse(skyblockHubIconNbt)))); + buttons.add(new QuickNavButton(7, false, "/warp dungeon_hub", ItemStack.fromNbt(StringNbtReader.parse(dungeonHubIconNbt)))); - buttons.add(new QuickNavButton(9, title.contains("Enchant Item"), "/etable", new ItemStack(Items.ENCHANTING_TABLE))); - buttons.add(new QuickNavButton(10, title.contains("Anvil"), "/anvil", new ItemStack(Items.ANVIL))); - buttons.add(new QuickNavButton(11, title.contains("Craft Item"), "/craft", new ItemStack(Items.CRAFTING_TABLE))); + buttons.add(new QuickNavButton(9, screenTitle.contains("Enchant Item"), "/etable", new ItemStack(Items.ENCHANTING_TABLE))); + buttons.add(new QuickNavButton(10, screenTitle.contains("Anvil"), "/anvil", new ItemStack(Items.ANVIL))); + buttons.add(new QuickNavButton(11, screenTitle.contains("Craft Item"), "/craft", new ItemStack(Items.CRAFTING_TABLE))); } catch (CommandSyntaxException e) { e.printStackTrace(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java index 77181332..c31fa653 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -47,6 +47,7 @@ public class QuickNavButton extends ClickableWidget { int y = ((HandledScreenAccessor)handledScreen).getY(); int w = ((HandledScreenAccessor)handledScreen).getBackgroundWidth(); int h = ((HandledScreenAccessor)handledScreen).getBackgroundHeight(); + if (h > 166) --h; // why is this even a thing this.x = x + this.index % 6 * 28 + 4; this.y = this.index < 6 ? y - 28 : y + h - 4; this.u = 28; -- cgit From 49721021064fc691edfb960ced1496232c6f5eb6 Mon Sep 17 00:00:00 2001 From: KonaeAkira Date: Fri, 28 Jan 2022 17:32:54 +0100 Subject: Add item list toggle via config --- .../java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java index c6c892a0..fcdbf706 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java @@ -1,6 +1,8 @@ package me.xmrvizzy.skyblocker.mixin; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemListWidget; +import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import org.spongepowered.asm.mixin.Mixin; @@ -17,6 +19,9 @@ public class InventoryScreenMixin { ) ) RecipeBookWidget constructor() { - return new ItemListWidget(); + if (Utils.isSkyblock && SkyblockerConfig.get().general.itemList.enableItemList) + return new ItemListWidget(); + else + return new RecipeBookWidget(); } } -- cgit