diff options
Diffstat (limited to 'src/main/java/io/github/moulberry/notenoughupdates/miscgui/itemcustomization/ItemCustomizationUtils.java')
| -rw-r--r-- | src/main/java/io/github/moulberry/notenoughupdates/miscgui/itemcustomization/ItemCustomizationUtils.java | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/itemcustomization/ItemCustomizationUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/itemcustomization/ItemCustomizationUtils.java new file mode 100644 index 00000000..9f31fddc --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/itemcustomization/ItemCustomizationUtils.java @@ -0,0 +1,346 @@ +/* + * Copyright (C) 2024 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 <https://www.gnu.org/licenses/>. + */ + +package io.github.moulberry.notenoughupdates.miscgui.itemcustomization; + +import com.google.common.collect.Lists; +import io.github.moulberry.notenoughupdates.core.ChromaColour; +import io.github.moulberry.notenoughupdates.core.GuiElementTextField; +import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +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.opengl.GL11; + +import java.awt.*; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.List; + +import static io.github.moulberry.notenoughupdates.miscgui.GuiEnchantColour.custom_ench_colour; + +public class ItemCustomizationUtils { + + public static List<String> customizeColourGuide = Lists.newArrayList( + EnumChatFormatting.AQUA + "Set a custom name for the item", + EnumChatFormatting.GREEN + "", + EnumChatFormatting.GREEN + "Type \"&&\" for ¶", + EnumChatFormatting.GREEN + "Type \"**\" for ✪", + EnumChatFormatting.GREEN + "Type \"*1-9\" for ➊-➒", + EnumChatFormatting.GREEN + "", + EnumChatFormatting.GREEN + "Available colour codes:", + Utils.chromaString("¶z = Chroma"), + EnumChatFormatting.DARK_BLUE + "¶1 = Dark Blue", + EnumChatFormatting.DARK_GREEN + "¶2 = Dark Green", + EnumChatFormatting.DARK_AQUA + "¶3 = Dark Aqua", + EnumChatFormatting.DARK_RED + "¶4 = Dark Red", + EnumChatFormatting.DARK_PURPLE + "¶5 = Dark Purple", + EnumChatFormatting.GOLD + "¶6 = Gold", + EnumChatFormatting.GRAY + "¶7 = Gray", + EnumChatFormatting.DARK_GRAY + "¶8 = Dark Gray", + EnumChatFormatting.BLUE + "¶9 = Blue", + EnumChatFormatting.GREEN + "¶a = Green", + EnumChatFormatting.AQUA + "¶b = Aqua", + EnumChatFormatting.RED + "¶c = Red", + EnumChatFormatting.LIGHT_PURPLE + "¶d = Purple", + EnumChatFormatting.YELLOW + "¶e = Yellow", + EnumChatFormatting.WHITE + "¶f = White", + "§Z¶Z = SBA Chroma" + EnumChatFormatting.RESET + EnumChatFormatting.GRAY + " (Requires SBA)", + "", + EnumChatFormatting.GREEN + "Available formatting codes:", + EnumChatFormatting.GRAY + "¶k = " + EnumChatFormatting.OBFUSCATED + "Obfuscated", + EnumChatFormatting.GRAY + "¶l = " + EnumChatFormatting.BOLD + "Bold", + EnumChatFormatting.GRAY + "¶m = " + EnumChatFormatting.STRIKETHROUGH + "Strikethrough", + EnumChatFormatting.GRAY + "¶n = " + EnumChatFormatting.UNDERLINE + "Underline", + EnumChatFormatting.GRAY + "¶o = " + EnumChatFormatting.ITALIC + "Italic" + ); + + public static List<String> resetGuide = Lists.newArrayList( + EnumChatFormatting.RED + "" + EnumChatFormatting.BOLD + "This will reset all customisations!!", + EnumChatFormatting.GREEN + "", + EnumChatFormatting.RED + "Only click if you are sure you want to reset everything for this item" + ); + + public static List<String> speedGuide = Lists.newArrayList( + EnumChatFormatting.AQUA + "This is how fast the dyes will cycle, in ticks", + EnumChatFormatting.GRAY + "Hypixel dyes cycle every 2 ticks" + ); + + public static ItemStack copy(ItemStack stack, GuiItemCustomize instance) { + ItemStack customStack = stack.copy(); + if (!instance.textFieldCustomItem.getText().isEmpty()) { + customStack.setItem(ItemCustomizeManager.getCustomItem(stack, instance.textFieldCustomItem.getText().trim())); + customStack.setItemDamage(ItemCustomizeManager.getCustomItemDamage(stack)); + NBTTagCompound tagCompound = customStack.getTagCompound(); + if (tagCompound != null) { + NBTTagCompound customSkull = ItemCustomizeManager.getCustomSkull(customStack); + if (customSkull != null) { + tagCompound.removeTag("SkullOwner"); + tagCompound.setTag("SkullOwner", customSkull); + } + } + } + return customStack; + } + + public static int getGlintColour(GuiItemCustomize instance) { + int col = instance.customGlintColour == null + ? ChromaColour.specialToChromaRGB(ItemCustomizeManager.DEFAULT_GLINT_COLOR) + : ChromaColour.specialToChromaRGB(instance.customGlintColour); + return 0xff000000 | col; + } + + public static int getLeatherColour(GuiItemCustomize instance) { + if (!instance.supportCustomLeatherColour) return 0xff000000; + + String customLeatherColour = instance.customLeatherColour; + int col = customLeatherColour == null + ? ((ItemArmor) instance.customItemStack.getItem()).getColor(instance.customItemStack) + : ChromaColour.specialToChromaRGB(customLeatherColour); + return 0xff000000 | col; + } + + public static int getLeatherColour(String colourString) { + return 0xff000000 | ChromaColour.specialToChromaRGB(colourString); + } + + public static String getChromaStrFromLeatherColour(GuiItemCustomize instance) { + ItemStack customItemStack = instance.customItemStack; + return ChromaColour.special(0, 0xff, ((ItemArmor) customItemStack.getItem()).getColor(customItemStack)); + } + + public static void renderFooter(int xCenter, int yTop, GuiType guiType) { + int xCentreLeft = xCenter - 90; + int xCentreRight = xCenter; + + Gui.drawRect(xCentreLeft, yTop, xCenter + 1, yTop + 17, 0xff101016); + Gui.drawRect(xCentreLeft, yTop, xCenter - 1, yTop + 15, 0xff101016); + Gui.drawRect(xCentreLeft - 1, yTop + 1, xCenter - 2, yTop + 14, 0xff000000 | 0xff00ffc4); + + Utils.renderShadowedString(getButtons(guiType, 0).getDisplay(), + xCentreLeft + 44, + yTop + 4, + xCenter * 2 - xCentreRight + ); + + xCentreLeft += 90; + xCentreRight += 90; + + Gui.drawRect(xCentreLeft, yTop, xCentreRight, yTop + 17, 0x70000000); + Gui.drawRect(xCentreLeft, yTop, xCentreRight, yTop + 15, 0xff101016); + Gui.drawRect(xCentreLeft - 1, yTop + 1, xCentreRight, yTop + 14, 0xff000000 | 0xff00ffc4 * 2); + + Utils.renderShadowedString(getButtons(guiType, 1).getDisplay(), + xCentreLeft + 45, + yTop + 4, + xCenter * 2 - xCentreRight + ); + } + + public static GuiType getButtons(GuiType guiType, int button) { + if (button == 0) { + if (guiType == GuiType.DEFAULT) { + return GuiType.ANIMATED; + } else { + return GuiType.DEFAULT; + } + } + if (button == 1) { + if (guiType == GuiType.HYPIXEL) { + return GuiType.ANIMATED; + } else { + return GuiType.HYPIXEL; + } + } + + return GuiType.DEFAULT; + } + + public static GuiType getButtonClicked(int mouseX, int mouseY, GuiType guiType, float offset) { + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int xCenter = scaledResolution.getScaledWidth() / 2; + int xCentreLeft = xCenter - 90; + int xCentreRight = xCenter; + + for (int i = 0; i < 2; i++) { + if (mouseX >= xCentreLeft && mouseX <= xCentreRight && + mouseY >= offset - 7 && mouseY <= offset + 12) { + return getButtons(guiType, i); + } + xCentreLeft += 90; + xCentreRight += 90; + } + + return null; + } + + public static int getAnimatedDyeColour(String[] dyeColours, int ticks) { + return ChromaColour.specialToChromaRGB( + dyeColours[(Minecraft.getMinecraft().thePlayer.ticksExisted / ticks) % dyeColours.length]); + } + + static final ResourceLocation RESET = new ResourceLocation("notenoughupdates:itemcustomize/reset.png"); + static final ResourceLocation CROSS = new ResourceLocation("notenoughupdates:itemcustomize/cross.png"); + + public static void renderColourBlob(int xCenter, int yTop, int colour, String text, boolean renderReset, + boolean renderCross) { + 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 | colour); + + Utils.renderShadowedString(text, xCenter, yTop + 4, 180); + + if (renderReset) { + Minecraft.getMinecraft().getTextureManager().bindTexture(RESET); + GlStateManager.color(1, 1, 1, 1); + RenderUtils.drawTexturedRect(xCenter + 90 - 12, yTop + 2, 10, 11, GL11.GL_NEAREST); + } + + if (renderCross) { + Minecraft.getMinecraft().getTextureManager().bindTexture(CROSS); + GlStateManager.color(1, 1, 1, 1); + RenderUtils.drawTexturedRect(xCenter + 90 - 12, yTop + 3, 9, 9, GL11.GL_NEAREST); + } + } + + public static void renderTextBox( + GuiElementTextField textField, String text, int xOffset, int yOffset, int maxTextSize + ) { + if (!textField.getFocus() && textField.getText().isEmpty()) { + textField.setOptions(GuiElementTextField.SCISSOR_TEXT); + textField.setPrependText(text); + } else { + textField.setOptions(GuiElementTextField.COLOUR | GuiElementTextField.SCISSOR_TEXT); + textField.setPrependText(""); + } + + if (!textField.getFocus()) { + textField.setSize(maxTextSize, 20); + } else { + int textSize = Minecraft.getMinecraft().fontRendererObj.getStringWidth(textField.getTextDisplay()) + 10; + textField.setSize(Math.max(textSize, maxTextSize), 20); + } + + textField.render(xOffset, yOffset); + } + + public static Color getColourFromHex(String hex) { + Color color = null; + try { + int decode = Integer.decode(hex); + color = new Color(decode); + } catch (NumberFormatException | NullPointerException e) { + } + return color; + } + + public static int rgbToInt(Color color) { + return (color.getRed() << 16) | (color.getGreen() << 8) | color.getBlue(); + } + + public static void renderPresetButtons(int x, int y, boolean valid, boolean secondValid, String preset) { + Minecraft.getMinecraft().getTextureManager().bindTexture(custom_ench_colour); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect( + x - 88 + 198, + y + 2, + 88, + 20, + 64 / 217f, + 152 / 217f, + 48 / 78f, + 68 / 78f, + GL11.GL_NEAREST + ); + Utils.drawTexturedRect( + x - 88 + 198, + y + 2 + 24, + 88, + 20, + 64 / 217f, + 152 / 217f, + 48 / 78f, + 68 / 78f, + GL11.GL_NEAREST + ); + + Utils.drawStringCenteredScaledMaxWidth("Load " + preset, x - 44 + 198, y + 8, false, 86, 4210752); + Utils.drawStringCenteredScaledMaxWidth("from Clipboard", x - 44 + 198, y + 16, false, 86, 4210752); + Utils.drawStringCenteredScaledMaxWidth("Save " + preset, x - 44 + 198, y + 8 + 24, false, 86, 4210752); + Utils.drawStringCenteredScaledMaxWidth("to Clipboard", x - 44 + 198, y + 16 + 24, false, 86, 4210752); + + if (!valid) { + Gui.drawRect(x - 88 + 198, y + 2, x + 198, y + 2 + 20, 0x80000000); + } + if (!secondValid) { + Gui.drawRect(x - 88 + 198, y + 2 + 24, x + 198, y + 2 + 20 + 24, 0x80000000); + } + + GlStateManager.color(1, 1, 1, 1); + } + + public static boolean validShareContents(String sharePrefix) { + String base64 = Utils.getClipboard(); + if (base64 == null) return false; + + if (base64.length() <= sharePrefix.length()) return false; + + base64 = base64.trim(); + + try { + return new String(Base64.getDecoder().decode(base64)).startsWith(sharePrefix); + } catch (IllegalArgumentException e) { + return false; + } + } + + public static void shareContents(String sharePrefix, String jsonObject) { + String base64String = Base64.getEncoder().encodeToString((sharePrefix + + jsonObject).getBytes(StandardCharsets.UTF_8)); + Utils.copyToClipboard(base64String); + } + + public static String getShareFromClipboard(String sharePrefix) { + + String base64 = Utils.getClipboard(); + if (base64 == null) return null; + + if (base64.length() <= sharePrefix.length()) return null; + + base64 = base64.trim(); + + String jsonString; + try { + jsonString = new String(Base64.getDecoder().decode(base64)); + if (!jsonString.startsWith(sharePrefix)) return null; + jsonString = jsonString.substring(sharePrefix.length()); + } catch (IllegalArgumentException e) { + return null; + } + + return jsonString; + } +} |
