diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/config/ConfigHandler.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/config/ConfigHandler.java index 5ede3cd..60a07d4 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/config/ConfigHandler.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/config/ConfigHandler.java @@ -191,53 +191,53 @@ public final class ConfigHandler { /** Returns the unit that should be used for distance-related statistics.
Default: Blocks for plain text, km for hover-text
*/ - public String getDistanceUnit(boolean isHoverText) { - return getUnitString(isHoverText, "blocks", "km", "distance-unit"); + public String getDistanceUnit(boolean isUnitForHoverText) { + return getUnitString(isUnitForHoverText, "blocks", "km", "distance-unit"); } /** Returns the unit that should be used for damage-based statistics.
Default: Hearts for plain text, HP for hover-text.
*/ - public String getDamageUnit(boolean isHoverText) { - return getUnitString(isHoverText, "hearts", "hp", "damage-unit"); + public String getDamageUnit(boolean isUnitForHoverText) { + return getUnitString(isUnitForHoverText, "hearts", "hp", "damage-unit"); } /** Whether PlayerStats should automatically detect the most suitable unit to use for time-based statistics.
Default: true
*/ - public boolean autoDetectTimeUnit(boolean isHoverText) { + public boolean autoDetectTimeUnit(boolean isUnitForHoverText) { String path = "auto-detect-biggest-time-unit"; - if (isHoverText) { + if (isUnitForHoverText) { path = path + "-for-hover-text"; } - boolean defaultValue = !isHoverText; + boolean defaultValue = !isUnitForHoverText; return config.getBoolean(path, defaultValue); } /** How many additional units should be displayed next to the most suitable largest unit for time-based statistics.
Default: 1 for plain text, 0 for hover-text
*/ - public int getNumberOfExtraTimeUnits(boolean isHoverText) { + public int getNumberOfExtraTimeUnits(boolean isUnitForHoverText) { String path = "number-of-extra-units"; - if (isHoverText) { + if (isUnitForHoverText) { path = path + "-for-hover-text"; } - int defaultValue = isHoverText ? 0 : 1; + int defaultValue = isUnitForHoverText ? 0 : 1; return config.getInt(path, defaultValue); } /** Returns the unit that should be used for time-based statistics. (this will return the largest unit that should be used).
Default: days for plain text, hours for hover-text
*/ - public String getTimeUnit(boolean isHoverText) { - return getTimeUnit(isHoverText, false); + public String getTimeUnit(boolean isUnitForHoverText) { + return getTimeUnit(isUnitForHoverText, false); } /** Returns the unit that should be used for time-based statistics. If the optional smallUnit flag is true, this will return the smallest unit (and otherwise the largest).
Default: hours for plain text, seconds for hover-text
*/ - public String getTimeUnit(boolean isHoverText, boolean smallUnit) { + public String getTimeUnit(boolean isUnitForHoverText, boolean smallUnit) { if (smallUnit) { - return getUnitString(isHoverText, "hours", "seconds", "smallest-time-unit"); + return getUnitString(isUnitForHoverText, "hours", "seconds", "smallest-time-unit"); } - return getUnitString(isHoverText, "days", "hours", "biggest-time-unit"); + return getUnitString(isUnitForHoverText, "days", "hours", "biggest-time-unit"); } /** Returns an integer between 0 and 100 that represents how much lighter a hoverColor should be. diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/enums/PluginColor.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/enums/PluginColor.java index 6bc3d23..806a986 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/enums/PluginColor.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/enums/PluginColor.java @@ -40,6 +40,8 @@ public enum PluginColor { /** A Light Yellow that is used for final accents in the example message (#FFFF8E).*/ LIGHT_YELLOW (TextColor.fromHexString("#FFFF8E")), + /** The color of vanilla Minecraft hearts (#FF1313). */ + RED (TextColor.fromHexString("#FF1313")), /** ChatColor Blue (#5555FF)*/ NAME_1 (NamedTextColor.BLUE), //#5555FF - blue diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/enums/Target.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/enums/Target.java index d055f44..1d4affa 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/enums/Target.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/enums/Target.java @@ -1,6 +1,6 @@ package com.gmail.artemis.the.gr8.playerstats.enums; -/** This enum represents the targets PlayerStats accepts for a stat-lookup.*/ +/** This enum represents the targets PlayerStats accepts for a stat-lookup (Player, Server and Top).*/ public enum Target { PLAYER, SERVER, TOP } \ No newline at end of file diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/MessageBuilder.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/MessageBuilder.java index fa6930d..3bffbe3 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/MessageBuilder.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/MessageBuilder.java @@ -31,6 +31,7 @@ import static net.kyori.adventure.text.Component.*; public final class MessageBuilder { private static ConfigHandler config; + private boolean useHoverText; private final ComponentFactory componentFactory; private final LanguageKeyHandler languageKeyHandler; @@ -42,6 +43,7 @@ public final class MessageBuilder { private MessageBuilder(ConfigHandler configHandler, ComponentFactory factory) { config = configHandler; + useHoverText = config.useHoverText(); componentFactory = factory; formatter = new NumberFormatter(); @@ -57,6 +59,12 @@ public final class MessageBuilder { return new MessageBuilder(config, factory); } + /** Set whether this {@link MessageBuilder} should use hoverText. + By default, this follows the setting specified in the {@link ConfigHandler}. */ + public void toggleHoverUse(boolean desiredSetting) { + useHoverText = desiredSetting; + } + public TextComponent reloadedConfig() { return componentFactory.pluginPrefix() .append(space()) @@ -157,7 +165,7 @@ public final class MessageBuilder { public TextComponent helpMsg(boolean isConsoleSender) { int listSize = config.getTopListMaxSize(); - if (!isConsoleSender && config.useHoverText()) { + if (!isConsoleSender && useHoverText) { return HelpMessage.constructHoverMsg(componentFactory, listSize); } else { return HelpMessage.constructPlainMsg(componentFactory, listSize); @@ -174,7 +182,7 @@ public final class MessageBuilder { .append(componentFactory.playerName(statRequest.getPlayerName(), Target.PLAYER) .append(text(":")) .append(space())) - .append(getStatNumberComponent(statRequest.getStatistic(), stat, Target.PLAYER, statRequest.isConsoleSender())) + .append(getStatNumberComponent(statRequest, stat)) .append(space()) .append(getStatNameComponent(statRequest)) .append(getStatUnitComponent(statRequest.getStatistic(), statRequest.getTarget(), statRequest.isConsoleSender())) //space is provided by statUnitComponent @@ -194,7 +202,7 @@ public final class MessageBuilder { .append(space()) .append(componentFactory.serverName(config.getServerName())) .append(space()) - .append(getStatNumberComponent(statRequest.getStatistic(), stat, Target.SERVER, statRequest.isConsoleSender())) + .append(getStatNumberComponent(statRequest, stat)) .append(space()) .append(getStatNameComponent(statRequest)) .append(getStatUnitComponent(statRequest.getStatistic(), statRequest.getTarget(), statRequest.isConsoleSender())) //space is provided by statUnit @@ -255,9 +263,9 @@ public final class MessageBuilder { }; } - private BiFunction getFormattingFunction(@NotNull TextComponent statResult, Target selection) { - boolean useEnters = config.useEnters(selection, false); - boolean useEntersForShared = config.useEnters(selection, true); + private BiFunction getFormattingFunction(@NotNull TextComponent statResult, Target target) { + boolean useEnters = config.useEnters(target, false); + boolean useEntersForShared = config.useEnters(target, true); return (shareCode, sender) -> { TextComponent.Builder statBuilder = text(); @@ -343,7 +351,7 @@ public final class MessageBuilder { else { topList.append(playerNameBuilder.append(text(":"))); } - topList.append(space()).append(getStatNumberComponent(statRequest.getStatistic(), topStats.get(playerName), Target.TOP, statRequest.isConsoleSender())); + topList.append(space()).append(getStatNumberComponent(statRequest, topStats.get(playerName))); } return topList.build(); } @@ -373,60 +381,114 @@ public final class MessageBuilder { } } - private TextComponent getStatNumberComponent(Statistic statistic, long statNumber, Target selection, boolean isConsoleSender) { - Unit.Type type = Unit.getTypeFromStatistic(statistic); - Unit statUnit; - switch (type) { - case DISTANCE -> statUnit = Unit.fromString(config.getDistanceUnit(false)); - case DAMAGE -> statUnit = Unit.fromString(config.getDamageUnit(false)); - case TIME -> { - return getTimeNumberComponent(statNumber, selection, getTimeUnitRange(statNumber)); - } - default -> statUnit = Unit.NUMBER; - } - String prettyNumber = formatter.format(statNumber, statUnit); - if (!config.useHoverText() || statUnit == Unit.NUMBER) { - return componentFactory.statNumber(prettyNumber, selection); - } - Unit hoverUnit = type == Unit.Type.DISTANCE ? Unit.fromString(config.getDistanceUnit(true)) : - Unit.fromString(config.getDamageUnit(true)); - String prettyHoverNumber = formatter.format(statNumber, hoverUnit); - MyLogger.logMsg("mainNumber: " + prettyNumber + ", hoverNumber: " + prettyHoverNumber, DebugLevel.HIGH); + private TextComponent getStatNumberComponent(StatRequest request, long statNumber) { + Unit.Type statUnitType = Unit.getTypeFromStatistic(request.getStatistic()); + Target target = request.getTarget(); + return switch (statUnitType) { + case DISTANCE -> getDistanceNumberComponent(statNumber, target); + case DAMAGE -> getDamageNumberComponent(statNumber, target); + case TIME -> getTimeNumberComponent(statNumber, target); + default -> getDefaultNumberComponent(statNumber, target); + }; + } - if (hoverUnit == Unit.HEART) { - return componentFactory.damageNumberWithHoverText( - prettyNumber, prettyHoverNumber, - componentFactory.heart(isConsoleSender, true), selection); + private TextComponent getDistanceNumberComponent(long statNumber, Target target) { + Unit statUnit = Unit.fromString(config.getDistanceUnit(false)); + String prettyNumber = formatter.formatDistanceNumber(statNumber, statUnit); + if (!useHoverText) { + return componentFactory.distanceNumber(prettyNumber, target); } + + Unit hoverUnit = Unit.fromString(config.getDistanceUnit(true)); + String hoverNumber = formatter.formatDistanceNumber(statNumber, hoverUnit); if (config.useTranslatableComponents()) { String unitKey = languageKeyHandler.getUnitKey(hoverUnit); if (unitKey != null) { - return componentFactory.statNumberWithHoverText(prettyNumber, prettyHoverNumber, null, unitKey, selection); + return componentFactory.distanceNumberWithTranslatableHoverText(prettyNumber, hoverNumber, unitKey, target); } } - return componentFactory.statNumberWithHoverText(prettyNumber, prettyHoverNumber, hoverUnit.getLabel(), null, selection); + return componentFactory.distanceNumberWithHoverText(prettyNumber, hoverNumber, hoverUnit.getLabel(), target); } - private TextComponent getTimeNumberComponent(long statNumber, Target selection, ArrayList unitRange) { - if (unitRange.size() <= 1 || (config.useHoverText() && unitRange.size() <= 3)) { + private TextComponent getDamageNumberComponent(long statNumber, Target target) { + Unit statUnit = Unit.fromString(config.getDamageUnit(false)); + String prettyNumber = formatter.formatDamageNumber(statNumber, statUnit); + if (!useHoverText) { + return componentFactory.damageNumber(prettyNumber, target); + } + + Unit hoverUnit = Unit.fromString(config.getDamageUnit(true)); + String prettyHoverNumber = formatter.formatDamageNumber(statNumber, hoverUnit); + if (hoverUnit == Unit.HEART) { + return componentFactory.damageNumberWithHeartUnitInHoverText(prettyNumber, prettyHoverNumber, target); + } + return componentFactory.damageNumberWithHoverText(prettyNumber, prettyHoverNumber, hoverUnit.getLabel(), target); + } + + private TextComponent getTimeNumberComponent(long statNumber, Target target) { + ArrayList unitRange = getTimeUnitRange(statNumber); + if (unitRange.size() <= 1 || (useHoverText && unitRange.size() <= 3)) { MyLogger.logMsg( "There is something wrong with the time-units you specified, please check your config!", true); - return componentFactory.statNumber("-", selection); + return componentFactory.statNumber("-", target); } else { - String mainNumber = formatter.format(statNumber, unitRange.get(0), unitRange.get(1)); - if (!config.useHoverText()) { - return componentFactory.statNumber(mainNumber, selection); + String mainNumber = formatter.formatTimeNumber(statNumber, unitRange.get(0), unitRange.get(1)); + if (!useHoverText) { + return componentFactory.statNumber(mainNumber, target); } else { - String hoverNumber = formatter.format(statNumber, unitRange.get(2), unitRange.get(3)); + String hoverNumber = formatter.formatTimeNumber(statNumber, unitRange.get(2), unitRange.get(3)); MyLogger.logMsg("mainNumber: " + mainNumber + ", hoverNumber: " + hoverNumber, DebugLevel.HIGH); return componentFactory.statNumberWithHoverText(mainNumber, hoverNumber, - null, null, selection); + null, null, target); } } } + private TextComponent getDefaultNumberComponent(long statNumber, Target target) { + return componentFactory.statNumber(formatter.formatNumber(statNumber), target); + } + + private TextComponent getStatUnitComponent(Statistic statistic, Target target, boolean isConsoleSender) { + return switch (Unit.getTypeFromStatistic(statistic)) { + case DAMAGE -> getDamageUnit(target, isConsoleSender); + case DISTANCE -> getDistanceUnit(target); + default -> Component.empty(); + }; + } + + private TextComponent getDistanceUnit(Target target) { + Unit statUnit = Unit.fromString(config.getDistanceUnit(false)); + if (config.useTranslatableComponents()) { + String unitKey = languageKeyHandler.getUnitKey(statUnit); + if (unitKey != null) { + return Component.space() + .append(componentFactory.statUnitTranslatable(unitKey, target)); + } + } + return Component.space() + .append(componentFactory.statUnit(statUnit.getLabel(), target)); + } + + private TextComponent getDamageUnit(Target target, boolean isConsoleSender) { + Unit statUnit = Unit.fromString(config.getDamageUnit(false)); + if (statUnit == Unit.HEART) { + TextComponent heartUnit; + if (isConsoleSender) { + heartUnit = componentFactory.consoleHeart(); + } else if (useHoverText) { + heartUnit = componentFactory.clientHeartWithHoverText(); + } else { + heartUnit = componentFactory.clientHeart(false); + } + return Component.space() + .append(heartUnit); + } + return Component.space() + .append(componentFactory.statUnit(statUnit.getLabel(), target)); + } + /** Get an ArrayList consisting of 2 or 4 timeUnits. The order of items is:

0. maxUnit

1. minUnit

@@ -443,7 +505,7 @@ public final class MessageBuilder { unitRange.add(bigUnit); unitRange.add(bigUnit.getSmallerUnit(config.getNumberOfExtraTimeUnits(false))); } - if (config.useHoverText()) { + if (useHoverText) { if (!config.autoDetectTimeUnit(true)) { unitRange.add(Unit.fromString(config.getTimeUnit(true))); unitRange.add(Unit.fromString(config.getTimeUnit(true, true))); @@ -458,31 +520,6 @@ public final class MessageBuilder { return unitRange; } - private TextComponent getStatUnitComponent(Statistic statistic, Target selection, boolean isConsoleSender) { - Unit statUnit; - switch (Unit.getTypeFromStatistic(statistic)) { - case DAMAGE -> statUnit = Unit.fromString(config.getDamageUnit(false)); - case DISTANCE -> statUnit = Unit.fromString(config.getDistanceUnit(false)); - default -> { - return Component.empty(); - } - } - if (config.useTranslatableComponents()) { - String unitKey = languageKeyHandler.getUnitKey(statUnit); - if (unitKey != null) { - return Component.space() - .append(componentFactory.statUnit(null, unitKey, selection)); - } - } - String statName = statUnit.getLabel(); - if (statUnit == Unit.HEART) { //console can do u2665, u2764 looks better in-game - return Component.space() - .append(componentFactory.heart(isConsoleSender, false)); - } - return Component.space() - .append(componentFactory.statUnit(statName, null, selection)); - } - /** Returns "block", "entity", "item", or "sub-statistic" if the provided Type is null. */ public static String getSubStatTypeName(Statistic.Type statType) { String subStat = "sub-statistic"; diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/OutputManager.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/OutputManager.java index d6ec0de..7565f50 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/OutputManager.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/OutputManager.java @@ -31,28 +31,30 @@ import static com.gmail.artemis.the.gr8.playerstats.enums.StandardMessage.*; public final class OutputManager implements StatFormatter { private static BukkitAudiences adventure; + private static ConfigHandler config; private static ShareManager shareManager; - private static MessageBuilder writer; - private static MessageBuilder consoleWriter; + private static MessageBuilder messageBuilder; + private static MessageBuilder consoleMessageBuilder; private static EnumMap> standardMessages; public OutputManager(BukkitAudiences adventure, ConfigHandler config, ShareManager shareManager) { OutputManager.adventure = adventure; + OutputManager.config = config; OutputManager.shareManager = shareManager; - getMessageWriters(config); + getMessageBuilders(); prepareFunctions(); } - public static void updateMessageWriters(ConfigHandler config) { - getMessageWriters(config); + public static void updateMessageBuilders() { + getMessageBuilders(); } @Override public TextComponent formatPlayerStat(@NotNull StatRequest statRequest, int playerStat) { BiFunction playerStatFunction = - getWriter(statRequest).formattedPlayerStatFunction(playerStat, statRequest); + getMessageBuilder(statRequest).formattedPlayerStatFunction(playerStat, statRequest); return processFunction(statRequest.getCommandSender(), playerStatFunction); } @@ -60,7 +62,7 @@ public final class OutputManager implements StatFormatter { @Override public TextComponent formatServerStat(@NotNull StatRequest statRequest, long serverStat) { BiFunction serverStatFunction = - getWriter(statRequest).formattedServerStatFunction(serverStat, statRequest); + getMessageBuilder(statRequest).formattedServerStatFunction(serverStat, statRequest); return processFunction(statRequest.getCommandSender(), serverStatFunction); } @@ -68,7 +70,7 @@ public final class OutputManager implements StatFormatter { @Override public TextComponent formatTopStat(@NotNull StatRequest statRequest, @NotNull LinkedHashMap topStats) { BiFunction topStatFunction = - getWriter(statRequest).formattedTopStatFunction(topStats, statRequest); + getMessageBuilder(statRequest).formattedTopStatFunction(topStats, statRequest); return processFunction(statRequest.getCommandSender(), topStatFunction); } @@ -76,17 +78,17 @@ public final class OutputManager implements StatFormatter { public void sendFeedbackMsg(@NotNull CommandSender sender, StandardMessage message) { if (message != null) { adventure.sender(sender).sendMessage(standardMessages.get(message) - .apply(getWriter(sender))); + .apply(getMessageBuilder(sender))); } } public void sendFeedbackMsgWaitAMoment(@NotNull CommandSender sender, boolean longWait) { - adventure.sender(sender).sendMessage(getWriter(sender) + adventure.sender(sender).sendMessage(getMessageBuilder(sender) .waitAMoment(longWait)); } public void sendFeedbackMsgMissingSubStat(@NotNull CommandSender sender, Statistic.Type statType) { - adventure.sender(sender).sendMessage(getWriter(sender) + adventure.sender(sender).sendMessage(getMessageBuilder(sender) .missingSubStatName(statType)); } @@ -94,18 +96,18 @@ public final class OutputManager implements StatFormatter { if (subStatName == null) { sendFeedbackMsgMissingSubStat(sender, statType); } else { - adventure.sender(sender).sendMessage(getWriter(sender) + adventure.sender(sender).sendMessage(getMessageBuilder(sender) .wrongSubStatType(statType, subStatName)); } } public void sendExamples(@NotNull CommandSender sender) { - adventure.sender(sender).sendMessage(getWriter(sender) + adventure.sender(sender).sendMessage(getMessageBuilder(sender) .usageExamples()); } public void sendHelp(@NotNull CommandSender sender) { - adventure.sender(sender).sendMessage(getWriter(sender) + adventure.sender(sender).sendMessage(getMessageBuilder(sender) .helpMsg(sender instanceof ConsoleCommandSender)); } @@ -132,33 +134,47 @@ public final class OutputManager implements StatFormatter { } } - private MessageBuilder getWriter(CommandSender sender) { - return sender instanceof ConsoleCommandSender ? consoleWriter : writer; + private MessageBuilder getMessageBuilder(CommandSender sender) { + return sender instanceof ConsoleCommandSender ? consoleMessageBuilder : messageBuilder; } - private MessageBuilder getWriter(StatRequest statRequest) { + private MessageBuilder getMessageBuilder(StatRequest statRequest) { if (statRequest.isAPIRequest() || !statRequest.isConsoleSender()) { - return writer; + return messageBuilder; } else { - return consoleWriter; + return consoleMessageBuilder; } } - private static void getMessageWriters(ConfigHandler config) { - boolean isBukkit = Bukkit.getName().equalsIgnoreCase("CraftBukkit"); - if (config.useRainbowMode() || - (config.useFestiveFormatting() && LocalDate.now().getMonth().equals(Month.JUNE))) { - writer = MessageBuilder.fromComponentFactory(config, new PrideComponentFactory(config)); - } - else { - writer = MessageBuilder.defaultBuilder(config); - } + private static void getMessageBuilders() { + messageBuilder = getClientMessageBuilder(); + consoleMessageBuilder = getConsoleMessageBuilder(); + } - if (!isBukkit) { - consoleWriter = writer; - } else { - consoleWriter = MessageBuilder.fromComponentFactory(config, new BukkitConsoleComponentFactory(config)); + private static MessageBuilder getClientMessageBuilder() { + if (useRainbowStyle()) { + return MessageBuilder.fromComponentFactory(config, new PrideComponentFactory(config)); } + return MessageBuilder.defaultBuilder(config); + } + + private static MessageBuilder getConsoleMessageBuilder() { + MessageBuilder consoleBuilder; + if (isBukkit()) { + consoleBuilder = MessageBuilder.fromComponentFactory(config, new BukkitConsoleComponentFactory(config)); + } else { + consoleBuilder = getClientMessageBuilder(); + } + consoleBuilder.toggleHoverUse(false); + return consoleBuilder; + } + + private static boolean useRainbowStyle() { + return config.useRainbowMode() || (config.useFestiveFormatting() && LocalDate.now().getMonth().equals(Month.JUNE)); + } + + private static boolean isBukkit() { + return Bukkit.getName().equalsIgnoreCase("CraftBukkit"); } private void prepareFunctions() { diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/BukkitConsoleComponentFactory.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/BukkitConsoleComponentFactory.java index 22776b2..05a9f72 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/BukkitConsoleComponentFactory.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/BukkitConsoleComponentFactory.java @@ -24,6 +24,7 @@ public class BukkitConsoleComponentFactory extends ComponentFactory { PREFIX = PluginColor.GOLD.getConsoleColor(); BRACKETS = PluginColor.GRAY.getConsoleColor(); UNDERSCORE = PluginColor.DARK_PURPLE.getConsoleColor(); + HEARTS = PluginColor.RED.getConsoleColor(); MSG_MAIN = PluginColor.MEDIUM_BLUE.getConsoleColor(); MSG_ACCENT = PluginColor.BLUE.getConsoleColor(); diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/ComponentFactory.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/ComponentFactory.java index 7e07be2..61c36c5 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/ComponentFactory.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/ComponentFactory.java @@ -20,9 +20,7 @@ import org.bukkit.Bukkit; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - import static net.kyori.adventure.text.Component.*; -import static net.kyori.adventure.text.Component.text; /** Creates Components with the desired formatting for the {@link MessageBuilder} to build messages with. This class can put Strings into formatted Components with TextColor @@ -34,6 +32,7 @@ public class ComponentFactory { protected TextColor PREFIX; //gold protected TextColor BRACKETS; //gray protected TextColor UNDERSCORE; //dark_purple + protected TextColor HEARTS; //red protected TextColor MSG_MAIN; //medium_blue protected TextColor MSG_ACCENT; //blue @@ -56,6 +55,7 @@ public class ComponentFactory { PREFIX = PluginColor.GOLD.getColor(); BRACKETS = PluginColor.GRAY.getColor(); UNDERSCORE = PluginColor.DARK_PURPLE.getColor(); + HEARTS = PluginColor.RED.getColor(); MSG_MAIN = PluginColor.MEDIUM_BLUE.getColor(); MSG_ACCENT = PluginColor.BLUE.getColor(); @@ -109,10 +109,10 @@ public class ComponentFactory { return text().color(MSG_ACCENT).build(); } - public TextComponent title(String content, Target selection) { + public TextComponent title(String content, Target target) { return getComponent(content, - getColorFromString(config.getTitleDecoration(selection, false)), - getStyleFromString(config.getTitleDecoration(selection, true))); + getColorFromString(config.getTitleDecoration(target, false)), + getStyleFromString(config.getTitleDecoration(target, true))); } public TextComponent titleNumber(int number) { @@ -141,10 +141,10 @@ public class ComponentFactory { .append(colon); } - public TextComponent playerName(String playerName, Target selection) { + public TextComponent playerName(String playerName, Target target) { return getComponent(playerName, - getColorFromString(config.getPlayerNameDecoration(selection, false)), - getStyleFromString(config.getPlayerNameDecoration(selection, true))); + getColorFromString(config.getPlayerNameDecoration(target, false)), + getStyleFromString(config.getPlayerNameDecoration(target, true))); } public TextComponent sharerName(String sharerName) { @@ -154,7 +154,7 @@ public class ComponentFactory { } public TextComponent shareButton(int shareCode) { - return surroundingBrackets( + return surroundWithBrackets( text("Share") .color(MSG_HOVER) .clickEvent(ClickEvent.runCommand("/statshare " + shareCode)) @@ -163,7 +163,7 @@ public class ComponentFactory { } public TextComponent sharedByMessage(Component playerName) { - return surroundingBrackets( + return surroundWithBrackets( text().append( getComponent("Shared by", getColorFromString(config.getSharedByTextDecoration(false)), @@ -174,7 +174,7 @@ public class ComponentFactory { } public TextComponent statResultInHoverText(TextComponent statResult) { - return surroundingBrackets( + return surroundWithBrackets( text().append(text("Hover Here") .color(MSG_CLICKED) .decorate(TextDecoration.ITALIC) @@ -184,27 +184,27 @@ public class ComponentFactory { /** @param prettyStatName a statName with underscores removed and each word capitalized @param prettySubStatName if present, a subStatName with underscores removed and each word capitalized*/ - public TextComponent statAndSubStatName(String prettyStatName, @Nullable String prettySubStatName, Target selection) { + public TextComponent statAndSubStatName(String prettyStatName, @Nullable String prettySubStatName, Target target) { TextComponent.Builder totalStatNameBuilder = getComponentBuilder(prettyStatName, - getColorFromString(config.getStatNameDecoration(selection, false)), - getStyleFromString(config.getStatNameDecoration(selection, true))); - TextComponent subStat = subStatName(prettySubStatName, selection); + getColorFromString(config.getStatNameDecoration(target, false)), + getStyleFromString(config.getStatNameDecoration(target, true))); + TextComponent subStat = subStatName(prettySubStatName, target); if (!subStat.equals(Component.empty())) { totalStatNameBuilder .append(space().decorations(TextDecoration.NAMES.values(), false)) - .append(subStatName(prettySubStatName, selection)); + .append(subStatName(prettySubStatName, target)); } return totalStatNameBuilder.build(); } /** Returns a TextComponent with TranslatableComponent as a child.*/ - public TextComponent statAndSubStatNameTranslatable(String statKey, String subStatKey, Target selection) { + public TextComponent statAndSubStatNameTranslatable(String statKey, String subStatKey, Target target) { TextComponent.Builder totalStatNameBuilder = getComponentBuilder(null, - getColorFromString(config.getStatNameDecoration(selection, false)), - getStyleFromString(config.getStatNameDecoration(selection, true))); + getColorFromString(config.getStatNameDecoration(target, false)), + getStyleFromString(config.getStatNameDecoration(target, true))); - TextComponent subStat = subStatNameTranslatable(subStatKey, selection); + TextComponent subStat = subStatNameTranslatable(subStatKey, target); if (LanguageKeyHandler.isKeyForKillEntity(statKey)) { return totalStatNameBuilder.append(killEntityBuilder(subStat)).build(); } @@ -222,63 +222,95 @@ public class ComponentFactory { } } - public TextComponent statNumber(String prettyNumber, Target selection) { + public TextComponent statNumber(String prettyNumber, Target target) { return getComponent(prettyNumber, - getColorFromString(config.getStatNumberDecoration(selection, false)), - getStyleFromString(config.getStatNumberDecoration(selection, true))); + getColorFromString(config.getStatNumberDecoration(target, false)), + getStyleFromString(config.getStatNumberDecoration(target, true))); } - public TextComponent statNumberWithHoverText(String mainNumber, String hoverNumber, @Nullable String hoverUnitName, @Nullable String hoverUnitKey, Target selection) { - return statNumberWithHoverText(mainNumber, hoverNumber, hoverUnitName, hoverUnitKey, null, selection); + public TextComponent statNumberWithHoverText(String mainNumber, String hoverNumber, @Nullable String hoverUnitName, @Nullable String hoverUnitKey, Target target) { + return statNumberWithHoverText(mainNumber, hoverNumber, hoverUnitName, hoverUnitKey, null, target); } - public TextComponent damageNumberWithHoverText(String mainNumber, String hoverNumber, TextComponent heart, Target selection) { - return statNumberWithHoverText(mainNumber, hoverNumber, null, null, heart, selection); + public TextComponent damageNumber(String prettyNumber, Target target) { + return statNumber(prettyNumber, target); + } + public TextComponent damageNumberWithHoverText(String mainNumber, String hoverNumber, String hoverUnitName, Target target) { + return statNumberWithHoverText(mainNumber, hoverNumber, hoverUnitName, null, null, target); } - public TextComponent statUnit(String unitName, String unitKey, Target selection) { - if (!(unitName == null && unitKey == null)) { - TextComponent.Builder statUnitBuilder = getComponentBuilder(null, - getColorFromString(config.getSubStatNameDecoration(selection, false)), - getStyleFromString(config.getSubStatNameDecoration(selection, true))); - if (unitKey != null) { - statUnitBuilder.append(translatable() - .key(unitKey)); - } else { - statUnitBuilder.append(text(unitName)); - } - return surroundingBrackets(statUnitBuilder.build()); - } - else { - return Component.empty(); - } + public TextComponent damageNumberWithHeartUnitInHoverText(String mainNumber, String hoverNumber, Target target) { + return statNumberWithHoverText(mainNumber, hoverNumber, null, null, clientHeart(true), target); } - public TextComponent heart(boolean isConsoleSender, boolean isHoverUnit) { - TextColor heartColor = TextColor.fromHexString("#FF1313"); - char heart = isConsoleSender ? '\u2665' : '\u2764'; - if (isHoverUnit) { - return Component.text(heart).color(heartColor); + public TextComponent distanceNumber(String prettyNumber, Target target) { + return statNumber(prettyNumber, target); + } + + public TextComponent distanceNumberWithHoverText(String mainNumber, String hoverNumber, String hoverUnitName, Target target) { + return statNumberWithHoverText(mainNumber, hoverNumber, hoverUnitName, null, target); + } + + public TextComponent distanceNumberWithTranslatableHoverText(String mainNumber, String hoverNumber, String hoverUnitKey, Target target) { + return statNumberWithHoverText(mainNumber, hoverNumber, null, hoverUnitKey, target); + } + + public TextComponent statUnit(String unitName, Target target) { + TextComponent statUnit = getComponentBuilder(unitName, + getColorFromString(config.getSubStatNameDecoration(target, false)), + getStyleFromString(config.getSubStatNameDecoration(target, true))) + .build(); + return surroundWithBrackets(statUnit); + } + + public TextComponent statUnitTranslatable(String unitKey, Target target) { + TextComponent statUnit = getComponentBuilder(null, + getColorFromString(config.getSubStatNameDecoration(target, false)), + getStyleFromString(config.getSubStatNameDecoration(target, true))) + .append(translatable() + .key(unitKey)) + .build(); + return surroundWithBrackets(statUnit); + } + + public TextComponent clientHeart(boolean isDisplayedInHoverText) { + TextComponent basicHeartComponent = basicHeartComponent('\u2764'); + if (isDisplayedInHoverText) { + return basicHeartComponent; } - TextComponent.Builder heartComponent = Component.text() - .content(String.valueOf(heart)) - .color(heartColor); - if (config.useHoverText()) { - heartComponent.hoverEvent(HoverEvent.showText( - text(Unit.HEART.getLabel()) - .color(MSG_HOVER_ACCENT))); - } - return surroundingBrackets(heartComponent.build()); + return surroundWithBrackets(basicHeartComponent); + } + + public TextComponent clientHeartWithHoverText() { + TextComponent basicHeartComponent = basicHeartComponent('\u2764') + .toBuilder() + .hoverEvent(HoverEvent.showText( + text(Unit.HEART.getLabel()) + .color(MSG_HOVER_ACCENT))) + .build(); + return surroundWithBrackets(basicHeartComponent); + } + + public TextComponent consoleHeart() { + return surroundWithBrackets(basicHeartComponent('\u2665')); + } + + //console can do u2665, u2764 looks better in-game + private TextComponent basicHeartComponent(char heartChar) { + return Component.text() + .content(String.valueOf(heartChar)) + .color(HEARTS) + .build(); } /** Returns a TextComponent for the subStatName, or an empty component.*/ - private TextComponent subStatName(@Nullable String prettySubStatName, Target selection) { + private TextComponent subStatName(@Nullable String prettySubStatName, Target target) { if (prettySubStatName == null) { return Component.empty(); } else { return getComponentBuilder(null, - getColorFromString(config.getSubStatNameDecoration(selection, false)), - getStyleFromString(config.getSubStatNameDecoration(selection, true))) + getColorFromString(config.getSubStatNameDecoration(target, false)), + getStyleFromString(config.getSubStatNameDecoration(target, true))) .append(text("(")) .append(text(prettySubStatName)) .append(text(")")) @@ -287,11 +319,11 @@ public class ComponentFactory { } /** Returns a TranslatableComponent for the subStatName, or an empty component.*/ - private TextComponent subStatNameTranslatable(String subStatKey, Target selection) { + private TextComponent subStatNameTranslatable(String subStatKey, Target target) { if (subStatKey != null) { return getComponentBuilder(null, - getColorFromString(config.getSubStatNameDecoration(selection, false)), - getStyleFromString(config.getSubStatNameDecoration(selection, true))) + getColorFromString(config.getSubStatNameDecoration(target, false)), + getStyleFromString(config.getSubStatNameDecoration(target, true))) .append(text("(")) .append(translatable() .key(subStatKey)) @@ -322,14 +354,14 @@ public class ComponentFactory { .args(subStat)); } - private TextComponent statNumberWithHoverText(String mainNumber, String hoverNumber, @Nullable String hoverUnitName, @Nullable String hoverUnitKey, @Nullable TextComponent heart, Target selection) { - TextColor baseColor = getColorFromString(config.getStatNumberDecoration(selection, false)); - TextDecoration style = getStyleFromString(config.getStatNumberDecoration(selection, true)); + private TextComponent statNumberWithHoverText(String mainNumber, String hoverNumber, @Nullable String hoverUnitName, @Nullable String hoverUnitKey, @Nullable TextComponent heartComponent, Target target) { + TextColor baseColor = getColorFromString(config.getStatNumberDecoration(target, false)); + TextDecoration style = getStyleFromString(config.getStatNumberDecoration(target, true)); TextComponent.Builder hoverText = getComponentBuilder(hoverNumber, getLighterColor(baseColor), style); - if (heart != null) { + if (heartComponent != null) { hoverText.append(space()) - .append(heart); + .append(heartComponent); } else if (hoverUnitKey != null) { hoverText.append(space()) @@ -342,7 +374,7 @@ public class ComponentFactory { return getComponent(mainNumber, baseColor, style).hoverEvent(HoverEvent.showText(hoverText)); } - private TextComponent surroundingBrackets(TextComponent component) { + private TextComponent surroundWithBrackets(TextComponent component) { return getComponent(null, BRACKETS, null) .append(text("[")) .append(component) diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/PrideComponentFactory.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/PrideComponentFactory.java index 12f3896..7f3b8f2 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/PrideComponentFactory.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/components/PrideComponentFactory.java @@ -23,6 +23,7 @@ public class PrideComponentFactory extends ComponentFactory { PREFIX = PluginColor.GOLD.getColor(); BRACKETS = PluginColor.GRAY.getColor(); UNDERSCORE = PluginColor.DARK_PURPLE.getColor(); + HEARTS = PluginColor.RED.getColor(); MSG_MAIN = PluginColor.GRAY.getColor(); //difference 1 MSG_ACCENT = PluginColor.LIGHT_GOLD.getColor(); //difference 2 diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/msgutils/NumberFormatter.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/msgutils/NumberFormatter.java index f849646..3d1ae47 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/msgutils/NumberFormatter.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/msgutils/NumberFormatter.java @@ -20,25 +20,13 @@ public final class NumberFormatter { /** Turns the input number into a more readable format depending on its type (number-of-times, time-, damage- or distance-based) according to the corresponding config settings, and adds commas in groups of 3.*/ - public String format(long number, Unit statUnit) { - return format(number, statUnit, null); - } - - public String format(long number, Unit statUnit, Unit smallTimeUnit) { - if (smallTimeUnit == null) { - return switch (statUnit.getType()) { - case DISTANCE -> formatDistance(number, statUnit); - case DAMAGE -> formatDamage(number, statUnit); - default -> format.format(number); - }; - } else { - return formatTime(number, statUnit, smallTimeUnit); - } + public String formatNumber(long number) { + return format.format(number); } /** The unit of damage-based statistics is half a heart by default. This method turns the number into hearts. */ - private String formatDamage(long number, Unit statUnit) { //7 statistics + public String formatDamageNumber(long number, Unit statUnit) { //7 statistics if (statUnit == Unit.HEART) { return format.format(Math.round(number / 2.0)); } else { @@ -48,7 +36,7 @@ public final class NumberFormatter { /** The unit of distance-based statistics is cm by default. This method turns it into blocks by default, and turns it into km or leaves it as cm otherwise, depending on the config settings. */ - private String formatDistance(long number, Unit statUnit) { //15 statistics + public String formatDistanceNumber(long number, Unit statUnit) { //15 statistics switch (statUnit) { case CM -> { return format.format(number); @@ -66,7 +54,7 @@ public final class NumberFormatter { } /** The unit of time-based statistics is ticks by default.*/ - private String formatTime(long number, Unit bigUnit, Unit smallUnit) { //5 statistics + public String formatTimeNumber(long number, Unit bigUnit, Unit smallUnit) { //5 statistics if (number == 0) { return "-"; } diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/reload/ReloadThread.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/reload/ReloadThread.java index 76012e3..218ec91 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/reload/ReloadThread.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/reload/ReloadThread.java @@ -81,7 +81,7 @@ public final class ReloadThread extends Thread { private void reloadEverything() { MyLogger.setDebugLevel(config.getDebugLevel()); - OutputManager.updateMessageWriters(config); + OutputManager.updateMessageBuilders(); OfflinePlayerHandler.updateOfflinePlayerList(loadOfflinePlayers()); ShareManager.updateSettings(config); } diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/request/StatRequest.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/request/StatRequest.java index 33b7b6a..ff1ac08 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/request/StatRequest.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/request/StatRequest.java @@ -2,6 +2,7 @@ package com.gmail.artemis.the.gr8.playerstats.statistic.request; import com.gmail.artemis.the.gr8.playerstats.api.RequestGenerator; import com.gmail.artemis.the.gr8.playerstats.enums.Target; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Statistic; import org.bukkit.command.CommandSender; @@ -40,34 +41,31 @@ public final class StatRequest { private Material item; private boolean playerFlag; - /** Create a new {@link StatRequest} with default values: -
- CommandSender sender (provided) -
- Target target = {@link Target#TOP} -
- boolean playerFlag = false -
- boolean isAPIRequest = false - - @param sender the CommandSender who prompted this RequestGenerator - */ - public StatRequest(@NotNull CommandSender sender) { - this(sender, false); - } - /** Create a new {@link StatRequest} with default values:
- CommandSender sender (provided)
- Target target = {@link Target#TOP} +
- int topListSize = 10
- boolean playerFlag = false -
- boolean isAPIRequest (provided) +
- boolean isAPIRequest @param sender the CommandSender who prompted this RequestGenerator @param isAPIRequest whether this RequestGenerator is coming through the API or the onCommand */ - public StatRequest(@NotNull CommandSender sender, boolean isAPIRequest) { + private StatRequest(@NotNull CommandSender sender, boolean isAPIRequest) { this.sender = sender; this.isAPIRequest = isAPIRequest; target = Target.TOP; playerFlag = false; } + public static StatRequest getBasicRequest(CommandSender sender) { + return new StatRequest(sender, false); + } + + public static StatRequest getBasicAPIRequest() { + return new StatRequest(Bukkit.getConsoleSender(), true); + } + public void setAPIRequest() { this.isAPIRequest = true; } diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/request/StatRequestHandler.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/request/StatRequestHandler.java index b56489a..92042b5 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/request/StatRequestHandler.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/request/StatRequestHandler.java @@ -5,7 +5,6 @@ import com.gmail.artemis.the.gr8.playerstats.api.RequestGenerator; import com.gmail.artemis.the.gr8.playerstats.enums.Target; import com.gmail.artemis.the.gr8.playerstats.utils.EnumHandler; import com.gmail.artemis.the.gr8.playerstats.utils.OfflinePlayerHandler; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Statistic; import org.bukkit.command.CommandSender; @@ -17,20 +16,20 @@ import org.jetbrains.annotations.NotNull; public record StatRequestHandler(StatRequest statRequest) implements RequestGenerator { public static StatRequestHandler playerRequestHandler(String playerName) { - StatRequest request = new StatRequest(Bukkit.getConsoleSender(), true); + StatRequest request = StatRequest.getBasicAPIRequest(); request.setTarget(Target.PLAYER); request.setPlayerName(playerName); return new StatRequestHandler(request); } public static StatRequestHandler serverRequestHandler() { - StatRequest request = new StatRequest(Bukkit.getConsoleSender(), true); + StatRequest request = StatRequest.getBasicAPIRequest(); request.setTarget(Target.SERVER); return new StatRequestHandler(request); } public static StatRequestHandler topRequestHandler(int topListSize) { - StatRequest request = new StatRequest(Bukkit.getConsoleSender(), true); + StatRequest request = StatRequest.getBasicAPIRequest(); request.setTarget(Target.TOP); request.setTopListSize(topListSize != 0 ? topListSize : Main.getConfigHandler().getTopListMaxSize()); return new StatRequestHandler(request); @@ -40,7 +39,8 @@ public record StatRequestHandler(StatRequest statRequest) implements RequestGene @param sender the CommandSender that requested this specific statistic */ public static StatRequestHandler internalRequestHandler(CommandSender sender) { - StatRequest request = new StatRequest(sender); + StatRequest request = StatRequest.getBasicRequest(sender); + request.setTopListSize(Main.getConfigHandler().getTopListMaxSize()); return new StatRequestHandler(request); }