Помогите Очерёдность вывода сообщений в чат

Zangooron

Активный участник
Пользователь
Баллы
61
Здравствуйте. Пробую писать плагин чат-бота, который отлавливает в чате ключевые слова, и выдаёт рандомно заранее прописанные ответы. Столкнулся с такой проблемой: при написании фразы, содержащей ключевое слово в чат, сначала выводится сообщение бота, затем моя фраза, на которую он должен среагировать. Хотелось бы наоборот, чтоб сначала выводилась фраза, содержащая ключевое слово, а затем ответ бота. Версия bukkit API bukkit-1.7.10-R0.1-20140817.175650-8
Подскажите пожалуйста, что я делаю не так?
Вот код листенера:
Код:
@EventHandler(priority= EventPriority.HIGH)
        public boolean onPlayerChat(AsyncPlayerChatEvent event){
        if (Main.BotAI) {                                   // Если в конфиге стоит true
            Player player = event.getPlayer();
            String txt = event.getMessage();
            String msg = txt.toLowerCase();
            String botName = "" + (Object)ChatColor.DARK_RED + (Object)ChatColor.BOLD + "[BOT] Steve ";
            String botMsgColor = "" + (Object)ChatColor.GOLD;
            if (msg.contains("привет") || msg.contains("hi") ||  msg.contains("здарова") || msg.contains("добрый день")) {
                Random randomGen = new Random();
                int randomInt = randomGen.nextInt(10);
                if (randomInt == 0) {
                    player.sendMessage(botName + botMsgColor + "Привет, рад тебя видеть...");
                }
                if (randomInt == 1) {
                    player.sendMessage(botName + botMsgColor + "Здарова, давненько тебя не было...");
                }
                if (randomInt == 4) {
                    player.sendMessage(botName + botMsgColor + "Добрый день...");
                }
                if (randomInt == 3) {
                    player.sendMessage(botName + botMsgColor + "Привет! Приятной игры...");
                }
                if (randomInt == 2) {
                    player.sendMessage(botName + botMsgColor + "Сколько лет, сколько зим! Привет!...");
                }
                if (randomInt == 5) {
                    player.sendMessage(botName + botMsgColor + "Какие люди... Добро пожаловать!");
                }
                return true;
            }
            return false;
        }

        return false;
    }
 
Это так потому, что событие чата возникает перед тем, как выведется сообщение, тебе нужно сделать таск, который будет выполняться сразу же после этого события.
Код:
public boolean onPlayerChat(AsyncPlayerChatEvent event) {
    Bukkit.getServer().getScheduler().runTask(plugin, new Runnable() {
        public void run() {
            ... // Тут твой код с выводом сообщений
        }
    });
}
 
int randomInt = randomGen.nextInt(10); if (randomInt == 0) { player.sendMessage(botName + botMsgColor + "Привет, рад тебя видеть..."); } if (randomInt == 1) { player.sendMessage(botName + botMsgColor + "Здарова, давненько тебя не было..."); } if (randomInt == 4) { player.sendMessage(botName + botMsgColor + "Добрый день..."); } if (randomInt == 3) { player.sendMessage(botName + botMsgColor + "Привет! Приятной игры..."); } if (randomInt == 2) { player.sendMessage(botName + botMsgColor + "Сколько лет, сколько зим! Привет!..."); } if (randomInt == 5) { player.sendMessage(botName + botMsgColor + "Какие люди... Добро пожаловать!"); }
switch для слабаков!
 
Изменил код следующим образом:
Код:
@EventHandler(priority= EventPriority.HIGH)
    public boolean onPlayerChat(AsyncPlayerChatEvent event) {
        Bukkit.getServer().getScheduler().runTask(plugin, new Runnable() {
            public void run() {
                if (Main.BotAI) {
                    Player player = event.getPlayer();
                    String abc = event.getMessage();
                    String msg = abc.toLowerCase();
                    String botName = "" + (Object)ChatColor.DARK_RED + (Object)ChatColor.BOLD + "[MOD] Steve ";
                    String botMsgColor = "" + (Object)ChatColor.GOLD;
                    if (msg.contains("привет") || msg.contains("hi") ||  msg.contains("здарова") ||  msg.contains("добрый день")) {
                        Random randomGen = new Random();
                        int randomInt = randomGen.nextInt(10);
                        if (randomInt == 0) {
                            player.sendMessage(botName + botMsgColor + "Привет, рад тебя видеть...");
                        }
                        if (randomInt == 1) {
                            player.sendMessage(botName + botMsgColor + "Здарова, давненько тебя не было...");
                        }
                        if (randomInt == 4) {
                            player.sendMessage(botName + botMsgColor + "Добрый день...");
                        }
                        if (randomInt == 3) {
                            player.sendMessage(botName + botMsgColor + "Привет! Приятной игры...");
                        }
                        if (randomInt == 2) {
                            player.sendMessage(botName + botMsgColor + "Сколько лет, сколько зим! Привет!...");
                        }
                        if (randomInt == 5) {
                            player.sendMessage(botName + botMsgColor + "Какие люди... Добро пожаловать!");
                        }
                    }
                }
            }
        });
    return false;
    }

