【问题标题】:Changing player names above head更改头顶上的玩家名称
【发布时间】:2022-01-03 13:37:27
【问题描述】:

我一直在尝试创建自己的插件,允许人们更改显示在他们头顶上的名字,但我无法让它工作。

我的代码:

public void NickPlayer(Player player) {
    try {
        String name = (String) main.getConfig().get("Nick" + player.getUniqueId());
        GameProfile playerProfile = ((CraftPlayer) player).getHandle().getProfile();
        Field ff = playerProfile.getClass().getDeclaredField("name");
        ff.setAccessible(true);
        ff.set(playerProfile, name);
        player.sendMessage(name);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • “不工作”是什么意思?
  • 它将名称服务器端而不是播放器端更改为您需要发送数据包,但我不知道如何。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: java minecraft bukkit


【解决方案1】:

编辑EntityPlayer 和它的GameProfile 后,你应该使用PacketPlayOutPlayerInfo。此数据包应发送给应显示姓名更改的每个人。

例如:

EntityPlayer ep = ((CraftPlayer) player).getHandle();
String name = (String) main.getConfig().get("Nick" + player.getUniqueId());
GameProfile playerProfile = ep.getProfile();
Field ff = playerProfile.getClass().getDeclaredField("name");
ff.setAccessible(true);
ff.set(playerProfile, name);
// now the name is changed

for(Player all : Bukkit.getOnlinePlayers()) {
   PlayerConnection connection = ((CraftPlayer) p).getHandle().playerConnection;
   connection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, ep));
   connection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, ep));
}

我们希望EnumPlayerInfoAction.UPDATE_DISPLAYNAME 可以工作,但它只是entity.setDisplayName(),所以它不会。

如果这有问题,您可以:

  1. 就用Bukkit的方法吧:
for(Player all : Bukkit.getOnlinePlayers()) {
   all.hidePlayer(p);
   all.showPlayer(p);
}
  1. 尝试艰难的方式,完全移除播放器并使其重生(仅适用于玩家!):
for(Player all : Bukkit.getOnlinePlayers()) {
   PlayerConnection connection = ((CraftPlayer) p).getHandle().playerConnection;
   connection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, ep));
   connection.sendPacket(PacketPlayOutEntityDestroy(ep.entityId));
   connection.sendPacket(PacketPlayOutNamedEntitySpawn(ep));
   connection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, ep));
}

PS:您可以在删除之后和添加之前添加Bukkit.getScheduler().runTaskLater() 之类的内容,以确保每个人都已删除播放器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2010-10-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多