我正在尝试更改玩家实体上方的名称。我已经成功地做到了这一点,但它有将玩家皮肤更改为默认值的副作用。如何在不重置玩家皮肤的情况下更改玩家的姓名标签。
使用的插件库
协议(protocol)库
PacketWrapper
用于更改名称的代码
public void changeNameOnHead(Player player, String name) {
PlayerInfoData pid = new
PlayerInfoData(WrappedGameProfile.fromPlayer(player), 1,
EnumWrappers.NativeGameMode.SURVIVAL,
WrappedChatComponent.fromText(player.getName()));
WrapperPlayServerPlayerInfo wpspi = new WrapperPlayServerPlayerInfo();
wpspi.setAction(EnumWrappers.PlayerInfoAction.REMOVE_PLAYER);
wpspi.setData(Collections.singletonList(pid));
for (Player p: Bukkit.getOnlinePlayers()) {
if (p.equals(player)) {
continue;
}
p.hidePlayer(player);
wpspi.sendPacket(p);
}
ProtocolLibrary.getProtocolManager().addPacketListener(
new PacketAdapter(RoleplayEngine.Instance,
PacketType.Play.Server.PLAYER_INFO) {
@Override
public void onPacketSending(PacketEvent event) {
if (event.getPacket().getPlayerInfoAction().read(0) != EnumWrappers.PlayerInfoAction.ADD_PLAYER) {
return;
}
PlayerInfoData pid =
event.getPacket().getPlayerInfoDataLists().read(0).get(0);
if (pid.getProfile().getUUID() !=
player.getUniqueId()) return;
PlayerInfoData newPid = new PlayerInfoData(
pid.getProfile().withName(name),
pid.getPing(),
pid.getGameMode(),
WrappedChatComponent.fromText(name)
);
event.getPacket().getPlayerInfoDataLists().write(0,
Collections.singletonList(newPid));
}
}
);
for (Player p: Bukkit.getOnlinePlayers()) {
if (p.equals(player)) {
continue;
}
p.showPlayer(player);
}
}
最佳答案
您可以尝试使用this library可在 github 中更改玩家的姓名和皮肤。
快速使用示例:
PlayerDisplayModifier p = new PublicDisplayModifier(plugin);
p.changeDisplay(myPlayer, "SkinPlayer", "NewName");
如果您的服务器是 1.8 及更低版本,则此方法有效,不确定它是否适用于更高版本。
<小时/>如果您的服务器版本高于1.8,您可以尝试使用NickNamerIntegratedApi ,一个插件,也有一个供开发人员使用的 API。它是开源的,因此您可以挖掘使昵称更改成为可能的代码段
最后,您还可以尝试使用md-5's iTAG ,一个好fork of it通过 ataranlen
关于java - Bukkit ProtocolLib 名称标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42632562/