Realizzo un plugin bukkit per il mio amico, e voglio scoprire come chiamare una funzione ogni 2 tick (1/10 di secondo).Come fare una funzione essere chiamata ogni 2 tick
risposta
Bene, questo probabilmente non è dove si vuole guardare. Si dovrebbe usare this per qualsiasi esigenza di sviluppo.
In ogni caso, posso rispondere alla tua domanda. Si desidera utilizzare lo schedulatore incorporato. È possibile accedere utilizzando
server.getScheduler();
In particolare, la vostra intenzione di voler creare un Runnable e renderlo chiamare il metodo di ogni 2 zecche.
int id = server.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
public void run() {
myMethod();
}, 0, 2);
spiegherò le differenze con la sincronizzazione e async in un secondo, ma questo dovrebbe realizzare ciò che si desidera. Il primo argomento è solo un riferimento al plugin (normalmente this
o plugin
). Il secondo è il runnable, e ovviamente dovresti sostituire myMethod
con il metodo che vuoi chiamare. Il terzo argomento è la quantità di ritardo (in tick) finché il metodo non viene eseguito per la prima volta. Ho assunto 0, ma potrebbe anche essere due a seconda di ciò che si vuole fare. L'ultimo argomento è la quantità di tempo tra le esecuzioni, che si desidera essere due.
Si noterà che il metodo restituisce un intero, che è possibile utilizzare per annullare l'attività in questo modo:
server.getScheduler().cancelTask(id);
E 'importante discutere la differenza tra Async e Sync. Noterai che il metodo che abbiamo chiamato all'inizio dice schedule Sync RepeatingTask. Sync significa che il Runnable che abbiamo specificato come secondo argomento verrà eseguito sul thread principale del server. QUALSIASI metodo che chiami un metodo Bukkit/CraftBukkit/Minecraft DEVE essere eseguito come sincronizzazione. Se si esegue qualcosa che dice, modifica un blocco, come Async si può danneggiare completamente il server. Semplicemente non farlo;) Async, d'altra parte, crea un thread separato per il Runnable, è usato per attività in background, come copiare e incollare un file o controllare che ora è. Ancora una volta, MAI esegui un metodo che modificherà il mondo come Async.
Infine, in futuro, se si desidera eseguire un metodo solo una volta e poi non farlo ripetere, è sufficiente utilizzare il metodo int id = scheduleSyncDelayedTask(plugin, Runnable, 2)
, con i primi due argomenti uguali e il terzo il ritardo fino all'eseguibile è gestito (zecche)
Buona fortuna,
Consigli
Perché il downvote? In che modo è meno valido che chiedere come utilizzare qualsiasi altra API? Bukkit è in realtà un'API pubblicata molto popolare, se non è valido chiedersi che è meglio iniziare a mettere giù domande di voto su ogni API: MySQL, Hibernate ... –
possibile duplicato di [Java Loop ogni minuto] (http: //stackoverflow.com/questions/2702980/java-loop-every-minute) –
@DavidZ L'uso di 'BukkitAPI' per questo è molto diverso dall'uso per' Java'. L'uso di 'Sleep' fermerebbe l'intero server per' x' secondi, causando lag e molti altri problemi. – Jojodmo