При написании в чат сообщения, в консоли выскакивает ошибка:
Код:
[23:50:14 ERROR]: Could not pass event PlayerChatEvent to ChatBot v0.1
org.bukkit.event.EventException
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:509) [spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:494) [spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at net.minecraft.server.v1_7_R4.PlayerConnection$4.evaluate(PlayerConnection.java:974) [spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at org.bukkit.craftbukkit.v1_7_R4.util.Waitable.run(Waitable.java:24) [spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:647) [spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
Caused by: java.lang.IllegalArgumentException: Plugin cannot be null
    at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.validate(CraftScheduler.java:397) ~[spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.runTaskTimer(CraftScheduler.java:123) ~[spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.runTaskLater(CraftScheduler.java:106) ~[spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.runTask(CraftScheduler.java:89) ~[spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    at ru.zango.chatbot.PlayerListener.onPlayerChat(PlayerListener.java:30) ~[?:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_141]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_141]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_141]
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:298) ~[spigot-1.7.10-SNAPSHOT-b1657.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
    ... 10 more
 
switch для слабаков!
Switch будет потом, сначала надо разобраться с очерёдностью, затем оптимизация. Мне так более наглядней, через условия. Я просто только начинаю этим заниматься, поэтому не всё идеально.
 
Switch будет потом, сначала надо разобраться с очерёдностью, затем оптимизация. Мне так более наглядней, через условия. Я просто только начинаю этим заниматься, поэтому не всё идеально.
Дак ты инициализируй plugin. Это обьект типа Plugin, может быть взят из твоего класса который наследует JavaPlugin как this, или через:
Код:
plugin = Bukkit.getServer().getPluginManager().getPlugin("Название твоего плагина");
 
Дак ты инициализируй plugin. Это обьект типа Plugin, может быть взят из твоего класса который наследует JavaPlugin как this, или через:
Код:
plugin = Bukkit.getServer().getPluginManager().getPlugin("Название твоего плагина");
Большое спасибо за помощь. Всё получилось.
 
Random randomGen = new Random(); int randomInt = randomGen.nextInt(10); if (randomInt == 0) { player.sendMessage(botName + botMsgColor + "Привет, рад тебя видеть..."); } if (randomInt == 1) { player.sendMessage(botName + botMsgColor + "Здарова, давненько тебя не было..."); } if (randomInt == 4) { player.sendMessage(botName + botMsgColor + "Добрый день..."); } if (randomInt == 3) { player.sendMessage(botName + botMsgColor + "Привет! Приятной игры..."); } if (randomInt == 2) { player.sendMessage(botName + botMsgColor + "Сколько лет, сколько зим! Привет!..."); } if (randomInt == 5) { player.sendMessage(botName + botMsgColor + "Какие люди... Добро пожаловать!"); }
Код:
String[] strings = {"Привет, рад тебя видеть...", "Здарова, давненько тебя не было...", "Добрый день...", "Привет! Приятной игры...", "Сколько лет, сколько зим! Привет!...", "Какие люди... Добро пожаловать!"};
Random randomGen = new Random();
int randomInt = randomGen.nextInt(strings.length);
player.sendMessage(botName + botMsgColor + strings[randomInt]);
Не проще так?
 
Код:
String[] strings = {"Привет, рад тебя видеть...", "Здарова, давненько тебя не было...", "Добрый день...", "Привет! Приятной игры...", "Сколько лет, сколько зим! Привет!...", "Какие люди... Добро пожаловать!"};
Random randomGen = new Random();
int randomInt = randomGen.nextInt(strings.length);
player.sendMessage(botName + botMsgColor + strings[randomInt]);
Не проще так?
А еще лучше колекции юзать
 
А причем тут ты?
Вообще без понятия. Я тебе к примеру говорю. Например ты хочешь юзать массив строк, вместо колекции. Я тебе говорю то, что это повлечет ограничения, что если я захочу добавлять командой в какой-то момент строки в этот массив я это не смогу, так как нет расширяемости.
 
Вообще без понятия. Я тебе к примеру говорю. Например ты хочешь юзать массив строк, вместо колекции. Я тебе говорю то, что это повлечет ограничения, что если я захочу добавлять командой в какой-то момент строки в этот массив я это не смогу, так как нет расширяемости.
Не так сложно пересоздать массив с длинной + 1 и добавить ещё один элемент туда.
Не думаю, что подобная операция будет происходить очень часто.
 
Не так сложно пересоздать массив с длинной + 1 и добавить ещё один элемент туда.
Не думаю, что подобная операция будет происходить очень часто.
А еще лучше создать колекцию которая почти не проигрывает в скорости масиву
 
Назад
Верх