Skocz do zawartości
  • 0

EventHandler


Kraftowy
 Udostępnij

Pytanie

Rekomendowane odpowiedzi

  • 0
2 godziny temu, Kraftowy napisał:

Proste pytanie xD
 

Jak w pluginie zobaczyć listę tych (onPlace, onBreak itd)?
Da się tak jak wchodzę w Source - Override/.... ?

Piszę na jednym api spigota, a dokładniej:

PaperSpigot-latest

W pluginie nie ma żadnych onPlace, onBreak ani nic z podobnych rzeczy. Plugin jest to dodatek do Bukkita, który całkowicie piszesz według swoich upodobań (musisz tylko stworzyć plik Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść! i klasę dziedziczącą po Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!). Oznacza to, że w pluginie znajdzie się to, co sobie zażyczysz i w jaki sposób.

To co masz na myśli to prawdopodobnie zdarzenia (eventy) w Bukkicie. Przy stawianiu bloku przez gracza wywoływany jest Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!; przy stawianiu Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!, ...

Zdarzenia wykonywane są w słuchaczach (listenerach). Słuchacz jest to metoda, inaczej zbiór zadań lub instrukcji które zostaną wykonane przy wywołaniu wybranego przez ciebie eventu. Załóżmy więc, że chcesz nasłuchać zdarzenie BlockBreakEvent (wykonywany przy niszczeniu bloku przez gracza) oraz wykonać przy nim wysłanie wiadomości do wszystkich graczy. Wyglądałoby to mniej więcej tak:

@EventHandler
public void handleBlockBreakEvent(BlockBreakEvent event) {
    for (Player online : Bukkit.getOnlinePlayers()) {
        online.sendMessage(new TextComponent("Gracz " + event.getPlayer().getName() + " wlasnie zniszczyl blok."));
    }
}

Teraz pozwól mi wytłumaczyć co oznacza powyższy kod.

  • public oznacza, że ta metoda, czyli zbiór instrukcji do wykonania będzie widoczna zewsząd. Oznacza to, że ktokolwiek, lub którakolwiek klasa będzie miała do niej swobodny dostęp do jej wykonania. Istnieje jeszcze kilka innych rodzajów widoczności - default, protected oraz private. W słuchaczach (listenerach) Bukkit zaleca się jednak użycie public, bo chociaż z poziomu Bukkita zawsze będzie public, to pierwotna definicja tej metody będzie miała wpływ na prędkość załadowania słuchaczy.
  • void oznacza, że ten zbiór instrukcji, który zostanie wykonany i nie zwróci żadnej wartości zwrotnej. Inaczej. niezależnie co w środku tej metody wykonamy, metoda poprzednia która ją wykonuje nie będzie sobie życzyć żadnej wartości zwrotnej.
  • handleBlockBreakEvent jest losową nazwą tego zdarzenia. Bukkita nie obchodzi jak będzie się metoda nazywać; jest on jedynie identyfikatorem w twojej klasie. Możesz ją nazwać dowolnie jak chcesz, ale powinieneś śledzić zalecenia Oracle oraz Sun.
  • Dalej przechodzimy do zawartości nawiasów - są to parametry. Są to wartości, które potrzebne są do wykonania naszej metody, w tym przypadku słuchacza (listenera). Bukkit akceptuje tutaj jedynie jeden parametr, który musi być eventem (czyli dziedziczyć po klasie Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!). Dodatkowo taki event musi posiadać Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść! i statyczną metodę getHandlerList() go zwracającą. To jednak już byłoby elementem poradnika jak tworzyć własne zdarzenia w Bukkit.
  • Dodatkowo nad metodą znajduje się magiczne @HandlerList. Jest to adnotacja, inaczej dopisek, lub dodatkowa informacja, znacznik tej metody, zbioru instrukcji. Mówi ona Bukkitowi, że ten przy rejestracji słuchaczy (listenerów) ma wziąć ją pod uwagę w czasie skanowania metod.

Wracając do pytania; prawdopodobnie szukasz listy wszystkich zdarzeń w Bukkit. Obecnie Bukkit nie jest już rozwijany, ale Spigot (jego fork, kontynuacja) dalej dodają nowe, choć niewielkie funkcje. Wszystkie zdarzenia znajdują się Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!. Co ciekawe - Bukkit wszystkie swoje zdarzenia posiada w packagu event - org.bukkit.event....

Korzystając na przykład z IDE (programu wspomagającego rozwój aplikacji) InteliiJ masz możliwość podglądu wszystkich zdarzeń, które są Bukkitowskim zdarzeniem. Po prostu przejdź do klasy Event (wciśnij kombinację klawiszy CTRL + N), wpisz tam "Event" - wybierz prawdopodobnie pierwszy wynik - Event - org.bukkit.event. Przy linijce public abstract class Event pokaże ci się niebieska ikona implementacji. Jej naciśnięcie spowoduje wyświetlenie wszystkich klas dziedziczącej po tej właśnie klasie.

 

Mam nadzieję, że pomogłem. :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
Teraz, Kraftowy napisał:

@TheMolkaPL a dokładniej jak w to wejść?

 

(Bo ja nie korzystam z CraftBukkit i Bukkit tylko paper-spigot latest)

 

Może musze coś dodac?

Będąc na stronie głównej dokumentacji zawsze znajdziemy listę package. Package to taka paczka w której znajdują się klasy. Gdy spojrzymy na package to one mają swoje specyficzne nazwy. Każdy package mówi co w sobie posiada. Przykładowo package "block" będzie posiadał bloki, package "command" komendy, itd.

Ciebie interesują akurat zdarzenia, więc wchodzisz w package "event". Tutaj zwróć uwagę na to, że sam package "event" posiada jedynie klasy budujące system zdarzeń w Bukkit. Ciebie interesują ich rodzaje. Zdarzenia podzielone są na kolejne package - "event.block", "event.player", ... Taki package od razu mówi nam, że ten pierwszy posiada zdarzenia związane z blokami, drugi, że posiada zdarzenia związane z graczem. Kliknij na wybrany package a następnie pokaże się tabela z dostępnymi w tym package klasami.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
Teraz, Kraftowy napisał:

No wiem, ale jak stworzyć ten @EventHandler liste tego jakoś da się wyświetlić?

 

Tą klasę jak stworzyć

Podałem ci linka do dokumentacji - tam jest lista wszystkich zdarzeń. Klasy nie musisz stworzyć; @EventHandler jest adnotacją już w Bukkicie.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
1 minutę temu, Kraftowy napisał:

@TheMolkaPL A mógłbyś mi dać jakiś przykład z położeniem bloku? Proszę

 

I jeszcze czasami pisze mi żeby dodać abstract to jest potrzebne?

Przykład już podałem w moim pierwszym poście. Żadnego abstract nigdzie nie trzeba dodawać. Przecież implementujesz listener tam gdzie go definiujesz.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
37 minut temu, Kraftowy napisał:

No to o zdarzenie mi chodzi, jak do tego dodać zeby wyslalo wiadomosc do tego kto kladzie jakiś blok?

W kodzie twojego słuchacza pobierasz gracza getPlayer(), a następnie wykonujesz sendMessage(...).

Odnośnik do komentarza
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...