Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Создание и вызов своего AsyncPlayerChatEvent

Тема в разделе "Разработка плагинов для новичков", создана пользователем LuckyZeeRo, 15 июл 2016.

  1. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Короч проблема такая:
    Мне нужно вызывать этот ивент (AsyncPlayerChatEvent) от имени конкретного игрока и некоторым игрокам.
    Что я делаю:
    Код:
    Set<Player> recipients = new HashSet<>();
    recipients.add(player);
    AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(false, player, "Message", recipients);
    Bukkit.getServer().getPluginManager().callEvent(event);
    Проблема: Ивент вызывается (проверял через Listener), но нигде не видно сообщение.
    Сначала я подумал, мол ивент это просто ивент и никакого функционала не имеет, НО:
    Когда я перехватываю допустим ивент от игрока, который шлет сообщение, я могу изменить получателей на лету, и оно будет работать:
    Код:
    public void onChat(AsyncPlayerChatEvent e) {
    Set<Player> recipients = e.getRecipients();
    recipients.removeAll(recipients);
    recipients.add(player);
    }

    В этом случае уже никто не получает сообщение кроме самого одного игрока. Значит ивент все-таки функционирует? Почему же при вызове у меня не выходит? Что я делаю не так?
     
  2. Хостинг MineCraft
    <
  3. MrTrojan

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

    Баллы:
    98
    Skype:
    mrtrojan.ru
    Имя в Minecraft:
    MrTrojan
    Попробуй отменять ивент, и отправлять определённым игрокам.
     
  4. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Не вариант, я хочу, чтобы Essentials форматировал сообщения, так как надо, а не мой плагин. Ну не обязательно ессенция. Любой плагин, который чат форматирует.
     
  5. Larin

    Larin Старожил Пользователь

    Баллы:
    103
    Первый параметр должен быть true.
     
  6. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Не помогало. Пробовал.
     
  7. Larin

    Larin Старожил Пользователь

    Баллы:
    103
  8. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Ивент - это просто ивент. Сообщения отправляются отдельно от класса ивента. Он может отвечать только за результат.
     
  9. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Код:
    Set<Player> recipients = new HashSet<>();
    recipients.addAll(Bukkit.getServer().getOnlinePlayers()); // Тут может быть ошибка
    AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(false, player, "Message", recipients);
    Bukkit.getServer().getPluginManager().callEvent(event);
    if (event.isCancelled()) {
        return;
    }
    for (Player p : recipients) {
        //А тут вообще по формату надо, да. Но я не помню его.
        p.sendMessage("<"+event.getPlayer().getName()+"> "+event.getMessage());
    }
    Проще говоря, вызывая эвент, ты спрашиваешь разрешение у других плагинов на свои действия. Если нельзя, то нельзя. Если можно, то плагины правят твои параметры если надо и желают удачи (нет).
     
  10. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Да, я понимаю, что другие плагины отслеживают данный ивент и изменяют под свои потребности. Потому я это делал в тестовом режиме и никаких плагинов не подключал лишних. По сути, наверное вы правы про формат. Я об этом пока не задумывался. Возможно если нету формата, то не будет и сообщения. Это я попробую. А так пока обошелся без нового ивента. Спасибо всем за помощь.
     
  11. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ну так ты тупо бросил ивент, это еще не значит что сообщение отправлено. Это может быть полезно, чтоб заставить игрока открыть честкоманд например, но не для написания в чат.[DOUBLEPOST=1468839431,1468839173][/DOUBLEPOST]Для формата можно заюзать тот же vault, гет префикс, гет суфикс.
     
  12. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Сможешь навести пример полноценного кода, чтобы отправить сообщение от имени другого игрока, но всем игрокам, а выборочно?
    Вот пусть мне нужно будет такой метод вызывать:
    public void forceChat(Player executor, String message, Set<Player> receivers);
     
  13. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ивент то тебе зачем дергать, luzver.sendMessage("").[DOUBLEPOST=1468844355,1468843968][/DOUBLEPOST]
    Код:
            List<Player> players = Arrays.asList(new Player []{player1,player2,player3});
            for(Player player : players) {
                player.sendMessage(playersender.getName()+" message");
            }
    [DOUBLEPOST=1468844609][/DOUBLEPOST]Ну мыслю понял я думаю?[DOUBLEPOST=1468844797][/DOUBLEPOST]Только не забывай префикс и суффикс.
     
  14. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Кстати, в Bukkit API появился Player#chat(String). Можно его трогать, если надо просто рассылать сообщения от имени игрока.
     
  15. Dymeth

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

    Баллы:
    76
    А ведь правда. Player.chat(String) - как раз то, что сгодится в данном случае. Или как?
     
  16. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ему нужно не всем игрокам отсылать, так что мой вариант подходит.
     
  17. Dymeth

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

    Баллы:
    76
    В любом случае без эвента никак. Другие плагины не смогут обработать сообщение. Да и с получением префикса и суффикса могут проблемы возникнуть.
    Такй что твоей код можно пихать уже непосредственно в само событие, создаваемое при Player.chat(). А само событие, соответственно, отменять.
    Костыльно, конечно, на в данной ситуации наиболее оптимально, как мне кажется...
     
  18. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Так все плагины на чат работают, не знаешь, так молчал бы. Игрок пишет в чат, плагин ловит тот самый чат ивент и делает свою работу, кодом выше что я писал.[DOUBLEPOST=1468918344,1468918152][/DOUBLEPOST]А на сам ивент ставится @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true), если это необходимо
     
  19. Dymeth

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

    Баллы:
    76
    А я про что говорю? Player.chat() + обработка AsyncPlayerChatEvent...
     
  20. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Тогда напишет всем игрокам. Лучше не спорь.
     
  21. Dymeth

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

    Баллы:
    76
    Пускай событие в нашем плагине обрабатывается в последнюю очередь. До этого другие плагины могут отменить изменить формат и текст сообщения, а то и вовсе отменить отправку и т.д.
    Мы тут вообще-то не спорим, а помогаем ТСу найти оптимальное решение его вопроса. Срач никому не нужен.
     

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