Ir para conteúdo
  • 0

Scheduler erro


Frogguer

Pergunta

eav945fsS8y9Sg4-HNz4Nw.png


JmOu-w5CRO6y6HRno4LALw.png


 


o código



public class APIScheduler
{
private static BukkitTask task;
private static BukkitTask asyncTask;
private static Set<ScheduledTask> tasks;
private static Set<ScheduledTask> asyncTasks;
private static Set<ScheduledTask> toRemove;

private static void init() {
if (APIScheduler.tasks.isEmpty()) {
APIScheduler.task = Bukkit.getScheduler().runTaskTimer(Main.getInstance(), new Runnable() {
@Override
public void run() {
if (APIScheduler.toRemove.isEmpty()) {
APIScheduler.tasks.removeAll((APIScheduler.toRemove));
APIScheduler.toRemove.clear();
}
if (APIScheduler.tasks.isEmpty()) {
APIScheduler.task.cancel();
APIScheduler.task = null;
}
for (ScheduledTask task : (APIScheduler.tasks)) {
APIScheduler.tasks.remove(task);
if (task.aux == task.value * task.unit.getTicks()) {
if (task.runnable.iterations >= 0 && task.runnable.aux == task.runnable.iterations) {
task.runnable.run();
task.cancel();
continue;
}
task.aux = 1;
task.runnable.run();
task.runnable.aux++;
}
else {
task.aux++;
}
APIScheduler.tasks.add(task);
}
}
}, 0L, 1L);
}
}

public static ScheduledTask startTask(TaskRunnable runnable, int value, SchedulerUnit unit) {
return startAutoTask(runnable, -1, value, unit, false);
}

public static ScheduledTask startDelayedTask(TaskRunnable runnable, int value, SchedulerUnit unit) {
return startAutoTask(runnable, 1, value, unit, false);
}

public static ScheduledTask startAutoTask(TaskRunnable runnable, int iterations, int value, SchedulerUnit unit) {
return startAutoTask(runnable, iterations, value, unit, false);
}

private static ScheduledTask startAutoTask(TaskRunnable runnable, int iterations, int value, SchedulerUnit unit, boolean async) {
ScheduledTask localTask = new ScheduledTask(runnable, value, unit);
runnable.task = localTask;
runnable.iterations = iterations;
if (iterations != 1) {
localTask.runnable.run();
}
if (async) {
APIScheduler.asyncTasks.add(localTask);
if (APIScheduler.asyncTask == null) {
init();
}
}
else {
APIScheduler.tasks.add(localTask);
if (APIScheduler.task == null) {
init();
}
}
return localTask;
}

static {
APIScheduler.task = null;
APIScheduler.asyncTask = null;
APIScheduler.tasks = new HashSet<ScheduledTask>();
APIScheduler.asyncTasks = new HashSet<ScheduledTask>();
APIScheduler.toRemove = new HashSet<ScheduledTask>();
}

public abstract static class TaskRunnable implements Runnable
{
private ScheduledTask task;
private int aux;
private int iterations;

public TaskRunnable() {
this.aux = 1;
this.iterations = -1;
}

public void cancel() {
this.task.cancel();
}

public int getAux() {
return this.aux;
}
}

public enum SchedulerUnit
{
TICK(1),
SECOND(20),
MINUTE(1200),
HOUR(72000),
DAY(1728000);

private int ticks;

private SchedulerUnit(int multi) {
this.ticks = multi;
}

public int getTicks() {
return this.ticks;
}
}

public static class ScheduledTask
{
private int aux;
private int value;
private SchedulerUnit unit;
private TaskRunnable runnable;

public ScheduledTask(TaskRunnable r, int v, SchedulerUnit u) {
this.aux = 1;
this.runnable = r;
this.value = v;
this.unit = u;
}

public int getAux() {
return this.aux;
}

public void cancel() {
if (APIScheduler.toRemove.contains(this)) {
APIScheduler.toRemove.add(this);
}
}
}
}
 

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

 

é que a classe toda esta assim 

public class AutoMessages
{
    private static int actual;
    private static List<String> messages;
    
