Skocz do zawartości

Rekomendowane odpowiedzi

Witam,

Potrzebuję funkcji która by odczekiwała sekundę przed wykonaniem następnej linijki kodu.

Jedną z takich funkcji jest Thread.sleep, lecz ta funkcja zatrzymuje cały serwer, próbowałem użyć takiego kodu:

int seconds = 1;
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
        public void run() {
	    #jakis kod	
        }
    }, (seconds * 1)); // Always multiply by twenty because that's the amount of ticks in Minecraft
}

Lecz to mi się buguje, lub źle tego używam.

Byłbym wdzięczny za podanie mi kodu który najlepiej by było gdyby się mieścił w jednej linii, aby ten kod jakoś wyglądał i można było się w nim połapać. To znaczy:

(Daję przykład z kodu pod plugin do bukkit'a)

p.sendMessage("Wiadomosc 1");
#odczekanie 1 sekunda
p.sendMessage("Wiadomosc 2");
#ODCZEKANIE 1 SEKUNDA
p.sendMessage("Wiadomosc 3");

Będę bardzo wdzięczny za pomoc.

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

@qweqwedc

Dzięki, działa, lecz jest mały problem, kod przy jednym ifie mogę użyć jeden raz, czyli mogę wyświetlić dwie wiadomości z odstępem czasowym 1 sekunda, a chciałbym więcej tych wiadomości umieścić z przerwami jedno-sekundowymi.
Oto kod:

p.sendMessage("Wiadomosc 1");
int seconds = 1;
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
    public void run() {
            p.sendMessage("Wiadomosc 2");
    }
}, (seconds * 20));

Kod wyświetla dwie wiadomości, a jak wyświetlić jeszcze 3, 4, itd...?

Będę bardzo wdzięczny za pomoc.

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

Najlepiej byłoby utworzyć nowy watek i tam w pętli while dać p.sendMessage("Wiadomosc X"); i Thread.sleep(1000).

Możesz jeszcze spróbować tak:

p.sendMessage("Wiadomosc 1");
int seconds = 1;
for (int i = 1; i < 5; i++) {
    Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
        public void run() {
            p.sendMessage("Wiadomosc " + (1 + i));
        }
    }, (seconds * 20 * i));
}
 

 

Odnośnik do komentarza
Udostępnij na innych stronach

@qweqwedc

 

No tak, tylko że ja tutaj przykład dałem, nie chodzi mi tu konkretnie o p.sendMessage, lecz o boss bara, gdzie każdy ma inną treść, więc nie wiem czy pętla zda tu egzamin, a thread.sleep podobno zatrzymuje cały serwer, chyba że można to jakoś obejść, i zrobić tak, by nie zatrzymywało całego serwera lecz faktycznie zaczekało sekundę przed wykonaniem następnej funkcji.

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

@Osama

Wątek a na końcu thread.sleep? Nie bardzo rozumiem...

Robię wątek:

public void run(){
}

i to ma być w ten sposób?

public void run(){
    #jakiś kod
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

@Osama

Dobra, wybacz, tępy jestem, teraz już rozumiem o co chodzi z tymi wątkami.
Stworzyłem wątek, w klasie o nawie "joinplayer.java"

dałem tam public void run,

w głównej klasie dałem Thread joinplayer = new joinplayer();

i aby startować wątek dałem joinplayer.start();

Teraz mam problem ze zmiennymi....

Wątek jest startowany jak gracz wchodzi na serwer:

@EventHandler
public void onJoin(PlayerJoinEvent event) {
    joinplayer.start();
}

Widać tu zmienną "event", którą chciałbym przesłać do wątku znajdującego się w joinplayer.java, lecz niespecjalnie wiem jak.

Potrzebuję aby w wątku, funkcjonował ten kod:
 

    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
    	Player p = event.getPlayer();
    	if (getConfig().getConfigurationSection("kordynaty") == null) {
            p.sendMessage("Teleport nie jest ustawiony");
        }
        //Get the data from the string: spawn - and teleport the player to it
        World world = Bukkit.getServer().getWorld(getConfig().getString("spawn.world"));
        double x = getConfig().getDouble("spawn.x");
        double y = getConfig().getDouble("spawn.y");
        double z = getConfig().getDouble("spawn.z");
        p.teleport(new Location(world, x, y, z));
        p.sendMessage("Przeteleportowano.");
    }

Będę wdzięczny za pomoc.

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

