Skocz do zawartości
  • 0

Usuwanie tasku


Szymoon202

Pytanie

Cześć, da się jakoś usunąć, albo anulować dany task?

@EventHandler
public void onJoin(PlayerJoinEvent e) {
	Player p = e.getPlayer();
	p.setLevel(45);
	p.setExp((float) 0.99);
	Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInst(), new Runnable() {
		int level = 45;
		double exp = 0.99;
		public void run() {
			level--;
			exp = exp - 0.022;
			if(level != 0) {
				p.playSound(p.getLocation(), Sound.ITEM_FLINTANDSTEEL_USE, 100, 100);
				p.setLevel(level);
				p.setExp((float) exp);
			} else {
            	anulujtentask();
            }
		}
	}, 0, 20);
}

Próbowałem nadawać temu task'u id, i potem je anulować, ale tak też nie działa.

@EventHandler
	public void onJoin(PlayerJoinEvent e) {
		Player p = e.getPlayer();
		p.setLevel(45);
		p.setExp((float) 0.99);
		task = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInst(), new Runnable() {
			int level = 45;
			double exp = 0.99;
			public void run() {
				level--;
				exp = exp - 0.022;
				if(level != 0) {
					p.playSound(p.getLocation(), Sound.ITEM_FLINTANDSTEEL_USE, 100, 100);
					p.setLevel(level);
					p.setExp((float) exp);
				} else {
					Bukkit.getScheduler().cancelTask(task);
				}
			}
		}, 0, 20);
	}

Ktoś ma jakiś pomysł?

Odnośnik do komentarza
Udostępnij na innych stronach

3 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

użyj BukkitRunnable, znacznie wygodniejsze do takiej zabaw

        new BukkitRunnable(){

            @Override
            public void run()
            {
                System.out.println("Z tasku");
                this.cancel(); // i anulowany
            }
        }.runTaskTimer(plugin, 0, 20);

możesz też przypisać do zmiennej i anulować kiedy chcesz z innego miejsca:

        BukkitTask printTask = new BukkitRunnable()
        {
            @Override
            public void run()
            {
                System.out.println("Z tasku");
                this.cancel(); // i anulowany
            }
        }.runTaskTimer(plugin, 0, 20);
        // w innym miejscu:
        printTask.cancel();

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

@GotoFinal zrobiłem za Twoją radą, lecz nie mogę w ogóle używać zmiennej task.

	@EventHandler
	public void onPlayerJoin(PlayerJoinEvent e)
	{
		Player p = e.getPlayer();
		Main.getPlayers().put(p, true);
		p.setLevel(45);
		p.setExp((float) 0.99);
		BukkitTask task = new BukkitRunnable()
		{
			int level = 45;
			double exp = 0.99;
			public void run()
			{
				if(!Main.getTasks().containsKey(p))
				{
					Main.getTasks().put(p, task);
				}
				level--;
				exp = exp - 0.022;
				if(level != 0) {
					p.setLevel(level);
					p.setExp((float) exp);
				}
			}
		}.runTaskTimer(Main.getInst(), 0, 20);
	}

Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

no bo w środku tego nie masz dostępu do tej zmiennej, tam musisz odwołać się do "this" tylko też "this" odwołuje się tam do instancji BukkitRunnable nie BukkitTask, ale możesz pobrać ID tasku i wtedy znaleźć w schedulerze danego taska.

Z tym że sensowniej byłoby chyba dodawać task do mapy za taskiem

Odnośnik do komentarza
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...