Вопрос Скрыть никнейм игрока для другого игрока

er1one

Разработчик
Пользователь
Сообщения
84
Решения
3
Веб-сайт
t.me
Привет, Форумчане! Опишу суть вопроса:
Мне нужен метод, который скроет никнейм одного игрока только для другого игрока и метод, который сделает то же самое, но только наоборот. Если нужно, то имеется возможность использования ProtocolLib
Спасибо!
 
Показывай класс слушателя пакетов, будем разбираться.
Java:
    private final Map<Player, List<Player>> hiddenPlayerMap = new HashMap<>();

    @EventHandler
    public void playerClickEvent(PlayerInteractEntityEvent event) {
        if(!(event.getRightClicked() instanceof Player target)) {
            return;
        }

        Player clicker = event.getPlayer();

        if(isPlayerHidden(clicker, target)) {
            showPlayer(clicker, target);
        } else {
            hidePlayer(clicker, target);
        }
    }

    private void hidePlayer(Player clicker, Player target) {
        if(!hiddenPlayerMap.containsKey(clicker)) {
            List<Player> list = new ArrayList<>();
            hiddenPlayerMap.put(clicker, list);
        }
        List<Player> players = hiddenPlayerMap.get(clicker);
        players.add(target);
        hiddenPlayerMap.put(clicker, players);

        // TODO: Скрыть никнейм над головой игрока target только для игрока clicker
        clicker.hidePlayer(PrivateCore.getInstance(), target);
        clicker.showPlayer(PrivateCore.getInstance(), target);

    }

    private void showPlayer(Player clicker, Player target) {
        List<Player> players = hiddenPlayerMap.get(clicker);
        players.remove(target);
        hiddenPlayerMap.put(clicker, players);

        // TODO: Показать никнейм над головой игрока target только для игрока clicker

        clicker.hidePlayer(PrivateCore.getInstance(), target);
        clicker.showPlayer(PrivateCore.getInstance(), target);
    }

    private boolean isPlayerHidden(Player clicker, Player target) {
        if(!(hiddenPlayerMap.containsKey(clicker))) {
            return false;
        }
        List<Player> players = hiddenPlayerMap.get(clicker);
        return players.contains(target);
    }
 
Java:
    private final Map<Player, List<Player>> hiddenPlayerMap = new HashMap<>();

    @EventHandler
    public void playerClickEvent(PlayerInteractEntityEvent event) {
        if(!(event.getRightClicked() instanceof Player target)) {
            return;
        }

        Player clicker = event.getPlayer();

        if(isPlayerHidden(clicker, target)) {
            showPlayer(clicker, target);
        } else {
            hidePlayer(clicker, target);
        }
    }

    private void hidePlayer(Player clicker, Player target) {
        if(!hiddenPlayerMap.containsKey(clicker)) {
            List<Player> list = new ArrayList<>();
            hiddenPlayerMap.put(clicker, list);
        }
        List<Player> players = hiddenPlayerMap.get(clicker);
        players.add(target);
        hiddenPlayerMap.put(clicker, players);

        // TODO: Скрыть никнейм над головой игрока target только для игрока clicker
        clicker.hidePlayer(PrivateCore.getInstance(), target);
        clicker.showPlayer(PrivateCore.getInstance(), target);

    }

    private void showPlayer(Player clicker, Player target) {
        List<Player> players = hiddenPlayerMap.get(clicker);
        players.remove(target);
        hiddenPlayerMap.put(clicker, players);

        // TODO: Показать никнейм над головой игрока target только для игрока clicker

        clicker.hidePlayer(PrivateCore.getInstance(), target);
        clicker.showPlayer(PrivateCore.getInstance(), target);
    }

    private boolean isPlayerHidden(Player clicker, Player target) {
        if(!(hiddenPlayerMap.containsKey(clicker))) {
            return false;
        }
        List<Player> players = hiddenPlayerMap.get(clicker);
        return players.contains(target);
    }
Так а слушатель пакетов то где?
 