Nie musisz tworzyć wątku w ten sposób. Scheduler CraftBukkita daje Ci możliwość uruchamiania tasków asynchronicznie. Już wiesz jak się do niego dostać (Bukkit.getScheduler()), w jego metodach znajdziesz pozycje mające w nazwie "async". Tobie może się przydać "runTaskTimerAsynchronously". Jeśli chcesz co sekundę (20 ticków, jak wcześniej zaznaczono i jak sam wkleiłeś) wyświetlić inny tekst, to wystarczy zaimplementować interfejs Runnable i dodać do niego pole, np. indeks wiadomości w liście która ma się pokazać przy następnym wykonaniu run(). Nie martwisz się o sleep, thready i cuda, sposób jest piękny bukkitowy. Apeluję o stosowania się do odpowiedniego nazewnictwa klas, oraz zachęcam do używania OpenJDK dla Javy 8. Rachunek lambda ułatwia tworzenie małych Runnable.

Dodaj mój nick do posta jeśli potrzebujesz pomocy | Piszę pluginy na zlecenie | Pomagam z Linuxem

newlogo.png

Odnośnik do komentarza
Udostępnij na innych stronach

@MarcinWieczorek

Nie jestem pewien, ale chyba o to ci chodziło:

e43c9584bb3af868d4f0a5c128abd59b.jpg

Ale jak widać błąd jest.

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

@MarcinWieczorek

No to chyba o to chodzi:

b54744e09b0c44fd8fff70b9531fa68a.jpg

Nie testowałem kodu na serwerze, ale żadnego błędu nie ma, lecz tylko na wersji 1.7, na bibliotekach wersji 1.2.5 już niestety nie działa.

Tak to wygląda na bibliotece Craftbukkit 1.2.5 R5:

1cca7ed954a8e7108295d46e7986388c.jpg

Jak widać jest błąd, pewnie funkcja getServer nie jest obsługiwana na tak starej wersji. Jest może jakaś alternatywa?

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

No i pięknie. Napraw teraz błąd który Ci sie pokazuje, pewnie typ zmiennych. Możesz uruchomić swój task wywołując komendę metoda(). Zalecam nie stosować polskiego nazewnictwa.

Dodaj mój nick do posta jeśli potrzebujesz pomocy | Piszę pluginy na zlecenie | Pomagam z Linuxem

newlogo.png

Odnośnik do komentarza
Udostępnij na innych stronach

@MarcinWieczorek

No mam pewien błąd z naprawieniem sobie tego błędu, wszystko o skryptowałem sobie tak:

0509b9cbb39ca71950c3030684308c32.jpg

Po użyciu metody naprawy błędu z tej podpowiedzi, przed bukkit.getScheduler pojawia się (Object), a błąd nadal nie znika, potem znów wykonuję rozwiązanie błędu z podpowiedzi i robi się (Object)), a błąd nadal nie znika.

Uruchomienie taska dałem przy public void onJoin, czyli jak gracz wejdzie uruchamia task, i zapisuje gracza do zmiennej event, a potem w tasku jest to odczytywane.
Jak można to naprawić?
(PS. Nie pytaj o co chodzi z tą komorą logowania)

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

A nie mówiłem, że to typ zmiennych? Zamiast int musi tam być long. Zwróć uwagę na typ danych wyników działań arytmetycznych i zastosuj to. Każdą stałą (całkowitą liczbę) możesz przedstawić jako int lub long, ma to spore znaczenie. A jeśli chodzi o IDE no to coż, sam wybrałeś Eclipse, więc się męcz...

Dodaj mój nick do posta jeśli potrzebujesz pomocy | Piszę pluginy na zlecenie | Pomagam z Linuxem

newlogo.png

Odnośnik do komentarza
Udostępnij na innych stronach

@MarcinWieczorek

Ustawiłem na long i nadal błąd, w podpowiedziach to samo z tym objectem.

d098eb1e6fefd97081b3b90dbdb8a148.jpg

I jakie IDE polecasz?

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

Ktoś tu chyba się chwali za bardzo w profilu

 

Hobby:Java, PHP, HTML,, VB.NET, C#, Hardware, Software, Ogólnie programowanie i informatyka.

Taki obeznany, a moje kropki bezmyślnie wkleja ^^

Wielokropek istnieje w Javie tylko przy parametrach metody i to w szczególnym przypadku.

Dodaj mój nick do posta jeśli potrzebujesz pomocy | Piszę pluginy na zlecenie | Pomagam z Linuxem

newlogo.png

Odnośnik do komentarza
Udostępnij na innych stronach

@MarcinWieczorek

Panie, no to pisz pan jak mam wpisać, bo ja jeszcze w javie to taki typowy janusz jestem, co się uczy a chce cuda wyczyniać.

Wstawił bym sobie sygnaturkę, ale nie pozwala mi na to forum, ponieważ gdy próbuję to zrobić, dostaję słynny komunikat od cloudflare "Getway timed out". :/

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający forum Sleep w javie.   0 użytkowników
    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...