/* * Copyright (C) 2022 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with NotEnoughUpdates. If not, see . */ package io.github.moulberry.notenoughupdates.miscgui; import com.google.common.collect.Lists; import io.github.moulberry.notenoughupdates.core.ChromaColour; import io.github.moulberry.notenoughupdates.core.GlScissorStack; import io.github.moulberry.notenoughupdates.core.GuiElement; import io.github.moulberry.notenoughupdates.core.GuiElementBoolean; import io.github.moulberry.notenoughupdates.core.GuiElementColour; import io.github.moulberry.notenoughupdates.core.GuiElementTextField; import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingFloat; import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; import io.github.moulberry.notenoughupdates.miscfeatures.ItemCustomizeManager; import io.github.moulberry.notenoughupdates.util.GuiTextures; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.model.IBakedModel; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import java.io.IOException; import java.util.List; public class GuiItemCustomize extends GuiScreen { private static final ResourceLocation RESET = new ResourceLocation("notenoughupdates:itemcustomize/reset.png"); private final ItemStack stack; private final String itemUUID; private final GuiElementTextField textFieldRename = new GuiElementTextField("", 158, 20, GuiElementTextField.COLOUR); private final GuiElementBoolean enchantGlintButton; private int renderHeight = 0; private final LerpingFloat enchantGlintCustomColourAnimation = new LerpingFloat(0, 200); private boolean enchantGlint; private String customGlintColour = null; private String customLeatherColour = null; private final boolean supportCustomLeatherColour; private GuiElement editor = null; public GuiItemCustomize(ItemStack stack, String itemUUID) { this.stack = stack; this.itemUUID = itemUUID; IBakedModel model = Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getItemModel(stack); boolean stackHasEffect = stack.hasEffect() && !model.isBuiltInRenderer(); ItemCustomizeManager.ItemData data = ItemCustomizeManager.getDataForItem(stack); if (data != null) { this.enchantGlint = data.overrideEnchantGlint ? data.enchantGlintValue : stackHasEffect; if (data.customName != null) { textFieldRename.setText(data.customName); } this.customGlintColour = data.customGlintColour; this.customLeatherColour = data.customLeatherColour; } else { this.enchantGlint = stackHasEffect; } supportCustomLeatherColour = stack.getItem() instanceof ItemArmor && ((ItemArmor) stack.getItem()).getArmorMaterial() == ItemArmor.ArmorMaterial.LEATHER; enchantGlintCustomColourAnimation.setValue(enchantGlint ? 17 : 0); this.enchantGlintButton = new GuiElementBoolean(0, 0, enchantGlint, (bool) -> { enchantGlint = bool; updateData(); }); } @Override public void onGuiClosed() { updateData(); } public String getChromaStrFromLeatherColour() { return ChromaColour.special(0, 0xff, ((ItemArmor) stack.getItem()).getColor(stack)); } public void updateData() { ItemCustomizeManager.ItemData data = new ItemCustomizeManager.ItemData(); IBakedModel model = Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getItemModel(stack); boolean stackHasEffect = stack.hasEffect() && !model.isBuiltInRenderer(); if (this.enchantGlint != stackHasEffect) { data.overrideEnchantGlint = true; data.enchantGlintValue = this.enchantGlint; } if (this.customGlintColour != null && !this.customGlintColour.equals(ItemCustomizeManager.DEFAULT_GLINT_COLOR)) { data.customGlintColour = this.customGlintColour; } else if (model.isBuiltInRenderer() && data.overrideEnchantGlint && data.enchantGlintValue) { data.customGlintColour = ItemCustomizeManager.DEFAULT_GLINT_COLOR; } else { data.customGlintColour = null; } if (supportCustomLeatherColour && this.customLeatherColour != null && !this.customLeatherColour.equals( getChromaStrFromLeatherColour())) { data.customLeatherColour = this.customLeatherColour; } else { data.customLeatherColour = null; } if (!this.textFieldRename.getText().isEmpty()) { data.customName = this.textFieldRename.getText(); NBTTagCompound stackTagCompound = stack.getTagCompound(); if (stackTagCompound != null && stackTagCompound.hasKey("display", 10)) { NBTTagCompound nbttagcompound = stackTagCompound.getCompoundTag("display"); if (nbttagcompound.hasKey("Name", 8)) { String name = nbttagcompound.getString("Name"); char[] chars = name.toCharArray(); int i; for (i = 0; i < chars.length; i += 2) { if (chars[i] != '\u00a7') { break; } } data.customNamePrefix = name.substring(0, i); } } } ItemCustomizeManager.putItemData(itemUUID, data); } private int getGlintColour() { int col = customGlintColour == null ? ChromaColour.specialToChromaRGB(ItemCustomizeManager.DEFAULT_GLINT_COLOR) : ChromaColour.specialToChromaRGB(customGlintColour); return 0xff000000 | col; } private int getLeatherColour() { if (!supportCustomLeatherColour) return 0xff000000; int col = customLeatherColour == null ? ((ItemArmor) stack.getItem()).getColor(stack) : ChromaColour.specialToChromaRGB( customLeatherColour); return 0xff000000 | col; } @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { drawDefaultBackground(); List tooltipToDisplay = null; ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); int xCenter = scaledResolution.getScaledWidth() / 2; int yTopStart = (scaledResolution.getScaledHeight() - renderHeight) / 2; int yTop = yTopStart; RenderUtils.drawFloatingRectDark(xCenter - 100, yTop - 9, 200, renderHeight + 11); RenderUtils.drawFloatingRectDark(xCenter - 90, yTop - 5, 180, 14); Utils.renderShadowedString("\u00a75\u00a7lNEU Item Customizer", xCenter, yTop - 1, 180); yTop += 14; if (!textFieldRename.getFocus() && textFieldRename.getText().isEmpty()) { textFieldRename.setOptions(GuiElementTextField.SCISSOR_TEXT); textFieldRename.setPrependText("\u00a77Enter Custom Name..."); } else { textFieldRename.setOptions(GuiElementTextField.COLOUR | GuiElementTextField.SCISSOR_TEXT); textFieldRename.setPrependText(""); } if (!textFieldRename.getFocus()) { textFieldRename.setSize(158, 20); } else { int textSize = fontRendererObj.getStringWidth(textFieldRename.getTextDisplay()) + 10; textFieldRename.setSize(Math.max(textSize, 158), 20); } textFieldRename.render(xCenter - textFieldRename.getWidth() / 2 - 10, yTop); Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.help); GlStateManager.color(1, 1, 1, 1); int helpX = xCenter + textFieldRename.getWidth() / 2 - 5; Utils.drawTexturedRect(helpX, yTop, 20, 20, GL11.GL_LINEAR); if (mouseX >= helpX && mouseX <= helpX + 20 && mouseY >= yTop && mouseY <= yTop + 20) { tooltipToDisplay = Lists.newArrayList( EnumChatFormatting.AQUA + "Set a custom name for the item", EnumChatFormatting.GREEN + "", EnumChatFormatting.GREEN + "Type \"&&\" to use colour codes", EnumChatFormatting.GREEN + "Type \"**\" for \u272A", EnumChatFormatting.GREEN + "Type \"*1-9\" for \u278A-\u2792", EnumChatFormatting.GREEN + "", EnumChatFormatting.GREEN + "Available colour codes:", Utils.chromaString("\u00B6z = Chroma"), EnumChatFormatting.DARK_BLUE + "\u00B61 = Dark Blue", EnumChatFormatting.DARK_GREEN + "\u00B62 = Dark Green", EnumChatFormatting.DARK_AQUA + "\u00B63 = Dark Aqua", EnumChatFormatting.DARK_RED + "\u00B64 = Dark Red", EnumChatFormatting.DARK_PURPLE + "\u00B65 = Dark Purple", EnumChatFormatting.GOLD + "\u00B66 = Gold", EnumChatFormatting.GRAY + "\u00B67 = Gray", EnumChatFormatting.DARK_GRAY + "\u00B68 = Dark Gray", EnumChatFormatting.BLUE + "\u00B69 = Blue", EnumChatFormatting.GREEN + "\u00B6a = Green", EnumChatFormatting.AQUA + "\u00B6b = Aqua", EnumChatFormatting.RED + "\u00B6c = Red", EnumChatFormatting.LIGHT_PURPLE + "\u00B6d = Purple", EnumChatFormatting.YELLOW + "\u00B6e = Yellow", EnumChatFormatting.WHITE + "\u00B6f = White", "\u00A7Z\u00B6Z = SBA Chroma" + EnumChatFormatting.RESET + EnumChatFormatting.GRAY + " (Requires SBA)", "", EnumChatFormatting.GREEN + "Available formatting codes:", EnumChatFormatting.GRAY + "\u00B6k = " + EnumChatFormatting.OBFUSCATED + "Obfuscated", EnumChatFormatting.GRAY + "\u00B6l = " + EnumChatFormatting.BOLD + "Bold", EnumChatFormatting.GRAY + "\u00B6m = " + EnumChatFormatting.STRIKETHROUGH + "Strikethrough", EnumChatFormatting.GRAY + "\u00B6n = " + EnumChatFormatting.UNDERLINE + "Underline", EnumChatFormatting.GRAY + "\u00B6o = " + EnumChatFormatting.ITALIC + "Italic" ); } yTop += 25; RenderUtils.drawFloatingRectDark(xCenter - 90, yTop, 180, 110); GlStateManager.enableDepth(); GlStateManager.pushMatrix(); GlStateManager.translate(xCenter - 48, yTop + 7, 0); GlStateManager.scale(6, 6, 1); Utils.drawItemStack(stack, 0, 0); GlStateManager.popMatrix(); yTop += 115; RenderUtils.drawFloatingRectDark(xCenter - 90, yTop, 180, 20); Minecraft.getMinecraft().fontRendererObj.drawString("Enchant Glint", xCenter - 85, yTop + 6, 0xff8040cc ); enchantGlintButton.x = xCenter + 90 - 5 - 48; enchantGlintButton.y = yTop + 3; enchantGlintButton.render(); yTop += 25; enchantGlintCustomColourAnimation.tick(); if (enchantGlintCustomColourAnimation.getValue() > 0) { yTop -= 5; int glintColour = getGlintColour(); GlScissorStack.push( 0, yTop, scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), scaledResolution ); GlStateManager.translate(0, enchantGlintCustomColourAnimation.getValue() - 17, 0); Gui.drawRect(xCenter - 90, yTop, xCenter + 92, yTop + 17, 0x70000000); Gui.drawRect(xCenter - 90, yTop, xCenter + 90, yTop + 15, 0xff101016); Gui.drawRect(xCenter - 89, yTop + 1, xCenter + 89, yTop + 14, 0xff000000 | glintColour); Utils.renderShadowedString("\u00a7a\u00a7lCustom Glint Colour", xCenter, yTop + 4, 180); Minecraft.getMinecraft().getTextureManager().bindTexture(RESET); GlStateManager.color(1, 1, 1, 1); RenderUtils.drawTexturedRect(xCenter + 90 - 12, yTop + 2, 10, 11, GL11.GL_NEAREST); GlStateManager.translate(0, -enchantGlintCustomColourAnimation.getValue() + 17, 0); GlScissorStack.pop(scaledResolution); yTop += enchantGlintCustomColourAnimation.getValue() + 3; } if (supportCustomLeatherColour) { int leatherColour = getLeatherColour(); Gui.drawRect(xCenter - 90, yTop, xCenter + 92, yTop + 17, 0x70000000); Gui.drawRect(xCenter - 90, yTop, xCenter + 90, yTop + 15, 0xff101016); Gui.drawRect(xCenter - 89, yTop + 1, xCenter + 89, yTop + 14, 0xff000000 | leatherColour); Utils.renderShadowedString("\u00a7b\u00a7lCustom Leather Colour", xCenter, yTop + 4, 180); Minecraft.getMinecraft().getTextureManager().bindTexture(RESET); GlStateManager.color(1, 1, 1, 1); RenderUtils.drawTexturedRect(xCenter + 90 - 12, yTop + 2, 10, 11, GL11.GL_NEAREST); yTop += 20; } /*if(true) { yTop += 20; String titleStr = "\u00a76\u00a7lWant other players to see your customized item?"; String buttonStr = "\u00a76Purchase Item Customize Tag"; if(true) { buttonStr = "\u00a76Use item customize tag (3 remaining)"; } int w = Minecraft.getMinecraft().fontRendererObj.getStringWidth(titleStr)+8; if(w > scaledResolution.getScaledWidth()/2) w= scaledResolution.getScaledWidth()/2; RenderUtils.drawFloatingRectDark(xCenter-w/2, yTop, w, 50); Utils.renderShadowedString(titleStr, xCenter, yTop+8, scaledResolution.getScaledWidth()/2); int ctw = Minecraft.getMinecraft().fontRendererObj.getStringWidth(buttonStr)+8; RenderUtils.drawFloatingRectDark(xCenter-ctw/2, yTop+25, ctw, 15); Utils.renderShadowedString(buttonStr, xCenter, yTop+28, w); }*/ renderHeight = yTop - yTopStart; if (editor != null) { editor.render(); } if (tooltipToDisplay != null) { Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fontRendererObj); } super.drawScreen(mouseX, mouseY, partialTicks); } @Override public void updateScreen() { if (enchantGlint) { if (enchantGlintCustomColourAnimation.getTarget() != 17) { enchantGlintCustomColourAnimation.setTarget(17); enchantGlintCustomColourAnimation.resetTimer(); } } else { if (enchantGlintCustomColourAnimation.getTarget() != 0) { enchantGlintCustomColourAnimation.setTarget(0); enchantGlintCustomColourAnimation.resetTimer(); } } super.updateScreen(); } @Override protected void keyTyped(char typedChar, int keyCode) throws IOException { if (textFieldRename.getFocus()) { if (keyCode == Keyboard.KEY_ESCAPE) { textFieldRename.setFocus(false); return; } else { textFieldRename.keyTyped(typedChar, keyCode); } } super.keyTyped(typedChar, keyCode); } @Override public void handleKeyboardInput() throws IOException { if (editor == null || !editor.keyboardInput()) { if (editor != null && Keyboard.getEventKeyState() && Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { editor = null; } else { super.handleKeyboardInput(); } } } @Override public void handleMouseInput() throws IOException { int mouseX = Mouse.getEventX() * this.width / this.mc.displayWidth; int mouseY = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; if (editor == null || !editor.mouseInput(mouseX, mouseY)) { super.handleMouseInput(); enchantGlintButton.mouseInput(mouseX, mouseY); } } @Override protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { textFieldRename.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); } @Override protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); int xCenter = scaledResolution.getScaledWidth() / 2; int yTop = (scaledResolution.getScaledHeight() - renderHeight) / 2; if (mouseX >= xCenter - textFieldRename.getWidth() / 2 - 10 && mouseX <= xCenter + textFieldRename.getWidth() / 2 - 10 && mouseY >= yTop + 14 && mouseY <= yTop + 14 + textFieldRename.getHeight()) { textFieldRename.mouseClicked(mouseX, mouseY, mouseButton); } else { textFieldRename.unfocus(); } if (enchantGlint && mouseX >= xCenter - 90 && mouseX <= xCenter + 90 && mouseY >= yTop + 174 && mouseY <= yTop + 174 + enchantGlintCustomColourAnimation.getValue()) { if (mouseX >= xCenter + 90 - 12) { editor = null; customGlintColour = ItemCustomizeManager.DEFAULT_GLINT_COLOR; updateData(); } else { editor = new GuiElementColour( mouseX, mouseY, customGlintColour == null ? ItemCustomizeManager.DEFAULT_GLINT_COLOR : customGlintColour, (colour) -> { customGlintColour = colour; updateData(); }, () -> editor = null ); } } float belowEnchGlint = yTop + 174 + enchantGlintCustomColourAnimation.getValue() + 5; if (supportCustomLeatherColour && mouseX >= xCenter - 90 && mouseX <= xCenter + 90 && mouseY >= belowEnchGlint && mouseY <= belowEnchGlint + 15) { if (mouseX >= xCenter + 90 - 12) { editor = null; customLeatherColour = null; updateData(); } else { editor = new GuiElementColour(mouseX, mouseY, customLeatherColour == null ? getChromaStrFromLeatherColour() : customLeatherColour, (colour) -> { customLeatherColour = colour; updateData(); }, () -> editor = null, false, true ); } } /*if(mouseX >= xCenter-90 && mouseX <= xCenter+90 && mouseY >= belowEnchGlint+65 && mouseY <= belowEnchGlint+80) { if(true) { String userName = Minecraft.getMinecraft().thePlayer.getName(); String serverId = "1872398172739"; try { Desktop.getDesktop().browse(new URL("https://moulberry.codes/purchaseitemtag?uniqueId="+serverId+"&username="+userName).toURI()); } catch(Exception ignored) {} } else { } }*/ super.mouseClicked(mouseX, mouseY, mouseButton); } }