Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rekomendowane odpowiedzi

Opublikowano

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". :/

Opublikowano

 

}, (seconds * 1)); // Always multiply by twenty because that's the amount of ticks in Minecraft

Musisz mnożyć o 20 a nie 1.

 

 

Opublikowano

@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". :/

Opublikowano

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

 

Opublikowano

@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". :/

Opublikowano

Zrób wątek, daj to co ma się powatarzać w nieskończoną pętlę a na jej końcu Thread.sleep(1000). Wtedy będzie zatrzymywało tylko tamten wątek.

RAsfepN.png
  • 3 tygodnie później...
Opublikowano

@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". :/

Opublikowano

@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". :/

Opublikowano

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

Opublikowano

@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". :/

Opublikowano

Nawet ze screena widać, że brakuje Ci jednego argumentu na końcu :)

Pierwszy to czas przed pierwszym uruchomieniem a drugi to odstęp pomiędzy kolejnymi.

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

newlogo.png

Opublikowano

@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". :/

Opublikowano

Taa, zapewne Bukkit.getScheduler, albo robisz getServer() z JavaPlugin czyli z klasy pluginu

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

newlogo.png

Opublikowano

@MarcinWieczorek

W ten sposób?

17fe06d5f5a8e1e759df618c77e16502.jpg

Jeśli tak, to nadal jest błąd.

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". :/

Opublikowano

@MarcinWieczorek

Proszz.. o to chodziło?

70ae4f3cc76148863ee20a108cb4332f.jpg

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". :/

Opublikowano

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

Opublikowano

@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". :/

Opublikowano

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

Opublikowano

@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". :/

Opublikowano

A drugie to nadal int ^^

Możesz zrobić (..., seconds * 1L, 1L)

 

Emacs to jedyny słuszny edytor

 

 

Żartowałem, #TeamVim

 

 

 

Tak serio to Intellij

 

 

 

 

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

newlogo.png

Opublikowano

@MarcinWieczorek

Się tam naprawiło, a tu zepsuło.

8a939185fa13e569e7bd8225ecddca5b.jpg

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". :/

Opublikowano

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

Opublikowano

@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". :/

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...