BUKKIT: как ждать X времени до очереди

Итак, я программирую этот плагин Minecraft bukkit, и мне нужна помощь в том, как заставить плагин ждать определенное время перед выполнением строки кода. Потому что, если мы попробуем это:

Thread.sleep(4000);

Это фактически приостановит весь сервер на 4 секунды...

Поэтому я хочу код, который можно использовать в Bukkit, а не замораживать весь сервер. Вот мой код:

@EventHandler
public void bombSymptom (PlayerInteractEvent event) throws InterruptedException{
    final Player player = event.getPlayer();
    if (player == Bukkit.getPlayer("Viktoracri") && event.getItem() != null && event.getItem().getType() == Material.PUMPKIN && player.isOnGround() && player.getHealth() == 20){
        Location loc = event.getPlayer().getLocation();
        player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 100, 10));
        event.getPlayer().getWorld().createExplosion(loc, 3);
        player.setHealth(15);
        //Wait 1 sec
        player.setHealth(16);
        //Wait 2 sec
        player.setHealth(17);
        //Wait 1 sec
        player.setHealth(18);
        //Wait 1 sec
        player.setHealth(19);
    }
}

Может кто-нибудь, пожалуйста, дайте мне код, как это сделать? Я был бы очень признателен за это.


person Viktoracri    schedule 07.03.2016    source источник


Ответы (2)


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

Вы можете использовать bukkit расписания! Или, если вы хотите сделать что-то более продвинутое и быстрое, чем bukkit, вы можете использовать обычные потоки (просто обязательно создайте новый с помощью thread.start())

Вы можете использовать любой из них для счета от 15 до 19 с задержкой в ​​1 секунду. Или посчитайте от 0 до 4 и установите здоровье на число +15.

Для этого нам не нужно работать быстрее, чем майнкрафт, поэтому мы можем использовать расписания bukkit. Информация о расписании

final int run = Bukkit.getScheduler().scheduleSyncRepeatingTask(Core.getPlugin(), new Runnable()
{
    int i = 0;
    @Override
    public void run()
    {
        if (i > 4)
            Bukkit.getScheduler().cancelTask(run);
        player.setHealth(i + 15);
        i++;
    }
}, initDelay, loopDelay);

Задержка инициализации — это задержка в тиках перед ее запуском. Задержка цикла — это задержка в тиках между итерациями.

Помните, что в секунду 20 тиков, поэтому для вас это будет 0 для задержки инициализации и 20 для задержки цикла.

Если вам действительно нужна задержка для изменения, вы можете оставить ее равной одной секунде и подождать дополнительную итерацию, прежде чем продолжить.

person Lightspeed360    schedule 07.03.2016

Вы можете создать поток, который в основном будет работать вместе с сервером. Вы бы настроили класс потока следующим образом:

public class BombThread implements Runnable {

    public Player p;

    public BombThread (Player p) {
        this.p = p;
    }

    public void run() {
        p.setHealth(15); 
        Thread.sleep(1000);
        p.setHealth(16);
        Thread.sleep(2000);
        p.setHealth(17);
        Thread.sleep(1000);
        p.setHealth(18);
        Thread.sleep(1000);
        p.setHealth(19);
    }
}

Затем, чтобы запустить его, в вашем методе слушателя вы должны сделать:

BombThread thread = new BombThread(player);
thread.start();
person Fishy    schedule 27.07.2016