From 064f65ae1beded3492571eca55e3ac64ab67b33b Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 18 Sep 2026 22:01:37 +0300 Subject: [PATCH 1/4] updated ISquadInfoRenderer to give more options for developers --- .../alexdoru/mwe/api/ISquadInfoRenderer.java | 60 ++++++++++++++++--- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/src/main/java/fr/alexdoru/mwe/api/ISquadInfoRenderer.java b/src/main/java/fr/alexdoru/mwe/api/ISquadInfoRenderer.java index 41ef0649..33e13483 100644 --- a/src/main/java/fr/alexdoru/mwe/api/ISquadInfoRenderer.java +++ b/src/main/java/fr/alexdoru/mwe/api/ISquadInfoRenderer.java @@ -4,6 +4,9 @@ import net.minecraft.entity.player.EntityPlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.List; /** * Implementing this interface and registering it via @@ -12,24 +15,63 @@ */ public interface ISquadInfoRenderer { + /* Priority of info renderers, renderers will be sorted with respect to this priority level. + * + * Note: + * Due to using a ArrayList, + * these need to stay in a contiguous index starting at 0. {Default ordinal} + */ + enum Priority { + HIGHEST, + HIGH, + NORMAL, + LOW, + LOWEST; + } + + default Priority getPriority() { return Priority.NORMAL; } + + /** @deprecated Use {@link #getWidth(int, NetworkPlayerInfo, EntityPlayer)} */ + @Deprecated + default int getWidth(@NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer) { return 0; } + /** + * @param listIndex the index of the squad member in the list * @param netInfo the NetworkPlayerInfo of the squad member on this line * @param entityPlayer the corresponding EntityPlayer if loaded in the world, may be null * @return the width in pixels needed to render this info for the given player, * or 0 if nothing should be rendered for this player */ - int getWidth(@NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer); + default int getWidth(int listIndex, @NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer) { return getWidth(netInfo, entityPlayer); } + + + /** @deprecated Use {@link #render(int, NetworkPlayerInfo, EntityPlayer, int, int, int, int)} */ + @Deprecated + default void render(@NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer, int x, int y, int reservedWidth) {} /** - * Renders the extra info. Implementations should stay within [x, x + reservedWidth]. + * Renders the extra info. Implementations should stay within [x, x + reservedWidth] and [y, y + reservedHeight]. * - * @param netInfo the NetworkPlayerInfo of the squad member on this line - * @param entityPlayer the corresponding EntityPlayer if loaded in the world, may be null - * @param x left edge of the column reserved for this renderer - * @param y y position of the line - * @param reservedWidth the max width reserved for this renderer across all displayed players, - * as previously returned by {@link #getWidth} + * @param listIndex the index of the squad member in the list + * @param netInfo the NetworkPlayerInfo of the squad member on this line + * @param entityPlayer the corresponding EntityPlayer if loaded in the world, may be null + * @param x left edge of the column reserved for this renderer + * @param y y position of the line + * @param reservedWidth the max width reserved for this renderer across all displayed players, + * as previously returned by {@link #getWidth(int, NetworkPlayerInfo, EntityPlayer)} + * @param reservedHeight the max height reserved for this row + */ + default void render(int listIndex, @NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer, int x, int y, int reservedWidth, int reservedHeight) { render(netInfo, entityPlayer, x, y, reservedWidth); } + + /** + * Use this to clean information created in {@link #processData(int, List, List)} */ - void render(@NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer, int x, int y, int reservedWidth); + default void clearData() {} + /** + * @param listSize the size of the list ({@code 0} if empty) + * @param netInfoList the NetworkPlayerInfo of each player + * @param entityPlayerList a list containing either the corresponding EntityPlayer if loaded in the world or null + */ + default void processData(int listSize, @Unmodifiable List netInfoList, @Unmodifiable List entityPlayerList) {} } From d558132bca2146db785a4a6cd57d78de84000e44 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 18 Sep 2026 22:02:46 +0300 Subject: [PATCH 2/4] updated SquadHealthHUD to reflect the changes made to ISquadInfoRenderer --- .../alexdoru/mwe/gui/huds/SquadHealthHUD.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/alexdoru/mwe/gui/huds/SquadHealthHUD.java b/src/main/java/fr/alexdoru/mwe/gui/huds/SquadHealthHUD.java index 4a1a5173..e74cd300 100644 --- a/src/main/java/fr/alexdoru/mwe/gui/huds/SquadHealthHUD.java +++ b/src/main/java/fr/alexdoru/mwe/gui/huds/SquadHealthHUD.java @@ -47,7 +47,15 @@ public SquadHealthHUD() { public void registerExtraRenderer(@NotNull ISquadInfoRenderer renderer) { Objects.requireNonNull(renderer); - extraInfoRenderers.add(renderer); + final ISquadInfoRenderer.Priority priority = renderer.getPriority(); + int index = extraInfoRenderers.size(); + for (int i = 0; i < index; i++) { + if (priority.ordinal() < extraInfoRenderers.get(i).getPriority().ordinal()) { + index = i; + break; + } + } + extraInfoRenderers.add(index, renderer); maxExtraWidths = new int[extraInfoRenderers.size()]; } @@ -57,12 +65,21 @@ public void onTick(TickEvent.ClientTickEvent event) { netInfoList.clear(); playerList.clear(); playerNamesList.clear(); + extraInfoRenderers.forEach(ISquadInfoRenderer::clearData); final Minecraft mc = Minecraft.getMinecraft(); if (mc.theWorld != null && mc.thePlayer != null && this.isEnabled(0)) { final Scoreboard scoreboard = mc.theWorld.getScoreboard(); final ScoreObjective scoreobjective = scoreboard.getObjectiveInDisplaySlot(0); if (!mc.isIntegratedServerRunning() || scoreobjective != null) { this.populateRenderList(mc, scoreboard, scoreobjective); + if (!extraInfoRenderers.isEmpty()) { + final int listSize = netInfoList.size(); + final List netInfoListView = Collections.unmodifiableList(netInfoList); + final List playerListView = Collections.unmodifiableList(playerList); + for (final ISquadInfoRenderer infoRenderer : extraInfoRenderers) { + infoRenderer.processData(listSize, netInfoListView, playerListView); + } + } } } } @@ -101,7 +118,7 @@ private void render(ScaledResolution resolution, Minecraft mc, Scoreboard scoreb } } for (int r = 0; r < this.extraInfoRenderers.size(); r++) { - final int width = this.extraInfoRenderers.get(r).getWidth(netInfo, entityPlayer); + final int width = this.extraInfoRenderers.get(r).getWidth(i, netInfo, entityPlayer); maxExtraWidths[r] = Math.max(maxExtraWidths[r], width); } } @@ -156,7 +173,7 @@ private void render(ScaledResolution resolution, Minecraft mc, Scoreboard scoreb for (int r = 0; r < this.extraInfoRenderers.size(); r++) { final int reservedWidth = maxExtraWidths[r]; if (reservedWidth > 0) { - this.extraInfoRenderers.get(r).render(netInfo, entityPlayer, xDrawingPos, yDrawingPos, reservedWidth); + this.extraInfoRenderers.get(r).render(i, netInfo, entityPlayer, xDrawingPos, yDrawingPos, reservedWidth, 8); xDrawingPos += reservedWidth + PADDING; } } From 706b961ba478b337719cfe39a08d85eb47b97894 Mon Sep 17 00:00:00 2001 From: shvaich <260186867+shvaich@users.noreply.github.com> Date: Fri, 18 Sep 2026 22:04:28 +0300 Subject: [PATCH 3/4] added method for developers to tell if the squad hud is currently being rendered --- src/main/java/fr/alexdoru/mwe/api/MWEApi.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/fr/alexdoru/mwe/api/MWEApi.java b/src/main/java/fr/alexdoru/mwe/api/MWEApi.java index 27176571..ceefda32 100644 --- a/src/main/java/fr/alexdoru/mwe/api/MWEApi.java +++ b/src/main/java/fr/alexdoru/mwe/api/MWEApi.java @@ -287,6 +287,12 @@ public static void registerSquadHUDExtraRenderer(@NotNull ISquadInfoRenderer ren MWE.INSTANCE().getMweRenderers().squadHUD.registerExtraRenderer(renderer); } + /** + * @return {@code true} if the squad HUD is currently rendered + */ + public static boolean isSquadHUDEnabled() { + return MWE.INSTANCE().getMweRenderers().squadHUD.isEnabled(-1); // System.currentTimeMillis() + } } public static final class MojangApi { From 5a9c62b4d18d583302cf4bc00047f877fbe6ab21 Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+alexdoru@users.noreply.github.com> Date: Sat, 19 Sep 2026 01:12:14 +0200 Subject: [PATCH 4/4] remove priority handling --- .../alexdoru/mwe/api/ISquadInfoRenderer.java | 24 ++++--------------- .../alexdoru/mwe/gui/huds/SquadHealthHUD.java | 10 +------- 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/src/main/java/fr/alexdoru/mwe/api/ISquadInfoRenderer.java b/src/main/java/fr/alexdoru/mwe/api/ISquadInfoRenderer.java index 33e13483..79ba6b29 100644 --- a/src/main/java/fr/alexdoru/mwe/api/ISquadInfoRenderer.java +++ b/src/main/java/fr/alexdoru/mwe/api/ISquadInfoRenderer.java @@ -15,25 +15,9 @@ */ public interface ISquadInfoRenderer { - /* Priority of info renderers, renderers will be sorted with respect to this priority level. - * - * Note: - * Due to using a ArrayList, - * these need to stay in a contiguous index starting at 0. {Default ordinal} - */ - enum Priority { - HIGHEST, - HIGH, - NORMAL, - LOW, - LOWEST; - } - - default Priority getPriority() { return Priority.NORMAL; } - /** @deprecated Use {@link #getWidth(int, NetworkPlayerInfo, EntityPlayer)} */ @Deprecated - default int getWidth(@NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer) { return 0; } + default int getWidth(@NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer) {return 0;} /** * @param listIndex the index of the squad member in the list @@ -42,8 +26,7 @@ enum Priority { * @return the width in pixels needed to render this info for the given player, * or 0 if nothing should be rendered for this player */ - default int getWidth(int listIndex, @NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer) { return getWidth(netInfo, entityPlayer); } - + default int getWidth(int listIndex, @NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer) {return getWidth(netInfo, entityPlayer);} /** @deprecated Use {@link #render(int, NetworkPlayerInfo, EntityPlayer, int, int, int, int)} */ @Deprecated @@ -61,7 +44,7 @@ default void render(@NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer e * as previously returned by {@link #getWidth(int, NetworkPlayerInfo, EntityPlayer)} * @param reservedHeight the max height reserved for this row */ - default void render(int listIndex, @NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer, int x, int y, int reservedWidth, int reservedHeight) { render(netInfo, entityPlayer, x, y, reservedWidth); } + default void render(int listIndex, @NotNull NetworkPlayerInfo netInfo, @Nullable EntityPlayer entityPlayer, int x, int y, int reservedWidth, int reservedHeight) {render(netInfo, entityPlayer, x, y, reservedWidth);} /** * Use this to clean information created in {@link #processData(int, List, List)} @@ -74,4 +57,5 @@ default void clearData() {} * @param entityPlayerList a list containing either the corresponding EntityPlayer if loaded in the world or null */ default void processData(int listSize, @Unmodifiable List netInfoList, @Unmodifiable List entityPlayerList) {} + } diff --git a/src/main/java/fr/alexdoru/mwe/gui/huds/SquadHealthHUD.java b/src/main/java/fr/alexdoru/mwe/gui/huds/SquadHealthHUD.java index e74cd300..1ee0f8e3 100644 --- a/src/main/java/fr/alexdoru/mwe/gui/huds/SquadHealthHUD.java +++ b/src/main/java/fr/alexdoru/mwe/gui/huds/SquadHealthHUD.java @@ -47,15 +47,7 @@ public SquadHealthHUD() { public void registerExtraRenderer(@NotNull ISquadInfoRenderer renderer) { Objects.requireNonNull(renderer); - final ISquadInfoRenderer.Priority priority = renderer.getPriority(); - int index = extraInfoRenderers.size(); - for (int i = 0; i < index; i++) { - if (priority.ordinal() < extraInfoRenderers.get(i).getPriority().ordinal()) { - index = i; - break; - } - } - extraInfoRenderers.add(index, renderer); + extraInfoRenderers.add(renderer); maxExtraWidths = new int[extraInfoRenderers.size()]; }