Kotlin开发Minecraft 1.17.1等级系统 如何在聊天/Tab用户名前显示等级
Minecraft Kotlin 等级前缀显示实现指导
前置说明
你当前使用的1.17.1 + Java 16版本环境完全兼容以下实现,不需要修改你已有的配置存储、进服欢迎等原有功能逻辑。
第一步:抽取公共等级获取方法
把你现在写在onJoin里的等级判断逻辑抽成公共方法,避免后续重复编写代码,在Bork类中添加如下方法:
// 放在Bork类内部 fun getPlayerRank(player: Player): String { val rankId = config.get("Bork.${player.uniqueId}.rank", 1) as Int return when(rankId) { 1 -> "§3User" 2 -> "§dVIP" 3 -> "§6Admin" 4 -> "§cOwner" else -> "§3User" } }
这里用Kotlin的when语法替代原来的多段if判断,逻辑和你原来的完全一致,可读性更高。
第二步:实现Tab栏等级前缀显示
在玩家进服事件onJoin中,获取到玩家等级后添加一行代码设置Tab显示名即可:
// 放在onJoin方法里,拿到ranker变量之后添加 // 设置Tab栏显示格式:[等级] 玩家名 player.playerListName(Component.text("[$ranker§r] ${player.name}"))
如果后续你开发了setrank修改等级的命令,记得在修改完配置后重新调用上面的代码更新Tab显示,避免玩家需要重进才生效。
第三步:实现聊天消息等级前缀显示
新增聊天事件监听方法,直接在Bork类中添加即可:
如果你用的是Paper服务端(推荐)
用1.17.1支持的新版Adventure聊天事件:
@EventHandler fun onPlayerChat(event: AsyncChatEvent) { val player = event.player val rank = getPlayerRank(player) // 自定义聊天格式:[等级] 玩家名: 消息内容 event.renderer { _, sourceDisplayName, message, _ -> Component.text("[$rank§r] ") .append(sourceDisplayName) .append(Component.text(": ")) .append(message) } }
如果你用的是Spigot服务端
用旧版聊天事件即可:
@EventHandler fun onPlayerChat(event: AsyncPlayerChatEvent) { val player = event.player val rank = getPlayerRank(player) // %s是占位符,第一个对应玩家名,第二个对应消息内容 event.format = "[$rank§r] %s: %s" }
完整修改后代码参考
package dev.fabboy.bork import net.kyori.adventure.text.Component import net.kyori.adventure.text.TextComponent 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 // 如果你用Spigot就导入下面这个事件 // import org.bukkit.event.player.AsyncPlayerChatEvent // 如果你用Paper就导入下面这个事件 import io.papermc.paper.event.player.AsyncChatEvent import org.bukkit.plugin.java.JavaPlugin import org.bukkit.scoreboard.DisplaySlot const val version = "0.1" lateinit var INSTANCE: Bork class Bork : JavaPlugin(), Listener { override fun onEnable() { INSTANCE = this println("----------\n[Bork] Plugin loaded \nVersion: $version\nVersion from: 2021-09-07\n${(System.currentTimeMillis())}\n----------") server.pluginManager.registerEvents(this, this) getCommand("broadcast")?.setExecutor(Broadcast()) getCommand("setrank")?.setExecutor(setrank()) getCommand("rank")?.setExecutor(rank()) } override fun onDisable() { Bukkit.getConsoleSender().sendMessage("[Bork] Plugin Disabled") } // 新增:公共等级获取方法 fun getPlayerRank(player: Player): String { val rankId = config.get("Bork.${player.uniqueId}.rank", 1) as Int return when(rankId) { 1 -> "§3User" 2 -> "§dVIP" 3 -> "§6Admin" 4 -> "§cOwner" else -> "§3User" } } @EventHandler fun onJoin(joinEvent: PlayerJoinEvent) { val player = joinEvent.player var j = this.config.get("Bork.${player.uniqueId}.joins", 0) as Int var r = this.config.get("Bork.${player.uniqueId}.rank", 1) as Int j += 1 var ranker = getPlayerRank(player) player.sendMessage("§e-------------§r§lPrivate§r§e--------------§r\n§lWelcome§r\n${(player.displayName() as TextComponent).content()}\nThis is your: §e§l$j Join§r\nYour Rank: $ranker §r\n§e----------------------------------§r\nRanks:\n1. §3User§r\n2. §dVIP§r\n3. §6Admin§r\n4. §cOwner§r\n§e-------------§r§lPrivate§r§e--------------") // 新增:设置Tab栏显示名 player.playerListName(Component.text("[$ranker§r] ${player.name}")) this.config.set("Bork.${player.uniqueId}.joins", j) this.config.set("Bork.${player.uniqueId}.rank", r) this.saveConfig() } // 新增:聊天事件监听,Paper版 @EventHandler fun onPlayerChat(event: AsyncChatEvent) { val player = event.player val rank = getPlayerRank(player) event.renderer { _, sourceDisplayName, message, _ -> Component.text("[$rank§r] ") .append(sourceDisplayName) .append(Component.text(": ")) .append(message) } } /* 如果你用Spigot,就注释掉上面的聊天事件,用下面这个 @EventHandler fun onPlayerChat(event: AsyncPlayerChatEvent) { val player = event.player val rank = getPlayerRank(player) event.format = "[$rank§r] %s: %s" } */ }
内容的提问来源于stack exchange,提问作者Fabboy
相关产品推荐
相关产品推荐

