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

获取放置方块对应玩家并切换生存模式时控制台输出乱码问题

解决Bukkit插件方块放置后获取玩家并切换游戏模式的问题

问题根源

你控制台输出的不是乱码,是Component对象的toString结果。displayName()返回的是Minecraft的富文本组件(带样式、格式的文本对象),直接用String.valueOf()会把对象的内部结构打印出来,就出现了你看到的一堆TranslatableComponentImpl这类内容。

解决方案

要把富文本组件转换成纯文本字符串,再用这个字符串匹配玩家名称,最后切换游戏模式。

修正后的代码

@EventHandler
public void onPlace(BlockPlaceEvent event) {
    ItemStack placedItem = event.getItemInHand();
    // 将Component类型的显示名称转为纯文本字符串
    String itemName = placedItem.displayName().plainText();
    
    // 精准匹配在线玩家(完全匹配名称)
    Player targetPlayer = Bukkit.getPlayerExact(itemName);
    
    if (targetPlayer != null) {
        // 切换为生存模式
        targetPlayer.setGameMode(GameMode.SURVIVAL);
        // 给放置方块的玩家反馈
        event.getPlayer().sendMessage("已将玩家 " + itemName + " 切换为生存模式!");
    } else {
        event.getPlayer().sendMessage("玩家 " + itemName + " 不在线或不存在!");
    }
}

关键说明

  • plainText():Paper/Spigot 1.19+版本可用,直接提取Component里的纯文本内容,忽略样式。如果是更低版本,用Bukkit.componentToPlainText(placedItem.displayName())替代。
  • getPlayerExact():比getPlayer()更严格,完全匹配玩家名称,避免模糊匹配导致错误。
  • 必须判空:如果玩家不在线,getPlayerExact()会返回null,直接调用方法会抛出空指针异常。

额外提示

如果你的物品是玩家头颅,不管是默认的玩家名称还是自定义NBT设置的显示名,上面的方法都能正确提取名称内容。

内容的提问来源于stack exchange,提问作者YoRisk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:35:50