diff options
author | KonaeAkira <longtruong2411@gmail.com> | 2022-01-28 15:53:12 +0100 |
---|---|---|
committer | KonaeAkira <longtruong2411@gmail.com> | 2022-01-28 15:53:12 +0100 |
commit | 1b1d968d3d4248d9b7b943ab46656b3cc0a6e0c9 (patch) | |
tree | 48b5661a06efeb5d1f6b0433b6275459a4e51928 /src | |
parent | a3b5cad38376be3da5674480ec60f4610b321671 (diff) | |
download | Skyblocker-1b1d968d3d4248d9b7b943ab46656b3cc0a6e0c9.tar.gz Skyblocker-1b1d968d3d4248d9b7b943ab46656b3cc0a6e0c9.tar.bz2 Skyblocker-1b1d968d3d4248d9b7b943ab46656b3cc0a6e0c9.zip |
Made item list use the vanilla recipe book
Diffstat (limited to 'src')
8 files changed, 253 insertions, 216 deletions
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<Entry> 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<Element> children = Lists.newArrayList(); - private final List<Selectable> selectables = Lists.newArrayList(); - private final List<Drawable> 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 extends Element & Drawable & Selectable> T addDrawableChild(T drawableElement) { - this.drawables.add(drawableElement); - return this.addSelectableChild(drawableElement); - } + public ItemListWidget() { super(); } - protected <T extends Drawable> T addDrawable(T drawable) { - this.drawables.add(drawable); - return drawable; + public void updateSearchResult() { + this.results.updateSearchResult(((RecipeBookWidgetAccessor)this).getSearchText()); } - protected <T extends Element & Selectable> 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<Text> 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<? extends Element> 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<Text> 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<Entry> searchResults = new ArrayList<>(); + private String searchText = null; + private List<ResultButtonWidget> 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 |