You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:06:06