Помогите Разное сообщение для разных игроков.

Статус
Закрыто для дальнейших ответов.

ShitCoder

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
TheLastGapple
Как сделать разное сообщение для разных игроков?
Например одному игроку пишется это сообщение жёлтым, а другому белым.
Это сообщение от другого игрока, а не от сервера.
 
Ловить AsyncPlayerChatEvent и отправлять игрокам сообщения в зависимости от того что надо.
 
Если кратко - как-то так. Самый примитивный вариант, но показывает суть.
PHP:
@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
    String sender=e.getPlayer().getName();
    for(Player player:e.getRecipients()) {
        ChatColor clr=player.hasPermission("chat.yellow")?ChatColor.YELLOW:ChatColor.WHITE;
        player.sendMessage(sender+" > "+clr+e.getMessage());
    }
    e.getRecipients().clear;
}
 
Ловить AsyncPlayerChatEvent и отправлять игрокам сообщения в зависимости от того что надо.
так допустим мне надо что бы игрок ник которого содержится в сообщении видел сообщение подчеркнутым.
Код:
public static boolean checkstring (String line, String reg) {
    String[] strings = line.split(" ");
    for (String word : strings) {

        if (word.matches(reg)) {
            return true;
        }
    }
    return false;
}


    
    
    @EventHandler
    public void onChatEvent(PlayerChatEvent e) {
        if(this.checkstring(e.getMessage(),"playername")) {
            
        }     
    }
Допустим хотел сделать проверку, если в строке содержится имя какого то игрока то, а как мне теперь всем вывести одно, но что бы у того игрока чьё имя указано вывелось другое?
 
Если кратко - как-то так. Самый примитивный вариант, но показывает суть.
PHP:
@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
    String sender=e.getPlayer().getName();
    for(Player player:e.getRecipients()) {
        ChatColor clr=player.hasPermission("chat.yellow")?ChatColor.YELLOW:ChatColor.WHITE;
        player.sendMessage(sender+" > "+clr+e.getMessage());
    }
    e.getRecipients().clear;
}
Код:
    @EventHandler
    public void onChat(AsyncPlayerChatEvent e) {
        for (Player p : Bukkit.getOnlinePlayers()) {
          if(this.checkstring(e.getMessage(), p.getDisplayName())) {
              ChatColor clr= ChatColor.ITALIC;
              p.sendMessage(p+" > "+clr+e.getMessage());
              
          }
        }
    }
А вот это случайно не отправит ему 2 сообщения? Как удалить 1 сообщения не для всех игроков а только для того чей ник указан?
 
так допустим мне надо что бы игрок ник которого содержится в сообщении видел сообщение подчеркнутым.
Код:
public static boolean checkstring (String line, String reg) {
    String[] strings = line.split(" ");
    for (String word : strings) {

        if (word.matches(reg)) {
            return true;
        }
    }
    return false;
}


 
 
    @EventHandler
    public void onChatEvent(PlayerChatEvent e) {
        if(this.checkstring(e.getMessage(),"playername")) {
        
        } 
    }
Допустим хотел сделать проверку, если в строке содержится имя какого то игрока то, а как мне теперь всем вывести одно, но что бы у того игрока чьё имя указано вывелось другое?
PHP:
@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
    if(e.isCancelled()) return;
    String message = e.getMessage();
    for(Player player:e.getRecipients()) {
        if(message.contains(player.getName())) {
            int nickStart = message.indexOf(player.getName());
            p.sendMessage(
                new StringBuilder(message)
                .insert(nickStart,ChatColor.YELLOW)
                .insert(nickStart+player.getName().length(), ChatColor.RESET)
                .toString()
             );
        } else p.sendMessage(message);
    }
    //считай что можно отменить ивент, но хз не сломает ли это плагины на чат
    e.getRecipients().clear;
}
 
PHP:
@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
    if(e.isCancelled()) return;
    String message = e.getMessage();
    for(Player player:e.getRecipients()) {
        if(message.contains(player.getName())) {
            int nickStart = message.indexOf(player.getName());
            p.sendMessage(
                new StringBuilder(message)
                .insert(nickStart,ChatColor.YELLOW)
                .insert(nickStart+player.getName().length(), ChatColor.RESET)
                .toString()
             );
        } else p.sendMessage(message);
    }
    //считай что можно отменить ивент, но хз не сломает ли это плагины на чат
    e.getRecipients().clear;
}
А при таком использовании все игроки увидят сообщение в чат?
 
А при таком использовании все игроки увидят сообщение в чат?
AsyncPlayerChatEvent#getRecipients() - список получателей сообщения. Очищая его (e.getRecipients().clear()) - игроки не получат сообщение, однако вместо этого мы отправляем им своё.
Почему просто не отменить ивент? - потому что такое сообщение не будет видно в консоли, и многие плагины, взаимодействующие с чатом, не услышат его.
 
Код:
    @EventHandler
    public void onChat(AsyncPlayerChatEvent e) {
        if(e.isCancelled()) return;
        String message = e.getMessage();
        for(Player player:e.getRecipients()) {
            if(message.contains(player.getName())) {
                int nickStart = message.indexOf(player.getName());
                player.sendMessage(
                    new StringBuilder(message)
                    .insert(nickStart,ChatColor.YELLOW)
                    .insert(nickStart+player.getName().length(), ChatColor.RESET)
                    .toString()
                 );
            } else player.sendMessage(message);
        }
        e.getRecipients().clear();
    }
С данным кодом, когда я пишу свой ник в чат, он не становиться жёлтого цвета.
 
