Краш плагина (скорее всего, из-за BukkitRunnable)

Baroness's Dev

Разработчик
Пользователь
Имею вот такой скрипт в onJoin (20*5 указано в целях теста):
Java:
    @EventHandler
    public void join(PlayerJoinEvent e) throws InterruptedException {
        Player p = e.getPlayer();
        Thread.sleep(1000);
        final int[] clock = {-1};
        new BukkitRunnable() {
            @Override
            public void run() {
                clock[0]++;
                if (clock[0] == 1) {
                    p.sendMessage(ChatColor.AQUA + "Вы играете " + ChatColor.GOLD + clock[0] + ChatColor.AQUA + " час.");
                }
                if (clock[0] == 2 || clock[0] == 3 || clock[0] == 4) {
                    p.sendMessage(ChatColor.AQUA + "Вы играете уже " + ChatColor.GOLD + clock[0] + ChatColor.AQUA + " часа.");
                }
                if (clock[0] >= 5 && clock[0] <= 10 ) {
                    p.sendMessage(ChatColor.AQUA + "Вы играете уже " + ChatColor.GOLD + clock[0] + ChatColor.AQUA + " часов.");
                }
                if (clock[0] != 0) {
                    p.sendMessage(ChatColor.DARK_GREEN + "Не забывайте отдыхать.");
                }
            }
        }.runTaskTimer(Baroness.plugin, 0, 5*20);
//делал хэшмап уже, но версия с переменными выглядит гораздо лучше и удобнее в изменении
При входе игрока на сервер выводит следующее:
Java:
[20:41:49] [Server thread/ERROR]: Could not pass event PlayerJoinEvent to Baroness v1.0-SNAPSHOT
org.bukkit.event.EventException: null
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:69) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[RegisteredListener.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:503) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:488) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at net.minecraft.server.management.PlayerList.playerLoggedIn(PlayerList.java:475) [pl.class:?]
        at net.minecraft.server.management.PlayerList.initializeConnectionToPlayer(PlayerList.java:249) [pl.class:?]
        at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.completeServerSideConnection(NetworkDispatcher.java:260) [NetworkDispatcher.class:git-CatServer-1.12.2-3440193]
        at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.access$100(NetworkDispatcher.java:72) [NetworkDispatcher.class:git-CatServer-1.12.2-3440193]
        at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher$1.func_73660_a(NetworkDispatcher.java:205) [NetworkDispatcher$1.class:git-CatServer-1.12.2-3440193]
        at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:235) [gw.class:?]
        at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:187) [oz.class:?]
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:940) [MinecraftServer.class:?]
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:472) [nz.class:?]
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:782) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:636) [MinecraftServer.class:?]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]
Caused by: java.lang.IllegalArgumentException: Plugin cannot be null
        at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[commons-lang-2.6.jar:2.6]
        at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.validate(CraftScheduler.java:476) ~[CraftScheduler.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.runTaskTimer(CraftScheduler.java:147) ~[CraftScheduler.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.scheduler.BukkitRunnable.runTaskTimer(BukkitRunnable.java:111) ~[BukkitRunnable.class:git-CatServer-1.12.2-3440193]
        at com.baroness.handler.join(handler.java:51) ~[?:?]
        at catserver.server.executor.asm.generated.GeneratedEventExecutor111.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:67) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        ... 15 more
Как быть с этим? Всё выглядит нормально, компилятор не ругается, недавно всё работало. Я уже вроде закончил эту часть, хотел было писать другое, но тут возникла проблема
 

q20w26a

Разработчик
Пользователь
Во-первых, никогда, слышите, никогда в бакките не используйте Thread.sleep! Это же стопает весь поток, а сервер у нас однопоточный (в основном, ага ^_^)
Во-вторых, не очень понимаю зачем тебе массив.
 

Baroness's Dev

Разработчик
Пользователь
Компилятор захотел массив вместо просто переменной, я ему доверился)
Про sleep не знал. А что использовать для задержки? wait?
 

Baroness's Dev

Разработчик
Пользователь
Дело в том, что при входе игрока есть сообщение, которое не должно отправляться моментально. тк оно не вызовет ошибок, я его вырезал
Авто объединение сообщений:

Так что сделать то? Уже тысячу раз перепроверил код войда, ошибок не нашёл
 

q20w26a

Разработчик
Пользователь
Можешь создать отложенный таск BukkitRunnable#runTaskLater.
Забор из условий я бы заменил этим:

Java:
int awesomeInt = clock[0];
switch(awesomeInt) {
    case 1:
        //одно сообщение
    break;
    case 2:
        //второе сообщение
    break;
    case 3:
        //третье сообщение
    break;
    default:
        player.kick("атдахни, дурачок)))");
    break;
}
Авто объединение сообщений:

Так что сделать то? Уже тысячу раз перепроверил код войда, ошибок не нашёл
У тебя объект плагина null
Авто объединение сообщений:

Короче, cool guys делают так (ну я так делаю, не знаю как остальные):

Java:
public class Main extends JavaPlugin {
    private static Main instance;
   
    @Override
    public void onLoad() {
        instance = this;
    }
   
    public static Main getInstance() {
        return instance;
    }
}
Потом там, где нужно вставить наш плагин (например, в том же буккит рунабле):

Java:
public class MyListener implements Listener {
    private static Main pluginInstance = Main.getInstance();
   
    //...
    new BukkitRunnable() {
   
    //...
    }.runTaskTimer(pluginInstance, 0, 5*20);
    //...

}
 
Последнее редактирование:

Baroness's Dev

Разработчик
Пользователь
стоит ли делать private static Baroness pluginInstance = Baroness.getInstance() final?
Авто объединение сообщений:

Работает. Проблема решена.
 
Последнее редактирование:

BuseSo

Разработчик
Пользователь
offtop Я же тебе писал в другой теме не использовать Thread.sleep ...
 

Baroness's Dev

Разработчик
Пользователь
offtop Странно... Я хоть и читаю все ответы, не помню такого. Делать задержку через runTaskLater? Или wait можно юзать?
 

Комнаты в чате

Верх Низ