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

er1one

Разработчик
Пользователь
Сообщения
84
Решения
3
Веб-сайт
t.me
Привет, Форумчане! Опишу суть вопроса:
Мне нужен метод, который скроет никнейм одного игрока только для другого игрока и метод, который сделает то же самое, но только наоборот. Если нужно, то имеется возможность использования ProtocolLib
Спасибо!
 
Java:
...
Scoreboard mainScoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
Team team = mainScoreboard.getTeam("hideNicknameTeam");
if (team == null) {
    team = mainScoreboard.registerNewTeam("hideNicknameTeam");
    team.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER);
}
//TODO
Java:
...
@EventHandler
public void playerJoin(PlayerJoinEvent e) {
    hideNicknameTeam.addEntry(e.getPlayer().getName());
}
А вообще, этот вопрос спокойно гуглится:
 
Последнее редактирование:
Java:
...
Scoreboard mainScoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
Team team = mainScoreboard.getTeam("hideNicknameTeam");
if (team == null) {
    team = mainScoreboard.registerNewTeam("hideNicknameTeam");
    team.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER);
}
//TODO
Java:
...
@EventHandler
public void playerJoin(PlayerJoinEvent e) {
    hideNicknameTeam.addEntry(e.getPlayer().getName());
}
А вообще, этот вопрос спокойно гуглится:
Мне нужно скрыть никнейм одного игрока от другого, я же написал это в вопросе, тут скорборды не пойдут
 
Мне нужно скрыть никнейм одного игрока от другого, я же написал это в вопросе, тут скорборды не пойдут
Тогда вряд ли сможешь это реализовать без модов. Хотя, возможно, можно как-то обновить информацию о никнейме.
 
Последнее редактирование:
Тогда вряд ли сможешь это реализовать без модов. Хотя, возможно, можно как-то обновить информацию о никнейме.
Я уверен, что это можно реализовать пакетами, ибо видел такое на некоторых проектах. Дело в том, что сам я в пакетах нолик
 
Да, действительно можно. См.
Под себя, думаю, переделать сможешь.
Java:
    private final Map<Player, Player> hideMap = new HashMap<>();

    @Override
    public void onEnable() {
        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);
            }
        });
    }
Java:
Player player = (Player) sender;
Player target = Bukkit.getPlayerExact("nickname");
hideMap.put(player, target);
player.hidePlayer(plugin, target);
player.showPlayer(plugin, target);
 
Да, действительно можно. См.
Под себя, думаю, переделать сможешь.
Java:
    private final Map<Player, Player> hideMap = new HashMap<>();

    @Override
    public void onEnable() {
        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);
            }
        });
    }
Java:
Player player = (Player) sender;
Player target = Bukkit.getPlayerExact("nickname");
hideMap.put(player, target);
player.hidePlayer(plugin, target);
player.showPlayer(plugin, 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) {
        List<Player> players = hiddenPlayerMap.get(clicker);
        players.add(target);
        hiddenPlayerMap.put(clicker, players);

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

    }

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

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

    }

    private boolean isPlayerHidden(Player clicker, Player target) {
        if(!(hiddenPlayerMap.containsKey(clicker))) {
            return false;
        }
        List<Player> players = hiddenPlayerMap.get(clicker);
        return players.contains(target);
    }
 
Тебе необходимо вызвать эти два метода, чтобы сервер отослал пакет с информацией об игроке.
Java:
player.hidePlayer(plugin, target);
player.showPlayer(plugin, target);
А как сервер поймет для какого именно игрока нужно скрыть первого?
 
player - игрок, для которого скрывается target. Проще говоря, player получит пакет с информацией об игрокe target, которую мы меняем в слушателе пакетов.
При нажатии на игрока он просто дергается и ничего не меняется, причем дергается только на стороне клиента
 
Как вариант, если с пакетами не разберётесь, можно скрыть с помощью плагинов TAB (или иного, который будет менять ник над игроком) и PlaceholderAPI ( )
 
Как вариант, если с пакетами не разберётесь, можно скрыть с помощью плагинов TAB (или иного, который будет менять ник над игроком) и PlaceholderAPI ( )
Реляционный заполнитель реализовал, но вроде как в плагине TAB нет фишки с никнеймом над головой, там только над и под никнеймом
 
Назад
Сверху Снизу