これは1.8で可能です。便宜上、ProtocolLibとPacketWrapperを使用しました。
1.8アップデートので、NamedEntitySpawn
パケットが変更されていると、それはもはやサポートされている変更しないことにより、プレイヤーの名前を変更する(ref)
しかしthis postは、参照を与えた:私たちは、パケットPlayerInfoData
を使用することができます。私はいくつかのテストをした、とここ(1.9.2に対してテスト)の結果です:コードここ
です:
Player theGuyToChangeNameFor = Bukkit.getPlayer("theguy");
PlayerInfoData pid = new PlayerInfoData(WrappedGameProfile.fromPlayer(theGuyToChangeNameFor), 1,
EnumWrappers.NativeGameMode.SURVIVAL,
WrappedChatComponent.fromText("whatever_string"));
WrapperPlayServerPlayerInfo wpspi = new WrapperPlayServerPlayerInfo();
wpspi.setAction(EnumWrappers.PlayerInfoAction.REMOVE_PLAYER);
wpspi.setData(Collections.singletonList(pid));
for(Player p : Bukkit.getOnlinePlayers())
{
if(p.equals(theGuyToChangeNameFor))
{
continue;
}
p.hidePlayer(theGuyToChangeNameFor);
wpspi.sendPacket(p);
}
ProtocolLibrary.getProtocolManager().addPacketListener(
new PacketAdapter(this, 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().getName().toLowerCase().equals("theguy")) // Here you can do something to ensure you're changing the name of the correct guy
{
return;
}
PlayerInfoData newPid = new PlayerInfoData(pid.getProfile().withName("HEAD_NAME"), pid.getPing(), pid.getGameMode(),
WrappedChatComponent.fromText("TAB_LIST_NAME"));
event.getPacket().getPlayerInfoDataLists().write(0, Collections.singletonList(newPid));
}
}
);
for(Player p : Bukkit.getOnlinePlayers())
{
if(p.equals(theGuyToChangeNameFor))
{
continue;
}
p.showPlayer(theGuyToChangeNameFor);
}
説明:私たちは、ProtocolLibがからPlayerInfoData
パケットを変更するために使用
- サーバーを使用して、プレーヤーの表示名を変更します。
hidePlayer
、showPlayer
およびは、プレーヤーの名前をすぐにリフレッシュするために使用されます(そうしないと、ログアウトや再入力が必要になります)。これまでのところ、より良い方法は見つかっていません。あなたは1を持っている場合は、それを言う:)
事がある。この https://www.spigotmc.org/threads/change-name-above-head-spigot-1-8.66314/ – Kerooker