diff options
| author | Kevin <92656833+kevinthegreat1@users.noreply.github.com> | 2024-12-22 21:46:36 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-23 10:46:36 +0800 |
| commit | 69e1ea849e195b07c3b3f9547701332df4f9866b (patch) | |
| tree | 78158e526b778493d400c4ee62281cef3962e6e4 /src/main/java | |
| parent | c4f9bc4dd7631021af74726adec54e56f9b49b0e (diff) | |
| download | Skyblocker-69e1ea849e195b07c3b3f9547701332df4f9866b.tar.gz Skyblocker-69e1ea849e195b07c3b3f9547701332df4f9866b.tar.bz2 Skyblocker-69e1ea849e195b07c3b3f9547701332df4f9866b.zip | |
Add player list widget (#1086)
Diffstat (limited to 'src/main/java')
8 files changed, 90 insertions, 29 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/AdFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/AdFilter.java index 8f0192b7..9976d5a5 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/AdFilter.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/AdFilter.java @@ -20,7 +20,7 @@ public class AdFilter extends ChatPatternListener { // 1. Player name // 2. Message // (?:\[[0-9]+\] )?(?:[<INSERT EMBLEMS>] )?(?:\[[A-Z+]+\] )?([A-Za-z0-9_]+): (.+) - super("(?:\\[[0-9]+\\] )?(?:[" + Constants.LEVEL_EMBLEMS+ "] )?(?:\\[[A-Z+]+\\] )?([A-Za-z0-9_]+): (.+)"); + super(Constants.PLAYER_NAME.pattern() + ": (.+)"); } @Override @@ -36,4 +36,4 @@ public class AdFilter extends ChatPatternListener { protected ChatFilterResult state() { return SkyblockerConfigManager.get().chat.hideAds; } -}
\ No newline at end of file +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/ShowOffFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/ShowOffFilter.java index 0a0cbbe5..384346c1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/ShowOffFilter.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/ShowOffFilter.java @@ -9,7 +9,7 @@ public class ShowOffFilter extends SimpleChatFilter { public ShowOffFilter() { //(?:\[[0-9]+\] )?(?:[<INSERT EMBLEMS>] )?(?:\[[A-Z+]+\] )?([A-Za-z0-9_]+) (?:<INSERT SHOW TYPES>) \[(.+)\] - super("(?:\\[[0-9]+\\] )?(?:[" + Constants.LEVEL_EMBLEMS + "] )?(?:\\[[A-Z+]+\\] )?([A-Za-z0-9_]+) (?:" + String.join("|", SHOW_TYPES) + ") \\[(.+)\\]"); + super(Constants.PLAYER_NAME.pattern() + " (?:" + String.join("|", SHOW_TYPES) + ") \\[(.+)\\]"); } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/preview/PreviewTab.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/preview/PreviewTab.java index 6b6c0e46..f72bc293 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/preview/PreviewTab.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/preview/PreviewTab.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.tabhud.config.preview; +import com.mojang.authlib.GameProfile; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.tabhud.config.DungeonsTabPlaceholder; import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen; @@ -25,6 +26,7 @@ import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.gui.widget.ScrollableWidget; import net.minecraft.client.gui.widget.TextWidget; +import net.minecraft.client.network.PlayerListEntry; import net.minecraft.item.ItemStack; import net.minecraft.scoreboard.ScoreHolder; import net.minecraft.scoreboard.Scoreboard; @@ -41,6 +43,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; @@ -236,7 +239,11 @@ public class PreviewTab implements Tab { } } } - PlayerListMgr.updateWidgetsFrom(lines); + PlayerListMgr.updateWidgetsFrom(lines.stream().map(line -> { + PlayerListEntry playerListEntry = new PlayerListEntry(new GameProfile(UUID.randomUUID(), ""), false); + playerListEntry.setDisplayName(line); + return playerListEntry; + }).toList()); } void updateWidgets() { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java index dbf69d33..d39c5d6c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java @@ -79,7 +79,7 @@ public class PlayerListMgr { if (Utils.isInDungeons()) { updateDungeons(null); } else { - updateWidgetsFrom(playerList.stream().map(PlayerListEntry::getDisplayName).filter(Objects::nonNull).toList()); + updateWidgetsFrom(playerList); } } @@ -116,7 +116,7 @@ public class PlayerListMgr { * * @param lines in-game TAB */ - public static void updateWidgetsFrom(List<Text> lines) { + public static void updateWidgetsFrom(List<PlayerListEntry> lines) { final Predicate<String> playersColumnPredicate = PLAYERS_COLUMN_PATTERN.asMatchPredicate(); final Predicate<String> infoColumnPredicate = INFO_COLUMN_PATTERN.asMatchPredicate(); @@ -124,9 +124,14 @@ public class PlayerListMgr { boolean doingPlayers = false; boolean playersDone = false; IntObjectPair<String> hypixelWidgetName = IntObjectPair.of(0xFFFF00, ""); + // These two lists should match each other. + // playerListEntries is only used for the player list widget List<Text> contents = new ArrayList<>(); + List<PlayerListEntry> playerListEntries = new ArrayList<>(); - for (Text displayName : lines) { + for (PlayerListEntry playerListEntry : lines) { + Text displayName = playerListEntry.getDisplayName(); + if (displayName == null) continue; String string = displayName.getString(); if (string.isBlank()) continue; @@ -143,8 +148,9 @@ public class PlayerListMgr { // Check if info, if it is, dip out if (infoColumnPredicate.test(string)) { playersDone = true; - if (!contents.isEmpty()) tabWidgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); + if (!contents.isEmpty()) tabWidgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents, playerListEntries)); contents.clear(); + playerListEntries.clear(); continue; } } else { @@ -153,18 +159,23 @@ public class PlayerListMgr { // Now check for : because of the farming contest ACTIVE // Check for mining event minutes CUZ THEY FUCKING FORGOT THE SPACE iefzeoifzeoifomezhif if (!string.startsWith(" ") && string.contains(":") && (!hypixelWidgetName.right().startsWith("Mining Event") || !string.toLowerCase().startsWith("ends in"))) { - if (!contents.isEmpty()) tabWidgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); + if (!contents.isEmpty()) tabWidgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents, playerListEntries)); contents.clear(); + playerListEntries.clear(); Pair<IntObjectPair<String>, ? extends Text> nameAndInfo = getNameAndInfo(displayName); hypixelWidgetName = nameAndInfo.left(); - if (!nameAndInfo.right().getString().isBlank()) contents.add(trim(nameAndInfo.right())); + if (!nameAndInfo.right().getString().isBlank()) { + contents.add(trim(nameAndInfo.right())); + playerListEntries.add(playerListEntry); + } continue; } } // Add the line to the content contents.add(trim(displayName)); + playerListEntries.add(playerListEntry); } - if (!contents.isEmpty()) tabWidgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); + if (!contents.isEmpty()) tabWidgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents, playerListEntries)); if (!tabWidgetsToShow.contains(tabWidgetInstances.get("Active Effects")) && SkyblockerConfigManager.get().uiAndVisuals.tabHud.effectsFromFooter) { tabWidgetsToShow.add(getTabHudWidget("Active Effects", List.of())); } @@ -203,23 +214,21 @@ public class PlayerListMgr { return out; } - private static TabHudWidget getTabHudWidget(IntObjectPair<String> hypixelWidgetName, List<Text> lines) { + private static TabHudWidget getTabHudWidget(IntObjectPair<String> hypixelWidgetName, List<Text> lines, @Nullable List<PlayerListEntry> playerListEntries) { + TabHudWidget tabHudWidget; if (tabWidgetInstances.containsKey(hypixelWidgetName.right())) { - TabHudWidget tabHudWidget = tabWidgetInstances.get(hypixelWidgetName.right()); - tabHudWidget.updateFromTab(lines); - tabHudWidget.update(); - return tabHudWidget; + tabHudWidget = tabWidgetInstances.get(hypixelWidgetName.right()); } else { - DefaultTabHudWidget defaultTabHudWidget = new DefaultTabHudWidget(hypixelWidgetName.right(), Text.literal(hypixelWidgetName.right()).formatted(Formatting.BOLD), hypixelWidgetName.firstInt()); - ScreenMaster.addWidgetInstance(defaultTabHudWidget); - defaultTabHudWidget.updateFromTab(lines); - defaultTabHudWidget.update(); - return defaultTabHudWidget; + tabHudWidget = new DefaultTabHudWidget(hypixelWidgetName.right(), Text.literal(hypixelWidgetName.right()).formatted(Formatting.BOLD), hypixelWidgetName.firstInt()); + ScreenMaster.addWidgetInstance(tabHudWidget); } + tabHudWidget.updateFromTab(lines, playerListEntries); + tabHudWidget.update(); + return tabHudWidget; } private static TabHudWidget getTabHudWidget(String hypixelWidgetName, List<Text> lines) { - return getTabHudWidget(IntObjectPair.of(0xFFFF0000, hypixelWidgetName), lines); + return getTabHudWidget(IntObjectPair.of(0xFFFF0000, hypixelWidgetName), lines, null); } /** diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java new file mode 100644 index 00000000..dfcf620c --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java @@ -0,0 +1,33 @@ +package de.hysky.skyblocker.skyblock.tabhud.widget; + +import de.hysky.skyblocker.annotations.RegisterWidget; +import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; +import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlayerComponent; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +@RegisterWidget +public class PlayerListWidget extends TabHudWidget { + private static final MutableText TITLE = Text.literal("Players").formatted(Formatting.BOLD); + + public PlayerListWidget() { + super("Players", TITLE, Formatting.AQUA.getColorValue()); + } + + @Override + protected void updateContent(List<Text> lines, @Nullable List<PlayerListEntry> playerListEntries) { + if (playerListEntries == null) { + lines.forEach(text -> addComponent(new PlainTextComponent(text))); + } else { + playerListEntries.forEach(playerListEntry -> addComponent(new PlayerComponent(playerListEntry))); + } + } + + @Override + protected void updateContent(List<Text> lines) {} +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java index a34d75e7..8fac951c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java @@ -2,8 +2,10 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.Component; import de.hysky.skyblocker.utils.Location; +import net.minecraft.client.network.PlayerListEntry; import net.minecraft.text.MutableText; import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -33,9 +35,9 @@ public abstract class TabHudWidget extends ComponentBasedWidget { cachedComponents.forEach(super::addComponent); } - public void updateFromTab(List<Text> lines) { + public void updateFromTab(List<Text> lines, @Nullable List<PlayerListEntry> playerListEntries) { cachedComponents.clear(); - updateContent(lines); + updateContent(lines, playerListEntries); } /** @@ -63,7 +65,18 @@ public abstract class TabHudWidget extends ComponentBasedWidget { } /** - * Update the content from the hypixel widget's lines + * Same as {@link #updateContent(List)} but only override if you need access to {@code playerListEntries}. + * + * @param playerListEntries the player list entries, which should match the lines. + * Null in dungeons. + * @see #updateContent(List) + */ + protected void updateContent(List<Text> lines, @Nullable List<PlayerListEntry> playerListEntries) { + updateContent(lines); + } + + /** + * Updates the content from the hypixel widget's lines * * @param lines the lines, they are formatted and trimmed, no blank lines will be present. * If the vanilla tab widget has text right after the : they will be put on the first line. diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java index 138a1cd6..0cbf5e5f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java @@ -19,10 +19,7 @@ public class PlayerComponent extends Component { public PlayerComponent(PlayerListEntry ple) { - boolean plainNames = false; - Team team = ple.getScoreboardTeam(); - String username = ple.getProfile().getName(); - name = (team != null && !plainNames) ? Text.empty().append(team.getPrefix()).append(Text.literal(username).formatted(team.getColor())).append(team.getSuffix()) : Text.of(username); + name = ple.getDisplayName(); tex = ple.getSkinTextures().texture(); this.width = SKIN_ICO_DIM + PAD_S + txtRend.getWidth(name); diff --git a/src/main/java/de/hysky/skyblocker/utils/Constants.java b/src/main/java/de/hysky/skyblocker/utils/Constants.java index 50c79638..738f71c9 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Constants.java +++ b/src/main/java/de/hysky/skyblocker/utils/Constants.java @@ -8,12 +8,14 @@ import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.function.Supplier; +import java.util.regex.Pattern; /** * Holds generic static constants */ public interface Constants { String LEVEL_EMBLEMS = "\u2E15\u273F\u2741\u2E19\u03B1\u270E\u2615\u2616\u2663\u213B\u2694\u27B6\u26A1\u2604\u269A\u2693\u2620\u269B\u2666\u2660\u2764\u2727\u238A\u1360\u262C\u269D\u29C9\uA214\u32D6\u2E0E\u26A0\uA541\u3020\u30C4\u2948\u2622\u2623\u273E\u269C\u0BD0\u0A6D\u2742\u16C3\u3023\u10F6\u0444\u266A\u266B\u04C3\u26C1\u26C3\u16DD\uA03E\u1C6A\u03A3\u09EB\u2603\u2654\u26C2\u0FC7\uA925\uA56A\u2592\u12DE"; + Pattern PLAYER_NAME = Pattern.compile("(?:\\[[0-9]+\\] )?(?:[" + Constants.LEVEL_EMBLEMS + "] )?(?:\\[[A-Z+]+\\] )?([A-Za-z0-9_]+)"); Supplier<MutableText> PREFIX = () -> { LocalDate time = LocalDate.now(); |
