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

LuckyZeeRo

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
i0xHeX
Короч проблема такая:
Мне нужно вызывать этот ивент (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);
}

В этом случае уже никто не получает сообщение кроме самого одного игрока. Значит ивент все-таки функционирует? Почему же при вызове у меня не выходит? Что я делаю не так?
 
Короч проблема такая:
Мне нужно вызывать этот ивент (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);
}

В этом случае уже никто не получает сообщение кроме самого одного игрока. Значит ивент все-таки функционирует? Почему же при вызове у меня не выходит? Что я делаю не так?
Попробуй отменять ивент, и отправлять определённым игрокам.
 
Попробуй отменять ивент, и отправлять определённым игрокам.
Не вариант, я хочу, чтобы Essentials форматировал сообщения, так как надо, а не мой плагин. Ну не обязательно ессенция. Любой плагин, который чат форматирует.
 
Короч проблема такая:
Мне нужно вызывать этот ивент (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);
}

В этом случае уже никто не получает сообщение кроме самого одного игрока. Значит ивент все-таки функционирует? Почему же при вызове у меня не выходит? Что я делаю не так?
Первый параметр должен быть true.
 
Сначала я подумал, мол ивент это просто ивент и никакого функционала не имеет
Ивент - это просто ивент. Сообщения отправляются отдельно от класса ивента. Он может отвечать только за результат.
 
Java:
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());
}

Проще говоря, вызывая эвент, ты спрашиваешь разрешение у других плагинов на свои действия. Если нельзя, то нельзя. Если можно, то плагины правят твои параметры если надо и желают удачи (нет).
 
Проще говоря, вызывая эвент, ты спрашиваешь разрешение у других плагинов на свои действия. Если нельзя, то нельзя. Если можно, то плагины правят твои параметры если надо и желают удачи (нет).
Да, я понимаю, что другие плагины отслеживают данный ивент и изменяют под свои потребности. Потому я это делал в тестовом режиме и никаких плагинов не подключал лишних. По сути, наверное вы правы про формат. Я об этом пока не задумывался. Возможно если нету формата, то не будет и сообщения. Это я попробую. А так пока обошелся без нового ивента. Спасибо всем за помощь.
 
Да, я понимаю, что другие плагины отслеживают данный ивент и изменяют под свои потребности. Потому я это делал в тестовом режиме и никаких плагинов не подключал лишних. По сути, наверное вы правы про формат. Я об этом пока не задумывался. Возможно если нету формата, то не будет и сообщения. Это я попробую. А так пока обошелся без нового ивента. Спасибо всем за помощь.
Ну так ты тупо бросил ивент, это еще не значит что сообщение отправлено. Это может быть полезно, чтоб заставить игрока открыть честкоманд например, но не для написания в чат.
Для формата можно заюзать тот же vault, гет префикс, гет суфикс.
 
Ну так ты тупо бросил ивент, это еще не значит что сообщение отправлено. Это может быть полезно, чтоб заставить игрока открыть честкоманд например, но не для написания в чат.
Для формата можно заюзать тот же vault, гет префикс, гет суфикс.
Сможешь навести пример полноценного кода, чтобы отправить сообщение от имени другого игрока, но всем игрокам, а выборочно?
Вот пусть мне нужно будет такой метод вызывать:
public void forceChat(Player executor, String message, Set<Player> receivers);
 
Сможешь навести пример полноценного кода, чтобы отправить сообщение от имени другого игрока, но всем игрокам, а выборочно?
Вот пусть мне нужно будет такой метод вызывать:
public void forceChat(Player executor, String message, Set<Player> receivers);
Ивент то тебе зачем дергать, luzver.sendMessage("").
Java:
        List<Player> players = Arrays.asList(new Player []{player1,player2,player3});
        for(Player player : players) {
            player.sendMessage(playersender.getName()+" message");
        }

Ну мыслю понял я думаю?
Только не забывай префикс и суффикс.
 
Кстати, в Bukkit API появился Player#chat(String). Можно его трогать, если надо просто рассылать сообщения от имени игрока.
 
А ведь правда. Player.chat(String) - как раз то, что сгодится в данном случае. Или как?
 
Ему нужно не всем игрокам отсылать, так что мой вариант подходит.
В любом случае без эвента никак. Другие плагины не смогут обработать сообщение. Да и с получением префикса и суффикса могут проблемы возникнуть.
Такй что твоей код можно пихать уже непосредственно в само событие, создаваемое при Player.chat(). А само событие, соответственно, отменять.
Костыльно, конечно, на в данной ситуации наиболее оптимально, как мне кажется...
 
В любом случае без эвента никак. Другие плагины не смогут обработать сообщение. Да и с получением префикса и суффикса могут проблемы возникнуть.
Такй что твоей код можно пихать уже непосредственно в само событие, создаваемое при Player.chat(). А само событие, соответственно, отменять.
Костыльно, конечно, на в данной ситуации наиболее оптимально, как мне кажется...
Так все плагины на чат работают, не знаешь, так молчал бы. Игрок пишет в чат, плагин ловит тот самый чат ивент и делает свою работу, кодом выше что я писал.
А на сам ивент ставится @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true), если это необходимо
 
Тогда напишет всем игрокам.
Пускай событие в нашем плагине обрабатывается в последнюю очередь. До этого другие плагины могут отменить изменить формат и текст сообщения, а то и вовсе отменить отправку и т.д.
Тогда напишет всем игрокам. Лучше не спорь.
Мы тут вообще-то не спорим, а помогаем ТСу найти оптимальное решение его вопроса. Срач никому не нужен.
 
Назад
Верх