Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
@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());
}
}
}
так допустим мне надо что бы игрок ник которого содержится в сообщении видел сообщение подчеркнутым.
Допустим хотел сделать проверку, если в строке содержится имя какого то игрока то, а как мне теперь всем вывести одно, но что бы у того игрока чьё имя указано вывелось другое?Код: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")) { } }
@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; }
Должны, там elseА при таком использовании все игроки увидят сообщение в чат?
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(); }
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);
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();
}
Покажи, как выглядит формат чата в 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
&7%prefix%displayname%suffix: %messageПокажи, как выглядит формат чата в ChatEx (конфиг)
&7%prefix%displayname%suffix: %message
@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();
}