AsyncPlayerChatEvent#getRecipients() - список получателей сообщения. Очищая его (e.getRecipients().clear()) - игроки не получат сообщение, однако вместо этого мы отправляем им своё.
Почему просто не отменить ивент? - потому что такое сообщение не будет видно в консоли, и многие плагины, взаимодействующие с чатом, не услышат его.
А можно ли как то не отправить это сообщение именно конкретному игроку?
 
Код:
    @EventHandler
    public void onChat(AsyncPlayerChatEvent e) {
        if(e.isCancelled()) return;
        String message = e.getMessage();
        for(Player player:e.getRecipients()) {
            if(message.contains(player.getName())) {
                int nickStart = message.indexOf(player.getName());
                player.sendMessage(
                    new StringBuilder(message)
                    .insert(nickStart,ChatColor.YELLOW)
                    .insert(nickStart+player.getName().length(), ChatColor.RESET)
                    .toString()
                 );
            } else player.sendMessage(message);
        }
        e.getRecipients().clear();
    }
С данным кодом, когда я пишу свой ник в чат, он не становиться жёлтого цвета.
Ивент зареган? Проверь куда код доходит
А можно ли как то не отправить это сообщение именно конкретному игроку?
Да, просто if добавь где надо
 
Код:
    @EventHandler
    public void onChat(AsyncPlayerChatEvent e) {
        if(e.isCancelled()) return;
        String message = e.getMessage();
        for(Player player:e.getRecipients()) {
            if(message.contains(player.getName())) {
                int nickStart = message.indexOf(player.getName());
                player.sendMessage(
                    new StringBuilder(message)
                    .insert(nickStart,ChatColor.YELLOW)
                    .insert(nickStart+player.getName().length(), ChatColor.RESET)
                    .toString()
                 );
            } else player.sendMessage(message);
        }
        e.getRecipients().clear();
    }
С данным кодом, когда я пишу свой ник в чат, он не становиться жёлтого цвета.
Попробуй в лоб - вместо
PHP:
            if(message.contains(player.getName())) {
                int nickStart = message.indexOf(player.getName());
                player.sendMessage(
                    new StringBuilder(message)
                    .insert(nickStart,ChatColor.YELLOW)
                    .insert(nickStart+player.getName().length(), ChatColor.RESET)
                    .toString()
                 );
            } else player.sendMessage(message);
вот это
PHP:
            String name=player.getName();
            if(message.contains(name))
                     player.sendMessage(message.replace(name, ChatColor.YELLOW+name+ChatColor.RESET))
                else player.sendMessage(message);
 
Попробуй в лоб - вместо
PHP:
            if(message.contains(player.getName())) {
                int nickStart = message.indexOf(player.getName());
                player.sendMessage(
                    new StringBuilder(message)
                    .insert(nickStart,ChatColor.YELLOW)
                    .insert(nickStart+player.getName().length(), ChatColor.RESET)
                    .toString()
                 );
            } else player.sendMessage(message);
вот это
PHP:
            String name=player.getName();
            if(message.contains(name))
                     player.sendMessage(message.replace(name, ChatColor.YELLOW+name+ChatColor.RESET))
                else player.sendMessage(message);
Код:
    @EventHandler
    public void onChat(AsyncPlayerChatEvent e) {
        if(e.isCancelled()) return;
        String message = e.getMessage();
        for(Player player:e.getRecipients()) {
            String name=player.getName();
           if(message.contains(name))
                    player.sendMessage(message.replace(name, ChatColor.YELLOW+name+ChatColor.RESET));
               else player.sendMessage(message);
        }
        e.getRecipients().clear();
    }
Работает, но выводит просто мое сообщение без моего префикса и т.д
UPD: Ещё и теперь когда просто пишу сообщение тоже чат ломается, и видно только сообщение. А как подстроить под формат чата, понятия не имею. Плагин на чат - CHATEX
 
Последнее редактирование:
Код:
    @EventHandler
    public void onChat(AsyncPlayerChatEvent e) {
        if(e.isCancelled()) return;
        String message = e.getMessage();
        for(Player player:e.getRecipients()) {
            String name=player.getName();
           if(message.contains(name))
                    player.sendMessage(message.replace(name, ChatColor.YELLOW+name+ChatColor.RESET));
               else player.sendMessage(message);
        }
        e.getRecipients().clear();
    }
Работает, но выводит просто мое сообщение без моего префикса и т.д
UPD: Ещё и теперь когда просто пишу сообщение тоже чат ломается, и видно только сообщение. А как подстроить под формат чата, понятия не имею. Плагин на чат - CHATEX
Покажи, как выглядит формат чата в ChatEx (конфиг)
 
&7%prefix%displayname%suffix: %message
PHP:
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onChat(AsyncPlayerChatEvent e) {
        String message = e.getMessage();

        // Получаем формат сообщения, заменяем дефолтный плейсхолдер именем игрока.
        String baseFormat = e.getFormat().replace("%1$s",e.getPlayer().getDisplayName());
        // Если игрок не упомянут - отправим дефолтный формат с обычным сообщением
        String format = baseFormat.replace("%2$s",message);
        // Когда упомянутый игрок будет найден(если вообще имеется) перестанем искать ник в сообщении
        boolean checkAll=true;

        for(Player player:e.getRecipients()) {
            if(checkAll && message.contains(player.getName())) {
                // Игрок найден
                String name=player.getName();
                checkAll=false;
                player.sendMessage(baseFormat.replace("%2$s",message.replace(name,ChatColor.YELLOW+name+ChatColor.RESET));
                continue;
            }
            // Игрок не найден или мы забили болт на его поиски. Отправляем дефолтный формат
            player.sendMessage(format);
        }
        e.getRecipients().clear();
    }
У ChatEx должен быть меньший EventPriority. По идеи, должно редактироваться в конфиге плагина.
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх