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
Odpowiedz
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
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 ... –
możliwe duplikowanie [Java Loop co minutę] (http: //stackoverflow.com/questions/2702980/java-loop-every-minute) –
@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