Войти или зарегистрироваться

Помогите Получение списка всех существующих команд сервера

  • Автор темы Автор темы ALis
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

ALis

Новичок
Пользователь
Баллы
6
Имя в Minecraft
ALis
Здравствуйте, мне ту понадобилось осуществить проверку на содержание определенной команды в чат-сообщении, и если она там есть, то окрасить ее(выделить в общем). Есть идеи как организовать? Буду благодарен
 
Тему не забудь закрыть.
 
Здравствуйте, мне ту понадобилось осуществить проверку на содержание определенной команды в чат-сообщении, и если она там есть, то окрасить ее(выделить в общем). Есть идеи как организовать? Буду благодарен
Для чего тебе список всех команд сервера для решения этой задачи?
У тебя есть список команд, которые ты хочешь запретить. Есть команда, которую игрок вводит, например, в PlayerCommandPreprocessEvent.
Парсишь из эвента основную команду без аргумента, проверяешь её наличие в своём списке и дальше действуешь по ситуации
 
Для чего тебе список всех команд сервера для решения этой задачи?
У тебя есть список команд, которые ты хочешь запретить. Есть команда, которую игрок вводит, например, в PlayerCommandPreprocessEvent.
Парсишь из эвента основную команду без аргумента, проверяешь её наличие в своём списке и дальше действуешь по ситуации
Я пробовал в самом PlayerChatEvent типо так
for (Map.Entry<String, Command> cmds : Bukkit.getCommandMap().getKnownCommands().entrySet()) {
if(e.getMessage().contains(cmds.getKey()) {
String newMessage = e.getMessage().replace(String.valueOf(cmds.getKey()), ChatColor.AQUA+String.valueOf(cmds.getKey()));
}
}

*И через cmds.getValue() тоже пробовал
Есть прикидка как организовать не выходя из ChatEvent?
 
Я пробовал в самом PlayerChatEvent типо так
for (Map.Entry<String, Command> cmds : Bukkit.getCommandMap().getKnownCommands().entrySet()) {
if(e.getMessage().contains(cmds.getKey()) {
String newMessage = e.getMessage().replace(String.valueOf(cmds.getKey()), ChatColor.AQUA+String.valueOf(cmds.getKey()));
}
}

*И через cmds.getValue() тоже пробовал
Есть прикидка как организовать не выходя из ChatEvent?
Я правильно понял, что ты хочешь красить все команды сервера, а не какие-то конкретные?

В таком случае твой код должен работать. Единственное, что ты не назначаешь эвенту новое значение. У тебя переменная newMessage не используется.

Но проблема в том, что на сервере может быть несколько тысяч команд, в результате чего твой код может быть довольно ресурсозатратным.
Я бы предложил искать в строке команды при помощи регулярного выражения, и уже затем при необходимости окрашивать эти команды (если они существуют на сервере)
 
Для чего тебе список всех команд сервера для решения этой задачи?
У тебя есть список команд, которые ты хочешь запретить. Есть команда, которую игрок вводит, например, в PlayerCommandPreprocessEvent.
Парсишь из эвента основную команду без аргумента, проверяешь её наличие в своём списке и дальше действуешь по ситуации
Вроде суть в том, чтобы подсветить команду, а не что-то заблокировать.
Я пробовал в самом PlayerChatEvent типо так
for (Map.Entry<String, Command> cmds : Bukkit.getCommandMap().getKnownCommands().entrySet()) {
if(e.getMessage().contains(cmds.getKey()) {
String newMessage = e.getMessage().replace(String.valueOf(cmds.getKey()), ChatColor.AQUA+String.valueOf(cmds.getKey()));
}
}

*И через cmds.getValue() тоже пробовал
Есть прикидка как организовать не выходя из ChatEvent?
PlayerChatEvent не стоит использовать - он заставляет весь чат работать в основном потоке. Вместо этого следует предпочесть AsyncPlayerChatEvent.
Команд на сервере может быть очень много. Вместо текущей реализации советовал бы обратный порядок - сначала искать команду в сообщении, и уже потом проверять её наличие на сервере. Это можно сделать через Matcher.
PHP:
private static final Pattern COMMAND_PATTERN = Pattern.compile("/(\\w+)");
// ...
public static String highlightCommands(String text) {
    Matcher matcher = COMMAND_PATTERN.matcher(text);
    StringBuilder builder = new StringBuilder(text.length());
    Set<String> commands = Bukkit.getCommandMap().getKnownCommands().keySet();
    while (matcher.find()) {
        if (commands.contains(matcher.group(1).toLowerCase(Locale.ROOT)) {
            matcher.appendReplacement(builder,  ""); // Ничего не вставляем, чтоб сделать это вручную
            builder.append(ChatColor.AQUA).append(matcher.group()).append(ChatColor.RESET);
        }
    }
    return matcher.appendTail(builder).toString();
}
 
Я правильно понял, что ты хочешь красить все команды сервера, а не какие-то конкретные?

В таком случае твой код должен работать. Единственное, что ты не назначаешь эвенту новое значение. У тебя переменная newMessage не используется.

Но проблема в том, что на сервере может быть несколько тысяч команд, в результате чего твой код может быть довольно ресурсозатратным.
Я бы предложил искать в строке команды при помощи регулярного выражения, и уже затем при необходимости окрашивать эти команды (если они существуют на сервере)
Вроде суть в том, чтобы подсветить команду, а не что-то заблокировать.

PlayerChatEvent не стоит использовать - он заставляет весь чат работать в основном потоке. Вместо этого следует предпочесть AsyncPlayerChatEvent.
Команд на сервере может быть очень много. Вместо текущей реализации советовал бы обратный порядок - сначала искать команду в сообщении, и уже потом проверять её наличие на сервере. Это можно сделать через Matcher.
PHP:
private static final Pattern COMMAND_PATTERN = Pattern.compile("/(\\w+)");
// ...
public static String highlightCommands(String text) {
    Matcher matcher = COMMAND_PATTERN.matcher(text);
    StringBuilder builder = new StringBuilder(text.length());
    Set<String> commands = Bukkit.getCommandMap().getKnownCommands().keySet();
    while (matcher.find()) {
        if (commands.contains(matcher.group(1).toLowerCase(Locale.ROOT)) {
            matcher.appendReplacement(builder,  ""); // Ничего не вставляем, чтоб сделать это вручную
            builder.append(ChatColor.AQUA).append(matcher.group()).append(ChatColor.RESET);
        }
    }
    return matcher.appendTail(builder).toString();
}
Окей, все попробую, спасибо за советы, чуть что - еще вернусь)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх