From c727b9382b527b4e76fac8e3f7957c6f528039f9 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Mon, 6 May 2024 22:31:01 +0200 Subject: [PATCH 01/21] refactor: change every implementation to be using packets --- build.gradle.kts | 1 + .../plugin/prefixes/api/PrefixesActor.kt | 16 +- .../plugin/prefixes/api/PrefixesApi.kt | 30 ++- .../plugin/prefixes/api/PrefixesDisplay.kt | 31 +++ .../prefixes/api/PrefixesGlobalDisplay.kt | 79 ++++++++ .../plugin/prefixes/api/PrefixesGroup.kt | 3 +- .../plugin/prefixes/api/PrefixesScoreboard.kt | 19 -- .../api/impl/PrefixesActorBlankImpl.kt | 13 +- .../prefixes/api/impl/PrefixesApiImpl.kt | 28 +-- .../minestom/PrefixesActorMinestomImpl.kt | 40 ++-- .../prefixes/minestom/PrefixesExtension.kt | 3 +- .../PrefixesGlobalDisplayMinestomImpl.kt | 8 + .../PrefixesScoreboardMinestomImpl.kt | 61 ------ .../prefixes/minestom/PrefixesTablist.kt | 186 +++++++++++++++++ prefixes-paper/build.gradle.kts | 1 + .../prefixes/paper/PrefixesActorPaperImpl.kt | 66 ------ .../plugin/prefixes/paper/PrefixesPlugin.kt | 21 +- .../paper/PrefixesScoreboardPaperImpl.kt | 70 ------- .../plugin/prefixes/shared/LuckPermsGroup.kt | 4 +- prefixes-spigot/build.gradle.kts | 1 + .../spigot/LegacyComponentSerializerImpl.kt | 5 + .../spigot/PrefixesActorSpigotImpl.kt | 64 ++++-- .../spigot/PrefixesDisplaySpigotImpl.kt | 140 +++++++++++++ .../spigot/PrefixesGlobalDisplaySpigotImpl.kt | 9 + .../plugin/prefixes/spigot/PrefixesPlugin.kt | 9 +- .../spigot/PrefixesScoreboardSpigotImpl.kt | 72 ------- .../prefixes/spigot/packet/PacketTeam.kt | 147 ++++++++++++++ .../packet/wrappers/WrappedScoreboardTeam.kt | 188 ++++++++++++++++++ 28 files changed, 944 insertions(+), 371 deletions(-) create mode 100644 prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt create mode 100644 prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt delete mode 100644 prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesScoreboard.kt create mode 100644 prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesGlobalDisplayMinestomImpl.kt delete mode 100644 prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesScoreboardMinestomImpl.kt create mode 100644 prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt delete mode 100644 prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesActorPaperImpl.kt delete mode 100644 prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesScoreboardPaperImpl.kt create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt delete mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesScoreboardSpigotImpl.kt create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/wrappers/WrappedScoreboardTeam.kt diff --git a/build.gradle.kts b/build.gradle.kts index 6264480..55ea212 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,6 +23,7 @@ allprojects { maven("https://oss.sonatype.org/content/repositories/central") maven("https://repo.papermc.io/repository/maven-public/") maven("https://jitpack.io") + maven("https://repo.dmulloy2.net/repository/public/") } kotlin { diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt index 9a95beb..d8116ac 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt @@ -4,15 +4,11 @@ import net.kyori.adventure.text.Component import java.util.* interface PrefixesActor { - fun applyGroup(target: UUID, group: PrefixesGroup) - - fun setPrefix(target: UUID, prefix: Component) - - fun setSuffix(target: UUID, suffix: Component) - - fun setColor(target: UUID, color: String) - - fun formatMessage(target: UUID, format: String, message: Component): Component - + fun registerViewer(target: UUID, api: PrefixesApi) + fun applyGroup(target: UUID, group: PrefixesGroup, vararg viewers: UUID) + fun setPrefix(target: UUID, prefix: Component, vararg viewers: UUID) + fun setSuffix(target: UUID, suffix: Component, vararg viewers: UUID) + fun setColor(target: UUID, color: String, vararg viewers: UUID) + fun formatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component fun remove(target: UUID) } \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt index 51c4590..64146de 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt @@ -5,33 +5,43 @@ import java.util.* interface PrefixesApi { + /** + * Registers a player to be able to see prefixes + * @param uniqueId UUID of the target player + */ + fun registerViewer(uniqueId: UUID) + /** * Sets the prefix and suffix of a player in both Tab and Chat * @param uniqueId UUID of the target player * @param group + * @param viewers A list of all viewers of this change (if empty, everyone is affected) */ - fun setWholeName(uniqueId: UUID, group: PrefixesGroup) + fun setWholeName(uniqueId: UUID, group: PrefixesGroup, vararg viewers: UUID) /** * Sets the prefix and suffix of a player in both Tab and Chat * @param uniqueId UUID of the target player * @param groupName + * @param viewers A list of all viewers of this change (if empty, everyone is affected) */ - fun setWholeName(uniqueId: UUID, groupName: String) + fun setWholeName(uniqueId: UUID, groupName: String, vararg viewers: UUID) /** * Sets the prefix of a player in both Tab and Chat * @param uniqueId UUID of the target player * @param prefix prefix to set + * @param viewers A list of all viewers of this change (if empty, everyone is affected) */ - fun setPrefix(uniqueId: UUID, prefix: Component) + fun setPrefix(uniqueId: UUID, prefix: Component, vararg viewers: UUID) /** * Sets the prefix of a player in both Tab and Chat * @param uniqueId UUID of the target player * @param suffix suffix to set + * @param viewers A list of all viewers of this change (if empty, everyone is affected) */ - fun setSuffix(uniqueId: UUID, suffix: Component) + fun setSuffix(uniqueId: UUID, suffix: Component, vararg viewers: UUID) /** * Returns all registered [PrefixesGroup] ordered by priority @@ -60,8 +70,9 @@ interface PrefixesApi { * Changes the Scoreboard Team color of the target player (Used in 1.12+ to make player names colorful) * @param uniqueId UUID of the target player * @param color Color string (ChatColor on spigot, hex colors on other server implementations) + * @param viewers A list of all viewers of this change (if empty, everyone is affected) */ - fun setColor(uniqueId: UUID, color: String) + fun setColor(uniqueId: UUID, color: String, vararg viewers: UUID) /** * Sets the used PrefixesConfig @@ -69,4 +80,13 @@ interface PrefixesApi { */ fun setConfig(config: PrefixesConfig) + /** + * Returns a formatted chat message of the target player that will be sent to the viewer + * @param target UUID of the target player + * @param viewer UUID of the viewing player + * @param format the chat format the message should follow + * @param message Message sent by the [target] + */ + fun formatChatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component + } \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt new file mode 100644 index 0000000..b46487e --- /dev/null +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt @@ -0,0 +1,31 @@ +package app.simplecloud.plugin.prefixes.api + +import net.kyori.adventure.text.format.NamedTextColor + +interface PrefixesDisplay { + fun createTeam(id: String, priority: Int = 0): T? + fun getTeam(id: String): T? + fun updatePrefix(id: String, prefix: C) + + fun updateSuffix(id: String, suffix: C) + + fun updatePriority(id: String, priority: Int): T? + fun updateColor(id: String, color: NamedTextColor) + fun update(id: String, prefix: C, suffix: C, priority: Int) + + fun toPriorityString(priority: Int): String { + if(priority < 0) return "000" + if(priority > 999) return "999" + var result = priority.toString() + for(i in 0 until 3 - result.length) { + result = "0${result}" + } + return result + } + fun addPlayer(id: String, player: P) + fun removePlayer(player: P) + fun setViewer(player: P): Boolean + fun addViewer(player: P): Boolean + fun removeViewer(player: P): Boolean + fun getViewers(): Set

+} \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt new file mode 100644 index 0000000..2a47d83 --- /dev/null +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt @@ -0,0 +1,79 @@ +package app.simplecloud.plugin.prefixes.api + +import net.kyori.adventure.text.format.NamedTextColor +import java.util.Optional +import java.util.UUID + +open class PrefixesGlobalDisplay { + + + private val displays = mutableMapOf>() + + + private var defaultDisplay: PrefixesDisplay? = null + + private fun executeFor(players: List, action: (display: PrefixesDisplay) -> Unit) { + displays.filter { players.isEmpty() || players.contains(it.key) }.forEach { display -> + action(display.value) + } + } + + fun getDisplay(player: UUID): Optional> { + return Optional.ofNullable(displays.getOrDefault(player, null)) + } + + fun getDefaultDisplay(): PrefixesDisplay? { + return defaultDisplay + } + + fun setDefaultDisplay(display: PrefixesDisplay) { + this.defaultDisplay = display + } + + fun register(uuid: UUID, display: PrefixesDisplay) { + displays[uuid] = display + } + + fun createTeam(id: String) { + executeFor(displays.keys.toList()) { + it.createTeam(id) + } + } + fun updatePrefix(id: String, prefix: C, vararg players: UUID) { + executeFor(players.toList()) { + it.updatePrefix(id, prefix) + } + } + fun updateSuffix(id: String, suffix: C, vararg players: UUID) { + executeFor(players.toList()) { + it.updateSuffix(id, suffix) + } + } + fun updatePriority(id: String, priority: Int, vararg players: UUID) { + executeFor(players.toList()) { + it.updatePriority(id, priority) + } + } + fun update(id: String, prefix: C, suffix: C, priority: Int, vararg players: UUID) { + executeFor(players.toList()) { + it.update(id, prefix, suffix, priority) + } + } + fun addPlayer(id: String, player: P, vararg players: UUID) { + executeFor(players.toList()) { + it.addPlayer(id, player) + } + } + fun removePlayer(player: P, vararg players: UUID) { + executeFor(players.toList()) { + it.removePlayer(player) + } + } + + fun updateColor(id: String, color: NamedTextColor, vararg players: UUID) { + executeFor(players.toList()) { + it.updateColor(id, color) + } + } + +} \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGroup.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGroup.kt index 69c61e0..ff3583a 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGroup.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGroup.kt @@ -7,10 +7,9 @@ import java.util.concurrent.CompletableFuture interface PrefixesGroup { fun getName(): String fun getPrefix(): Component - fun getColor(): String + fun getColor(): String? fun getSuffix(): Component fun getPriority(): Int fun containsPlayer(uniqueId: UUID): Boolean - fun containsPlayerFuture(uniqueId: UUID): CompletableFuture } \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesScoreboard.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesScoreboard.kt deleted file mode 100644 index 96ed135..0000000 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesScoreboard.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.simplecloud.plugin.prefixes.api - -import java.util.* - -interface PrefixesScoreboard { - - fun createTeam(uniqueId: UUID) - - fun updatePrefix(uniqueId: UUID, prefix: T) - - fun updateSuffix(uniqueId: UUID, suffix: T) - - fun update(uniqueId: UUID, prefix: T, suffix: T) - - fun apply(uniqueId: UUID, player: P) - - fun remove(player: P) - -} \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt index b7d0688..c0efd1b 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt @@ -6,24 +6,27 @@ import net.kyori.adventure.text.Component import java.util.* class PrefixesActorBlankImpl : PrefixesActor { + override fun registerViewer(target: UUID) { + throw NotImplementedError("You need to define a PrefixesActor to use this") + } - override fun applyGroup(target: UUID, group: PrefixesGroup) { + override fun applyGroup(target: UUID, group: PrefixesGroup, vararg viewers: UUID) { throw NotImplementedError("You need to define a PrefixesActor to use this") } - override fun setPrefix(target: UUID, prefix: Component) { + override fun setPrefix(target: UUID, prefix: Component, vararg viewers: UUID) { throw NotImplementedError("You need to define a PrefixesActor to use this") } - override fun setSuffix(target: UUID, suffix: Component) { + override fun setSuffix(target: UUID, suffix: Component, vararg viewers: UUID) { throw NotImplementedError("You need to define a PrefixesActor to use this") } - override fun setColor(target: UUID, color: String) { + override fun setColor(target: UUID, color: String, vararg viewers: UUID) { throw NotImplementedError("You need to define a PrefixesActor to use this") } - override fun formatMessage(target: UUID, format: String, message: Component): Component { + override fun formatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component { throw NotImplementedError("You need to define a PrefixesActor to use this") } diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt index bb1fe36..42e035f 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt @@ -13,6 +13,9 @@ abstract class PrefixesApiImpl : PrefixesApi { private var actor: PrefixesActor = PrefixesActorBlankImpl() private lateinit var config: PrefixesConfig + override fun registerViewer(uniqueId: UUID) { + actor.registerViewer(uniqueId) + } override fun getGroups(): MutableList { return groups } @@ -31,27 +34,28 @@ abstract class PrefixesApiImpl : PrefixesApi { this.actor = actor } - override fun setWholeName(uniqueId: UUID, group: PrefixesGroup) { - actor.applyGroup(uniqueId, group) + override fun setWholeName(uniqueId: UUID, group: PrefixesGroup, vararg viewers: UUID) { + actor.applyGroup(uniqueId, group, *viewers) } - override fun setWholeName(uniqueId: UUID, groupName: String) { + override fun setWholeName(uniqueId: UUID, groupName: String, vararg viewers: UUID) { setWholeName( uniqueId, - groups.stream().filter { group -> group.getName() == groupName }.findFirst().orElse(null) + groups.stream().filter { group -> group.getName() == groupName }.findFirst().orElse(null), + *viewers ) } - override fun setPrefix(uniqueId: UUID, prefix: Component) { - actor.setPrefix(uniqueId, prefix) + override fun setPrefix(uniqueId: UUID, prefix: Component, vararg viewers: UUID) { + actor.setPrefix(uniqueId, prefix, *viewers) } - override fun setSuffix(uniqueId: UUID, suffix: Component) { - actor.setSuffix(uniqueId, suffix) + override fun setSuffix(uniqueId: UUID, suffix: Component, vararg viewers: UUID) { + actor.setSuffix(uniqueId, suffix, *viewers) } - override fun setColor(uniqueId: UUID, color: String) { - actor.setColor(uniqueId, color) + override fun setColor(uniqueId: UUID, color: String, vararg viewers: UUID) { + actor.setColor(uniqueId, color, *viewers) } override fun setConfig(config: PrefixesConfig) { @@ -62,8 +66,8 @@ abstract class PrefixesApiImpl : PrefixesApi { return config } - fun formatChatMessage(target: UUID, format: String, message: Component): Component { - return actor.formatMessage(target, format, message) + override fun formatChatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component { + return actor.formatMessage(target, viewer, format, message) } abstract fun indexGroups() diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt index 353ee7b..573d0f5 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt @@ -10,38 +10,47 @@ import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import net.minestom.server.MinecraftServer import net.minestom.server.entity.Player -import net.minestom.server.scoreboard.Team import java.util.* -class PrefixesActorMinestomImpl(private var scoreboard: PrefixesScoreboardMinestomImpl) : PrefixesActor { +class PrefixesActorMinestomImpl(private var scoreboard: PrefixesGlobalDisplayMinestomImpl) : PrefixesActor { + override fun registerViewer(target: UUID) { + scoreboard.register(target, PrefixesTablist()) + } + override fun applyGroup( target: UUID, - group: PrefixesGroup + group: PrefixesGroup, + vararg viewers: UUID, ) { val player: Player = MinecraftServer.getConnectionManager().getPlayer(target) ?: return scoreboard.update( - target, - group.getPrefix(), group.getSuffix() + player.username, + group.getPrefix(), group.getSuffix(), group.getPriority(), + *viewers ) setColor(target, group.getColor()) - scoreboard.apply(target, player.username) + scoreboard.addPlayer(player.username, player) } override fun remove(target: UUID) { val player: Player = MinecraftServer.getConnectionManager().getPlayer(target) ?: return - scoreboard.remove(player.username) + scoreboard.removePlayer(player) } - override fun setPrefix(target: UUID, prefix: Component) { - scoreboard.updatePrefix(target, prefix) + override fun setPrefix(target: UUID, prefix: Component, vararg viewers: UUID) { + val player: Player = MinecraftServer.getConnectionManager().getPlayer(target) ?: return + scoreboard.updatePrefix(player.username, prefix) } - override fun setSuffix(target: UUID, suffix: Component) { - scoreboard.updatePrefix(target, suffix) + override fun setSuffix(target: UUID, suffix: Component, vararg viewers: UUID) { + val player: Player = MinecraftServer.getConnectionManager().getPlayer(target) ?: return + scoreboard.updateSuffix(player.username, suffix) } - override fun formatMessage(target: UUID, format: String, message: Component): Component { - val team: Team? = MinecraftServer.getTeamManager().getTeam(target.toString()) + override fun formatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component { + val targetPlayer = MinecraftServer.getConnectionManager().getPlayer(target) ?: return message + val display = scoreboard.getDisplay(viewer).orElse(null) ?: return message + val team = display.getTeam(targetPlayer.username) val tags = mutableListOf() if (team != null) { tags.add(Placeholder.component("prefix", team.prefix)) @@ -66,7 +75,8 @@ class PrefixesActorMinestomImpl(private var scoreboard: PrefixesScoreboardMinest return MiniMessageImpl.parse(format, tags) } - override fun setColor(target: UUID, color: String) { - scoreboard.updateColor(target, NamedTextColor.nearestTo(TextColor.fromHexString(color)!!)) + override fun setColor(target: UUID, color: String, vararg viewers: UUID) { + val player: Player = MinecraftServer.getConnectionManager().getPlayer(target) ?: return + scoreboard.updateColor(player.username, NamedTextColor.nearestTo(TextColor.fromHexString(color)!!), *viewers) } } \ No newline at end of file diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt index a1b7cd5..ccc35c0 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt @@ -31,7 +31,7 @@ class PrefixesExtension : Extension() { @Experimental prefixesApi = PrefixesApiLuckPermsImpl(LPMinestomPlugin.getApi()) //! NO OFFICIAL LUCKPERMS SUPPORT RELEASED YET ! - prefixesApi.setActor(PrefixesActorMinestomImpl(PrefixesScoreboardMinestomImpl())) + prefixesApi.setActor(PrefixesActorMinestomImpl(PrefixesGlobalDisplayMinestomImpl())) val config = PrefixesConfigParser(File(dataDirectory.toFile(), "config.json")).parse( PrefixesConfigImpl::class.java, PrefixesConfigImpl() @@ -40,6 +40,7 @@ class PrefixesExtension : Extension() { prefixesApi.setConfig(config) prefixesApi.indexGroups() MinecraftServer.getGlobalEventHandler().addListener(AsyncPlayerConfigurationEvent::class.java) { event -> + prefixesApi.registerViewer(event.player.uuid) val prefixesGroup: PrefixesGroup = prefixesApi.getHighestGroup(event.player.uuid) prefixesApi.setWholeName(event.player.uuid, prefixesGroup) } diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesGlobalDisplayMinestomImpl.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesGlobalDisplayMinestomImpl.kt new file mode 100644 index 0000000..cb55ba4 --- /dev/null +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesGlobalDisplayMinestomImpl.kt @@ -0,0 +1,8 @@ +package app.simplecloud.plugin.prefixes.minestom + +import app.simplecloud.plugin.prefixes.api.PrefixesGlobalDisplay +import net.kyori.adventure.text.Component +import net.minestom.server.entity.Player +import net.minestom.server.scoreboard.Team + +class PrefixesGlobalDisplayMinestomImpl : PrefixesGlobalDisplay() \ No newline at end of file diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesScoreboardMinestomImpl.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesScoreboardMinestomImpl.kt deleted file mode 100644 index 1b5530d..0000000 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesScoreboardMinestomImpl.kt +++ /dev/null @@ -1,61 +0,0 @@ -package app.simplecloud.plugin.prefixes.minestom - -import app.simplecloud.plugin.prefixes.api.PrefixesScoreboard -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.minestom.server.MinecraftServer -import net.minestom.server.scoreboard.Team -import java.util.* - -class PrefixesScoreboardMinestomImpl : PrefixesScoreboard { - - private val teamManager = MinecraftServer.getTeamManager() - - private fun createTeamReturning(uniqueId: UUID): Team? { - if (teamManager.getTeam(uniqueId.toString()) == null) - return teamManager.createTeam(uniqueId.toString()) - return null - } - - override fun createTeam(uniqueId: UUID) { - createTeamReturning(uniqueId) - } - - override fun update(uniqueId: UUID, prefix: Component, suffix: Component) { - val team: Team = teamManager.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.prefix = prefix; - team.suffix = suffix; - } - - override fun remove(player: String) { - teamManager.deleteTeam(player) - } - - override fun apply(uniqueId: UUID, player: String) { - val team: Team = teamManager.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.addMember(player) - } - - fun update(uniqueId: UUID, prefix: Component, suffix: Component, color: NamedTextColor) { - val team: Team = teamManager.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.prefix = prefix - team.suffix = suffix - team.teamColor = color - } - - override fun updateSuffix(uniqueId: UUID, suffix: Component) { - val team: Team = teamManager.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.suffix = suffix - } - - override fun updatePrefix(uniqueId: UUID, prefix: Component) { - val team: Team = teamManager.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.prefix = prefix - } - - - fun updateColor(uniqueId: UUID, color: NamedTextColor) { - val team: Team = teamManager.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.teamColor = color - } -} \ No newline at end of file diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt new file mode 100644 index 0000000..8db6097 --- /dev/null +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt @@ -0,0 +1,186 @@ +package app.simplecloud.plugin.prefixes.minestom + +import app.simplecloud.plugin.prefixes.api.PrefixesDisplay +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.minestom.server.MinecraftServer +import net.minestom.server.entity.Player +import net.minestom.server.network.packet.server.play.PlayerInfoUpdatePacket +import net.minestom.server.network.packet.server.play.TeamsPacket +import net.minestom.server.scoreboard.Team + +class PrefixesTablist : PrefixesDisplay { + + private val teams = mutableListOf() + private val viewers = mutableSetOf() + override fun addViewer(player: Player): Boolean { + val result = viewers.add(player) + if (result) { + teams.forEach { team -> + player.sendPacket(getCreateTeamPacket(team)) + team.players.forEach { teamPlayer -> + getUpdatePacket(teamPlayer)?.let { player.sendPacket(it) } + } + } + } + + return result + } + + override fun removeViewer(player: Player): Boolean { + val result = viewers.remove(player) + if (result) { + teams.forEach { team -> + player.sendPacket(getRemoveTeamPacket(team)) + team.players.forEach { teamPlayer -> + player.sendPacket(getDefaultPlayerInfoPacket(teamPlayer)) + } + } + } + return result + } + + override fun getViewers(): Set { + return viewers + } + + override fun createTeam(id: String, priority: Int): Team? { + if(getTeam(id) != null) return null + val team = MinecraftServer.getTeamManager().createTeam("${toPriorityString(priority)}$id") + teams.add(team) + return team + } + + override fun getTeam(id: String): Team? { + return teams.firstOrNull { it.teamName.endsWith(id) } + } + + fun copyTeam(team: Team, id: String, priority: Int): Team? { + val newTeam = createTeam(id, priority) ?: return null + newTeam.prefix = team.prefix + newTeam.suffix = team.suffix + newTeam.teamColor = team.teamColor + newTeam.players.addAll(team.players) + return newTeam + } + + override fun updatePriority(id: String, priority: Int): Team? { + val team = getTeam(id) ?: return null + val newTeam = copyTeam(team, id, priority) ?: return null + teams.remove(team) + teams.add(newTeam) + return newTeam + } + + override fun updateColor(id: String, color: NamedTextColor) { + val team = getTeam(id) ?: return + team.teamColor = color + render(team) + } + + override fun setViewer(player: Player): Boolean { + viewers.forEach { removeViewer(it) } + return addViewer(player) + } + + override fun removePlayer(player: Player) { + teams.forEach { + if(it.players.contains(player)) { + it.removeMember(player.username) + } + } + } + + override fun addPlayer(id: String, player: Player) { + val team = getTeam(id) ?: createTeam(id) ?: return + team.addMember(player.username) + } + + override fun update(id: String, prefix: Component, suffix: Component, priority: Int) { + val team = updatePriority(id, priority) ?: createTeam(id, priority) ?: return + team.prefix = prefix + team.suffix = suffix + render(team) + } + + override fun updateSuffix(id: String, suffix: Component) { + val team = getTeam(id) ?: return + team.suffix = suffix + render(team) + } + + override fun updatePrefix(id: String, prefix: Component) { + val team = getTeam(id) ?: return + team.prefix = prefix + render(team) + } + + private fun getUpdatePacket(player: Player): PlayerInfoUpdatePacket? { + val team = teams.firstOrNull { it.players.contains(player) } ?: return null + return PlayerInfoUpdatePacket( + PlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME, PlayerInfoUpdatePacket.Entry( + player.uuid, + player.username, + listOf(), + true, + player.latency, + player.gameMode, + team.prefix.append(Component.text(player.username)).append(team.suffix), + null + ) + ) + } + + private fun getDefaultPlayerInfoPacket(player: Player): PlayerInfoUpdatePacket { + return PlayerInfoUpdatePacket( + PlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME, PlayerInfoUpdatePacket.Entry( + player.uuid, + player.username, + listOf(), + true, + player.latency, + player.gameMode, + player.displayName, + null + ) + ) + } + + private fun render(team: Team) { + viewers.forEach { viewer -> + team.players.forEach { player -> + getUpdatePacket(player)?.let { viewer.sendPacket(it) } + } + viewer.sendPacket(getUpdateTeamPacket(team)) + } + } + + private fun getUpdateTeamPacket(team: Team): TeamsPacket { + return TeamsPacket(team.teamName, TeamsPacket.UpdateTeamAction( + team.teamDisplayName, + team.friendlyFlags, + team.nameTagVisibility, + team.collisionRule, + team.teamColor, + team.prefix, + team.suffix + )) + } + + private fun getCreateTeamPacket(team: Team): TeamsPacket { + return TeamsPacket(team.teamName, TeamsPacket.CreateTeamAction( + team.teamDisplayName, + team.friendlyFlags, + team.nameTagVisibility, + team.collisionRule, + team.teamColor, + team.prefix, + team.suffix, + team.members + )) + } + + private fun getRemoveTeamPacket(team: Team): TeamsPacket { + return TeamsPacket(team.teamName, TeamsPacket.RemoveTeamAction()) + } +} \ No newline at end of file diff --git a/prefixes-paper/build.gradle.kts b/prefixes-paper/build.gradle.kts index 93a1ad5..bbb3739 100644 --- a/prefixes-paper/build.gradle.kts +++ b/prefixes-paper/build.gradle.kts @@ -2,4 +2,5 @@ dependencies { api(project(":prefixes-shared")) api(project(":prefixes-spigot")) compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") + compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") } \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesActorPaperImpl.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesActorPaperImpl.kt deleted file mode 100644 index 3c31411..0000000 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesActorPaperImpl.kt +++ /dev/null @@ -1,66 +0,0 @@ -package app.simplecloud.plugin.prefixes.paper - -import app.simplecloud.plugin.prefixes.api.PrefixesActor -import app.simplecloud.plugin.prefixes.api.PrefixesGroup -import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextColor -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver -import org.bukkit.Bukkit -import org.bukkit.entity.Player -import org.bukkit.scoreboard.Team -import java.util.* - -class PrefixesActorPaperImpl(private var scoreboard: PrefixesScoreboardPaperImpl) : PrefixesActor { - override fun applyGroup( - target: UUID, - group: PrefixesGroup - ) { - val player: Player = Bukkit.getPlayer(target) ?: return - scoreboard.update( - target, - group.getPrefix(), group.getSuffix() - ) - setColor(target, group.getColor()) - scoreboard.apply(target, player.name) - } - - override fun remove(target: UUID) { - val player: Player = Bukkit.getPlayer(target) ?: return - scoreboard.remove(player.name) - } - - override fun setPrefix(target: UUID, prefix: Component) { - scoreboard.updatePrefix(target, prefix) - } - - override fun setSuffix(target: UUID, suffix: Component) { - scoreboard.updatePrefix(target, suffix) - } - - override fun formatMessage(target: UUID, format: String, message: Component): Component { - val team: Team? = scoreboard.getTeam(target) - val tags = mutableListOf() - if (team != null) { - tags.add(Placeholder.component("prefix", team.prefix())) - tags.add(Placeholder.component("suffix", team.suffix())) - tags.add( - Placeholder.component( - "name_colored", - Component.text(Bukkit.getPlayer(target)!!.name).color(team.color()) - ) - ) - tags.add(Placeholder.component("name", Component.text(Bukkit.getPlayer(target)!!.name))) - } else { - tags.add(Placeholder.unparsed("name", "%s")) - } - tags.add(Placeholder.component("message", message)) - return MiniMessageImpl.parse(format, tags) - } - - override fun setColor(target: UUID, color: String) { - scoreboard.updateColor(target, NamedTextColor.nearestTo(TextColor.fromHexString(color)!!)) - } -} \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt index 8b199c4..8b573f5 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt @@ -5,7 +5,11 @@ import app.simplecloud.plugin.prefixes.api.PrefixesGroup import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser +import app.simplecloud.plugin.prefixes.spigot.PrefixesActorSpigotImpl +import app.simplecloud.plugin.prefixes.spigot.PrefixesGlobalDisplaySpigotImpl +import com.comphenix.protocol.ProtocolLibrary import io.papermc.paper.event.player.AsyncChatEvent +import net.kyori.adventure.identity.Identity import net.luckperms.api.LuckPerms import org.bukkit.Bukkit import org.bukkit.event.EventHandler @@ -21,15 +25,15 @@ import java.util.* class PrefixesPlugin : JavaPlugin(), Listener { private lateinit var prefixesApi: PrefixesApiLuckPermsImpl - private val scoreboard: PrefixesScoreboardPaperImpl = PrefixesScoreboardPaperImpl() - private val prefixesApiActor: PrefixesActorPaperImpl = PrefixesActorPaperImpl(scoreboard) + private val scoreboard: PrefixesGlobalDisplaySpigotImpl = PrefixesGlobalDisplaySpigotImpl() override fun onEnable() { + val manager = ProtocolLibrary.getProtocolManager() + val prefixesApiActor = PrefixesActorSpigotImpl(manager, scoreboard) val luckPermsProvider: RegisteredServiceProvider = Bukkit.getServicesManager().getRegistration(LuckPerms::class.java) ?: return val luckPerms: LuckPerms = luckPermsProvider.provider prefixesApi = PrefixesApiLuckPermsImpl(luckPerms) - scoreboard.setScoreboard(Bukkit.getScoreboardManager().mainScoreboard) prefixesApi.setActor(prefixesApiActor) prefixesApi.setConfig( PrefixesConfigParser(File(dataFolder, "config.json")).parse( @@ -52,13 +56,10 @@ class PrefixesPlugin : JavaPlugin(), Listener { @EventHandler(priority = EventPriority.LOWEST) fun onChat(event: AsyncChatEvent) { - event.message( - prefixesApi.formatChatMessage( - event.player.uniqueId, - prefixesApi.getConfig().getChatFormat(), - event.message() - ) - ) + event.renderer { player, _, message, audience -> + val viewer = audience.getOrDefault(Identity.UUID, null) ?: return@renderer message + prefixesApi.formatChatMessage(player.uniqueId, viewer, prefixesApi.getConfig().getChatFormat(), message) + } } diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesScoreboardPaperImpl.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesScoreboardPaperImpl.kt deleted file mode 100644 index 316ba4d..0000000 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesScoreboardPaperImpl.kt +++ /dev/null @@ -1,70 +0,0 @@ -package app.simplecloud.plugin.prefixes.paper - -import app.simplecloud.plugin.prefixes.api.PrefixesScoreboard -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import org.bukkit.Bukkit -import org.bukkit.scoreboard.Scoreboard -import org.bukkit.scoreboard.Team -import java.util.* - -class PrefixesScoreboardPaperImpl : PrefixesScoreboard { - private lateinit var scoreboard: Scoreboard - fun setScoreboard(scoreboard: Scoreboard) { - this.scoreboard = scoreboard - } - - private fun createTeamReturning(uniqueId: UUID): Team? { - if (scoreboard.getTeam(uniqueId.toString()) == null) - return scoreboard.registerNewTeam(uniqueId.toString()) - return null - } - - override fun createTeam(uniqueId: UUID) { - createTeamReturning(uniqueId) - } - - override fun update(uniqueId: UUID, prefix: Component, suffix: Component) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.prefix(prefix) - team.suffix(suffix) - } - - fun getTeam(uniqueId: UUID): Team? { - return scoreboard.getEntryTeam(Bukkit.getPlayer(uniqueId)!!.name) - } - - override fun remove(player: String) { - val team: Team = scoreboard.getEntryTeam(player) ?: return - team.removeEntry(player) - } - - override fun apply(uniqueId: UUID, player: String) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.addEntry(player) - } - - fun update(uniqueId: UUID, prefix: Component, suffix: Component, color: NamedTextColor) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.prefix(prefix) - team.suffix(suffix) - team.color(color) - } - - override fun updateSuffix(uniqueId: UUID, suffix: Component) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.suffix(suffix) - } - - override fun updatePrefix(uniqueId: UUID, prefix: Component) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.prefix(prefix) - } - - - fun updateColor(uniqueId: UUID, color: NamedTextColor) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.color(color) - } - -} \ No newline at end of file diff --git a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/LuckPermsGroup.kt b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/LuckPermsGroup.kt index 5a41d40..6adfe6f 100644 --- a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/LuckPermsGroup.kt +++ b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/LuckPermsGroup.kt @@ -17,8 +17,8 @@ class LuckPermsGroup(private var group: Group, private var luckPerms: LuckPerms) return MiniMessageImpl.parse((group.cachedData.metaData.prefix ?: "")) } - override fun getColor(): String { - return group.cachedData.metaData.getMetaValue("color") ?: "WHITE" + override fun getColor(): String? { + return group.cachedData.metaData.getMetaValue("color") } override fun getSuffix(): Component { diff --git a/prefixes-spigot/build.gradle.kts b/prefixes-spigot/build.gradle.kts index fba2df7..0c0a01f 100644 --- a/prefixes-spigot/build.gradle.kts +++ b/prefixes-spigot/build.gradle.kts @@ -2,4 +2,5 @@ dependencies { api(project(":prefixes-shared")) compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT") implementation("net.kyori:adventure-text-serializer-legacy:4.14.0") + compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt index 3a2e22c..a31402f 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt @@ -1,5 +1,6 @@ package app.simplecloud.plugin.prefixes.spigot +import com.comphenix.protocol.wrappers.WrappedChatComponent import net.kyori.adventure.text.Component import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer @@ -16,5 +17,9 @@ class LegacyComponentSerializerImpl { fun serialize(component: Component): String { return impl.serialize(component) } + + fun serializeToPacket(component: Component): WrappedChatComponent { + return WrappedChatComponent.fromText(serialize(component)) + } } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index bdf5145..341b922 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -1,9 +1,14 @@ package app.simplecloud.plugin.prefixes.spigot import app.simplecloud.plugin.prefixes.api.PrefixesActor +import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesGroup import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl +import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam +import com.comphenix.protocol.ProtocolManager import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextColor import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.Bukkit @@ -12,40 +17,62 @@ import org.bukkit.entity.Player import org.bukkit.scoreboard.Team import java.util.* -class PrefixesActorSpigotImpl(private var scoreboard: PrefixesScoreboardSpigotImpl) : PrefixesActor { +class PrefixesActorSpigotImpl( + private var manager: ProtocolManager, + private var scoreboard: PrefixesGlobalDisplaySpigotImpl +) : PrefixesActor { + override fun registerViewer(target: UUID, api: PrefixesApi) { + val display = PrefixesDisplaySpigotImpl(manager) + scoreboard.register(target, display) + Bukkit.getOnlinePlayers().forEach { player -> + if(player.uniqueId != target) { + val group = api.getHighestGroup(player.uniqueId) + applyGroup(player.uniqueId, group, target) + } + } + } + override fun applyGroup( target: UUID, - group: PrefixesGroup + group: PrefixesGroup, + vararg viewers: UUID ) { val player: Player = Bukkit.getPlayer(target) ?: return scoreboard.update( - target, - LegacyComponentSerializerImpl.serialize(group.getPrefix()), - LegacyComponentSerializerImpl.serialize(group.getSuffix()) + player.name, + group.getPrefix(), + group.getSuffix(), + group.getPriority(), + *viewers ) - setColor(target, group.getColor()) - scoreboard.apply(target, player.name) + if(group.getColor() != null) + setColor(target, group.getColor()!!, *viewers) + scoreboard.addPlayer(player.name, player, *viewers) } override fun remove(target: UUID) { val player: Player = Bukkit.getPlayer(target) ?: return - scoreboard.remove(player.name) + scoreboard.removePlayer(player) } - override fun setPrefix(target: UUID, prefix: Component) { - scoreboard.updatePrefix(target, LegacyComponentSerializerImpl.serialize(prefix)) + override fun setPrefix(target: UUID, prefix: Component, vararg viewers: UUID) { + val player = Bukkit.getPlayer(target) ?: return + scoreboard.updatePrefix(player.name, prefix, *viewers) } - override fun setSuffix(target: UUID, suffix: Component) { - scoreboard.updatePrefix(target, LegacyComponentSerializerImpl.serialize(suffix)) + override fun setSuffix(target: UUID, suffix: Component, vararg viewers: UUID) { + val player = Bukkit.getPlayer(target) ?: return + scoreboard.updatePrefix(player.name, suffix, *viewers) } - override fun formatMessage(target: UUID, format: String, message: Component): Component { - val team: Team? = scoreboard.getTeam(target) + override fun formatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component { + val display = scoreboard.getDisplay(viewer).orElseGet { scoreboard.getDefaultDisplay() } + val targetPlayer = Bukkit.getPlayer(target) ?: return message + val team: PacketTeam? = display.getTeam(targetPlayer.name) val tags = mutableListOf() if (team != null) { - tags.add(Placeholder.component("prefix", LegacyComponentSerializerImpl.deserialize(team.prefix))) - tags.add(Placeholder.component("suffix", LegacyComponentSerializerImpl.deserialize(team.suffix))) + tags.add(Placeholder.component("prefix", team.prefix ?: Component.text(""))) + tags.add(Placeholder.component("suffix", team.suffix ?: Component.text(""))) tags.add( Placeholder.component( "name_colored", @@ -60,7 +87,8 @@ class PrefixesActorSpigotImpl(private var scoreboard: PrefixesScoreboardSpigotIm return MiniMessageImpl.parse(format, tags) } - override fun setColor(target: UUID, color: String) { - scoreboard.updateColor(target, ChatColor.valueOf(color)) + override fun setColor(target: UUID, color: String, vararg viewers: UUID) { + val player = Bukkit.getPlayer(target) ?: return + scoreboard.updateColor(player.name, NamedTextColor.nearestTo(TextColor.fromHexString(color) ?: NamedTextColor.GRAY), *viewers) } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt new file mode 100644 index 0000000..3d22d71 --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt @@ -0,0 +1,140 @@ +package app.simplecloud.plugin.prefixes.spigot + +import app.simplecloud.plugin.prefixes.api.PrefixesDisplay +import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam +import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamMode +import com.comphenix.protocol.ProtocolManager +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.entity.Player +import org.bukkit.scoreboard.Team +import org.checkerframework.checker.units.qual.C + +class PrefixesDisplaySpigotImpl( + private val manager: ProtocolManager +) : PrefixesDisplay { + + private val teams: MutableMap = mutableMapOf() + private val viewers: MutableSet = mutableSetOf() + + override fun createTeam(id: String, priority: Int): PacketTeam? { + if (getTeam(id) != null) return null; + val name = "${toPriorityString(priority)}$id" + val team = PacketTeam(name, null, null, null, mutableListOf()) + teams[name] = team + return team; + } + + override fun getTeam(id: String): PacketTeam? { + return teams.getOrDefault(teams.keys.find { it.endsWith(id) }, null) + } + + override fun updatePriority(id: String, priority: Int): PacketTeam? { + val newId = "${toPriorityString(priority)}$id" + if(teams.containsKey(newId)) return null + val team = getTeam(id) ?: return null + val packets = team.updateId(newId) + viewers.forEach { viewer -> + packets.forEach { packet -> + manager.sendServerPacket(viewer, packet) + } + } + return team + } + + override fun updateColor(id: String, color: NamedTextColor) { + val team = getTeam(id) ?: return + team.color = color + val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) + viewers.forEach { viewer -> + manager.sendServerPacket(viewer, packet) + } + } + + override fun getViewers(): Set { + return viewers + } + + override fun removeViewer(player: Player): Boolean { + val result = viewers.remove(player) + if (result) { + teams.values.forEach { team -> + manager.sendServerPacket(player, team.getTeamDeletePacket()) + } + } + return result + } + + override fun addViewer(player: Player): Boolean { + val result = viewers.add(player) + if (result) { + teams.values.forEach { team -> + manager.sendServerPacket(player, team.getTeamUpdatePacket(UpdateTeamMode.CREATE)) + team.getUpdateDisplayNamePackets().forEach { packet -> + manager.sendServerPacket(player, packet) + } + } + } + return result + } + + override fun setViewer(player: Player): Boolean { + viewers.forEach { removeViewer(it) } + return viewers.add(player) + } + + override fun removePlayer(player: Player) { + teams.forEach { + if (it.value.members.contains(player)) { + it.value.members.remove(player) + val packet = it.value.getRemoveTeamMembersPacket(player) + viewers.forEach { viewer -> + manager.sendServerPacket(viewer, packet) + } + } + } + } + + override fun addPlayer(id: String, player: Player) { + val team = getTeam(id) ?: return + if(!team.members.contains(player)) { + team.members.add(player) + val packets = team.getUpdateTeamMembersPackets() + packets.forEach { packet -> + viewers.forEach { viewer -> + manager.sendServerPacket(viewer, packet) + } + } + + } + } + + override fun update(id: String, prefix: Component, suffix: Component, priority: Int) { + val team = updatePriority(id, priority) ?: createTeam(id, priority) ?: return + team.prefix = prefix + team.suffix = suffix + val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) + viewers.forEach { viewer -> + manager.sendServerPacket(viewer, packet) + } + } + + override fun updateSuffix(id: String, suffix: Component) { + val team = getTeam(id) ?: return + team.suffix = suffix + val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) + viewers.forEach { viewer -> + manager.sendServerPacket(viewer, packet) + } + } + + override fun updatePrefix(id: String, prefix: Component) { + val team = getTeam(id) ?: return + team.prefix = prefix + val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) + viewers.forEach { viewer -> + manager.sendServerPacket(viewer, packet) + } + } + +} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt new file mode 100644 index 0000000..3bf2ebd --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt @@ -0,0 +1,9 @@ +package app.simplecloud.plugin.prefixes.spigot + +import app.simplecloud.plugin.prefixes.api.PrefixesGlobalDisplay +import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam +import net.kyori.adventure.text.Component +import org.bukkit.entity.Player + +class PrefixesGlobalDisplaySpigotImpl: PrefixesGlobalDisplay() { +} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt index 0175fe2..bad195b 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt @@ -6,6 +6,8 @@ import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser +import com.comphenix.protocol.ProtocolLib +import com.comphenix.protocol.ProtocolLibrary import net.luckperms.api.LuckPerms import org.bukkit.Bukkit import org.bukkit.event.EventHandler @@ -22,10 +24,11 @@ import java.util.* class PrefixesPlugin : JavaPlugin(), Listener { private lateinit var prefixesApi: PrefixesApiLuckPermsImpl - private val scoreboard: PrefixesScoreboardSpigotImpl = PrefixesScoreboardSpigotImpl() - private val prefixesApiActor: PrefixesActorSpigotImpl = PrefixesActorSpigotImpl(scoreboard) + private val scoreboard: PrefixesGlobalDisplaySpigotImpl = PrefixesGlobalDisplaySpigotImpl() override fun onEnable() { + val manager = ProtocolLibrary.getProtocolManager() + val prefixesApiActor = PrefixesActorSpigotImpl(manager, scoreboard) val luckPermsProvider: RegisteredServiceProvider = Bukkit.getServicesManager().getRegistration(LuckPerms::class.java) ?: return val luckPerms: LuckPerms = luckPermsProvider.provider @@ -45,7 +48,6 @@ class PrefixesPlugin : JavaPlugin(), Listener { @EventHandler fun onJoin(event: PlayerJoinEvent) { - scoreboard.initScoreboard(Bukkit.getScoreboardManager()!!.mainScoreboard) val uniqueId: UUID = event.player.uniqueId val playerGroup: PrefixesGroup = prefixesApi.getHighestGroup(uniqueId) prefixesApi.setWholeName(uniqueId, playerGroup) @@ -55,6 +57,7 @@ class PrefixesPlugin : JavaPlugin(), Listener { fun onChat(event: AsyncPlayerChatEvent) { event.format = LegacyComponentSerializerImpl.serialize( prefixesApi.formatChatMessage( + event.player.uniqueId, event.player.uniqueId, prefixesApi.getConfig().getChatFormat(), MiniMessageImpl.parse(event.message) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesScoreboardSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesScoreboardSpigotImpl.kt deleted file mode 100644 index 063ae5a..0000000 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesScoreboardSpigotImpl.kt +++ /dev/null @@ -1,72 +0,0 @@ -package app.simplecloud.plugin.prefixes.spigot - -import app.simplecloud.plugin.prefixes.api.PrefixesScoreboard -import org.bukkit.Bukkit -import org.bukkit.ChatColor -import org.bukkit.scoreboard.Scoreboard -import org.bukkit.scoreboard.Team -import java.util.* - -class PrefixesScoreboardSpigotImpl : PrefixesScoreboard { - - private lateinit var scoreboard: Scoreboard - - fun initScoreboard(scoreboard: Scoreboard) { - if (!this::scoreboard.isInitialized) - this.scoreboard = scoreboard - } - - override fun createTeam(uniqueId: UUID) { - createTeamReturning(uniqueId) - } - - fun getTeam(uniqueId: UUID): Team? { - return scoreboard.getEntryTeam(Bukkit.getPlayer(uniqueId)!!.name) - } - - override fun remove(player: String) { - val team: Team = scoreboard.getEntryTeam(player) ?: return - team.removeEntry(player) - } - - override fun apply(uniqueId: UUID, player: String) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.addEntry(player) - } - - private fun createTeamReturning(uniqueId: UUID): Team? { - if (scoreboard.getTeam(uniqueId.toString()) == null) - return scoreboard.registerNewTeam(uniqueId.toString()) - return null - } - - override fun update(uniqueId: UUID, prefix: String, suffix: String) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.prefix = prefix - team.suffix = suffix - } - - fun update(uniqueId: UUID, prefix: String, suffix: String, color: ChatColor) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.prefix = prefix - team.suffix = suffix - team.color = color - } - - override fun updateSuffix(uniqueId: UUID, suffix: String) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.suffix = suffix - } - - override fun updatePrefix(uniqueId: UUID, prefix: String) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.prefix = prefix - } - - - fun updateColor(uniqueId: UUID, color: ChatColor) { - val team: Team = scoreboard.getTeam(uniqueId.toString()) ?: createTeamReturning(uniqueId) ?: return - team.color = color - } - -} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt new file mode 100644 index 0000000..22a2bb3 --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -0,0 +1,147 @@ +package app.simplecloud.plugin.prefixes.spigot.packet + +import WrappedScoreboardTeam +import app.simplecloud.plugin.prefixes.spigot.LegacyComponentSerializerImpl +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.wrappers.EnumWrappers +import com.comphenix.protocol.wrappers.PlayerInfoData +import com.comphenix.protocol.wrappers.WrappedChatComponent +import com.comphenix.protocol.wrappers.WrappedGameProfile +import com.google.common.base.Optional +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.ChatColor +import org.bukkit.entity.Player + +class PacketTeam( + private var id: String, + var color: NamedTextColor?, + var prefix: Component?, + var suffix: Component?, + var members: MutableList = mutableListOf() +) { + fun setPrefix(prefix: Component) { + this.prefix = prefix + } + + fun setSuffix(suffix: Component) { + this.suffix = suffix + } + + fun setColor(color: NamedTextColor?) { + this.color = color + } + + fun updateId(id: String): List { + val toReturn = mutableListOf() + toReturn.add(getTeamDeletePacket()) + this.id = id + toReturn.add(getTeamUpdatePacket(UpdateTeamMode.CREATE)) + return toReturn + } + + fun getTeamUpdatePacket(mode: UpdateTeamMode): PacketContainer { + val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) + val optionals = packet.modifier.withType>(Optional::class.java) + if(packet.integers.size() > 1) { + packet.integers.write(1, mode.getMode()) + }else if(packet.integers.size() > 0) { + packet.integers.write(0, mode.getMode()) + } + + if(mode == UpdateTeamMode.CREATE) + packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) + + packet.strings.writeSafely(0, id) + packet.strings.writeSafely(1, id) + if(prefix != null) packet.strings.writeSafely(2, LegacyComponentSerializerImpl.serialize(prefix!!)) + if(suffix != null) packet.strings.writeSafely(3, LegacyComponentSerializerImpl.serialize(suffix!!)) + + packet.chatComponents.writeSafely(0, WrappedChatComponent.fromText(id)) + packet.chatComponents.writeSafely(1, LegacyComponentSerializerImpl.serializeToPacket(prefix ?: Component.text(""))) + packet.chatComponents.writeSafely(2, LegacyComponentSerializerImpl.serializeToPacket(suffix ?: Component.text(""))) + + + + if(optionals.size() > 0) { + val packetTeam = WrappedScoreboardTeam.fromHandle(optionals.read(0).get()) + + packetTeam.displayName = WrappedChatComponent.fromText(id) + packetTeam.prefix = LegacyComponentSerializerImpl.serializeToPacket(prefix ?: Component.text("")) + packetTeam.suffix = LegacyComponentSerializerImpl.serializeToPacket(suffix ?: Component.text("")) + if(color != null) + packetTeam.teamColor = ChatColor.valueOf(color.toString().uppercase()) + optionals.write(0, Optional.of(packetTeam.handle)) + } + + return packet + } + fun getTeamDeletePacket(): PacketContainer { + val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) + if(packet.integers.size() > 1) { + packet.integers.write(1, 1) + }else if(packet.integers.size() > 0) { + packet.integers.write(0, 1) + } + packet.strings.write(0, id) + return packet + } + + fun getUpdateTeamMembersPackets(): List { + return listOf(getRemoveTeamMembersPacket(*members.toTypedArray()), getAddTeamMembersPacket()) + } + + fun getAddTeamMembersPacket(): PacketContainer { + val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) + if(packet.integers.size() > 1) { + packet.integers.write(1, 3) + }else if(packet.integers.size() > 0) { + packet.integers.write(0, 3) + } + packet.strings.write(0, id) + packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) + return packet + } + fun getRemoveTeamMembersPacket(vararg player: Player): PacketContainer { + val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) + if(packet.integers.size() > 1) { + packet.integers.write(1, 4) + }else if(packet.integers.size() > 0) { + packet.integers.write(0, 4) + } + packet.strings.write(0, id) + packet.getSpecificModifier(Collection::class.java).write(0, player.map { it.name }) + return packet + } + fun getUpdateDisplayNamePackets(): List { + return members.map { getUpdateDisplayNamePacket(it) } + } + + fun getUpdateDisplayNamePacket(player: Player): PacketContainer { + val newName = LegacyComponentSerializerImpl.serializeToPacket(constructDisplayName(player)) + val packet = PacketContainer(PacketType.Play.Server.PLAYER_INFO) + packet.playerInfoAction.write(0, EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME) + val infoData = mutableListOf() + val profile = WrappedGameProfile.fromPlayer(player) + infoData.add(PlayerInfoData(profile, 0, EnumWrappers.NativeGameMode.fromBukkit(player.gameMode), newName)) + packet.playerInfoDataLists.write(0, infoData) + return packet + } + + private fun constructDisplayName(player: Player): Component { + if(!members.contains(player)) return Component.text("") + val base = if(prefix != null) Component.textOfChildren(prefix!!).append(Component.text(player.name)) else Component.text(player.name) + if(suffix != null) base.append(suffix!!) + return base + } +} + +enum class UpdateTeamMode(private val mode: Int) { + CREATE(0), + UPDATE(2); + + fun getMode(): Int { + return mode; + } +} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/wrappers/WrappedScoreboardTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/wrappers/WrappedScoreboardTeam.kt new file mode 100644 index 0000000..cea8252 --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/wrappers/WrappedScoreboardTeam.kt @@ -0,0 +1,188 @@ +import com.comphenix.protocol.reflect.FuzzyReflection +import com.comphenix.protocol.reflect.accessors.Accessors +import com.comphenix.protocol.reflect.accessors.FieldAccessor +import com.comphenix.protocol.utility.MinecraftReflection +import com.comphenix.protocol.wrappers.AbstractWrapper +import com.comphenix.protocol.wrappers.EnumWrappers +import com.comphenix.protocol.wrappers.WrappedChatComponent +import org.bukkit.ChatColor +import org.bukkit.scoreboard.Team + +class WrappedScoreboardTeam private constructor(handle: Any) : + AbstractWrapper(MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b")) { + init { + setHandle(handle) + } + + var displayName: WrappedChatComponent + get() = WrappedChatComponent.fromHandle(DISPLAY_NAME[handle]) + set(displayName) { + DISPLAY_NAME[handle] = displayName.handle + } + + var prefix: WrappedChatComponent + get() = WrappedChatComponent.fromHandle(PREFIX[handle]) + set(prefix) { + PREFIX[handle] = prefix.handle + } + + var suffix: WrappedChatComponent + get() = WrappedChatComponent.fromHandle(SUFFIX[handle]) + set(suffix) { + SUFFIX[handle] = suffix.handle + } + + var nameTagVisibility: Team.OptionStatus + get() { + val value = NAME_TAG_VISIBILITY[handle] as String + return when (value) { + "always" -> Team.OptionStatus.ALWAYS + "never" -> Team.OptionStatus.NEVER + "hideForOtherTeams" -> Team.OptionStatus.FOR_OTHER_TEAMS + "hideForOwnTeam" -> Team.OptionStatus.FOR_OWN_TEAM + else -> throw IllegalArgumentException("Unexpected value: $value") + } + } + set(value) { + when (value) { + Team.OptionStatus.ALWAYS -> NAME_TAG_VISIBILITY[handle] = + "always" + + Team.OptionStatus.NEVER -> NAME_TAG_VISIBILITY[handle] = + "never" + + Team.OptionStatus.FOR_OTHER_TEAMS -> NAME_TAG_VISIBILITY[handle] = + "hideForOtherTeams" + + Team.OptionStatus.FOR_OWN_TEAM -> NAME_TAG_VISIBILITY[handle] = + "hideForOwnTeam" + + else -> throw IllegalArgumentException("Unexpected value: $value") + } + } + + var collisionRule: Team.OptionStatus + get() { + val value = COLLISION_RULE[handle] as String + return when (value) { + "always" -> Team.OptionStatus.ALWAYS + "never" -> Team.OptionStatus.NEVER + "pushOtherTeams" -> Team.OptionStatus.FOR_OTHER_TEAMS + "pushOwnTeam" -> Team.OptionStatus.FOR_OWN_TEAM + else -> throw IllegalArgumentException("Unexpected value: $value") + } + } + set(value) { + when (value) { + Team.OptionStatus.ALWAYS -> COLLISION_RULE[handle] = + "always" + + Team.OptionStatus.NEVER -> COLLISION_RULE[handle] = + "never" + + Team.OptionStatus.FOR_OTHER_TEAMS -> COLLISION_RULE[handle] = + "pushOtherTeams" + + Team.OptionStatus.FOR_OWN_TEAM -> COLLISION_RULE[handle] = + "pushOwnTeam" + + else -> throw IllegalArgumentException("Unexpected value: $value") + } + } + + var teamColor: ChatColor? + get() = ChatColor.getByChar(TEAM_COLOR[handle].toString()[1]) + set(value) { + if (value!!.isColor || value === ChatColor.RESET) { + TEAM_COLOR[handle] = CHATCOLOR_CONVERTER.getGeneric(value) + } + } + + var friendlyFire: Boolean = false + get() { + val intValue = (FRIENDLY_FLAGS[handle] as Int) + return (intValue and 0x01) == 1 + } + set(value) { + val currentValue = (FRIENDLY_FLAGS[handle] as Int) + if (field && !value) { + // is already friendly fire but should not be + FRIENDLY_FLAGS[handle] = currentValue xor 0x01 + } else if (value) { + // is already friendly fire but should not be + FRIENDLY_FLAGS[handle] = currentValue or 0x01 + } + field = value + } + + var friendlySeeInvisible: Boolean + get() { + val intValue = (FRIENDLY_FLAGS[handle] as Int) + return (intValue and 0x02) == 2 + } + set(value) { + val currentValue = (FRIENDLY_FLAGS[handle] as Int) + if (friendlyFire && !value) { + // is already friendly fire but should not be + FRIENDLY_FLAGS[handle] = currentValue xor 0x02 + } else if (value) { + // is already friendly fire but should not be + FRIENDLY_FLAGS[handle] = currentValue or 0x02 + } + } + + companion object { + private val DISPLAY_NAME: FieldAccessor = getFieldAccessor( + MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), + "a", + true + ) + private val PREFIX: FieldAccessor = getFieldAccessor( + MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), + "b", + true + ) + private val SUFFIX: FieldAccessor = getFieldAccessor( + MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), + "c", + true + ) + + private val NAME_TAG_VISIBILITY: FieldAccessor = getFieldAccessor( + MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), + "d", + true + ) + private val COLLISION_RULE: FieldAccessor = getFieldAccessor( + MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), + "e", + true + ) + private val TEAM_COLOR: FieldAccessor = getFieldAccessor( + MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), + "f", + true + ) + private val FRIENDLY_FLAGS: FieldAccessor = getFieldAccessor( + MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), + "g", + true + ) + + private val ENUM_CHAT_FORMAT_CLASS: Class<*> = MinecraftReflection.getMinecraftClass("EnumChatFormat") + private val CHATCOLOR_CONVERTER = EnumWrappers.IndexedEnumConverter( + ChatColor::class.java, + ENUM_CHAT_FORMAT_CLASS + ) + + fun fromHandle(handle: Any): WrappedScoreboardTeam { + return WrappedScoreboardTeam(handle) + } + + private fun getFieldAccessor(instanceClass: Class<*>?, fieldName: String, forceAccess: Boolean): FieldAccessor { + val field = FuzzyReflection.fromClass(instanceClass, forceAccess).getFieldByName(fieldName) + return Accessors.getFieldAccessor(field) + } + } + +} \ No newline at end of file From aa4db46613912b2406fe45e85f54f812aadbc444 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Mon, 6 May 2024 22:34:39 +0200 Subject: [PATCH 02/21] refactor: resolve error --- .../plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt index c0efd1b..959667d 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt @@ -1,12 +1,13 @@ package app.simplecloud.plugin.prefixes.api.impl import app.simplecloud.plugin.prefixes.api.PrefixesActor +import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesGroup import net.kyori.adventure.text.Component import java.util.* class PrefixesActorBlankImpl : PrefixesActor { - override fun registerViewer(target: UUID) { + override fun registerViewer(target: UUID, api: PrefixesApi) { throw NotImplementedError("You need to define a PrefixesActor to use this") } From 292ad4562910dfe0616d84f9235519e2300494c3 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Mon, 6 May 2024 22:35:50 +0200 Subject: [PATCH 03/21] refactor: resolve api migration errors --- .../plugin/prefixes/api/impl/PrefixesApiImpl.kt | 2 +- .../plugin/prefixes/spigot/packet/PacketTeam.kt | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt index 42e035f..b4c12ce 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt @@ -14,7 +14,7 @@ abstract class PrefixesApiImpl : PrefixesApi { private lateinit var config: PrefixesConfig override fun registerViewer(uniqueId: UUID) { - actor.registerViewer(uniqueId) + actor.registerViewer(uniqueId, this) } override fun getGroups(): MutableList { return groups diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt index 22a2bb3..2255647 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -21,18 +21,6 @@ class PacketTeam( var suffix: Component?, var members: MutableList = mutableListOf() ) { - fun setPrefix(prefix: Component) { - this.prefix = prefix - } - - fun setSuffix(suffix: Component) { - this.suffix = suffix - } - - fun setColor(color: NamedTextColor?) { - this.color = color - } - fun updateId(id: String): List { val toReturn = mutableListOf() toReturn.add(getTeamDeletePacket()) From 1d175d7ce1931b62c37f2cb8cc0158daecdb15f1 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Mon, 6 May 2024 22:37:11 +0200 Subject: [PATCH 04/21] refactor: resolve more api migration errors --- .../plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt | 6 ++++-- .../plugin/prefixes/minestom/PrefixesExtension.kt | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt index 573d0f5..f341975 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt @@ -1,6 +1,7 @@ package app.simplecloud.plugin.prefixes.minestom import app.simplecloud.plugin.prefixes.api.PrefixesActor +import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesGroup import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl import net.kyori.adventure.text.Component @@ -13,7 +14,7 @@ import net.minestom.server.entity.Player import java.util.* class PrefixesActorMinestomImpl(private var scoreboard: PrefixesGlobalDisplayMinestomImpl) : PrefixesActor { - override fun registerViewer(target: UUID) { + override fun registerViewer(target: UUID, api: PrefixesApi) { scoreboard.register(target, PrefixesTablist()) } @@ -28,7 +29,8 @@ class PrefixesActorMinestomImpl(private var scoreboard: PrefixesGlobalDisplayMin group.getPrefix(), group.getSuffix(), group.getPriority(), *viewers ) - setColor(target, group.getColor()) + if(group.getColor() != null) + setColor(target, group.getColor()!!) scoreboard.addPlayer(player.username, player) } diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt index ccc35c0..b95feab 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt @@ -47,6 +47,7 @@ class PrefixesExtension : Extension() { MinecraftServer.getGlobalEventHandler().addListener(PlayerChatEvent::class.java) { event -> event.setChatFormat { return@setChatFormat prefixesApi.formatChatMessage( + event.player.uuid, event.player.uuid, prefixesApi.getConfig().getChatFormat(), MiniMessageImpl.parse(event.message) From f46102ee1745f905b26fc75e706b70969b876858 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Tue, 7 May 2024 00:01:19 +0200 Subject: [PATCH 05/21] refactor: resolve more api migration errors --- .../plugin/prefixes/api/PrefixesGlobalDisplay.kt | 2 ++ .../simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt | 1 + .../plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt | 2 +- .../plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt | 3 ++- .../simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt | 1 + .../plugin/prefixes/spigot/packet/PacketTeam.kt | 7 ++++--- 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt index 2a47d83..0d51044 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt @@ -56,11 +56,13 @@ open class PrefixesGlobalDisplay { } fun update(id: String, prefix: C, suffix: C, priority: Int, vararg players: UUID) { executeFor(players.toList()) { + println("updating") it.update(id, prefix, suffix, priority) } } fun addPlayer(id: String, player: P, vararg players: UUID) { executeFor(players.toList()) { + println("adding player") it.addPlayer(id, player) } } diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt index 8b573f5..c084c88 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt @@ -50,6 +50,7 @@ class PrefixesPlugin : JavaPlugin(), Listener { @EventHandler fun onJoin(event: PlayerJoinEvent) { val uniqueId: UUID = event.player.uniqueId + prefixesApi.registerViewer(uniqueId) val playerGroup: PrefixesGroup = prefixesApi.getHighestGroup(uniqueId) prefixesApi.setWholeName(uniqueId, playerGroup) } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index 341b922..3bdb560 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -79,7 +79,7 @@ class PrefixesActorSpigotImpl( LegacyComponentSerializerImpl.deserialize(team.color.toString() + Bukkit.getPlayer(target)!!.name) ) ) - tags.add(Placeholder.component("name", Component.text(Bukkit.getPlayer(target)!!.name))) + tags.add(Placeholder.component("name", Component.text(Bukkit.getPlayer(target)!!.name).color(team.prefix?.color()))) } else { tags.add(Placeholder.unparsed("name", "%s")) } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt index 3d22d71..45ba962 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt @@ -110,10 +110,11 @@ class PrefixesDisplaySpigotImpl( } override fun update(id: String, prefix: Component, suffix: Component, priority: Int) { + val exists = getTeam(id) != null val team = updatePriority(id, priority) ?: createTeam(id, priority) ?: return team.prefix = prefix team.suffix = suffix - val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) + val packet = team.getTeamUpdatePacket(if(exists) UpdateTeamMode.UPDATE else UpdateTeamMode.CREATE) viewers.forEach { viewer -> manager.sendServerPacket(viewer, packet) } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt index bad195b..8cb2286 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt @@ -50,6 +50,7 @@ class PrefixesPlugin : JavaPlugin(), Listener { fun onJoin(event: PlayerJoinEvent) { val uniqueId: UUID = event.player.uniqueId val playerGroup: PrefixesGroup = prefixesApi.getHighestGroup(uniqueId) + prefixesApi.registerViewer(uniqueId) prefixesApi.setWholeName(uniqueId, playerGroup) } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt index 2255647..12a7ff4 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -3,6 +3,7 @@ package app.simplecloud.plugin.prefixes.spigot.packet import WrappedScoreboardTeam import app.simplecloud.plugin.prefixes.spigot.LegacyComponentSerializerImpl import com.comphenix.protocol.PacketType +import com.comphenix.protocol.events.InternalStructure import com.comphenix.protocol.events.PacketContainer import com.comphenix.protocol.wrappers.EnumWrappers import com.comphenix.protocol.wrappers.PlayerInfoData @@ -38,6 +39,8 @@ class PacketTeam( packet.integers.write(0, mode.getMode()) } + println(optionals) + if(mode == UpdateTeamMode.CREATE) packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) @@ -50,11 +53,9 @@ class PacketTeam( packet.chatComponents.writeSafely(1, LegacyComponentSerializerImpl.serializeToPacket(prefix ?: Component.text(""))) packet.chatComponents.writeSafely(2, LegacyComponentSerializerImpl.serializeToPacket(suffix ?: Component.text(""))) - - + //TODO: Make this work if(optionals.size() > 0) { val packetTeam = WrappedScoreboardTeam.fromHandle(optionals.read(0).get()) - packetTeam.displayName = WrappedChatComponent.fromText(id) packetTeam.prefix = LegacyComponentSerializerImpl.serializeToPacket(prefix ?: Component.text("")) packetTeam.suffix = LegacyComponentSerializerImpl.serializeToPacket(suffix ?: Component.text("")) From 9574f329d90d07d1491bf1c005f07c99a5fa1d42 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Wed, 8 May 2024 00:54:24 +0200 Subject: [PATCH 06/21] refactor: resolve errors for not sending packets at the right time, fix packet format --- .../plugin/prefixes/api/PrefixesActor.kt | 2 ++ .../plugin/prefixes/api/PrefixesApi.kt | 12 +++++++++ .../prefixes/api/PrefixesGlobalDisplay.kt | 7 ++++-- .../api/impl/PrefixesActorBlankImpl.kt | 8 ++++++ .../prefixes/api/impl/PrefixesApiImpl.kt | 9 +++++++ .../minestom/PrefixesActorMinestomImpl.kt | 11 ++++++++ .../prefixes/minestom/PrefixesExtension.kt | 5 ++++ .../paper/PlayerCreatePacketAdapter.kt | 22 ++++++++++++++++ .../plugin/prefixes/paper/PrefixesPlugin.kt | 12 +++------ prefixes-paper/src/main/resources/plugin.yml | 2 +- prefixes-spigot/build.gradle.kts | 2 +- .../spigot/LegacyComponentSerializerImpl.kt | 8 +++--- .../spigot/PrefixesActorSpigotImpl.kt | 25 ++++++++++++++++--- .../spigot/PrefixesDisplaySpigotImpl.kt | 23 ++++++++++++----- .../plugin/prefixes/spigot/PrefixesPlugin.kt | 12 +++------ .../prefixes/spigot/packet/PacketTeam.kt | 17 ++++++------- .../src/main/resources/config.json | 2 +- 17 files changed, 134 insertions(+), 45 deletions(-) create mode 100644 prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PlayerCreatePacketAdapter.kt diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt index d8116ac..50a6b3b 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt @@ -5,6 +5,8 @@ import java.util.* interface PrefixesActor { fun registerViewer(target: UUID, api: PrefixesApi) + fun hasViewer(target: UUID): Boolean + fun removeViewer(target: UUID) fun applyGroup(target: UUID, group: PrefixesGroup, vararg viewers: UUID) fun setPrefix(target: UUID, prefix: Component, vararg viewers: UUID) fun setSuffix(target: UUID, suffix: Component, vararg viewers: UUID) diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt index 64146de..e823ffb 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt @@ -11,6 +11,18 @@ interface PrefixesApi { */ fun registerViewer(uniqueId: UUID) + /** + * Returns if a viewer exists + * @param uniqueId UUID of the target player + */ + fun hasViewer(uniqueId: UUID): Boolean + + /** + * Removes a viewer + * @param uniqueId UUID of the target player + */ + fun removeViewer(uniqueId: UUID) + /** * Sets the prefix and suffix of a player in both Tab and Chat * @param uniqueId UUID of the target player diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt index 0d51044..389dda0 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt @@ -22,6 +22,10 @@ open class PrefixesGlobalDisplay { return Optional.ofNullable(displays.getOrDefault(player, null)) } + fun removeDisplay(player: UUID) { + displays.remove(player) + } + fun getDefaultDisplay(): PrefixesDisplay? { return defaultDisplay } @@ -40,6 +44,7 @@ open class PrefixesGlobalDisplay { } } fun updatePrefix(id: String, prefix: C, vararg players: UUID) { + println(players.toList()) executeFor(players.toList()) { it.updatePrefix(id, prefix) } @@ -56,13 +61,11 @@ open class PrefixesGlobalDisplay { } fun update(id: String, prefix: C, suffix: C, priority: Int, vararg players: UUID) { executeFor(players.toList()) { - println("updating") it.update(id, prefix, suffix, priority) } } fun addPlayer(id: String, player: P, vararg players: UUID) { executeFor(players.toList()) { - println("adding player") it.addPlayer(id, player) } } diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt index 959667d..2ffe2d7 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt @@ -11,6 +11,14 @@ class PrefixesActorBlankImpl : PrefixesActor { throw NotImplementedError("You need to define a PrefixesActor to use this") } + override fun hasViewer(target: UUID): Boolean { + throw NotImplementedError("You need to define a PrefixesActor to use this") + } + + override fun removeViewer(target: UUID) { + throw NotImplementedError("You need to define a PrefixesActor to use this") + } + override fun applyGroup(target: UUID, group: PrefixesGroup, vararg viewers: UUID) { throw NotImplementedError("You need to define a PrefixesActor to use this") } diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt index b4c12ce..356c795 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt @@ -16,6 +16,15 @@ abstract class PrefixesApiImpl : PrefixesApi { override fun registerViewer(uniqueId: UUID) { actor.registerViewer(uniqueId, this) } + + override fun hasViewer(uniqueId: UUID): Boolean { + return actor.hasViewer(uniqueId) + } + + override fun removeViewer(uniqueId: UUID) { + actor.removeViewer(uniqueId) + } + override fun getGroups(): MutableList { return groups } diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt index f341975..cea943c 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt @@ -18,6 +18,17 @@ class PrefixesActorMinestomImpl(private var scoreboard: PrefixesGlobalDisplayMin scoreboard.register(target, PrefixesTablist()) } + override fun hasViewer(target: UUID): Boolean { + return scoreboard.getDisplay(target).orElse(null) != null + } + + override fun removeViewer(target: UUID) { + val player = MinecraftServer.getConnectionManager().getPlayer(target) ?: return + val display = scoreboard.getDisplay(player.uuid).orElse(null) ?: return + display.removeViewer(player) + scoreboard.removeDisplay(player.uuid) + } + override fun applyGroup( target: UUID, group: PrefixesGroup, diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt index b95feab..75516b9 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesExtension.kt @@ -14,6 +14,7 @@ import net.kyori.adventure.text.format.TextColor import net.minestom.server.MinecraftServer import net.minestom.server.event.player.AsyncPlayerConfigurationEvent import net.minestom.server.event.player.PlayerChatEvent +import net.minestom.server.event.player.PlayerDisconnectEvent import net.minestom.server.extensions.Extension import java.io.File @@ -54,6 +55,10 @@ class PrefixesExtension : Extension() { ) } } + + MinecraftServer.getGlobalEventHandler().addListener(PlayerDisconnectEvent::class.java) { event -> + prefixesApi.removeViewer(event.player.uuid) + } MinecraftServer.LOGGER.info(Component.text("PrefixesApi initialized.").color(TextColor.color(0x7cf7ab))) } diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PlayerCreatePacketAdapter.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PlayerCreatePacketAdapter.kt new file mode 100644 index 0000000..4b199b6 --- /dev/null +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PlayerCreatePacketAdapter.kt @@ -0,0 +1,22 @@ +package app.simplecloud.plugin.prefixes.paper + +import app.simplecloud.plugin.prefixes.api.PrefixesApi +import app.simplecloud.plugin.prefixes.api.PrefixesGroup +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.events.ListenerPriority +import com.comphenix.protocol.events.PacketAdapter +import com.comphenix.protocol.events.PacketEvent +import org.bukkit.plugin.Plugin + +class PlayerCreatePacketAdapter(plugin: Plugin, private val api: PrefixesApi): PacketAdapter(plugin, + ListenerPriority.NORMAL, + PacketType.Play.Client.CHAT_SESSION_UPDATE) { + + override fun onPacketReceiving(event: PacketEvent) { + if(event.packetType == PacketType.Play.Client.CHAT_SESSION_UPDATE && !api.hasViewer(event.player.uniqueId)) { + api.registerViewer(event.player.uniqueId) + val playerGroup: PrefixesGroup = api.getHighestGroup(event.player.uniqueId) + api.setWholeName(event.player.uniqueId, playerGroup) + } + } +} \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt index c084c88..118ac2d 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt @@ -1,7 +1,6 @@ package app.simplecloud.plugin.prefixes.paper import app.simplecloud.plugin.prefixes.api.PrefixesApi -import app.simplecloud.plugin.prefixes.api.PrefixesGroup import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser @@ -15,12 +14,11 @@ import org.bukkit.Bukkit import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener -import org.bukkit.event.player.PlayerJoinEvent +import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.plugin.RegisteredServiceProvider import org.bukkit.plugin.ServicePriority import org.bukkit.plugin.java.JavaPlugin import java.io.File -import java.util.* class PrefixesPlugin : JavaPlugin(), Listener { @@ -45,14 +43,12 @@ class PrefixesPlugin : JavaPlugin(), Listener { prefixesApi.indexGroups() Bukkit.getPluginManager().registerEvents(this, this) Bukkit.getServicesManager().register(PrefixesApi::class.java, prefixesApi, this, ServicePriority.Normal) + manager.addPacketListener(PlayerCreatePacketAdapter(this, prefixesApi)) } @EventHandler - fun onJoin(event: PlayerJoinEvent) { - val uniqueId: UUID = event.player.uniqueId - prefixesApi.registerViewer(uniqueId) - val playerGroup: PrefixesGroup = prefixesApi.getHighestGroup(uniqueId) - prefixesApi.setWholeName(uniqueId, playerGroup) + fun onQuit(event: PlayerQuitEvent) { + prefixesApi.removeViewer(event.player.uniqueId) } @EventHandler(priority = EventPriority.LOWEST) diff --git a/prefixes-paper/src/main/resources/plugin.yml b/prefixes-paper/src/main/resources/plugin.yml index 77c4ab5..fa11d7c 100644 --- a/prefixes-paper/src/main/resources/plugin.yml +++ b/prefixes-paper/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: PrefixesApi version: 1.0 -main: app.simplecloud.plugin.prefixes.spigot.PrefixesPlugin +main: app.simplecloud.plugin.prefixes.paper.PrefixesPlugin authors: - dayyeeet \ No newline at end of file diff --git a/prefixes-spigot/build.gradle.kts b/prefixes-spigot/build.gradle.kts index 0c0a01f..68dcdc3 100644 --- a/prefixes-spigot/build.gradle.kts +++ b/prefixes-spigot/build.gradle.kts @@ -1,6 +1,6 @@ dependencies { api(project(":prefixes-shared")) compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT") - implementation("net.kyori:adventure-text-serializer-legacy:4.14.0") + implementation("net.kyori:adventure-text-serializer-gson:4.14.0") compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt index a31402f..0baff27 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt @@ -2,13 +2,13 @@ package app.simplecloud.plugin.prefixes.spigot import com.comphenix.protocol.wrappers.WrappedChatComponent import net.kyori.adventure.text.Component -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer +import net.md_5.bungee.chat.ComponentSerializer class LegacyComponentSerializerImpl { companion object { private val impl = - LegacyComponentSerializer.builder().hexColors().useUnusualXRepeatedCharacterHexFormat().character('§') - .hexCharacter('x').build() + GsonComponentSerializer.builder().build() fun deserialize(text: String): Component { return impl.deserialize(text) @@ -19,7 +19,7 @@ class LegacyComponentSerializerImpl { } fun serializeToPacket(component: Component): WrappedChatComponent { - return WrappedChatComponent.fromText(serialize(component)) + return WrappedChatComponent.fromJson(serialize(component)) } } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index 3bdb560..6406aa7 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -22,8 +22,10 @@ class PrefixesActorSpigotImpl( private var scoreboard: PrefixesGlobalDisplaySpigotImpl ) : PrefixesActor { override fun registerViewer(target: UUID, api: PrefixesApi) { + val targetPlayer = Bukkit.getPlayer(target) ?: return val display = PrefixesDisplaySpigotImpl(manager) scoreboard.register(target, display) + display.setViewer(targetPlayer) Bukkit.getOnlinePlayers().forEach { player -> if(player.uniqueId != target) { val group = api.getHighestGroup(player.uniqueId) @@ -32,6 +34,17 @@ class PrefixesActorSpigotImpl( } } + override fun hasViewer(target: UUID): Boolean { + return scoreboard.getDisplay(target).orElse(null) != null + } + + override fun removeViewer(target: UUID) { + val player = Bukkit.getPlayer(target) ?: return + val display = scoreboard.getDisplay(target).orElse(null) ?: return + display.removeViewer(player) + scoreboard.removeDisplay(target) + } + override fun applyGroup( target: UUID, group: PrefixesGroup, @@ -76,12 +89,18 @@ class PrefixesActorSpigotImpl( tags.add( Placeholder.component( "name_colored", - LegacyComponentSerializerImpl.deserialize(team.color.toString() + Bukkit.getPlayer(target)!!.name) + Component.text(Bukkit.getPlayer(target)!!.name).color(team.color) + ) + ) + tags.add( + Placeholder.component( + "name_prefixed", + (team.prefix ?: Component.text("")).append(Component.text(targetPlayer.name)) ) ) - tags.add(Placeholder.component("name", Component.text(Bukkit.getPlayer(target)!!.name).color(team.prefix?.color()))) + tags.add(Placeholder.unparsed("name", targetPlayer.name)) } else { - tags.add(Placeholder.unparsed("name", "%s")) + tags.add(Placeholder.unparsed("name", targetPlayer.name)) } tags.add(Placeholder.component("message", message)) return MiniMessageImpl.parse(format, tags) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt index 45ba962..d036e6d 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt @@ -69,7 +69,6 @@ class PrefixesDisplaySpigotImpl( val result = viewers.add(player) if (result) { teams.values.forEach { team -> - manager.sendServerPacket(player, team.getTeamUpdatePacket(UpdateTeamMode.CREATE)) team.getUpdateDisplayNamePackets().forEach { packet -> manager.sendServerPacket(player, packet) } @@ -80,7 +79,7 @@ class PrefixesDisplaySpigotImpl( override fun setViewer(player: Player): Boolean { viewers.forEach { removeViewer(it) } - return viewers.add(player) + return addViewer(player) } override fun removePlayer(player: Player) { @@ -88,8 +87,10 @@ class PrefixesDisplaySpigotImpl( if (it.value.members.contains(player)) { it.value.members.remove(player) val packet = it.value.getRemoveTeamMembersPacket(player) + val displayPacket = it.value.getUpdateDisplayNamePacket(player) viewers.forEach { viewer -> manager.sendServerPacket(viewer, packet) + manager.sendServerPacket(viewer, displayPacket) } } } @@ -99,12 +100,10 @@ class PrefixesDisplaySpigotImpl( val team = getTeam(id) ?: return if(!team.members.contains(player)) { team.members.add(player) - val packets = team.getUpdateTeamMembersPackets() - packets.forEach { packet -> + val displayPacket = team.getUpdateDisplayNamePacket(player) viewers.forEach { viewer -> - manager.sendServerPacket(viewer, packet) + manager.sendServerPacket(viewer, displayPacket) } - } } } @@ -115,8 +114,12 @@ class PrefixesDisplaySpigotImpl( team.prefix = prefix team.suffix = suffix val packet = team.getTeamUpdatePacket(if(exists) UpdateTeamMode.UPDATE else UpdateTeamMode.CREATE) + val displayPackets = team.getUpdateDisplayNamePackets() viewers.forEach { viewer -> manager.sendServerPacket(viewer, packet) + displayPackets.forEach { display -> + manager.sendServerPacket(viewer, display) + } } } @@ -124,8 +127,12 @@ class PrefixesDisplaySpigotImpl( val team = getTeam(id) ?: return team.suffix = suffix val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) + val displayPackets = team.getUpdateDisplayNamePackets() viewers.forEach { viewer -> manager.sendServerPacket(viewer, packet) + displayPackets.forEach { display -> + manager.sendServerPacket(viewer, display) + } } } @@ -133,8 +140,12 @@ class PrefixesDisplaySpigotImpl( val team = getTeam(id) ?: return team.prefix = prefix val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) + val displayPackets = team.getUpdateDisplayNamePackets() viewers.forEach { viewer -> manager.sendServerPacket(viewer, packet) + displayPackets.forEach { display -> + manager.sendServerPacket(viewer, display) + } } } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt index 8cb2286..074e45e 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt @@ -1,12 +1,10 @@ package app.simplecloud.plugin.prefixes.spigot import app.simplecloud.plugin.prefixes.api.PrefixesApi -import app.simplecloud.plugin.prefixes.api.PrefixesGroup import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser -import com.comphenix.protocol.ProtocolLib import com.comphenix.protocol.ProtocolLibrary import net.luckperms.api.LuckPerms import org.bukkit.Bukkit @@ -14,12 +12,11 @@ import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener import org.bukkit.event.player.AsyncPlayerChatEvent -import org.bukkit.event.player.PlayerJoinEvent +import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.plugin.RegisteredServiceProvider import org.bukkit.plugin.ServicePriority import org.bukkit.plugin.java.JavaPlugin import java.io.File -import java.util.* class PrefixesPlugin : JavaPlugin(), Listener { @@ -47,11 +44,8 @@ class PrefixesPlugin : JavaPlugin(), Listener { } @EventHandler - fun onJoin(event: PlayerJoinEvent) { - val uniqueId: UUID = event.player.uniqueId - val playerGroup: PrefixesGroup = prefixesApi.getHighestGroup(uniqueId) - prefixesApi.registerViewer(uniqueId) - prefixesApi.setWholeName(uniqueId, playerGroup) + fun onQuit(event: PlayerQuitEvent) { + prefixesApi.removeViewer(event.player.uniqueId) } @EventHandler(priority = EventPriority.LOWEST) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt index 12a7ff4..388a6fd 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -14,6 +14,7 @@ import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import org.bukkit.ChatColor import org.bukkit.entity.Player +import java.util.EnumSet class PacketTeam( private var id: String, @@ -38,9 +39,6 @@ class PacketTeam( }else if(packet.integers.size() > 0) { packet.integers.write(0, mode.getMode()) } - - println(optionals) - if(mode == UpdateTeamMode.CREATE) packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) @@ -53,7 +51,6 @@ class PacketTeam( packet.chatComponents.writeSafely(1, LegacyComponentSerializerImpl.serializeToPacket(prefix ?: Component.text(""))) packet.chatComponents.writeSafely(2, LegacyComponentSerializerImpl.serializeToPacket(suffix ?: Component.text(""))) - //TODO: Make this work if(optionals.size() > 0) { val packetTeam = WrappedScoreboardTeam.fromHandle(optionals.read(0).get()) packetTeam.displayName = WrappedChatComponent.fromText(id) @@ -61,6 +58,7 @@ class PacketTeam( packetTeam.suffix = LegacyComponentSerializerImpl.serializeToPacket(suffix ?: Component.text("")) if(color != null) packetTeam.teamColor = ChatColor.valueOf(color.toString().uppercase()) + println(packetTeam.handle) optionals.write(0, Optional.of(packetTeam.handle)) } @@ -108,19 +106,18 @@ class PacketTeam( } fun getUpdateDisplayNamePacket(player: Player): PacketContainer { - val newName = LegacyComponentSerializerImpl.serializeToPacket(constructDisplayName(player)) val packet = PacketContainer(PacketType.Play.Server.PLAYER_INFO) - packet.playerInfoAction.write(0, EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME) + packet.playerInfoActions.write(0, EnumSet.of(EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME)) val infoData = mutableListOf() val profile = WrappedGameProfile.fromPlayer(player) - infoData.add(PlayerInfoData(profile, 0, EnumWrappers.NativeGameMode.fromBukkit(player.gameMode), newName)) - packet.playerInfoDataLists.write(0, infoData) + infoData.add(PlayerInfoData(profile, player.ping, EnumWrappers.NativeGameMode.fromBukkit(player.gameMode), LegacyComponentSerializerImpl.serializeToPacket(constructDisplayName(player)))) + packet.playerInfoDataLists.write(1, infoData) return packet } private fun constructDisplayName(player: Player): Component { - if(!members.contains(player)) return Component.text("") - val base = if(prefix != null) Component.textOfChildren(prefix!!).append(Component.text(player.name)) else Component.text(player.name) + if(!members.contains(player)) return Component.text(player.name) + val base = if(prefix != null) prefix!!.append(Component.text(player.name)) else Component.text(player.name) if(suffix != null) base.append(suffix!!) return base } diff --git a/prefixes-spigot/src/main/resources/config.json b/prefixes-spigot/src/main/resources/config.json index efe10ef..6ebe854 100644 --- a/prefixes-spigot/src/main/resources/config.json +++ b/prefixes-spigot/src/main/resources/config.json @@ -1,3 +1,3 @@ { - "chatFormat": ": " + "chatFormat": ": " } \ No newline at end of file From 771305366f8e3f9ed84228297931655371aa4ea1 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Wed, 8 May 2024 18:34:09 +0200 Subject: [PATCH 07/21] fix: packet formats --- .../plugin/prefixes/api/PrefixesActor.kt | 2 +- .../plugin/prefixes/api/PrefixesApi.kt | 2 +- .../plugin/prefixes/api/PrefixesDisplay.kt | 3 +- .../prefixes/api/PrefixesGlobalDisplay.kt | 6 +- .../api/impl/PrefixesActorBlankImpl.kt | 2 +- .../prefixes/api/impl/PrefixesApiImpl.kt | 2 +- .../minestom/PrefixesActorMinestomImpl.kt | 4 +- .../prefixes/minestom/PrefixesTablist.kt | 9 +- .../plugin/prefixes/paper/PrefixesPlugin.kt | 2 +- prefixes-spigot/build.gradle.kts | 2 +- .../spigot/LegacyComponentSerializerImpl.kt | 1 + .../spigot/PrefixesActorSpigotImpl.kt | 17 +- .../spigot/PrefixesDisplaySpigotImpl.kt | 6 +- .../prefixes/spigot/packet/PacketTeam.kt | 60 +++--- .../packet/wrappers/WrappedScoreboardTeam.kt | 188 ------------------ .../src/main/resources/config.json | 2 +- 16 files changed, 63 insertions(+), 245 deletions(-) delete mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/wrappers/WrappedScoreboardTeam.kt diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt index 50a6b3b..8434172 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt @@ -11,6 +11,6 @@ interface PrefixesActor { fun setPrefix(target: UUID, prefix: Component, vararg viewers: UUID) fun setSuffix(target: UUID, suffix: Component, vararg viewers: UUID) fun setColor(target: UUID, color: String, vararg viewers: UUID) - fun formatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component + fun formatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component fun remove(target: UUID) } \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt index e823ffb..05e4f04 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt @@ -99,6 +99,6 @@ interface PrefixesApi { * @param format the chat format the message should follow * @param message Message sent by the [target] */ - fun formatChatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component + fun formatChatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component } \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt index b46487e..f134adf 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt @@ -1,6 +1,7 @@ package app.simplecloud.plugin.prefixes.api import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextColor interface PrefixesDisplay { fun createTeam(id: String, priority: Int = 0): T? @@ -10,7 +11,7 @@ interface PrefixesDisplay { fun updateSuffix(id: String, suffix: C) fun updatePriority(id: String, priority: Int): T? - fun updateColor(id: String, color: NamedTextColor) + fun updateColor(id: String, color: TextColor) fun update(id: String, prefix: C, suffix: C, priority: Int) fun toPriorityString(priority: Int): String { diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt index 389dda0..a33ba07 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt @@ -1,6 +1,7 @@ package app.simplecloud.plugin.prefixes.api import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextColor import java.util.Optional import java.util.UUID @@ -16,6 +17,8 @@ open class PrefixesGlobalDisplay { displays.filter { players.isEmpty() || players.contains(it.key) }.forEach { display -> action(display.value) } + if(players.isEmpty()) + defaultDisplay?.let { action(it) } } fun getDisplay(player: UUID): Optional> { @@ -44,7 +47,6 @@ open class PrefixesGlobalDisplay { } } fun updatePrefix(id: String, prefix: C, vararg players: UUID) { - println(players.toList()) executeFor(players.toList()) { it.updatePrefix(id, prefix) } @@ -75,7 +77,7 @@ open class PrefixesGlobalDisplay { } } - fun updateColor(id: String, color: NamedTextColor, vararg players: UUID) { + fun updateColor(id: String, color: TextColor, vararg players: UUID) { executeFor(players.toList()) { it.updateColor(id, color) } diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt index 2ffe2d7..6bdb9ee 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt @@ -35,7 +35,7 @@ class PrefixesActorBlankImpl : PrefixesActor { throw NotImplementedError("You need to define a PrefixesActor to use this") } - override fun formatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component { + override fun formatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component { throw NotImplementedError("You need to define a PrefixesActor to use this") } diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt index 356c795..03d36c6 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt @@ -75,7 +75,7 @@ abstract class PrefixesApiImpl : PrefixesApi { return config } - override fun formatChatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component { + override fun formatChatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component { return actor.formatMessage(target, viewer, format, message) } diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt index cea943c..f3c7b42 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt @@ -60,9 +60,9 @@ class PrefixesActorMinestomImpl(private var scoreboard: PrefixesGlobalDisplayMin scoreboard.updateSuffix(player.username, suffix) } - override fun formatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component { + override fun formatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component { val targetPlayer = MinecraftServer.getConnectionManager().getPlayer(target) ?: return message - val display = scoreboard.getDisplay(viewer).orElse(null) ?: return message + val display = if(viewer != null) scoreboard.getDisplay(viewer).orElse(scoreboard.getDefaultDisplay()) else scoreboard.getDefaultDisplay() ?: return message val team = display.getTeam(targetPlayer.username) val tags = mutableListOf() if (team != null) { diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt index 8db6097..816c6db 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt @@ -3,6 +3,7 @@ package app.simplecloud.plugin.prefixes.minestom import app.simplecloud.plugin.prefixes.api.PrefixesDisplay import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextColor import net.minestom.server.MinecraftServer import net.minestom.server.entity.Player import net.minestom.server.network.packet.server.play.PlayerInfoUpdatePacket @@ -13,6 +14,7 @@ class PrefixesTablist : PrefixesDisplay { private val teams = mutableListOf() private val viewers = mutableSetOf() + private var color: TextColor = NamedTextColor.GRAY override fun addViewer(player: Player): Boolean { val result = viewers.add(player) if (result) { @@ -72,9 +74,10 @@ class PrefixesTablist : PrefixesDisplay { return newTeam } - override fun updateColor(id: String, color: NamedTextColor) { + override fun updateColor(id: String, color: TextColor) { val team = getTeam(id) ?: return - team.teamColor = color + team.teamColor = NamedTextColor.nearestTo(color) + this.color = color render(team) } @@ -125,7 +128,7 @@ class PrefixesTablist : PrefixesDisplay { true, player.latency, player.gameMode, - team.prefix.append(Component.text(player.username)).append(team.suffix), + team.prefix.append(Component.text(player.username).color(color)).append(team.suffix), null ) ) diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt index 118ac2d..ef0d301 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt @@ -54,7 +54,7 @@ class PrefixesPlugin : JavaPlugin(), Listener { @EventHandler(priority = EventPriority.LOWEST) fun onChat(event: AsyncChatEvent) { event.renderer { player, _, message, audience -> - val viewer = audience.getOrDefault(Identity.UUID, null) ?: return@renderer message + val viewer = audience.getOrDefault(Identity.UUID, null) prefixesApi.formatChatMessage(player.uniqueId, viewer, prefixesApi.getConfig().getChatFormat(), message) } } diff --git a/prefixes-spigot/build.gradle.kts b/prefixes-spigot/build.gradle.kts index 68dcdc3..d06bb6b 100644 --- a/prefixes-spigot/build.gradle.kts +++ b/prefixes-spigot/build.gradle.kts @@ -1,6 +1,6 @@ dependencies { api(project(":prefixes-shared")) - compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT") + compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT") implementation("net.kyori:adventure-text-serializer-gson:4.14.0") compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt index 0baff27..4101446 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt @@ -4,6 +4,7 @@ import com.comphenix.protocol.wrappers.WrappedChatComponent import net.kyori.adventure.text.Component import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer import net.md_5.bungee.chat.ComponentSerializer +import net.minecraft.MinecraftVersion class LegacyComponentSerializerImpl { companion object { diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index 6406aa7..5af414e 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -21,6 +21,11 @@ class PrefixesActorSpigotImpl( private var manager: ProtocolManager, private var scoreboard: PrefixesGlobalDisplaySpigotImpl ) : PrefixesActor { + + init { + scoreboard.setDefaultDisplay(PrefixesDisplaySpigotImpl(manager)) + } + override fun registerViewer(target: UUID, api: PrefixesApi) { val targetPlayer = Bukkit.getPlayer(target) ?: return val display = PrefixesDisplaySpigotImpl(manager) @@ -78,8 +83,8 @@ class PrefixesActorSpigotImpl( scoreboard.updatePrefix(player.name, suffix, *viewers) } - override fun formatMessage(target: UUID, viewer: UUID, format: String, message: Component): Component { - val display = scoreboard.getDisplay(viewer).orElseGet { scoreboard.getDefaultDisplay() } + override fun formatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component { + val display = if(viewer != null) scoreboard.getDisplay(viewer).orElseGet { scoreboard.getDefaultDisplay() } else scoreboard.getDefaultDisplay() ?: return message val targetPlayer = Bukkit.getPlayer(target) ?: return message val team: PacketTeam? = display.getTeam(targetPlayer.name) val tags = mutableListOf() @@ -92,12 +97,6 @@ class PrefixesActorSpigotImpl( Component.text(Bukkit.getPlayer(target)!!.name).color(team.color) ) ) - tags.add( - Placeholder.component( - "name_prefixed", - (team.prefix ?: Component.text("")).append(Component.text(targetPlayer.name)) - ) - ) tags.add(Placeholder.unparsed("name", targetPlayer.name)) } else { tags.add(Placeholder.unparsed("name", targetPlayer.name)) @@ -108,6 +107,6 @@ class PrefixesActorSpigotImpl( override fun setColor(target: UUID, color: String, vararg viewers: UUID) { val player = Bukkit.getPlayer(target) ?: return - scoreboard.updateColor(player.name, NamedTextColor.nearestTo(TextColor.fromHexString(color) ?: NamedTextColor.GRAY), *viewers) + scoreboard.updateColor(player.name, TextColor.fromHexString(color) ?: NamedTextColor.GRAY, *viewers) } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt index d036e6d..5ba25be 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt @@ -6,6 +6,8 @@ import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamMode import com.comphenix.protocol.ProtocolManager import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextColor +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam import org.bukkit.entity.Player import org.bukkit.scoreboard.Team import org.checkerframework.checker.units.qual.C @@ -42,7 +44,7 @@ class PrefixesDisplaySpigotImpl( return team } - override fun updateColor(id: String, color: NamedTextColor) { + override fun updateColor(id: String, color: TextColor) { val team = getTeam(id) ?: return team.color = color val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) @@ -100,8 +102,10 @@ class PrefixesDisplaySpigotImpl( val team = getTeam(id) ?: return if(!team.members.contains(player)) { team.members.add(player) + val packet = team.getAddTeamMemberPacket(player) val displayPacket = team.getUpdateDisplayNamePacket(player) viewers.forEach { viewer -> + manager.sendServerPacket(viewer, packet) manager.sendServerPacket(viewer, displayPacket) } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt index 388a6fd..76860ba 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -1,24 +1,22 @@ package app.simplecloud.plugin.prefixes.spigot.packet -import WrappedScoreboardTeam import app.simplecloud.plugin.prefixes.spigot.LegacyComponentSerializerImpl import com.comphenix.protocol.PacketType -import com.comphenix.protocol.events.InternalStructure import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.utility.MinecraftReflection import com.comphenix.protocol.wrappers.EnumWrappers import com.comphenix.protocol.wrappers.PlayerInfoData -import com.comphenix.protocol.wrappers.WrappedChatComponent import com.comphenix.protocol.wrappers.WrappedGameProfile -import com.google.common.base.Optional import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextColor import org.bukkit.ChatColor import org.bukkit.entity.Player -import java.util.EnumSet +import java.util.* class PacketTeam( private var id: String, - var color: NamedTextColor?, + var color: TextColor?, var prefix: Component?, var suffix: Component?, var members: MutableList = mutableListOf() @@ -33,35 +31,18 @@ class PacketTeam( fun getTeamUpdatePacket(mode: UpdateTeamMode): PacketContainer { val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - val optionals = packet.modifier.withType>(Optional::class.java) - if(packet.integers.size() > 1) { - packet.integers.write(1, mode.getMode()) - }else if(packet.integers.size() > 0) { - packet.integers.write(0, mode.getMode()) - } + packet.integers.write(0, mode.getMode()) if(mode == UpdateTeamMode.CREATE) packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) - packet.strings.writeSafely(0, id) - packet.strings.writeSafely(1, id) - if(prefix != null) packet.strings.writeSafely(2, LegacyComponentSerializerImpl.serialize(prefix!!)) - if(suffix != null) packet.strings.writeSafely(3, LegacyComponentSerializerImpl.serialize(suffix!!)) - - packet.chatComponents.writeSafely(0, WrappedChatComponent.fromText(id)) - packet.chatComponents.writeSafely(1, LegacyComponentSerializerImpl.serializeToPacket(prefix ?: Component.text(""))) - packet.chatComponents.writeSafely(2, LegacyComponentSerializerImpl.serializeToPacket(suffix ?: Component.text(""))) - - if(optionals.size() > 0) { - val packetTeam = WrappedScoreboardTeam.fromHandle(optionals.read(0).get()) - packetTeam.displayName = WrappedChatComponent.fromText(id) - packetTeam.prefix = LegacyComponentSerializerImpl.serializeToPacket(prefix ?: Component.text("")) - packetTeam.suffix = LegacyComponentSerializerImpl.serializeToPacket(suffix ?: Component.text("")) - if(color != null) - packetTeam.teamColor = ChatColor.valueOf(color.toString().uppercase()) - println(packetTeam.handle) - optionals.write(0, Optional.of(packetTeam.handle)) + packet.strings.write(0, id) + if(packet.optionalStructures.size() > 0) { + val optional = packet.optionalStructures.read(0).get() + if(prefix != null) optional.chatComponents.write(1, LegacyComponentSerializerImpl.serializeToPacket(prefix!!)) + if(suffix != null) optional.chatComponents.write(2, LegacyComponentSerializerImpl.serializeToPacket(suffix!!)) + optional.getEnumModifier(ChatColor::class.java, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0, if(color != null) ChatColor.valueOf(NamedTextColor.nearestTo(color!!).toString().uppercase()) else ChatColor.GRAY) + packet.optionalStructures.write(0, Optional.of(optional)) } - return packet } fun getTeamDeletePacket(): PacketContainer { @@ -90,6 +71,21 @@ class PacketTeam( packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) return packet } + + fun getAddTeamMemberPacket(player: Player): PacketContainer { + val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) + if(packet.integers.size() > 1) { + packet.integers.write(1, 3) + }else if(packet.integers.size() > 0) { + packet.integers.write(0, 3) + } + packet.strings.write(0, id) + packet.getSpecificModifier(Collection::class.java).write(0, listOf(player.name)) + return packet + } + + + fun getRemoveTeamMembersPacket(vararg player: Player): PacketContainer { val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) if(packet.integers.size() > 1) { @@ -117,7 +113,7 @@ class PacketTeam( private fun constructDisplayName(player: Player): Component { if(!members.contains(player)) return Component.text(player.name) - val base = if(prefix != null) prefix!!.append(Component.text(player.name)) else Component.text(player.name) + val base = if(prefix != null) prefix!!.append(Component.text(player.name).color(color)) else Component.text(player.name) if(suffix != null) base.append(suffix!!) return base } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/wrappers/WrappedScoreboardTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/wrappers/WrappedScoreboardTeam.kt deleted file mode 100644 index cea8252..0000000 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/wrappers/WrappedScoreboardTeam.kt +++ /dev/null @@ -1,188 +0,0 @@ -import com.comphenix.protocol.reflect.FuzzyReflection -import com.comphenix.protocol.reflect.accessors.Accessors -import com.comphenix.protocol.reflect.accessors.FieldAccessor -import com.comphenix.protocol.utility.MinecraftReflection -import com.comphenix.protocol.wrappers.AbstractWrapper -import com.comphenix.protocol.wrappers.EnumWrappers -import com.comphenix.protocol.wrappers.WrappedChatComponent -import org.bukkit.ChatColor -import org.bukkit.scoreboard.Team - -class WrappedScoreboardTeam private constructor(handle: Any) : - AbstractWrapper(MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b")) { - init { - setHandle(handle) - } - - var displayName: WrappedChatComponent - get() = WrappedChatComponent.fromHandle(DISPLAY_NAME[handle]) - set(displayName) { - DISPLAY_NAME[handle] = displayName.handle - } - - var prefix: WrappedChatComponent - get() = WrappedChatComponent.fromHandle(PREFIX[handle]) - set(prefix) { - PREFIX[handle] = prefix.handle - } - - var suffix: WrappedChatComponent - get() = WrappedChatComponent.fromHandle(SUFFIX[handle]) - set(suffix) { - SUFFIX[handle] = suffix.handle - } - - var nameTagVisibility: Team.OptionStatus - get() { - val value = NAME_TAG_VISIBILITY[handle] as String - return when (value) { - "always" -> Team.OptionStatus.ALWAYS - "never" -> Team.OptionStatus.NEVER - "hideForOtherTeams" -> Team.OptionStatus.FOR_OTHER_TEAMS - "hideForOwnTeam" -> Team.OptionStatus.FOR_OWN_TEAM - else -> throw IllegalArgumentException("Unexpected value: $value") - } - } - set(value) { - when (value) { - Team.OptionStatus.ALWAYS -> NAME_TAG_VISIBILITY[handle] = - "always" - - Team.OptionStatus.NEVER -> NAME_TAG_VISIBILITY[handle] = - "never" - - Team.OptionStatus.FOR_OTHER_TEAMS -> NAME_TAG_VISIBILITY[handle] = - "hideForOtherTeams" - - Team.OptionStatus.FOR_OWN_TEAM -> NAME_TAG_VISIBILITY[handle] = - "hideForOwnTeam" - - else -> throw IllegalArgumentException("Unexpected value: $value") - } - } - - var collisionRule: Team.OptionStatus - get() { - val value = COLLISION_RULE[handle] as String - return when (value) { - "always" -> Team.OptionStatus.ALWAYS - "never" -> Team.OptionStatus.NEVER - "pushOtherTeams" -> Team.OptionStatus.FOR_OTHER_TEAMS - "pushOwnTeam" -> Team.OptionStatus.FOR_OWN_TEAM - else -> throw IllegalArgumentException("Unexpected value: $value") - } - } - set(value) { - when (value) { - Team.OptionStatus.ALWAYS -> COLLISION_RULE[handle] = - "always" - - Team.OptionStatus.NEVER -> COLLISION_RULE[handle] = - "never" - - Team.OptionStatus.FOR_OTHER_TEAMS -> COLLISION_RULE[handle] = - "pushOtherTeams" - - Team.OptionStatus.FOR_OWN_TEAM -> COLLISION_RULE[handle] = - "pushOwnTeam" - - else -> throw IllegalArgumentException("Unexpected value: $value") - } - } - - var teamColor: ChatColor? - get() = ChatColor.getByChar(TEAM_COLOR[handle].toString()[1]) - set(value) { - if (value!!.isColor || value === ChatColor.RESET) { - TEAM_COLOR[handle] = CHATCOLOR_CONVERTER.getGeneric(value) - } - } - - var friendlyFire: Boolean = false - get() { - val intValue = (FRIENDLY_FLAGS[handle] as Int) - return (intValue and 0x01) == 1 - } - set(value) { - val currentValue = (FRIENDLY_FLAGS[handle] as Int) - if (field && !value) { - // is already friendly fire but should not be - FRIENDLY_FLAGS[handle] = currentValue xor 0x01 - } else if (value) { - // is already friendly fire but should not be - FRIENDLY_FLAGS[handle] = currentValue or 0x01 - } - field = value - } - - var friendlySeeInvisible: Boolean - get() { - val intValue = (FRIENDLY_FLAGS[handle] as Int) - return (intValue and 0x02) == 2 - } - set(value) { - val currentValue = (FRIENDLY_FLAGS[handle] as Int) - if (friendlyFire && !value) { - // is already friendly fire but should not be - FRIENDLY_FLAGS[handle] = currentValue xor 0x02 - } else if (value) { - // is already friendly fire but should not be - FRIENDLY_FLAGS[handle] = currentValue or 0x02 - } - } - - companion object { - private val DISPLAY_NAME: FieldAccessor = getFieldAccessor( - MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), - "a", - true - ) - private val PREFIX: FieldAccessor = getFieldAccessor( - MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), - "b", - true - ) - private val SUFFIX: FieldAccessor = getFieldAccessor( - MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), - "c", - true - ) - - private val NAME_TAG_VISIBILITY: FieldAccessor = getFieldAccessor( - MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), - "d", - true - ) - private val COLLISION_RULE: FieldAccessor = getFieldAccessor( - MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), - "e", - true - ) - private val TEAM_COLOR: FieldAccessor = getFieldAccessor( - MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), - "f", - true - ) - private val FRIENDLY_FLAGS: FieldAccessor = getFieldAccessor( - MinecraftReflection.getMinecraftClass("network.protocol.game.PacketPlayOutScoreboardTeam\$b"), - "g", - true - ) - - private val ENUM_CHAT_FORMAT_CLASS: Class<*> = MinecraftReflection.getMinecraftClass("EnumChatFormat") - private val CHATCOLOR_CONVERTER = EnumWrappers.IndexedEnumConverter( - ChatColor::class.java, - ENUM_CHAT_FORMAT_CLASS - ) - - fun fromHandle(handle: Any): WrappedScoreboardTeam { - return WrappedScoreboardTeam(handle) - } - - private fun getFieldAccessor(instanceClass: Class<*>?, fieldName: String, forceAccess: Boolean): FieldAccessor { - val field = FuzzyReflection.fromClass(instanceClass, forceAccess).getFieldByName(fieldName) - return Accessors.getFieldAccessor(field) - } - } - -} \ No newline at end of file diff --git a/prefixes-spigot/src/main/resources/config.json b/prefixes-spigot/src/main/resources/config.json index 6ebe854..efe10ef 100644 --- a/prefixes-spigot/src/main/resources/config.json +++ b/prefixes-spigot/src/main/resources/config.json @@ -1,3 +1,3 @@ { - "chatFormat": ": " + "chatFormat": ": " } \ No newline at end of file From 8e093490c7bc263e3e42572e3488cfeb8b3ecda8 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Thu, 9 May 2024 13:06:59 +0200 Subject: [PATCH 08/21] refactor: make code prettier --- .../plugin/prefixes/api/PrefixesApi.kt | 2 +- .../plugin/prefixes/api/PrefixesChatLoader.kt | 12 ++ .../prefixes/api/PrefixesPluginLoader.kt | 12 ++ .../src/main/resources/extension.json | 4 +- prefixes-paper/build.gradle.kts | 3 +- .../prefixes/paper/PaperPrefixesChatLoader.kt | 28 ++++ .../plugin/prefixes/paper/PrefixesPlugin.kt | 56 +------ prefixes-paper/src/main/resources/plugin.yml | 4 +- prefixes-spigot/build.gradle.kts | 1 + ...izerImpl.kt => ComponentSerializerImpl.kt} | 15 +- .../spigot/PrefixesActorSpigotImpl.kt | 2 - .../spigot/PrefixesDisplaySpigotImpl.kt | 17 +-- .../plugin/prefixes/spigot/PrefixesPlugin.kt | 59 +------- .../spigot/loader/SpigotPrefixesChatLoader.kt | 36 +++++ .../spigot/loader/SpigotPrefixesLoader.kt | 58 +++++++ .../prefixes/spigot/packet/PacketTeam.kt | 141 ++++-------------- .../packet}/PlayerCreatePacketAdapter.kt | 2 +- .../packet/v1_17_1/ComponentPacketTeam.kt | 97 ++++++++++++ prefixes-spigot/src/main/resources/plugin.yml | 4 +- 19 files changed, 310 insertions(+), 243 deletions(-) create mode 100644 prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesChatLoader.kt create mode 100644 prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesPluginLoader.kt create mode 100644 prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesChatLoader.kt rename prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/{LegacyComponentSerializerImpl.kt => ComponentSerializerImpl.kt} (55%) create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt rename {prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper => prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet}/PlayerCreatePacketAdapter.kt (94%) create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt index 05e4f04..6ee1eca 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt @@ -95,7 +95,7 @@ interface PrefixesApi { /** * Returns a formatted chat message of the target player that will be sent to the viewer * @param target UUID of the target player - * @param viewer UUID of the viewing player + * @param viewer UUID of the viewing player (if null, only default prefix and suffix of the players group will be shown) * @param format the chat format the message should follow * @param message Message sent by the [target] */ diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesChatLoader.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesChatLoader.kt new file mode 100644 index 0000000..9814e08 --- /dev/null +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesChatLoader.kt @@ -0,0 +1,12 @@ +package app.simplecloud.plugin.prefixes.api + +import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl + +interface PrefixesChatLoader { + + /** + * Instantiates the chat provider of PrefixesApi (useful for sharding) + * @param api the [PrefixesApiImpl] object the ChatLoader belongs to + */ + fun load(api: PrefixesApiImpl) +} \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesPluginLoader.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesPluginLoader.kt new file mode 100644 index 0000000..d326c3c --- /dev/null +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesPluginLoader.kt @@ -0,0 +1,12 @@ +package app.simplecloud.plugin.prefixes.api + +import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl + +interface PrefixesPluginLoader { + + /** + * Instantiates a new PrefixesApi (useful for sharding) + * @return a [PrefixesApiImpl] (null if load failed) + */ + fun load(): PrefixesApiImpl? +} \ No newline at end of file diff --git a/prefixes-minestom/src/main/resources/extension.json b/prefixes-minestom/src/main/resources/extension.json index 9fa33db..7d64099 100644 --- a/prefixes-minestom/src/main/resources/extension.json +++ b/prefixes-minestom/src/main/resources/extension.json @@ -1,7 +1,7 @@ { "entrypoint": "app.simplecloud.plugin.prefixes.minestom.PrefixesExtension", - "name": "PrefixesApi", - "version": "1.0", + "name": "Prefixes", + "version": "1.1", "dependencies": [ "LuckPerms" ] diff --git a/prefixes-paper/build.gradle.kts b/prefixes-paper/build.gradle.kts index bbb3739..661b1c7 100644 --- a/prefixes-paper/build.gradle.kts +++ b/prefixes-paper/build.gradle.kts @@ -1,6 +1,5 @@ dependencies { - api(project(":prefixes-shared")) api(project(":prefixes-spigot")) - compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") + compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") } \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesChatLoader.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesChatLoader.kt new file mode 100644 index 0000000..efd2634 --- /dev/null +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesChatLoader.kt @@ -0,0 +1,28 @@ +package app.simplecloud.plugin.prefixes.paper + +import app.simplecloud.plugin.prefixes.api.PrefixesChatLoader +import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl +import io.papermc.paper.event.player.AsyncChatEvent +import net.kyori.adventure.identity.Identity +import org.bukkit.Bukkit +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.plugin.Plugin + +class PaperPrefixesChatLoader(private val plugin: Plugin) : PrefixesChatLoader, Listener { + + private lateinit var api: PrefixesApiImpl + override fun load(api: PrefixesApiImpl) { + this.api = api + Bukkit.getPluginManager().registerEvents(this, plugin) + } + + @EventHandler(priority = EventPriority.LOWEST) + fun onChat(event: AsyncChatEvent) { + event.renderer { player, _, message, audience -> + val viewer = audience.getOrDefault(Identity.UUID, null) + api.formatChatMessage(player.uniqueId, viewer, api.getConfig().getChatFormat(), message) + } + } +} \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt index ef0d301..471031b 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt @@ -1,63 +1,15 @@ package app.simplecloud.plugin.prefixes.paper -import app.simplecloud.plugin.prefixes.api.PrefixesApi -import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl -import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl -import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser -import app.simplecloud.plugin.prefixes.spigot.PrefixesActorSpigotImpl -import app.simplecloud.plugin.prefixes.spigot.PrefixesGlobalDisplaySpigotImpl +import app.simplecloud.plugin.prefixes.spigot.loader.SpigotPrefixesLoader import com.comphenix.protocol.ProtocolLibrary -import io.papermc.paper.event.player.AsyncChatEvent -import net.kyori.adventure.identity.Identity -import net.luckperms.api.LuckPerms -import org.bukkit.Bukkit -import org.bukkit.event.EventHandler -import org.bukkit.event.EventPriority import org.bukkit.event.Listener -import org.bukkit.event.player.PlayerQuitEvent -import org.bukkit.plugin.RegisteredServiceProvider -import org.bukkit.plugin.ServicePriority import org.bukkit.plugin.java.JavaPlugin -import java.io.File class PrefixesPlugin : JavaPlugin(), Listener { - - private lateinit var prefixesApi: PrefixesApiLuckPermsImpl - private val scoreboard: PrefixesGlobalDisplaySpigotImpl = PrefixesGlobalDisplaySpigotImpl() - override fun onEnable() { - val manager = ProtocolLibrary.getProtocolManager() - val prefixesApiActor = PrefixesActorSpigotImpl(manager, scoreboard) - val luckPermsProvider: RegisteredServiceProvider = - Bukkit.getServicesManager().getRegistration(LuckPerms::class.java) ?: return - val luckPerms: LuckPerms = luckPermsProvider.provider - prefixesApi = PrefixesApiLuckPermsImpl(luckPerms) - prefixesApi.setActor(prefixesApiActor) - prefixesApi.setConfig( - PrefixesConfigParser(File(dataFolder, "config.json")).parse( - PrefixesConfigImpl::class.java, - PrefixesConfigImpl() - ) - ) - saveResource("config.json", false) - prefixesApi.indexGroups() - Bukkit.getPluginManager().registerEvents(this, this) - Bukkit.getServicesManager().register(PrefixesApi::class.java, prefixesApi, this, ServicePriority.Normal) - manager.addPacketListener(PlayerCreatePacketAdapter(this, prefixesApi)) - } - - @EventHandler - fun onQuit(event: PlayerQuitEvent) { - prefixesApi.removeViewer(event.player.uniqueId) - } - - @EventHandler(priority = EventPriority.LOWEST) - fun onChat(event: AsyncChatEvent) { - event.renderer { player, _, message, audience -> - val viewer = audience.getOrDefault(Identity.UUID, null) - prefixesApi.formatChatMessage(player.uniqueId, viewer, prefixesApi.getConfig().getChatFormat(), message) + val loader = SpigotPrefixesLoader(ProtocolLibrary.getProtocolManager(), this, PaperPrefixesChatLoader(this)) + if(loader.load() == null) { + throw NullPointerException("The Prefixes Plugin could not load correctly") } } - - } \ No newline at end of file diff --git a/prefixes-paper/src/main/resources/plugin.yml b/prefixes-paper/src/main/resources/plugin.yml index fa11d7c..7cf942a 100644 --- a/prefixes-paper/src/main/resources/plugin.yml +++ b/prefixes-paper/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ -name: PrefixesApi -version: 1.0 +name: Prefixes +version: 1.1 main: app.simplecloud.plugin.prefixes.paper.PrefixesPlugin authors: - dayyeeet \ No newline at end of file diff --git a/prefixes-spigot/build.gradle.kts b/prefixes-spigot/build.gradle.kts index d06bb6b..5f4040f 100644 --- a/prefixes-spigot/build.gradle.kts +++ b/prefixes-spigot/build.gradle.kts @@ -3,4 +3,5 @@ dependencies { compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT") implementation("net.kyori:adventure-text-serializer-gson:4.14.0") compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") + compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/ComponentSerializerImpl.kt similarity index 55% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt rename to prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/ComponentSerializerImpl.kt index 4101446..049c195 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LegacyComponentSerializerImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/ComponentSerializerImpl.kt @@ -3,20 +3,21 @@ package app.simplecloud.plugin.prefixes.spigot import com.comphenix.protocol.wrappers.WrappedChatComponent import net.kyori.adventure.text.Component import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer -import net.md_5.bungee.chat.ComponentSerializer -import net.minecraft.MinecraftVersion +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer -class LegacyComponentSerializerImpl { +class ComponentSerializerImpl { companion object { private val impl = GsonComponentSerializer.builder().build() + private val legacyImpl = + LegacyComponentSerializer.builder().hexColors().character('§').useUnusualXRepeatedCharacterHexFormat().hexCharacter('x').build() - fun deserialize(text: String): Component { - return impl.deserialize(text) + private fun serialize(component: Component): String { + return impl.serialize(component) } - fun serialize(component: Component): String { - return impl.serialize(component) + fun serializeLegacy(component: Component): String { + return legacyImpl.serialize(component) } fun serializeToPacket(component: Component): WrappedChatComponent { diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index 5af414e..935f55d 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -12,9 +12,7 @@ import net.kyori.adventure.text.format.TextColor import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.Bukkit -import org.bukkit.ChatColor import org.bukkit.entity.Player -import org.bukkit.scoreboard.Team import java.util.* class PrefixesActorSpigotImpl( diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt index 5ba25be..756ce2f 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt @@ -3,14 +3,11 @@ package app.simplecloud.plugin.prefixes.spigot import app.simplecloud.plugin.prefixes.api.PrefixesDisplay import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamMode +import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamPlayersMode import com.comphenix.protocol.ProtocolManager import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.format.TextColor -import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam import org.bukkit.entity.Player -import org.bukkit.scoreboard.Team -import org.checkerframework.checker.units.qual.C class PrefixesDisplaySpigotImpl( private val manager: ProtocolManager @@ -20,11 +17,11 @@ class PrefixesDisplaySpigotImpl( private val viewers: MutableSet = mutableSetOf() override fun createTeam(id: String, priority: Int): PacketTeam? { - if (getTeam(id) != null) return null; + if (getTeam(id) != null) return null val name = "${toPriorityString(priority)}$id" - val team = PacketTeam(name, null, null, null, mutableListOf()) + val team = PacketTeam.create(name, null, null, null, mutableListOf()) teams[name] = team - return team; + return team } override fun getTeam(id: String): PacketTeam? { @@ -35,7 +32,7 @@ class PrefixesDisplaySpigotImpl( val newId = "${toPriorityString(priority)}$id" if(teams.containsKey(newId)) return null val team = getTeam(id) ?: return null - val packets = team.updateId(newId) + val packets = team.getUpdateIdPackets(newId) viewers.forEach { viewer -> packets.forEach { packet -> manager.sendServerPacket(viewer, packet) @@ -88,7 +85,7 @@ class PrefixesDisplaySpigotImpl( teams.forEach { if (it.value.members.contains(player)) { it.value.members.remove(player) - val packet = it.value.getRemoveTeamMembersPacket(player) + val packet = it.value.getModifyTeamMembersPacket(UpdateTeamPlayersMode.REMOVE, listOf(player)) val displayPacket = it.value.getUpdateDisplayNamePacket(player) viewers.forEach { viewer -> manager.sendServerPacket(viewer, packet) @@ -102,7 +99,7 @@ class PrefixesDisplaySpigotImpl( val team = getTeam(id) ?: return if(!team.members.contains(player)) { team.members.add(player) - val packet = team.getAddTeamMemberPacket(player) + val packet = team.getModifyTeamMembersPacket(UpdateTeamPlayersMode.ADD, listOf(player)) val displayPacket = team.getUpdateDisplayNamePacket(player) viewers.forEach { viewer -> manager.sendServerPacket(viewer, packet) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt index 074e45e..7523a88 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt @@ -1,64 +1,17 @@ package app.simplecloud.plugin.prefixes.spigot -import app.simplecloud.plugin.prefixes.api.PrefixesApi -import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl -import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl -import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl -import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser +import app.simplecloud.plugin.prefixes.spigot.loader.SpigotPrefixesChatLoader +import app.simplecloud.plugin.prefixes.spigot.loader.SpigotPrefixesLoader import com.comphenix.protocol.ProtocolLibrary -import net.luckperms.api.LuckPerms -import org.bukkit.Bukkit -import org.bukkit.event.EventHandler -import org.bukkit.event.EventPriority import org.bukkit.event.Listener -import org.bukkit.event.player.AsyncPlayerChatEvent -import org.bukkit.event.player.PlayerQuitEvent -import org.bukkit.plugin.RegisteredServiceProvider -import org.bukkit.plugin.ServicePriority import org.bukkit.plugin.java.JavaPlugin -import java.io.File class PrefixesPlugin : JavaPlugin(), Listener { - private lateinit var prefixesApi: PrefixesApiLuckPermsImpl - private val scoreboard: PrefixesGlobalDisplaySpigotImpl = PrefixesGlobalDisplaySpigotImpl() - override fun onEnable() { - val manager = ProtocolLibrary.getProtocolManager() - val prefixesApiActor = PrefixesActorSpigotImpl(manager, scoreboard) - val luckPermsProvider: RegisteredServiceProvider = - Bukkit.getServicesManager().getRegistration(LuckPerms::class.java) ?: return - val luckPerms: LuckPerms = luckPermsProvider.provider - prefixesApi = PrefixesApiLuckPermsImpl(luckPerms) - prefixesApi.setActor(prefixesApiActor) - prefixesApi.setConfig( - PrefixesConfigParser(File(dataFolder, "config.json")).parse( - PrefixesConfigImpl::class.java, - PrefixesConfigImpl() - ) - ) - saveResource("config.json", false) - prefixesApi.indexGroups() - Bukkit.getPluginManager().registerEvents(this, this) - Bukkit.getServicesManager().register(PrefixesApi::class.java, prefixesApi, this, ServicePriority.Normal) - } - - @EventHandler - fun onQuit(event: PlayerQuitEvent) { - prefixesApi.removeViewer(event.player.uniqueId) + val loader = SpigotPrefixesLoader(ProtocolLibrary.getProtocolManager(), this, SpigotPrefixesChatLoader(this)) + if(loader.load() == null) { + throw NullPointerException("The Prefixes Plugin could not load correctly") + } } - - @EventHandler(priority = EventPriority.LOWEST) - fun onChat(event: AsyncPlayerChatEvent) { - event.format = LegacyComponentSerializerImpl.serialize( - prefixesApi.formatChatMessage( - event.player.uniqueId, - event.player.uniqueId, - prefixesApi.getConfig().getChatFormat(), - MiniMessageImpl.parse(event.message) - ) - ) - } - - } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt new file mode 100644 index 0000000..b1ebbc0 --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt @@ -0,0 +1,36 @@ +package app.simplecloud.plugin.prefixes.spigot.loader + +import app.simplecloud.plugin.prefixes.api.PrefixesApi +import app.simplecloud.plugin.prefixes.api.PrefixesChatLoader +import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl +import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl +import app.simplecloud.plugin.prefixes.spigot.ComponentSerializerImpl +import org.bukkit.Bukkit +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.AsyncPlayerChatEvent +import org.bukkit.plugin.Plugin + +class SpigotPrefixesChatLoader( + private val plugin: Plugin +): Listener, PrefixesChatLoader { + + private lateinit var api: PrefixesApiImpl + override fun load(api: PrefixesApiImpl) { + this.api = api + Bukkit.getPluginManager().registerEvents(this, plugin) + } + + @EventHandler(priority = EventPriority.LOWEST) + fun onChat(event: AsyncPlayerChatEvent) { + event.format = ComponentSerializerImpl.serializeLegacy( + api.formatChatMessage( + event.player.uniqueId, + event.player.uniqueId, + api.getConfig().getChatFormat(), + MiniMessageImpl.parse(event.message) + ) + ) + } +} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt new file mode 100644 index 0000000..832d209 --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt @@ -0,0 +1,58 @@ +package app.simplecloud.plugin.prefixes.spigot.loader + +import app.simplecloud.plugin.prefixes.api.PrefixesApi +import app.simplecloud.plugin.prefixes.api.PrefixesChatLoader +import app.simplecloud.plugin.prefixes.api.PrefixesPluginLoader +import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl +import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl +import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl +import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser +import app.simplecloud.plugin.prefixes.spigot.PrefixesActorSpigotImpl +import app.simplecloud.plugin.prefixes.spigot.PrefixesGlobalDisplaySpigotImpl +import app.simplecloud.plugin.prefixes.spigot.packet.PlayerCreatePacketAdapter +import com.comphenix.protocol.ProtocolManager +import net.luckperms.api.LuckPerms +import org.bukkit.Bukkit +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerQuitEvent +import org.bukkit.plugin.Plugin +import org.bukkit.plugin.RegisteredServiceProvider +import org.bukkit.plugin.ServicePriority +import java.io.File + +class SpigotPrefixesLoader( + private val manager: ProtocolManager, + private val plugin: Plugin, + private val chatLoader: PrefixesChatLoader +) : PrefixesPluginLoader, Listener { + + private lateinit var api: PrefixesApiImpl + override fun load(): PrefixesApiImpl? { + val prefixesApiActor = PrefixesActorSpigotImpl(manager, PrefixesGlobalDisplaySpigotImpl()) + val luckPermsProvider: RegisteredServiceProvider = + Bukkit.getServicesManager().getRegistration(LuckPerms::class.java) ?: return null + val luckPerms: LuckPerms = luckPermsProvider.provider + api = PrefixesApiLuckPermsImpl(luckPerms) + api.setActor(prefixesApiActor) + api.setConfig( + PrefixesConfigParser(File(plugin.dataFolder, "config.json")).parse( + PrefixesConfigImpl::class.java, + PrefixesConfigImpl() + ) + ) + plugin.saveResource("config.json", false) + api.indexGroups() + Bukkit.getPluginManager().registerEvents(this, plugin) + Bukkit.getServicesManager().register(PrefixesApi::class.java, api, plugin, ServicePriority.Normal) + manager.addPacketListener(PlayerCreatePacketAdapter(plugin, api)) + chatLoader.load(api) + return api + } + + + @EventHandler + fun onQuit(event: PlayerQuitEvent) { + api.removeViewer(event.player.uniqueId) + } +} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt index 76860ba..3da369c 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -1,121 +1,35 @@ package app.simplecloud.plugin.prefixes.spigot.packet -import app.simplecloud.plugin.prefixes.spigot.LegacyComponentSerializerImpl -import com.comphenix.protocol.PacketType +import app.simplecloud.plugin.prefixes.spigot.packet.v1_17_1.ComponentPacketTeam import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.utility.MinecraftReflection -import com.comphenix.protocol.wrappers.EnumWrappers -import com.comphenix.protocol.wrappers.PlayerInfoData -import com.comphenix.protocol.wrappers.WrappedGameProfile +import com.comphenix.protocol.utility.MinecraftVersion import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.format.TextColor -import org.bukkit.ChatColor import org.bukkit.entity.Player -import java.util.* -class PacketTeam( - private var id: String, - var color: TextColor?, - var prefix: Component?, - var suffix: Component?, - var members: MutableList = mutableListOf() +abstract class PacketTeam( + open var id: String, + open var color: TextColor?, + open var prefix: Component?, + open var suffix: Component?, + open var members: MutableList = mutableListOf() ) { - fun updateId(id: String): List { - val toReturn = mutableListOf() - toReturn.add(getTeamDeletePacket()) - this.id = id - toReturn.add(getTeamUpdatePacket(UpdateTeamMode.CREATE)) - return toReturn - } - - fun getTeamUpdatePacket(mode: UpdateTeamMode): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - packet.integers.write(0, mode.getMode()) - if(mode == UpdateTeamMode.CREATE) - packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) - - packet.strings.write(0, id) - if(packet.optionalStructures.size() > 0) { - val optional = packet.optionalStructures.read(0).get() - if(prefix != null) optional.chatComponents.write(1, LegacyComponentSerializerImpl.serializeToPacket(prefix!!)) - if(suffix != null) optional.chatComponents.write(2, LegacyComponentSerializerImpl.serializeToPacket(suffix!!)) - optional.getEnumModifier(ChatColor::class.java, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0, if(color != null) ChatColor.valueOf(NamedTextColor.nearestTo(color!!).toString().uppercase()) else ChatColor.GRAY) - packet.optionalStructures.write(0, Optional.of(optional)) - } - return packet - } - fun getTeamDeletePacket(): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - if(packet.integers.size() > 1) { - packet.integers.write(1, 1) - }else if(packet.integers.size() > 0) { - packet.integers.write(0, 1) - } - packet.strings.write(0, id) - return packet - } - - fun getUpdateTeamMembersPackets(): List { - return listOf(getRemoveTeamMembersPacket(*members.toTypedArray()), getAddTeamMembersPacket()) - } - - fun getAddTeamMembersPacket(): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - if(packet.integers.size() > 1) { - packet.integers.write(1, 3) - }else if(packet.integers.size() > 0) { - packet.integers.write(0, 3) - } - packet.strings.write(0, id) - packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) - return packet - } - - fun getAddTeamMemberPacket(player: Player): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - if(packet.integers.size() > 1) { - packet.integers.write(1, 3) - }else if(packet.integers.size() > 0) { - packet.integers.write(0, 3) - } - packet.strings.write(0, id) - packet.getSpecificModifier(Collection::class.java).write(0, listOf(player.name)) - return packet - } - - - - fun getRemoveTeamMembersPacket(vararg player: Player): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - if(packet.integers.size() > 1) { - packet.integers.write(1, 4) - }else if(packet.integers.size() > 0) { - packet.integers.write(0, 4) + abstract fun getUpdateIdPackets(id: String): List + abstract fun getTeamUpdatePacket(mode: UpdateTeamMode): PacketContainer + abstract fun getTeamDeletePacket(): PacketContainer + abstract fun getUpdateTeamMembersPackets(): List + abstract fun getModifyTeamMembersPacket(mode: UpdateTeamPlayersMode, players: List): PacketContainer + abstract fun getUpdateDisplayNamePackets(): List + abstract fun getUpdateDisplayNamePacket(player: Player): PacketContainer + + companion object { + fun create(id: String, color: TextColor?, prefix: Component?, suffix: Component?, members: MutableList): PacketTeam { + if(MinecraftVersion.CAVES_CLIFFS_1.atOrAbove()) { + return ComponentPacketTeam(id, color, prefix, suffix, members) + } + //TODO: add support for older minecraft versions + throw NullPointerException("No packet wrapper for your server version was found. Please visit https://github.com/thesimplecloud/prefixes-plugin for more information.") } - packet.strings.write(0, id) - packet.getSpecificModifier(Collection::class.java).write(0, player.map { it.name }) - return packet - } - fun getUpdateDisplayNamePackets(): List { - return members.map { getUpdateDisplayNamePacket(it) } - } - - fun getUpdateDisplayNamePacket(player: Player): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.PLAYER_INFO) - packet.playerInfoActions.write(0, EnumSet.of(EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME)) - val infoData = mutableListOf() - val profile = WrappedGameProfile.fromPlayer(player) - infoData.add(PlayerInfoData(profile, player.ping, EnumWrappers.NativeGameMode.fromBukkit(player.gameMode), LegacyComponentSerializerImpl.serializeToPacket(constructDisplayName(player)))) - packet.playerInfoDataLists.write(1, infoData) - return packet - } - - private fun constructDisplayName(player: Player): Component { - if(!members.contains(player)) return Component.text(player.name) - val base = if(prefix != null) prefix!!.append(Component.text(player.name).color(color)) else Component.text(player.name) - if(suffix != null) base.append(suffix!!) - return base } } @@ -126,4 +40,13 @@ enum class UpdateTeamMode(private val mode: Int) { fun getMode(): Int { return mode; } +} + +enum class UpdateTeamPlayersMode(private val mode: Int) { + ADD(3), + REMOVE(4); + + fun getMode(): Int { + return mode + } } \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PlayerCreatePacketAdapter.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt similarity index 94% rename from prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PlayerCreatePacketAdapter.kt rename to prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt index 4b199b6..a4a6b2b 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PlayerCreatePacketAdapter.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt @@ -1,4 +1,4 @@ -package app.simplecloud.plugin.prefixes.paper +package app.simplecloud.plugin.prefixes.spigot.packet import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesGroup diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt new file mode 100644 index 0000000..f389427 --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt @@ -0,0 +1,97 @@ +package app.simplecloud.plugin.prefixes.spigot.packet.v1_17_1 + +import app.simplecloud.plugin.prefixes.spigot.ComponentSerializerImpl +import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam +import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamMode +import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamPlayersMode +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.utility.MinecraftReflection +import com.comphenix.protocol.wrappers.EnumWrappers +import com.comphenix.protocol.wrappers.PlayerInfoData +import com.comphenix.protocol.wrappers.WrappedGameProfile +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextColor +import org.bukkit.ChatColor +import org.bukkit.entity.Player +import java.util.* + +class ComponentPacketTeam( + id: String, + color: TextColor?, + prefix: Component?, + suffix: Component?, + members: MutableList = mutableListOf() +) : PacketTeam(id, color, prefix, suffix, members) { + override fun getUpdateIdPackets(id: String): List { + val toReturn = mutableListOf() + toReturn.add(getTeamDeletePacket()) + this.id = id + toReturn.add(getTeamUpdatePacket(UpdateTeamMode.CREATE)) + return toReturn + } + + override fun getTeamUpdatePacket(mode: UpdateTeamMode): PacketContainer { + val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) + packet.integers.write(0, mode.getMode()) + if(mode == UpdateTeamMode.CREATE) + packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) + + packet.strings.write(0, id) + if(packet.optionalStructures.size() > 0) { + val optional = packet.optionalStructures.read(0).get() + if(prefix != null) optional.chatComponents.write(1, ComponentSerializerImpl.serializeToPacket(prefix!!)) + if(suffix != null) optional.chatComponents.write(2, ComponentSerializerImpl.serializeToPacket(suffix!!)) + optional.getEnumModifier(ChatColor::class.java, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0, if(color != null) ChatColor.valueOf(NamedTextColor.nearestTo(color!!).toString().uppercase()) else ChatColor.GRAY) + packet.optionalStructures.write(0, Optional.of(optional)) + } + return packet + } + override fun getTeamDeletePacket(): PacketContainer { + val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) + if(packet.integers.size() > 1) { + packet.integers.write(1, 1) + }else if(packet.integers.size() > 0) { + packet.integers.write(0, 1) + } + packet.strings.write(0, id) + return packet + } + + override fun getUpdateTeamMembersPackets(): List { + return listOf(getModifyTeamMembersPacket(UpdateTeamPlayersMode.REMOVE, members), getModifyTeamMembersPacket(UpdateTeamPlayersMode.ADD, members)) + } + + override fun getModifyTeamMembersPacket(mode: UpdateTeamPlayersMode, players: List): PacketContainer { + val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) + if(packet.integers.size() > 1) { + packet.integers.write(1, mode.getMode()) + }else if(packet.integers.size() > 0) { + packet.integers.write(0, mode.getMode()) + } + packet.strings.write(0, id) + packet.getSpecificModifier(Collection::class.java).write(0, players.map { it.name }) + return packet + } + override fun getUpdateDisplayNamePackets(): List { + return members.map { getUpdateDisplayNamePacket(it) } + } + + override fun getUpdateDisplayNamePacket(player: Player): PacketContainer { + val packet = PacketContainer(PacketType.Play.Server.PLAYER_INFO) + packet.playerInfoActions.write(0, EnumSet.of(EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME)) + val infoData = mutableListOf() + val profile = WrappedGameProfile.fromPlayer(player) + infoData.add(PlayerInfoData(profile, player.ping, EnumWrappers.NativeGameMode.fromBukkit(player.gameMode), ComponentSerializerImpl.serializeToPacket(constructDisplayName(player)))) + packet.playerInfoDataLists.write(1, infoData) + return packet + } + + private fun constructDisplayName(player: Player): Component { + if(!members.contains(player)) return Component.text(player.name) + val base = if(prefix != null) prefix!!.append(Component.text(player.name).color(color)) else Component.text(player.name) + if(suffix != null) base.append(suffix!!) + return base + } +} \ No newline at end of file diff --git a/prefixes-spigot/src/main/resources/plugin.yml b/prefixes-spigot/src/main/resources/plugin.yml index 77c4ab5..68d4bcb 100644 --- a/prefixes-spigot/src/main/resources/plugin.yml +++ b/prefixes-spigot/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ -name: PrefixesApi -version: 1.0 +name: Prefixes +version: 1.1 main: app.simplecloud.plugin.prefixes.spigot.PrefixesPlugin authors: - dayyeeet \ No newline at end of file From 370edff4871de95687684d2f0a590903a24ee27c Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Thu, 9 May 2024 13:15:36 +0200 Subject: [PATCH 09/21] refactor: fix default chatFormat --- .../simplecloud/plugin/prefixes/api/impl/PrefixesConfigImpl.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesConfigImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesConfigImpl.kt index 1dea3ff..69a4609 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesConfigImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesConfigImpl.kt @@ -4,7 +4,7 @@ import app.simplecloud.plugin.prefixes.api.PrefixesConfig class PrefixesConfigImpl : PrefixesConfig { - private var chatFormat: String = ": " + private var chatFormat: String = ": " override fun getChatFormat(): String { return chatFormat From 3bbe11884fc71b6f2b72b195d4c6664255c08f96 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Fri, 10 May 2024 21:06:03 +0200 Subject: [PATCH 10/21] refactor: bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 55ea212..d53ffda 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { allprojects { group = "app.simplecloud.plugin" - version = "1.0-SNAPSHOT" + version = "1.1-SNAPSHOT" apply { plugin("java") From dba25926787c0e40e3ef78fc42ebb0b1e9abef89 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Fri, 10 May 2024 23:46:58 +0200 Subject: [PATCH 11/21] refactor: make legacy configs possible --- prefixes-shared/build.gradle.kts | 3 +++ .../plugin/prefixes/shared}/ComponentSerializerImpl.kt | 6 +++++- .../plugin/prefixes/shared/MiniMessageImpl.kt | 9 +++++++++ prefixes-spigot/build.gradle.kts | 1 - .../prefixes/spigot/loader/SpigotPrefixesChatLoader.kt | 3 +-- .../spigot/packet/v1_17_1/ComponentPacketTeam.kt | 2 +- 6 files changed, 19 insertions(+), 5 deletions(-) rename {prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot => prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared}/ComponentSerializerImpl.kt (85%) diff --git a/prefixes-shared/build.gradle.kts b/prefixes-shared/build.gradle.kts index e827456..e511b8c 100644 --- a/prefixes-shared/build.gradle.kts +++ b/prefixes-shared/build.gradle.kts @@ -1,3 +1,6 @@ dependencies { api(project(":prefixes-api")) + implementation("net.kyori:adventure-text-serializer-gson:4.14.0") + implementation("net.kyori:adventure-text-serializer-legacy:4.14.0") + compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/ComponentSerializerImpl.kt b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt similarity index 85% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/ComponentSerializerImpl.kt rename to prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt index 049c195..f21435b 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/ComponentSerializerImpl.kt +++ b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt @@ -1,4 +1,4 @@ -package app.simplecloud.plugin.prefixes.spigot +package app.simplecloud.plugin.prefixes.shared import com.comphenix.protocol.wrappers.WrappedChatComponent import net.kyori.adventure.text.Component @@ -20,6 +20,10 @@ class ComponentSerializerImpl { return legacyImpl.serialize(component) } + fun deserializeLegacy(text: String): Component { + return legacyImpl.deserialize(text) + } + fun serializeToPacket(component: Component): WrappedChatComponent { return WrappedChatComponent.fromJson(serialize(component)) } diff --git a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/MiniMessageImpl.kt b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/MiniMessageImpl.kt index 1727d72..97703ed 100644 --- a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/MiniMessageImpl.kt +++ b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/MiniMessageImpl.kt @@ -8,14 +8,23 @@ class MiniMessageImpl { companion object { private val miniMessage = MiniMessage.miniMessage() fun parse(text: String): Component { + if(text.contains("§")) { + return ComponentSerializerImpl.deserializeLegacy(text) + } return miniMessage.deserialize(text) } fun parse(text: String, vararg tags: TagResolver): Component { + if(text.contains("§")) { + return ComponentSerializerImpl.deserializeLegacy(text) + } return miniMessage.deserialize(text, TagResolver.resolver(tags.asIterable())) } fun parse(text: String, tags: Iterable): Component { + if(text.contains("§")) { + return ComponentSerializerImpl.deserializeLegacy(text) + } return miniMessage.deserialize(text, TagResolver.resolver(tags)) } } diff --git a/prefixes-spigot/build.gradle.kts b/prefixes-spigot/build.gradle.kts index 5f4040f..a733646 100644 --- a/prefixes-spigot/build.gradle.kts +++ b/prefixes-spigot/build.gradle.kts @@ -1,7 +1,6 @@ dependencies { api(project(":prefixes-shared")) compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT") - implementation("net.kyori:adventure-text-serializer-gson:4.14.0") compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt index b1ebbc0..b124b10 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt @@ -1,10 +1,9 @@ package app.simplecloud.plugin.prefixes.spigot.loader -import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesChatLoader import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl -import app.simplecloud.plugin.prefixes.spigot.ComponentSerializerImpl +import app.simplecloud.plugin.prefixes.shared.ComponentSerializerImpl import org.bukkit.Bukkit import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt index f389427..fc5db16 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt @@ -1,6 +1,6 @@ package app.simplecloud.plugin.prefixes.spigot.packet.v1_17_1 -import app.simplecloud.plugin.prefixes.spigot.ComponentSerializerImpl +import app.simplecloud.plugin.prefixes.shared.ComponentSerializerImpl import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamMode import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamPlayersMode From aa21a4bd3c3ccdb0b53d3318ba64c774599964eb Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Sat, 11 May 2024 00:39:03 +0200 Subject: [PATCH 12/21] refactor: reformat code --- .../plugin/prefixes/api/PrefixesDisplay.kt | 8 ++-- .../prefixes/api/PrefixesGlobalDisplay.kt | 12 +++-- .../minestom/PrefixesActorMinestomImpl.kt | 5 +- .../prefixes/minestom/PrefixesTablist.kt | 46 ++++++++++-------- .../plugin/prefixes/paper/PrefixesPlugin.kt | 2 +- .../shared/ComponentSerializerImpl.kt | 3 +- .../plugin/prefixes/shared/MiniMessageImpl.kt | 6 +-- .../spigot/PrefixesActorSpigotImpl.kt | 9 ++-- .../spigot/PrefixesDisplaySpigotImpl.kt | 14 +++--- .../spigot/PrefixesGlobalDisplaySpigotImpl.kt | 2 +- .../plugin/prefixes/spigot/PrefixesPlugin.kt | 2 +- .../spigot/loader/SpigotPrefixesChatLoader.kt | 6 +-- .../prefixes/spigot/packet/PacketTeam.kt | 10 +++- .../packet/PlayerCreatePacketAdapter.kt | 8 ++-- .../packet/v1_17_1/ComponentPacketTeam.kt | 48 +++++++++++++------ 15 files changed, 110 insertions(+), 71 deletions(-) diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt index f134adf..6deb718 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt @@ -1,6 +1,5 @@ package app.simplecloud.plugin.prefixes.api -import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.format.TextColor interface PrefixesDisplay { @@ -15,14 +14,15 @@ interface PrefixesDisplay { fun update(id: String, prefix: C, suffix: C, priority: Int) fun toPriorityString(priority: Int): String { - if(priority < 0) return "000" - if(priority > 999) return "999" + if (priority < 0) return "000" + if (priority > 999) return "999" var result = priority.toString() - for(i in 0 until 3 - result.length) { + for (i in 0 until 3 - result.length) { result = "0${result}" } return result } + fun addPlayer(id: String, player: P) fun removePlayer(player: P) fun setViewer(player: P): Boolean diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt index a33ba07..7b35923 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt @@ -1,9 +1,7 @@ package app.simplecloud.plugin.prefixes.api -import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.format.TextColor -import java.util.Optional -import java.util.UUID +import java.util.* open class PrefixesGlobalDisplay { @@ -17,7 +15,7 @@ open class PrefixesGlobalDisplay { displays.filter { players.isEmpty() || players.contains(it.key) }.forEach { display -> action(display.value) } - if(players.isEmpty()) + if (players.isEmpty()) defaultDisplay?.let { action(it) } } @@ -46,31 +44,37 @@ open class PrefixesGlobalDisplay { it.createTeam(id) } } + fun updatePrefix(id: String, prefix: C, vararg players: UUID) { executeFor(players.toList()) { it.updatePrefix(id, prefix) } } + fun updateSuffix(id: String, suffix: C, vararg players: UUID) { executeFor(players.toList()) { it.updateSuffix(id, suffix) } } + fun updatePriority(id: String, priority: Int, vararg players: UUID) { executeFor(players.toList()) { it.updatePriority(id, priority) } } + fun update(id: String, prefix: C, suffix: C, priority: Int, vararg players: UUID) { executeFor(players.toList()) { it.update(id, prefix, suffix, priority) } } + fun addPlayer(id: String, player: P, vararg players: UUID) { executeFor(players.toList()) { it.addPlayer(id, player) } } + fun removePlayer(player: P, vararg players: UUID) { executeFor(players.toList()) { it.removePlayer(player) diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt index f3c7b42..69dedb8 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt @@ -40,7 +40,7 @@ class PrefixesActorMinestomImpl(private var scoreboard: PrefixesGlobalDisplayMin group.getPrefix(), group.getSuffix(), group.getPriority(), *viewers ) - if(group.getColor() != null) + if (group.getColor() != null) setColor(target, group.getColor()!!) scoreboard.addPlayer(player.username, player) } @@ -62,7 +62,8 @@ class PrefixesActorMinestomImpl(private var scoreboard: PrefixesGlobalDisplayMin override fun formatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component { val targetPlayer = MinecraftServer.getConnectionManager().getPlayer(target) ?: return message - val display = if(viewer != null) scoreboard.getDisplay(viewer).orElse(scoreboard.getDefaultDisplay()) else scoreboard.getDefaultDisplay() ?: return message + val display = if (viewer != null) scoreboard.getDisplay(viewer) + .orElse(scoreboard.getDefaultDisplay()) else scoreboard.getDefaultDisplay() ?: return message val team = display.getTeam(targetPlayer.username) val tags = mutableListOf() if (team != null) { diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt index 816c6db..ae1a3c6 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt @@ -47,7 +47,7 @@ class PrefixesTablist : PrefixesDisplay { } override fun createTeam(id: String, priority: Int): Team? { - if(getTeam(id) != null) return null + if (getTeam(id) != null) return null val team = MinecraftServer.getTeamManager().createTeam("${toPriorityString(priority)}$id") teams.add(team) return team @@ -88,7 +88,7 @@ class PrefixesTablist : PrefixesDisplay { override fun removePlayer(player: Player) { teams.forEach { - if(it.players.contains(player)) { + if (it.players.contains(player)) { it.removeMember(player.username) } } @@ -159,28 +159,32 @@ class PrefixesTablist : PrefixesDisplay { } private fun getUpdateTeamPacket(team: Team): TeamsPacket { - return TeamsPacket(team.teamName, TeamsPacket.UpdateTeamAction( - team.teamDisplayName, - team.friendlyFlags, - team.nameTagVisibility, - team.collisionRule, - team.teamColor, - team.prefix, - team.suffix - )) + return TeamsPacket( + team.teamName, TeamsPacket.UpdateTeamAction( + team.teamDisplayName, + team.friendlyFlags, + team.nameTagVisibility, + team.collisionRule, + team.teamColor, + team.prefix, + team.suffix + ) + ) } private fun getCreateTeamPacket(team: Team): TeamsPacket { - return TeamsPacket(team.teamName, TeamsPacket.CreateTeamAction( - team.teamDisplayName, - team.friendlyFlags, - team.nameTagVisibility, - team.collisionRule, - team.teamColor, - team.prefix, - team.suffix, - team.members - )) + return TeamsPacket( + team.teamName, TeamsPacket.CreateTeamAction( + team.teamDisplayName, + team.friendlyFlags, + team.nameTagVisibility, + team.collisionRule, + team.teamColor, + team.prefix, + team.suffix, + team.members + ) + ) } private fun getRemoveTeamPacket(team: Team): TeamsPacket { diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt index 471031b..5af9563 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt @@ -8,7 +8,7 @@ import org.bukkit.plugin.java.JavaPlugin class PrefixesPlugin : JavaPlugin(), Listener { override fun onEnable() { val loader = SpigotPrefixesLoader(ProtocolLibrary.getProtocolManager(), this, PaperPrefixesChatLoader(this)) - if(loader.load() == null) { + if (loader.load() == null) { throw NullPointerException("The Prefixes Plugin could not load correctly") } } diff --git a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt index f21435b..7177e1d 100644 --- a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt +++ b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt @@ -10,7 +10,8 @@ class ComponentSerializerImpl { private val impl = GsonComponentSerializer.builder().build() private val legacyImpl = - LegacyComponentSerializer.builder().hexColors().character('§').useUnusualXRepeatedCharacterHexFormat().hexCharacter('x').build() + LegacyComponentSerializer.builder().hexColors().character('§').useUnusualXRepeatedCharacterHexFormat() + .hexCharacter('x').build() private fun serialize(component: Component): String { return impl.serialize(component) diff --git a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/MiniMessageImpl.kt b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/MiniMessageImpl.kt index 97703ed..77d1d5e 100644 --- a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/MiniMessageImpl.kt +++ b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/MiniMessageImpl.kt @@ -8,21 +8,21 @@ class MiniMessageImpl { companion object { private val miniMessage = MiniMessage.miniMessage() fun parse(text: String): Component { - if(text.contains("§")) { + if (text.contains("§")) { return ComponentSerializerImpl.deserializeLegacy(text) } return miniMessage.deserialize(text) } fun parse(text: String, vararg tags: TagResolver): Component { - if(text.contains("§")) { + if (text.contains("§")) { return ComponentSerializerImpl.deserializeLegacy(text) } return miniMessage.deserialize(text, TagResolver.resolver(tags.asIterable())) } fun parse(text: String, tags: Iterable): Component { - if(text.contains("§")) { + if (text.contains("§")) { return ComponentSerializerImpl.deserializeLegacy(text) } return miniMessage.deserialize(text, TagResolver.resolver(tags)) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index 935f55d..d61293d 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -29,8 +29,8 @@ class PrefixesActorSpigotImpl( val display = PrefixesDisplaySpigotImpl(manager) scoreboard.register(target, display) display.setViewer(targetPlayer) - Bukkit.getOnlinePlayers().forEach { player -> - if(player.uniqueId != target) { + Bukkit.getOnlinePlayers().forEach { player -> + if (player.uniqueId != target) { val group = api.getHighestGroup(player.uniqueId) applyGroup(player.uniqueId, group, target) } @@ -61,7 +61,7 @@ class PrefixesActorSpigotImpl( group.getPriority(), *viewers ) - if(group.getColor() != null) + if (group.getColor() != null) setColor(target, group.getColor()!!, *viewers) scoreboard.addPlayer(player.name, player, *viewers) } @@ -82,7 +82,8 @@ class PrefixesActorSpigotImpl( } override fun formatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component { - val display = if(viewer != null) scoreboard.getDisplay(viewer).orElseGet { scoreboard.getDefaultDisplay() } else scoreboard.getDefaultDisplay() ?: return message + val display = if (viewer != null) scoreboard.getDisplay(viewer) + .orElseGet { scoreboard.getDefaultDisplay() } else scoreboard.getDefaultDisplay() ?: return message val targetPlayer = Bukkit.getPlayer(target) ?: return message val team: PacketTeam? = display.getTeam(targetPlayer.name) val tags = mutableListOf() diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt index 756ce2f..14bd18e 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt @@ -30,7 +30,7 @@ class PrefixesDisplaySpigotImpl( override fun updatePriority(id: String, priority: Int): PacketTeam? { val newId = "${toPriorityString(priority)}$id" - if(teams.containsKey(newId)) return null + if (teams.containsKey(newId)) return null val team = getTeam(id) ?: return null val packets = team.getUpdateIdPackets(newId) viewers.forEach { viewer -> @@ -97,14 +97,14 @@ class PrefixesDisplaySpigotImpl( override fun addPlayer(id: String, player: Player) { val team = getTeam(id) ?: return - if(!team.members.contains(player)) { + if (!team.members.contains(player)) { team.members.add(player) val packet = team.getModifyTeamMembersPacket(UpdateTeamPlayersMode.ADD, listOf(player)) val displayPacket = team.getUpdateDisplayNamePacket(player) - viewers.forEach { viewer -> - manager.sendServerPacket(viewer, packet) - manager.sendServerPacket(viewer, displayPacket) - } + viewers.forEach { viewer -> + manager.sendServerPacket(viewer, packet) + manager.sendServerPacket(viewer, displayPacket) + } } } @@ -114,7 +114,7 @@ class PrefixesDisplaySpigotImpl( val team = updatePriority(id, priority) ?: createTeam(id, priority) ?: return team.prefix = prefix team.suffix = suffix - val packet = team.getTeamUpdatePacket(if(exists) UpdateTeamMode.UPDATE else UpdateTeamMode.CREATE) + val packet = team.getTeamUpdatePacket(if (exists) UpdateTeamMode.UPDATE else UpdateTeamMode.CREATE) val displayPackets = team.getUpdateDisplayNamePackets() viewers.forEach { viewer -> manager.sendServerPacket(viewer, packet) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt index 3bf2ebd..939d709 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt @@ -5,5 +5,5 @@ import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam import net.kyori.adventure.text.Component import org.bukkit.entity.Player -class PrefixesGlobalDisplaySpigotImpl: PrefixesGlobalDisplay() { +class PrefixesGlobalDisplaySpigotImpl : PrefixesGlobalDisplay() { } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt index 7523a88..42437d5 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt @@ -10,7 +10,7 @@ class PrefixesPlugin : JavaPlugin(), Listener { override fun onEnable() { val loader = SpigotPrefixesLoader(ProtocolLibrary.getProtocolManager(), this, SpigotPrefixesChatLoader(this)) - if(loader.load() == null) { + if (loader.load() == null) { throw NullPointerException("The Prefixes Plugin could not load correctly") } } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt index b124b10..671c217 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt @@ -2,8 +2,8 @@ package app.simplecloud.plugin.prefixes.spigot.loader import app.simplecloud.plugin.prefixes.api.PrefixesChatLoader import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl -import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl import app.simplecloud.plugin.prefixes.shared.ComponentSerializerImpl +import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl import org.bukkit.Bukkit import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority @@ -12,8 +12,8 @@ import org.bukkit.event.player.AsyncPlayerChatEvent import org.bukkit.plugin.Plugin class SpigotPrefixesChatLoader( - private val plugin: Plugin -): Listener, PrefixesChatLoader { + private val plugin: Plugin +) : Listener, PrefixesChatLoader { private lateinit var api: PrefixesApiImpl override fun load(api: PrefixesApiImpl) { diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt index 3da369c..e5372aa 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -23,8 +23,14 @@ abstract class PacketTeam( abstract fun getUpdateDisplayNamePacket(player: Player): PacketContainer companion object { - fun create(id: String, color: TextColor?, prefix: Component?, suffix: Component?, members: MutableList): PacketTeam { - if(MinecraftVersion.CAVES_CLIFFS_1.atOrAbove()) { + fun create( + id: String, + color: TextColor?, + prefix: Component?, + suffix: Component?, + members: MutableList + ): PacketTeam { + if (MinecraftVersion.CAVES_CLIFFS_1.atOrAbove()) { return ComponentPacketTeam(id, color, prefix, suffix, members) } //TODO: add support for older minecraft versions diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt index a4a6b2b..3ba302a 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt @@ -8,12 +8,14 @@ import com.comphenix.protocol.events.PacketAdapter import com.comphenix.protocol.events.PacketEvent import org.bukkit.plugin.Plugin -class PlayerCreatePacketAdapter(plugin: Plugin, private val api: PrefixesApi): PacketAdapter(plugin, +class PlayerCreatePacketAdapter(plugin: Plugin, private val api: PrefixesApi) : PacketAdapter( + plugin, ListenerPriority.NORMAL, - PacketType.Play.Client.CHAT_SESSION_UPDATE) { + PacketType.Play.Client.CHAT_SESSION_UPDATE +) { override fun onPacketReceiving(event: PacketEvent) { - if(event.packetType == PacketType.Play.Client.CHAT_SESSION_UPDATE && !api.hasViewer(event.player.uniqueId)) { + if (event.packetType == PacketType.Play.Client.CHAT_SESSION_UPDATE && !api.hasViewer(event.player.uniqueId)) { api.registerViewer(event.player.uniqueId) val playerGroup: PrefixesGroup = api.getHighestGroup(event.player.uniqueId) api.setWholeName(event.player.uniqueId, playerGroup) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt index fc5db16..e85b5f5 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt @@ -35,24 +35,31 @@ class ComponentPacketTeam( override fun getTeamUpdatePacket(mode: UpdateTeamMode): PacketContainer { val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) packet.integers.write(0, mode.getMode()) - if(mode == UpdateTeamMode.CREATE) + if (mode == UpdateTeamMode.CREATE) packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) packet.strings.write(0, id) - if(packet.optionalStructures.size() > 0) { + if (packet.optionalStructures.size() > 0) { val optional = packet.optionalStructures.read(0).get() - if(prefix != null) optional.chatComponents.write(1, ComponentSerializerImpl.serializeToPacket(prefix!!)) - if(suffix != null) optional.chatComponents.write(2, ComponentSerializerImpl.serializeToPacket(suffix!!)) - optional.getEnumModifier(ChatColor::class.java, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0, if(color != null) ChatColor.valueOf(NamedTextColor.nearestTo(color!!).toString().uppercase()) else ChatColor.GRAY) + if (prefix != null) optional.chatComponents.write(1, ComponentSerializerImpl.serializeToPacket(prefix!!)) + if (suffix != null) optional.chatComponents.write(2, ComponentSerializerImpl.serializeToPacket(suffix!!)) + optional.getEnumModifier(ChatColor::class.java, MinecraftReflection.getMinecraftClass("EnumChatFormat")) + .write( + 0, + if (color != null) ChatColor.valueOf( + NamedTextColor.nearestTo(color!!).toString().uppercase() + ) else ChatColor.GRAY + ) packet.optionalStructures.write(0, Optional.of(optional)) } return packet } + override fun getTeamDeletePacket(): PacketContainer { val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - if(packet.integers.size() > 1) { + if (packet.integers.size() > 1) { packet.integers.write(1, 1) - }else if(packet.integers.size() > 0) { + } else if (packet.integers.size() > 0) { packet.integers.write(0, 1) } packet.strings.write(0, id) @@ -60,20 +67,24 @@ class ComponentPacketTeam( } override fun getUpdateTeamMembersPackets(): List { - return listOf(getModifyTeamMembersPacket(UpdateTeamPlayersMode.REMOVE, members), getModifyTeamMembersPacket(UpdateTeamPlayersMode.ADD, members)) + return listOf( + getModifyTeamMembersPacket(UpdateTeamPlayersMode.REMOVE, members), + getModifyTeamMembersPacket(UpdateTeamPlayersMode.ADD, members) + ) } override fun getModifyTeamMembersPacket(mode: UpdateTeamPlayersMode, players: List): PacketContainer { val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - if(packet.integers.size() > 1) { + if (packet.integers.size() > 1) { packet.integers.write(1, mode.getMode()) - }else if(packet.integers.size() > 0) { + } else if (packet.integers.size() > 0) { packet.integers.write(0, mode.getMode()) } packet.strings.write(0, id) packet.getSpecificModifier(Collection::class.java).write(0, players.map { it.name }) return packet } + override fun getUpdateDisplayNamePackets(): List { return members.map { getUpdateDisplayNamePacket(it) } } @@ -83,15 +94,24 @@ class ComponentPacketTeam( packet.playerInfoActions.write(0, EnumSet.of(EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME)) val infoData = mutableListOf() val profile = WrappedGameProfile.fromPlayer(player) - infoData.add(PlayerInfoData(profile, player.ping, EnumWrappers.NativeGameMode.fromBukkit(player.gameMode), ComponentSerializerImpl.serializeToPacket(constructDisplayName(player)))) + infoData.add( + PlayerInfoData( + profile, + player.ping, + EnumWrappers.NativeGameMode.fromBukkit(player.gameMode), + ComponentSerializerImpl.serializeToPacket(constructDisplayName(player)) + ) + ) packet.playerInfoDataLists.write(1, infoData) return packet } private fun constructDisplayName(player: Player): Component { - if(!members.contains(player)) return Component.text(player.name) - val base = if(prefix != null) prefix!!.append(Component.text(player.name).color(color)) else Component.text(player.name) - if(suffix != null) base.append(suffix!!) + if (!members.contains(player)) return Component.text(player.name) + val base = if (prefix != null) prefix!!.append( + Component.text(player.name).color(color) + ) else Component.text(player.name) + if (suffix != null) base.append(suffix!!) return base } } \ No newline at end of file From 93c14106d427e845559a9a6255e439b6d0e73cd5 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Sat, 11 May 2024 14:51:26 +0200 Subject: [PATCH 13/21] feat: add audience support --- .../plugin/prefixes/api/PrefixesApi.kt | 49 +++++++++++++++++++ .../prefixes/api/impl/PrefixesApiImpl.kt | 49 +++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt index 6ee1eca..6c39aab 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt @@ -1,5 +1,6 @@ package app.simplecloud.plugin.prefixes.api +import net.kyori.adventure.audience.Audience import net.kyori.adventure.text.Component import java.util.* @@ -100,5 +101,53 @@ interface PrefixesApi { * @param message Message sent by the [target] */ fun formatChatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component + /** + * Sets the prefix and suffix of a player in both Tab and Chat + * @param uniqueId UUID of the target player + * @param group + * @param viewers A list of all viewers of this change (if empty, everyone is affected) + */ + fun setWholeName(uniqueId: UUID, group: PrefixesGroup, viewers: Audience) + + /** + * Sets the prefix and suffix of a player in both Tab and Chat + * @param uniqueId UUID of the target player + * @param groupName + * @param viewers An [Audience] of all viewers of this change (if empty, everyone is affected) + */ + fun setWholeName(uniqueId: UUID, groupName: String, viewers: Audience) + + /** + * Sets the prefix of a player in both Tab and Chat + * @param uniqueId UUID of the target player + * @param prefix prefix to set + * @param viewers A list of all viewers of this change (if empty, everyone is affected) + */ + fun setPrefix(uniqueId: UUID, prefix: Component, viewers: Audience) + + /** + * Sets the prefix of a player in both Tab and Chat + * @param uniqueId UUID of the target player + * @param suffix suffix to set + * @param viewers An [Audience] of all viewers of this change (if empty, everyone is affected) + */ + fun setSuffix(uniqueId: UUID, suffix: Component, viewers: Audience) + + /** + * Changes the Scoreboard Team color of the target player (Used in 1.12+ to make player names colorful) + * @param uniqueId UUID of the target player + * @param color Color string (ChatColor on spigot, hex colors on other server implementations) + * @param viewers An [Audience] of all viewers of this change (if empty, everyone is affected) + */ + fun setColor(uniqueId: UUID, color: String, viewers: Audience) + + /** + * Returns a formatted chat message of the target player that will be sent to the viewer + * @param target UUID of the target player + * @param viewer An [Audience] of the viewing player (if empty, only default prefix and suffix of the targets group will be shown) + * @param format the chat format the message should follow + * @param message Message sent by the [target] + */ + fun formatChatMessage(target: UUID, viewer: Audience, format: String, message: Component): Component } \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt index 03d36c6..af200af 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt @@ -4,6 +4,9 @@ import app.simplecloud.plugin.prefixes.api.PrefixesActor import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesConfig import app.simplecloud.plugin.prefixes.api.PrefixesGroup +import net.kyori.adventure.audience.Audience +import net.kyori.adventure.audience.Audiences +import net.kyori.adventure.identity.Identity import net.kyori.adventure.text.Component import java.util.* @@ -43,6 +46,39 @@ abstract class PrefixesApiImpl : PrefixesApi { this.actor = actor } + override fun setWholeName(uniqueId: UUID, group: PrefixesGroup, viewers: Audience) { + val uuids = toUUIDList(viewers) + setWholeName(uniqueId, group, *uuids.toTypedArray()) + } + + override fun setWholeName(uniqueId: UUID, groupName: String, viewers: Audience) { + setWholeName( + uniqueId, + groups.stream().filter { group -> group.getName() == groupName }.findFirst().orElse(null), + viewers + ) + } + + override fun formatChatMessage(target: UUID, viewer: Audience, format: String, message: Component): Component { + val uuid = toUUID(viewer) + return actor.formatMessage(target, uuid, format, message) + } + + override fun setPrefix(uniqueId: UUID, prefix: Component, viewers: Audience) { + val uuids = toUUIDList(viewers) + setPrefix(uniqueId, prefix, *uuids.toTypedArray()) + } + + override fun setSuffix(uniqueId: UUID, suffix: Component, viewers: Audience) { + val uuids = toUUIDList(viewers) + setSuffix(uniqueId, suffix, *uuids.toTypedArray()) + } + + override fun setColor(uniqueId: UUID, color: String, viewers: Audience) { + val uuids = toUUIDList(viewers) + setColor(uniqueId, color, *uuids.toTypedArray()) + } + override fun setWholeName(uniqueId: UUID, group: PrefixesGroup, vararg viewers: UUID) { actor.applyGroup(uniqueId, group, *viewers) } @@ -79,6 +115,19 @@ abstract class PrefixesApiImpl : PrefixesApi { return actor.formatMessage(target, viewer, format, message) } + private fun toUUIDList(audience: Audience): List { + val uuids = mutableListOf() + audience.forEachAudience forEachPlayer@ { + val uuid = it.get(Identity.UUID).orElse(null) ?: return@forEachPlayer + uuids.add(uuid) + } + return uuids + } + + private fun toUUID(audience: Audience): UUID? { + return audience.get(Identity.UUID).orElse(null) + } + abstract fun indexGroups() } \ No newline at end of file From 2c60ed359ddd658e0891a83c1e649f1b17fa5c3d Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Sat, 11 May 2024 14:53:25 +0200 Subject: [PATCH 14/21] fix: still display prefixes on broken minecraft clients --- .../prefixes/spigot/loader/SpigotPrefixesLoader.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt index 832d209..93b97da 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt @@ -15,6 +15,7 @@ import net.luckperms.api.LuckPerms import org.bukkit.Bukkit 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.plugin.Plugin import org.bukkit.plugin.RegisteredServiceProvider @@ -50,6 +51,16 @@ class SpigotPrefixesLoader( return api } + @EventHandler + fun onJoin(event: PlayerJoinEvent) { + Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, Runnable { + if(!api.hasViewer(event.player.uniqueId)) { + api.registerViewer(event.player.uniqueId) + val group = api.getHighestGroup(event.player.uniqueId) + api.setWholeName(event.player.uniqueId, group) + } + }, 15L) + } @EventHandler fun onQuit(event: PlayerQuitEvent) { From 440af844f15c6025cd6a883bba32e68642d753ba Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Mon, 13 May 2024 21:02:34 +0200 Subject: [PATCH 15/21] impl: live group updates, minor quality of life changes --- .../prefixes/spigot/LuckPermsListener.kt | 31 +++++++++++++++++++ .../spigot/PrefixesActorSpigotImpl.kt | 1 + .../spigot/PrefixesDisplaySpigotImpl.kt | 7 ++--- .../spigot/loader/SpigotPrefixesLoader.kt | 4 ++- 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt new file mode 100644 index 0000000..837b536 --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt @@ -0,0 +1,31 @@ +package app.simplecloud.plugin.prefixes.spigot + +import app.simplecloud.plugin.prefixes.api.PrefixesApi +import net.luckperms.api.LuckPerms +import net.luckperms.api.event.user.track.UserDemoteEvent +import net.luckperms.api.event.user.track.UserPromoteEvent +import org.bukkit.plugin.Plugin + +class LuckPermsListener( + private val plugin: Plugin, + private val luckPerms: LuckPerms, + private val api: PrefixesApi +) { + + fun init() { + val eventBus = luckPerms.eventBus + eventBus.subscribe(plugin, UserPromoteEvent::class.java, this::onUserPromote) + eventBus.subscribe(plugin, UserDemoteEvent::class.java, this::onUserDemote) + } + + private fun onUserPromote(event: UserPromoteEvent) { + val group = api.getHighestGroup(event.user.uniqueId) + api.setWholeName(event.user.uniqueId, group) + } + + private fun onUserDemote(event: UserDemoteEvent) { + val group = api.getHighestGroup(event.user.uniqueId) + api.setWholeName(event.user.uniqueId, group) + } + +} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index d61293d..6d88943 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -63,6 +63,7 @@ class PrefixesActorSpigotImpl( ) if (group.getColor() != null) setColor(target, group.getColor()!!, *viewers) + scoreboard.removePlayer(player, *viewers) scoreboard.addPlayer(player.name, player, *viewers) } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt index 14bd18e..371cb05 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt @@ -20,18 +20,17 @@ class PrefixesDisplaySpigotImpl( if (getTeam(id) != null) return null val name = "${toPriorityString(priority)}$id" val team = PacketTeam.create(name, null, null, null, mutableListOf()) - teams[name] = team + teams[id] = team return team } override fun getTeam(id: String): PacketTeam? { - return teams.getOrDefault(teams.keys.find { it.endsWith(id) }, null) + return teams.getOrDefault(id, null) } override fun updatePriority(id: String, priority: Int): PacketTeam? { - val newId = "${toPriorityString(priority)}$id" - if (teams.containsKey(newId)) return null val team = getTeam(id) ?: return null + val newId = "${toPriorityString(priority)}$id" val packets = team.getUpdateIdPackets(newId) viewers.forEach { viewer -> packets.forEach { packet -> diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt index 93b97da..3684c5f 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt @@ -7,6 +7,7 @@ import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser +import app.simplecloud.plugin.prefixes.spigot.LuckPermsListener import app.simplecloud.plugin.prefixes.spigot.PrefixesActorSpigotImpl import app.simplecloud.plugin.prefixes.spigot.PrefixesGlobalDisplaySpigotImpl import app.simplecloud.plugin.prefixes.spigot.packet.PlayerCreatePacketAdapter @@ -48,6 +49,7 @@ class SpigotPrefixesLoader( Bukkit.getServicesManager().register(PrefixesApi::class.java, api, plugin, ServicePriority.Normal) manager.addPacketListener(PlayerCreatePacketAdapter(plugin, api)) chatLoader.load(api) + LuckPermsListener(plugin, luckPerms, api).init() return api } @@ -59,7 +61,7 @@ class SpigotPrefixesLoader( val group = api.getHighestGroup(event.player.uniqueId) api.setWholeName(event.player.uniqueId, group) } - }, 15L) + }, 10L) } @EventHandler From b331556759a4c59b7f4b92c0170ecfc36cb9faaf Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Tue, 21 May 2024 14:54:19 +0200 Subject: [PATCH 16/21] impl: live group updates, configure events refactor: cleanup code --- .../plugin/prefixes/api/PrefixesActor.kt | 4 ++- .../plugin/prefixes/api/PrefixesApi.kt | 29 +++++++++++++--- .../plugin/prefixes/api/PrefixesGroup.kt | 7 ++-- .../api/impl/PrefixesActorBlankImpl.kt | 7 +++- .../prefixes/api/impl/PrefixesApiImpl.kt | 28 ++++++++++++++-- .../minestom/PrefixesActorMinestomImpl.kt | 33 ++++++++++++------- prefixes-paper/src/main/resources/plugin.yml | 2 ++ .../plugin/prefixes/shared/LuckPermsGroup.kt | 15 +++++---- .../prefixes/spigot/LuckPermsListener.kt | 18 ++++------ .../spigot/PrefixesActorSpigotImpl.kt | 23 ++++++++++--- .../spigot/loader/SpigotPrefixesLoader.kt | 17 ++++++++-- .../prefixes/spigot/packet/PacketTeam.kt | 2 +- .../packet/PlayerCreatePacketAdapter.kt | 5 ++- .../packet/v1_17_1/ComponentPacketTeam.kt | 2 +- prefixes-spigot/src/main/resources/plugin.yml | 2 ++ 15 files changed, 142 insertions(+), 52 deletions(-) diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt index 8434172..4b58d54 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesActor.kt @@ -1,6 +1,7 @@ package app.simplecloud.plugin.prefixes.api import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.TextColor import java.util.* interface PrefixesActor { @@ -10,7 +11,8 @@ interface PrefixesActor { fun applyGroup(target: UUID, group: PrefixesGroup, vararg viewers: UUID) fun setPrefix(target: UUID, prefix: Component, vararg viewers: UUID) fun setSuffix(target: UUID, suffix: Component, vararg viewers: UUID) - fun setColor(target: UUID, color: String, vararg viewers: UUID) + fun setColor(target: UUID, color: TextColor, vararg viewers: UUID) + fun apply(target: UUID, prefix: Component, color: TextColor, suffix: Component, priority: Int, vararg viewers: UUID) fun formatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component fun remove(target: UUID) } \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt index 6c39aab..75810bc 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesApi.kt @@ -2,6 +2,7 @@ package app.simplecloud.plugin.prefixes.api import net.kyori.adventure.audience.Audience import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.TextColor import java.util.* interface PrefixesApi { @@ -40,6 +41,17 @@ interface PrefixesApi { */ fun setWholeName(uniqueId: UUID, groupName: String, vararg viewers: UUID) + /** + * Sets the prefix and suffix of a player in both Tab and Chat + * @param uniqueId UUID of the target player + * @param prefix the targets prefix + * @param color the targets team color + * @param suffix the targets suffix + * @param priority the users Tablist priority + * @param viewers A list of all viewers of this change (if empty, everyone is affected) + */ + fun setWholeName(uniqueId: UUID, prefix: Component, color: TextColor, suffix: Component, priority: Int, vararg viewers: UUID) + /** * Sets the prefix of a player in both Tab and Chat * @param uniqueId UUID of the target player @@ -82,10 +94,10 @@ interface PrefixesApi { /** * Changes the Scoreboard Team color of the target player (Used in 1.12+ to make player names colorful) * @param uniqueId UUID of the target player - * @param color Color string (ChatColor on spigot, hex colors on other server implementations) + * @param color the [TextColor] of the target players team * @param viewers A list of all viewers of this change (if empty, everyone is affected) */ - fun setColor(uniqueId: UUID, color: String, vararg viewers: UUID) + fun setColor(uniqueId: UUID, color: TextColor, vararg viewers: UUID) /** * Sets the used PrefixesConfig @@ -117,6 +129,15 @@ interface PrefixesApi { */ fun setWholeName(uniqueId: UUID, groupName: String, viewers: Audience) + /** + * Sets the prefix and suffix of a player in both Tab and Chat + * @param uniqueId UUID of the target player + * @param prefix the targets prefix + * @param color the targets team color + * @param suffix the targets suffix + * @param viewers An [Audience] of all viewers of this change (if empty, everyone is affected) + */ + fun setWholeName(uniqueId: UUID, prefix: Component, color: TextColor, suffix: Component, priority: Int, viewers: Audience) /** * Sets the prefix of a player in both Tab and Chat * @param uniqueId UUID of the target player @@ -136,10 +157,10 @@ interface PrefixesApi { /** * Changes the Scoreboard Team color of the target player (Used in 1.12+ to make player names colorful) * @param uniqueId UUID of the target player - * @param color Color string (ChatColor on spigot, hex colors on other server implementations) + * @param color [TextColor] the color of the target players team * @param viewers An [Audience] of all viewers of this change (if empty, everyone is affected) */ - fun setColor(uniqueId: UUID, color: String, viewers: Audience) + fun setColor(uniqueId: UUID, color: TextColor, viewers: Audience) /** * Returns a formatted chat message of the target player that will be sent to the viewer diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGroup.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGroup.kt index ff3583a..533ff5a 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGroup.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGroup.kt @@ -1,14 +1,15 @@ package app.simplecloud.plugin.prefixes.api import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.TextColor import java.util.* import java.util.concurrent.CompletableFuture interface PrefixesGroup { fun getName(): String - fun getPrefix(): Component - fun getColor(): String? - fun getSuffix(): Component + fun getPrefix(): Component? + fun getColor(): TextColor? + fun getSuffix(): Component? fun getPriority(): Int fun containsPlayer(uniqueId: UUID): Boolean fun containsPlayerFuture(uniqueId: UUID): CompletableFuture diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt index 6bdb9ee..875cbaa 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesActorBlankImpl.kt @@ -4,6 +4,7 @@ import app.simplecloud.plugin.prefixes.api.PrefixesActor import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesGroup import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.TextColor import java.util.* class PrefixesActorBlankImpl : PrefixesActor { @@ -31,7 +32,11 @@ class PrefixesActorBlankImpl : PrefixesActor { throw NotImplementedError("You need to define a PrefixesActor to use this") } - override fun setColor(target: UUID, color: String, vararg viewers: UUID) { + override fun setColor(target: UUID, color: TextColor, vararg viewers: UUID) { + throw NotImplementedError("You need to define a PrefixesActor to use this") + } + + override fun apply(target: UUID, prefix: Component, color: TextColor, suffix: Component, priority: Int, vararg viewers: UUID) { throw NotImplementedError("You need to define a PrefixesActor to use this") } diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt index af200af..a948ede 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt @@ -5,9 +5,9 @@ import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesConfig import app.simplecloud.plugin.prefixes.api.PrefixesGroup import net.kyori.adventure.audience.Audience -import net.kyori.adventure.audience.Audiences import net.kyori.adventure.identity.Identity import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.TextColor import java.util.* abstract class PrefixesApiImpl : PrefixesApi { @@ -59,6 +59,17 @@ abstract class PrefixesApiImpl : PrefixesApi { ) } + override fun setWholeName( + uniqueId: UUID, + prefix: Component, + color: TextColor, + suffix: Component, + priority: Int, + viewers: Audience + ) { + setWholeName(uniqueId, prefix, color, suffix, priority, viewers) + } + override fun formatChatMessage(target: UUID, viewer: Audience, format: String, message: Component): Component { val uuid = toUUID(viewer) return actor.formatMessage(target, uuid, format, message) @@ -74,7 +85,7 @@ abstract class PrefixesApiImpl : PrefixesApi { setSuffix(uniqueId, suffix, *uuids.toTypedArray()) } - override fun setColor(uniqueId: UUID, color: String, viewers: Audience) { + override fun setColor(uniqueId: UUID, color: TextColor, viewers: Audience) { val uuids = toUUIDList(viewers) setColor(uniqueId, color, *uuids.toTypedArray()) } @@ -91,6 +102,17 @@ abstract class PrefixesApiImpl : PrefixesApi { ) } + override fun setWholeName( + uniqueId: UUID, + prefix: Component, + color: TextColor, + suffix: Component, + priority: Int, + vararg viewers: UUID + ) { + actor.apply(uniqueId, prefix, color, suffix, priority, *viewers) + } + override fun setPrefix(uniqueId: UUID, prefix: Component, vararg viewers: UUID) { actor.setPrefix(uniqueId, prefix, *viewers) } @@ -99,7 +121,7 @@ abstract class PrefixesApiImpl : PrefixesApi { actor.setSuffix(uniqueId, suffix, *viewers) } - override fun setColor(uniqueId: UUID, color: String, vararg viewers: UUID) { + override fun setColor(uniqueId: UUID, color: TextColor, vararg viewers: UUID) { actor.setColor(uniqueId, color, *viewers) } diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt index 69dedb8..11b6a46 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesActorMinestomImpl.kt @@ -34,15 +34,7 @@ class PrefixesActorMinestomImpl(private var scoreboard: PrefixesGlobalDisplayMin group: PrefixesGroup, vararg viewers: UUID, ) { - val player: Player = MinecraftServer.getConnectionManager().getPlayer(target) ?: return - scoreboard.update( - player.username, - group.getPrefix(), group.getSuffix(), group.getPriority(), - *viewers - ) - if (group.getColor() != null) - setColor(target, group.getColor()!!) - scoreboard.addPlayer(player.username, player) + apply(target, group.getPrefix() ?: Component.text(""), group.getColor() ?: NamedTextColor.WHITE, group.getSuffix() ?: Component.text(""), group.getPriority(), *viewers) } override fun remove(target: UUID) { @@ -89,8 +81,27 @@ class PrefixesActorMinestomImpl(private var scoreboard: PrefixesGlobalDisplayMin return MiniMessageImpl.parse(format, tags) } - override fun setColor(target: UUID, color: String, vararg viewers: UUID) { + override fun setColor(target: UUID, color: TextColor, vararg viewers: UUID) { + val player: Player = MinecraftServer.getConnectionManager().getPlayer(target) ?: return + scoreboard.updateColor(player.username, color, *viewers) + } + + override fun apply( + target: UUID, + prefix: Component, + color: TextColor, + suffix: Component, + priority: Int, + vararg viewers: UUID + ) { val player: Player = MinecraftServer.getConnectionManager().getPlayer(target) ?: return - scoreboard.updateColor(player.username, NamedTextColor.nearestTo(TextColor.fromHexString(color)!!), *viewers) + scoreboard.update( + player.username, + prefix, suffix, priority, + *viewers + ) + setColor(target, color, *viewers) + scoreboard.removePlayer(player, *viewers) + scoreboard.addPlayer(player.username, player, *viewers) } } \ No newline at end of file diff --git a/prefixes-paper/src/main/resources/plugin.yml b/prefixes-paper/src/main/resources/plugin.yml index 7cf942a..d453d65 100644 --- a/prefixes-paper/src/main/resources/plugin.yml +++ b/prefixes-paper/src/main/resources/plugin.yml @@ -1,5 +1,7 @@ name: Prefixes version: 1.1 main: app.simplecloud.plugin.prefixes.paper.PrefixesPlugin +depend: + - LuckPerms authors: - dayyeeet \ No newline at end of file diff --git a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/LuckPermsGroup.kt b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/LuckPermsGroup.kt index 6adfe6f..445a3cf 100644 --- a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/LuckPermsGroup.kt +++ b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/LuckPermsGroup.kt @@ -2,6 +2,7 @@ package app.simplecloud.plugin.prefixes.shared import app.simplecloud.plugin.prefixes.api.PrefixesGroup import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.TextColor import net.luckperms.api.LuckPerms import net.luckperms.api.model.group.Group import java.util.* @@ -10,19 +11,19 @@ import java.util.concurrent.CompletableFuture class LuckPermsGroup(private var group: Group, private var luckPerms: LuckPerms) : PrefixesGroup { override fun getName(): String { - return group.name; + return group.name } - override fun getPrefix(): Component { - return MiniMessageImpl.parse((group.cachedData.metaData.prefix ?: "")) + override fun getPrefix(): Component? { + return group.cachedData.metaData.prefix?.let { MiniMessageImpl.parse(it) } } - override fun getColor(): String? { - return group.cachedData.metaData.getMetaValue("color") + override fun getColor(): TextColor? { + return TextColor.fromHexString(group.cachedData.metaData.getMetaValue("color") ?: "#FFFFFF") } - override fun getSuffix(): Component { - return MiniMessageImpl.parse((group.cachedData.metaData.suffix ?: "")) + override fun getSuffix(): Component? { + return group.cachedData.metaData.suffix?.let { MiniMessageImpl.parse(it) } } override fun getPriority(): Int { diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt index 837b536..44e20c3 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt @@ -2,8 +2,7 @@ package app.simplecloud.plugin.prefixes.spigot import app.simplecloud.plugin.prefixes.api.PrefixesApi import net.luckperms.api.LuckPerms -import net.luckperms.api.event.user.track.UserDemoteEvent -import net.luckperms.api.event.user.track.UserPromoteEvent +import net.luckperms.api.event.user.UserDataRecalculateEvent import org.bukkit.plugin.Plugin class LuckPermsListener( @@ -14,18 +13,15 @@ class LuckPermsListener( fun init() { val eventBus = luckPerms.eventBus - eventBus.subscribe(plugin, UserPromoteEvent::class.java, this::onUserPromote) - eventBus.subscribe(plugin, UserDemoteEvent::class.java, this::onUserDemote) + eventBus.subscribe(plugin, UserDataRecalculateEvent::class.java, this::onUserUpdate) } - private fun onUserPromote(event: UserPromoteEvent) { - val group = api.getHighestGroup(event.user.uniqueId) - api.setWholeName(event.user.uniqueId, group) - } + private val groups: MutableMap = mutableMapOf() - private fun onUserDemote(event: UserDemoteEvent) { - val group = api.getHighestGroup(event.user.uniqueId) - api.setWholeName(event.user.uniqueId, group) + private fun onUserUpdate(event: UserDataRecalculateEvent) { + if(groups.getOrDefault(event.user.uniqueId.toString(), "") == event.user.primaryGroup) return + groups[event.user.uniqueId.toString()] = event.user.primaryGroup + api.setWholeName(event.user.uniqueId, event.user.primaryGroup) } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index 6d88943..96a4e9e 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -56,8 +56,8 @@ class PrefixesActorSpigotImpl( val player: Player = Bukkit.getPlayer(target) ?: return scoreboard.update( player.name, - group.getPrefix(), - group.getSuffix(), + group.getPrefix() ?: Component.text(""), + group.getSuffix() ?: Component.text(""), group.getPriority(), *viewers ) @@ -65,6 +65,7 @@ class PrefixesActorSpigotImpl( setColor(target, group.getColor()!!, *viewers) scoreboard.removePlayer(player, *viewers) scoreboard.addPlayer(player.name, player, *viewers) + apply(target, group.getPrefix() ?: Component.text(""), group.getColor() ?: NamedTextColor.WHITE, group.getSuffix() ?: Component.text(""), group.getPriority(), *viewers) } override fun remove(target: UUID) { @@ -105,8 +106,22 @@ class PrefixesActorSpigotImpl( return MiniMessageImpl.parse(format, tags) } - override fun setColor(target: UUID, color: String, vararg viewers: UUID) { + override fun setColor(target: UUID, color: TextColor, vararg viewers: UUID) { val player = Bukkit.getPlayer(target) ?: return - scoreboard.updateColor(player.name, TextColor.fromHexString(color) ?: NamedTextColor.GRAY, *viewers) + scoreboard.updateColor(player.name, color, *viewers) + } + + override fun apply(target: UUID, prefix: Component, color: TextColor, suffix: Component, priority: Int, vararg viewers: UUID) { + val player: Player = Bukkit.getPlayer(target) ?: return + scoreboard.update( + player.name, + prefix, + suffix, + priority, + *viewers + ) + setColor(target, color, *viewers) + scoreboard.removePlayer(player, *viewers) + scoreboard.addPlayer(player.name, player, *viewers) } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt index 3684c5f..8b7cf0a 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt @@ -10,10 +10,14 @@ import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser import app.simplecloud.plugin.prefixes.spigot.LuckPermsListener import app.simplecloud.plugin.prefixes.spigot.PrefixesActorSpigotImpl import app.simplecloud.plugin.prefixes.spigot.PrefixesGlobalDisplaySpigotImpl +import app.simplecloud.plugin.prefixes.spigot.event.PrefixesConfigureEvent import app.simplecloud.plugin.prefixes.spigot.packet.PlayerCreatePacketAdapter import com.comphenix.protocol.ProtocolManager +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor import net.luckperms.api.LuckPerms 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 @@ -58,8 +62,7 @@ class SpigotPrefixesLoader( Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, Runnable { if(!api.hasViewer(event.player.uniqueId)) { api.registerViewer(event.player.uniqueId) - val group = api.getHighestGroup(event.player.uniqueId) - api.setWholeName(event.player.uniqueId, group) + applyFirstName(api, event.player) } }, 10L) } @@ -68,4 +71,14 @@ class SpigotPrefixesLoader( fun onQuit(event: PlayerQuitEvent) { api.removeViewer(event.player.uniqueId) } + + companion object { + fun applyFirstName(api: PrefixesApi, player: Player) { + val group = api.getHighestGroup(player.uniqueId) + val prefixData = PrefixesConfigureEvent(player, group.getPrefix(), group.getSuffix(), group.getColor(), group.getPriority()) + Bukkit.getPluginManager().callEvent(prefixData) + api.setWholeName(player.uniqueId, prefixData.prefix ?: Component.text(""), prefixData.color ?: NamedTextColor.WHITE, prefixData.suffix ?: Component.text(""), prefixData.priority) + + } + } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt index e5372aa..be5df68 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -44,7 +44,7 @@ enum class UpdateTeamMode(private val mode: Int) { UPDATE(2); fun getMode(): Int { - return mode; + return mode } } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt index 3ba302a..ffe21ba 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt @@ -1,7 +1,7 @@ package app.simplecloud.plugin.prefixes.spigot.packet import app.simplecloud.plugin.prefixes.api.PrefixesApi -import app.simplecloud.plugin.prefixes.api.PrefixesGroup +import app.simplecloud.plugin.prefixes.spigot.loader.SpigotPrefixesLoader import com.comphenix.protocol.PacketType import com.comphenix.protocol.events.ListenerPriority import com.comphenix.protocol.events.PacketAdapter @@ -17,8 +17,7 @@ class PlayerCreatePacketAdapter(plugin: Plugin, private val api: PrefixesApi) : override fun onPacketReceiving(event: PacketEvent) { if (event.packetType == PacketType.Play.Client.CHAT_SESSION_UPDATE && !api.hasViewer(event.player.uniqueId)) { api.registerViewer(event.player.uniqueId) - val playerGroup: PrefixesGroup = api.getHighestGroup(event.player.uniqueId) - api.setWholeName(event.player.uniqueId, playerGroup) + SpigotPrefixesLoader.applyFirstName(api, event.player) } } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt index e85b5f5..9817362 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt @@ -86,7 +86,7 @@ class ComponentPacketTeam( } override fun getUpdateDisplayNamePackets(): List { - return members.map { getUpdateDisplayNamePacket(it) } + return members.toList().map { getUpdateDisplayNamePacket(it) } } override fun getUpdateDisplayNamePacket(player: Player): PacketContainer { diff --git a/prefixes-spigot/src/main/resources/plugin.yml b/prefixes-spigot/src/main/resources/plugin.yml index 68d4bcb..59052aa 100644 --- a/prefixes-spigot/src/main/resources/plugin.yml +++ b/prefixes-spigot/src/main/resources/plugin.yml @@ -1,5 +1,7 @@ name: Prefixes version: 1.1 main: app.simplecloud.plugin.prefixes.spigot.PrefixesPlugin +depend: + - LuckPerms authors: - dayyeeet \ No newline at end of file From 7e7e181d898f1d5b48b21224fa00ddb56c289314 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Tue, 21 May 2024 14:55:06 +0200 Subject: [PATCH 17/21] impl: configure events --- .../spigot/event/PrefixesConfigureEvent.kt | 26 +++++++++++++++++++ .../spigot/event/PrefixesConfiguredEvent.kt | 22 ++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt create mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt new file mode 100644 index 0000000..5227f07 --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt @@ -0,0 +1,26 @@ +package app.simplecloud.plugin.prefixes.spigot.event + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.TextColor +import org.bukkit.entity.Player +import org.bukkit.event.Event +import org.bukkit.event.HandlerList + +/** + * This event is called when a player is ready to receive his prefix. + * You can modify each property, which will result in differences on the first render in tab. + */ +data class PrefixesConfigureEvent( + val player: Player, + var prefix: Component?, + var suffix: Component?, + var color: TextColor?, + var priority: Int, +): Event() { + companion object { + private val handlers: HandlerList = HandlerList() + } + override fun getHandlers(): HandlerList { + return Companion.handlers + } +} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt new file mode 100644 index 0000000..8f97c35 --- /dev/null +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt @@ -0,0 +1,22 @@ +package app.simplecloud.plugin.prefixes.spigot.event + +import org.bukkit.entity.Player +import org.bukkit.event.Event +import org.bukkit.event.HandlerList + +/** + * This event is called when a player was successfully registered in the [app.simplecloud.plugin.prefixes.api.PrefixesActor]. + * If you want to create custom logic (e.g. a custom suffix visible to the friends of this player) + * you have to do it when listening on this event to make sure it works correctly. + */ +data class PrefixesConfiguredEvent( + val player: Player +): Event() { + + companion object { + private val handlers: HandlerList = HandlerList() + } + override fun getHandlers(): HandlerList { + return Companion.handlers + } +} \ No newline at end of file From 5ab769997abdc2e357ab6d1b785d2ee9f4cd4a42 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Tue, 21 May 2024 23:37:49 +0200 Subject: [PATCH 18/21] refactor: fix errors --- .../plugin/prefixes/api/impl/PrefixesApiImpl.kt | 3 ++- .../prefixes/spigot/PrefixesActorSpigotImpl.kt | 5 +++-- .../spigot/PrefixesDisplaySpigotImpl.kt | 1 + .../spigot/event/PrefixesConfigureEvent.kt | 4 ++++ .../spigot/event/PrefixesConfiguredEvent.kt | 4 ++++ .../spigot/loader/SpigotPrefixesLoader.kt | 17 +++++++++++------ .../plugin/prefixes/spigot/packet/PacketTeam.kt | 3 ++- .../spigot/packet/PlayerCreatePacketAdapter.kt | 6 +++--- .../packet/v1_17_1/ComponentPacketTeam.kt | 6 +++--- 9 files changed, 33 insertions(+), 16 deletions(-) diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt index a948ede..8e5c5df 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/impl/PrefixesApiImpl.kt @@ -67,7 +67,8 @@ abstract class PrefixesApiImpl : PrefixesApi { priority: Int, viewers: Audience ) { - setWholeName(uniqueId, prefix, color, suffix, priority, viewers) + val uuids = toUUIDList(viewers) + setWholeName(uniqueId, prefix, color, suffix, priority, *uuids.toTypedArray()) } override fun formatChatMessage(target: UUID, viewer: Audience, format: String, message: Component): Component { diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index 96a4e9e..f7b4b86 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -29,10 +29,11 @@ class PrefixesActorSpigotImpl( val display = PrefixesDisplaySpigotImpl(manager) scoreboard.register(target, display) display.setViewer(targetPlayer) + val defaultDisplay = scoreboard.getDefaultDisplay() ?: return Bukkit.getOnlinePlayers().forEach { player -> if (player.uniqueId != target) { - val group = api.getHighestGroup(player.uniqueId) - applyGroup(player.uniqueId, group, target) + val team = defaultDisplay.getTeam(player.name) ?: return@forEach + apply(player.uniqueId, team.prefix ?: Component.text(""), team.color ?: NamedTextColor.WHITE, team.suffix ?: Component.text(""), team.priority ?: 0, target) } } } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt index 371cb05..c393585 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt @@ -32,6 +32,7 @@ class PrefixesDisplaySpigotImpl( val team = getTeam(id) ?: return null val newId = "${toPriorityString(priority)}$id" val packets = team.getUpdateIdPackets(newId) + team.priority = priority viewers.forEach { viewer -> packets.forEach { packet -> manager.sendServerPacket(viewer, packet) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt index 5227f07..3685876 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt @@ -19,6 +19,10 @@ data class PrefixesConfigureEvent( ): Event() { companion object { private val handlers: HandlerList = HandlerList() + @JvmStatic + fun getHandlerList(): HandlerList { + return handlers + } } override fun getHandlers(): HandlerList { return Companion.handlers diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt index 8f97c35..996818f 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt @@ -15,6 +15,10 @@ data class PrefixesConfiguredEvent( companion object { private val handlers: HandlerList = HandlerList() + @JvmStatic + fun getHandlerList(): HandlerList { + return handlers + } } override fun getHandlers(): HandlerList { return Companion.handlers diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt index 8b7cf0a..5b2f631 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt @@ -10,10 +10,13 @@ import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser import app.simplecloud.plugin.prefixes.spigot.LuckPermsListener import app.simplecloud.plugin.prefixes.spigot.PrefixesActorSpigotImpl import app.simplecloud.plugin.prefixes.spigot.PrefixesGlobalDisplaySpigotImpl +import app.simplecloud.plugin.prefixes.spigot.PrefixesPlugin import app.simplecloud.plugin.prefixes.spigot.event.PrefixesConfigureEvent +import app.simplecloud.plugin.prefixes.spigot.event.PrefixesConfiguredEvent import app.simplecloud.plugin.prefixes.spigot.packet.PlayerCreatePacketAdapter import com.comphenix.protocol.ProtocolManager import net.kyori.adventure.text.Component +import net.kyori.adventure.text.TextComponent import net.kyori.adventure.text.format.NamedTextColor import net.luckperms.api.LuckPerms import org.bukkit.Bukkit @@ -62,7 +65,7 @@ class SpigotPrefixesLoader( Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, Runnable { if(!api.hasViewer(event.player.uniqueId)) { api.registerViewer(event.player.uniqueId) - applyFirstName(api, event.player) + applyFirstName(api, plugin, event.player) } }, 10L) } @@ -73,12 +76,14 @@ class SpigotPrefixesLoader( } companion object { - fun applyFirstName(api: PrefixesApi, player: Player) { + fun applyFirstName(api: PrefixesApi, plugin: Plugin, player: Player) { val group = api.getHighestGroup(player.uniqueId) - val prefixData = PrefixesConfigureEvent(player, group.getPrefix(), group.getSuffix(), group.getColor(), group.getPriority()) - Bukkit.getPluginManager().callEvent(prefixData) - api.setWholeName(player.uniqueId, prefixData.prefix ?: Component.text(""), prefixData.color ?: NamedTextColor.WHITE, prefixData.suffix ?: Component.text(""), prefixData.priority) - + Bukkit.getScheduler().runTask(plugin, Runnable { + val prefixData = PrefixesConfigureEvent(player, group.getPrefix(), group.getSuffix(), group.getColor(), group.getPriority()) + Bukkit.getPluginManager().callEvent(prefixData) + api.setWholeName(player.uniqueId, prefixData.prefix ?: Component.text(""), prefixData.color ?: NamedTextColor.WHITE, prefixData.suffix ?: Component.text(""), prefixData.priority) + Bukkit.getPluginManager().callEvent(PrefixesConfiguredEvent(player)) + }) } } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt index be5df68..70a6ac8 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -12,7 +12,8 @@ abstract class PacketTeam( open var color: TextColor?, open var prefix: Component?, open var suffix: Component?, - open var members: MutableList = mutableListOf() + open var members: MutableList = mutableListOf(), + open var priority: Int?, ) { abstract fun getUpdateIdPackets(id: String): List abstract fun getTeamUpdatePacket(mode: UpdateTeamMode): PacketContainer diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt index ffe21ba..e488d26 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt @@ -8,8 +8,8 @@ import com.comphenix.protocol.events.PacketAdapter import com.comphenix.protocol.events.PacketEvent import org.bukkit.plugin.Plugin -class PlayerCreatePacketAdapter(plugin: Plugin, private val api: PrefixesApi) : PacketAdapter( - plugin, +class PlayerCreatePacketAdapter(private val prefixesPlugin: Plugin, private val api: PrefixesApi) : PacketAdapter( + prefixesPlugin, ListenerPriority.NORMAL, PacketType.Play.Client.CHAT_SESSION_UPDATE ) { @@ -17,7 +17,7 @@ class PlayerCreatePacketAdapter(plugin: Plugin, private val api: PrefixesApi) : override fun onPacketReceiving(event: PacketEvent) { if (event.packetType == PacketType.Play.Client.CHAT_SESSION_UPDATE && !api.hasViewer(event.player.uniqueId)) { api.registerViewer(event.player.uniqueId) - SpigotPrefixesLoader.applyFirstName(api, event.player) + SpigotPrefixesLoader.applyFirstName(api, prefixesPlugin, event.player) } } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt index 9817362..5164af7 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt @@ -23,7 +23,7 @@ class ComponentPacketTeam( prefix: Component?, suffix: Component?, members: MutableList = mutableListOf() -) : PacketTeam(id, color, prefix, suffix, members) { +) : PacketTeam(id, color, prefix, suffix, members, 0) { override fun getUpdateIdPackets(id: String): List { val toReturn = mutableListOf() toReturn.add(getTeamDeletePacket()) @@ -108,10 +108,10 @@ class ComponentPacketTeam( private fun constructDisplayName(player: Player): Component { if (!members.contains(player)) return Component.text(player.name) - val base = if (prefix != null) prefix!!.append( + var base = if (prefix != null) prefix!!.append( Component.text(player.name).color(color) ) else Component.text(player.name) - if (suffix != null) base.append(suffix!!) + if (suffix != null) base = base.append(suffix!!) return base } } \ No newline at end of file From 29148799dacd56eec856763af68ad1dccb015be6 Mon Sep 17 00:00:00 2001 From: Dayeeet Date: Wed, 22 May 2024 03:19:42 +0200 Subject: [PATCH 19/21] refactor: fix errors and wrong suffix api implementation --- .../plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt | 2 +- .../plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt | 2 +- .../simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt | 3 ++- .../prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt index f7b4b86..1d1bf4f 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt @@ -81,7 +81,7 @@ class PrefixesActorSpigotImpl( override fun setSuffix(target: UUID, suffix: Component, vararg viewers: UUID) { val player = Bukkit.getPlayer(target) ?: return - scoreboard.updatePrefix(player.name, suffix, *viewers) + scoreboard.updateSuffix(player.name, suffix, *viewers) } override fun formatMessage(target: UUID, viewer: UUID?, format: String, message: Component): Component { diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt index c393585..ba2f6f6 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt @@ -19,7 +19,7 @@ class PrefixesDisplaySpigotImpl( override fun createTeam(id: String, priority: Int): PacketTeam? { if (getTeam(id) != null) return null val name = "${toPriorityString(priority)}$id" - val team = PacketTeam.create(name, null, null, null, mutableListOf()) + val team = PacketTeam.create(name, null, null, null, priority, mutableListOf()) teams[id] = team return team } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt index 70a6ac8..5842ec1 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt @@ -29,10 +29,11 @@ abstract class PacketTeam( color: TextColor?, prefix: Component?, suffix: Component?, + priority: Int, members: MutableList ): PacketTeam { if (MinecraftVersion.CAVES_CLIFFS_1.atOrAbove()) { - return ComponentPacketTeam(id, color, prefix, suffix, members) + return ComponentPacketTeam(id, color, prefix, suffix, priority, members) } //TODO: add support for older minecraft versions throw NullPointerException("No packet wrapper for your server version was found. Please visit https://github.com/thesimplecloud/prefixes-plugin for more information.") diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt index 5164af7..d0b92cd 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt +++ b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt @@ -22,8 +22,9 @@ class ComponentPacketTeam( color: TextColor?, prefix: Component?, suffix: Component?, + priority: Int, members: MutableList = mutableListOf() -) : PacketTeam(id, color, prefix, suffix, members, 0) { +) : PacketTeam(id, color, prefix, suffix, members, priority) { override fun getUpdateIdPackets(id: String): List { val toReturn = mutableListOf() toReturn.add(getTeamDeletePacket()) From dc9a51937bcffcb74e409f37a03d0076f7416cf3 Mon Sep 17 00:00:00 2001 From: dayeeet Date: Fri, 10 Jan 2025 15:36:23 +0100 Subject: [PATCH 20/21] feat: drop spigot support, implement custom names --- build.gradle.kts | 8 +++- .../prefixes/api/PrefixesGlobalDisplay.kt | 2 +- prefixes-paper/build.gradle.kts | 2 +- .../prefixes/paper/PaperPrefixesActor.kt | 41 ++++++++++++++----- .../prefixes/paper/PaperPrefixesDisplay.kt | 14 +++---- .../paper/PaperPrefixesGlobalDisplay.kt | 24 +++++++++++ .../prefixes/paper/PaperPrefixesLoader.kt | 38 ++++++++++------- .../plugin/prefixes/paper/PrefixesPlugin.kt | 3 +- .../paper}/event/PrefixesConfigureEvent.kt | 2 +- .../paper}/event/PrefixesConfiguredEvent.kt | 2 +- .../paper/listener}/LuckPermsListener.kt | 2 +- .../prefixes/paper}/packet/PacketTeam.kt | 10 ++++- .../packet/PlayerCreatePacketAdapter.kt | 6 +-- .../packet/v1_17_1/ComponentPacketTeam.kt | 10 ++--- prefixes-spigot/build.gradle.kts | 6 --- .../spigot/PrefixesGlobalDisplaySpigotImpl.kt | 9 ---- .../plugin/prefixes/spigot/PrefixesPlugin.kt | 17 -------- .../spigot/loader/SpigotPrefixesChatLoader.kt | 35 ---------------- .../src/main/resources/config.json | 3 -- prefixes-spigot/src/main/resources/plugin.yml | 7 ---- settings.gradle.kts | 2 +- 21 files changed, 114 insertions(+), 129 deletions(-) rename prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt => prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesActor.kt (80%) rename prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt => prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesDisplay.kt (94%) create mode 100644 prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesGlobalDisplay.kt rename prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt => prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesLoader.kt (70%) rename {prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot => prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper}/event/PrefixesConfigureEvent.kt (93%) rename {prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot => prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper}/event/PrefixesConfiguredEvent.kt (93%) rename {prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot => prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/listener}/LuckPermsListener.kt (94%) rename {prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot => prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper}/packet/PacketTeam.kt (82%) rename {prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot => prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper}/packet/PlayerCreatePacketAdapter.kt (77%) rename {prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot => prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper}/packet/v1_17_1/ComponentPacketTeam.kt (92%) delete mode 100644 prefixes-spigot/build.gradle.kts delete mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt delete mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt delete mode 100644 prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt delete mode 100644 prefixes-spigot/src/main/resources/config.json delete mode 100644 prefixes-spigot/src/main/resources/plugin.yml diff --git a/build.gradle.kts b/build.gradle.kts index d53ffda..d263043 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,8 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - kotlin("jvm") version "1.8.0" + kotlin("jvm") version "2.0.20" id("com.github.johnrengelman.shadow") version "8.1.1" java } @@ -32,6 +33,7 @@ allprojects { dependencies { compileOnly("net.luckperms:api:5.4") + compileOnly("space.chunks.custom-names:custom-names-api:1.0.6") implementation("net.kyori:adventure-api:4.14.0") implementation("com.google.code.gson:gson:2.10.1") implementation("net.kyori:adventure-text-minimessage:4.14.0") @@ -44,7 +46,9 @@ subprojects { } tasks.withType { - kotlinOptions.jvmTarget = "17" + compilerOptions { + jvmTarget = JvmTarget.JVM_17 + } } tasks.named("shadowJar", ShadowJar::class) { diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt index 7b35923..d2eb974 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt @@ -69,7 +69,7 @@ open class PrefixesGlobalDisplay { } } - fun addPlayer(id: String, player: P, vararg players: UUID) { + open fun addPlayer(id: String, player: P, vararg players: UUID) { executeFor(players.toList()) { it.addPlayer(id, player) } diff --git a/prefixes-paper/build.gradle.kts b/prefixes-paper/build.gradle.kts index 661b1c7..eb6b95e 100644 --- a/prefixes-paper/build.gradle.kts +++ b/prefixes-paper/build.gradle.kts @@ -1,5 +1,5 @@ dependencies { - api(project(":prefixes-spigot")) + api(project(":prefixes-shared")) compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesActor.kt similarity index 80% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt rename to prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesActor.kt index 1d1bf4f..6307d2d 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesActorSpigotImpl.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesActor.kt @@ -1,10 +1,10 @@ -package app.simplecloud.plugin.prefixes.spigot +package app.simplecloud.plugin.prefixes.paper import app.simplecloud.plugin.prefixes.api.PrefixesActor import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesGroup import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl -import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam +import app.simplecloud.plugin.prefixes.paper.packet.PacketTeam import com.comphenix.protocol.ProtocolManager import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor @@ -15,25 +15,32 @@ import org.bukkit.Bukkit import org.bukkit.entity.Player import java.util.* -class PrefixesActorSpigotImpl( - private var manager: ProtocolManager, - private var scoreboard: PrefixesGlobalDisplaySpigotImpl +class PaperPrefixesActor( + private var scoreboard: PaperPrefixesGlobalDisplay, + private val manager: ProtocolManager, ) : PrefixesActor { init { - scoreboard.setDefaultDisplay(PrefixesDisplaySpigotImpl(manager)) + scoreboard.setDefaultDisplay(PaperPrefixesDisplay(manager)) } override fun registerViewer(target: UUID, api: PrefixesApi) { val targetPlayer = Bukkit.getPlayer(target) ?: return - val display = PrefixesDisplaySpigotImpl(manager) + val display = PaperPrefixesDisplay(manager) scoreboard.register(target, display) display.setViewer(targetPlayer) val defaultDisplay = scoreboard.getDefaultDisplay() ?: return Bukkit.getOnlinePlayers().forEach { player -> if (player.uniqueId != target) { val team = defaultDisplay.getTeam(player.name) ?: return@forEach - apply(player.uniqueId, team.prefix ?: Component.text(""), team.color ?: NamedTextColor.WHITE, team.suffix ?: Component.text(""), team.priority ?: 0, target) + apply( + player.uniqueId, + team.prefix ?: Component.text(""), + team.color ?: NamedTextColor.WHITE, + team.suffix ?: Component.text(""), + team.priority ?: 0, + target + ) } } } @@ -66,7 +73,14 @@ class PrefixesActorSpigotImpl( setColor(target, group.getColor()!!, *viewers) scoreboard.removePlayer(player, *viewers) scoreboard.addPlayer(player.name, player, *viewers) - apply(target, group.getPrefix() ?: Component.text(""), group.getColor() ?: NamedTextColor.WHITE, group.getSuffix() ?: Component.text(""), group.getPriority(), *viewers) + apply( + target, + group.getPrefix() ?: Component.text(""), + group.getColor() ?: NamedTextColor.WHITE, + group.getSuffix() ?: Component.text(""), + group.getPriority(), + *viewers + ) } override fun remove(target: UUID) { @@ -112,7 +126,14 @@ class PrefixesActorSpigotImpl( scoreboard.updateColor(player.name, color, *viewers) } - override fun apply(target: UUID, prefix: Component, color: TextColor, suffix: Component, priority: Int, vararg viewers: UUID) { + override fun apply( + target: UUID, + prefix: Component, + color: TextColor, + suffix: Component, + priority: Int, + vararg viewers: UUID + ) { val player: Player = Bukkit.getPlayer(target) ?: return scoreboard.update( player.name, diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesDisplay.kt similarity index 94% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt rename to prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesDisplay.kt index ba2f6f6..9764b4d 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesDisplaySpigotImpl.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesDisplay.kt @@ -1,16 +1,16 @@ -package app.simplecloud.plugin.prefixes.spigot +package app.simplecloud.plugin.prefixes.paper import app.simplecloud.plugin.prefixes.api.PrefixesDisplay -import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam -import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamMode -import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamPlayersMode +import app.simplecloud.plugin.prefixes.paper.packet.PacketTeam +import app.simplecloud.plugin.prefixes.paper.packet.UpdateTeamMode +import app.simplecloud.plugin.prefixes.paper.packet.UpdateTeamPlayersMode import com.comphenix.protocol.ProtocolManager import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.TextColor import org.bukkit.entity.Player -class PrefixesDisplaySpigotImpl( - private val manager: ProtocolManager +class PaperPrefixesDisplay( + private val manager: ProtocolManager, ) : PrefixesDisplay { private val teams: MutableMap = mutableMapOf() @@ -105,7 +105,6 @@ class PrefixesDisplaySpigotImpl( manager.sendServerPacket(viewer, packet) manager.sendServerPacket(viewer, displayPacket) } - } } @@ -149,5 +148,4 @@ class PrefixesDisplaySpigotImpl( } } } - } \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesGlobalDisplay.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesGlobalDisplay.kt new file mode 100644 index 0000000..5e1722f --- /dev/null +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesGlobalDisplay.kt @@ -0,0 +1,24 @@ +package app.simplecloud.plugin.prefixes.paper + +import app.simplecloud.plugin.prefixes.api.PrefixesGlobalDisplay +import app.simplecloud.plugin.prefixes.paper.packet.PacketTeam +import net.kyori.adventure.text.Component +import org.bukkit.entity.Player +import space.chunks.customname.api.CustomNameManager +import java.util.* + +class PaperPrefixesGlobalDisplay( + private val name: CustomNameManager +) : PrefixesGlobalDisplay() { + + override fun addPlayer(id: String, player: Player, vararg players: UUID) { + super.addPlayer(id, player, *players) + name.forEntity(player).setName { viewer -> + val defaultDisplay = getDefaultDisplay() ?: return@setName Component.text(player.name) + val display = getDisplay(viewer.uniqueId).orElse(null) ?: defaultDisplay + val team = display.getTeam(player.name) ?: defaultDisplay.getTeam(player.name) + ?: return@setName Component.text(player.name) + return@setName team.asComponent(player) + } + } +} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesLoader.kt similarity index 70% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt rename to prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesLoader.kt index 5b2f631..1267ff0 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesLoader.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesLoader.kt @@ -1,22 +1,18 @@ -package app.simplecloud.plugin.prefixes.spigot.loader +package app.simplecloud.plugin.prefixes.paper import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesChatLoader import app.simplecloud.plugin.prefixes.api.PrefixesPluginLoader import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl +import app.simplecloud.plugin.prefixes.paper.event.PrefixesConfigureEvent +import app.simplecloud.plugin.prefixes.paper.event.PrefixesConfiguredEvent +import app.simplecloud.plugin.prefixes.paper.listener.LuckPermsListener +import app.simplecloud.plugin.prefixes.paper.packet.PlayerCreatePacketAdapter import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser -import app.simplecloud.plugin.prefixes.spigot.LuckPermsListener -import app.simplecloud.plugin.prefixes.spigot.PrefixesActorSpigotImpl -import app.simplecloud.plugin.prefixes.spigot.PrefixesGlobalDisplaySpigotImpl -import app.simplecloud.plugin.prefixes.spigot.PrefixesPlugin -import app.simplecloud.plugin.prefixes.spigot.event.PrefixesConfigureEvent -import app.simplecloud.plugin.prefixes.spigot.event.PrefixesConfiguredEvent -import app.simplecloud.plugin.prefixes.spigot.packet.PlayerCreatePacketAdapter import com.comphenix.protocol.ProtocolManager import net.kyori.adventure.text.Component -import net.kyori.adventure.text.TextComponent import net.kyori.adventure.text.format.NamedTextColor import net.luckperms.api.LuckPerms import org.bukkit.Bukkit @@ -28,9 +24,10 @@ import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.plugin.Plugin import org.bukkit.plugin.RegisteredServiceProvider import org.bukkit.plugin.ServicePriority +import space.chunks.customname.api.CustomNameManager import java.io.File -class SpigotPrefixesLoader( +class PaperPrefixesLoader( private val manager: ProtocolManager, private val plugin: Plugin, private val chatLoader: PrefixesChatLoader @@ -38,9 +35,10 @@ class SpigotPrefixesLoader( private lateinit var api: PrefixesApiImpl override fun load(): PrefixesApiImpl? { - val prefixesApiActor = PrefixesActorSpigotImpl(manager, PrefixesGlobalDisplaySpigotImpl()) + val customNameManager = Bukkit.getServicesManager().load(CustomNameManager::class.java) ?: return null val luckPermsProvider: RegisteredServiceProvider = Bukkit.getServicesManager().getRegistration(LuckPerms::class.java) ?: return null + val prefixesApiActor = PaperPrefixesActor(PaperPrefixesGlobalDisplay(customNameManager), manager) val luckPerms: LuckPerms = luckPermsProvider.provider api = PrefixesApiLuckPermsImpl(luckPerms) api.setActor(prefixesApiActor) @@ -63,7 +61,7 @@ class SpigotPrefixesLoader( @EventHandler fun onJoin(event: PlayerJoinEvent) { Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, Runnable { - if(!api.hasViewer(event.player.uniqueId)) { + if (!api.hasViewer(event.player.uniqueId)) { api.registerViewer(event.player.uniqueId) applyFirstName(api, plugin, event.player) } @@ -79,9 +77,21 @@ class SpigotPrefixesLoader( fun applyFirstName(api: PrefixesApi, plugin: Plugin, player: Player) { val group = api.getHighestGroup(player.uniqueId) Bukkit.getScheduler().runTask(plugin, Runnable { - val prefixData = PrefixesConfigureEvent(player, group.getPrefix(), group.getSuffix(), group.getColor(), group.getPriority()) + val prefixData = PrefixesConfigureEvent( + player, + group.getPrefix(), + group.getSuffix(), + group.getColor(), + group.getPriority() + ) Bukkit.getPluginManager().callEvent(prefixData) - api.setWholeName(player.uniqueId, prefixData.prefix ?: Component.text(""), prefixData.color ?: NamedTextColor.WHITE, prefixData.suffix ?: Component.text(""), prefixData.priority) + api.setWholeName( + player.uniqueId, + prefixData.prefix ?: Component.text(""), + prefixData.color ?: NamedTextColor.WHITE, + prefixData.suffix ?: Component.text(""), + prefixData.priority + ) Bukkit.getPluginManager().callEvent(PrefixesConfiguredEvent(player)) }) } diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt index 5af9563..2a4de17 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt @@ -1,13 +1,12 @@ package app.simplecloud.plugin.prefixes.paper -import app.simplecloud.plugin.prefixes.spigot.loader.SpigotPrefixesLoader import com.comphenix.protocol.ProtocolLibrary import org.bukkit.event.Listener import org.bukkit.plugin.java.JavaPlugin class PrefixesPlugin : JavaPlugin(), Listener { override fun onEnable() { - val loader = SpigotPrefixesLoader(ProtocolLibrary.getProtocolManager(), this, PaperPrefixesChatLoader(this)) + val loader = PaperPrefixesLoader(ProtocolLibrary.getProtocolManager(), this, PaperPrefixesChatLoader(this)) if (loader.load() == null) { throw NullPointerException("The Prefixes Plugin could not load correctly") } diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/event/PrefixesConfigureEvent.kt similarity index 93% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt rename to prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/event/PrefixesConfigureEvent.kt index 3685876..1a3e481 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfigureEvent.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/event/PrefixesConfigureEvent.kt @@ -1,4 +1,4 @@ -package app.simplecloud.plugin.prefixes.spigot.event +package app.simplecloud.plugin.prefixes.paper.event import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.TextColor diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/event/PrefixesConfiguredEvent.kt similarity index 93% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt rename to prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/event/PrefixesConfiguredEvent.kt index 996818f..1bc5260 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/event/PrefixesConfiguredEvent.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/event/PrefixesConfiguredEvent.kt @@ -1,4 +1,4 @@ -package app.simplecloud.plugin.prefixes.spigot.event +package app.simplecloud.plugin.prefixes.paper.event import org.bukkit.entity.Player import org.bukkit.event.Event diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/listener/LuckPermsListener.kt similarity index 94% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt rename to prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/listener/LuckPermsListener.kt index 44e20c3..02628a1 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/LuckPermsListener.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/listener/LuckPermsListener.kt @@ -1,4 +1,4 @@ -package app.simplecloud.plugin.prefixes.spigot +package app.simplecloud.plugin.prefixes.paper.listener import app.simplecloud.plugin.prefixes.api.PrefixesApi import net.luckperms.api.LuckPerms diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PacketTeam.kt similarity index 82% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt rename to prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PacketTeam.kt index 5842ec1..7a97f29 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PacketTeam.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PacketTeam.kt @@ -1,9 +1,10 @@ -package app.simplecloud.plugin.prefixes.spigot.packet +package app.simplecloud.plugin.prefixes.paper.packet -import app.simplecloud.plugin.prefixes.spigot.packet.v1_17_1.ComponentPacketTeam +import app.simplecloud.plugin.prefixes.paper.packet.v1_17_1.ComponentPacketTeam import com.comphenix.protocol.events.PacketContainer import com.comphenix.protocol.utility.MinecraftVersion import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.format.TextColor import org.bukkit.entity.Player @@ -23,6 +24,11 @@ abstract class PacketTeam( abstract fun getUpdateDisplayNamePackets(): List abstract fun getUpdateDisplayNamePacket(player: Player): PacketContainer + fun asComponent(player: Player): Component { + return (prefix ?: Component.text("")).append(Component.text(player.name).color(color ?: NamedTextColor.WHITE)) + .append(suffix ?: Component.text("")) + } + companion object { fun create( id: String, diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PlayerCreatePacketAdapter.kt similarity index 77% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt rename to prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PlayerCreatePacketAdapter.kt index e488d26..db87818 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/PlayerCreatePacketAdapter.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PlayerCreatePacketAdapter.kt @@ -1,7 +1,7 @@ -package app.simplecloud.plugin.prefixes.spigot.packet +package app.simplecloud.plugin.prefixes.paper.packet import app.simplecloud.plugin.prefixes.api.PrefixesApi -import app.simplecloud.plugin.prefixes.spigot.loader.SpigotPrefixesLoader +import app.simplecloud.plugin.prefixes.paper.PaperPrefixesLoader import com.comphenix.protocol.PacketType import com.comphenix.protocol.events.ListenerPriority import com.comphenix.protocol.events.PacketAdapter @@ -17,7 +17,7 @@ class PlayerCreatePacketAdapter(private val prefixesPlugin: Plugin, private val override fun onPacketReceiving(event: PacketEvent) { if (event.packetType == PacketType.Play.Client.CHAT_SESSION_UPDATE && !api.hasViewer(event.player.uniqueId)) { api.registerViewer(event.player.uniqueId) - SpigotPrefixesLoader.applyFirstName(api, prefixesPlugin, event.player) + PaperPrefixesLoader.applyFirstName(api, prefixesPlugin, event.player) } } } \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/v1_17_1/ComponentPacketTeam.kt similarity index 92% rename from prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt rename to prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/v1_17_1/ComponentPacketTeam.kt index d0b92cd..4c7abaf 100644 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/packet/v1_17_1/ComponentPacketTeam.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/v1_17_1/ComponentPacketTeam.kt @@ -1,9 +1,9 @@ -package app.simplecloud.plugin.prefixes.spigot.packet.v1_17_1 +package app.simplecloud.plugin.prefixes.paper.packet.v1_17_1 import app.simplecloud.plugin.prefixes.shared.ComponentSerializerImpl -import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam -import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamMode -import app.simplecloud.plugin.prefixes.spigot.packet.UpdateTeamPlayersMode +import app.simplecloud.plugin.prefixes.paper.packet.PacketTeam +import app.simplecloud.plugin.prefixes.paper.packet.UpdateTeamMode +import app.simplecloud.plugin.prefixes.paper.packet.UpdateTeamPlayersMode import com.comphenix.protocol.PacketType import com.comphenix.protocol.events.PacketContainer import com.comphenix.protocol.utility.MinecraftReflection @@ -48,7 +48,7 @@ class ComponentPacketTeam( .write( 0, if (color != null) ChatColor.valueOf( - NamedTextColor.nearestTo(color!!).toString().uppercase() + NamedTextColor.nearestTo(color ?: NamedTextColor.WHITE).toString().uppercase() ) else ChatColor.GRAY ) packet.optionalStructures.write(0, Optional.of(optional)) diff --git a/prefixes-spigot/build.gradle.kts b/prefixes-spigot/build.gradle.kts deleted file mode 100644 index a733646..0000000 --- a/prefixes-spigot/build.gradle.kts +++ /dev/null @@ -1,6 +0,0 @@ -dependencies { - api(project(":prefixes-shared")) - compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT") - compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") - compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt deleted file mode 100644 index 939d709..0000000 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesGlobalDisplaySpigotImpl.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.simplecloud.plugin.prefixes.spigot - -import app.simplecloud.plugin.prefixes.api.PrefixesGlobalDisplay -import app.simplecloud.plugin.prefixes.spigot.packet.PacketTeam -import net.kyori.adventure.text.Component -import org.bukkit.entity.Player - -class PrefixesGlobalDisplaySpigotImpl : PrefixesGlobalDisplay() { -} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt deleted file mode 100644 index 42437d5..0000000 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/PrefixesPlugin.kt +++ /dev/null @@ -1,17 +0,0 @@ -package app.simplecloud.plugin.prefixes.spigot - -import app.simplecloud.plugin.prefixes.spigot.loader.SpigotPrefixesChatLoader -import app.simplecloud.plugin.prefixes.spigot.loader.SpigotPrefixesLoader -import com.comphenix.protocol.ProtocolLibrary -import org.bukkit.event.Listener -import org.bukkit.plugin.java.JavaPlugin - -class PrefixesPlugin : JavaPlugin(), Listener { - - override fun onEnable() { - val loader = SpigotPrefixesLoader(ProtocolLibrary.getProtocolManager(), this, SpigotPrefixesChatLoader(this)) - if (loader.load() == null) { - throw NullPointerException("The Prefixes Plugin could not load correctly") - } - } -} \ No newline at end of file diff --git a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt b/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt deleted file mode 100644 index 671c217..0000000 --- a/prefixes-spigot/src/main/java/app/simplecloud/plugin/prefixes/spigot/loader/SpigotPrefixesChatLoader.kt +++ /dev/null @@ -1,35 +0,0 @@ -package app.simplecloud.plugin.prefixes.spigot.loader - -import app.simplecloud.plugin.prefixes.api.PrefixesChatLoader -import app.simplecloud.plugin.prefixes.api.impl.PrefixesApiImpl -import app.simplecloud.plugin.prefixes.shared.ComponentSerializerImpl -import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl -import org.bukkit.Bukkit -import org.bukkit.event.EventHandler -import org.bukkit.event.EventPriority -import org.bukkit.event.Listener -import org.bukkit.event.player.AsyncPlayerChatEvent -import org.bukkit.plugin.Plugin - -class SpigotPrefixesChatLoader( - private val plugin: Plugin -) : Listener, PrefixesChatLoader { - - private lateinit var api: PrefixesApiImpl - override fun load(api: PrefixesApiImpl) { - this.api = api - Bukkit.getPluginManager().registerEvents(this, plugin) - } - - @EventHandler(priority = EventPriority.LOWEST) - fun onChat(event: AsyncPlayerChatEvent) { - event.format = ComponentSerializerImpl.serializeLegacy( - api.formatChatMessage( - event.player.uniqueId, - event.player.uniqueId, - api.getConfig().getChatFormat(), - MiniMessageImpl.parse(event.message) - ) - ) - } -} \ No newline at end of file diff --git a/prefixes-spigot/src/main/resources/config.json b/prefixes-spigot/src/main/resources/config.json deleted file mode 100644 index efe10ef..0000000 --- a/prefixes-spigot/src/main/resources/config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "chatFormat": ": " -} \ No newline at end of file diff --git a/prefixes-spigot/src/main/resources/plugin.yml b/prefixes-spigot/src/main/resources/plugin.yml deleted file mode 100644 index 59052aa..0000000 --- a/prefixes-spigot/src/main/resources/plugin.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: Prefixes -version: 1.1 -main: app.simplecloud.plugin.prefixes.spigot.PrefixesPlugin -depend: - - LuckPerms -authors: - - dayyeeet \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 86e5ade..223fd49 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,6 +9,6 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" } -include("prefixes-api", "prefixes-minestom", "prefixes-paper", "prefixes-shared", "prefixes-spigot") +include("prefixes-api", "prefixes-minestom", "prefixes-paper", "prefixes-shared") rootProject.name = "Prefixes-Plugin" \ No newline at end of file From af72cdd1f0e91bbd32ec8a8b1415c827c832437b Mon Sep 17 00:00:00 2001 From: David Date: Wed, 26 Feb 2025 13:52:06 +0100 Subject: [PATCH 21/21] feat: complete switch to paperweight --- build.gradle.kts | 44 ++-- gradle/libs.versions.toml | 15 ++ gradle/wrapper/gradle-wrapper.properties | 2 +- .../plugin/prefixes/api/PrefixesDisplay.kt | 4 +- .../prefixes/api/PrefixesGlobalDisplay.kt | 4 +- .../prefixes/minestom/PrefixesTablist.kt | 9 +- prefixes-paper/build.gradle.kts | 12 +- .../plugin/prefixes/paper/PaperPlayerTeam.kt | 41 ++++ .../prefixes/paper/PaperPrefixesActor.kt | 31 ++- .../prefixes/paper/PaperPrefixesDisplay.kt | 217 +++++++++++++----- .../paper/PaperPrefixesGlobalDisplay.kt | 13 +- .../prefixes/paper/PaperPrefixesLoader.kt | 11 +- .../plugin/prefixes/paper/PrefixesPlugin.kt | 3 +- .../prefixes/paper/packet/PacketTeam.kt | 66 ------ .../paper/packet/PlayerCreatePacketAdapter.kt | 23 -- .../packet/v1_17_1/ComponentPacketTeam.kt | 118 ---------- .../src/main/resources/paper-plugin.yml | 15 ++ prefixes-paper/src/main/resources/plugin.yml | 7 - prefixes-shared/build.gradle.kts | 1 - .../shared/ComponentSerializerImpl.kt | 5 - settings.gradle.kts | 3 +- 21 files changed, 303 insertions(+), 341 deletions(-) create mode 100644 gradle/libs.versions.toml create mode 100644 prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPlayerTeam.kt delete mode 100644 prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PacketTeam.kt delete mode 100644 prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PlayerCreatePacketAdapter.kt delete mode 100644 prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/v1_17_1/ComponentPacketTeam.kt create mode 100644 prefixes-paper/src/main/resources/paper-plugin.yml delete mode 100644 prefixes-paper/src/main/resources/plugin.yml diff --git a/build.gradle.kts b/build.gradle.kts index d263043..1eb412c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,22 +1,15 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion plugins { - kotlin("jvm") version "2.0.20" - id("com.github.johnrengelman.shadow") version "8.1.1" - java + alias(libs.plugins.kotlin) + alias(libs.plugins.shadow) } allprojects { group = "app.simplecloud.plugin" version = "1.1-SNAPSHOT" - apply { - plugin("java") - plugin("org.jetbrains.kotlin.jvm") - plugin("com.github.johnrengelman.shadow") - } - repositories { mavenCentral() maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") @@ -26,32 +19,45 @@ allprojects { maven("https://jitpack.io") maven("https://repo.dmulloy2.net/repository/public/") } +} - kotlin { - jvmToolchain(17) +subprojects { + + apply { + plugin("org.jetbrains.kotlin.jvm") + plugin("com.gradleup.shadow") } dependencies { + compileOnly(rootProject.libs.kotlin.jvm) + compileOnly(rootProject.libs.kotlin.test) + compileOnly("net.luckperms:api:5.4") compileOnly("space.chunks.custom-names:custom-names-api:1.0.6") implementation("net.kyori:adventure-api:4.14.0") implementation("com.google.code.gson:gson:2.10.1") implementation("net.kyori:adventure-text-minimessage:4.14.0") } -} -subprojects { - dependencies { - implementation(kotlin("stdlib")) + java { + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) + } + + tasks.test { + useJUnitPlatform() } - tasks.withType { + kotlin { + jvmToolchain(21) compilerOptions { - jvmTarget = JvmTarget.JVM_17 + jvmTarget = JvmTarget.JVM_21 + languageVersion = KotlinVersion.KOTLIN_2_0 + apiVersion = KotlinVersion.KOTLIN_2_0 } } - tasks.named("shadowJar", ShadowJar::class) { + tasks.shadowJar { mergeServiceFiles() + archiveFileName.set("${project.name}.jar") } } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..c74196c --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,15 @@ +[versions] +kotlin = "2.0.20" +shadow = "8.3.3" +paper-api = "1.21.4-R0.1-SNAPSHOT" +paperweight = "2.0.0-beta.12" + +[libraries] +kotlin-jvm = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } +kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } +paper-api = { module = "io.papermc.paper:paper-api", version.ref = "paper-api" } + +[plugins] +paperweight-userdev = { id = "io.papermc.paperweight.userdev", version.ref = "paperweight" } +kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 06febab..348fbf3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt index 6deb718..2e607aa 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesDisplay.kt @@ -6,7 +6,7 @@ interface PrefixesDisplay { fun createTeam(id: String, priority: Int = 0): T? fun getTeam(id: String): T? fun updatePrefix(id: String, prefix: C) - + fun getPriority(team: T): Int? fun updateSuffix(id: String, suffix: C) fun updatePriority(id: String, priority: Int): T? @@ -23,7 +23,7 @@ interface PrefixesDisplay { return result } - fun addPlayer(id: String, player: P) + fun setPlayer(id: String, player: P) fun removePlayer(player: P) fun setViewer(player: P): Boolean fun addViewer(player: P): Boolean diff --git a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt index d2eb974..8b43fc9 100644 --- a/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt +++ b/prefixes-api/src/main/kotlin/app/simplecloud/plugin/prefixes/api/PrefixesGlobalDisplay.kt @@ -69,9 +69,9 @@ open class PrefixesGlobalDisplay { } } - open fun addPlayer(id: String, player: P, vararg players: UUID) { + open fun setPlayer(id: String, player: P, vararg players: UUID) { executeFor(players.toList()) { - it.addPlayer(id, player) + it.setPlayer(id, player) } } diff --git a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt index ae1a3c6..efdf9d5 100644 --- a/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt +++ b/prefixes-minestom/src/main/java/app/simplecloud/plugin/prefixes/minestom/PrefixesTablist.kt @@ -13,6 +13,7 @@ import net.minestom.server.scoreboard.Team class PrefixesTablist : PrefixesDisplay { private val teams = mutableListOf() + private val priorities = mutableMapOf() private val viewers = mutableSetOf() private var color: TextColor = NamedTextColor.GRAY override fun addViewer(player: Player): Boolean { @@ -57,6 +58,10 @@ class PrefixesTablist : PrefixesDisplay { return teams.firstOrNull { it.teamName.endsWith(id) } } + override fun getPriority(team: Team): Int? { + return priorities[team] + } + fun copyTeam(team: Team, id: String, priority: Int): Team? { val newTeam = createTeam(id, priority) ?: return null newTeam.prefix = team.prefix @@ -70,7 +75,9 @@ class PrefixesTablist : PrefixesDisplay { val team = getTeam(id) ?: return null val newTeam = copyTeam(team, id, priority) ?: return null teams.remove(team) + priorities.remove(team) teams.add(newTeam) + priorities[newTeam] = priority return newTeam } @@ -94,7 +101,7 @@ class PrefixesTablist : PrefixesDisplay { } } - override fun addPlayer(id: String, player: Player) { + override fun setPlayer(id: String, player: Player) { val team = getTeam(id) ?: createTeam(id) ?: return team.addMember(player.username) } diff --git a/prefixes-paper/build.gradle.kts b/prefixes-paper/build.gradle.kts index eb6b95e..a769c0d 100644 --- a/prefixes-paper/build.gradle.kts +++ b/prefixes-paper/build.gradle.kts @@ -1,5 +1,13 @@ +plugins { + alias(libs.plugins.paperweight.userdev) +} + dependencies { api(project(":prefixes-shared")) - compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") - compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") + paperweight.paperDevBundle("1.21.4-R0.1-SNAPSHOT") + compileOnly(libs.paper.api) +} + +tasks.assemble { + dependsOn(tasks.reobfJar) } \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPlayerTeam.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPlayerTeam.kt new file mode 100644 index 0000000..06ab565 --- /dev/null +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPlayerTeam.kt @@ -0,0 +1,41 @@ +package app.simplecloud.plugin.prefixes.paper + +import io.papermc.paper.adventure.PaperAdventure +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextColor +import net.minecraft.ChatFormatting +import net.minecraft.world.scores.PlayerTeam +import net.minecraft.world.scores.Scoreboard + +class PaperPlayerTeam(id: String, val priority: Int = 0) : + PlayerTeam(Scoreboard(), "${toPriorityString(priority)}${id}") { + + init { + nameTagVisibility = Visibility.NEVER + } + + var realColor: TextColor = NamedTextColor.WHITE + set(value) { + field = value + color = ChatFormatting.valueOf(NamedTextColor.nearestTo(value).toString().uppercase()) + } + + fun getFormattedName(formattedName: Component): Component { + val mutableComponent = Component.empty().append(PaperAdventure.asAdventure(this.playerPrefix)) + .append(formattedName.color(realColor)).append( + PaperAdventure.asAdventure(this.playerSuffix) + ) + return mutableComponent + } +} + +private fun toPriorityString(priority: Int): String { + if (priority < 0) return "000" + if (priority > 999) return "999" + var result = priority.toString() + for (i in 0 until 3 - result.length) { + result = "0${result}" + } + return result +} \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesActor.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesActor.kt index 6307d2d..50fc9a8 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesActor.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesActor.kt @@ -4,8 +4,7 @@ import app.simplecloud.plugin.prefixes.api.PrefixesActor import app.simplecloud.plugin.prefixes.api.PrefixesApi import app.simplecloud.plugin.prefixes.api.PrefixesGroup import app.simplecloud.plugin.prefixes.shared.MiniMessageImpl -import app.simplecloud.plugin.prefixes.paper.packet.PacketTeam -import com.comphenix.protocol.ProtocolManager +import io.papermc.paper.adventure.PaperAdventure import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.format.TextColor @@ -17,16 +16,15 @@ import java.util.* class PaperPrefixesActor( private var scoreboard: PaperPrefixesGlobalDisplay, - private val manager: ProtocolManager, ) : PrefixesActor { init { - scoreboard.setDefaultDisplay(PaperPrefixesDisplay(manager)) + scoreboard.setDefaultDisplay(PaperPrefixesDisplay()) } override fun registerViewer(target: UUID, api: PrefixesApi) { val targetPlayer = Bukkit.getPlayer(target) ?: return - val display = PaperPrefixesDisplay(manager) + val display = PaperPrefixesDisplay() scoreboard.register(target, display) display.setViewer(targetPlayer) val defaultDisplay = scoreboard.getDefaultDisplay() ?: return @@ -35,10 +33,10 @@ class PaperPrefixesActor( val team = defaultDisplay.getTeam(player.name) ?: return@forEach apply( player.uniqueId, - team.prefix ?: Component.text(""), - team.color ?: NamedTextColor.WHITE, - team.suffix ?: Component.text(""), - team.priority ?: 0, + PaperAdventure.asAdventure(team.playerPrefix), + TextColor.color(team.realColor), + PaperAdventure.asAdventure(team.playerSuffix), + defaultDisplay.getPriority(team) ?: 0, target ) } @@ -71,8 +69,7 @@ class PaperPrefixesActor( ) if (group.getColor() != null) setColor(target, group.getColor()!!, *viewers) - scoreboard.removePlayer(player, *viewers) - scoreboard.addPlayer(player.name, player, *viewers) + scoreboard.setPlayer(player.name, player, *viewers) apply( target, group.getPrefix() ?: Component.text(""), @@ -102,15 +99,16 @@ class PaperPrefixesActor( val display = if (viewer != null) scoreboard.getDisplay(viewer) .orElseGet { scoreboard.getDefaultDisplay() } else scoreboard.getDefaultDisplay() ?: return message val targetPlayer = Bukkit.getPlayer(target) ?: return message - val team: PacketTeam? = display.getTeam(targetPlayer.name) + val team: PaperPlayerTeam? = display.getTeam(targetPlayer.name) val tags = mutableListOf() if (team != null) { - tags.add(Placeholder.component("prefix", team.prefix ?: Component.text(""))) - tags.add(Placeholder.component("suffix", team.suffix ?: Component.text(""))) + tags.add(Placeholder.component("prefix", PaperAdventure.asAdventure(team.playerPrefix))) + tags.add(Placeholder.component("suffix", PaperAdventure.asAdventure(team.playerSuffix))) tags.add( Placeholder.component( "name_colored", - Component.text(Bukkit.getPlayer(target)!!.name).color(team.color) + Component.text(Bukkit.getPlayer(target)!!.name) + .color(team.realColor) ) ) tags.add(Placeholder.unparsed("name", targetPlayer.name)) @@ -143,7 +141,6 @@ class PaperPrefixesActor( *viewers ) setColor(target, color, *viewers) - scoreboard.removePlayer(player, *viewers) - scoreboard.addPlayer(player.name, player, *viewers) + scoreboard.setPlayer(player.name, player, *viewers) } } \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesDisplay.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesDisplay.kt index 9764b4d..03ef68f 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesDisplay.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesDisplay.kt @@ -1,53 +1,70 @@ package app.simplecloud.plugin.prefixes.paper import app.simplecloud.plugin.prefixes.api.PrefixesDisplay -import app.simplecloud.plugin.prefixes.paper.packet.PacketTeam -import app.simplecloud.plugin.prefixes.paper.packet.UpdateTeamMode -import app.simplecloud.plugin.prefixes.paper.packet.UpdateTeamPlayersMode -import com.comphenix.protocol.ProtocolManager +import io.papermc.paper.adventure.PaperAdventure import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.TextColor +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket +import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket +import net.minecraft.world.level.GameType +import net.minecraft.world.scores.PlayerTeam +import org.bukkit.Bukkit +import org.bukkit.craftbukkit.entity.CraftPlayer import org.bukkit.entity.Player +import java.util.* -class PaperPrefixesDisplay( - private val manager: ProtocolManager, -) : PrefixesDisplay { +class PaperPrefixesDisplay : PrefixesDisplay { - private val teams: MutableMap = mutableMapOf() + private val teams: MutableMap = mutableMapOf() + private val players: MutableMap = mutableMapOf() private val viewers: MutableSet = mutableSetOf() - override fun createTeam(id: String, priority: Int): PacketTeam? { + override fun createTeam(id: String, priority: Int): PaperPlayerTeam? { if (getTeam(id) != null) return null - val name = "${toPriorityString(priority)}$id" - val team = PacketTeam.create(name, null, null, null, priority, mutableListOf()) + val team = PaperPlayerTeam(id, priority) teams[id] = team return team } - override fun getTeam(id: String): PacketTeam? { + override fun getTeam(id: String): PaperPlayerTeam? { return teams.getOrDefault(id, null) } - override fun updatePriority(id: String, priority: Int): PacketTeam? { + override fun getPriority(team: PaperPlayerTeam): Int { + return team.priority + } + + override fun updatePriority(id: String, priority: Int): PaperPlayerTeam? { val team = getTeam(id) ?: return null - val newId = "${toPriorityString(priority)}$id" - val packets = team.getUpdateIdPackets(newId) - team.priority = priority + val deletePacket = ClientboundSetPlayerTeamPacket.createRemovePacket(team) + viewers.forEach { viewer -> + (viewer as CraftPlayer).handle.connection.sendPacket(deletePacket) + } + val newTeam = changeTeamPriority(priority, team) ?: return null + val createPacket = ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(newTeam, true) + val addPlayersPacket = ClientboundSetPlayerTeamPacket.createMultiplePlayerPacket( + newTeam, + getPlayersForTeam(newTeam), + ClientboundSetPlayerTeamPacket.Action.ADD + ) viewers.forEach { viewer -> - packets.forEach { packet -> - manager.sendServerPacket(viewer, packet) + with(viewer as CraftPlayer) { + handle.connection.sendPacket(createPacket) + handle.connection.sendPacket(addPlayersPacket) } } + teams[id] = newTeam return team } override fun updateColor(id: String, color: TextColor) { val team = getTeam(id) ?: return - team.color = color - val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) + team.realColor = color + val updatePacket = ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, false) viewers.forEach { viewer -> - manager.sendServerPacket(viewer, packet) + (viewer as CraftPlayer).handle.connection.sendPacket(updatePacket) } + sendUpdateDisplayNamePackets(team) } override fun getViewers(): Set { @@ -58,7 +75,10 @@ class PaperPrefixesDisplay( val result = viewers.remove(player) if (result) { teams.values.forEach { team -> - manager.sendServerPacket(player, team.getTeamDeletePacket()) + val deletePacket = ClientboundSetPlayerTeamPacket.createRemovePacket(team) + (player as CraftPlayer).handle.connection.sendPacket(deletePacket) + getPlayersForTeam(team).filter { Bukkit.getPlayer(it)?.isOnline ?: false } + .map { Bukkit.getPlayer(it)!! }.forEach { sendUpdateDisplayNamePacket(it) } } } return result @@ -68,9 +88,17 @@ class PaperPrefixesDisplay( val result = viewers.add(player) if (result) { teams.values.forEach { team -> - team.getUpdateDisplayNamePackets().forEach { packet -> - manager.sendServerPacket(player, packet) + val createPacket = ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, false) + val addPlayersPacket = ClientboundSetPlayerTeamPacket.createMultiplePlayerPacket( + team, + getPlayersForTeam(team), + ClientboundSetPlayerTeamPacket.Action.ADD + ) + with(player as CraftPlayer) { + handle.connection.sendPacket(createPacket) + handle.connection.sendPacket(addPlayersPacket) } + sendUpdateDisplayNamePackets(team) } } return result @@ -82,70 +110,133 @@ class PaperPrefixesDisplay( } override fun removePlayer(player: Player) { - teams.forEach { - if (it.value.members.contains(player)) { - it.value.members.remove(player) - val packet = it.value.getModifyTeamMembersPacket(UpdateTeamPlayersMode.REMOVE, listOf(player)) - val displayPacket = it.value.getUpdateDisplayNamePacket(player) - viewers.forEach { viewer -> - manager.sendServerPacket(viewer, packet) - manager.sendServerPacket(viewer, displayPacket) - } - } - } + val playerTeam = players[player.name] ?: return + val team = teams.filter { it.key == playerTeam }.map { it.value }.firstOrNull() ?: return + players.remove(player.name) + val packet = ClientboundSetPlayerTeamPacket.createPlayerPacket( + team, + player.name, + ClientboundSetPlayerTeamPacket.Action.REMOVE + ) + viewers.forEach { viewer -> (viewer as CraftPlayer).handle.connection.sendPacket(packet) } + sendUpdateDisplayNamePackets(team) } - override fun addPlayer(id: String, player: Player) { - val team = getTeam(id) ?: return - if (!team.members.contains(player)) { - team.members.add(player) - val packet = team.getModifyTeamMembersPacket(UpdateTeamPlayersMode.ADD, listOf(player)) - val displayPacket = team.getUpdateDisplayNamePacket(player) - viewers.forEach { viewer -> - manager.sendServerPacket(viewer, packet) - manager.sendServerPacket(viewer, displayPacket) + override fun setPlayer(id: String, player: Player) { + val team = teams[id] ?: return + if (players.contains(player.name)) { + teams[players[player.name]]?.let { existing -> + val delete = ClientboundSetPlayerTeamPacket.createPlayerPacket( + existing, + player.name, + ClientboundSetPlayerTeamPacket.Action.REMOVE + ) + viewers.forEach { viewer -> (viewer as CraftPlayer).handle.connection.sendPacket(delete) } } + } + players[player.name] = id + val packet = ClientboundSetPlayerTeamPacket.createPlayerPacket( + team, + player.name, + ClientboundSetPlayerTeamPacket.Action.ADD + ) + viewers.forEach { viewer -> (viewer as CraftPlayer).handle.connection.sendPacket(packet) } + sendUpdateDisplayNamePackets(team) } override fun update(id: String, prefix: Component, suffix: Component, priority: Int) { val exists = getTeam(id) != null val team = updatePriority(id, priority) ?: createTeam(id, priority) ?: return - team.prefix = prefix - team.suffix = suffix - val packet = team.getTeamUpdatePacket(if (exists) UpdateTeamMode.UPDATE else UpdateTeamMode.CREATE) - val displayPackets = team.getUpdateDisplayNamePackets() + team.playerPrefix = PaperAdventure.asVanilla(prefix) + team.playerSuffix = PaperAdventure.asVanilla(suffix) + teams[id] = team + val packet = ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, !exists) + viewers.forEach { viewer -> - manager.sendServerPacket(viewer, packet) - displayPackets.forEach { display -> - manager.sendServerPacket(viewer, display) + with(viewer as CraftPlayer) { + handle.connection.sendPacket(packet) } } + sendUpdateDisplayNamePackets(team) } override fun updateSuffix(id: String, suffix: Component) { val team = getTeam(id) ?: return - team.suffix = suffix - val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) - val displayPackets = team.getUpdateDisplayNamePackets() + team.playerSuffix = PaperAdventure.asVanilla(suffix) + teams[id] = team + val packet = ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, false) viewers.forEach { viewer -> - manager.sendServerPacket(viewer, packet) - displayPackets.forEach { display -> - manager.sendServerPacket(viewer, display) + with(viewer as CraftPlayer) { + handle.connection.sendPacket(packet) } } + sendUpdateDisplayNamePackets(team) } override fun updatePrefix(id: String, prefix: Component) { val team = getTeam(id) ?: return - team.prefix = prefix - val packet = team.getTeamUpdatePacket(UpdateTeamMode.UPDATE) - val displayPackets = team.getUpdateDisplayNamePackets() + team.playerPrefix = PaperAdventure.asVanilla(prefix) + teams[id] = team + val packet = ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, false) viewers.forEach { viewer -> - manager.sendServerPacket(viewer, packet) - displayPackets.forEach { display -> - manager.sendServerPacket(viewer, display) + with(viewer as CraftPlayer) { + handle.connection.sendPacket(packet) } } + sendUpdateDisplayNamePackets(team) + } + + private fun sendUpdateDisplayNamePackets(team: PaperPlayerTeam) { + val id = teams.filter { it.value == team }.keys.firstOrNull() ?: return + val players = players.filter { it.value == id && Bukkit.getPlayer(it.key)?.isOnline ?: false }.keys.map { + Bukkit.getPlayer(it)!! + } + players.forEach { player -> sendUpdateDisplayNamePacket(player, team) } + } + + private fun sendUpdateDisplayNamePacket(player: Player, passed: PaperPlayerTeam? = null) { + val team = passed ?: teams[players[player.name]] + val update = ClientboundPlayerInfoUpdatePacket( + EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME), + ClientboundPlayerInfoUpdatePacket.Entry( + player.uniqueId, + null, + true, + -1, + GameType.ADVENTURE, + PaperAdventure.asVanilla(team?.getFormattedName(player.name()) ?: player.name()), + true, + -1, + null + ) + ) + viewers.forEach { viewer -> + with(viewer as CraftPlayer) { + handle.connection.sendPacket(update) + } + } + } + + private fun changeTeamPriority(priority: Int, team: PaperPlayerTeam): PaperPlayerTeam? { + val id = teams.filter { it.value == team }.keys.firstOrNull() ?: return null + val playersInTeam = getPlayersForTeam(team) + val newTeam = PaperPlayerTeam(id, priority) + playersInTeam.forEach { player -> players[player] = id } + newTeam.playerPrefix = team.playerPrefix + newTeam.displayName = team.displayName + newTeam.playerSuffix = team.playerSuffix + newTeam.nameTagVisibility = team.nameTagVisibility + newTeam.setSeeFriendlyInvisibles(team.canSeeFriendlyInvisibles()) + newTeam.deathMessageVisibility = team.deathMessageVisibility + newTeam.collisionRule = team.collisionRule + newTeam.realColor = team.realColor + return newTeam + } + + private fun getPlayersForTeam(team: PlayerTeam): List { + val id = teams.filter { it.value == team }.keys.firstOrNull() ?: return emptyList() + return players.filter { it.value == id } + .map { it.key } } } \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesGlobalDisplay.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesGlobalDisplay.kt index 5e1722f..55290b2 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesGlobalDisplay.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesGlobalDisplay.kt @@ -1,7 +1,6 @@ package app.simplecloud.plugin.prefixes.paper import app.simplecloud.plugin.prefixes.api.PrefixesGlobalDisplay -import app.simplecloud.plugin.prefixes.paper.packet.PacketTeam import net.kyori.adventure.text.Component import org.bukkit.entity.Player import space.chunks.customname.api.CustomNameManager @@ -9,16 +8,20 @@ import java.util.* class PaperPrefixesGlobalDisplay( private val name: CustomNameManager -) : PrefixesGlobalDisplay() { +) : PrefixesGlobalDisplay() { - override fun addPlayer(id: String, player: Player, vararg players: UUID) { - super.addPlayer(id, player, *players) + override fun setPlayer(id: String, player: Player, vararg players: UUID) { + super.setPlayer(id, player, *players) name.forEntity(player).setName { viewer -> val defaultDisplay = getDefaultDisplay() ?: return@setName Component.text(player.name) val display = getDisplay(viewer.uniqueId).orElse(null) ?: defaultDisplay val team = display.getTeam(player.name) ?: defaultDisplay.getTeam(player.name) ?: return@setName Component.text(player.name) - return@setName team.asComponent(player) + return@setName team.getFormattedName( + Component.text( + player.name + ) + ) } } } \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesLoader.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesLoader.kt index 1267ff0..88c6815 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesLoader.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PaperPrefixesLoader.kt @@ -8,10 +8,8 @@ import app.simplecloud.plugin.prefixes.api.impl.PrefixesConfigImpl import app.simplecloud.plugin.prefixes.paper.event.PrefixesConfigureEvent import app.simplecloud.plugin.prefixes.paper.event.PrefixesConfiguredEvent import app.simplecloud.plugin.prefixes.paper.listener.LuckPermsListener -import app.simplecloud.plugin.prefixes.paper.packet.PlayerCreatePacketAdapter import app.simplecloud.plugin.prefixes.shared.PrefixesApiLuckPermsImpl import app.simplecloud.plugin.prefixes.shared.PrefixesConfigParser -import com.comphenix.protocol.ProtocolManager import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import net.luckperms.api.LuckPerms @@ -28,20 +26,20 @@ import space.chunks.customname.api.CustomNameManager import java.io.File class PaperPrefixesLoader( - private val manager: ProtocolManager, private val plugin: Plugin, private val chatLoader: PrefixesChatLoader ) : PrefixesPluginLoader, Listener { private lateinit var api: PrefixesApiImpl + private lateinit var actor: PaperPrefixesActor override fun load(): PrefixesApiImpl? { val customNameManager = Bukkit.getServicesManager().load(CustomNameManager::class.java) ?: return null val luckPermsProvider: RegisteredServiceProvider = Bukkit.getServicesManager().getRegistration(LuckPerms::class.java) ?: return null - val prefixesApiActor = PaperPrefixesActor(PaperPrefixesGlobalDisplay(customNameManager), manager) + actor = PaperPrefixesActor(PaperPrefixesGlobalDisplay(customNameManager)) val luckPerms: LuckPerms = luckPermsProvider.provider api = PrefixesApiLuckPermsImpl(luckPerms) - api.setActor(prefixesApiActor) + api.setActor(actor) api.setConfig( PrefixesConfigParser(File(plugin.dataFolder, "config.json")).parse( PrefixesConfigImpl::class.java, @@ -52,7 +50,7 @@ class PaperPrefixesLoader( api.indexGroups() Bukkit.getPluginManager().registerEvents(this, plugin) Bukkit.getServicesManager().register(PrefixesApi::class.java, api, plugin, ServicePriority.Normal) - manager.addPacketListener(PlayerCreatePacketAdapter(plugin, api)) + chatLoader.load(api) LuckPermsListener(plugin, luckPerms, api).init() return api @@ -71,6 +69,7 @@ class PaperPrefixesLoader( @EventHandler fun onQuit(event: PlayerQuitEvent) { api.removeViewer(event.player.uniqueId) + actor.remove(event.player.uniqueId) } companion object { diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt index 2a4de17..be21b6a 100644 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt +++ b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/PrefixesPlugin.kt @@ -1,12 +1,11 @@ package app.simplecloud.plugin.prefixes.paper -import com.comphenix.protocol.ProtocolLibrary import org.bukkit.event.Listener import org.bukkit.plugin.java.JavaPlugin class PrefixesPlugin : JavaPlugin(), Listener { override fun onEnable() { - val loader = PaperPrefixesLoader(ProtocolLibrary.getProtocolManager(), this, PaperPrefixesChatLoader(this)) + val loader = PaperPrefixesLoader(this, PaperPrefixesChatLoader(this)) if (loader.load() == null) { throw NullPointerException("The Prefixes Plugin could not load correctly") } diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PacketTeam.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PacketTeam.kt deleted file mode 100644 index 7a97f29..0000000 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PacketTeam.kt +++ /dev/null @@ -1,66 +0,0 @@ -package app.simplecloud.plugin.prefixes.paper.packet - -import app.simplecloud.plugin.prefixes.paper.packet.v1_17_1.ComponentPacketTeam -import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.utility.MinecraftVersion -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextColor -import org.bukkit.entity.Player - -abstract class PacketTeam( - open var id: String, - open var color: TextColor?, - open var prefix: Component?, - open var suffix: Component?, - open var members: MutableList = mutableListOf(), - open var priority: Int?, -) { - abstract fun getUpdateIdPackets(id: String): List - abstract fun getTeamUpdatePacket(mode: UpdateTeamMode): PacketContainer - abstract fun getTeamDeletePacket(): PacketContainer - abstract fun getUpdateTeamMembersPackets(): List - abstract fun getModifyTeamMembersPacket(mode: UpdateTeamPlayersMode, players: List): PacketContainer - abstract fun getUpdateDisplayNamePackets(): List - abstract fun getUpdateDisplayNamePacket(player: Player): PacketContainer - - fun asComponent(player: Player): Component { - return (prefix ?: Component.text("")).append(Component.text(player.name).color(color ?: NamedTextColor.WHITE)) - .append(suffix ?: Component.text("")) - } - - companion object { - fun create( - id: String, - color: TextColor?, - prefix: Component?, - suffix: Component?, - priority: Int, - members: MutableList - ): PacketTeam { - if (MinecraftVersion.CAVES_CLIFFS_1.atOrAbove()) { - return ComponentPacketTeam(id, color, prefix, suffix, priority, members) - } - //TODO: add support for older minecraft versions - throw NullPointerException("No packet wrapper for your server version was found. Please visit https://github.com/thesimplecloud/prefixes-plugin for more information.") - } - } -} - -enum class UpdateTeamMode(private val mode: Int) { - CREATE(0), - UPDATE(2); - - fun getMode(): Int { - return mode - } -} - -enum class UpdateTeamPlayersMode(private val mode: Int) { - ADD(3), - REMOVE(4); - - fun getMode(): Int { - return mode - } -} \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PlayerCreatePacketAdapter.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PlayerCreatePacketAdapter.kt deleted file mode 100644 index db87818..0000000 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/PlayerCreatePacketAdapter.kt +++ /dev/null @@ -1,23 +0,0 @@ -package app.simplecloud.plugin.prefixes.paper.packet - -import app.simplecloud.plugin.prefixes.api.PrefixesApi -import app.simplecloud.plugin.prefixes.paper.PaperPrefixesLoader -import com.comphenix.protocol.PacketType -import com.comphenix.protocol.events.ListenerPriority -import com.comphenix.protocol.events.PacketAdapter -import com.comphenix.protocol.events.PacketEvent -import org.bukkit.plugin.Plugin - -class PlayerCreatePacketAdapter(private val prefixesPlugin: Plugin, private val api: PrefixesApi) : PacketAdapter( - prefixesPlugin, - ListenerPriority.NORMAL, - PacketType.Play.Client.CHAT_SESSION_UPDATE -) { - - override fun onPacketReceiving(event: PacketEvent) { - if (event.packetType == PacketType.Play.Client.CHAT_SESSION_UPDATE && !api.hasViewer(event.player.uniqueId)) { - api.registerViewer(event.player.uniqueId) - PaperPrefixesLoader.applyFirstName(api, prefixesPlugin, event.player) - } - } -} \ No newline at end of file diff --git a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/v1_17_1/ComponentPacketTeam.kt b/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/v1_17_1/ComponentPacketTeam.kt deleted file mode 100644 index 4c7abaf..0000000 --- a/prefixes-paper/src/main/kotlin/app/simplecloud/plugin/prefixes/paper/packet/v1_17_1/ComponentPacketTeam.kt +++ /dev/null @@ -1,118 +0,0 @@ -package app.simplecloud.plugin.prefixes.paper.packet.v1_17_1 - -import app.simplecloud.plugin.prefixes.shared.ComponentSerializerImpl -import app.simplecloud.plugin.prefixes.paper.packet.PacketTeam -import app.simplecloud.plugin.prefixes.paper.packet.UpdateTeamMode -import app.simplecloud.plugin.prefixes.paper.packet.UpdateTeamPlayersMode -import com.comphenix.protocol.PacketType -import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.utility.MinecraftReflection -import com.comphenix.protocol.wrappers.EnumWrappers -import com.comphenix.protocol.wrappers.PlayerInfoData -import com.comphenix.protocol.wrappers.WrappedGameProfile -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextColor -import org.bukkit.ChatColor -import org.bukkit.entity.Player -import java.util.* - -class ComponentPacketTeam( - id: String, - color: TextColor?, - prefix: Component?, - suffix: Component?, - priority: Int, - members: MutableList = mutableListOf() -) : PacketTeam(id, color, prefix, suffix, members, priority) { - override fun getUpdateIdPackets(id: String): List { - val toReturn = mutableListOf() - toReturn.add(getTeamDeletePacket()) - this.id = id - toReturn.add(getTeamUpdatePacket(UpdateTeamMode.CREATE)) - return toReturn - } - - override fun getTeamUpdatePacket(mode: UpdateTeamMode): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - packet.integers.write(0, mode.getMode()) - if (mode == UpdateTeamMode.CREATE) - packet.getSpecificModifier(Collection::class.java).write(0, members.map { it.name }) - - packet.strings.write(0, id) - if (packet.optionalStructures.size() > 0) { - val optional = packet.optionalStructures.read(0).get() - if (prefix != null) optional.chatComponents.write(1, ComponentSerializerImpl.serializeToPacket(prefix!!)) - if (suffix != null) optional.chatComponents.write(2, ComponentSerializerImpl.serializeToPacket(suffix!!)) - optional.getEnumModifier(ChatColor::class.java, MinecraftReflection.getMinecraftClass("EnumChatFormat")) - .write( - 0, - if (color != null) ChatColor.valueOf( - NamedTextColor.nearestTo(color ?: NamedTextColor.WHITE).toString().uppercase() - ) else ChatColor.GRAY - ) - packet.optionalStructures.write(0, Optional.of(optional)) - } - return packet - } - - override fun getTeamDeletePacket(): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - if (packet.integers.size() > 1) { - packet.integers.write(1, 1) - } else if (packet.integers.size() > 0) { - packet.integers.write(0, 1) - } - packet.strings.write(0, id) - return packet - } - - override fun getUpdateTeamMembersPackets(): List { - return listOf( - getModifyTeamMembersPacket(UpdateTeamPlayersMode.REMOVE, members), - getModifyTeamMembersPacket(UpdateTeamPlayersMode.ADD, members) - ) - } - - override fun getModifyTeamMembersPacket(mode: UpdateTeamPlayersMode, players: List): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) - if (packet.integers.size() > 1) { - packet.integers.write(1, mode.getMode()) - } else if (packet.integers.size() > 0) { - packet.integers.write(0, mode.getMode()) - } - packet.strings.write(0, id) - packet.getSpecificModifier(Collection::class.java).write(0, players.map { it.name }) - return packet - } - - override fun getUpdateDisplayNamePackets(): List { - return members.toList().map { getUpdateDisplayNamePacket(it) } - } - - override fun getUpdateDisplayNamePacket(player: Player): PacketContainer { - val packet = PacketContainer(PacketType.Play.Server.PLAYER_INFO) - packet.playerInfoActions.write(0, EnumSet.of(EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME)) - val infoData = mutableListOf() - val profile = WrappedGameProfile.fromPlayer(player) - infoData.add( - PlayerInfoData( - profile, - player.ping, - EnumWrappers.NativeGameMode.fromBukkit(player.gameMode), - ComponentSerializerImpl.serializeToPacket(constructDisplayName(player)) - ) - ) - packet.playerInfoDataLists.write(1, infoData) - return packet - } - - private fun constructDisplayName(player: Player): Component { - if (!members.contains(player)) return Component.text(player.name) - var base = if (prefix != null) prefix!!.append( - Component.text(player.name).color(color) - ) else Component.text(player.name) - if (suffix != null) base = base.append(suffix!!) - return base - } -} \ No newline at end of file diff --git a/prefixes-paper/src/main/resources/paper-plugin.yml b/prefixes-paper/src/main/resources/paper-plugin.yml new file mode 100644 index 0000000..4a708bb --- /dev/null +++ b/prefixes-paper/src/main/resources/paper-plugin.yml @@ -0,0 +1,15 @@ +name: Prefixes +version: 1.1 +main: app.simplecloud.plugin.prefixes.paper.PrefixesPlugin +api-version: 1.21.4 +dependencies: + server: + LuckPerms: + load: BEFORE + require: true + CustomNames: + load: BEFORE + require: true + join-classpath: true +authors: + - dayyeeet \ No newline at end of file diff --git a/prefixes-paper/src/main/resources/plugin.yml b/prefixes-paper/src/main/resources/plugin.yml deleted file mode 100644 index d453d65..0000000 --- a/prefixes-paper/src/main/resources/plugin.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: Prefixes -version: 1.1 -main: app.simplecloud.plugin.prefixes.paper.PrefixesPlugin -depend: - - LuckPerms -authors: - - dayyeeet \ No newline at end of file diff --git a/prefixes-shared/build.gradle.kts b/prefixes-shared/build.gradle.kts index e511b8c..c398fbd 100644 --- a/prefixes-shared/build.gradle.kts +++ b/prefixes-shared/build.gradle.kts @@ -2,5 +2,4 @@ dependencies { api(project(":prefixes-api")) implementation("net.kyori:adventure-text-serializer-gson:4.14.0") implementation("net.kyori:adventure-text-serializer-legacy:4.14.0") - compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") } \ No newline at end of file diff --git a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt index 7177e1d..f466c83 100644 --- a/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt +++ b/prefixes-shared/src/main/kotlin/app/simplecloud/plugin/prefixes/shared/ComponentSerializerImpl.kt @@ -1,6 +1,5 @@ package app.simplecloud.plugin.prefixes.shared -import com.comphenix.protocol.wrappers.WrappedChatComponent import net.kyori.adventure.text.Component import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer @@ -24,9 +23,5 @@ class ComponentSerializerImpl { fun deserializeLegacy(text: String): Component { return legacyImpl.deserialize(text) } - - fun serializeToPacket(component: Component): WrappedChatComponent { - return WrappedChatComponent.fromJson(serialize(component)) - } } } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 223fd49..c9915fb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,11 +2,12 @@ pluginManagement { repositories { mavenCentral() gradlePluginPortal() + maven("https://repo.papermc.io/repository/maven-public/") } } plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" + id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } include("prefixes-api", "prefixes-minestom", "prefixes-paper", "prefixes-shared")