完全更改玩家名称的具体功能是什么?

What´s the specific function to fully change a players name?

我已经在互联网上搜索了一个星期,试图找到一个可用的功能,我可以用它来更改我的插件中的玩家名称,但由于大多数信息都太旧了,我没有找到任何东西. 这是我已经尝试过的:

 player.setCustomName(args[0]);
 player.setDisplayName(args[0]);
 player.setPlayerListName(args[0]);
 getConfig().set(player.getName(),args[0]);
 

我并没有收到错误之类的东西,只是玩家名称没有发生太大变化(但我检查过该函数实际上被调用了)。

简单地说,您不能更改在客户端设置中输入的全名。

您尝试使用的这些方法只会更改玩家对象的游戏内服务器名称。这些也会影响聊天、标签列表和可能的记分板团队的名称。有一种解决方案可用于将给定玩家的玩家名称更改一半,但它不会影响其他服务器或客户端。使用 Mojang 中的 GameProfile,您可以更改其名称和 UUID,但这需要创建一个新实例并将其添加到现有的 PlayerInfoData 列表中。如果您没有 Spigot/Paper 或项目附带的某些软件,则需要使用 Java Reflections 来修改 values/list 和其他一切,尤其是 PacketPlayOutPlayerInfo。或者,如果你想避免 Java 反射,你可以使用 Paper 实现的 PlayerProfile 接口,使用 Player#getPlayerProfile 方法。

使用反射的示例代码:

Player player = ...; // Your player object here
GameProfile gameProfile = new GameProfile(player.getUniqueId(), "newPlayerNameHere");

// packet is the new instance of PacketPlayOutPlayerInfo
// infoList is the list retrieved from PacketPlayOutPlayerInfo
// playerInfoDataConstr is the PacketPlayOutPlayerInfo constructor
// ping is the amount of ping the player have currently
// gameMode is the EnumGameMode object of the player
// text is the text parsed to IChatBaseComponent

((List<Object>) infoList.get(packet)).add(playerInfoDataConstr.newInstance(packet, gameProfile, ping, gameMode, getAsIChatBaseComponent(text)));

// Send the packet object to every online player on the server

要访问 GameProfile class,您需要 com.mojang.authlib 依赖项。

使用 Paper API 比较容易实现。