2012-05-25 14 views
11

Potrzebuję prostego sposobu wywoływania funkcji co 60 minut. Jak mogę to zrobić? Robię plugin bukkit Minecraft, i to, co mam:Jak wywołać funkcję co godzinę? Jak mogę to zapętlić?

package com.webs.playsoulcraft.plazmotech.java.MineRegen; 

import java.util.logging.Logger; 

import org.bukkit.Location; 
import org.bukkit.block.Block; 
import org.bukkit.event.block.Action; 
import org.bukkit.event.player.PlayerInteractEvent; 
import org.bukkit.plugin.java.JavaPlugin; 


public class Main extends JavaPlugin{ 

    public final Logger log = Logger.getLogger("Minecraft"); 


    @Override 
    public void onEnable() { 
     this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 
     this.log.info("Plaz's Mine Regen is now enabled!"); 
     this.log.info("Copyright 2012 Plazmotech Co. All rights reserved."); 
     this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 
    } 

    @Override 
    public void onDisable() { 
     this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 
     this.log.info("Plaz's Mine Regen is now disabled!"); 
     this.log.info("Copyright 2012 Plazmotech Co. All rights reserved."); 
     this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 
    } 

    public void onPlayerInteract(PlayerInteractEvent event) { 
     final Action action = event.getAction(); 
     if (action == Action.LEFT_CLICK_BLOCK) { 
      Location l1 = event.getClickedBlock().getLocation(); 
     } else if (action == Action.RIGHT_CLICK_BLOCK) { 
      Location l2 = event.getClickedBlock().getLocation(); 
     } 
    } 
} 

trzeba uruchomić funkcję będę realizować co godzinę, w jaki sposób? Zapamiętaj: Funkcja użyje L1 i L2. Ponadto, w jaki sposób mogę zapętlić to, aby uzyskać każdy blok między nimi?

+0

Po pierwsze, chciałbym zapytać, dlaczego trzeba co godzinę uruchamiać funkcję i używać funkcji zdarzenia w grzePlayerInteract, aby wywołać zdarzenie oparte na kliknięciu lewym lub prawym przyciskiem myszy. Wydaje się to sprzeczne. –

Odpowiedz

24

Tworzenie Timer obiekt i nadać mu TimerTask który wykonuje kod, który chcesz wykonać.

Timer timer = new Timer(); 
TimerTask hourlyTask = new TimerTask() { 
    @Override 
    public void run() { 
     // your code here... 
    } 
}; 

// schedule the task to run starting now and then every hour... 
timer.schedule (hourlyTask, 0l, 1000*60*60); 

Jeśli zadeklarujesz hourlyTask wewnątrz swojej funkcji onPlayerInteract, a następnie można uzyskać dostęp l1 i l2. Aby to skompilować, musisz oznaczyć je jako final.

Zaletą korzystania z Timer obiektu jest to, że można go obsługiwać wiele TimerTask obiektów, każdy z własnym czasu, opóźnień itp Można również uruchomić i zatrzymać liczniki tak długo, jak trzymać się obiektu Timer deklarując to jako zmienna klasy lub coś takiego.

Nie wiem, jak zdobyć każdy blok pomiędzy.

+0

Wciąż nie mogę uzyskać dostępu do l1. –

+1

Chciałbym głosować, aby użyć klasy Timer zamiast wątku, tak jak inni. Powodem jest to, że Timer używa zegara systemowego/zegara, aby wywołać wywołanie funkcji. Dlatego czas powinien być tak dokładny, jak to tylko możliwe. Podczas gdy używanie wątków będzie zależało od zarządzania wątkami Java i systemu operacyjnego, raczej skomplikowane do przewidzenia. –

+0

@Plazmotech, Będziesz musiał dodać kod, aby uzyskać dostęp do lokalnego obiektu l1 lub l2, który pochodzi z funkcji opartej na zdarzeniach. Na razie to zostawię. –

2

Utwórz wątek, który będzie działać wiecznie i będzie się budził co godzinę, aby wykonać dane.

Thread t = new Thread() { 
    @Override 
    public void run() { 
     while(true) { 
      try { 
       Thread.sleep(1000*60*60); 
       //your code here... 
      } catch (InterruptedException ie) { 
      } 
     } 
    } 
}; 
t.start(); 
+0

Thannks! Błąd składni na tokenie "t", oczekiwano VariableDeclaratorId po tym tokena –

+0

Tak, zapomniałem dodać średnika na końcu deklaracji "t". Już to dodałem. –

1
  1. Najprostszym sposobem (moim zdaniem) jest użycie Thread (powyższy komentarz wspomina o tym).
  2. Można również użyć Timer w javax.swing.Timer
  3. Ale myślę, że - jak powiedział 101100 - można użyć TimerTask. Można to sprawdzić link (IBM)
2

Musisz użyć Bukkit Harmonogram:

public void Method(){ 
    this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() { 
     @Override 
     public void run() { 
      // Your code goes here 
      Method(); 
     } 
    }, time * 20L); 
} 

Musisz utworzyć metodę z tym i nie należy wywołać tę samą metodę.

+0

Gdy serwer ma opóźnienie <20tps, czas nie jest już dokładny. –