From 2cb319c065d93f54afe646e30c2118cc2719fdfa Mon Sep 17 00:00:00 2001 From: "Ansgar [Hiajen]" Date: Sun, 20 Jun 2021 10:58:55 +0200 Subject: [PATCH] add BetterPing Mod by https://github.com/vladmarica/better-ping-display-fabric/ --- src/main/java/net/saltymc/eaa/EaaMod.java | 4 +- .../net/saltymc/eaa/commands/TagCommand.java | 5 +- .../saltymc/eaa/custom/ping/ColorUtil.java | 35 +++ .../eaa/custom/ping/CustomPlayerListHud.java | 234 ++++++++++++++++++ .../saltymc/eaa/custom/ping/PingColors.java | 40 +++ .../saltymc/eaa/custom/ping/PingConfig.java | 107 ++++++++ .../eaa/custom/ping/PlayerListHudUtil.java | 31 +++ .../net/saltymc/eaa/mixin/InGameHudMixin.java | 23 ++ .../eaa/mixin/PlayerListHudAccessor.java | 29 +++ .../resources/datenbank/datenbank_shema.mwb | Bin 9577 -> 8180 bytes .../resources/datenbank/datenbank_shema.png | Bin 23069 -> 10918 bytes .../{modid.mixins.json => eaamod.mixins.json} | 4 +- src/main/resources/fabric.mod.json | 2 +- 13 files changed, 509 insertions(+), 5 deletions(-) create mode 100644 src/main/java/net/saltymc/eaa/custom/ping/ColorUtil.java create mode 100644 src/main/java/net/saltymc/eaa/custom/ping/CustomPlayerListHud.java create mode 100644 src/main/java/net/saltymc/eaa/custom/ping/PingColors.java create mode 100644 src/main/java/net/saltymc/eaa/custom/ping/PingConfig.java create mode 100644 src/main/java/net/saltymc/eaa/custom/ping/PlayerListHudUtil.java create mode 100644 src/main/java/net/saltymc/eaa/mixin/InGameHudMixin.java create mode 100644 src/main/java/net/saltymc/eaa/mixin/PlayerListHudAccessor.java rename src/main/resources/{modid.mixins.json => eaamod.mixins.json} (74%) diff --git a/src/main/java/net/saltymc/eaa/EaaMod.java b/src/main/java/net/saltymc/eaa/EaaMod.java index 63f026c..9e2e266 100644 --- a/src/main/java/net/saltymc/eaa/EaaMod.java +++ b/src/main/java/net/saltymc/eaa/EaaMod.java @@ -1,6 +1,7 @@ package net.saltymc.eaa; import net.saltymc.eaa.commands.*; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -10,7 +11,8 @@ import net.fabricmc.api.Environment; @Environment(EnvType.CLIENT) public final class EaaMod implements ClientModInitializer { - private static final Logger LOGGER = LogManager.getLogger(); + public static final Logger LOGGER = LogManager.getLogger("EAA-MOD"); + public static Logger getLogger() { return LOGGER; diff --git a/src/main/java/net/saltymc/eaa/commands/TagCommand.java b/src/main/java/net/saltymc/eaa/commands/TagCommand.java index 4773897..0035fda 100644 --- a/src/main/java/net/saltymc/eaa/commands/TagCommand.java +++ b/src/main/java/net/saltymc/eaa/commands/TagCommand.java @@ -4,8 +4,8 @@ import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.toast.SystemToast; import net.minecraft.command.argument.EntityArgumentType; import net.minecraft.text.Text; @@ -14,6 +14,8 @@ import net.saltymc.eaa.util.database.DB_Player; import net.saltymc.eaa.util.database.DB_Tag; import net.saltymc.eaa.util.mojangApi.PlayerInfo; +import java.util.Collection; + import static net.fabricmc.fabric.api.client.command.v1.ClientCommandManager.argument; import static net.fabricmc.fabric.api.client.command.v1.ClientCommandManager.literal; @@ -36,7 +38,6 @@ public class TagCommand extends EaaModCommand{ source.sendFeedback(Text.of(e.toString())); } - SystemToast.add(source.getClient().getToastManager(), SystemToast.Type.TUTORIAL_HINT, Text.of("Player Tagged"), Text.of(player + " | " + tag.name() + " | " + grade)); diff --git a/src/main/java/net/saltymc/eaa/custom/ping/ColorUtil.java b/src/main/java/net/saltymc/eaa/custom/ping/ColorUtil.java new file mode 100644 index 0000000..18f4f00 --- /dev/null +++ b/src/main/java/net/saltymc/eaa/custom/ping/ColorUtil.java @@ -0,0 +1,35 @@ +package net.saltymc.eaa.custom.ping; + +/** + * By: https://github.com/vladmarica/better-ping-display-fabric/ + */ +public class ColorUtil { + + public static int interpolate(int colorStart, int colorEnd, float offset) { + if (offset < 0 || offset > 1) { + throw new IllegalArgumentException("Offset must be between 0.0 and 1.0"); + } + + int redDiff = getRed(colorEnd) - getRed(colorStart); + int greenDiff = getGreen(colorEnd) - getGreen(colorStart); + int blueDiff = getBlue(colorEnd) - getBlue(colorStart); + + int newRed = Math.round(getRed(colorStart) + (redDiff * offset)); + int newGreen = Math.round(getGreen(colorStart) + (greenDiff * offset)); + int newBlue = Math.round(getBlue(colorStart) + (blueDiff * offset)); + + return (newRed << 16) | (newGreen << 8) | newBlue; + } + + static int getRed(int color) { + return (color >> 16) & 0xFF; + } + + static int getGreen(int color) { + return (color >> 8) & 0xFF; + } + + static int getBlue(int color) { + return color & 0xFF; + } +} \ No newline at end of file diff --git a/src/main/java/net/saltymc/eaa/custom/ping/CustomPlayerListHud.java b/src/main/java/net/saltymc/eaa/custom/ping/CustomPlayerListHud.java new file mode 100644 index 0000000..5a877b8 --- /dev/null +++ b/src/main/java/net/saltymc/eaa/custom/ping/CustomPlayerListHud.java @@ -0,0 +1,234 @@ +package net.saltymc.eaa.custom.ping; + +import com.google.common.collect.ComparisonChain; +import com.google.common.collect.Ordering; +import com.mojang.authlib.GameProfile; +import com.mojang.blaze3d.systems.RenderSystem; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.hud.PlayerListHud; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.client.render.entity.PlayerModelPart; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.scoreboard.ScoreboardCriterion; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.minecraft.scoreboard.Team; +import net.minecraft.text.OrderedText; +import net.minecraft.text.Text; +import net.minecraft.world.GameMode; + +/** + * By: https://github.com/vladmarica/better-ping-display-fabric/ + */ +public final class CustomPlayerListHud { + + public static final PingConfig config = new PingConfig(); + + private static final Ordering ENTRY_ORDERING = Ordering.from(new EntryOrderComparator()); + private static final int PING_TEXT_RENDER_OFFSET = -13; + private static final int PLAYER_SLOT_EXTRA_WIDTH = 45; + private static final int PLAYER_ICON_WIDTH = 9; + private static final int PING_BARS_WIDTH = 11; + + public static void render(PlayerListHud hud, MatrixStack stack, int width, Scoreboard scoreboard, ScoreboardObjective obj) { + MinecraftClient mc = MinecraftClient.getInstance(); + TextRenderer textRenderer = mc.textRenderer; + Text header = PlayerListHudUtil.getHeader(hud); + Text footer = PlayerListHudUtil.getFooter(hud); + + ClientPlayNetworkHandler clientPlayNetworkHandler = mc.player.networkHandler; + List playerList = ENTRY_ORDERING.sortedCopy(clientPlayNetworkHandler.getPlayerList()); + int i = 0; + int j = 0; + Iterator playerListIterator = playerList.iterator(); + + int n; + while(playerListIterator.hasNext()) { + PlayerListEntry playerListEntry = (PlayerListEntry)playerListIterator.next(); + n = mc.textRenderer.getWidth(hud.getPlayerName(playerListEntry)); + i = Math.max(i, n); + if (obj != null && obj.getRenderType() != ScoreboardCriterion.RenderType.HEARTS) { + n = textRenderer.getWidth(" " + scoreboard.getPlayerScore(playerListEntry.getProfile().getName(), obj).getScore()); + j = Math.max(j, n); + } + } + + playerList = playerList.subList(0, Math.min(playerList.size(), 80)); + int l = playerList.size(); + int m = l; + + for(n = 1; m > 20; m = (l + n - 1) / n) { + ++n; + } + + boolean displayPlayerIcons = mc.isInSingleplayer() || mc.getNetworkHandler().getConnection().isEncrypted(); + int q; + if (obj != null) { + if (obj.getRenderType() == ScoreboardCriterion.RenderType.HEARTS) { + q = 90; + } else { + q = j; + } + } else { + q = 0; + } + int r = Math.min(n * ((displayPlayerIcons ? PLAYER_ICON_WIDTH : 0) + i + q + 13 + PLAYER_SLOT_EXTRA_WIDTH), width - 50) / n; + int s = width / 2 - (r * n + (n - 1) * 5) / 2; + int t = 10; + int u = r * n + (n - 1) * 5; + List headerLines = null; + if (header != null) { + headerLines = mc.textRenderer.wrapLines(header, width - 50); + + for (OrderedText headerLine : headerLines) { + u = Math.max(u, mc.textRenderer.getWidth(headerLine)); + } + } + + List footerLines = null; + if (footer != null) { + footerLines = mc.textRenderer.wrapLines(footer, width - 50); + + for (OrderedText footerLine : footerLines) { + u = Math.max(u, mc.textRenderer.getWidth(footerLine)); + } + } + + int var10000; + int var10001; + int var10002; + int var10004; + int y; + if (headerLines != null) { + var10000 = width / 2 - u / 2 - 1; + var10001 = t - 1; + var10002 = width / 2 + u / 2 + 1; + var10004 = headerLines.size(); + DrawableHelper.fill(stack, var10000, var10001, var10002, t + var10004 * 9, Integer.MIN_VALUE); + + for (OrderedText headerLine : headerLines) { + y = mc.textRenderer.getWidth(headerLine); + mc.textRenderer.drawWithShadow(stack, headerLine, (float)(width / 2 - y / 2), (float)t, -1); + t += 9; + } + + ++t; + } + + DrawableHelper.fill(stack, width / 2 - u / 2 - 1, t - 1, width / 2 + u / 2 + 1, t + m * 9, Integer.MIN_VALUE); + int w = mc.options.getTextBackgroundColor(553648127); + + int ai; + for(int x = 0; x < l; ++x) { + y = x / m; + ai = x % m; + int aa = s + y * r + y * 5; + int ab = t + ai * 9; + DrawableHelper.fill(stack, aa, ab, aa + r, ab + 8, w); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.enableAlphaTest(); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + if (x < playerList.size()) { + PlayerListEntry player = playerList.get(x); + GameProfile gameProfile = player.getProfile(); + int ah; + if (displayPlayerIcons) { + PlayerEntity playerEntity = mc.world.getPlayerByUuid(gameProfile.getId()); + boolean bl2 = playerEntity != null && playerEntity.isPartVisible(PlayerModelPart.CAPE) && ("Dinnerbone".equals(gameProfile.getName()) || "Grumm".equals(gameProfile.getName())); + mc.getTextureManager().bindTexture(player.getSkinTexture()); + ah = 8 + (bl2 ? 8 : 0); + int ad = 8 * (bl2 ? -1 : 1); + DrawableHelper.drawTexture(stack, aa, ab, 8, 8, 8.0F, (float)ah, 8, ad, 64, 64); + if (playerEntity != null && playerEntity.isPartVisible(PlayerModelPart.HAT)) { + int ae = 8 + (bl2 ? 8 : 0); + int af = 8 * (bl2 ? -1 : 1); + DrawableHelper.drawTexture(stack, aa, ab, 8, 8, 40.0F, (float)ae, 8, af, 64, 64); + } + + aa += 9; + } + + Text playerName = hud.getPlayerName(player); + if (player.getGameMode() == GameMode.SPECTATOR) { + mc.textRenderer.drawWithShadow(stack, playerName, (float)aa, (float)ab, -1862270977); + } else { + mc.textRenderer.drawWithShadow(stack, playerName, (float)aa, (float)ab, -1); + } + + if (obj != null && player.getGameMode() != GameMode.SPECTATOR) { + int ag = aa + i + 1; + ah = ag + q; + if (ah - ag > 5) { + PlayerListHudUtil.renderScoreboardObjective(hud, stack, obj, ab, gameProfile.getName(), ag, ah, player); + } + } + + // Here is the magic, rendering the ping text + String pingString = String.format(config.getTextFormatString(), player.getLatency()); + int pingStringWidth = textRenderer.getWidth(pingString); + int textX = r + aa - pingStringWidth + PING_TEXT_RENDER_OFFSET; + + if (displayPlayerIcons) { + textX -= PLAYER_ICON_WIDTH; + } + + if (!config.shouldRenderPingBars()) { + textX += PING_BARS_WIDTH; + } + + int pingTextColor = config.shouldAutoColorPingText() + ? PingColors.getColor(player.getLatency()) + : config.getTextColor(); + + textRenderer.drawWithShadow(stack, pingString, (float) textX, (float) ab, pingTextColor); + + if (config.shouldRenderPingBars()) { + PlayerListHudUtil.renderLatencyIcon( + hud, stack, r, aa - (displayPlayerIcons ? PLAYER_ICON_WIDTH : 0), ab, player); + } else { + // If we don't render ping bars, we need to reset the render system color so the rest + // of the player list renders properly + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + } + } + } + + if (footerLines != null) { + t += m * 9 + 1; + var10000 = width / 2 - u / 2 - 1; + var10001 = t - 1; + var10002 = width / 2 + u / 2 + 1; + var10004 = footerLines.size(); + DrawableHelper.fill(stack, var10000, var10001, var10002, t + var10004 * 9, Integer.MIN_VALUE); + + for (OrderedText footerLine : footerLines) { + ai = textRenderer.getWidth(footerLine); + textRenderer.drawWithShadow(stack, footerLine, (float)(width / 2 - ai / 2), (float)t, -1); + t += 9; + } + } + } + + @Environment(EnvType.CLIENT) + static class EntryOrderComparator implements Comparator { + public int compare(PlayerListEntry p1, PlayerListEntry p2) { + Team team = p1.getScoreboardTeam(); + Team team2 = p2.getScoreboardTeam(); + return ComparisonChain.start() + .compareTrueFirst(p1.getGameMode() != GameMode.SPECTATOR, p2.getGameMode() != GameMode.SPECTATOR) + .compare(team != null ? team.getName() : "", team2 != null ? team2.getName() : "") + .compare(p1.getProfile().getName(), p2.getProfile().getName(), String::compareToIgnoreCase) + .result(); + } + } +} diff --git a/src/main/java/net/saltymc/eaa/custom/ping/PingColors.java b/src/main/java/net/saltymc/eaa/custom/ping/PingColors.java new file mode 100644 index 0000000..cd16328 --- /dev/null +++ b/src/main/java/net/saltymc/eaa/custom/ping/PingColors.java @@ -0,0 +1,40 @@ +package net.saltymc.eaa.custom.ping; + +import net.minecraft.util.math.MathHelper; + +/** + * By: https://github.com/vladmarica/better-ping-display-fabric/ + */ +public class PingColors { + public static final int PING_START = 0; + public static final int PING_MID = 150; + public static final int PING_END = 300; + + public static final int COLOR_GREY = 0x535353; + public static final int COLOR_START = 0x00E676; + public static final int COLOR_MID = 0xD6CD30; + public static final int COLOR_END = 0xE53935; + + public static int getColor(int ping) { + if (ping < PING_START) { + return COLOR_GREY; + } + + if (ping < PING_MID) { + return ColorUtil.interpolate( + COLOR_START, + COLOR_MID, + computeOffset(PING_START, PING_MID, ping)); + } + + return ColorUtil.interpolate( + COLOR_MID, + COLOR_END, + computeOffset(PING_MID, PING_END, Math.min(ping, PING_END))); + } + + static float computeOffset(int start, int end, int value) { + float offset = (value - start) / (float) ( end - start); + return MathHelper.clamp(offset, 0.0F, 1.0F); + } +} \ No newline at end of file diff --git a/src/main/java/net/saltymc/eaa/custom/ping/PingConfig.java b/src/main/java/net/saltymc/eaa/custom/ping/PingConfig.java new file mode 100644 index 0000000..ff17d77 --- /dev/null +++ b/src/main/java/net/saltymc/eaa/custom/ping/PingConfig.java @@ -0,0 +1,107 @@ +package net.saltymc.eaa.custom.ping; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; +import net.saltymc.eaa.EaaMod; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Serializable; + +public class PingConfig { + private static final int DEFAULT_PING_TEXT_COLOR = 0xA0A0A0; + private static final String DEFAULT_PING_TEXT_FORMAT = "%dms"; + + private boolean autoColorPingText; + private boolean renderPingBars; + private int textColor = DEFAULT_PING_TEXT_COLOR; + private String textFormatString = DEFAULT_PING_TEXT_FORMAT; + + public PingConfig(ConfigData confileFileFormat) { + if (confileFileFormat.pingTextColor.startsWith("#")) { + try { + textColor = Integer.parseInt(confileFileFormat.pingTextColor.substring(1), 16); + } + catch (NumberFormatException ex) { + EaaMod.LOGGER.error("Config option 'pingTextColor' is invalid - it must be a hex color code"); + } + } + else { + EaaMod.LOGGER.error("Config option 'pingTextColor' is invalid - it must be a hex color code"); + } + + if (confileFileFormat.pingTextFormatString.contains("%d")) { + textFormatString = confileFileFormat.pingTextFormatString; + } + else { + EaaMod.LOGGER.error("Config option 'pingTextFormatString' is invalid - it needs to contain %d"); + } + + autoColorPingText = confileFileFormat.autoColorPingText; + renderPingBars = confileFileFormat.renderPingBars; + } + + public PingConfig() { + this(new ConfigData()); + } + + public int getTextColor() { + return this.textColor; + } + + public String getTextFormatString() { + return this.textFormatString; + } + + public boolean shouldAutoColorPingText() { + return this.autoColorPingText; + } + + public boolean shouldRenderPingBars() { + return this.renderPingBars; + } + + public static ConfigData loadConfigFile(File configFile) throws IOException { + FileReader reader = null; + try { + Gson gson = new Gson(); + reader = new FileReader(configFile); + return gson.fromJson(reader, ConfigData.class); + } + finally { + if (reader != null) { + reader.close(); + } + } + } + + public static void writeConfigFile(File configFile, ConfigData data) throws IOException { + FileWriter writer = null; + try { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + writer = new FileWriter(configFile); + writer.write(gson.toJson(data)); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + public static class ConfigData implements Serializable { + @Expose + private boolean autoColorPingText = true; + + @Expose + private boolean renderPingBars = false; + + @Expose + private String pingTextColor = "#A0A0A0"; + + @Expose + private String pingTextFormatString = "%dms"; + } +} \ No newline at end of file diff --git a/src/main/java/net/saltymc/eaa/custom/ping/PlayerListHudUtil.java b/src/main/java/net/saltymc/eaa/custom/ping/PlayerListHudUtil.java new file mode 100644 index 0000000..c6bc0de --- /dev/null +++ b/src/main/java/net/saltymc/eaa/custom/ping/PlayerListHudUtil.java @@ -0,0 +1,31 @@ +package net.saltymc.eaa.custom.ping; + +import net.minecraft.client.gui.hud.PlayerListHud; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.minecraft.text.Text; +import net.saltymc.eaa.mixin.PlayerListHudAccessor; + +/** + * By: https://github.com/vladmarica/better-ping-display-fabric/ + */ +public class PlayerListHudUtil { + /** Calls {@link net.minecraft.client.gui.hud.PlayerListHud#renderLatencyIcon}. */ + static void renderLatencyIcon(PlayerListHud hud, MatrixStack stack, int x, int offsetX, int y, PlayerListEntry player) { + ((PlayerListHudAccessor) hud).invokeRenderLatencyIcon(stack, x, offsetX, y, player); + } + + /** Calls {@link net.minecraft.client.gui.hud.PlayerListHud#renderScoreboardObjective} */ + static void renderScoreboardObjective(PlayerListHud hud, MatrixStack stack, ScoreboardObjective obj, int i, String str, int j, int k, PlayerListEntry player) { + ((PlayerListHudAccessor) hud).invokeRenderScoreboardObjective(obj, i, str, j, k, player, stack); + } + + static Text getHeader(PlayerListHud hud) { + return ((PlayerListHudAccessor) hud).getHeader(); + } + + static Text getFooter(PlayerListHud hud) { + return ((PlayerListHudAccessor) hud).getFooter(); + } +} diff --git a/src/main/java/net/saltymc/eaa/mixin/InGameHudMixin.java b/src/main/java/net/saltymc/eaa/mixin/InGameHudMixin.java new file mode 100644 index 0000000..256ff99 --- /dev/null +++ b/src/main/java/net/saltymc/eaa/mixin/InGameHudMixin.java @@ -0,0 +1,23 @@ +package net.saltymc.eaa.mixin; + +import net.minecraft.client.gui.hud.InGameHud; +import net.minecraft.client.gui.hud.PlayerListHud; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.saltymc.eaa.custom.ping.CustomPlayerListHud; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * By: https://github.com/vladmarica/better-ping-display-fabric/ + */ +@Mixin(InGameHud.class) +abstract class InGameHudMixin { + @Redirect(method = "render", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/PlayerListHud;render(Lnet/minecraft/client/util/math/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V")) + private void render(PlayerListHud hud, MatrixStack stack, int width, Scoreboard scoreboard, ScoreboardObjective objective) { + CustomPlayerListHud.render(hud, stack, width, scoreboard, objective); + } +} diff --git a/src/main/java/net/saltymc/eaa/mixin/PlayerListHudAccessor.java b/src/main/java/net/saltymc/eaa/mixin/PlayerListHudAccessor.java new file mode 100644 index 0000000..2c578b3 --- /dev/null +++ b/src/main/java/net/saltymc/eaa/mixin/PlayerListHudAccessor.java @@ -0,0 +1,29 @@ +package net.saltymc.eaa.mixin; + +import net.minecraft.client.gui.hud.PlayerListHud; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.scoreboard.ScoreboardObjective; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +/** + * By: https://github.com/vladmarica/better-ping-display-fabric/ + */ + +@Mixin(PlayerListHud.class) +public interface PlayerListHudAccessor { + @Invoker + void invokeRenderLatencyIcon(MatrixStack stack, int x, int offsetX, int y, PlayerListEntry player); + + @Invoker + void invokeRenderScoreboardObjective(ScoreboardObjective obj, int i, String str, int j, int k, PlayerListEntry player, MatrixStack stack); + + @Accessor("header") + Text getHeader(); + + @Accessor("footer") + Text getFooter(); +} \ No newline at end of file diff --git a/src/main/resources/datenbank/datenbank_shema.mwb b/src/main/resources/datenbank/datenbank_shema.mwb index 8ee355f80a294a8afb60012a884ae103cccb1b00..284fcf03ecbb6e2c90135934767e7d7d57225a95 100644 GIT binary patch literal 8180 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 diff --git a/src/main/resources/datenbank/datenbank_shema.png b/src/main/resources/datenbank/datenbank_shema.png index 579c3647070cde3c5936e0d1f6cdb10e3cd8a79f..64d3aa8d526699d3cfb249e04a30efa7cb61a851 100644 GIT binary patch literal 10918 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 literal 23069 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 diff --git a/src/main/resources/modid.mixins.json b/src/main/resources/eaamod.mixins.json similarity index 74% rename from src/main/resources/modid.mixins.json rename to src/main/resources/eaamod.mixins.json index 4225886..8bae705 100644 --- a/src/main/resources/modid.mixins.json +++ b/src/main/resources/eaamod.mixins.json @@ -6,7 +6,9 @@ "mixins": [ ], "client": [ - "ExampleMixin" + "ExampleMixin", + "InGameHudMixin", + "PlayerListHudAccessor" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index f09e006..fe18652 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -24,7 +24,7 @@ ] }, "mixins": [ - "modid.mixins.json" + "eaamod.mixins.json" ], "depends": {