Так а слушатель пакетов то где?
упс
Java:
ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
        protocolManager.addPacketListener(new PacketAdapter(this, PacketType.Play.Server.PLAYER_INFO) {
            @Override
            public void onPacketSending(PacketEvent event) {
                List<PlayerInfoData> newPlayerInfoData = new ArrayList<>();
                List<PlayerInfoData> playerInfoData = event.getPacket().getPlayerInfoDataLists().read(0);
                Player target = hideMap.get(event.getPlayer());
                if (target == null)
                    return;
                for (PlayerInfoData data : playerInfoData) {
                    if (data.getProfile().getUUID().equals(target.getUniqueId())) {
                        WrappedGameProfile profile = data.getProfile();
                        profile = profile.withName("");
                        PlayerInfoData infoData = new PlayerInfoData(profile, data.getLatency(), data.getGameMode(), data.getDisplayName());
                        newPlayerInfoData.add(infoData);
                    } else newPlayerInfoData.add(data);
                }
                event.getPacket().getPlayerInfoDataLists().write(0, newPlayerInfoData);
            }
        });
 
Так, и как у тебя связаны эти две мапы? hideMap и hiddenPlayerMap. Ты в баккитовском слушателе используешь одну мапу, а в протоколе другую. К тому же, тебе надо слегка изменить код слушателя пакетов, т.к. ты используешь список игроков в качестве значения.
 
Теперь задача поменялась. Нужно сделать команду /names, которая для определенного игрока скроет никнеймы всех на сервере (только над голвой)
Так, и как у тебя связаны эти две мапы? hideMap и hiddenPlayerMap. Ты в баккитовском слушателе используешь одну мапу, а в протоколе другую. К тому же, тебе надо слегка изменить код слушателя пакетов, т.к. ты используешь список игроков в качестве значения.
Задача немного поменялась, нужно скрыть никнеймы всех игроков на сервере (только над головой) по команде. Команда сделана, методы также, осталось реализовать логику.
Объединено

У меня есть список игроков, у которых остальные игроки должны скрываться. Исходя из этого требуется сделать логику слушателя
 
Ну значит плохо пытался.

Java:
    private final List<Player> yourList = new ArrayList<>();

    @Override
    public void onEnable() {
        ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
        protocolManager.addPacketListener(new PacketAdapter(this, PacketType.Play.Server.PLAYER_INFO) {
            @Override
            public void onPacketSending(PacketEvent event) {
                if (!yourList.contains(event.getPlayer()))
                    return;
                List<PlayerInfoData> playerInfoDataList = event.getPacket().getPlayerInfoDataLists().read(0);
                playerInfoDataList.replaceAll(playerInfoData -> {
                    WrappedGameProfile profile = playerInfoData.getProfile();
                    profile = profile.withName("");
                    return new PlayerInfoData(profile, playerInfoData.getLatency(), playerInfoData.getGameMode(), playerInfoData.getDisplayName());
                });
                event.getPacket().getPlayerInfoDataLists().write(0, playerInfoDataList);
            }
        });
    }

Java:
Player player = (Player) sender;
yourList.add(player);
for (Player target : Bukkit.getOnlinePlayers()) {
    if (target == player) continue;
    player.hidePlayer(this, target);
    player.showPlayer(this, target);
}
 
Ну значит плохо пытался.

Java:
    private final List<Player> yourList = new ArrayList<>();

    @Override
    public void onEnable() {
        ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
        protocolManager.addPacketListener(new PacketAdapter(this, PacketType.Play.Server.PLAYER_INFO) {
            @Override
            public void onPacketSending(PacketEvent event) {
                if (!yourList.contains(event.getPlayer()))
                    return;
                List<PlayerInfoData> playerInfoDataList = event.getPacket().getPlayerInfoDataLists().read(0);
                playerInfoDataList.replaceAll(playerInfoData -> {
                    WrappedGameProfile profile = playerInfoData.getProfile();
                    profile = profile.withName("");
                    return new PlayerInfoData(profile, playerInfoData.getLatency(), playerInfoData.getGameMode(), playerInfoData.getDisplayName());
                });
                event.getPacket().getPlayerInfoDataLists().write(0, playerInfoDataList);
            }
        });
    }

Java:
Player player = (Player) sender;
yourList.add(player);
for (Player target : Bukkit.getOnlinePlayers()) {
    if (target == player) continue;
    player.hidePlayer(this, target);
    player.showPlayer(this, target);
}
Работает, но скины пропадают у игроков + вроде как-то можно убрать остаточную линию
 
вроде как в плагине TAB нет фишки с никнеймом над головой, там только над и под никнеймом
Есть. Насколько мне известно, надо включить функцию unlimited-nametag-mode ( ), чтобы работало изменение ника над игроком.
 
Есть. Насколько мне известно, надо включить функцию unlimited-nametag-mode ( ), чтобы работало изменение ника над игроком.
А дальше как?
 
Назад
Сверху Снизу