Skip to content
This repository was archived by the owner on Jan 24, 2024. It is now read-only.

Commit 2f27e77

Browse files
authored
Merge pull request #3 from CherryCraftMC/tablist-system
Add LuckPerms dependency and enhance chat system with role colors
2 parents 231bf33 + 6890472 commit 2f27e77

File tree

4 files changed

+160
-25
lines changed

4 files changed

+160
-25
lines changed

pom.xml

+6
Original file line numberDiff line numberDiff line change
@@ -116,5 +116,11 @@
116116
<version>2.11.5</version>
117117
<scope>provided</scope>
118118
</dependency>
119+
<dependency>
120+
<groupId>net.luckperms</groupId>
121+
<artifactId>api</artifactId>
122+
<version>5.4</version>
123+
<scope>provided</scope>
124+
</dependency>
119125
</dependencies>
120126
</project>

src/main/java/net/cherrycraft/cherrycore/chatsystem/ChatSystem.java

+64-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22

33
import me.clip.placeholderapi.PlaceholderAPI;
44
import net.cherrycraft.cherrycore.CherryCore;
5+
import net.cherrycraft.cherrycore.chatsystem.utils.RankColors;
56
import net.kyori.adventure.text.minimessage.MiniMessage;
67
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
8+
import net.luckperms.api.LuckPerms;
9+
import net.luckperms.api.LuckPermsProvider;
10+
import org.bukkit.entity.Player;
711
import org.bukkit.event.EventHandler;
812
import org.bukkit.event.EventPriority;
913
import org.bukkit.event.Listener;
@@ -17,7 +21,65 @@ public class ChatSystem implements Listener {
1721

1822
@EventHandler(priority = EventPriority.HIGHEST)
1923
public void onPlayerPlaceholderChat(AsyncPlayerChatEvent event) {
20-
String format = serializer.serialize(miniMessage.deserialize(PlaceholderAPI.setPlaceholders(event.getPlayer(), CherryCore.getInstance().getConfig().getString("format", "%luckperms_prefix%{display_name} %luckperms_suffix% &#1883C4» &#7D878C{message}").replace("{name}", event.getPlayer().getName()).replace("{display_name}", event.getPlayer().getDisplayName()))));
21-
event.setFormat(format.replace("{message}", event.getMessage().replace("%", "‰")));
24+
LuckPerms luckPerms = LuckPermsProvider.get();
25+
Player player = event.getPlayer();
26+
String primaryGroup = luckPerms.getUserManager().getUser(player.getUniqueId()).getPrimaryGroup();
27+
String roleColor = "";
28+
switch (primaryGroup.toLowerCase()) {
29+
case "owner":
30+
roleColor = RankColors.OWNER.getColor();
31+
break;
32+
case "manager":
33+
roleColor = RankColors.MANAGER.getColor();
34+
break;
35+
case "developer":
36+
roleColor = RankColors.DEVELOPER.getColor();
37+
break;
38+
case "game-master":
39+
roleColor = RankColors.GAME_MASTER.getColor();
40+
break;
41+
case "admin":
42+
roleColor = RankColors.ADMIN.getColor();
43+
break;
44+
case "moderator":
45+
roleColor = RankColors.MODERATOR.getColor();
46+
break;
47+
case "trainee":
48+
roleColor = RankColors.TRAINEE.getColor();
49+
break;
50+
case "designer":
51+
roleColor = RankColors.DESIGNER.getColor();
52+
break;
53+
case "builder":
54+
roleColor = RankColors.BUILDER.getColor();
55+
break;
56+
case "youtuber":
57+
roleColor = RankColors.YOUTUBE.getColor();
58+
break;
59+
case "cherry-platinum-lifetime":
60+
roleColor = RankColors.CHERRY_PLATINUM_LIFETIME.getColor();
61+
break;
62+
case "cherry-platinum":
63+
roleColor = RankColors.CHERRY_PLATINUM.getColor();
64+
break;
65+
case "cherry-gold-lifetime":
66+
roleColor = RankColors.CHERRY_GOLD_LIFETIME.getColor();
67+
break;
68+
case "cherry-gold":
69+
roleColor = RankColors.CHERRY_GOLD.getColor();
70+
break;
71+
case "cherry-lifetime":
72+
roleColor = RankColors.CHERRY_LIFETIME.getColor();
73+
break;
74+
case "cherry":
75+
roleColor = RankColors.CHERRY.getColor();
76+
break;
77+
default:
78+
roleColor = RankColors.DEFAULT.getColor();
79+
break;
80+
}
81+
event.setFormat(serializer.serialize(miniMessage.deserialize(PlaceholderAPI.setPlaceholders(event.getPlayer(), CherryCore.getInstance().getConfig().getString("format", "%luckperms_prefix%{display_name} %luckperms_suffix% &#1883C4» &#7D878C{message}").replace("{name}", event.getPlayer().getName()).replace("{display_name}", event.getPlayer().getDisplayName())))).replace("{message}", event.getMessage().replace("%", "‰")).replace("{playername}", serializer.serialize(miniMessage.deserialize(roleColor + player.getName()))));
2282
}
83+
84+
2385
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package net.cherrycraft.cherrycore.chatsystem.utils;
2+
3+
public enum RankColors {
4+
OWNER("<gradient:#fabf37:#fff024:0>", 1),
5+
MANAGER("<gradient:#ff8624:#ff2479:1>", 2),
6+
DEVELOPER("<#e3ff24>", 3),
7+
GAME_MASTER("<#e3ff24>", 4),
8+
ADMIN("<#c624ff>", 5),
9+
MODERATOR("<#24a8ff>", 6),
10+
TRAINEE("<#7bc9fc>", 7),
11+
DESIGNER("<gradient:#ee7bfc:#7bb7fc:0>", 8),
12+
BUILDER("<#10c4b7>", 9),
13+
YOUTUBE("<#ea4444>", 10),
14+
CHERRY_PLATINUM_LIFETIME("<gradient:#a0b2c6:#abcdf3:0>", 11),
15+
CHERRY_PLATINUM("<#a0b2c6>", 12),
16+
CHERRY_GOLD_LIFETIME("<gradient:#f3dfab:#f8c373:1>", 13),
17+
CHERRY_GOLD("<#f3dfab>", 14),
18+
CHERRY_LIFETIME("<gradient:#ae0a0a:#f32424:1>", 15),
19+
CHERRY("<#f32424>", 16),
20+
DEFAULT("<gray>", 17);
21+
22+
private final String color;
23+
private final int priority;
24+
25+
RankColors(String color, int priority) {
26+
this.color = color;
27+
this.priority = priority;
28+
}
29+
30+
public static int compareRanks(RankColors rank1, RankColors rank2) {
31+
return Integer.compare(rank1.getPriority(), rank2.getPriority());
32+
}
33+
34+
public String getColor() {
35+
return color;
36+
}
37+
38+
public int getPriority() {
39+
return priority;
40+
}
41+
}

src/main/java/net/cherrycraft/cherrycore/tablist/Tablist.java

+49-23
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,27 @@
22

33
import me.clip.placeholderapi.PlaceholderAPI;
44
import net.cherrycraft.cherrycore.CherryCore;
5+
import net.cherrycraft.cherrycore.chatsystem.utils.RankColors;
56
import net.kyori.adventure.text.minimessage.MiniMessage;
67
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
8+
import net.luckperms.api.LuckPerms;
9+
import net.luckperms.api.LuckPermsProvider;
710
import org.bukkit.Bukkit;
8-
import org.bukkit.entity.ArmorStand;
911
import org.bukkit.entity.Player;
1012
import org.bukkit.event.EventHandler;
1113
import org.bukkit.event.Listener;
1214
import org.bukkit.event.player.PlayerJoinEvent;
1315
import org.bukkit.scoreboard.Team;
1416

15-
import java.util.HashMap;
16-
import java.util.Map;
17-
import java.util.UUID;
17+
import java.util.Comparator;
18+
import java.util.List;
19+
import java.util.stream.Collectors;
1820

1921
public class Tablist implements Listener {
2022

2123
static MiniMessage miniMessage = MiniMessage.builder().build();
2224
static LegacyComponentSerializer serializer = LegacyComponentSerializer.legacySection();
23-
24-
private final Map<UUID, ArmorStand> armorStands = new HashMap<>();
25+
private final LuckPerms luckPerms = LuckPermsProvider.get();
2526

2627
@EventHandler
2728
public void onPlayerJoin(PlayerJoinEvent event) {
@@ -32,23 +33,48 @@ public void onPlayerJoin(PlayerJoinEvent event) {
3233
player.setPlayerListHeader(header);
3334
player.setPlayerListFooter(footer);
3435

35-
// Get or create a team for the player
36-
org.bukkit.scoreboard.Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
37-
Team team = scoreboard.getTeam(player.getName());
38-
if (team == null) {
39-
team = scoreboard.registerNewTeam(player.getName());
40-
}
36+
// Schedule a repeating task that updates the tablist every second
37+
Bukkit.getScheduler().runTaskTimerAsynchronously(CherryCore.getInstance(), () -> {
38+
// Get a list of all online players
39+
List<Player> players = Bukkit.getOnlinePlayers().stream().collect(Collectors.toList());
40+
41+
// Sort the players based on their ranks
42+
players.sort(Comparator.comparingInt(player1 -> {
43+
String primaryGroup = luckPerms.getUserManager().getUser(player1.getUniqueId()).getPrimaryGroup();
44+
RankColors rankColor = RankColors.valueOf(primaryGroup.toUpperCase());
45+
return rankColor.getPriority();
46+
}));
4147

42-
// Add the player to the team
43-
team.addEntry(player.getName());
48+
// Update the tablist
49+
for (int i = 0; i < players.size(); i++) {
50+
Player p = players.get(i);
51+
org.bukkit.scoreboard.Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
52+
String primaryGroup = luckPerms.getUserManager().getUser(p.getUniqueId()).getPrimaryGroup();
53+
Team team = scoreboard.getTeam(primaryGroup);
54+
if (team == null) {
55+
team = scoreboard.registerNewTeam(primaryGroup);
56+
}
4457

45-
// Schedule a repeating task that updates the team's prefix and suffix every 5 seconds
46-
Team finalTeam = team;
47-
Bukkit.getScheduler().runTaskTimerAsynchronously(CherryCore.getInstance(), () -> {
48-
String prefix = PlaceholderAPI.setPlaceholders(player, "%luckperms_prefix% ");
49-
String suffix = PlaceholderAPI.setPlaceholders(player, " %luckperms_suffix%");
50-
finalTeam.setPrefix(prefix);
51-
finalTeam.setSuffix(suffix);
52-
}, 0L, 100L); // 100 ticks = 5 seconds
58+
// Remove the player from their current team, if any
59+
for (Team existingTeam : scoreboard.getTeams()) {
60+
if (existingTeam.hasEntry(p.getName())) {
61+
existingTeam.removeEntry(p.getName());
62+
}
63+
}
64+
65+
// Add the player to the team
66+
team.addEntry(p.getName());
67+
68+
// Update the team's prefix and suffix
69+
String prefix = PlaceholderAPI.setPlaceholders(p, "%luckperms_prefix% ");
70+
String suffix = PlaceholderAPI.setPlaceholders(p, " %luckperms_suffix%");
71+
team.setPrefix(prefix);
72+
team.setSuffix(suffix);
73+
74+
// Update the team's display name
75+
RankColors rankColor = RankColors.valueOf(primaryGroup.toUpperCase());
76+
team.setDisplayName(rankColor.getColor());
77+
}
78+
}, 0L, 20L); // 20 ticks = 1 second
5379
}
54-
}
80+
}

0 commit comments

Comments
 (0)