Skip to content

Commit

Permalink
Tab hud additions (#1128)
Browse files Browse the repository at this point in the history
* Add vanilla tab by default option

* Rename PlayerListManager

* Clean up builder map

* Add dwarven hud config button

* Add hud styles

* Fancy only

* Render vanilla

* Update javadocs and refactor

* Refactor progress component

* Apply style to all progress components

* Add colon processing

* Change styles

* Add style Javadocs

* Implement minimal style

* Comments
  • Loading branch information
kevinthegreat1 authored Jan 9, 2025
1 parent 55f911e commit 5c696de
Show file tree
Hide file tree
Showing 35 changed files with 263 additions and 120 deletions.
4 changes: 2 additions & 2 deletions src/main/java/de/hysky/skyblocker/SkyblockerMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import de.hysky.skyblocker.config.datafixer.ConfigDataFixer;
import de.hysky.skyblocker.skyblock.StatusBarTracker;
import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.discord.DiscordRPCManager;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
Expand Down Expand Up @@ -66,7 +66,7 @@ public void onInitializeClient() {
Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20);
Scheduler.INSTANCE.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 200);
Scheduler.INSTANCE.scheduleCyclic(BackpackPreview::tick, 50);
Scheduler.INSTANCE.scheduleCyclic(PlayerListMgr::updateList, 20);
Scheduler.INSTANCE.scheduleCyclic(PlayerListManager::updateList, 20);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import de.hysky.skyblocker.skyblock.dwarven.CrystalsHudWidget;
import de.hysky.skyblocker.skyblock.dwarven.CarpetHighlighter;
import de.hysky.skyblocker.skyblock.dwarven.PowderMiningTracker;
import de.hysky.skyblocker.skyblock.tabhud.widget.CommsWidget;
import dev.isxander.yacl3.api.*;
import dev.isxander.yacl3.api.controller.ColorControllerBuilder;
import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen;
Expand Down Expand Up @@ -42,6 +43,12 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig
.controller(ConfigUtils::createBooleanController)
.build())

.option(ButtonOption.createBuilder()
.name(Text.translatable("skyblocker.config.mining.dwarvenHud.screen"))
.text(Text.translatable("text.skyblocker.open"))
.action((screen, opt) -> MinecraftClient.getInstance().setScreen(new WidgetsConfigurationScreen(Location.DWARVEN_MINES, CommsWidget.ID, screen)))
.build())

