From bd4ceda4f1162d14e90ab78e9b53f3761c4d9124 Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+ChomeNS@users.noreply.github.com> Date: Wed, 4 Dec 2024 19:49:24 +0700 Subject: [PATCH] feat,refactor: team joiner plugin and some refactoring --- build-number.txt | 2 +- .../java/me/chayapak1/chomens_bot/Bot.java | 2 + .../chayapak1/chomens_bot/Configuration.java | 1 + .../me/chayapak1/chomens_bot/data/Team.java | 5 ++ .../chomens_bot/plugins/ChatPlugin.java | 5 +- .../chomens_bot/plugins/TeamJoinerPlugin.java | 57 +++++++++++++++++++ .../chomens_bot/plugins/TeamPlugin.java | 53 ++++++++++++----- .../chomens_bot/util/UUIDUtilities.java | 7 ++- src/main/resources/default-config.yml | 1 + 9 files changed, 115 insertions(+), 18 deletions(-) create mode 100644 src/main/java/me/chayapak1/chomens_bot/plugins/TeamJoinerPlugin.java diff --git a/build-number.txt b/build-number.txt index 019cce38..5a9264ff 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -1154 \ No newline at end of file +1158 \ No newline at end of file diff --git a/src/main/java/me/chayapak1/chomens_bot/Bot.java b/src/main/java/me/chayapak1/chomens_bot/Bot.java index 0ee9a5cf..283941c6 100644 --- a/src/main/java/me/chayapak1/chomens_bot/Bot.java +++ b/src/main/java/me/chayapak1/chomens_bot/Bot.java @@ -81,6 +81,7 @@ public class Bot { public MailPlugin mail; public PacketSnifferPlugin packetSniffer; public VoiceChatPlugin voiceChat; + public TeamJoinerPlugin teamJoiner; public TagPlugin tag; public WorldPlugin world; public AuthPlugin auth; @@ -129,6 +130,7 @@ public class Bot { this.mail = new MailPlugin(this); this.packetSniffer = new PacketSnifferPlugin(this); this.voiceChat = new VoiceChatPlugin(this); + this.teamJoiner = new TeamJoinerPlugin(this); this.tag = new TagPlugin(this); this.world = new WorldPlugin(this); this.auth = new AuthPlugin(this); diff --git a/src/main/java/me/chayapak1/chomens_bot/Configuration.java b/src/main/java/me/chayapak1/chomens_bot/Configuration.java index 1ab18bd1..edf393ba 100644 --- a/src/main/java/me/chayapak1/chomens_bot/Configuration.java +++ b/src/main/java/me/chayapak1/chomens_bot/Configuration.java @@ -17,6 +17,7 @@ public class Configuration { public String weatherApiKey; public String bossBarNamespace = "chomens_bot"; + public String teamName = "chomens_bot"; public Core core = new Core(); public Discord discord = new Discord(); diff --git a/src/main/java/me/chayapak1/chomens_bot/data/Team.java b/src/main/java/me/chayapak1/chomens_bot/data/Team.java index e24543b4..c4353cbf 100644 --- a/src/main/java/me/chayapak1/chomens_bot/data/Team.java +++ b/src/main/java/me/chayapak1/chomens_bot/data/Team.java @@ -8,8 +8,11 @@ import org.geysermc.mcprotocollib.protocol.data.game.scoreboard.NameTagVisibilit import org.geysermc.mcprotocollib.protocol.data.game.scoreboard.TeamColor; import net.kyori.adventure.text.Component; +import java.util.List; + public class Team { public String teamName; + public List players; public Component displayName; public boolean friendlyFire; public boolean seeFriendlyInvisibles; @@ -21,6 +24,7 @@ public class Team { public Team ( String teamName, + List players, Component displayName, boolean friendlyFire, boolean seeFriendlyInvisibles, @@ -31,6 +35,7 @@ public class Team { Component suffix ) { this.teamName = teamName; + this.players = players; this.displayName = displayName; this.friendlyFire = friendlyFire; this.seeFriendlyInvisibles = seeFriendlyInvisibles; diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/ChatPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/ChatPlugin.java index 4dfc464e..efaf9335 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/ChatPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/ChatPlugin.java @@ -120,7 +120,10 @@ public class ChatPlugin extends Bot.Listener { case 4 -> Component.translatable("%s", name, message); // paper chat type thingy case 5 -> Component.translatable("chat.type.announcement", name, message); // /say case 6, 7 -> { - final Team botTeam = bot.team.teamsByPlayer.get(bot.profile.getName()); + final Team botTeam = bot.team.findTeamByMember(bot.profile.getName()); + + if (botTeam == null) yield null; + final Component botTeamDisplayName = Component .translatable("chat.square_brackets") .arguments(botTeam.displayName) diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/TeamJoinerPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/TeamJoinerPlugin.java new file mode 100644 index 00000000..12e319f8 --- /dev/null +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/TeamJoinerPlugin.java @@ -0,0 +1,57 @@ +package me.chayapak1.chomens_bot.plugins; + +import me.chayapak1.chomens_bot.Bot; +import me.chayapak1.chomens_bot.data.Team; +import me.chayapak1.chomens_bot.util.UUIDUtilities; + +// the name might sound confusing but it just adds the bot into its own team +public class TeamJoinerPlugin extends TickPlugin.Listener { + public final String teamName; + + private final Bot bot; + + public TeamJoinerPlugin (Bot bot) { + this.bot = bot; + this.teamName = bot.config.teamName; + + bot.tick.addListener(this); + } + + @Override + public void onTick () { + final Team team = bot.team.findTeamByName(teamName); + + if (team == null) { + addTeam(); + return; + } + + if (!team.players.contains(bot.username)) joinTeam(); + + for (String player : team.players) { + if (!player.equals(bot.username)) { + excludeOthers(); + break; + } + } + } + + private void addTeam () { + bot.core.run("minecraft:team add " + teamName); + joinTeam(); + } + + private void joinTeam () { + bot.core.run("minecraft:team join " + teamName + " " + UUIDUtilities.selector(bot.profile.getId())); + } + + private void excludeOthers () { + bot.core.run( + String.format( + "minecraft:team leave %s,team=%s]", + UUIDUtilities.exclusiveSelector(bot.profile.getId(), false), + teamName + ) + ); + } +} diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/TeamPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/TeamPlugin.java index 9e86ddcf..8604095a 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/TeamPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/TeamPlugin.java @@ -1,22 +1,38 @@ package me.chayapak1.chomens_bot.plugins; +import me.chayapak1.chomens_bot.Bot; +import me.chayapak1.chomens_bot.data.Team; import org.geysermc.mcprotocollib.network.Session; import org.geysermc.mcprotocollib.network.packet.Packet; import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.scoreboard.ClientboundSetPlayerTeamPacket; -import me.chayapak1.chomens_bot.Bot; -import me.chayapak1.chomens_bot.data.Team; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class TeamPlugin extends Bot.Listener { - public final Map teams = new HashMap<>(); - public final Map teamsByPlayer = new HashMap<>(); + public final List teams = new ArrayList<>(); public TeamPlugin (Bot bot) { bot.addListener(this); } + public Team findTeamByName (String name) { + for (Team team : teams) { + if (team.teamName.equals(name)) return team; + } + + return null; + } + + public Team findTeamByMember (String member) { + for (Team team : teams) { + if (team.players.contains(member)) return team; + } + + return null; + } + @Override public void packetReceived(Session session, Packet packet) { if (packet instanceof ClientboundSetPlayerTeamPacket) packetReceived((ClientboundSetPlayerTeamPacket) packet); @@ -28,6 +44,7 @@ public class TeamPlugin extends Bot.Listener { case CREATE -> { final Team team = new Team( packet.getTeamName(), + new ArrayList<>(), packet.getDisplayName(), packet.isFriendlyFire(), packet.isSeeFriendlyInvisibles(), @@ -38,11 +55,17 @@ public class TeamPlugin extends Bot.Listener { packet.getSuffix() ); - teams.put(packet.getTeamName(), team); + teams.add(team); + } + case REMOVE -> { + final Team team = findTeamByName(packet.getTeamName()); + + if (team == null) return; + + teams.remove(team); } - case REMOVE -> teams.remove(packet.getTeamName()); case UPDATE -> { - final Team team = teams.get(packet.getTeamName()); + final Team team = findTeamByName(packet.getTeamName()); if (team == null) return; @@ -57,20 +80,22 @@ public class TeamPlugin extends Bot.Listener { team.suffix = packet.getSuffix(); } case ADD_PLAYER -> { - final Team team = teams.get(packet.getTeamName()); + final Team team = findTeamByName(packet.getTeamName()); if (team == null) return; - for (String player : packet.getPlayers()) teamsByPlayer.put(player, team); + team.players.addAll(Arrays.asList(packet.getPlayers())); } case REMOVE_PLAYER -> { - final Team team = teams.get(packet.getTeamName()); + final Team team = findTeamByName(packet.getTeamName()); if (team == null) return; - for (String player : packet.getPlayers()) teamsByPlayer.remove(player); + team.players.removeAll(Arrays.asList(packet.getPlayers())); } } - } catch (Exception e) { e.printStackTrace(); } + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/me/chayapak1/chomens_bot/util/UUIDUtilities.java b/src/main/java/me/chayapak1/chomens_bot/util/UUIDUtilities.java index 149a933a..f7299409 100644 --- a/src/main/java/me/chayapak1/chomens_bot/util/UUIDUtilities.java +++ b/src/main/java/me/chayapak1/chomens_bot/util/UUIDUtilities.java @@ -38,6 +38,9 @@ public class UUIDUtilities { return "[I;" + array[0] + "," + array[1] + "," + array[2] + "," + array[3] + "]"; // TODO: improve lol } - public static String selector (UUID uuid) { return "@a[limit=1,nbt={UUID:" + snbt(uuid) + "}]"; } - public static String exclusiveSelector (UUID uuid) { return "@a[nbt=!{UUID:" + snbt(uuid) + "}]"; } + public static String selector (UUID uuid) { return selector(uuid, true); } + public static String selector (UUID uuid, boolean end) { return "@a[limit=1,nbt={UUID:" + snbt(uuid) + "}" + (end ? "]" : ""); } + + public static String exclusiveSelector (UUID uuid) { return exclusiveSelector(uuid, true); } + public static String exclusiveSelector (UUID uuid, boolean end) { return "@a[nbt=!{UUID:" + snbt(uuid) + "}" + (end ? "]" : ""); } } diff --git a/src/main/resources/default-config.yml b/src/main/resources/default-config.yml index 2df7f317..d2dd6000 100644 --- a/src/main/resources/default-config.yml +++ b/src/main/resources/default-config.yml @@ -83,6 +83,7 @@ keys: weatherApiKey: 'key here' # weatherapi.com key bossBarNamespace: 'chomens_bot' # useful when you make a clone of the bot +teamName: 'chomens_bot' # i recommend having this value the same as bossBarNamespace core: start: