2012-05-25 9 views
11

Ho bisogno di un modo semplice per chiamare una funzione ogni 60 minuti. Come posso fare questo? Sto facendo un plugin Bukkit Minecraft, e questo è quello che ho:Come chiamare la funzione ogni ora? Inoltre, come posso loop questo?

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(); 
     } 
    } 
} 

Ho bisogno di eseguire una funzione io implementare ogni ora, come? Ricorda: la funzione utilizzerà l1 e l2. Inoltre, come posso fare un loop per ottenere ogni blocco tra loro?

+0

Innanzitutto, desidero chiedere perché è necessario eseguire una funzione ogni ora e utilizzare la funzione evento suPlayerInteract per attivare un evento in base al clic sinistro o destro. Questo sembra contraddirsi l'un l'altro. –

risposta

24

Creare un oggetto Timer e dargli un TimerTask che esegue il codice che desideri eseguire.

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); 

Se si dichiara hourlyTask all'interno della vostra funzione onPlayerInteract, allora è possibile accedere l1 e l2. Per renderlo compilato, dovrai contrassegnarli entrambi come final.

Il vantaggio di usare un oggetto Timer è che può gestire più TimerTask oggetti, ognuno con la propria tempistica, delay, ecc Si può anche avviare e interrompere il timer finché si tiene l'oggetto Timer dichiarando è una variabile di classe o qualcosa del genere.

Non so come ottenere ogni blocco in mezzo.

+0

Non riesco ancora ad accedere a l1. –

+1

Vorrei votare per utilizzare la classe Timer anziché Thread, come altri potrebbero. Il motivo è che Timer utilizza il timer/orologio di sistema per attivare la chiamata alla funzione. Pertanto i tempi dovrebbero essere il più precisi possibile. Mentre l'utilizzo dei thread dipenderà dalla gestione dei thread Java e dal sistema operativo, piuttosto complicato da prevedere. –

+0

@Plazmotech, sarà necessario aggiungere il codice per accedere all'oggetto locale l1 o l2, che proviene da una funzione basata su eventi. Lo lascerò per ora. –

2

Creare un thread che verrà eseguito per sempre e si sveglia ogni ora per eseguire i dati.

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

Grazie! Errore di sintassi sul token "t", VariableDeclaratorId previsto dopo questo token –

+0

Sì, ho dimenticato di aggiungere un punto e virgola alla fine della dichiarazione 't'. L'ho già aggiunto. –

1
  1. Il modo più semplice (a mio parere) è utilizzare Thread (il commento sopra menzionato).
  2. È inoltre possibile utilizzare Timer in javax.swing.Timer
  3. ma penso che - come dicevano 101100 - è possibile utilizzare TimerTask. È possibile controllare questo link (da IBM)
2

È necessario utilizzare Bukkit Scheduler:

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

È necessario creare un metodo con questo e non è necessario chiamare lo stesso metodo.

+0

Quando il server è in ritardo di <20tps, la temporizzazione non è più accurata. –

Problemi correlati