2013-04-21 39 views
6

Robię wtyczkę bukkit dla mojego przyjaciela i chcę dowiedzieć się, jak wywołać funkcję co 2 tiki (1/10 sekundy).Jak wywołać funkcję co 2 tiki

+2

Dlaczego downvote? Jak to jest mniej ważne niż pytanie, jak korzystać z dowolnego innego API? Bukkit jest dość popularnym opublikowanym interfejsem API, jeśli nie ma sensu pytać o to, lepiej zacznij głosowanie na pytania dotyczące każdego API - MySQL, Hibernate ... –

+0

możliwe duplikowanie [Java Loop co minutę] (http: //stackoverflow.com/questions/2702980/java-loop-every-minute) –

+3

@DavidZ Używanie 'BukkitAPI' do tego jest dużo inne niż używanie go tylko dla' Java'. Użycie opcji "Uśpienie" zatrzyma cały serwer na "x" sekund, powodując opóźnienie i wiele innych problemów. – Jojodmo

Odpowiedz

14

Cóż, to prawdopodobnie nie jest miejsce, w którym chcesz wyglądać. Powinieneś używać this dla swoich potrzeb rozwojowych.
Tak czy inaczej, mogę odpowiedzieć na twoje pytanie. Chcesz użyć wbudowanego programu planującego. Możesz uzyskać do niego dostęp, podając

server.getScheduler(); 

W szczególności, będziesz chciał utworzyć Runnable i sprawić, by wywoływał twoją metodę co 2 ticks.

int id = server.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { 
    public void run() { 
     myMethod(); 
    }, 0, 2); 

Wyjaśnię różnicę z synchronizacją i asynchronizacją w sekundę, ale to powinno osiągnąć to, co chcesz. Pierwszy argument to tylko odnośnik do wtyczki (Normalnie this lub plugin). Drugi to działający, i powinieneś oczywiście zastąpić myMethod metodą, którą chcesz wywołać. Trzecim argumentem jest wielkość opóźnienia (w tikach), aż do pierwszej metody. Przyjąłem 0, ale może to być również dwa w zależności od tego, co chcesz zrobić. Ostatnim argumentem jest ilość czasu między przebiegami, którą chciałbyś mieć dwa.
Zauważysz, że metoda zwraca liczbę całkowitą, której można użyć, aby anulować zadanie tak:

server.getScheduler().cancelTask(id); 

ważne jest, aby omówić różnicę między Async i Sync. Zauważysz, że metoda, którą wywołaliśmy na początku, określa harmonogram Sync Powtarzanie zadań. Synchronizacja oznacza, że ​​Runnable, który określiliśmy jako drugi argument, zostanie uruchomiony na głównym wątku serwera. Dowolna metoda wywołująca metodę Bukkit/CraftBukkit/Minecraft MUSI być uruchomiona jako synchronizacja. Jeśli uruchomisz coś, co mówi, modyfikuje blok, Async może całkowicie uszkodzić serwer. Po prostu tego nie rób;) Async, z drugiej strony, tworzy osobny wątek dla Runnable, służy do zadań tła, takich jak kopiowanie i wklejanie pliku lub sprawdzanie, która jest godzina. Ponownie, NIGDY uruchomić metodę, która zmodyfikuje świat jako Async.

Na koniec, jeśli chciałbyś tylko raz uruchomić metodę, a potem nie chcesz jej powtórzyć, możesz po prostu użyć metody int id = scheduleSyncDelayedTask(plugin, Runnable, 2), przy czym pierwsze dwa argumenty są takie same, a trzeci to opóźnienie do uruchomienia prowadzony jest (kleszcze)

powodzenia
Porady

+0

czy spawnowanie podmiotu liczy się również w kierunku metody bukkit/craftbukkit/minecraft? czy mogę uruchamiać tego rodzaju polecenia za pomocą ASync? – xorinzor

+0

@xorinzor Należy uruchomić to zsynchronizowane. –

+0

@ Tips48 brakuje ci zamknięcia nawiasu klamrowego po 'myMethod();'. – Chad