Проблема, с которой я столкнулся, заключается в том, что я не могу получить именной тег так, как хочу!
Решение ProtocolLib
Код: Выделить всё
public static void changePlayerNameTag(Player player, String newName) {
// Update nametag for other players
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(EssentialsNicks.getPlugin(), PacketType.Play.Server.PLAYER_INFO) {
@Override
public void onPacketSending(PacketEvent event) {
if (event.getPacket().getPlaye`your text`rInfoAction().read(0) != EnumWrappers.PlayerInfoAction.ADD_PLAYER) return;
List
newPlayerInfoDataList = new ArrayList();
List playerInfoDataList = event.getPacket().getPlayerInfoDataLists().read(0);
for (PlayerInfoData playerInfoData : playerInfoDataList) {
if (playerInfoData == null || playerInfoData.getProfile() == null || Bukkit.getPlayer(playerInfoData.getProfile().getUUID()) == null) { //Unknown Player
newPlayerInfoDataList.add(playerInfoData);
continue;
}
// Check if the player's UUID matches the specific player's UUID
if (!playerInfoData.getProfile().getUUID().equals(player.getUniqueId())) {
newPlayerInfoDataList.add(playerInfoData);
continue;
}
WrappedGameProfile profile = playerInfoData.getProfile();
// Create a new profile with the desired name and the original profile's properties (including the skin)
WrappedGameProfile newProfile = new WrappedGameProfile(profile.getUUID(), ChatColor.translateAlternateColorCodes('&', newName));
newProfile.getProperties().putAll(profile.getProperties());
PlayerInfoData newPlayerInfoData = new PlayerInfoData(newProfile, playerInfoData.getLatency(), playerInfoData.getGameMode(), playerInfoData.getDisplayName());
newPlayerInfoDataList.add(newPlayerInfoData);
}
event.getPacket().getPlayerInfoDataLists().write(0, newPlayerInfoDataList);
}
});
Bukkit.getOnlinePlayers().forEach(onlinePlayer -> {
protocolManager.sendServerPacket(onlinePlayer, packet);
onlinePlayer.hidePlayer(player);
onlinePlayer.showPlayer(player);
});
}
Код: Выделить всё
public static void changeName(String name, Player player) {
try {
Method getHandle = player.getClass().getMethod("getHandle");
Object entityPlayer = getHandle.invoke(player);
Class entityHuman = entityPlayer.getClass().getSuperclass();
Field gameProfileField;
int majVersion = Integer.parseInt(Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3].replaceAll("(v|R[0-9]+)", "").split("_")[0]);
int minVersion = Integer.parseInt(Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3].replaceAll("(v|R[0-9]+)", "").split("_")[1]);
if (majVersion >= 1 && minVersion >= 9) {
gameProfileField = entityHuman.getDeclaredField("bS");
} else {
gameProfileField = entityHuman.getDeclaredField("bH");
}
gameProfileField.setAccessible(true);
gameProfileField.set(entityPlayer, new GameProfile(player.getUniqueId(), name));
for (Player players : Bukkit.getOnlinePlayers()) {
players.hidePlayer(player);
players.showPlayer(player);
}
} catch (NoSuchMethodException | SecurityException | InvocationTargetException | NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
Распространенные проблемы
Собственный бейдж игрока не меняется (клиентская сторона)
Проблемы библиотеки протоколов
Измененный бейдж не работает с командами
Проблемы Reflection
Для Reflection он меняет ваше собственное имя Minecraft (очевидно, только на сервере). Проблема, с которой я столкнулся с Reflection, заключается в том, что он создаст Minecraft и все другие команды плагинов непригодны для использования, и вы даже не можете использовать клавишу Tab, чтобы получить свое или измененное имя.
Честно говоря, если бы я мог просто решить проблему с именной меткой протоколаLib, которая не работает с командами, я бы это сделал будь счастлив но мне бы хотелось, чтобы и бейдж игрока тоже изменился
Если кто-нибудь что-то знает, не прошу, прошу помощи!
Подробнее здесь: https://stackoverflow.com/questions/786 ... rotocollib
Мобильная версия