Ir para conteúdo

Task Imorrivel


BlackFloyd

Posts Recomendados

>>BUKKIT 1.6.4<<

 

Boa tarde, estou com um problema com Tasks no meu código. Possuo uma task de broadcast de evento, porém há um problema: Ela é impossivel de ser parada! Ja tentei varias coisas, troquei o runnable de BukkitRunnable para Runnable do java, ja atribui a task para uma variável, mas nada funciona.

É o seguinte: preciso cancelar essa task atravez de outro método. Possuo o método start() que faz o broadcast do evento e o metodo close() (Que fecha a entrada do evento à força)

Esse método close() era responsável por cancelar a task de broadcast, caso ela estivesse ocorrendo, e ara isso eu fiz o seguinte:

Criei 2 variáveis para as tasks do evento

image.png.ce8cff644f231d0c1d3a3d10c4d3f389.png

(A do pvpTask ta tudo ok, o problem mesmo é a do broadcast)

Eu possuo uma condição que cancela a task de broadcast em 2 métodos: No método cancelar() (Para cancelar o evento e puxar todos os jogadores para o spawn) e no método close(). O mais estranho é: a condição para cancelar a task funciona no método cancelar() e não funciona no metodo close(), sendo que são exatamente IDENTICAS nos 2 (???????)

image.png.be0438662638f8c0f557c7fa0988d0ff.png

(Alias, esse aqui é o momento que eu atribuo a task para um BukkitRunnable no metodo start())

image.png.6a84d3ea6ea8c7a08788dcdc8c29b408.png

image.png.46520a827f3cddfff2f2d7869f39142b.png

 

Só para constar, ja tentei fazer direto pelo Bukkit.getScheduler() mas não rolou também. Somebody can help me?

 

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

Li meio por cima, se não for isso, desculpe..

Pegue esse exemplo que eu fiz para meu plugin de gladiador;

 

	public static boolean glad = false;
	public static void preparar(int avisos) {
        int tempoavisos = Main.getInstance().getConfig().getInt("Geral.Tempo_Avisos");
        if (avisos == 0) {
            if (glad == true) {
                ChecarClan.checkClan();
            }
            return;
        }
        for (String msg : Main.getInstance().getConfig().getStringList("Iniciando_Contagem")) {
            Bukkit.broadcastMessage(msg.replace("&", "§").replace("@avisos", String.valueOf(avisos)));
        }
        new BukkitRunnable() {
            public void run() {
                preparar(avisos - 1);
                return;
            }
        }.runTaskLater(Main.getInstance(), tempoavisos * 20);
    }
	

 

 

Link para o comentário
Compartilhar em outros sites

Não compreendi muito bem o que tu quer, mas o que eu entendi foi que tu quer um contador? Se for, aqui está:

import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;

public class Task extends BukkitRunnable {

    private int count;

    public Task(Plugin plugin, int count) {
        this.count = count;

        runTaskTimer(plugin, 0L, 20L);
    }

    @Override
    public void run() {
        --count;
        if (count > 0) {
            System.out.println("Fechando evento em " + count + " " + (count > 1 ? "segundos." : "segundo."));
        }
        else {
            cancel();
        }
    }
}

Se não for, só me explicar melhor que eu tento ajudar

Link para o comentário
Compartilhar em outros sites

1 hora atrás, VictorHeaven disse:

Não compreendi muito bem o que tu quer, mas o que eu entendi foi que tu quer um contador? Se for, aqui está:


import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;

public class Task extends BukkitRunnable {

    private int count;

    public Task(Plugin plugin, int count) {
        this.count = count;

        runTaskTimer(plugin, 0L, 20L);
    }

    @Override
    public void run() {
        --count;
        if (count > 0) {
            System.out.println("Fechando evento em " + count + " " + (count > 1 ? "segundos." : "segundo."));
        }
        else {
            cancel();
        }
    }
}

Se não for, só me explicar melhor que eu tento ajudar

O contador eu ja tenho, preciso de um meio de cancelar a task de um contador por outro metodo. Ja tentei de tudo. Fiz a seguinte verificação: se a broadcastTask (variavel quer recebe a task de broadcast) for diferente de null, ele cancela a task e seta ela como null, porém, o mais estranho: ISSO FUNFA EM UM METODO (CANCELAR()) e NAO funciona no outro (close()) wtf??? se tiver alguma ideia deixa ai pfv

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Bl4ckFairy disse:

O contador eu ja tenho, preciso de um meio de cancelar a task de um contador por outro metodo. Ja tentei de tudo. Fiz a seguinte verificação: se a broadcastTask (variavel quer recebe a task de broadcast) for diferente de null, ele cancela a task e seta ela como null, porém, o mais estranho: ISSO FUNFA EM UM METODO (CANCELAR()) e NAO funciona no outro (close()) wtf??? se tiver alguma ideia deixa ai pfv

Não entendi, por que não usa o que eu te mandei e adapta para o teu uso?

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, VictorHeaven disse:

Não entendi, por que não usa o que eu te mandei e adapta para o teu uso?

O problema nao é o BukkitRunnable, ele esta funcionando, o problema é cancelar ele dentro de outro método

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

3 horas atrás, Jota ♨️ disse:

não é só dar uma executavel de 'metodo.cancel()'?

Isso que estou fazendo, eu armazeno a task em uma variavel e tento cancelar essa variavel (BukkitTask) e depois seto-a como null, mas ela se recusa a parar por algum motivo...

Link para o comentário
Compartilhar em outros sites

6 horas atrás, zDubsCrazy2 disse:

Faz o mesmo que tu fez no método cancelar, em vez de chamar o método close() faz: broadcastTask.cancel();

é que eu NECESSITO chamar o close, pois ele é responsavel por outras coisas também. Mas consegui resolver! Fiz um workaround que funcionou. Obrigado pela ajuda de todos.

Link para o comentário
Compartilhar em outros sites

12 horas atrás, BlackFloyd disse:

é que eu NECESSITO chamar o close, pois ele é responsavel por outras coisas também. Mas consegui resolver! Fiz um workaround que funcionou. Obrigado pela ajuda de todos.

Não sei o que você fez para resolver, mas pensei que você estava querendo o close() da runnable (sim, ela também tem o metódo close), e é isso que acontece, você estava chamando o close() dela, para chamar o close() da sua classe, você poderia fazer MiniGladiador.this.close();

Link para o comentário
Compartilhar em outros sites

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