- Баллы
- 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;
}
Во первых, забыл @Override public void run() {}.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;
}
Check at the previous messageМожно ли начать таймер после того, как игрок наступил на плиту? Можно полным кодом, пожалуйста.
А сервер от PlayerInteractEvent, будет жить от такого количества шедулеров?Хз на счет того, как проверить наступил ли на плиту, но как вариант проверять локацию этой плиты
Код: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. Вроде все
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);
}
}
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); } }
timerFactory.makeFixedTimer(100 (до скольки будет идти), 20 (интервал в тактах 20 тактов = 1 сек), () -> { //YOUR CODE }).start();Можно пример использования?
Не особо понял, как юзать код сюда?timerFactory.makeFixedTimer(100 (до скольки будет идти), 20 (интервал в тактах 20 тактов = 1 сек), () -> { //YOUR CODE });
Сделай переменную и метод для увеличения переменной и запихни в Runnable. Либо переделай под себя FixedTimer будет проще.Не особо понял, как юзать код сюда?
Score score4 = objective.getScore("Время: ");
score4.setScore(8);
Знаешь, ты тоже бред написалЧет парашу написал.
ТС, юзай что-то по типу этого:
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 секунд, или отменять его, если игрок ушёл с плиты.