diff --git a/src/main/java/nl/requios/effortlessbuilding/create/AllKeys.java b/src/main/java/nl/requios/effortlessbuilding/create/AllKeys.java index 80c6b91..5969d26 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/AllKeys.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/AllKeys.java @@ -1,6 +1,9 @@ package nl.requios.effortlessbuilding.create; +import org.lwjgl.glfw.GLFW; + import com.mojang.blaze3d.platform.InputConstants; + import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -8,10 +11,59 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import org.lwjgl.glfw.GLFW; +//@EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) public class AllKeys { +// TOOL_MENU("toolmenu", GLFW.GLFW_KEY_LEFT_ALT), +// ACTIVATE_TOOL("", GLFW.GLFW_KEY_LEFT_CONTROL), +// TOOLBELT("toolbelt", GLFW.GLFW_KEY_LEFT_ALT), +// +// ; +// +// private KeyMapping keybind; +// private String description; +// private int key; +// private boolean modifiable; +// +// private AllKeys(String description, int defaultKey) { +// this.description = Create.ID + ".keyinfo." + description; +// this.key = defaultKey; +// this.modifiable = !description.isEmpty(); +// } +// +// @SubscribeEvent +// public static void register(RegisterKeyMappingsEvent event) { +// for (AllKeys key : values()) { +// key.keybind = new KeyMapping(key.description, key.key, Create.NAME); +// if (!key.modifiable) +// continue; +// +// event.register(key.keybind); +// } +// } +// +// public KeyMapping getKeybind() { +// return keybind; +// } +// +// public boolean isPressed() { +// if (!modifiable) +// return isKeyDown(key); +// return keybind.isDown(); +// } +// +// public String getBoundKey() { +// return keybind.getTranslatedKeyMessage() +// .getString() +// .toUpperCase(); +// } +// +// public int getBoundCode() { +// return keybind.getKey() +// .getValue(); +// } + public static boolean isKeyDown(int key) { return InputConstants.isKeyDown(Minecraft.getInstance() .getWindow() diff --git a/src/main/java/nl/requios/effortlessbuilding/create/AllSpecialTextures.java b/src/main/java/nl/requios/effortlessbuilding/create/AllSpecialTextures.java index 0808f30..2343b91 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/AllSpecialTextures.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/AllSpecialTextures.java @@ -1,6 +1,7 @@ package nl.requios.effortlessbuilding.create; import com.mojang.blaze3d.systems.RenderSystem; + import net.minecraft.resources.ResourceLocation; public enum AllSpecialTextures { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ClientResourceReloadListener.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/ClientResourceReloadListener.java index f3ec8d0..b7b0cea 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ClientResourceReloadListener.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/ClientResourceReloadListener.java @@ -1,6 +1,9 @@ package nl.requios.effortlessbuilding.create.foundation; +import nl.requios.effortlessbuilding.create.CreateClient; +import nl.requios.effortlessbuilding.create.foundation.sound.SoundScapes; import nl.requios.effortlessbuilding.create.foundation.utility.LangNumberFormat; + import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; @@ -8,7 +11,7 @@ public class ClientResourceReloadListener implements ResourceManagerReloadListen @Override public void onResourceManagerReload(ResourceManager resourceManager) { -// CreateClient.invalidateRenderers(); + CreateClient.invalidateRenderers(); // SoundScapes.invalidateAll(); LangNumberFormat.numberFormat.update(); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java index e3715db..38c8185 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java @@ -1,16 +1,16 @@ package nl.requios.effortlessbuilding.create.foundation; +import java.nio.file.Path; + import net.minecraftforge.forgespi.locating.IModFile; import net.minecraftforge.resource.PathPackResources; -import java.nio.file.Path; - public class ModFilePackResources extends PathPackResources { protected final IModFile modFile; protected final String sourcePath; public ModFilePackResources(String name, IModFile modFile, String sourcePath) { - super(name, modFile.findResource(sourcePath)); + super(name, true, modFile.findResource(sourcePath)); this.modFile = modFile; this.sourcePath = sourcePath; } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AbstractSimiScreen.java index 74b4fce..23448a5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AbstractSimiScreen.java @@ -1,10 +1,16 @@ package nl.requios.effortlessbuilding.create.foundation.gui; +import java.util.Collection; +import java.util.List; + import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget; import nl.requios.effortlessbuilding.create.foundation.utility.Components; + +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; @@ -12,10 +18,6 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import nl.requios.effortlessbuilding.gui.buildmodifier.ModifiersScreenList; - -import java.util.Collection; -import java.util.List; @OnlyIn(Dist.CLIENT) public abstract class AbstractSimiScreen extends Screen { @@ -65,6 +67,13 @@ public abstract class AbstractSimiScreen extends Screen { } } + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + if (getFocused() != null && !getFocused().isMouseOver(pMouseX, pMouseY)) + setFocused(null); + return super.mouseClicked(pMouseX, pMouseY, pButton); + } + @Override public boolean isPauseScreen() { return false; @@ -96,17 +105,18 @@ public abstract class AbstractSimiScreen extends Screen { } @Override - public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { partialTicks = minecraft.getFrameTime(); - + PoseStack ms = graphics.pose(); + ms.pushPose(); prepareFrame(); - renderWindowBackground(ms, mouseX, mouseY, partialTicks); - renderWindow(ms, mouseX, mouseY, partialTicks); - super.render(ms, mouseX, mouseY, partialTicks); - renderWindowForeground(ms, mouseX, mouseY, partialTicks); + renderWindowBackground(graphics, mouseX, mouseY, partialTicks); + renderWindow(graphics, mouseX, mouseY, partialTicks); + super.render(graphics, mouseX, mouseY, partialTicks); + renderWindowForeground(graphics, mouseX, mouseY, partialTicks); endFrame(); @@ -116,7 +126,7 @@ public abstract class AbstractSimiScreen extends Screen { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { boolean keyPressed = super.keyPressed(keyCode, scanCode, modifiers); - if (keyPressed || getFocused() != null) + if (keyPressed || getFocused() instanceof EditBox) return keyPressed; InputConstants.Key mouseKey = InputConstants.getKey(keyCode, scanCode); @@ -130,37 +140,31 @@ public abstract class AbstractSimiScreen extends Screen { protected void prepareFrame() {} - protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - renderBackground(ms); + protected void renderWindowBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + renderBackground(graphics); } - protected abstract void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks); + protected abstract void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks); - protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + protected void renderWindowForeground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { for (Renderable widget : renderables) { - if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isHoveredOrFocused() + if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isMouseOver(mouseX, mouseY) && simiWidget.visible) { List tooltip = simiWidget.getToolTip(); if (tooltip.isEmpty()) continue; - int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.x; - int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.y; - renderComponentTooltip(ms, tooltip, ttx, tty); - } - - //Added - if (widget instanceof ModifiersScreenList list) { - list.renderWindowForeground(ms, mouseX, mouseY, partialTicks); + int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX(); + int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY(); + graphics.renderComponentTooltip(font, tooltip, ttx, tty); } } - } protected void endFrame() {} @Deprecated - protected void debugWindowArea(PoseStack matrixStack) { - fill(matrixStack, guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3); + protected void debugWindowArea(GuiGraphics graphics) { + graphics.fill(guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllGuiTextures.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllGuiTextures.java index ca1c214..88286c7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllGuiTextures.java @@ -1,18 +1,165 @@ package nl.requios.effortlessbuilding.create.foundation.gui; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import net.minecraft.client.gui.GuiComponent; + +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public enum AllGuiTextures implements ScreenElement { - // Renderables + // Inventories +// PLAYER_INVENTORY("player_inventory", 176, 108), +// WAND_OF_SYMMETRY("curiosities", 0, 131, 188, 101), +// BLOCKZAPPER("curiosities", 0, 99, 214, 97), +// TERRAINZAPPER("curiosities", 234, 103), +// TERRAINZAPPER_INACTIVE_PARAM("curiosities", 238, 0, 18, 18), +// +// LOGO("logo", 256, 256), +// CURSEFORGE_LOGO("platform_icons/curseforge", 256, 256), +// MODRINTH_LOGO("platform_icons/modrinth", 256, 256), +// +// SCHEMATIC("schematics", 192, 121), +// SCHEMATIC_SLOT("widgets", 54, 0, 16, 16), +// SCHEMATIC_PROMPT("schematics_2", 213, 77), +// HUD_BACKGROUND("overlay", 0, 0, 16, 16), +// +// SCHEMATIC_TABLE("schematics", 0, 121, 214, 83), +// SCHEMATIC_TABLE_PROGRESS("schematics", 0, 204, 84, 16), +// +// SCHEMATICANNON_TOP("schematics_2", 0, 77, 213, 42), +// SCHEMATICANNON_BOTTOM("schematics_2", 0, 119, 213, 99), +// SCHEMATICANNON_PROGRESS("schematics_2", 76, 239, 114, 16), +// SCHEMATICANNON_CHECKLIST_PROGRESS("schematics_2", 191, 240, 16, 14), +// SCHEMATICANNON_HIGHLIGHT("schematics_2", 1, 229, 26, 26), +// SCHEMATICANNON_FUEL("schematics_2", 28, 222, 47, 16), +// SCHEMATICANNON_FUEL_CREATIVE("schematics_2", 28, 239, 47, 16), +// +// STOCKSWITCH("logistics", 182, 95), +// STOCKSWITCH_ARROW_UP("logistics", 191, 0, 7, 24), +// STOCKSWITCH_ARROW_DOWN("logistics", 198, 0, 7, 24), +// STOCKSWITCH_CURSOR("logistics", 206, 0, 7, 16), +// STOCKSWITCH_INTERVAL("logistics", 0, 95, 100, 18), +// STOCKSWITCH_UNPOWERED_LANE("logistics", 37, 20, 100, 18), +// STOCKSWITCH_POWERED_LANE("logistics", 37, 42, 100, 18), +// +// FILTER("filters", 214, 99), +// ATTRIBUTE_FILTER("filters", 0, 99, 241, 85), +// +// TOOLBOX("toolbox", 188, 171), +// TOOLBELT_SLOT("minecraft", "widgets", 24, 23, 22, 22), +// TOOLBELT_SLOT_HIGHLIGHT("minecraft", "widgets", 0, 22, 24, 24), +// TOOLBELT_MAIN_SLOT("widgets", 0, 97, 24, 24), +// TOOLBELT_EMPTY_SLOT("widgets", 27, 98, 22, 22), +// TOOLBELT_INACTIVE_SLOT("widgets", 52, 98, 22, 22), +// +// TOOLBELT_HOTBAR_OFF("widgets", 0, 130, 20, 24), +// TOOLBELT_HOTBAR_ON("widgets", 20, 130, 20, 24), +// TOOLBELT_SELECTED_OFF("widgets", 0, 155, 22, 22), +// TOOLBELT_SELECTED_ON("widgets", 22, 155, 22, 22), +// +// SEQUENCER("sequencer", 173, 161), +// SEQUENCER_INSTRUCTION("sequencer", 0, 16, 162, 22), +// SEQUENCER_DELAY("sequencer", 0, 60, 162, 22), +// SEQUENCER_END("sequencer", 0, 82, 162, 22), +// SEQUENCER_EMPTY("sequencer", 0, 104, 162, 22), +// SEQUENCER_AWAIT("sequencer", 0, 162, 162, 22), +// +// LINKED_CONTROLLER("curiosities_2", 179, 109), +// BLUEPRINT("curiosities_2", 0, 109, 179, 109), +// +// CLIPBOARD("clipboard", 0, 0, 256, 256), +// +// DATA_GATHERER("display_link", 235, 162), +// DATA_AREA_START("display_link", 0, 163, 2, 18), +// DATA_AREA_SPEECH("display_link", 8, 163, 5, 18), +// DATA_AREA("display_link", 3, 163, 1, 18), +// DATA_AREA_END("display_link", 5, 163, 2, 18), +// +// SCHEDULE("schedule", 256, 226), +// SCHEDULE_CARD_DARK("schedule", 5, 233, 1, 1), +// SCHEDULE_CARD_MEDIUM("schedule", 6, 233, 1, 1), +// SCHEDULE_CARD_LIGHT("schedule", 7, 233, 1, 1), +// SCHEDULE_CARD_MOVE_UP("schedule", 51, 230, 12, 12), +// SCHEDULE_CARD_MOVE_DOWN("schedule", 65, 230, 12, 12), +// SCHEDULE_CARD_REMOVE("schedule", 51, 243, 12, 12), +// SCHEDULE_CARD_DUPLICATE("schedule", 65, 243, 12, 12), +// SCHEDULE_CARD_NEW("schedule", 79, 239, 16, 16), +// SCHEDULE_CONDITION_NEW("schedule", 96, 239, 19, 16), +// SCHEDULE_CONDITION_LEFT("schedule", 116, 239, 6, 16), +// SCHEDULE_CONDITION_LEFT_CLEAN("schedule", 147, 239, 2, 16), +// SCHEDULE_CONDITION_MIDDLE("schedule", 123, 239, 1, 16), +// SCHEDULE_CONDITION_ITEM("schedule", 125, 239, 18, 16), +// SCHEDULE_CONDITION_RIGHT("schedule", 144, 239, 2, 16), +// SCHEDULE_CONDITION_APPEND("schedule", 150, 245, 10, 10), +// SCHEDULE_SCROLL_LEFT("schedule", 161, 247, 4, 8), +// SCHEDULE_SCROLL_RIGHT("schedule", 166, 247, 4, 8), +// SCHEDULE_STRIP_DARK("schedule", 5, 235, 3, 1), +// SCHEDULE_STRIP_LIGHT("schedule", 5, 237, 3, 1), +// SCHEDULE_STRIP_WAIT("schedule", 1, 239, 11, 16), +// SCHEDULE_STRIP_TRAVEL("schedule", 12, 239, 11, 16), +// SCHEDULE_STRIP_DOTTED("schedule", 23, 239, 11, 16), +// SCHEDULE_STRIP_END("schedule", 34, 239, 11, 16), +// SCHEDULE_STRIP_ACTION("schedule", 209, 239, 11, 16), +// SCHEDULE_EDITOR("schedule_2", 256, 89), +// SCHEDULE_EDITOR_ADDITIONAL_SLOT("schedule_2", 55, 47, 32, 18), +// SCHEDULE_EDITOR_INACTIVE_SLOT("schedule_2", 0, 91, 18, 18), +// SCHEDULE_POINTER("schedule", 185, 239, 21, 16), +// SCHEDULE_POINTER_OFFSCREEN("schedule", 171, 239, 13, 16), +// +// STATION("schedule_2", 0, 111, 200, 127), +// STATION_ASSEMBLING("assemble", 200, 178), +// STATION_TEXTBOX_TOP("assemble", 1, 179, 150, 18), +// STATION_TEXTBOX_MIDDLE("assemble", 1, 198, 150, 1), +// STATION_TEXTBOX_BOTTOM("assemble", 1, 200, 150, 4), +// STATION_TEXTBOX_SPEECH("assemble", 152, 179, 8, 6), +// STATION_EDIT_NAME("schedule_2", 0, 239, 13, 13), +// STATION_EDIT_TRAIN_NAME("schedule_2", 89, 239, 13, 13), +// I_NEW_TRAIN("schedule_2", 14, 239, 24, 16), +// I_DISASSEMBLE_TRAIN("schedule_2", 39, 239, 24, 16), +// I_ASSEMBLE_TRAIN("schedule_2", 64, 239, 24, 16), +// +// ELEVATOR_CONTACT("display_link", 20, 172, 233, 82), +// +// BRASS_FRAME_TL("value_settings", 65, 9, 4, 4), +// BRASS_FRAME_TR("value_settings", 70, 9, 4, 4), +// BRASS_FRAME_BL("value_settings", 65, 19, 4, 4), +// BRASS_FRAME_BR("value_settings", 70, 19, 4, 4), +// BRASS_FRAME_LEFT("value_settings", 65, 14, 3, 4), +// BRASS_FRAME_RIGHT("value_settings", 71, 14, 3, 4), +// BRASS_FRAME_TOP("value_settings", 0, 24, 256, 3), +// BRASS_FRAME_BOTTOM("value_settings", 0, 27, 256, 3), +// +// VALUE_SETTINGS_MILESTONE("value_settings", 0, 0, 7, 8), +// VALUE_SETTINGS_WIDE_MILESTONE("value_settings", 75, 14, 13, 8), +// VALUE_SETTINGS_BAR("value_settings", 7, 0, 249, 8), +// VALUE_SETTINGS_BAR_BG("value_settings", 75, 9, 1, 1), +// VALUE_SETTINGS_OUTER_BG("value_settings", 80, 9, 1, 1), +// VALUE_SETTINGS_CURSOR_LEFT("value_settings", 0, 9, 3, 14), +// VALUE_SETTINGS_CURSOR("value_settings", 4, 9, 56, 14), +// VALUE_SETTINGS_CURSOR_RIGHT("value_settings", 61, 9, 3, 14), +// VALUE_SETTINGS_CURSOR_ICON("value_settings", 0, 44, 22, 20), +// VALUE_SETTINGS_LABEL_BG("value_settings", 0, 31, 81, 11), +// +// // JEI +// JEI_SLOT("jei/widgets", 18, 18), +// JEI_CHANCE_SLOT("jei/widgets", 20, 156, 18, 18), +// JEI_CATALYST_SLOT("jei/widgets", 0, 156, 18, 18), +// JEI_ARROW("jei/widgets", 19, 10, 42, 10), +// JEI_LONG_ARROW("jei/widgets", 19, 0, 71, 10), +// JEI_DOWN_ARROW("jei/widgets", 0, 21, 18, 14), +// JEI_LIGHT("jei/widgets", 0, 42, 52, 11), +// JEI_QUESTION_MARK("jei/widgets", 0, 178, 12, 16), +// JEI_SHADOW("jei/widgets", 0, 56, 52, 11), +// BLOCKZAPPER_UPGRADE_RECIPE("jei/widgets", 0, 75, 144, 66), +// JEI_HEAT_BAR("jei/widgets", 0, 201, 169, 19), +// JEI_NO_HEAT_BAR("jei/widgets", 0, 221, 169, 19), + + // Widgets BUTTON("widgets", 18, 18), BUTTON_HOVER("widgets", 18, 0, 18, 18), BUTTON_DOWN("widgets", 36, 0, 18, 18), @@ -29,16 +176,22 @@ public enum AllGuiTextures implements ScreenElement { SPEECH_TOOLTIP_BACKGROUND("widgets", 0, 24, 8, 8), SPEECH_TOOLTIP_COLOR("widgets", 8, 24, 8, 8), - - TRAIN_HUD_SPEED_BG("widgets", 0, 190, 182, 5), - TRAIN_HUD_SPEED("widgets", 0, 185, 182, 5), - TRAIN_HUD_THROTTLE("widgets", 0, 195, 182, 5), - TRAIN_HUD_THROTTLE_POINTER("widgets", 0, 209, 6, 9), - TRAIN_HUD_FRAME("widgets", 0, 200, 186, 7), - TRAIN_HUD_DIRECTION("widgets", 77, 165, 28, 20), - TRAIN_PROMPT_L("widgets", 8, 209, 3, 16), - TRAIN_PROMPT_R("widgets", 11, 209, 3, 16), - TRAIN_PROMPT("widgets", 0, 230, 256, 16), + +// TRAIN_HUD_SPEED_BG("widgets", 0, 190, 182, 5), +// TRAIN_HUD_SPEED("widgets", 0, 185, 182, 5), +// TRAIN_HUD_THROTTLE("widgets", 0, 195, 182, 5), +// TRAIN_HUD_THROTTLE_POINTER("widgets", 0, 209, 6, 9), +// TRAIN_HUD_FRAME("widgets", 0, 200, 186, 7), +// TRAIN_HUD_DIRECTION("widgets", 77, 165, 28, 20), +// TRAIN_PROMPT_L("widgets", 8, 209, 3, 16), +// TRAIN_PROMPT_R("widgets", 11, 209, 3, 16), +// TRAIN_PROMPT("widgets", 0, 230, 256, 16), + + // PlacementIndicator +// PLACEMENT_INDICATOR_SHEET("placement_indicator", 0, 0, 16, 256), + + // ComputerCraft +// COMPUTER("computer", 200, 102); ; @@ -74,22 +227,14 @@ public enum AllGuiTextures implements ScreenElement { } @OnlyIn(Dist.CLIENT) - @Override - public void render(PoseStack ms, int x, int y) { - bind(); - GuiComponent.blit(ms, x, y, 0, startX, startY, width, height, 256, 256); + public void render(GuiGraphics graphics, int x, int y) { + graphics.blit(location, x, y, startX, startY, width, height); } @OnlyIn(Dist.CLIENT) - public void render(PoseStack ms, int x, int y, GuiComponent component) { + public void render(GuiGraphics graphics, int x, int y, Color c) { bind(); - component.blit(ms, x, y, startX, startY, width, height); - } - - @OnlyIn(Dist.CLIENT) - public void render(PoseStack ms, int x, int y, Color c) { - bind(); - UIRenderHelper.drawColoredTexture(ms, c, x, y, startX, startY, width, height); + UIRenderHelper.drawColoredTexture(graphics, c, x, y, startX, startY, width, height); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllIcons.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllIcons.java index 74971d8..c71171c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllIcons.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllIcons.java @@ -1,14 +1,16 @@ package nl.requios.effortlessbuilding.create.foundation.gui; +import org.joml.Matrix4f; + import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import org.joml.Matrix4f; import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import net.minecraft.client.gui.GuiComponent; + +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -19,7 +21,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; public class AllIcons implements ScreenElement { - public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/create_icons.png"); + public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/icons.png"); public static final int ICON_ATLAS_SIZE = 256; private static int x = 0, y = -1; @@ -81,7 +83,7 @@ public class AllIcons implements ScreenElement { public static final AllIcons I_TOOL_DEPLOY = newRow(), I_SKIP_MISSING = next(), - I_SKIP_TILES = next(), + I_SKIP_BLOCK_ENTITIES = next(), I_DICE = next(), I_TUNNEL_SPLIT = next(), I_TUNNEL_FORCED_SPLIT = next(), @@ -103,6 +105,10 @@ public class AllIcons implements ScreenElement { I_ADD_INVERTED_ATTRIBUTE = next(), I_FLIP = next(), + + I_ROLLER_PAVE = next(), + I_ROLLER_FILL = next(), + I_ROLLER_WIDE_FILL = next(), I_PLAY = newRow(), I_PAUSE = next(), @@ -122,9 +128,14 @@ public class AllIcons implements ScreenElement { I_PATTERN_CHANCE_75 = next(), I_FOLLOW_DIAGONAL = next(), I_FOLLOW_MATERIAL = next(), + + I_CLEAR_CHECKED = next(), I_SCHEMATIC = newRow(), I_SEQ_REPEAT = next(), + VALUE_BOX_HOVER_6PX = next(), + VALUE_BOX_HOVER_4PX = next(), + VALUE_BOX_HOVER_8PX = next(), I_MTD_LEFT = newRow(), I_MTD_CLOSE = next(), @@ -173,20 +184,13 @@ public class AllIcons implements ScreenElement { @OnlyIn(Dist.CLIENT) @Override - public void render(PoseStack matrixStack, int x, int y) { - bind(); - GuiComponent.blit(matrixStack, x, y, 0, iconX, iconY, 16, 16, 256, 256); - } - - @OnlyIn(Dist.CLIENT) - public void render(PoseStack matrixStack, int x, int y, GuiComponent component) { - bind(); - component.blit(matrixStack, x, y, iconX, iconY, 16, 16); + public void render(GuiGraphics graphics, int x, int y) { + graphics.blit(ICON_ATLAS, x, y, 0, iconX, iconY, 16, 16, 256, 256); } @OnlyIn(Dist.CLIENT) public void render(PoseStack ms, MultiBufferSource buffer, int color) { - VertexConsumer builder = buffer.getBuffer(RenderType.textSeeThrough(ICON_ATLAS)); + VertexConsumer builder = buffer.getBuffer(RenderType.text(ICON_ATLAS)); Matrix4f matrix = ms.last().pose(); Color rgb = new Color(color); int light = LightTexture.FULL_BRIGHT; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ConfirmationScreen.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ConfirmationScreen.java index 0175434..f77d5eb 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ConfirmationScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ConfirmationScreen.java @@ -1,20 +1,24 @@ package nl.requios.effortlessbuilding.create.foundation.gui; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import javax.annotation.Nonnull; + +import org.lwjgl.opengl.GL30; + import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.foundation.gui.element.BoxElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.TextStencilElement; import nl.requios.effortlessbuilding.create.foundation.gui.widget.BoxWidget; + import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.FormattedText; import net.minecraft.network.chat.Style; -import org.lwjgl.opengl.GL30; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; public class ConfirmationScreen extends AbstractSimiScreen { @@ -173,11 +177,12 @@ public class ConfirmationScreen extends AbstractSimiScreen { } @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - textBackground.render(ms); + protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + textBackground.render(graphics); int offset = font.lineHeight + 1; int lineY = y - offset; + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(0, 0, 200); @@ -185,21 +190,21 @@ public class ConfirmationScreen extends AbstractSimiScreen { lineY += offset; if (line == null) continue; - font.draw(ms, line.getString(), x, lineY, 0xeaeaea); + graphics.drawString(font, line.getString(), x, lineY, 0xeaeaea, false); } ms.popPose(); } @Override - protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + protected void renderWindowBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { endFrame(); - source.render(ms, 0, 0, 10); // zero mouse coords to prevent further tooltips + source.render(graphics, 0, 0, 10); // zero mouse coords to prevent further tooltips prepareFrame(); - this.fillGradient(ms, 0, 0, this.width, this.height, 0x70101010, 0x80101010); + graphics.fillGradient(0, 0, this.width, this.height, 0x70101010, 0x80101010); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/CustomLightingSettings.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/CustomLightingSettings.java index 9296845..5e1bfad 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/CustomLightingSettings.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/CustomLightingSettings.java @@ -1,9 +1,11 @@ package nl.requios.effortlessbuilding.create.foundation.gui; -import com.mojang.blaze3d.systems.RenderSystem; import org.joml.Matrix4f; import org.joml.Vector3f; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.math.Axis; + public class CustomLightingSettings implements ILightingSettings { private Vector3f light1; @@ -19,20 +21,20 @@ public class CustomLightingSettings implements ILightingSettings { } protected void init(float yRot1, float xRot1, float yRot2, float xRot2, boolean doubleLight) { - light1 = Vector3f.ZP.copy(); - light1.transform(Vector3f.YP.rotationDegrees(yRot1)); - light1.transform(Vector3f.XN.rotationDegrees(xRot1)); + light1 = new Vector3f(0, 0, 1); + light1.rotate(Axis.YP.rotationDegrees(yRot1)); + light1.rotate(Axis.XN.rotationDegrees(xRot1)); if (doubleLight) { - light2 = Vector3f.ZP.copy(); - light2.transform(Vector3f.YP.rotationDegrees(yRot2)); - light2.transform(Vector3f.XN.rotationDegrees(xRot2)); + light2 = new Vector3f(0, 0, 1); + light2.rotate(Axis.YP.rotationDegrees(yRot2)); + light2.rotate(Axis.XN.rotationDegrees(xRot2)); } else { - light2 = Vector3f.ZERO; + light2 = new Vector3f(); } lightMatrix = new Matrix4f(); - lightMatrix.setIdentity(); + lightMatrix.identity(); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ModularGuiLine.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ModularGuiLine.java new file mode 100644 index 0000000..7e29784 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ModularGuiLine.java @@ -0,0 +1,115 @@ +package nl.requios.effortlessbuilding.create.foundation.gui; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput; +import nl.requios.effortlessbuilding.create.foundation.gui.widget.TooltipArea; +import nl.requios.effortlessbuilding.create.foundation.utility.Couple; +import nl.requios.effortlessbuilding.create.foundation.utility.Pair; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Renderable; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.nbt.CompoundTag; + +public class ModularGuiLine { + + List> widgets; + List> customBoxes; + boolean speechBubble; + + public ModularGuiLine() { + widgets = new ArrayList<>(); + customBoxes = new ArrayList<>(); + speechBubble = false; + } + + public void renderWidgetBG(int guiLeft, GuiGraphics graphics) { + boolean first = true; + + if (!customBoxes.isEmpty()) { + for (Couple couple : customBoxes) { + int x = couple.getFirst() + guiLeft; + int width = couple.getSecond(); + box(graphics, x, width, first & speechBubble); + first = false; + } + return; + } + + for (Pair pair : widgets) { + if (pair.getSecond() + .equals("Dummy")) + continue; + + AbstractWidget aw = pair.getFirst(); + int x = aw.getX(); + int width = aw.getWidth(); + + if (aw instanceof EditBox) { + x -= 5; + width += 9; + } + + box(graphics, x, width, first & speechBubble); + first = false; + } + } + + private void box(GuiGraphics graphics, int x, int width, boolean b) { + UIRenderHelper.drawStretched(graphics, x, 0, width, 18, 0, AllGuiTextures.DATA_AREA); + if (b) + AllGuiTextures.DATA_AREA_SPEECH.render(graphics, x - 3, 0); + else + AllGuiTextures.DATA_AREA_START.render(graphics, x, 0); + AllGuiTextures.DATA_AREA_END.render(graphics, x + width - 2, 0); + } + + public void saveValues(CompoundTag data) { + for (Pair pair : widgets) { + AbstractWidget w = pair.getFirst(); + String key = pair.getSecond(); + if (w instanceof EditBox eb) + data.putString(key, eb.getValue()); + if (w instanceof ScrollInput si) + data.putInt(key, si.getState()); + } + } + + @SuppressWarnings("unchecked") + public void loadValues(CompoundTag data, + Consumer addRenderable, Consumer addRenderableOnly) { + for (Pair pair : widgets) { + AbstractWidget w = pair.getFirst(); + String key = pair.getSecond(); + if (w instanceof EditBox eb) + eb.setValue(data.getString(key)); + if (w instanceof ScrollInput si) + si.setState(data.getInt(key)); + + if (w instanceof TooltipArea) + addRenderableOnly.accept((T) w); + else + addRenderable.accept((T) w); + } + } + + public void forEach(Consumer callback) { + widgets.forEach(p -> callback.accept(p.getFirst())); + } + + public void clear() { + widgets.clear(); + customBoxes.clear(); + } + + public void add(Pair pair) { + widgets.add(pair); + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ModularGuiLineBuilder.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ModularGuiLineBuilder.java new file mode 100644 index 0000000..f71b4c1 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ModularGuiLineBuilder.java @@ -0,0 +1,91 @@ +package nl.requios.effortlessbuilding.create.foundation.gui; + +import java.util.function.BiConsumer; + +import nl.requios.effortlessbuilding.create.foundation.gui.widget.Label; +import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput; +import nl.requios.effortlessbuilding.create.foundation.gui.widget.SelectionScrollInput; +import nl.requios.effortlessbuilding.create.foundation.gui.widget.TooltipArea; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; +import nl.requios.effortlessbuilding.create.foundation.utility.Couple; +import nl.requios.effortlessbuilding.create.foundation.utility.Pair; + +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.components.EditBox; + +public class ModularGuiLineBuilder { + + private ModularGuiLine target; + private Font font; + private int x; + private int y; + + public ModularGuiLineBuilder(Font font, ModularGuiLine target, int x, int y) { + this.font = font; + this.target = target; + this.x = x; + this.y = y; + } + + public ModularGuiLineBuilder addScrollInput(int x, int width, BiConsumer inputTransform, + String dataKey) { + ScrollInput input = new ScrollInput(x + this.x, y - 4, width, 18); + addScrollInput(input, inputTransform, dataKey); + return this; + } + + public ModularGuiLineBuilder addSelectionScrollInput(int x, int width, + BiConsumer inputTransform, String dataKey) { + SelectionScrollInput input = new SelectionScrollInput(x + this.x, y - 4, width, 18); + addScrollInput(input, inputTransform, dataKey); + return this; + } + + public ModularGuiLineBuilder customArea(int x, int width) { + target.customBoxes.add(Couple.create(x, width)); + return this; + } + + public ModularGuiLineBuilder speechBubble() { + target.speechBubble = true; + return this; + } + + private void addScrollInput(T input, BiConsumer inputTransform, String dataKey) { + Label label = new Label(input.getX() + 5, y, Components.immutableEmpty()); + label.withShadow(); + inputTransform.accept(input, label); + input.writingTo(label); + target.add(Pair.of(label, "Dummy")); + target.add(Pair.of(input, dataKey)); + } + + public ModularGuiLineBuilder addIntegerTextInput(int x, int width, BiConsumer inputTransform, + String dataKey) { + return addTextInput(x, width, inputTransform.andThen((editBox, $) -> editBox.setFilter(s -> { + if (s.isEmpty()) + return true; + try { + Integer.parseInt(s); + return true; + } catch (NumberFormatException e) { + return false; + } + })), dataKey); + } + + public ModularGuiLineBuilder addTextInput(int x, int width, BiConsumer inputTransform, + String dataKey) { + EditBox input = new EditBox(font, x + this.x + 5, y, width - 9, 8, Components.immutableEmpty()); + input.setBordered(false); + input.setTextColor(0xffffff); + input.setFocused(false); + input.mouseClicked(0, 0, 0); + TooltipArea tooltipArea = new TooltipArea(this.x + x, y - 4, width, 18); + inputTransform.accept(input, tooltipArea); + target.add(Pair.of(input, dataKey)); + target.add(Pair.of(tooltipArea, "Dummy")); + return this; + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/RemovedGuiUtils.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/RemovedGuiUtils.java index 5d545eb..deba030 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/RemovedGuiUtils.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/RemovedGuiUtils.java @@ -1,10 +1,18 @@ package nl.requios.effortlessbuilding.create.foundation.gui; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +import org.joml.Matrix4f; + import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; -import org.joml.Matrix4f; + import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.network.chat.FormattedText; @@ -12,13 +20,9 @@ import net.minecraft.network.chat.Style; import net.minecraft.world.item.ItemStack; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.RenderTooltipEvent; -import net.minecraftforge.client.gui.ScreenUtils; +import net.minecraftforge.client.extensions.IForgeGuiGraphics; import net.minecraftforge.common.MinecraftForge; -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - public class RemovedGuiUtils { @Nonnull private static ItemStack cachedTooltipStack = ItemStack.EMPTY; @@ -31,41 +35,43 @@ public class RemovedGuiUtils { cachedTooltipStack = ItemStack.EMPTY; } - public static void drawHoveringText(PoseStack mStack, List textLines, int mouseX, + public static void drawHoveringText(GuiGraphics graphics, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, Font font) { - drawHoveringText(mStack, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, - ScreenUtils.DEFAULT_BACKGROUND_COLOR, ScreenUtils.DEFAULT_BORDER_COLOR_START, ScreenUtils.DEFAULT_BORDER_COLOR_END, + drawHoveringText(graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, + IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END, font); } - public static void drawHoveringText(PoseStack mStack, List textLines, int mouseX, + public static void drawHoveringText(GuiGraphics graphics, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, int backgroundColor, int borderColorStart, int borderColorEnd, Font font) { - drawHoveringText(cachedTooltipStack, mStack, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, + drawHoveringText(cachedTooltipStack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, backgroundColor, borderColorStart, borderColorEnd, font); } - public static void drawHoveringText(@Nonnull final ItemStack stack, PoseStack mStack, + public static void drawHoveringText(@Nonnull final ItemStack stack, GuiGraphics graphics, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, Font font) { - drawHoveringText(stack, mStack, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, - ScreenUtils.DEFAULT_BACKGROUND_COLOR, ScreenUtils.DEFAULT_BORDER_COLOR_START, ScreenUtils.DEFAULT_BORDER_COLOR_END, + drawHoveringText(stack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, + IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END, font); } - public static void drawHoveringText(@Nonnull final ItemStack stack, PoseStack pStack, + public static void drawHoveringText(@Nonnull final ItemStack stack, GuiGraphics graphics, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, int backgroundColor, int borderColorStart, int borderColorEnd, Font font) { if (textLines.isEmpty()) return; List list = ForgeHooksClient.gatherTooltipComponents(stack, textLines, - stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font, font); + stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font); RenderTooltipEvent.Pre event = - new RenderTooltipEvent.Pre(stack, pStack, mouseX, mouseY, screenWidth, screenHeight, font, list); + new RenderTooltipEvent.Pre(stack, graphics, mouseX, mouseY, screenWidth, screenHeight, font, list, null); if (MinecraftForge.EVENT_BUS.post(event)) return; + PoseStack pStack = graphics.pose(); + mouseX = event.getX(); mouseY = event.getY(); screenWidth = event.getScreenWidth(); @@ -144,7 +150,7 @@ public class RemovedGuiUtils { tooltipY = screenHeight - tooltipHeight - 4; final int zLevel = 400; - RenderTooltipEvent.Color colorEvent = new RenderTooltipEvent.Color(stack, pStack, tooltipX, tooltipY, + RenderTooltipEvent.Color colorEvent = new RenderTooltipEvent.Color(stack, graphics, tooltipX, tooltipY, font, backgroundColor, borderColorStart, borderColorEnd, list); MinecraftForge.EVENT_BUS.post(colorEvent); backgroundColor = colorEvent.getBackgroundStart(); @@ -154,24 +160,24 @@ public class RemovedGuiUtils { pStack.pushPose(); Matrix4f mat = pStack.last() .pose(); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, - tooltipY - 3, backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, - tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, - tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, - backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, - tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, - tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, - tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, - tooltipY - 3 + 1, borderColorStart, borderColorStart); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, - tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); + graphics.fillGradient(tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, + tooltipY - 3, zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 3, + tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, + tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, + zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX + tooltipTextWidth + 3, tooltipY - 3, + tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, + tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd); + graphics.fillGradient(tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, + tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd); + graphics.fillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, + tooltipY - 3 + 1, zLevel, borderColorStart, borderColorStart); + graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 2, + tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, zLevel, borderColorEnd, borderColorEnd); MultiBufferSource.BufferSource renderType = MultiBufferSource.immediate(Tesselator.getInstance() .getBuilder()); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/Theme.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/Theme.java index 38d1ae6..6f2eb21 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/Theme.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/Theme.java @@ -1,11 +1,17 @@ package nl.requios.effortlessbuilding.create.foundation.gui; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import nl.requios.effortlessbuilding.create.foundation.utility.Couple; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.*; + +import nl.requios.effortlessbuilding.create.foundation.utility.Color; +import nl.requios.effortlessbuilding.create.foundation.utility.Couple; public class Theme { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/UIRenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/UIRenderHelper.java index c2d5943..40b4d63 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/UIRenderHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/UIRenderHelper.java @@ -1,22 +1,26 @@ package nl.requios.effortlessbuilding.create.foundation.gui; +import org.joml.Matrix4f; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL30; + import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.platform.GlConst; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import org.joml.Matrix4f; -import org.joml.Vector3f; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Axis; import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Couple; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraftforge.client.gui.ScreenUtils; -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL30; -import javax.annotation.Nonnull; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; public class UIRenderHelper { @@ -53,14 +57,14 @@ public class UIRenderHelper { GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dst.frameBufferId); } - public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length) { - streak(ms, angle, x, y, breadth, length, Theme.i(Theme.Key.STREAK)); + public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length) { + streak(graphics, angle, x, y, breadth, length, Theme.i(Theme.Key.STREAK)); } // angle in degrees; 0° -> fading to the right // x and y specify the middle point of the starting edge // breadth is the total width of the streak - public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length, int color) { + public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, int color) { int a1 = 0xa0 << 24; int a2 = 0x80 << 24; int a3 = 0x10 << 24; @@ -72,59 +76,60 @@ public class UIRenderHelper { int c3 = a3 | color; int c4 = a4 | color; + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(x, y, 0); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); + ms.mulPose(Axis.ZP.rotationDegrees(angle - 90)); - streak(ms, breadth / 2, length, c1, c2, c3, c4); + streak(graphics, breadth / 2, length, c1, c2, c3, c4); ms.popPose(); } - public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length, Color c) { + public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Color c) { Color color = c.copy().setImmutable(); int c1 = color.scaleAlpha(0.625f).getRGB(); int c2 = color.scaleAlpha(0.5f).getRGB(); int c3 = color.scaleAlpha(0.0625f).getRGB(); int c4 = color.scaleAlpha(0f).getRGB(); + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(x, y, 0); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); + ms.mulPose(Axis.ZP.rotationDegrees(angle - 90)); - streak(ms, breadth / 2, length, c1, c2, c3, c4); + streak(graphics, breadth / 2, length, c1, c2, c3, c4); ms.popPose(); } - private static void streak(PoseStack ms, int width, int height, int c1, int c2, int c3, int c4) { + private static void streak(GuiGraphics graphics, int width, int height, int c1, int c2, int c3, int c4) { double split1 = .5; double split2 = .75; - Matrix4f model = ms.last().pose(); - ScreenUtils.drawGradientRect(model, 0, -width, 0, width, (int) (split1 * height), c1, c2); - ScreenUtils.drawGradientRect(model, 0, -width, (int) (split1 * height), width, (int) (split2 * height), c2, c3); - ScreenUtils.drawGradientRect(model, 0, -width, (int) (split2 * height), width, height, c3, c4); + graphics.fillGradient(-width, 0, width, (int) (split1 * height), 0, c1, c2); + graphics.fillGradient(-width, (int) (split1 * height), width, (int) (split2 * height), 0, c2, c3); + graphics.fillGradient(-width, (int) (split2 * height), width, height, 0, c3, c4); } /** * @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int breadth, int length, Couple c) { - angledGradient(ms, angle, x, y, 0, breadth, length, c); + public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Couple c) { + angledGradient(graphics, angle, x, y, 0, breadth, length, c); } /** * @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int z, int breadth, int length, Couple c) { - angledGradient(ms, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond()); + public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Couple c) { + angledGradient(graphics, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond()); } /** * @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int breadth, int length, Color color1, Color color2) { - angledGradient(ms, angle, x, y, 0, breadth, length, color1, color2); + public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Color color1, Color color2) { + angledGradient(graphics, angle, x, y, 0, breadth, length, color1, color2); } /** @@ -135,31 +140,32 @@ public class UIRenderHelper { * @param color2 the color at the ending edge * @param breadth the total width of the gradient */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int z, int breadth, int length, Color color1, Color color2) { + public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Color color1, Color color2) { + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(x, y, z); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); + ms.mulPose(Axis.ZP.rotationDegrees(angle - 90)); - Matrix4f model = ms.last().pose(); int w = breadth / 2; - ScreenUtils.drawGradientRect(model, 0, -w, 0, w, length, color1.getRGB(), color2.getRGB()); + graphics.fillGradient(-w, 0, w, length, 0, color1.getRGB(), color2.getRGB()); ms.popPose(); } - public static void breadcrumbArrow(PoseStack matrixStack, int x, int y, int z, int width, int height, int indent, Couple colors) {breadcrumbArrow(matrixStack, x, y, z, width, height, indent, colors.getFirst(), colors.getSecond());} + public static void breadcrumbArrow(GuiGraphics graphics, int x, int y, int z, int width, int height, int indent, Couple colors) {breadcrumbArrow(graphics, x, y, z, width, height, indent, colors.getFirst(), colors.getSecond());} // draws a wide chevron-style breadcrumb arrow pointing left - public static void breadcrumbArrow(PoseStack matrixStack, int x, int y, int z, int width, int height, int indent, Color startColor, Color endColor) { + public static void breadcrumbArrow(GuiGraphics graphics, int x, int y, int z, int width, int height, int indent, Color startColor, Color endColor) { + PoseStack matrixStack = graphics.pose(); matrixStack.pushPose(); matrixStack.translate(x - indent, y, z); - breadcrumbArrow(matrixStack, width, height, indent, startColor, endColor); + breadcrumbArrow(graphics, width, height, indent, startColor, endColor); matrixStack.popPose(); } - private static void breadcrumbArrow(PoseStack ms, int width, int height, int indent, Color c1, Color c2) { + private static void breadcrumbArrow(GuiGraphics graphics, int width, int height, int indent, Color c1, Color c2) { /* * 0,0 x1,y1 ********************* x4,y4 ***** x7,y7 @@ -189,7 +195,7 @@ public class UIRenderHelper { Color fc3 = Color.mixColors(c1, c2, (indent + width) / (width + 2f * indent)); Color fc4 = Color.mixColors(c1, c2, 1); - RenderSystem.disableTexture(); +// RenderSystem.disableTexture(); RenderSystem.enableBlend(); RenderSystem.disableCull(); RenderSystem.defaultBlendFunc(); @@ -197,7 +203,7 @@ public class UIRenderHelper { Tesselator tessellator = Tesselator.getInstance(); BufferBuilder bufferbuilder = tessellator.getBuilder(); - Matrix4f model = ms.last().pose(); + Matrix4f model = graphics.pose().last().pose(); bufferbuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR); bufferbuilder.vertex(model, x0, y0, 0).color(fc1.getRed(), fc1.getGreen(), fc1.getBlue(), fc1.getAlpha()).endVertex(); @@ -227,27 +233,34 @@ public class UIRenderHelper { tessellator.end(); RenderSystem.enableCull(); RenderSystem.disableBlend(); - RenderSystem.enableTexture(); +// RenderSystem.enableTexture(); } //just like AbstractGui#drawTexture, but with a color at every vertex - public static void drawColoredTexture(PoseStack ms, Color c, int x, int y, int tex_left, int tex_top, int width, int height) { - drawColoredTexture(ms, c, x, y, 0, (float) tex_left, (float) tex_top, width, height, 256, 256); + public static void drawColoredTexture(GuiGraphics graphics, Color c, int x, int y, int tex_left, int tex_top, int width, int height) { + drawColoredTexture(graphics, c, x, y, 0, (float) tex_left, (float) tex_top, width, height, 256, 256); } - public static void drawColoredTexture(PoseStack ms, Color c, int x, int y, int z, float tex_left, float tex_top, int width, int height, int sheet_width, int sheet_height) { - drawColoredTexture(ms, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height); + public static void drawColoredTexture(GuiGraphics graphics, Color c, int x, int y, int z, float tex_left, float tex_top, int width, int height, int sheet_width, int sheet_height) { + drawColoredTexture(graphics, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height); } - public static void drawStretched(PoseStack ms, int left, int top, int w, int h, int z, AllGuiTextures tex) { + public static void drawStretched(GuiGraphics graphics, int left, int top, int w, int h, int z, AllGuiTextures tex) { tex.bind(); - drawTexturedQuad(ms.last() + drawTexturedQuad(graphics.pose().last() .pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + tex.width) / 256f, tex.startY / 256f, (tex.startY + tex.height) / 256f); } - private static void drawColoredTexture(PoseStack ms, Color c, int left, int right, int top, int bot, int z, int tex_width, int tex_height, float tex_left, float tex_top, int sheet_width, int sheet_height) { - drawTexturedQuad(ms.last().pose(), c, left, right, top, bot, z, (tex_left + 0.0F) / (float) sheet_width, (tex_left + (float) tex_width) / (float) sheet_width, (tex_top + 0.0F) / (float) sheet_height, (tex_top + (float) tex_height) / (float) sheet_height); + public static void drawCropped(GuiGraphics graphics, int left, int top, int w, int h, int z, AllGuiTextures tex) { + tex.bind(); + drawTexturedQuad(graphics.pose().last() + .pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + w) / 256f, + tex.startY / 256f, (tex.startY + h) / 256f); + } + + private static void drawColoredTexture(GuiGraphics graphics, Color c, int left, int right, int top, int bot, int z, int tex_width, int tex_height, float tex_left, float tex_top, int sheet_width, int sheet_height) { + drawTexturedQuad(graphics.pose().last().pose(), c, left, right, top, bot, z, (tex_left + 0.0F) / (float) sheet_width, (tex_left + (float) tex_width) / (float) sheet_width, (tex_top + 0.0F) / (float) sheet_height, (tex_top + (float) tex_height) / (float) sheet_height); } private static void drawTexturedQuad(Matrix4f m, Color c, int left, int right, int top, int bot, int z, float u1, float u2, float v1, float v2) { @@ -266,7 +279,7 @@ public class UIRenderHelper { } public static void flipForGuiRender(PoseStack poseStack) { - poseStack.mulPoseMatrix(Matrix4f.createScaleMatrix(1, -1, 1)); + poseStack.mulPoseMatrix(new Matrix4f().scaling(1, -1, 1)); } public static class CustomRenderTarget extends RenderTarget { @@ -291,7 +304,7 @@ public class UIRenderHelper { float tx = (float) viewWidth / (float) width; float ty = (float) viewHeight / (float) height; - RenderSystem.enableTexture(); +// RenderSystem.enableTexture(); RenderSystem.enableDepthTest(); RenderSystem.setShader(() -> Minecraft.getInstance().gameRenderer.blitShader); RenderSystem.getShader().setSampler("DiffuseSampler", colorTextureId); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ClearContainerPacket.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ClearContainerPacket.java deleted file mode 100644 index 6c7d786..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ClearContainerPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.container; - -import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent.Context; - -import java.util.function.Supplier; - -public class ClearContainerPacket extends SimplePacketBase { - - public ClearContainerPacket() {} - - public ClearContainerPacket(FriendlyByteBuf buffer) {} - - @Override - public void write(FriendlyByteBuf buffer) {} - - @Override - public void handle(Supplier context) { - context.get() - .enqueueWork(() -> { - ServerPlayer player = context.get() - .getSender(); - if (player == null) - return; - if (!(player.containerMenu instanceof IClearableContainer)) - return; - ((IClearableContainer) player.containerMenu).clearContents(); - }); - context.get() - .setPacketHandled(true); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableContainer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableContainer.java deleted file mode 100644 index 101d505..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableContainer.java +++ /dev/null @@ -1,14 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.container; - -//import nl.requios.effortlessbuilding.create.foundation.networking.AllPackets; - -public interface IClearableContainer { - - default void sendClearPacket() { -// AllPackets.channel.sendToServer(new ClearContainerPacket()); - } - - @Deprecated //warning: does not work - public void clearContents(); - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java index fcafffd..226e9a8 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java @@ -1,10 +1,17 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; import org.joml.Matrix4f; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Couple; + +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.GameRenderer; public class BoxElement extends RenderElement { @@ -60,8 +67,8 @@ public class BoxElement extends RenderElement { } @Override - public void render(PoseStack ms) { - renderBox(ms); + public void render(GuiGraphics graphics) { + renderBox(graphics.pose()); } //total box width = 1 * 2 (outer border) + 1 * 2 (inner color border) + 2 * borderOffset + width @@ -83,7 +90,7 @@ public class BoxElement extends RenderElement { * |_____________| * * */ - RenderSystem.disableTexture(); +// RenderSystem.disableTexture(); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.setShader(GameRenderer::getPositionColorShader); @@ -148,6 +155,6 @@ public class BoxElement extends RenderElement { tessellator.end(); RenderSystem.disableBlend(); - RenderSystem.enableTexture(); +// RenderSystem.enableTexture(); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/CombinedStencilElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/CombinedStencilElement.java index 3f5183c..57315ce 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/CombinedStencilElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/CombinedStencilElement.java @@ -1,8 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; +import javax.annotation.Nonnull; + import com.mojang.blaze3d.vertex.PoseStack; -import javax.annotation.Nonnull; +import net.minecraft.client.gui.GuiGraphics; public class CombinedStencilElement extends StencilElement { @@ -43,26 +45,27 @@ public class CombinedStencilElement extends StencilElement { } @Override - protected void renderStencil(PoseStack ms) { + protected void renderStencil(GuiGraphics graphics) { + PoseStack ms = graphics.pose(); ms.pushPose(); element1.transform(ms); element1.withBounds(width, height); - element1.renderStencil(ms); + element1.renderStencil(graphics); ms.popPose(); ms.pushPose(); element2.transform(ms); element2.withBounds(width, height); - element2.renderStencil(ms); + element2.renderStencil(graphics); ms.popPose(); } @Override - protected void renderElement(PoseStack ms) { + protected void renderElement(GuiGraphics graphics) { if (mode.rendersFirst()) - element1.withBounds(width, height).renderElement(ms); + element1.withBounds(width, height).renderElement(graphics); if (mode.rendersSecond()) - element2.withBounds(width, height).renderElement(ms); + element2.withBounds(width, height).renderElement(graphics); } public enum ElementMode { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/DelegatedStencilElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/DelegatedStencilElement.java index ba17d24..eff9ef0 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/DelegatedStencilElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/DelegatedStencilElement.java @@ -1,13 +1,14 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; -import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper; import nl.requios.effortlessbuilding.create.foundation.utility.Color; +import net.minecraft.client.gui.GuiGraphics; + public class DelegatedStencilElement extends StencilElement { - protected static final ElementRenderer EMPTY_RENDERER = (ms, width, height, alpha) -> {}; - protected static final ElementRenderer DEFAULT_ELEMENT = (ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, -3, 5, height+4, width+6, new Color(0xff_10dd10).scaleAlpha(alpha), new Color(0xff_1010dd).scaleAlpha(alpha)); + protected static final ElementRenderer EMPTY_RENDERER = (graphics, width, height, alpha) -> {}; + protected static final ElementRenderer DEFAULT_ELEMENT = (graphics, width, height, alpha) -> UIRenderHelper.angledGradient(graphics, 0, -3, 5, height+4, width+6, new Color(0xff_10dd10).scaleAlpha(alpha), new Color(0xff_1010dd).scaleAlpha(alpha)); protected ElementRenderer stencil; protected ElementRenderer element; @@ -35,18 +36,18 @@ public class DelegatedStencilElement extends StencilElement { } @Override - protected void renderStencil(PoseStack ms) { - stencil.render(ms, width, height, 1); + protected void renderStencil(GuiGraphics graphics) { + stencil.render(graphics, width, height, 1); } @Override - protected void renderElement(PoseStack ms) { - element.render(ms, width, height, alpha); + protected void renderElement(GuiGraphics graphics) { + element.render(graphics, width, height, alpha); } @FunctionalInterface public interface ElementRenderer { - void render(PoseStack ms, int width, int height, float alpha); + void render(GuiGraphics graphics, int width, int height, float alpha); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/GuiGameElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/GuiGameElement.java index 75d2860..ade179f 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/GuiGameElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/GuiGameElement.java @@ -1,31 +1,35 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; +import javax.annotation.Nullable; + import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.model.ModelUtil; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager.DestFactor; import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import org.joml.Vector3f; -//import nl.requios.effortlessbuilding.create.foundation.fluid.FluidRenderer; +import com.mojang.math.Axis; import nl.requios.effortlessbuilding.create.foundation.gui.ILightingSettings; import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper; import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.VecHelper; + import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.BaseFireBlock; @@ -37,8 +41,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.RenderTypeHelper; import net.minecraftforge.fluids.FluidStack; -import javax.annotation.Nullable; - public class GuiGameElement { public static GuiRenderBuilder of(ItemStack stack) { @@ -125,9 +127,9 @@ public class GuiGameElement { matrixStack.translate(xLocal, yLocal, zLocal); UIRenderHelper.flipForGuiRender(matrixStack); matrixStack.translate(rotationOffset.x, rotationOffset.y, rotationOffset.z); - matrixStack.mulPose(Vector3f.ZP.rotationDegrees((float) zRot)); - matrixStack.mulPose(Vector3f.XP.rotationDegrees((float) xRot)); - matrixStack.mulPose(Vector3f.YP.rotationDegrees((float) yRot)); + matrixStack.mulPose(Axis.ZP.rotationDegrees((float) zRot)); + matrixStack.mulPose(Axis.XP.rotationDegrees((float) xRot)); + matrixStack.mulPose(Axis.YP.rotationDegrees((float) yRot)); matrixStack.translate(-rotationOffset.x, -rotationOffset.y, -rotationOffset.z); } @@ -162,7 +164,8 @@ public class GuiGameElement { } @Override - public void render(PoseStack matrixStack) { + public void render(GuiGraphics graphics) { + PoseStack matrixStack = graphics.pose(); prepareMatrix(matrixStack); Minecraft mc = Minecraft.getInstance(); @@ -231,7 +234,7 @@ public class GuiGameElement { // FluidRenderer.renderFluidBox(new FluidStack(blockState.getFluidState() // .getType(), 1000), 0, 0, 0, 1, 1, 1, buffer, ms, LightTexture.FULL_BRIGHT, false); -// buffer.endBatch(); + buffer.endBatch(); } } @@ -256,7 +259,8 @@ public class GuiGameElement { } @Override - public void render(PoseStack matrixStack) { + public void render(GuiGraphics graphics) { + PoseStack matrixStack = graphics.pose(); prepareMatrix(matrixStack); transformMatrix(matrixStack); renderItemIntoGUI(matrixStack, stack, customLighting == null); @@ -270,10 +274,11 @@ public class GuiGameElement { renderer.textureManager.getTexture(InventoryMenu.BLOCK_ATLAS).setFilter(false, false); RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); RenderSystem.enableBlend(); - RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.enableCull(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); matrixStack.pushPose(); - matrixStack.translate(0, 0, 100.0F + renderer.blitOffset); + matrixStack.translate(0, 0, 100.0F); matrixStack.translate(8.0F, -8.0F, 0.0F); matrixStack.scale(16.0F, 16.0F, 16.0F); MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); @@ -282,8 +287,10 @@ public class GuiGameElement { Lighting.setupForFlatItems(); } - renderer.render(stack, ItemTransforms.TransformType.GUI, false, matrixStack, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, bakedModel); + renderer.render(stack, ItemDisplayContext.GUI, false, matrixStack, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, bakedModel); + RenderSystem.disableDepthTest(); buffer.endBatch(); + RenderSystem.enableDepthTest(); if (useDefaultLighting && flatLighting) { Lighting.setupFor3DItems(); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/RenderElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/RenderElement.java index f5e1e86..16a7519 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/RenderElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/RenderElement.java @@ -1,12 +1,12 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; public abstract class RenderElement implements ScreenElement { public static final RenderElement EMPTY = new RenderElement() { @Override - public void render(PoseStack ms) { + public void render(GuiGraphics graphics) { } }; @@ -66,11 +66,11 @@ public abstract class RenderElement implements ScreenElement { return z; } - public abstract void render(PoseStack ms); + public abstract void render(GuiGraphics graphics); @Override - public void render(PoseStack ms, int x, int y) { - this.at(x, y).render(ms); + public void render(GuiGraphics graphics, int x, int y) { + this.at(x, y).render(graphics); } public static class SimpleRenderElement extends RenderElement { @@ -82,8 +82,8 @@ public abstract class RenderElement implements ScreenElement { } @Override - public void render(PoseStack ms) { - renderable.render(ms, (int) x, (int) y); + public void render(GuiGraphics graphics) { + renderable.render(graphics, (int) x, (int) y); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/ScreenElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/ScreenElement.java index 453e38b..86c2700 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/ScreenElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/ScreenElement.java @@ -1,12 +1,12 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public interface ScreenElement { @OnlyIn(Dist.CLIENT) - void render(PoseStack ms, int x, int y); + void render(GuiGraphics graphics, int x, int y); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/StencilElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/StencilElement.java index ce71a8e..968ab5d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/StencilElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/StencilElement.java @@ -1,27 +1,31 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; +import org.lwjgl.opengl.GL11; + import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; + import net.minecraft.client.Minecraft; -import org.lwjgl.opengl.GL11; +import net.minecraft.client.gui.GuiGraphics; public abstract class StencilElement extends RenderElement { @Override - public void render(PoseStack ms) { + public void render(GuiGraphics graphics) { + PoseStack ms = graphics.pose(); ms.pushPose(); transform(ms); prepareStencil(ms); - renderStencil(ms); + renderStencil(graphics); prepareElement(ms); - renderElement(ms); + renderElement(graphics); cleanUp(ms); ms.popPose(); } - protected abstract void renderStencil(PoseStack ms); + protected abstract void renderStencil(GuiGraphics graphics); - protected abstract void renderElement(PoseStack ms); + protected abstract void renderElement(GuiGraphics graphics); protected void transform(PoseStack ms) { ms.translate(x, y, z); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/TextStencilElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/TextStencilElement.java index 5ffd067..957e4de 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/TextStencilElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/TextStencilElement.java @@ -2,7 +2,9 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.foundation.utility.Components; + import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.MutableComponent; public class TextStencilElement extends DelegatedStencilElement { @@ -45,8 +47,7 @@ public class TextStencilElement extends DelegatedStencilElement { } @Override - protected void renderStencil(PoseStack ms) { - + protected void renderStencil(GuiGraphics graphics) { float x = 0, y = 0; if (centerHorizontally) x = width / 2f - font.width(component) / 2f; @@ -54,11 +55,11 @@ public class TextStencilElement extends DelegatedStencilElement { if (centerVertically) y = height / 2f - (font.lineHeight - 1) / 2f; - font.draw(ms, component, x, y, 0xff_000000); + graphics.drawString(font, component, Math.round(x), Math.round(y), 0xff_000000, false); } @Override - protected void renderElement(PoseStack ms) { + protected void renderElement(GuiGraphics graphics) { float x = 0, y = 0; if (centerHorizontally) x = width / 2f - font.width(component) / 2f; @@ -66,9 +67,10 @@ public class TextStencilElement extends DelegatedStencilElement { if (centerVertically) y = height / 2f - (font.lineHeight - 1) / 2f; + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(x, y, 0); - element.render(ms, font.width(component), font.lineHeight + 2, alpha); + element.render(graphics, font.width(component), font.lineHeight + 2, alpha); ms.popPose(); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/AbstractSimiContainerScreen.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/AbstractSimiContainerScreen.java similarity index 72% rename from src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/AbstractSimiContainerScreen.java rename to src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/AbstractSimiContainerScreen.java index c7399cf..b670f6a 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/AbstractSimiContainerScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/AbstractSimiContainerScreen.java @@ -1,11 +1,19 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.container; +package nl.requios.effortlessbuilding.create.foundation.gui.menu; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener; import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget; + +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; @@ -18,11 +26,6 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - @OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault public abstract class AbstractSimiContainerScreen extends AbstractContainerScreen { @@ -91,34 +94,34 @@ public abstract class AbstractSimiContainerScreen tooltip = simiWidget.getToolTip(); if (tooltip.isEmpty()) continue; - int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.x; - int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.y; - renderComponentTooltip(ms, tooltip, ttx, tty); + int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX(); + int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY(); + graphics.renderComponentTooltip(font, tooltip, ttx, tty); } } } @@ -127,19 +130,26 @@ public abstract class AbstractSimiContainerScreen { + ServerPlayer player = context.getSender(); + if (player == null) + return; + if (!(player.containerMenu instanceof IClearableMenu)) + return; + ((IClearableMenu) player.containerMenu).clearContents(); + }); + return true; + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemContainer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/GhostItemMenu.java similarity index 88% rename from src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemContainer.java rename to src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/GhostItemMenu.java index 8e55be9..bd838cf 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemContainer.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/GhostItemMenu.java @@ -1,4 +1,4 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.container; +package nl.requios.effortlessbuilding.create.foundation.gui.menu; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Inventory; @@ -10,15 +10,15 @@ import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; -public abstract class GhostItemContainer extends ContainerBase implements IClearableContainer { +public abstract class GhostItemMenu extends MenuBase implements IClearableMenu { public ItemStackHandler ghostInventory; - protected GhostItemContainer(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + protected GhostItemMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { super(type, id, inv, extraData); } - protected GhostItemContainer(MenuType type, int id, Inventory inv, T contentHolder) { + protected GhostItemMenu(MenuType type, int id, Inventory inv, T contentHolder) { super(type, id, inv, contentHolder); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemSubmitPacket.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/GhostItemSubmitPacket.java similarity index 55% rename from src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemSubmitPacket.java rename to src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/GhostItemSubmitPacket.java index 001cab0..f377abf 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemSubmitPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/GhostItemSubmitPacket.java @@ -1,13 +1,12 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.container; +package nl.requios.effortlessbuilding.create.foundation.gui.menu; import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase; + import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent.Context; -import java.util.function.Supplier; - public class GhostItemSubmitPacket extends SimplePacketBase { private final ItemStack item; @@ -30,23 +29,18 @@ public class GhostItemSubmitPacket extends SimplePacketBase { } @Override - public void handle(Supplier context) { - context.get() - .enqueueWork(() -> { - ServerPlayer player = context.get() - .getSender(); - if (player == null) - return; + public boolean handle(Context context) { + context.enqueueWork(() -> { + ServerPlayer player = context.getSender(); + if (player == null) + return; - if (player.containerMenu instanceof GhostItemContainer) { - GhostItemContainer c = (GhostItemContainer) player.containerMenu; - c.ghostInventory.setStackInSlot(slot, item); - c.getSlot(36 + slot).setChanged(); - } - - }); - context.get() - .setPacketHandled(true); + if (player.containerMenu instanceof GhostItemMenu menu) { + menu.ghostInventory.setStackInSlot(slot, item); + menu.getSlot(36 + slot).setChanged(); + } + }); + return true; } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/IClearableMenu.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/IClearableMenu.java new file mode 100644 index 0000000..2ed30e7 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/IClearableMenu.java @@ -0,0 +1,13 @@ +package nl.requios.effortlessbuilding.create.foundation.gui.menu; + +import nl.requios.effortlessbuilding.create.AllPackets; + +public interface IClearableMenu { + + default void sendClearPacket() { +// AllPackets.getChannel().sendToServer(new ClearMenuPacket()); + } + + public void clearContents(); + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ContainerBase.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/MenuBase.java similarity index 85% rename from src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ContainerBase.java rename to src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/MenuBase.java index 7ebd776..5a601a2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ContainerBase.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/menu/MenuBase.java @@ -1,6 +1,7 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.container; +package nl.requios.effortlessbuilding.create.foundation.gui.menu; import nl.requios.effortlessbuilding.create.foundation.utility.IInteractionChecker; + import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -10,18 +11,18 @@ import net.minecraft.world.inventory.Slot; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public abstract class ContainerBase extends AbstractContainerMenu { +public abstract class MenuBase extends AbstractContainerMenu { public Player player; public Inventory playerInventory; public T contentHolder; - protected ContainerBase(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + protected MenuBase(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { super(type, id); init(inv, createOnClient(extraData)); } - protected ContainerBase(MenuType type, int id, Inventory inv, T contentHolder) { + protected MenuBase(MenuType type, int id, Inventory inv, T contentHolder) { super(type, id); init(inv, contentHolder); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/AbstractSimiWidget.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/AbstractSimiWidget.java index 237559b..720fb69 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/AbstractSimiWidget.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/AbstractSimiWidget.java @@ -1,26 +1,31 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener; -import nl.requios.effortlessbuilding.create.foundation.utility.Components; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.network.chat.Component; - -import javax.annotation.Nonnull; import java.util.LinkedList; import java.util.List; import java.util.function.BiConsumer; +import javax.annotation.Nonnull; + +import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner; +import net.minecraft.client.gui.screens.inventory.tooltip.DefaultTooltipPositioner; +import net.minecraft.network.chat.Component; + public abstract class AbstractSimiWidget extends AbstractWidget implements TickableGuiEventListener { public static final int HEADER_RGB = 0x5391E1; - + public static final int HINT_RGB = 0x96B7E0; + protected float z; protected boolean wasHovered = false; protected List toolTip = new LinkedList<>(); protected BiConsumer onClick = (_$, _$$) -> {}; - + public int lockedTooltipX = -1; public int lockedTooltipY = -1; @@ -35,6 +40,11 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka protected AbstractSimiWidget(int x, int y, int width, int height, Component message) { super(x, y, width, height, message); } + + @Override + protected ClientTooltipPositioner createTooltipPositioner() { + return DefaultTooltipPositioner.INSTANCE; + } public T withCallback(BiConsumer cb) { this.onClick = cb; @@ -60,26 +70,22 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka public void tick() {} @Override - public void render(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - if (visible) { - isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; - beforeRender(ms, mouseX, mouseY, partialTicks); - renderButton(ms, mouseX, mouseY, partialTicks); - afterRender(ms, mouseX, mouseY, partialTicks); - wasHovered = isHoveredOrFocused(); - } + public void renderWidget(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + beforeRender(graphics, mouseX, mouseY, partialTicks); + renderButton(graphics, mouseX, mouseY, partialTicks); + afterRender(graphics, mouseX, mouseY, partialTicks); + wasHovered = isHoveredOrFocused(); } - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - ms.pushPose(); + protected void beforeRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + graphics.pose().pushPose(); } - @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { + protected void renderButton(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { } - protected void afterRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - ms.popPose(); + protected void afterRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + graphics.pose().popPose(); } public void runCallback(double mouseX, double mouseY) { @@ -92,7 +98,7 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka } @Override - public void updateNarration(NarrationElementOutput pNarrationElementOutput) { + public void updateWidgetNarration(NarrationElementOutput pNarrationElementOutput) { defaultButtonNarrationText(pNarrationElementOutput); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/BoxWidget.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/BoxWidget.java index 1456d10..b7b5cf5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/BoxWidget.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/BoxWidget.java @@ -1,6 +1,7 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import com.mojang.blaze3d.vertex.PoseStack; +import java.util.function.Function; + import nl.requios.effortlessbuilding.create.foundation.gui.Theme; import nl.requios.effortlessbuilding.create.foundation.gui.Theme.Key; import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper; @@ -10,8 +11,7 @@ import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Couple; import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat; -import javax.annotation.Nonnull; -import java.util.function.Function; +import net.minecraft.client.gui.GuiGraphics; public class BoxWidget extends ElementWidget { @@ -98,8 +98,8 @@ public class BoxWidget extends ElementWidget { } @Override - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.beforeRender(ms, mouseX, mouseY, partialTicks); + protected void beforeRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.beforeRender(graphics, mouseX, mouseY, partialTicks); if (isHovered != wasHovered) { startGradientAnimation( @@ -121,7 +121,7 @@ public class BoxWidget extends ElementWidget { } @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { + public void renderButton(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { float fadeValue = fade.getValue(partialTicks); if (fadeValue < .1f) return; @@ -129,11 +129,11 @@ public class BoxWidget extends ElementWidget { box.withAlpha(fadeValue); box.withBackground(customBackground != null ? customBackground : Theme.c(Theme.Key.PONDER_BACKGROUND_TRANSPARENT)) .gradientBorder(gradientColor1, gradientColor2) - .at(x, y, z) + .at(getX(), getY(), z) .withBounds(width, height) - .render(ms); + .render(graphics); - super.renderButton(ms, mouseX, mouseY, partialTicks); + super.renderButton(graphics, mouseX, mouseY, partialTicks); wasHovered = isHovered; } @@ -146,7 +146,7 @@ public class BoxWidget extends ElementWidget { float padX = 2 + paddingX; float padY = 2 + paddingY; - return x - padX <= mX && y - padY <= mY && mX < x + padX + width && mY < y + padY + height; + return getX() - padX <= mX && getY() - padY <= mY && mX < getX() + padX + width && mY < getY() + padY + height; } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ElementWidget.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ElementWidget.java index 597f5da..09f769c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ElementWidget.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ElementWidget.java @@ -1,13 +1,14 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; + import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.foundation.gui.element.RenderElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat; -import javax.annotation.Nonnull; -import java.util.function.Consumer; -import java.util.function.UnaryOperator; +import net.minecraft.client.gui.GuiGraphics; public class ElementWidget extends AbstractSimiWidget { @@ -117,21 +118,22 @@ public class ElementWidget extends AbstractSimiWidget { } @Override - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.beforeRender(ms, mouseX, mouseY, partialTicks); + protected void beforeRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.beforeRender(graphics, mouseX, mouseY, partialTicks); isHovered = isMouseOver(mouseX, mouseY); float fadeValue = fade.getValue(partialTicks); element.withAlpha(fadeValue); if (fadeValue < 1) { - ms.translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0); + graphics.pose().translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0); } } @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { + public void renderButton(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + PoseStack ms = graphics.pose(); ms.pushPose(); - ms.translate(x + paddingX, y + paddingY, z); + ms.translate(getX() + paddingX, getY() + paddingY, z); float innerWidth = width - 2 * paddingX; float innerHeight = height - 2 * paddingY; float eX = element.getX(), eY = element.getY(); @@ -143,7 +145,7 @@ public class ElementWidget extends AbstractSimiWidget { innerWidth /= xScale; innerHeight /= yScale; } - element.withBounds((int) innerWidth, (int) innerHeight).render(ms); + element.withBounds((int) innerWidth, (int) innerHeight).render(graphics); ms.popPose(); if (rescaleElement) { element.at(eX, eY); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/IconButton.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/IconButton.java index 86e3d98..8ae0c12 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/IconButton.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/IconButton.java @@ -1,12 +1,11 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; -import net.minecraft.network.chat.Component; -import javax.annotation.Nonnull; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; public class IconButton extends AbstractSimiWidget { @@ -22,22 +21,21 @@ public class IconButton extends AbstractSimiWidget { } @Override - public void renderButton(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + public void renderButton(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { if (visible) { - isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; + isHovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + width && mouseY < getY() + height; AllGuiTextures button = !active ? AllGuiTextures.BUTTON_DOWN - : isHoveredOrFocused() ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON; + : isMouseOver(mouseX, mouseY) ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - drawBg(matrixStack, button); - icon.render(matrixStack, x + 1, y + 1); + drawBg(graphics, button); + icon.render(graphics, getX() + 1, getY() + 1); } } - protected void drawBg(PoseStack matrixStack, AllGuiTextures button) { - AllGuiTextures.BUTTON.bind(); - blit(matrixStack, x, y, button.startX, button.startY, button.width, button.height); + protected void drawBg(GuiGraphics graphics, AllGuiTextures button) { + graphics.blit(button.location, getX(), getY(), button.startX, button.startY, button.width, button.height); } public void setToolTip(Component text) { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Indicator.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Indicator.java index c564910..1b7f952 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Indicator.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Indicator.java @@ -1,11 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; -import net.minecraft.network.chat.Component; -import javax.annotation.Nonnull; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; public class Indicator extends AbstractSimiWidget { @@ -13,12 +12,12 @@ public class Indicator extends AbstractSimiWidget { public Indicator(int x, int y, Component tooltip) { super(x, y, AllGuiTextures.INDICATOR.width, AllGuiTextures.INDICATOR.height); - this.toolTip = ImmutableList.of(tooltip); + this.toolTip = toolTip.isEmpty() ? ImmutableList.of() : ImmutableList.of(tooltip); this.state = State.OFF; } @Override - public void render(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks ) { + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks ) { if (!visible) return; AllGuiTextures toDraw; @@ -30,7 +29,7 @@ public class Indicator extends AbstractSimiWidget { case GREEN: toDraw = AllGuiTextures.INDICATOR_GREEN; break; default: toDraw = AllGuiTextures.INDICATOR; break; } - toDraw.render(matrixStack, x, y, this); + toDraw.render(graphics, getX(), getY()); } public enum State { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Label.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Label.java index f220dfd..2f91b3b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Label.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Label.java @@ -1,15 +1,16 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; +import javax.annotation.Nonnull; + import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import nl.requios.effortlessbuilding.create.foundation.utility.Components; + import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import javax.annotation.Nonnull; - public class Label extends AbstractSimiWidget { public Component text; @@ -44,12 +45,12 @@ public class Label extends AbstractSimiWidget { public void setTextAndTrim(Component newText, boolean trimFront, int maxWidthPx) { Font fontRenderer = Minecraft.getInstance().font; - + if (fontRenderer.width(newText) <= maxWidthPx) { text = newText; return; } - + String trim = "..."; int trimWidth = fontRenderer.width(trim); @@ -70,7 +71,7 @@ public class Label extends AbstractSimiWidget { } @Override - public void renderButton(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + protected void renderButton(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { if (text == null || text.getString().isEmpty()) return; @@ -78,11 +79,8 @@ public class Label extends AbstractSimiWidget { MutableComponent copy = text.plainCopy(); if (suffix != null && !suffix.isEmpty()) copy.append(suffix); - - if (hasShadow) - font.drawShadow(matrixStack, copy, x, y, color); - else - font.draw(matrixStack, copy, x, y, color); + + graphics.drawString(font, copy, getX(), getY(), color, hasShadow); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ScrollInput.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ScrollInput.java index bb7e674..8a980d7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ScrollInput.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ScrollInput.java @@ -1,18 +1,20 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import nl.requios.effortlessbuilding.create.AllKeys; -//import nl.requios.effortlessbuilding.create.AllSoundEvents; -import nl.requios.effortlessbuilding.create.foundation.utility.Components; -import nl.requios.effortlessbuilding.create.foundation.utility.Lang; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -//import net.minecraft.client.resources.sounds.SimpleSoundInstance; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; - import java.util.function.Consumer; import java.util.function.Function; +import nl.requios.effortlessbuilding.create.AllKeys; +import nl.requios.effortlessbuilding.create.AllSoundEvents; +import nl.requios.effortlessbuilding.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour.StepContext; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; +import nl.requios.effortlessbuilding.create.foundation.utility.Lang; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + public class ScrollInput extends AbstractSimiWidget { protected Consumer onScroll; @@ -20,8 +22,10 @@ public class ScrollInput extends AbstractSimiWidget { protected Component title = Lang.translateDirect("gui.scrollInput.defaultTitle"); protected final Component scrollToModify = Lang.translateDirect("gui.scrollInput.scrollToModify"); protected final Component shiftScrollsFaster = Lang.translateDirect("gui.scrollInput.shiftScrollsFaster"); + protected Component hint = null; protected Label displayLabel; protected boolean inverted; + protected boolean soundPlayed; protected Function formatter; protected int min, max; @@ -36,6 +40,7 @@ public class ScrollInput extends AbstractSimiWidget { shiftStep = 5; step = standardStep(); formatter = i -> Components.literal(String.valueOf(i)); + soundPlayed = false; } public Function standardStep() { @@ -74,6 +79,12 @@ public class ScrollInput extends AbstractSimiWidget { return this; } + public ScrollInput addHint(MutableComponent hint) { + this.hint = hint; + updateTooltip(); + return this; + } + public ScrollInput withStepFunction(Function step) { this.step = step; return this; @@ -85,6 +96,12 @@ public class ScrollInput extends AbstractSimiWidget { writeToLabel(); return this; } + + @Override + public void tick() { + super.tick(); + soundPlayed = false; + } public int getState() { return state; @@ -106,8 +123,6 @@ public class ScrollInput extends AbstractSimiWidget { @Override public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - if (!this.visible || !this.isHovered) return false; //Added - if (inverted) delta *= -1; @@ -128,12 +143,16 @@ public class ScrollInput extends AbstractSimiWidget { clampState(); if (priorState != state) { -// Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(AllSoundEvents.SCROLL_VALUE.getMainEvent(), 1.5f + 0.1f * (state-min)/(max-min))); +// if (!soundPlayed) +// Minecraft.getInstance() +// .getSoundManager() +// .play(SimpleSoundInstance.forUI(AllSoundEvents.SCROLL_VALUE.getMainEvent(), +// 1.5f + 0.1f * (state - min) / (max - min))); +// soundPlayed = true; onChanged(); } -// return priorState != state; - return true; //Changed + return priorState != state; } protected void clampState() { @@ -161,6 +180,9 @@ public class ScrollInput extends AbstractSimiWidget { return; toolTip.add(title.plainCopy() .withStyle(s -> s.withColor(HEADER_RGB))); + if (hint != null) + toolTip.add(hint.plainCopy() + .withStyle(s -> s.withColor(HINT_RGB))); toolTip.add(scrollToModify.plainCopy() .withStyle(ChatFormatting.ITALIC, ChatFormatting.DARK_GRAY)); toolTip.add(shiftScrollsFaster.plainCopy() diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/SelectionScrollInput.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/SelectionScrollInput.java index b495563..0a9c923 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/SelectionScrollInput.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/SelectionScrollInput.java @@ -1,14 +1,15 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import nl.requios.effortlessbuilding.create.foundation.utility.Components; -import nl.requios.effortlessbuilding.create.foundation.utility.Lang; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; - import java.util.ArrayList; import java.util.List; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; +import nl.requios.effortlessbuilding.create.foundation.utility.Lang; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + public class SelectionScrollInput extends ScrollInput { private final MutableComponent scrollToSelect = Lang.translateDirect("gui.scrollInput.scrollToSelect"); @@ -42,7 +43,8 @@ public class SelectionScrollInput extends ScrollInput { if (this.min + 1 == min) min--; if (min > this.min) - toolTip.add(Components.literal("> ...").withStyle(ChatFormatting.GRAY)); + toolTip.add(Components.literal("> ...") + .withStyle(ChatFormatting.GRAY)); if (this.max - 1 == max) max++; for (int i = min; i < max; i++) { @@ -58,8 +60,12 @@ public class SelectionScrollInput extends ScrollInput { .withStyle(ChatFormatting.GRAY)); } if (max < this.max) - toolTip.add(Components.literal("> ...").withStyle(ChatFormatting.GRAY)); + toolTip.add(Components.literal("> ...") + .withStyle(ChatFormatting.GRAY)); + if (hint != null) + toolTip.add(hint.plainCopy() + .withStyle(s -> s.withColor(HINT_RGB))); toolTip.add(scrollToSelect.plainCopy() .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/TooltipArea.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/TooltipArea.java index 7bcdf26..e3dcd78 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/TooltipArea.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/TooltipArea.java @@ -1,10 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.network.chat.Component; - import java.util.List; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; + public class TooltipArea extends AbstractSimiWidget { public TooltipArea(int x, int y, int width, int height) { @@ -12,9 +12,9 @@ public class TooltipArea extends AbstractSimiWidget { } @Override - public void renderButton(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { if (visible) - isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; + isHovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + width && mouseY < getY() + height; } public TooltipArea withTooltip(List tooltip) { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemDescription.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemDescription.java index f3be447..1979cd1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemDescription.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemDescription.java @@ -1,182 +1,253 @@ package nl.requios.effortlessbuilding.create.foundation.item; -import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import nl.requios.effortlessbuilding.create.foundation.utility.Components; -import nl.requios.effortlessbuilding.create.foundation.utility.Lang; +import static net.minecraft.ChatFormatting.DARK_GRAY; +import static net.minecraft.ChatFormatting.GRAY; +import static net.minecraft.ChatFormatting.WHITE; import java.util.ArrayList; import java.util.Arrays; +import java.util.IdentityHashMap; import java.util.List; +import java.util.Map; +import java.util.function.Supplier; -import static net.minecraft.ChatFormatting.*; -import static nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper.cutStringTextComponent; -import static nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper.cutTextComponent; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.Nullable; -public class ItemDescription { +import com.google.common.collect.ImmutableList; +import nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper.Palette; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; +import nl.requios.effortlessbuilding.create.foundation.utility.Lang; - public static final ItemDescription MISSING = new ItemDescription(null); - public static Component trim = Components.literal(" ").withStyle(WHITE, STRIKETHROUGH); +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; - public enum Palette { +public record ItemDescription(ImmutableList lines, ImmutableList linesOnShift, ImmutableList linesOnCtrl) { + private static final Map> CUSTOM_TOOLTIP_KEYS = new IdentityHashMap<>(); - Blue(BLUE, AQUA), - Green(DARK_GREEN, GREEN), - Yellow(GOLD, YELLOW), - Red(DARK_RED, RED), - Purple(DARK_PURPLE, LIGHT_PURPLE), - Gray(DARK_GRAY, GRAY), + @Nullable + public static ItemDescription create(Item item, Palette palette) { + return create(getTooltipTranslationKey(item), palette); + } - ; - - private Palette(ChatFormatting primary, ChatFormatting highlight) { - color = primary; - hColor = highlight; + @Nullable + public static ItemDescription create(String translationKey, Palette palette) { + if (!canFillBuilder(translationKey)) { + return null; } - public ChatFormatting color; - public ChatFormatting hColor; + Builder builder = new Builder(palette); + fillBuilder(builder, translationKey); + return builder.build(); } - private List lines; - private List linesOnShift; - private List linesOnCtrl; - private Palette palette; - - public ItemDescription(Palette palette) { - this.palette = palette; - lines = new ArrayList<>(); - linesOnShift = new ArrayList<>(); - linesOnCtrl = new ArrayList<>(); + public static boolean canFillBuilder(String translationKey) { + return I18n.exists(translationKey); } - public ItemDescription withSummary(Component summary) { - addStrings(linesOnShift, cutTextComponent(summary, palette.color, palette.hColor)); - return this; - } - - public static String makeProgressBar(int length, int filledLength) { - String bar = " "; - int emptySpaces = length - filledLength; - for (int i = 0; i < filledLength; i++) - bar += "\u2588"; - for (int i = 0; i < emptySpaces; i++) - bar += "\u2592"; - return bar + " "; - } - - public ItemDescription withBehaviour(String condition, String behaviour) { - add(linesOnShift, Components.literal(condition).withStyle(GRAY)); - addStrings(linesOnShift, cutStringTextComponent(behaviour, palette.color, palette.hColor, 1)); - return this; - } - - public ItemDescription withControl(String condition, String action) { - add(linesOnCtrl, Components.literal(condition).withStyle(GRAY)); - addStrings(linesOnCtrl, cutStringTextComponent(action, palette.color, palette.hColor, 1)); - return this; - } - - public ItemDescription createTabs() { - boolean hasDescription = !linesOnShift.isEmpty(); - boolean hasControls = !linesOnCtrl.isEmpty(); - - if (hasDescription || hasControls) { - String[] holdDesc = Lang.translateDirect("tooltip.holdForDescription", "$") - .getString() - .split("\\$"); - String[] holdCtrl = Lang.translateDirect("tooltip.holdForControls", "$") - .getString() - .split("\\$"); - MutableComponent keyShift = Lang.translateDirect("tooltip.keyShift"); - MutableComponent keyCtrl = Lang.translateDirect("tooltip.keyCtrl"); - for (List list : Arrays.asList(lines, linesOnShift, linesOnCtrl)) { - boolean shift = list == linesOnShift; - boolean ctrl = list == linesOnCtrl; - - if (holdDesc.length != 2 || holdCtrl.length != 2) { - list.add(0, Components.literal("Invalid lang formatting!")); - continue; - } - - if (hasControls) { - MutableComponent tabBuilder = Components.empty(); - tabBuilder.append(Components.literal(holdCtrl[0]).withStyle(DARK_GRAY)); - tabBuilder.append(keyCtrl.plainCopy() - .withStyle(ctrl ? WHITE : GRAY)); - tabBuilder.append(Components.literal(holdCtrl[1]).withStyle(DARK_GRAY)); - list.add(0, tabBuilder); - } - - if (hasDescription) { - MutableComponent tabBuilder = Components.empty(); - tabBuilder.append(Components.literal(holdDesc[0]).withStyle(DARK_GRAY)); - tabBuilder.append(keyShift.plainCopy() - .withStyle(shift ? WHITE : GRAY)); - tabBuilder.append(Components.literal(holdDesc[1]).withStyle(DARK_GRAY)); - list.add(0, tabBuilder); - } - - if (shift || ctrl) - list.add(hasDescription && hasControls ? 2 : 1, Components.immutableEmpty()); - } + public static void fillBuilder(Builder builder, String translationKey) { + // Summary + String summaryKey = translationKey + ".summary"; + if (I18n.exists(summaryKey)) { + builder.addSummary(I18n.get(summaryKey)); } - if (!hasDescription) - linesOnShift = lines; - if (!hasControls) - linesOnCtrl = lines; + // Behaviours + for (int i = 1; i < 100; i++) { + String conditionKey = translationKey + ".condition" + i; + String behaviourKey = translationKey + ".behaviour" + i; + if (!I18n.exists(conditionKey)) + break; + builder.addBehaviour(I18n.get(conditionKey), I18n.get(behaviourKey)); + } - return this; + // Actions + for (int i = 1; i < 100; i++) { + String controlKey = translationKey + ".control" + i; + String actionKey = translationKey + ".action" + i; + if (!I18n.exists(controlKey)) + break; + builder.addAction(I18n.get(controlKey), I18n.get(actionKey)); + } } - public static String hightlight(String s, Palette palette) { - return palette.hColor + s + palette.color; + public static void useKey(Item item, Supplier supplier) { + CUSTOM_TOOLTIP_KEYS.put(item, supplier); } - public static void addStrings(List infoList, List textLines) { - textLines.forEach(s -> add(infoList, s)); + public static void useKey(ItemLike item, String string) { + useKey(item.asItem(), () -> string); } - public static void add(List infoList, List textLines) { - infoList.addAll(textLines); + public static void referKey(ItemLike item, Supplier otherItem) { + useKey(item.asItem(), () -> otherItem.get() + .asItem() + .getDescriptionId()); } - public static void add(List infoList, Component line) { - infoList.add(line); + public static String getTooltipTranslationKey(Item item) { + if (CUSTOM_TOOLTIP_KEYS.containsKey(item)) { + return CUSTOM_TOOLTIP_KEYS.get(item).get() + ".tooltip"; + } + return item.getDescriptionId() + ".tooltip"; } - public Palette getPalette() { - return palette; - } - - public List addInformation(List tooltip) { + public ImmutableList getCurrentLines() { if (Screen.hasShiftDown()) { - tooltip.addAll(linesOnShift); - return tooltip; + return linesOnShift; + } else if (Screen.hasControlDown()) { + return linesOnCtrl; + } else { + return lines; + } + } + + public static class Builder { + protected final Palette palette; + protected final List summary = new ArrayList<>(); + protected final List> behaviours = new ArrayList<>(); + protected final List> actions = new ArrayList<>(); + + public Builder(Palette palette) { + this.palette = palette; } - if (Screen.hasControlDown()) { - tooltip.addAll(linesOnCtrl); - return tooltip; + public Builder addSummary(String summaryLine) { + summary.add(summaryLine); + return this; } - tooltip.addAll(lines); - return tooltip; + public Builder addBehaviour(String condition, String behaviour) { + behaviours.add(Pair.of(condition, behaviour)); + return this; + } + + public Builder addAction(String condition, String action) { + actions.add(Pair.of(condition, action)); + return this; + } + + public ItemDescription build() { + List lines = new ArrayList<>(); + List linesOnShift = new ArrayList<>(); + List linesOnCtrl = new ArrayList<>(); + + for (String summaryLine : summary) { + linesOnShift.addAll(TooltipHelper.cutStringTextComponent(summaryLine, palette)); + } + + if (!behaviours.isEmpty()) { + linesOnShift.add(Components.immutableEmpty()); + } + + for (Pair behaviourPair : behaviours) { + String condition = behaviourPair.getLeft(); + String behaviour = behaviourPair.getRight(); + linesOnShift.add(Components.literal(condition).withStyle(GRAY)); + linesOnShift.addAll(TooltipHelper.cutStringTextComponent(behaviour, palette.primary(), palette.highlight(), 1)); + } + + for (Pair actionPair : actions) { + String condition = actionPair.getLeft(); + String action = actionPair.getRight(); + linesOnCtrl.add(Components.literal(condition).withStyle(GRAY)); + linesOnCtrl.addAll(TooltipHelper.cutStringTextComponent(action, palette.primary(), palette.highlight(), 1)); + } + + boolean hasDescription = !linesOnShift.isEmpty(); + boolean hasControls = !linesOnCtrl.isEmpty(); + + if (hasDescription || hasControls) { + String[] holdDesc = Lang.translateDirect("tooltip.holdForDescription", "$") + .getString() + .split("\\$"); + String[] holdCtrl = Lang.translateDirect("tooltip.holdForControls", "$") + .getString() + .split("\\$"); + MutableComponent keyShift = Lang.translateDirect("tooltip.keyShift"); + MutableComponent keyCtrl = Lang.translateDirect("tooltip.keyCtrl"); + for (List list : Arrays.asList(lines, linesOnShift, linesOnCtrl)) { + boolean shift = list == linesOnShift; + boolean ctrl = list == linesOnCtrl; + + if (holdDesc.length != 2 || holdCtrl.length != 2) { + list.add(0, Components.literal("Invalid lang formatting!")); + continue; + } + + if (hasControls) { + MutableComponent tabBuilder = Components.empty(); + tabBuilder.append(Components.literal(holdCtrl[0]).withStyle(DARK_GRAY)); + tabBuilder.append(keyCtrl.plainCopy() + .withStyle(ctrl ? WHITE : GRAY)); + tabBuilder.append(Components.literal(holdCtrl[1]).withStyle(DARK_GRAY)); + list.add(0, tabBuilder); + } + + if (hasDescription) { + MutableComponent tabBuilder = Components.empty(); + tabBuilder.append(Components.literal(holdDesc[0]).withStyle(DARK_GRAY)); + tabBuilder.append(keyShift.plainCopy() + .withStyle(shift ? WHITE : GRAY)); + tabBuilder.append(Components.literal(holdDesc[1]).withStyle(DARK_GRAY)); + list.add(0, tabBuilder); + } + + if (shift || ctrl) + list.add(hasDescription && hasControls ? 2 : 1, Components.immutableEmpty()); + } + } + + if (!hasDescription) { + linesOnCtrl.clear(); + linesOnShift.addAll(lines); + } + if (!hasControls) { + linesOnCtrl.clear(); + linesOnCtrl.addAll(lines); + } + + return new ItemDescription(ImmutableList.copyOf(lines), ImmutableList.copyOf(linesOnShift), ImmutableList.copyOf(linesOnCtrl)); + } } - public List getLines() { - return lines; - } + public static class Modifier implements TooltipModifier { + protected final Item item; + protected final Palette palette; + protected String cachedLanguage; + protected ItemDescription description; - public List getLinesOnCtrl() { - return linesOnCtrl; - } + public Modifier(Item item, Palette palette) { + this.item = item; + this.palette = palette; + } - public List getLinesOnShift() { - return linesOnShift; - } + @Override + public void modify(ItemTooltipEvent context) { + if (checkLocale()) { + description = create(item, palette); + } + if (description == null) { + return; + } + context.getToolTip().addAll(1, description.getCurrentLines()); + } + protected boolean checkLocale() { + String currentLanguage = Minecraft.getInstance() + .getLanguageManager() + .getSelected(); + if (!currentLanguage.equals(cachedLanguage)) { + cachedLanguage = currentLanguage; + return true; + } + return false; + } + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemHelper.java index 74f3d58..64a7d9d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemHelper.java @@ -1,6 +1,16 @@ package nl.requios.effortlessbuilding.create.foundation.item; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.mutable.MutableInt; + import nl.requios.effortlessbuilding.create.foundation.utility.Pair; + import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.util.Mth; @@ -10,16 +20,17 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -import org.apache.commons.lang3.mutable.MutableInt; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; -import java.util.function.Predicate; public class ItemHelper { + public static boolean sameItem(ItemStack stack, ItemStack otherStack) { + return !otherStack.isEmpty() && stack.is(otherStack.getItem()); + } + + public static Predicate sameItemPredicate(ItemStack stack) { + return s -> sameItem(stack, s); + } + public static void dropContents(Level world, BlockPos pos, IItemHandler inv) { for (int slot = 0; slot < inv.getSlots(); slot++) Containers.dropItemStack(world, pos.getX(), pos.getY(), pos.getZ(), inv.getStackInSlot(slot)); @@ -122,7 +133,7 @@ public class ItemHelper { return true; if (stacks1.length == stacks2.length) { for (int i = 0; i < stacks1.length; i++) - if (!ItemStack.isSame(stacks1[i], stacks2[i])) + if (!ItemStack.isSameItem(stacks1[i], stacks2[i])) return false; return true; } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TagDependentIngredientItem.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TagDependentIngredientItem.java index 0e92452..c6e7327 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TagDependentIngredientItem.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TagDependentIngredientItem.java @@ -1,10 +1,7 @@ package nl.requios.effortlessbuilding.create.foundation.item; -import net.minecraft.core.NonNullList; import net.minecraft.tags.TagKey; -import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.tags.ITagManager; @@ -17,12 +14,6 @@ public class TagDependentIngredientItem extends Item { this.tag = tag; } - @Override - public void fillItemCategory(CreativeModeTab tab, NonNullList list) { - if (!shouldHide()) - super.fillItemCategory(tab, list); - } - public boolean shouldHide() { ITagManager tagManager = ForgeRegistries.ITEMS.tags(); return !tagManager.isKnownTagName(tag) || tagManager.getTag(tag).isEmpty(); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TooltipHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TooltipHelper.java index b05958a..c439de4 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TooltipHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TooltipHelper.java @@ -1,36 +1,28 @@ package nl.requios.effortlessbuilding.create.foundation.item; +import java.text.BreakIterator; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + import com.google.common.base.Strings; -import com.mojang.bridge.game.Language; -import nl.requios.effortlessbuilding.create.foundation.item.ItemDescription.Palette; +//import nl.requios.effortlessbuilding.create.content.equipment.goggles.IHaveGoggleInformation; import nl.requios.effortlessbuilding.create.foundation.utility.Components; import nl.requios.effortlessbuilding.create.foundation.utility.Couple; -import nl.requios.effortlessbuilding.create.foundation.utility.FontHelper; import nl.requios.effortlessbuilding.create.foundation.utility.Lang; + import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ItemLike; - -import java.text.BreakIterator; -import java.util.*; -import java.util.function.Supplier; +import net.minecraft.network.chat.Style; public class TooltipHelper { - public static final int maxWidthPerLine = 200; - public static final Map cachedTooltips = new HashMap<>(); - public static Language cachedLanguage; - private static boolean gogglesMode; - private static final Map> tooltipReferrals = new HashMap<>(); + public static final int MAX_WIDTH_PER_LINE = 200; - public static MutableComponent holdShift(Palette color, boolean highlighted) { + public static MutableComponent holdShift(Palette palette, boolean highlighted) { return Lang.translateDirect("tooltip.holdForDescription", Lang.translateDirect("tooltip.keyShift") .withStyle(ChatFormatting.GRAY)) .withStyle(ChatFormatting.DARK_GRAY); @@ -42,87 +34,64 @@ public class TooltipHelper { .append(Lang.translateDirect(hintKey + ".title")) .withStyle(ChatFormatting.GOLD)); Component hint = Lang.translateDirect(hintKey); - List cutComponent = TooltipHelper.cutTextComponent(hint, ChatFormatting.GRAY, ChatFormatting.WHITE); + List cutComponent = cutTextComponent(hint, Palette.GRAY_AND_WHITE); for (Component component : cutComponent) tooltip.add(spacing.plainCopy() .append(component)); } - public static void referTo(ItemLike item, Supplier itemWithTooltip) { - tooltipReferrals.put(item.asItem(), () -> itemWithTooltip.get() - .asItem() - .getDescriptionId()); + public static String makeProgressBar(int length, int filledLength) { + String bar = " "; + int emptySpaces = length - filledLength; + for (int i = 0; i < filledLength; i++) + bar += "\u2588"; + for (int i = 0; i < emptySpaces; i++) + bar += "\u2592"; + return bar + " "; } - public static void referTo(ItemLike item, String string) { - tooltipReferrals.put(item.asItem(), () -> string); + public static Style styleFromColor(ChatFormatting color) { + return Style.EMPTY.applyFormat(color); + } + + public static Style styleFromColor(int hex) { + return Style.EMPTY.withColor(hex); } - @Deprecated - public static List cutString(Component s, ChatFormatting defaultColor, ChatFormatting highlightColor) { - return cutString(s.getString(), defaultColor, highlightColor, 0); + public static List cutStringTextComponent(String s, Palette palette) { + return cutTextComponent(Components.literal(s), palette); } - @Deprecated - public static List cutString(String s, ChatFormatting defaultColor, ChatFormatting highlightColor, - int indent) { - // Apply markup - String markedUp = s.replaceAll("_([^_]+)_", highlightColor + "$1" + defaultColor); - - // Split words - List words = new LinkedList<>(); - BreakIterator iterator = BreakIterator.getLineInstance(Minecraft.getInstance().getLocale()); - iterator.setText(markedUp); - int start = iterator.first(); - for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) { - String word = markedUp.substring(start, end); - words.add(word); - } - - Font font = Minecraft.getInstance().font; - List lines = FontHelper.cutString(font, markedUp, maxWidthPerLine); - - // Format - String lineStart = Strings.repeat(" ", indent); - List formattedLines = new ArrayList<>(lines.size()); - String format = defaultColor.toString(); - for (String line : lines) { - String formattedLine = format + lineStart + line; - formattedLines.add(formattedLine); -// format = TextFormatting.getFormatString(formattedLine); - } - return formattedLines; + public static List cutTextComponent(Component c, Palette palette) { + return cutTextComponent(c, palette.primary(), palette.highlight()); } - public static List cutStringTextComponent(String c, ChatFormatting defaultColor, - ChatFormatting highlightColor) { - return cutTextComponent(Components.literal(c), defaultColor, highlightColor, 0); + public static List cutStringTextComponent(String s, Style primaryStyle, + Style highlightStyle) { + return cutTextComponent(Components.literal(s), primaryStyle, highlightStyle); } - public static List cutTextComponent(Component c, ChatFormatting defaultColor, - ChatFormatting highlightColor) { - return cutTextComponent(c, defaultColor, highlightColor, 0); + public static List cutTextComponent(Component c, Style primaryStyle, + Style highlightStyle) { + return cutTextComponent(c, primaryStyle, highlightStyle, 0); } - public static List cutStringTextComponent(String c, ChatFormatting defaultColor, - ChatFormatting highlightColor, int indent) { - return cutTextComponent(Components.literal(c), defaultColor, highlightColor, indent); + public static List cutStringTextComponent(String c, Style primaryStyle, + Style highlightStyle, int indent) { + return cutTextComponent(Components.literal(c), primaryStyle, highlightStyle, indent); } - public static List cutTextComponent(Component c, ChatFormatting defaultColor, - ChatFormatting highlightColor, int indent) { + public static List cutTextComponent(Component c, Style primaryStyle, + Style highlightStyle, int indent) { String s = c.getString(); - // Apply markup - String markedUp = s;// .replaceAll("_([^_]+)_", highlightColor + "$1" + defaultColor); - // Split words List words = new LinkedList<>(); BreakIterator iterator = BreakIterator.getLineInstance(Minecraft.getInstance().getLocale()); - iterator.setText(markedUp); + iterator.setText(s); int start = iterator.first(); for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) { - String word = markedUp.substring(start, end); + String word = s.substring(start, end); words.add(word); } @@ -133,7 +102,7 @@ public class TooltipHelper { int width = 0; for (String word : words) { int newWidth = font.width(word.replaceAll("_", "")); - if (width + newWidth > maxWidthPerLine) { + if (width + newWidth > MAX_WIDTH_PER_LINE) { if (width > 0) { String line = currentLine.toString(); lines.add(line); @@ -153,16 +122,16 @@ public class TooltipHelper { // Format MutableComponent lineStart = Components.literal(Strings.repeat(" ", indent)); - lineStart.withStyle(defaultColor); + lineStart.withStyle(primaryStyle); List formattedLines = new ArrayList<>(lines.size()); - Couple f = Couple.create(highlightColor, defaultColor); + Couple