1
0

jank impl of random player colors

This commit is contained in:
Lee
2024-03-20 15:53:40 +00:00
parent e86e6258a2
commit d9a2fd16d0
5 changed files with 139 additions and 7 deletions

5
.gitignore vendored
View File

@ -4,10 +4,7 @@ target/
!**/src/test/**/target/ !**/src/test/**/target/
### IntelliJ IDEA ### ### IntelliJ IDEA ###
.idea/modules.xml .idea
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws *.iws
*.iml *.iml
*.ipr *.ipr

View File

@ -1,8 +1,8 @@
package cc.fascinated; package cc.fascinated;
import cc.fascinated.command.CommandManager; import cc.fascinated.command.CommandManager;
import cc.fascinated.playercolors.ColorManager;
import cc.fascinated.worldsize.WorldSizeManager; import cc.fascinated.worldsize.WorldSizeManager;
import cc.fascinated.worldsize.impl.WorldSizeCommand;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
public class Aetheria extends JavaPlugin { public class Aetheria extends JavaPlugin {
@ -22,5 +22,6 @@ public class Aetheria extends JavaPlugin {
public void onEnable() { public void onEnable() {
new CommandManager(); new CommandManager();
new WorldSizeManager(); new WorldSizeManager();
new ColorManager();
} }
} }

View File

@ -2,7 +2,6 @@ package cc.fascinated.command;
import cc.fascinated.Aetheria; import cc.fascinated.Aetheria;
import cc.fascinated.command.impl.TotalJoinsCommand; import cc.fascinated.command.impl.TotalJoinsCommand;
import org.bukkit.Bukkit;
import java.util.Objects; import java.util.Objects;

View File

@ -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<Player, NamedTextColor> chatColors = new HashMap<>();
/**
* List of possible colors that can be randomly picked
*/
private final List<NamedTextColor> 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();
});
}
}

View File

@ -4,7 +4,6 @@ import lombok.*;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;