    public static void insert() {
    	File file = new File(Main.getInstance().getDataFolder(), "autoMessages.yml");
        YamlConfiguration messages = YamlConfiguration.loadConfiguration(file);
        AutoMessages.messages = messages.getStringList("autoMessages");
        APIScheduler.startTask(new APIScheduler.TaskRunnable() {
            @Override
            public void run() {
                if (AutoMessages.actual >= AutoMessages.messages.size()) {
                    AutoMessages.actual = 0;
                }
                Bukkit.broadcastMessage("§6"+AutoMessages.messages.get(AutoMessages.actual).replace("&", "§").replace(";", ":"));
                AutoMessages.actual++;
            }
        }, 3, APIScheduler.SchedulerUnit.MINUTE);
    }
}

 

Se AutoMessages.messages tiver vazia vai dar erro. Coloca if (AutoMessages.messages.isEmpty()) return; no run()

Link para o comentário
Compartilhar em outros sites

o que te impede de usar o BukkitRunnable? ele ja é uma api porque precisaria de outra?

 

Você ao menos entendeu o propósito da API que o autor do tópico esta usando?

 

@Topic

Qual o tipo de exception que dá?

Link para o comentário
Compartilhar em outros sites

Posta a classe AutoMessages (ou só a linha 25 dela)

AutoMessages.actual++;

 

 

 

 

 

            public void run() {
                if (AutoMessages.actual >= AutoMessages.messages.size()) {
                    AutoMessages.actual = 0;
                }
                Bukkit.broadcastMessage("§6"+AutoMessages.messages.get(AutoMessages.actual).replace("&", "§").replace(";", ":"));
                AutoMessages.actual++;
            }
        }, 3, APIScheduler.SchedulerUnit.MINUTE);
    }
}
Link para o comentário
Compartilhar em outros sites

Tem algo no AutoMessages.messages ?

 

E por que você esta usando o operador >=? use >, pois o java considera o 0 também... 

 

 public void run() {

if(AutoMessages.messages.isEmpty() continue;

if(AutoMessages.actual > AutoMessages.size()) AutoMessages.actual = 0;

Bukkit.broadcastMessage("§6"+AutoMessages.messages.get(AutoMessages.actual).replace("&", "§").replace(";", ":"));
AutoMessages.actual++;

 

}, 3, APIScheduler.SchedulerUnit.MINUTE);

 

 

E eu recomendo você a usar o .replace("&", "§").replace(";", ":")); na hora que vai adicionar uma mensagem pois, você está usando processamento sem necessidade... (é pouca coisa, mas tudo conta)

Editado por Manolo8
Link para o comentário
Compartilhar em outros sites

Tem algo no AutoMessages.messages ?

 

E por que você esta usando o operador >=? use >, pois o java considera o 0 também... 

 

 public void run() {

if(AutoMessages.messages.isEmpty() continue;

if(AutoMessages.actual > AutoMessages.size()) AutoMessages.actual = 0;

Bukkit.broadcastMessage("§6"+AutoMessages.messages.get(AutoMessages.actual).replace("&", "§").replace(";", ":"));
AutoMessages.actual++;

 

}, 3, APIScheduler.SchedulerUnit.MINUTE);

 

 

E eu recomendo você a usar o .replace("&", "§").replace(";", ":")); na hora que vai adicionar uma mensagem pois, você está usando processamento sem necessidade... (é pouca coisa, mas tudo conta)

é que a classe toda esta assim 

public class AutoMessages
{
    private static int actual;
    private static List<String> messages;
    
    public static void insert() {
    	File file = new File(Main.getInstance().getDataFolder(), "autoMessages.yml");
        YamlConfiguration messages = YamlConfiguration.loadConfiguration(file);
        AutoMessages.messages = messages.getStringList("autoMessages");
        APIScheduler.startTask(new APIScheduler.TaskRunnable() {
            @Override
            public void run() {
                if (AutoMessages.actual >= AutoMessages.messages.size()) {
                    AutoMessages.actual = 0;
                }
                Bukkit.broadcastMessage("§6"+AutoMessages.messages.get(AutoMessages.actual).replace("&", "§").replace(";", ":"));
                AutoMessages.actual++;
            }
        }, 3, APIScheduler.SchedulerUnit.MINUTE);
    }
}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...