Помогите Хочу чтоб после команды /fly через 15 секунд флай убирался, но у меня не получается.

TheKrealisYT

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
_TheKrealisYT_
Сделал плагин, чтобы если у игрока определенное право, в нашем случае fly.admin, то при команде /fly, через 15 секунд флай вырубается.
Вот код:
public class Main extends JavaPlugin implements Runnable {

Player p;
Plugin plugin;

@Override
public void onEnable() {

}

@Override
public void run() {
long time = 20L * 15L;
if (p.hasPermission("fly.admin")) {
time = 20L * 60L;
}
Bukkit.getScheduler().runTaskLater(plugin, () -> p.setFlying(false), time);

}

}
Может быть, мне нужно зарегестрировать команду в плагине, убрать команду fly в plugin.yml у CMI(плагин на подобе essentials) и тогда все заработает? Если нет, то подскажите, что делать
 
Вы реализуете интерфейс Runnable, создаете метод run, но нигде его не вызываете. Почитайте про многопоточность в Java, поймёте хоть кто он такой, этот Runnable и как его использовать.

Вот вам мой вариант, основанный на событии PlayerToggleFlightEvent

Код:
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerToggleFlightEvent;

public class FlyEventListener implements Listener {
    private final Main plugin;

    FlyEventListener(Main plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void onPlayerFly(PlayerToggleFlightEvent e) {
        // Игрок сам выключил полёт или имеет недостаточно прав
        if (!e.isFlying() || !e.getPlayer().hasPermission("fly.admin")) return;
        Bukkit.getScheduler().runTaskLater(plugin, () -> e.getPlayer().setFlying(false), 300L);
    }
}

И регистрация слушателя в Main
Код:
@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(new FlyEventListener(this), this);
}

P.S. не забудьте изменить главный класс на свой + это самая простая реализация, можно еще поковыряться с задержкой
 
Последнее редактирование:
Вы реализуете интерфейс Runnable, создаете метод run, но нигде его не вызываете. Почитайте про многопоточность в Java, поймёте хоть кто он такой, этот Runnable и как его использовать.

Вот вам мой вариант, основанный на событии PlayerToggleFlightEvent

Код:
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerToggleFlightEvent;

public class FlyEventListener implements Listener {
    private final Main plugin;

    FlyEventListener(Main plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void onPlayerFly(PlayerToggleFlightEvent e) {
        // Игрок сам выключил полёт или имеет недостаточно прав
        if (!e.isFlying() || !e.getPlayer().hasPermission("fly.admin")) return;
        Bukkit.getScheduler().runTaskLater(plugin, () -> e.getPlayer().setFlying(false), 300L);
    }
}

И регистрация слушателя в Main
Код:
@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(new FlyEventListener(this), this);
}

P.S. не забудьте изменить главный класс на свой
Работает, спасибо огромное!
 
Вы реализуете интерфейс Runnable, создаете метод run, но нигде его не вызываете. Почитайте про многопоточность в Java, поймёте хоть кто он такой, этот Runnable и как его использовать.

Вот вам мой вариант, основанный на событии PlayerToggleFlightEvent

Код:
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerToggleFlightEvent;

public class FlyEventListener implements Listener {
    private final Main plugin;

    FlyEventListener(Main plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void onPlayerFly(PlayerToggleFlightEvent e) {
        // Игрок сам выключил полёт или имеет недостаточно прав
        if (!e.isFlying() || !e.getPlayer().hasPermission("fly.admin")) return;
        Bukkit.getScheduler().runTaskLater(plugin, () -> e.getPlayer().setFlying(false), 300L);
    }
}

И регистрация слушателя в Main
Код:
@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(new FlyEventListener(this), this);
}

P.S. не забудьте изменить главный класс на свой + это самая простая реализация, можно еще поковыряться с задержкой
Только вот, флай вырубается, но потом можно еще взлетать, как сделать так, чтобы через это же время выполнилась команда через консоль /fly player?
 
Только вот, флай вырубается, но потом можно еще взлетать, как сделать так, чтобы через это же время выполнилась команда через консоль /fly player?
Player.setAllowFlight(false);
А ещё, выполнять команды из консоли - костыль в данном случае.
 
Назад
Верх