Skip to content

Commit

Permalink
Temporary 1.20.4 compatibility fix
Browse files Browse the repository at this point in the history
  • Loading branch information
r4g3baby committed Dec 17, 2023
1 parent e931272 commit 6a1cfed
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class BukkitScoreboard : ScoreboardHandler() {
player.scoreboard = Bukkit.getScoreboardManager().newScoreboard.apply {
registerNewObjective(getPlayerIdentifier(player), "dummy").apply {
displaySlot = DisplaySlot.SIDEBAR
displayName = ""
}
}
}
Expand All @@ -27,6 +28,7 @@ class BukkitScoreboard : ScoreboardHandler() {
override fun clearScoreboard(player: Player) {
val objective = player.scoreboard?.getObjective(getPlayerIdentifier(player))
if (objective != null && objective.isModifiable) {
objective.displayName = ""
objective.scoreboard.entries.forEach { scoreName ->
objective.scoreboard.getTeam(scoreName)?.unregister()
objective.scoreboard.resetScores(scoreName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class ProtocolScoreboard : ScoreboardHandler() {
private val afterAquaticUpdate = MinecraftVersion("1.13").atOrAbove()
private val afterCavesAndCliffsUpdate = MinecraftVersion("1.17").atOrAbove()
private val afterTrailsAndTailsDot2Update = MinecraftVersion("1.20.2").atOrAbove()
private val afterTrailsAndTailsDot4Update = MinecraftVersion("1.20.4").atOrAbove()

private val playerBoards = ConcurrentHashMap(HashMap<UUID, PlayerBoard>())

Expand All @@ -31,8 +32,8 @@ class ProtocolScoreboard : ScoreboardHandler() {
packet.strings.write(0, getPlayerIdentifier(player)) // Objective Name
packet.integers.write(0, 0) // Mode 0: Created Scoreboard
if (afterAquaticUpdate) {
packet.chatComponents.write(0, fromText(getPlayerIdentifier(player))) // Display Name
} else packet.strings.write(1, getPlayerIdentifier(player)) // Display Name
packet.chatComponents.write(0, fromText("")) // Display Name
} else packet.strings.write(1, "") // Display Name
protocolManager.sendServerPacket(player, packet)

packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_DISPLAY_OBJECTIVE)
Expand All @@ -43,7 +44,7 @@ class ProtocolScoreboard : ScoreboardHandler() {
packet.strings.write(0, getPlayerIdentifier(player)) // Objective Name
protocolManager.sendServerPacket(player, packet)

return@computeIfAbsent PlayerBoard(getPlayerIdentifier(player), emptyMap())
return@computeIfAbsent PlayerBoard("", emptyMap())
}
}

Expand All @@ -69,6 +70,19 @@ class ProtocolScoreboard : ScoreboardHandler() {

override fun clearScoreboard(player: Player) {
playerBoards[player.uniqueId]?.also { playerBoard ->
if (afterTrailsAndTailsDot4Update) {
val packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_OBJECTIVE)
packet.modifier.writeDefaults()
packet.strings.write(0, getPlayerIdentifier(player)) // Objective Name
packet.integers.write(0, 2) // Mode 2: Update Display Name
if (afterAquaticUpdate) {
packet.chatComponents.write(0, fromLegacyText("")) // Display Name
} else packet.strings.write(1, "") // Display Name
protocolManager.sendServerPacket(player, packet)

playerBoard.title = ""
}

playerBoard.scores.forEach { (score, _) ->
val scoreName = scoreToName(score)

Expand All @@ -80,11 +94,23 @@ class ProtocolScoreboard : ScoreboardHandler() {
} else packet.integers.write(1, 1) // Mode - remove team
protocolManager.sendServerPacket(player, packet)

packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_SCORE)
packet.modifier.writeDefaults()
packet.strings.write(0, scoreName) // Score Name
packet.scoreboardActions.write(0, EnumWrappers.ScoreboardAction.REMOVE) // Action
packet.strings.write(1, getPlayerIdentifier(player)) // Objective Name
if (afterTrailsAndTailsDot4Update) {
// todo: temporary 1.20.4 compatibility fix
packet = PacketContainer(
PacketType.findCurrent(
PacketType.Protocol.PLAY, PacketType.Sender.SERVER, 0x42
)
)
packet.modifier.writeDefaults()
packet.strings.write(0, scoreName) // Score Name
packet.strings.write(1, getPlayerIdentifier(player)) // Objective Name
} else {
packet = PacketContainer(PacketType.Play.Server.SCOREBOARD_SCORE)
packet.modifier.writeDefaults()
packet.strings.write(0, scoreName) // Score Name
packet.scoreboardActions.write(0, EnumWrappers.ScoreboardAction.REMOVE) // Action
packet.strings.write(1, getPlayerIdentifier(player)) // Objective Name
}
protocolManager.sendServerPacket(player, packet)
}
playerBoard.scores = emptyMap()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.r4g3baby.simplescore.scoreboard.tasks

import com.r4g3baby.simplescore.SimpleScore
import com.r4g3baby.simplescore.scoreboard.handlers.BukkitScoreboard
import com.r4g3baby.simplescore.scoreboard.models.Scoreboard
import com.r4g3baby.simplescore.scoreboard.placeholders.PlaceholderReplacer
import com.r4g3baby.simplescore.scoreboard.placeholders.VariablesReplacer
Expand Down Expand Up @@ -65,7 +66,7 @@ class ScoreboardTask : BukkitRunnable() {
}
}

if (SimpleScore.config.asyncPlaceholders) {
if (SimpleScore.config.asyncPlaceholders && SimpleScore.manager.scoreboardHandler !is BukkitScoreboard) {
val playerScoreboards = getPlayerScoreboards(possibleScoreboards)
Bukkit.getScheduler().runTask(SimpleScore.plugin) {
updateScoreboards(playerScoreboards)
Expand Down

0 comments on commit 6a1cfed

Please sign in to comment.