//Dwarven Mines
.group(OptionGroup.createBuilder()
.name(Text.translatable("skyblocker.config.mining.dwarvenMines"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,25 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig
newValue -> config.uiAndVisuals.tabHud.tabHudScale = newValue)
.controller(opt -> IntegerSliderControllerBuilder.create(opt).range(10, 200).step(1))
.build())
.option(Option.<Boolean>createBuilder()
.name(Text.translatable("skyblocker.config.uiAndVisuals.tabHud.showVanillaTabByDefault"))
.description(OptionDescription.of(Text.translatable("skyblocker.config.uiAndVisuals.tabHud.showVanillaTabByDefault.@Tooltip")))
.binding(defaults.uiAndVisuals.tabHud.showVanillaTabByDefault,
() -> config.uiAndVisuals.tabHud.showVanillaTabByDefault,
newValue -> config.uiAndVisuals.tabHud.showVanillaTabByDefault = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
.option(Option.<UIAndVisualsConfig.TabHudStyle>createBuilder()
.name(Text.translatable("skyblocker.config.uiAndVisuals.tabHud.style"))
.description(OptionDescription.of(Text.translatable("skyblocker.config.uiAndVisuals.tabHud.style.@Tooltip[0]"),
Text.translatable("skyblocker.config.uiAndVisuals.tabHud.style.@Tooltip[1]"),
Text.translatable("skyblocker.config.uiAndVisuals.tabHud.style.@Tooltip[2]"),
Text.translatable("skyblocker.config.uiAndVisuals.tabHud.style.@Tooltip[3]")))
.binding(defaults.uiAndVisuals.tabHud.style,
() -> config.uiAndVisuals.tabHud.style,
newValue -> config.uiAndVisuals.tabHud.style = newValue)
.controller(ConfigUtils::createEnumCyclingListController)
.build())
.option(Option.<Boolean>createBuilder()
.name(Text.translatable("skyblocker.config.uiAndVisuals.tabHud.enableHudBackground"))
.description(OptionDescription.of(Text.translatable("skyblocker.config.uiAndVisuals.tabHud.enableHudBackground.@Tooltip")))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,10 @@ public static class Glacite {
public boolean autoShareCorpses = false;
}

/**
* @deprecated See {@link UIAndVisualsConfig.TabHudStyle}.
*/
@Deprecated
public enum DwarvenHudStyle {
SIMPLE, FANCY, CLASSIC;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,12 @@ public static class TabHudConf {
@SerialEntry
public int tabHudScale = 100;

@SerialEntry
public boolean showVanillaTabByDefault = false;

@SerialEntry
public TabHudStyle style = TabHudStyle.FANCY;

@SerialEntry
public boolean enableHudBackground = true;

Expand All @@ -203,6 +209,36 @@ public static class TabHudConf {
public NameSorting nameSorting = NameSorting.DEFAULT;
}

public enum TabHudStyle {
/**
* The minimal style, with no decorations, icons, or custom components,
* rendered in a minimal rectangle background,
* or no background at all if {@link TabHudConf#enableHudBackground} is false.
*/
MINIMAL,
/**
* The simple style, with no decorations, icons, or custom components.
*/
SIMPLE,
/**
* The classic style, with decorations such as icons but no custom components.
*/
CLASSIC,
/**
* The default style, with all custom components and decorations in use.
*/
FANCY;

public boolean isMinimal() {
return this == MINIMAL;
}

@Override
public String toString() {
return I18n.translate("skyblocker.config.uiAndVisuals.tabHud.style." + name());
}
}

@Deprecated
public enum NameSorting {
DEFAULT, ALPHABETICAL;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import de.hysky.skyblocker.skyblock.end.TheEnd;
import de.hysky.skyblocker.skyblock.slayers.SlayerManager;
import de.hysky.skyblocker.skyblock.slayers.boss.demonlord.FirePillarAnnouncer;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager;
import de.hysky.skyblocker.skyblock.waypoint.MythologicalRitual;
import de.hysky.skyblocker.utils.Utils;
import net.minecraft.client.network.ClientPlayNetworkHandler;
Expand Down Expand Up @@ -101,7 +101,7 @@ public abstract class ClientPlayNetworkHandlerMixin {

@Inject(method = "onPlayerListHeader", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/PlayerListHud;setFooter(Lnet/minecraft/text/Text;)V"))
private void skyblocker$updatePlayerListFooter(PlayerListHeaderS2CPacket packet, CallbackInfo ci) {
PlayerListMgr.updateFooter(packet.footer());
PlayerListManager.updateFooter(packet.footer());
}

@WrapWithCondition(method = "onPlayerList", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import net.minecraft.client.gui.hud.InGameHud;
import net.minecraft.client.gui.hud.PlayerListHud;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderTickCounter;
import net.minecraft.client.util.Window;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.player.PlayerEntity;
Expand Down Expand Up @@ -202,6 +201,6 @@ public abstract class InGameHudMixin {

@WrapWithCondition(method = "renderPlayerList", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/PlayerListHud;render(Lnet/minecraft/client/gui/DrawContext;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V"))
private boolean skyblocker$shouldRenderHud(PlayerListHud playerListHud, DrawContext context, int scaledWindowWidth, Scoreboard scoreboard, ScoreboardObjective objective) {
return !Utils.isOnSkyblock() || !SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed() || MinecraftClient.getInstance().currentScreen instanceof WidgetsConfigurationScreen;
return !Utils.isOnSkyblock() || !SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudEnabled || TabHud.shouldRenderVanilla() || MinecraftClient.getInstance().currentScreen instanceof WidgetsConfigurationScreen;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import de.hysky.skyblocker.config.configs.DungeonsConfig;
import de.hysky.skyblocker.events.DungeonEvents;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.ProfileUtils;
import de.hysky.skyblocker.utils.Utils;
Expand Down Expand Up @@ -231,7 +231,7 @@ private static int getTotalRooms() {
}

private static int getCompletedRooms() {
Matcher matcher = PlayerListMgr.regexAt(43, COMPLETED_ROOMS_PATTERN);
Matcher matcher = PlayerListManager.regexAt(43, COMPLETED_ROOMS_PATTERN);
return matcher != null ? Integer.parseInt(matcher.group("rooms")) : 0;
}

Expand Down Expand Up @@ -259,28 +259,28 @@ private static int getDeathScorePenalty() {
}

private static int getPuzzleCount() {
Matcher matcher = PlayerListMgr.regexAt(47, PUZZLE_COUNT_PATTERN);
Matcher matcher = PlayerListManager.regexAt(47, PUZZLE_COUNT_PATTERN);
return matcher != null ? Integer.parseInt(matcher.group("count")) : 0;
}

private static int getPuzzlePenalty() {
int incompletePuzzles = 0;
for (int index = 0; index < puzzleCount; index++) {
Matcher puzzleMatcher = PlayerListMgr.regexAt(48 + index, PUZZLES_PATTERN);
Matcher puzzleMatcher = PlayerListManager.regexAt(48 + index, PUZZLES_PATTERN);
if (puzzleMatcher == null) break;
if (puzzleMatcher.group("state").matches("[✖✦]")) incompletePuzzles++;
}
return incompletePuzzles * 10;
}

private static double getSecretsPercentage() {
Matcher matcher = PlayerListMgr.regexAt(44, SECRETS_PATTERN);
Matcher matcher = PlayerListManager.regexAt(44, SECRETS_PATTERN);
return matcher != null ? Double.parseDouble(matcher.group("secper")) : 0;
}

private static int getCrypts() {
Matcher matcher = PlayerListMgr.regexAt(33, CRYPTS_PATTERN);
if (matcher == null) matcher = PlayerListMgr.regexAt(32, CRYPTS_PATTERN); //If class milestone 9 is reached, crypts goes up by 1
Matcher matcher = PlayerListManager.regexAt(33, CRYPTS_PATTERN);
if (matcher == null) matcher = PlayerListManager.regexAt(32, CRYPTS_PATTERN); //If class milestone 9 is reached, crypts goes up by 1
return matcher != null ? Integer.parseInt(matcher.group("crypts")) : 0;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.events.DungeonEvents;
import de.hysky.skyblocker.skyblock.dungeon.DungeonClass;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager;
import it.unimi.dsi.fastutil.objects.Object2ReferenceMap;
import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap;
import net.minecraft.entity.player.PlayerEntity;
Expand Down Expand Up @@ -51,6 +51,6 @@ private static void reset() {
}

private static Matcher getPlayerFromTab(@Range(from = 1, to = 5) int index) {
return PlayerListMgr.regexAt(1 + (index - 1) * 4, PLAYER_TAB_PATTERN);
return PlayerListManager.regexAt(1 + (index - 1) * 4, PLAYER_TAB_PATTERN);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.DungeonEvents;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager;
import de.hysky.skyblocker.skyblock.tabhud.widget.DungeonPlayerWidget;
import de.hysky.skyblocker.utils.ApiUtils;
import de.hysky.skyblocker.utils.Constants;
Expand Down Expand Up @@ -131,7 +131,7 @@ private static void onMessage(Text text, boolean overlay) {
}

private static String getPlayerNameAt(int index) {
Matcher matcher = PlayerListMgr.regexAt(1 + (index - 1) * 4, DungeonPlayerWidget.PLAYER_PATTERN);
Matcher matcher = PlayerListManager.regexAt(1 + (index - 1) * 4, DungeonPlayerWidget.PLAYER_PATTERN);

return matcher != null ? matcher.group("name") : "";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
Expand Down Expand Up @@ -110,11 +110,11 @@ private static boolean isKingsScentPresent() {
return false;
}
//make sure the data is in tab and if not tell the user
if (PlayerListMgr.getPlayerStringList().stream().noneMatch(entry -> entry.startsWith("Active Effects:"))) {
if (PlayerListManager.getPlayerStringList().stream().noneMatch(entry -> entry.startsWith("Active Effects:"))) {
CLIENT.player.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.config.mining.crystalsWaypoints.wishingCompassSolver.enableTabEffectsMessage")), false);
return false;
}
return PlayerListMgr.getPlayerStringList().stream().anyMatch(entry -> entry.startsWith("King's Scent"));
return PlayerListManager.getPlayerStringList().stream().anyMatch(entry -> entry.startsWith("King's Scent"));
}

private static boolean isKeyInInventory() {
Expand All @@ -131,13 +131,13 @@ private static Boolean isZoneComplete(Zone zone) {
}

//make sure the data is in tab and if not tell the user
if (PlayerListMgr.getPlayerStringList().stream().noneMatch(entry -> entry.equals("Crystals:"))) {
if (PlayerListManager.getPlayerStringList().stream().noneMatch(entry -> entry.equals("Crystals:"))) {
CLIENT.player.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.config.mining.crystalsWaypoints.wishingCompassSolver.enableTabMessage")), false);
return false;
}

//return if the crystal for a zone is found
Stream<String> displayNameStream = PlayerListMgr.getPlayerStringList().stream();
Stream<String> displayNameStream = PlayerListManager.getPlayerStringList().stream();
return switch (zone) {
case JUNGLE -> displayNameStream.noneMatch(entry -> entry.equals("Amethyst: ✖ Not Found"));
case MITHRIL_DEPOSITS -> displayNameStream.noneMatch(entry -> entry.equals("Jade: ✖ Not Found"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
import de.hysky.skyblocker.skyblock.tabhud.util.Ico;
import de.hysky.skyblocker.skyblock.tabhud.widget.ComponentBasedWidget;
import de.hysky.skyblocker.skyblock.tabhud.widget.component.Components;
import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent;
import de.hysky.skyblocker.skyblock.tabhud.widget.component.ProgressComponent;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Location;
import it.unimi.dsi.fastutil.doubles.DoubleBooleanPair;
Expand Down Expand Up @@ -96,7 +96,7 @@ public void updateContent() {
addSimpleIcoText(Ico.GOLD, "Coins/h: ", Formatting.GOLD, getPriceText(cropItemId, cropsPerMinute));
addSimpleIcoText(cropStack, "Blocks/s: ", Formatting.YELLOW, Integer.toString(FarmingHud.blockBreaks()));
//noinspection DataFlowIssue
addComponent(new ProgressComponent(Ico.LANTERN, Text.literal("Farming Level: "), FarmingHud.farmingXpPercentProgress(), Formatting.GOLD.getColorValue()));
addComponent(Components.progressComponent(Ico.LANTERN, Text.literal("Farming Level: "), FarmingHud.farmingXpPercentProgress(), Formatting.GOLD.getColorValue()));
addSimpleIcoText(Ico.LIME_DYE, "Farming XP/h: ", Formatting.YELLOW, FarmingHud.NUMBER_FORMAT.format((int) FarmingHud.farmingXpPerHour()));

Entity cameraEntity = client.getCameraEntity();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import it.unimi.dsi.fastutil.ints.*;
Expand Down Expand Up @@ -262,8 +262,8 @@ protected void renderWidget(DrawContext context, int mouseX, int mouseY, float d

private void updateInfestedFromTab() {
infectedPlots.clear();
for (int i = 0; i < PlayerListMgr.getPlayerStringList().size(); i++) {
String string = PlayerListMgr.getPlayerStringList().get(i);
for (int i = 0; i < PlayerListManager.getPlayerStringList().size(); i++) {
String string = PlayerListManager.getPlayerStringList().get(i);
if (string.startsWith("Plots:")) {
String[] split = string.split(":")[1].split(",");
for (String s : split) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package de.hysky.skyblocker.skyblock.tabhud;

import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import org.lwjgl.glfw.GLFW;

public class TabHud {
public static KeyBinding toggleSecondary;
public static KeyBinding defaultTgl;
private static KeyBinding defaultTgl;

@Init
public static void init() {
Expand All @@ -23,4 +24,8 @@ public static void init() {
GLFW.GLFW_KEY_M,
"key.categories.skyblocker"));
}

public static boolean shouldRenderVanilla() {
return defaultTgl.isPressed() != SkyblockerConfigManager.get().uiAndVisuals.tabHud.showVanillaTabByDefault;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import de.hysky.skyblocker.skyblock.tabhud.config.entries.WidgetEntry;
import de.hysky.skyblocker.skyblock.tabhud.config.preview.PreviewTab;
import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager;
import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Location;
Expand Down Expand Up @@ -275,7 +275,7 @@ public void removed() {
this.handler.onClosed(this.client.player);
}
handler.removeListener(this);
Scheduler.INSTANCE.schedule(PlayerListMgr::updateList, 1);
Scheduler.INSTANCE.schedule(PlayerListManager::updateList, 1);
SkyblockerConfigManager.save();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.PositionRule;
import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.WidgetPositioner;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager;
import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget;
import de.hysky.skyblocker.skyblock.tabhud.widget.TabHudWidget;
import de.hysky.skyblocker.utils.EnumUtils;
Expand Down Expand Up @@ -197,7 +197,7 @@ public void refreshGrid(ScreenRect tabArea) {

private void updatePlayerListFromPreview() {
if (mode == Mode.DUNGEON) {
PlayerListMgr.updateDungeons(DungeonsTabPlaceholder.get());
PlayerListManager.updateDungeons(DungeonsTabPlaceholder.get());
return;
}
if (!parent.isPreviewVisible() || parent.getHandler() == null) return;
Expand Down Expand Up @@ -240,7 +240,7 @@ private void updatePlayerListFromPreview() {
}
}
}
PlayerListMgr.updateWidgetsFrom(lines.stream().map(line -> {
PlayerListManager.updateWidgetsFrom(lines.stream().map(line -> {
PlayerListEntry playerListEntry = new PlayerListEntry(new GameProfile(UUID.randomUUID(), ""), false);
playerListEntry.setDisplayName(line);
return playerListEntry;
Expand Down
Loading

0 comments on commit 5c696de

Please sign in to comment.