Помогите Счётчик времени

Статус
Закрыто для дальнейших ответов.

ImperatorBuzz

Участник
Пользователь
Баллы
36
Имя в Minecraft
ImperatorBuzov
Здравствуйте, хочу реализовать счётчик времени, чтобы каждую 1 секунду прибавлялось число.

Пытался реализовать шедулером, но накосячил
 
Хз на счет того, как проверить наступил ли на плиту, но как вариант проверять локацию этой плиты
Код:
Main plugin;

public PlayerInteract(Main plugin) {
    this.plugin = plugin;
}

@EventHandler
public void onPlayerInteract(PlayerInteractEvent e) {
    if (plugin.isTimer())
        plugin.getRunnable().runTaskLater(Main.class, 20L); // Main.class - если в главном классе таймер, то ставь this, если же в другом, сделай конструктор и ставь plugin. 20L - 1 секунда
}

Class Main

private BukkitRunnable runnable;
private boolean isTimer;

public void onEnable() {
    runnable = new BukkitRunnable() {
        int counter = 0;
        isTimer = true;
        @Override
        public void run() {
             counter++;
             if (counter > 120) {
                 isTimer = false;
                 cancel(); // Если counter > 120, то таймер останавливается
            }
        }
    }
}

public BukkitRunnable getRunnable() {
    return runnable;
}

public boolean isTimer() {
     return isTimer;
}
 
Последнее редактирование:
int counter;
new BukkitRunnable() {
counter++;
if (counter > 120) cancel(); // Если counter > 120, то таймер останавливается
}.runTaskLater(Main.class, 20L); // Main.class - если в главном классе таймер, то ставь this, если же в другом, сделай конструктор и ставь plugin. 20L - 1 секунда

Main plugin;
public Class_Name(Main plugin) {
this.plugin = plugin;
}
Можно ли начать таймер после того, как игрок наступил на плиту? Можно полным кодом, пожалуйста.
 
int counter;
new BukkitRunnable() {
counter++;
if (counter > 120) cancel(); // Если counter > 120, то таймер останавливается
}.runTaskLater(Main.class, 20L); // Main.class - если в главном классе таймер, то ставь this, если же в другом, сделай конструктор и ставь plugin. 20L - 1 секунда

Main plugin;
public Class_Name(Main plugin) {
this.plugin = plugin;
}
Во первых, забыл @Override public void run() {}.
Во вторых, в анонимном классе можно использовать только final или условно-завершенные переменные, ты не можешь использовать там counter++.
 
Хз на счет того, как проверить наступил ли на плиту, но как вариант проверять локацию этой плиты
Код:
Main plugin;

public PlayerInteract(Main plugin) {
    this.plugin = plugin;
}

@EventHandler
public void onPlayerInteract(PlayerInteractEvent e) {
  
    new BukkitRunnable() {
        int counter = 0;
        @Override
        public void run() {
             counter++;
             if (counter > 120) cancel(); // Если counter > 120, то таймер останавливается
        }
    }.runTaskLater(Main.class, 20L); // Main.class - если в главном классе таймер, то ставь this, если же в другом, сделай конструктор и ставь plugin. 20L - 1 секунда
}
А сервер от PlayerInteractEvent, будет жить от такого количества шедулеров?
 
Блен, опять я накосячил, ща поправлю

UPD. Вроде все
Чет парашу написал.

ТС, юзай что-то по типу этого:
PHP:
public class FixedTimer extends BukkitRunnable {

    private Plugin plugin;
    private int amount;
    private int ticks;
    private Runnable runnable;
    private int progress;

    FixedTimer(Plugin plugin, int amount, int ticks, Runnable runnable) {
        this.plugin = plugin;
        this.amount = amount;
        this.ticks = ticks;
        this.runnable = runnable;
    }

    private void check() {
        if (++progress >= amount) {
            this.cancel();
        }
    }

    @Override
    public void run() {
        runnable.run();
        this.check();
    }

    public void start() {
        runTaskTimer(plugin, 0L, ticks);
    }
}

PHP:
public class TimerFactory {

    private Plugin plugin;

    public TimerFactory(Plugin plugin) {
        this.plugin = plugin;
    }

    public FixedTimer makeFixedTimer(int amount, int ticks, Runnable runnable) {
        return new FixedTimer(plugin, amount, ticks, runnable);
    }
}
 
Чет парашу написал.

ТС, юзай что-то по типу этого:
PHP:
public class FixedTimer extends BukkitRunnable {

    private Plugin plugin;
    private int amount;
    private int ticks;
    private Runnable runnable;
    private int progress;

    FixedTimer(Plugin plugin, int amount, int ticks, Runnable runnable) {
        this.plugin = plugin;
        this.amount = amount;
        this.ticks = ticks;
        this.runnable = runnable;
    }

    private void check() {
        if (++progress >= amount) {
            this.cancel();
        }
    }

    @Override
    public void run() {
        runnable.run();
        this.check();
    }

    public void start() {
        runTaskTimer(plugin, 0L, ticks);
    }
}

PHP:
public class TimerFactory {

    private Plugin plugin;

    public TimerFactory(Plugin plugin) {
        this.plugin = plugin;
    }

    public FixedTimer makeFixedTimer(int amount, int ticks, Runnable runnable) {
        return new FixedTimer(plugin, amount, ticks, runnable);
    }
}
Можно пример использования?
 
Последнее редактирование:
Не особо понял, как юзать код сюда?
Score score4 = objective.getScore("Время: ");
score4.setScore(8);
Сделай переменную и метод для увеличения переменной и запихни в Runnable. Либо переделай под себя FixedTimer будет проще.
 
Чет парашу написал.

ТС, юзай что-то по типу этого:
PHP:
public class FixedTimer extends BukkitRunnable {

    private Plugin plugin;
    private int amount;
    private int ticks;
    private Runnable runnable;
    private int progress;

    FixedTimer(Plugin plugin, int amount, int ticks, Runnable runnable) {
        this.plugin = plugin;
        this.amount = amount;
        this.ticks = ticks;
        this.runnable = runnable;
    }

    private void check() {
        if (++progress >= amount) {
            this.cancel();
        }
    }

    @Override
    public void run() {
        runnable.run();
        this.check();
    }

    public void start() {
        runTaskTimer(plugin, 0L, ticks);
    }
}

PHP:
public class TimerFactory {

    private Plugin plugin;

    public TimerFactory(Plugin plugin) {
        this.plugin = plugin;
    }

    public FixedTimer makeFixedTimer(int amount, int ticks, Runnable runnable) {
        return new FixedTimer(plugin, amount, ticks, runnable);
    }
}
Знаешь, ты тоже бред написал
 
Таймер вообще не нужен, если нет необходимости выводить его значение игроку.
Достаточно запланировать "успешный исход" через N секунд, или отменять его, если игрок ушёл с плиты.
 
Таймер вообще не нужен, если нет необходимости выводить его значение игроку.
Достаточно запланировать "успешный исход" через N секунд, или отменять его, если игрок ушёл с плиты.
Ему это надо в скорбоард вывести
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх