diff --git a/.gitignore b/.gitignore index 5ff6309..d769462 100644 --- a/.gitignore +++ b/.gitignore @@ -4,10 +4,7 @@ target/ !**/src/test/**/target/ ### IntelliJ IDEA ### -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ +.idea *.iws *.iml *.ipr diff --git a/src/main/java/cc/fascinated/Aetheria.java b/src/main/java/cc/fascinated/Aetheria.java index 7176746..a4b9248 100644 --- a/src/main/java/cc/fascinated/Aetheria.java +++ b/src/main/java/cc/fascinated/Aetheria.java @@ -1,8 +1,8 @@ package cc.fascinated; import cc.fascinated.command.CommandManager; +import cc.fascinated.playercolors.ColorManager; import cc.fascinated.worldsize.WorldSizeManager; -import cc.fascinated.worldsize.impl.WorldSizeCommand; import org.bukkit.plugin.java.JavaPlugin; public class Aetheria extends JavaPlugin { @@ -22,5 +22,6 @@ public class Aetheria extends JavaPlugin { public void onEnable() { new CommandManager(); new WorldSizeManager(); + new ColorManager(); } } \ No newline at end of file diff --git a/src/main/java/cc/fascinated/command/CommandManager.java b/src/main/java/cc/fascinated/command/CommandManager.java index 269863c..61bf7b2 100644 --- a/src/main/java/cc/fascinated/command/CommandManager.java +++ b/src/main/java/cc/fascinated/command/CommandManager.java @@ -2,7 +2,6 @@ package cc.fascinated.command; import cc.fascinated.Aetheria; import cc.fascinated.command.impl.TotalJoinsCommand; -import org.bukkit.Bukkit; import java.util.Objects; diff --git a/src/main/java/cc/fascinated/playercolors/ColorManager.java b/src/main/java/cc/fascinated/playercolors/ColorManager.java new file mode 100644 index 0000000..8aed362 --- /dev/null +++ b/src/main/java/cc/fascinated/playercolors/ColorManager.java @@ -0,0 +1,136 @@ +package cc.fascinated.playercolors; + +import cc.fascinated.Aetheria; +import io.papermc.paper.event.player.AsyncChatEvent; +import it.unimi.dsi.fastutil.HashCommon; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class ColorManager implements Listener { + + /** + * Cache of the chat colors for each player + */ + private final Map chatColors = new HashMap<>(); + + /** + * List of possible colors that can be randomly picked + */ + private final List validColors = List.of( + NamedTextColor.RED, + NamedTextColor.GREEN, + NamedTextColor.BLUE, + NamedTextColor.YELLOW, + NamedTextColor.AQUA, + NamedTextColor.DARK_AQUA, + NamedTextColor.GRAY, + NamedTextColor.LIGHT_PURPLE, + NamedTextColor.WHITE + ); + + public ColorManager() { + Aetheria.INSTANCE.getServer().getPluginManager().registerEvents(this, Aetheria.INSTANCE); + + Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); + for (NamedTextColor color : validColors) { + if (scoreboard.getTeam(color.toString().toLowerCase()) != null) { + // Unregister the old team + Objects.requireNonNull(scoreboard.getTeam(color.toString().toLowerCase())).unregister(); + } + scoreboard.registerNewTeam(color.toString().toLowerCase()).color(color); + } + + for (Player player : Bukkit.getOnlinePlayers()) { + setChatColor(player); + } + } + + /** + * Gets a random color for the player + * based on their uuid + * + * @param player the player to get the color for + * @return the color for the player + */ + private NamedTextColor getColorForPlayer(Player player) { + return chatColors.computeIfAbsent(player, (e) -> { + int hash = HashCommon.mix(player.getUniqueId().hashCode()); + int index = HashCommon.mix(hash) & 0xF; + + return validColors.get(index); + }); + } + + /** + * Set the color for a player + * + * @param player the player to set the color for + */ + public void setChatColor(Player player) { + Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); + Team team = scoreboard.getTeam(getColorForPlayer(player).toString().toLowerCase()); + if (team == null) { + return; + } + if (team.getEntries().contains(player.getName())) { + return; + } + team.addEntry(player.getName()); + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + setChatColor(player); + } + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + Player player = event.getPlayer(); + + Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); + Team team = scoreboard.getTeam(getColorForPlayer(player).toString().toLowerCase()); + if (team == null) { + return; + } + if (!team.getEntries().contains(player.getName())) { + return; + } + team.removeEntry(player.getName()); + chatColors.remove(player); + } + + @EventHandler + public void onChat(AsyncChatEvent event) { + Player player = event.getPlayer(); + + NamedTextColor color = chatColors.get(player); + if (color == null) { + return; + } + + event.renderer((source, sourceDisplayName, message, viewer) -> { + return Component.text() + .append(Component.text("<")) + .append(player.displayName().color(color)) + .append(Component.text(">")) + .append(Component.space()) + .append(message) + .asComponent(); + }); + } +} diff --git a/src/main/java/cc/fascinated/utils/TimeUtils.java b/src/main/java/cc/fascinated/utils/TimeUtils.java index 0608fca..1d8fbb1 100644 --- a/src/main/java/cc/fascinated/utils/TimeUtils.java +++ b/src/main/java/cc/fascinated/utils/TimeUtils.java @@ -4,7 +4,6 @@ import lombok.*; import lombok.experimental.UtilityClass; import org.jetbrains.annotations.Nullable; -import java.text.SimpleDateFormat; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern;