From 8b5c619d7afae2f2856bde4575badc64cc173dfe Mon Sep 17 00:00:00 2001 From: Albazavr Date: Wed, 24 Jun 2026 15:53:07 +0300 Subject: [PATCH 1/5] Overlays port --- .../client/overlay/ItemDisplayOverlay.java | 23 ++++----- .../client/overlay/PortalOverlay.java | 33 ------------- .../overlay/QuestingRamIndicatorOverlay.java | 18 +++---- .../client/overlay/ShieldOverlay.java | 7 +-- .../client/overlay/display/ClockDisplay.java | 22 +++++---- .../client/overlay/display/ItemDisplay.java | 6 +-- .../client/overlay/display/MapDisplay.java | 47 ++++++++++++------- .../overlay/display/MoonDialDisplay.java | 28 ++++++----- .../overlay/display/SimpleTextDisplay.java | 6 +-- 9 files changed, 85 insertions(+), 105 deletions(-) delete mode 100644 src/main/java/twilightforest/client/overlay/PortalOverlay.java diff --git a/src/main/java/twilightforest/client/overlay/ItemDisplayOverlay.java b/src/main/java/twilightforest/client/overlay/ItemDisplayOverlay.java index 25e82fc771..54875b798f 100644 --- a/src/main/java/twilightforest/client/overlay/ItemDisplayOverlay.java +++ b/src/main/java/twilightforest/client/overlay/ItemDisplayOverlay.java @@ -3,11 +3,12 @@ import com.mojang.blaze3d.platform.Window; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; import twilightforest.client.overlay.display.ItemDisplay; import twilightforest.components.item.ItemDisplayContents; import twilightforest.config.TFConfig; @@ -21,7 +22,7 @@ import java.util.List; public class ItemDisplayOverlay { - public static void render(GuiGraphics graphics, Minecraft minecraft, Window window, Gui gui, Player player) { + public static void render(GuiGraphicsExtractor graphics, Minecraft minecraft, Window window, Gui gui, Player player) { if (player == null || gui.getDebugOverlay().showDebugScreen() || minecraft.options.hideGui) return; @@ -41,26 +42,26 @@ public static void render(GuiGraphics graphics, Minecraft minecraft, Window wind renderHolders(graphics, minecraft, gui, player, typesToRender, widest); } - private static void renderHolders(GuiGraphics graphics, Minecraft minecraft, Gui gui, Player player, List typesToRender, int widest) { - graphics.pose().pushPose(); - graphics.pose().translate(TFConfig.itemDisplayXOffs, TFConfig.itemDisplayYOffs, 0.0D); - graphics.pose().scale((float) TFConfig.itemDisplayScale, (float) TFConfig.itemDisplayScale, (float) TFConfig.itemDisplayScale); + private static void renderHolders(GuiGraphicsExtractor graphics, Minecraft minecraft, Gui gui, Player player, List typesToRender, int widest) { + graphics.pose().pushMatrix(); + graphics.pose().translate(TFConfig.itemDisplayXOffs, TFConfig.itemDisplayYOffs); + graphics.pose().scale((float) TFConfig.itemDisplayScale, (float) TFConfig.itemDisplayScale); typesToRender.sort(Comparator.comparing(holder -> holder.display().displayPosition())); for (DisplayHolder holder : typesToRender) { - graphics.pose().pushPose(); + graphics.pose().pushMatrix(); holder.display().render(holder.stack(), graphics, minecraft, gui, player, widest); //debug fill to see widget sizes //graphics.fill(holder.bounds().startX(), holder.bounds().startY(), holder.bounds().startX() + holder.bounds().width(), holder.bounds().startY() + holder.bounds().height(), 0x80FF0000); - graphics.pose().popPose(); - graphics.pose().translate(0.0F, holder.bounds().height(), 0.0F); + graphics.pose().popMatrix(); + graphics.pose().translate(0.0F, holder.bounds().height()); } - graphics.pose().popPose(); + graphics.pose().pushMatrix(); } private static int fillDisplayHolders(List typesToRender, ItemDisplayContents contents, Minecraft minecraft, Gui gui, Player player) { int widest = 0; - NonNullList items = contents.items(); + NonNullList<@NotNull ItemStack> items = contents.items(); int slots = Math.min(ItemDisplayContents.LAYOUT.size(), items.size()); int activeMapSlot = contents.findActiveMapSlot(); diff --git a/src/main/java/twilightforest/client/overlay/PortalOverlay.java b/src/main/java/twilightforest/client/overlay/PortalOverlay.java deleted file mode 100644 index a574da869f..0000000000 --- a/src/main/java/twilightforest/client/overlay/PortalOverlay.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.client.overlay; - -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.world.entity.player.Player; -import twilightforest.components.entity.TFPortalAttachment; -import twilightforest.init.TFBlocks; -import twilightforest.init.TFDataAttachments; - -public class PortalOverlay { - - public static void render(GuiGraphics graphics, Minecraft minecraft, Player player) { - Window window = minecraft.getWindow(); - if (player != null) { - TFPortalAttachment portal = player.getData(TFDataAttachments.TF_PORTAL_COOLDOWN); - if (portal.getPortalTimer() > 0) { - RenderSystem.disableDepthTest(); - RenderSystem.depthMask(false); - RenderSystem.enableBlend(); - graphics.setColor(1.0F, 1.0F, 1.0F, (float) portal.getPortalTimer() / (float) TFPortalAttachment.MAX_TICKS); - TextureAtlasSprite textureatlassprite = minecraft.getBlockRenderer().getBlockModelShaper().getParticleIcon(TFBlocks.TWILIGHT_PORTAL.get().defaultBlockState()); - graphics.blit(0, 0, -90, window.getGuiScaledWidth(), window.getGuiScaledHeight(), textureatlassprite); - RenderSystem.disableBlend(); - RenderSystem.depthMask(true); - RenderSystem.enableDepthTest(); - graphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); - } - } - } -} diff --git a/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java b/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java index 23d90fdadc..a406da316a 100644 --- a/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java +++ b/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java @@ -1,10 +1,9 @@ package twilightforest.client.overlay; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -17,31 +16,26 @@ import twilightforest.entity.passive.quest.ram.QuestingRamCurrentContext; public class QuestingRamIndicatorOverlay { - private static final Identifier QUESTING_RAM_CHECK_SPRITE = TwilightForestMod.prefix("questing_ram_check"); private static final Identifier QUESTING_RAM_X_SPRITE = TwilightForestMod.prefix("questing_ram_x"); @Autowired(dist = Dist.CLIENT) private static QuestingRamCurrentContext questingRamCurrentContext; - public static void render(Minecraft minecraft, GuiGraphics graphics, Gui gui, Player player) { + public static void render(Minecraft minecraft, GuiGraphicsExtractor graphics, Gui gui, Player player) { if (player != null && !minecraft.options.hideGui && TFConfig.showQuestRamCrosshairIndicator) { if (minecraft.options.getCameraType().isFirstPerson() && (minecraft.gameMode.getPlayerMode() != GameType.SPECTATOR || gui.canRenderCrosshairForSpectator(minecraft.hitResult)) && minecraft.crosshairPickEntity instanceof QuestRam ram) { - ItemStack stack = player.getInventory().getItem(player.getInventory().selected); + ItemStack stack = player.getInventory().getItem(player.getInventory().getSelectedSlot()); if (!stack.isEmpty()) { for (var questEntry : questingRamCurrentContext.getContext().questItems().entrySet()) { if (questEntry.getValue().test(stack)) { - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); int j = ((graphics.guiHeight() - 1) / 2) - 11; int k = ((graphics.guiHeight() - 1) / 2) - 3; if (!ram.isColorPresent(questEntry.getKey())) { - graphics.blitSprite(QUESTING_RAM_X_SPRITE, k, j, 7, 7); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, QUESTING_RAM_X_SPRITE, k, j, 7, 7); } else { - graphics.blitSprite(QUESTING_RAM_CHECK_SPRITE, k, j, 7, 7); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, QUESTING_RAM_CHECK_SPRITE, k, j, 7, 7); } - RenderSystem.defaultBlendFunc(); - RenderSystem.disableBlend(); break; } } diff --git a/src/main/java/twilightforest/client/overlay/ShieldOverlay.java b/src/main/java/twilightforest/client/overlay/ShieldOverlay.java index 9a0ab7bb7a..4a8319d60f 100644 --- a/src/main/java/twilightforest/client/overlay/ShieldOverlay.java +++ b/src/main/java/twilightforest/client/overlay/ShieldOverlay.java @@ -2,7 +2,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; @@ -14,11 +15,11 @@ public class ShieldOverlay { private static final Identifier FORTIFICATION_SHIELD_SPRITE = TwilightForestMod.prefix("fortification_shield"); - public static void render(GuiGraphics graphics, Minecraft minecraft, Gui gui, @Nullable Player player) { + public static void render(GuiGraphicsExtractor graphics, Minecraft minecraft, Gui gui, @Nullable Player player) { if (player != null && !minecraft.options.hideGui && (minecraft.gameMode.canHurtPlayer() || TFConfig.showFortificationShieldIndicatorInCreative) && player.hasData(TFDataAttachments.FORTIFICATION_SHIELDS) && player.getData(TFDataAttachments.FORTIFICATION_SHIELDS).shieldsLeft() > 0 && TFConfig.showFortificationShieldIndicator) { int shieldCount = player.getData(TFDataAttachments.FORTIFICATION_SHIELDS).shieldsLeft(); for (int i = 0; i < Math.min(shieldCount, 10); i++) { - graphics.blitSprite(FORTIFICATION_SHIELD_SPRITE, graphics.guiWidth() / 2 - 91 + (i * 8), graphics.guiHeight() - gui.leftHeight, 9, 9); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, FORTIFICATION_SHIELD_SPRITE, graphics.guiWidth() / 2 - 91 + (i * 8), graphics.guiHeight() - gui.leftHeight, 9, 9); } gui.leftHeight += 10; } diff --git a/src/main/java/twilightforest/client/overlay/display/ClockDisplay.java b/src/main/java/twilightforest/client/overlay/display/ClockDisplay.java index 89d08e07a7..2e4d6200e8 100644 --- a/src/main/java/twilightforest/client/overlay/display/ClockDisplay.java +++ b/src/main/java/twilightforest/client/overlay/display/ClockDisplay.java @@ -2,7 +2,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; import net.minecraft.util.FormattedCharSequence; import net.minecraft.world.entity.player.Player; @@ -36,10 +36,10 @@ private static long getMinecraftClockTimeInTicks(long ticks) { } private static Component getGameTime(Level level, boolean use24HourFormat) { - if (!level.dimensionType().natural()) + if (level.dimensionType().hasFixedTime()) return Component.translatable("travellers_gear.modifier.twilightforest.item_display.clock.unknown"); - long rawTime = level.dimensionType().fixedTime().orElse(level.getDayTime()); + long rawTime = level.getOverworldClockTime(); long ticksOfDay = getMinecraftClockTimeInTicks(rawTime); long secondsOfDay = (ticksOfDay * REAL_LIFE_DAY_LENGTH_IN_SECONDS) / MINECRAFT_DAY_LENGTH_IN_TICKS; LocalTime localTime = LocalTime.ofSecondOfDay(secondsOfDay); @@ -47,17 +47,19 @@ private static Component getGameTime(Level level, boolean use24HourFormat) { } @Override - public void render(ItemStack item, GuiGraphics graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { + public void render(ItemStack item, GuiGraphicsExtractor graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { FormattedCharSequence formattedcharsequence = this.getText(minecraft).getVisualOrderText(); - if (minecraft.level.dimensionType().natural()) { - int k = this.getFrameForTime(minecraft.level.dimensionType().fixedTime().orElse(minecraft.level.getDayTime())).frame; + boolean natural = !minecraft.level.dimensionType().hasFixedTime(); + if (natural) { + long timeValue = minecraft.level.getOverworldClockTime(); + int k = this.getFrameForTime(timeValue).frame; int xRow = k % 2; int yRow = k / 2 % 2; - float xMin = xRow * 8; - float yMin = yRow * 8; + int xMin = xRow * 8; + int yMin = yRow * 8; graphics.blit(TwilightForestMod.getGuiTexture("time.png"), (widestWidgetWidth / 2 - 5) - minecraft.font.width(formattedcharsequence) / 2, 0, xMin, yMin, 8, 8, 16, 16); } - graphics.drawString(minecraft.font, formattedcharsequence, Math.max(0, (widestWidgetWidth / 2 + 5) - minecraft.font.width(formattedcharsequence) / 2), 0, 0xFFFFFF); + graphics.text(minecraft.font, formattedcharsequence, Math.max(0, (widestWidgetWidth / 2 + 5) - minecraft.font.width(formattedcharsequence) / 2), 0, 0xFFFFFF); } private TimeFrame getFrameForTime(long dayTimeInTicks) { @@ -68,7 +70,7 @@ private TimeFrame getFrameForTime(long dayTimeInTicks) { @Override public Bounds getWidgetSize(ItemStack item, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { int textWidth = minecraft.font.width(this.getText(minecraft)); - boolean natural = minecraft.level.dimensionType().natural(); + boolean natural = minecraft.level.dimensionType().hasSkyLight(); return new Bounds(Math.max(0, (widestWidgetWidth / 2 - (natural ? 5 : 0)) - (textWidth / 2)), 0, textWidth + (natural ? 10 : 0), minecraft.font.lineHeight); } diff --git a/src/main/java/twilightforest/client/overlay/display/ItemDisplay.java b/src/main/java/twilightforest/client/overlay/display/ItemDisplay.java index 66a005276a..ec94f91a61 100644 --- a/src/main/java/twilightforest/client/overlay/display/ItemDisplay.java +++ b/src/main/java/twilightforest/client/overlay/display/ItemDisplay.java @@ -1,16 +1,14 @@ package twilightforest.client.overlay.display; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import twilightforest.util.Vec2i; public interface ItemDisplay { - void render(ItemStack item, GuiGraphics graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth); + void render(ItemStack item, GuiGraphicsExtractor graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth); default DisplayPosition displayPosition() { return DisplayPosition.DEFAULT; diff --git a/src/main/java/twilightforest/client/overlay/display/MapDisplay.java b/src/main/java/twilightforest/client/overlay/display/MapDisplay.java index 182ad41eb4..fd07600573 100644 --- a/src/main/java/twilightforest/client/overlay/display/MapDisplay.java +++ b/src/main/java/twilightforest/client/overlay/display/MapDisplay.java @@ -1,13 +1,14 @@ package twilightforest.client.overlay.display; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.*; import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.renderer.SubmitNodeStorage; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.state.MapRenderState; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Player; @@ -18,13 +19,16 @@ import org.joml.Matrix4f; public class MapDisplay implements ItemDisplay { + private static final RenderType MAP_BACKGROUND = RenderTypes.text(Identifier.withDefaultNamespace("textures/map/map_background.png")); + private static final RenderType MAP_BACKGROUND_CHECKERBOARD = RenderTypes.text(Identifier.withDefaultNamespace("textures/map/map_background_checkerboard.png")); - private static final RenderType MAP_BACKGROUND = RenderType.text(Identifier.withDefaultNamespace("textures/map/map_background.png")); - private static final RenderType MAP_BACKGROUND_CHECKERBOARD = RenderType.text(Identifier.withDefaultNamespace("textures/map/map_background_checkerboard.png")); + private static final int FULL_BRIGHT = 15728880; + + private final MapRenderState cachedMapRenderState = new MapRenderState(); @Override - public void render(ItemStack item, GuiGraphics graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { - PoseStack stack = graphics.pose(); + public void render(ItemStack item, GuiGraphicsExtractor graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { + PoseStack stack = new PoseStack(); MapId mapid = item.get(DataComponents.MAP_ID); if (mapid == null) return; @@ -32,27 +36,36 @@ public void render(ItemStack item, GuiGraphics graphics, Minecraft minecraft, Gu MapItemSavedData data = MapItem.getSavedData(item, minecraft.level); if (data == null) return; - VertexConsumer consumer = graphics.bufferSource().getBuffer(MAP_BACKGROUND_CHECKERBOARD); + + ByteBufferBuilder byteBuffer = new ByteBufferBuilder(256); + VertexConsumer consumer = new BufferBuilder(byteBuffer, VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP); + Matrix4f matrix4f = stack.last().pose(); + //render map background float start = Math.max(widestWidgetWidth / 2 - 50, 0); - consumer.addVertex(matrix4f, start, 100.0F, -2.0F).setColor(-1).setUv(0.0F, 1.0F).setLight(LightTexture.FULL_BRIGHT); - consumer.addVertex(matrix4f, start + 100.0F, 100.0F, -2.0F).setColor(-1).setUv(1.0F, 1.0F).setLight(LightTexture.FULL_BRIGHT); - consumer.addVertex(matrix4f, start + 100.0F, 0.0F, -2.0F).setColor(-1).setUv(1.0F, 0.0F).setLight(LightTexture.FULL_BRIGHT); - consumer.addVertex(matrix4f, start, 0.0F, -2.0F).setColor(-1).setUv(0.0F, 0.0F).setLight(LightTexture.FULL_BRIGHT); + consumer.addVertex(matrix4f, start, 100.0F, -2.0F).setColor(-1).setUv(0.0F, 1.0F).setLight(FULL_BRIGHT); + consumer.addVertex(matrix4f, start + 100.0F, 100.0F, -2.0F).setColor(-1).setUv(1.0F, 1.0F).setLight(FULL_BRIGHT); + consumer.addVertex(matrix4f, start + 100.0F, 0.0F, -2.0F).setColor(-1).setUv(1.0F, 0.0F).setLight(FULL_BRIGHT); + consumer.addVertex(matrix4f, start, 0.0F, -2.0F).setColor(-1).setUv(0.0F, 0.0F).setLight(FULL_BRIGHT); + + byteBuffer.close(); + //render map data stack.pushPose(); - //these transformations are very important, otherwise icons render behind the map graphics stack.mulPose(Axis.ZP.rotationDegrees(180.0F)); stack.translate(-4.75F, -4.75F, -1.0F); stack.translate(-start, 0.0F, 0.0F); stack.scale(0.7075F, 0.7075F, -0.7075F); stack.mulPose(Axis.ZP.rotationDegrees(180.0F)); - minecraft.gameRenderer.getMapRenderer().render(stack, graphics.bufferSource(), mapid, data, false, LightTexture.FULL_BRIGHT); - graphics.flush(); + + minecraft.getMapRenderer().extractRenderState(mapid, data, this.cachedMapRenderState); + minecraft.getMapRenderer().render(this.cachedMapRenderState, stack, new SubmitNodeStorage(), false, FULL_BRIGHT); + stack.popPose(); } + @Override public DisplayPosition displayPosition() { return DisplayPosition.TOP; diff --git a/src/main/java/twilightforest/client/overlay/display/MoonDialDisplay.java b/src/main/java/twilightforest/client/overlay/display/MoonDialDisplay.java index 1a8d113cca..8a202ae6c2 100644 --- a/src/main/java/twilightforest/client/overlay/display/MoonDialDisplay.java +++ b/src/main/java/twilightforest/client/overlay/display/MoonDialDisplay.java @@ -2,35 +2,39 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.util.FormattedCharSequence; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import twilightforest.TwilightForestMod; import twilightforest.item.MoonDialItem; public class MoonDialDisplay implements ItemDisplay { @Override - public void render(ItemStack item, GuiGraphics graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { - int k = minecraft.level.getMoonPhase(); - FormattedCharSequence formattedcharsequence = this.getText(minecraft).getVisualOrderText(); + public void render(ItemStack item, GuiGraphicsExtractor graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { + BlockPos pos = player != null ? player.blockPosition() : BlockPos.ZERO; + int k = (int) ((minecraft.level.getOverworldClockTime() / 24000L) % 8L); + FormattedCharSequence formattedcharsequence = this.getText(minecraft, pos).getVisualOrderText(); + int xRow = k % 4; int yRow = k / 4 % 2; - float xMin = xRow * 8; - float yMin = yRow * 8; - graphics.blit(TwilightForestMod.getGuiTexture("moon.png"), (widestWidgetWidth / 2 - 5) - minecraft.font.width(formattedcharsequence) / 2, 0, xMin, yMin, 8, 8, 32, 16); - graphics.drawString(minecraft.font, formattedcharsequence, Math.max(0, (widestWidgetWidth / 2 + 5) - minecraft.font.width(formattedcharsequence) / 2), 0, 0xFFFFFF); + int xMin = xRow * 8; + int yMin = yRow * 8; + graphics.blit(twilightforest.TwilightForestMod.getGuiTexture("moon.png"), (widestWidgetWidth / 2 - 5) - minecraft.font.width(formattedcharsequence) / 2, 0, xMin, yMin, 8, 8, 32, 16); + graphics.text(minecraft.font, formattedcharsequence, Math.max(0, (widestWidgetWidth / 2 + 5) - minecraft.font.width(formattedcharsequence) / 2), 0, 0xFFFFFF); } - private Component getText(Minecraft minecraft) { - return MoonDialItem.getMoonPhase(minecraft.level); + private Component getText(Minecraft minecraft, BlockPos pos) { + return MoonDialItem.getMoonPhase(minecraft.level, pos); } @Override public Bounds getWidgetSize(ItemStack item, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { - int textWidth = minecraft.font.width(this.getText(minecraft)); + BlockPos pos = player != null ? player.blockPosition() : BlockPos.ZERO; + + int textWidth = minecraft.font.width(this.getText(minecraft, pos)); return new Bounds(Math.max(0, (widestWidgetWidth / 2 - 5) - (textWidth / 2)), 0, textWidth + 10, minecraft.font.lineHeight); } } diff --git a/src/main/java/twilightforest/client/overlay/display/SimpleTextDisplay.java b/src/main/java/twilightforest/client/overlay/display/SimpleTextDisplay.java index d543053ca4..e913ef79d5 100644 --- a/src/main/java/twilightforest/client/overlay/display/SimpleTextDisplay.java +++ b/src/main/java/twilightforest/client/overlay/display/SimpleTextDisplay.java @@ -2,7 +2,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -12,8 +12,8 @@ public abstract class SimpleTextDisplay implements ItemDisplay { public abstract Component getText(ItemStack item, Minecraft minecraft, Gui gui, Player player); @Override - public void render(ItemStack item, GuiGraphics graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { - graphics.drawCenteredString(minecraft.font, this.getText(item, minecraft, gui, player), widestWidgetWidth / 2, 0, 0xFFFFFF); + public void render(ItemStack item, GuiGraphicsExtractor graphics, Minecraft minecraft, Gui gui, Player player, int widestWidgetWidth) { + graphics.centeredText(minecraft.font, this.getText(item, minecraft, gui, player), widestWidgetWidth / 2, 0, 0xFFFFFF); } @Override From 7e1c969333b82ae22e308748ff4662782a8bc7f4 Mon Sep 17 00:00:00 2001 From: Albazavr Date: Sun, 5 Jul 2026 01:49:50 +0300 Subject: [PATCH 2/5] Resolved review comments --- .../client/overlay/ItemDisplayOverlay.java | 3 +- .../client/overlay/PortalOverlay.java | 32 +++++++++++++++++++ .../overlay/QuestingRamIndicatorOverlay.java | 1 + .../client/overlay/display/MapDisplay.java | 2 ++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/main/java/twilightforest/client/overlay/PortalOverlay.java diff --git a/src/main/java/twilightforest/client/overlay/ItemDisplayOverlay.java b/src/main/java/twilightforest/client/overlay/ItemDisplayOverlay.java index 54875b798f..d12cd11c8a 100644 --- a/src/main/java/twilightforest/client/overlay/ItemDisplayOverlay.java +++ b/src/main/java/twilightforest/client/overlay/ItemDisplayOverlay.java @@ -8,7 +8,6 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; import twilightforest.client.overlay.display.ItemDisplay; import twilightforest.components.item.ItemDisplayContents; import twilightforest.config.TFConfig; @@ -61,7 +60,7 @@ private static void renderHolders(GuiGraphicsExtractor graphics, Minecraft minec private static int fillDisplayHolders(List typesToRender, ItemDisplayContents contents, Minecraft minecraft, Gui gui, Player player) { int widest = 0; - NonNullList<@NotNull ItemStack> items = contents.items(); + NonNullList items = contents.items(); int slots = Math.min(ItemDisplayContents.LAYOUT.size(), items.size()); int activeMapSlot = contents.findActiveMapSlot(); diff --git a/src/main/java/twilightforest/client/overlay/PortalOverlay.java b/src/main/java/twilightforest/client/overlay/PortalOverlay.java new file mode 100644 index 0000000000..c2a334bb82 --- /dev/null +++ b/src/main/java/twilightforest/client/overlay/PortalOverlay.java @@ -0,0 +1,32 @@ +package twilightforest.client.overlay; + +import com.mojang.blaze3d.pipeline.DepthStencilState; +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.platform.CompareOp; +import com.mojang.blaze3d.platform.Window; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.client.resources.model.sprite.Material; +import net.minecraft.util.ARGB; +import net.minecraft.world.entity.player.Player; +import twilightforest.components.entity.TFPortalAttachment; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFDataAttachments; + +public class PortalOverlay { + + public static void render(GuiGraphicsExtractor graphics, Minecraft minecraft, Player player) { + Window window = minecraft.getWindow(); + if (player != null) { + TFPortalAttachment portal = player.getData(TFDataAttachments.TF_PORTAL_COOLDOWN); + if (portal.getPortalTimer() > 0) { + RenderPipeline pipeline = RenderPipeline.builder(RenderPipelines.GUI_TEXTURED_SNIPPET) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .build(); + Material.Baked textureatlassprite = minecraft.getModelManager().getBlockStateModelSet().getParticleMaterial(TFBlocks.TWILIGHT_PORTAL.get().defaultBlockState()); + graphics.blit(pipeline, textureatlassprite.sprite().atlasLocation(), 0, 0, 0, 0, -90, window.getGuiScaledWidth(), window.getGuiScaledHeight(), ARGB.color(portal.getPortalTimer() / TFPortalAttachment.MAX_TICKS, 0, 0, 0)); + } + } + } +} diff --git a/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java b/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java index a406da316a..a05ff756ba 100644 --- a/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java +++ b/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java @@ -16,6 +16,7 @@ import twilightforest.entity.passive.quest.ram.QuestingRamCurrentContext; public class QuestingRamIndicatorOverlay { + private static final Identifier QUESTING_RAM_CHECK_SPRITE = TwilightForestMod.prefix("questing_ram_check"); private static final Identifier QUESTING_RAM_X_SPRITE = TwilightForestMod.prefix("questing_ram_x"); diff --git a/src/main/java/twilightforest/client/overlay/display/MapDisplay.java b/src/main/java/twilightforest/client/overlay/display/MapDisplay.java index fd07600573..b985c2646b 100644 --- a/src/main/java/twilightforest/client/overlay/display/MapDisplay.java +++ b/src/main/java/twilightforest/client/overlay/display/MapDisplay.java @@ -19,6 +19,7 @@ import org.joml.Matrix4f; public class MapDisplay implements ItemDisplay { + private static final RenderType MAP_BACKGROUND = RenderTypes.text(Identifier.withDefaultNamespace("textures/map/map_background.png")); private static final RenderType MAP_BACKGROUND_CHECKERBOARD = RenderTypes.text(Identifier.withDefaultNamespace("textures/map/map_background_checkerboard.png")); @@ -53,6 +54,7 @@ public void render(ItemStack item, GuiGraphicsExtractor graphics, Minecraft mine //render map data stack.pushPose(); + //these transformations are very important, otherwise icons render behind the map graphics stack.mulPose(Axis.ZP.rotationDegrees(180.0F)); stack.translate(-4.75F, -4.75F, -1.0F); stack.translate(-start, 0.0F, 0.0F); From f01050b79912dff1670d3b168f4dc1992abeab0d Mon Sep 17 00:00:00 2001 From: Albazavr Date: Mon, 20 Jul 2026 23:47:45 +0300 Subject: [PATCH 3/5] Fixed review comment --- src/main/java/twilightforest/client/overlay/PortalOverlay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/twilightforest/client/overlay/PortalOverlay.java b/src/main/java/twilightforest/client/overlay/PortalOverlay.java index c2a334bb82..a845263752 100644 --- a/src/main/java/twilightforest/client/overlay/PortalOverlay.java +++ b/src/main/java/twilightforest/client/overlay/PortalOverlay.java @@ -25,7 +25,7 @@ public static void render(GuiGraphicsExtractor graphics, Minecraft minecraft, Pl .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .build(); Material.Baked textureatlassprite = minecraft.getModelManager().getBlockStateModelSet().getParticleMaterial(TFBlocks.TWILIGHT_PORTAL.get().defaultBlockState()); - graphics.blit(pipeline, textureatlassprite.sprite().atlasLocation(), 0, 0, 0, 0, -90, window.getGuiScaledWidth(), window.getGuiScaledHeight(), ARGB.color(portal.getPortalTimer() / TFPortalAttachment.MAX_TICKS, 0, 0, 0)); + graphics.blit(pipeline, textureatlassprite.sprite().atlasLocation(), 0, 0, 0, 0, -90, window.getGuiScaledWidth(), window.getGuiScaledHeight(), ARGB.color(255 * portal.getPortalTimer() / TFPortalAttachment.MAX_TICKS, 0, 0, 0)); } } } From 9fcfe72bcdf13bce5fb9ea5c203231d78fd2be25 Mon Sep 17 00:00:00 2001 From: Albazavr Date: Wed, 22 Jul 2026 17:07:27 +0300 Subject: [PATCH 4/5] Fixed PortalOverlay --- src/main/java/twilightforest/client/overlay/PortalOverlay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/twilightforest/client/overlay/PortalOverlay.java b/src/main/java/twilightforest/client/overlay/PortalOverlay.java index a845263752..b8564dfce3 100644 --- a/src/main/java/twilightforest/client/overlay/PortalOverlay.java +++ b/src/main/java/twilightforest/client/overlay/PortalOverlay.java @@ -25,7 +25,7 @@ public static void render(GuiGraphicsExtractor graphics, Minecraft minecraft, Pl .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .build(); Material.Baked textureatlassprite = minecraft.getModelManager().getBlockStateModelSet().getParticleMaterial(TFBlocks.TWILIGHT_PORTAL.get().defaultBlockState()); - graphics.blit(pipeline, textureatlassprite.sprite().atlasLocation(), 0, 0, 0, 0, -90, window.getGuiScaledWidth(), window.getGuiScaledHeight(), ARGB.color(255 * portal.getPortalTimer() / TFPortalAttachment.MAX_TICKS, 0, 0, 0)); + graphics.blit(pipeline, textureatlassprite.sprite().atlasLocation(), 0, 0, 0, 0, -90, window.getGuiScaledWidth(), window.getGuiScaledHeight(), ARGB.color(255 * portal.getPortalTimer() / TFPortalAttachment.MAX_TICKS, 255, 255, 255)); } } } From 79dcf12a52c122b5b0054725b9a39105e60cb5da Mon Sep 17 00:00:00 2001 From: Albazavr Date: Thu, 23 Jul 2026 02:36:59 +0300 Subject: [PATCH 5/5] Fixed overlays --- .../client/overlay/PortalOverlay.java | 15 ++++----------- .../overlay/QuestingRamIndicatorOverlay.java | 6 ++++-- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/main/java/twilightforest/client/overlay/PortalOverlay.java b/src/main/java/twilightforest/client/overlay/PortalOverlay.java index b8564dfce3..a7e38d250d 100644 --- a/src/main/java/twilightforest/client/overlay/PortalOverlay.java +++ b/src/main/java/twilightforest/client/overlay/PortalOverlay.java @@ -1,13 +1,9 @@ package twilightforest.client.overlay; -import com.mojang.blaze3d.pipeline.DepthStencilState; -import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.CompareOp; -import com.mojang.blaze3d.platform.Window; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.renderer.RenderPipelines; -import net.minecraft.client.resources.model.sprite.Material; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ARGB; import net.minecraft.world.entity.player.Player; import twilightforest.components.entity.TFPortalAttachment; @@ -17,15 +13,12 @@ public class PortalOverlay { public static void render(GuiGraphicsExtractor graphics, Minecraft minecraft, Player player) { - Window window = minecraft.getWindow(); if (player != null) { TFPortalAttachment portal = player.getData(TFDataAttachments.TF_PORTAL_COOLDOWN); if (portal.getPortalTimer() > 0) { - RenderPipeline pipeline = RenderPipeline.builder(RenderPipelines.GUI_TEXTURED_SNIPPET) - .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) - .build(); - Material.Baked textureatlassprite = minecraft.getModelManager().getBlockStateModelSet().getParticleMaterial(TFBlocks.TWILIGHT_PORTAL.get().defaultBlockState()); - graphics.blit(pipeline, textureatlassprite.sprite().atlasLocation(), 0, 0, 0, 0, -90, window.getGuiScaledWidth(), window.getGuiScaledHeight(), ARGB.color(255 * portal.getPortalTimer() / TFPortalAttachment.MAX_TICKS, 255, 255, 255)); + int color = ARGB.color(255 * portal.getPortalTimer() / TFPortalAttachment.MAX_TICKS, 255, 255, 255); + TextureAtlasSprite sprite = minecraft.getModelManager().getBlockStateModelSet().getParticleMaterial(TFBlocks.TWILIGHT_PORTAL.get().defaultBlockState()).sprite(); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, sprite, 0, 0, graphics.guiWidth(), graphics.guiHeight(), color); } } } diff --git a/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java b/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java index a05ff756ba..19a97efc4a 100644 --- a/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java +++ b/src/main/java/twilightforest/client/overlay/QuestingRamIndicatorOverlay.java @@ -20,6 +20,8 @@ public class QuestingRamIndicatorOverlay { private static final Identifier QUESTING_RAM_CHECK_SPRITE = TwilightForestMod.prefix("questing_ram_check"); private static final Identifier QUESTING_RAM_X_SPRITE = TwilightForestMod.prefix("questing_ram_x"); + private static final Minecraft minecraft = Minecraft.getInstance(); + @Autowired(dist = Dist.CLIENT) private static QuestingRamCurrentContext questingRamCurrentContext; @@ -33,9 +35,9 @@ public static void render(Minecraft minecraft, GuiGraphicsExtractor graphics, Gu int j = ((graphics.guiHeight() - 1) / 2) - 11; int k = ((graphics.guiHeight() - 1) / 2) - 3; if (!ram.isColorPresent(questEntry.getKey())) { - graphics.blitSprite(RenderPipelines.GUI_TEXTURED, QUESTING_RAM_X_SPRITE, k, j, 7, 7); + graphics.blitSprite(RenderPipelines.CROSSHAIR, QUESTING_RAM_X_SPRITE, k, j, 7, 7); } else { - graphics.blitSprite(RenderPipelines.GUI_TEXTURED, QUESTING_RAM_CHECK_SPRITE, k, j, 7, 7); + graphics.blitSprite(RenderPipelines.CROSSHAIR, QUESTING_RAM_CHECK_SPRITE, k, j, 7, 7); } break; }