1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем ShitCoder, 10 ноя 2018.

Статус темы:
Закрыта.
  1. Автор темы
    ShitCoder

    ShitCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    TheLastGapple
    Как сделать разное сообщение для разных игроков?
    Например одному игроку пишется это сообщение жёлтым, а другому белым.
    Это сообщение от другого игрока, а не от сервера.
     
  2. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ловить AsyncPlayerChatEvent и отправлять игрокам сообщения в зависимости от того что надо.
     
  3. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Если кратко - как-то так. Самый примитивный вариант, но показывает суть.
    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;
    }
     
  4. Автор темы
    ShitCoder

    ShitCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    TheLastGapple
    так допустим мне надо что бы игрок ник которого содержится в сообщении видел сообщение подчеркнутым.
    Код:
    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")) {
                
            }     
        }
    Допустим хотел сделать проверку, если в строке содержится имя какого то игрока то, а как мне теперь всем вывести одно, но что бы у того игрока чьё имя указано вывелось другое?
     
  5. Автор темы
    ShitCoder

    ShitCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    TheLastGapple
    Код:
        @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 сообщения не для всех игроков а только для того чей ник указан?
     
  6. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    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;
    }
     
  7. Автор темы
    ShitCoder

    ShitCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    TheLastGapple
    А при таком использовании все игроки увидят сообщение в чат?
     
  8. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Должны, там else
     
  9. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    AsyncPlayerChatEvent#getRecipients() - список получателей сообщения. Очищая его (e.getRecipients().clear()) - игроки не получат сообщение, однако вместо этого мы отправляем им своё.
    Почему просто не отменить ивент? - потому что такое сообщение не будет видно в консоли, и многие плагины, взаимодействующие с чатом, не услышат его.
     
  10. Автор темы
    ShitCoder

    ShitCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    TheLastGapple
    Код:
        @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();
        }
    С данным кодом, когда я пишу свой ник в чат, он не становиться жёлтого цвета.
     
  11. Автор темы
    ShitCoder

    ShitCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    TheLastGapple
    А можно ли как то не отправить это сообщение именно конкретному игроку?
     
  12. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ивент зареган? Проверь куда код доходит
    Да, просто if добавь где надо
     
  13. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Попробуй в лоб - вместо
    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(nameChatColor.YELLOW+name+ChatColor.RESET))
                    else 
    player.sendMessage(message);
     
  14. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Хитро... Почему я до этого не додумался?
    upload_2018-11-10_21-51-29.png
     
  15. Автор темы
    ShitCoder

    ShitCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    TheLastGapple
    Код:
        @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
     
    Последнее редактирование: 10 ноя 2018
  16. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Покажи, как выглядит формат чата в ChatEx (конфиг)
     
  17. Автор темы
    ShitCoder

    ShitCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    TheLastGapple
    &7%prefix%displayname%suffix: %message
     
  18. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    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. По идеи, должно редактироваться в конфиге плагина.
     
    Последнее редактирование: 11 ноя 2018
Статус темы:
Закрыта.

Поделиться этой страницей