Как изменить бейдж с протокольной библиотекой или без нееJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как изменить бейдж с протокольной библиотекой или без нее

Сообщение Anonymous »

Итак, я искал в течение прошлого года, и из всех решений по изменению именной метки игрока выделялось 2: одно использует отражение, а другое просто использует протокол.
Проблема, с которой я столкнулся, заключается в том, что я не могу получить именной тег так, как хочу!
Решение 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»