jank impl of random player colors
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
|
|
||||||
|
136
src/main/java/cc/fascinated/playercolors/ColorManager.java
Normal file
136
src/main/java/cc/fascinated/playercolors/ColorManager.java
Normal 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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user