Pisanie pluginów do Minecraft - #3 Inne Klasy, Argumenty komendy, wyśw. informacji o graczu

luxDev | 2021-02-17 10:25:28 UTC | #1

Jednak tym razem postarałem się i kolejny poradnik napisałem troszkę szybciej niż zazwyczaj :stuckouttongue:

Ostatni poradnik: (#2 Klik)

Dzisiaj zajmiemy się dodaniem komendy /info , storzymy ją w nowej klasie. sprawdzimy uprawnienia, oraz argument komendy to jest to co komenda zawiera po niej, dam przykład /komenda asd - asd to pierwszy argument u nas będzie pierwszym argumentem nick gracza, którego potem będziemy wyświelać informacje na czacie.

Zacznijmy od stworzenia nowej paczki klikając na naszą główną paczkę -> new -> Package nazwijmy ją commands, ja tworzę paczki od głównej aby fajnie się układały w kompilatorze powinno to wygladać w ten sposób, na samym końcu dodajemy kropkę i nazwę - .commands

Gdy stworzymy naszą paczkę stwórzmy nową klasę w niej, kliknij PPM -> new -> Class nazwij ją InfoCommand
Kiedy klasa będzie gotowa implementujemy CommandExecutor, importujemy oraz dodajemy nasz kawałek kodu od sprawdzania komendy:

@Override
public boolean onCommand(CommandSender sender, Command cmd, String arg, String[] args) {

return false;
}

teraz dodajmy tam co ma się wykonywać po wpisaniu komendy /info oraz sprawdźmy czy posiada ona wymagany argument 0 (czyli nick [w javie zaczynamy liczyć od 0 jako 1]), jeśli nie ma wyświetlimy poprawne użycie tej komendy.

a więc sprawdzanie czy komenda ma jakiś arugment odbywa się poprzez if(args.length == 0){ możemy używać tam wszystkiego co chcemy, aby uzyskać efekt który nas interesuje (< > ==) w tym przykładzie sprawdzam czy ilość argumentów jest zerowa, jeśli będzie to nie ma nic po /info.

Następnie wyślijmy wiadomość do gracza o poprawnym użyciu komendy, i zakończmy to standardowym return true którego ja używam, jeśli ktoś pisał w Skript to żeby lepiej to zrozumieć działa to jak stop

Kod na razie wygląda następująco:

To co będę pisać w nastepnej linijce będzie zakładać że argument nick gracza istnieje, a więc weźmy ten nick z arguemntu i pobierzmy z niego gracza aby móc wysyłać do tego “argumentu” wiadomości itd :smile:

Player p = Bukkit.getPlayerExact(args[0]);

tym zdefinujemy sobię gracza z argumentu 0

Następnie sprawdzmy czy jest on na serwerze.

if(p == null){
    sender.sendMessage("§7Gracz jest offline.");
    return true;
}

Tym razem skróciłem sobie czas używając “§” zamiast ChatColor
Po kolejnym nawiasie klamrowym będziemy w domu, to znaczy że argument jest, gracz jest offline wszystko się zgadza - możemy wysyłać informacje na jego temat ;)

Mozliwości jest wiele:

To jest tylko przykład ale dorzucę kod:

sender.sendMessage("Nick gracza: " + p.getName());
sender.sendMessage("Poziom glodu gracza: " + p.getFoodLevel());
sender.sendMessage("Poziom HP gracza: " + p.getHealth());
sender.sendMessage("Moze latac: " + p.getAllowFlight());
sender.sendMessage("Tryb gry: " + p.getGameMode());
sender.sendMessage("Adres IP: " + p.getAddress().getAddress().getHostAddress());
sender.sendMessage("Przedmiot w rece: " + p.getItemInHand().getType());

Co do przedmiotu w ręce, jeśli nie ma nic, wyświetli się AIR, co do latania jeśli może wyswietli się true, jesli nie false.

Nie zapomnijmy pokazać pluginowi podczas ładowania że komenda “/info” znajduje się w klasie InfoCommand - przechodzimy do klasy Main, i dodajemy w onEnable getCommand("info").setExecutor(new InfoCommand());
Nie zapomnij o importach, oraz dodaj też tą komende w plugin.yml tak jak w ostatnim poradniku.

Klasa Main: Kliknij na mnie po kodzik :)
Klasa InfoCommand:Kliknij na mnie po kodzik :)
Plugin.yml: Kliknij na mnie po kodzik :)

Od dziś wrzucam kod na pastebin, co by popatrzeć i ewentualnie skopiować w razie problemów.
Będę się starał wrzucać tematy z tej serii coraz częściej, jednak niczego nie obiecuję na 100%
Dałbyś “like” za poświęcony czas co? :smile: (Około +/- ponad 1h.)
Jeśli o czymś zapomniałem czekam na komentarze :P

Do zobaczenia w następnym poradniku.


RabbitTheDEV | 2018-01-01 17:04:59 UTC | #2

Bzdury.

  1. Nie “paczka” tylko pakiet.
  2. Naucz się korzystać z metod, utilsów, a nie ciągłe ChatColor lub co gorsza paragrafy.
  3. Używaj intelki i mavena.
  4. Nie tylko podczas ładowania dodaje się getCommand.. ale można również podczas uruchamiania pluginu (Zalecane). Na dodatek nie wskazujemy gdzie znajduje się komenda lecz ustawiamy dla niej executor’a.
  5. Komendy w plugin.yml są źle wytabowane
  6. Nie podajemy wersji 0.0.0 - jest to idiotyczne.
  7. Nie używamy polskich znaków.
  8. Nie używamy System.out.println… - w ten sposób wysyłamy wiadomość do JVM. Korzystamy z loggera - this.getLogger().info(“Plugin has been enabled!”);
  9. Sprawdzanie (cmd.getName().equalsIgnoreCase(“”)); jest idiotyczne skoro nie mamy dwóch komend oraz wiemy jaką komendę przypisujemy.
  10. Importy nie są trudne.. polecam CTRL + SHIFT + O
  11. Code-style na poziomie zerowym.

luxDev | 2018-01-01 18:53:05 UTC | #3

Zastanawiam się czy to żart, rejestrujesz się specjalnie na forum aby tylko coś wysmarować..

Jakieś 85% tego co napisałeś nie ma sensu, bądź są to tylko twoje pomysły które powinieneś zachować dla siebie.

Mogę jedynie powiedzieć że to co wymieniłeś dokładniej: 9, 8 ma sens.


DoreK | 2018-01-01 19:46:00 UTC | #4

image|263x118
:thinking:
image|408x62

To raczej jakiś żart.


anon10657637 | 2018-01-01 20:06:02 UTC | #5

Cześć, widzę że zawitałeś na to cudowne forum! Cieszę się z Twojej obecności, mam nadzieję że nią będziesz emanował częściej. Ale pora na konkret:

[quote=”RabbitTheDEV, post:2, topic:1619”]
Nie “paczka” tylko pakiet.
[/quote]
+1

[quote=”RabbitTheDEV, post:2, topic:1619”]
Naucz się korzystać z metod, utilsów, a nie ciągłe ChatColor lub co gorsza paragrafy.
[/quote]

Paragrafy - racja. Reszta sprzeciw, programista tworzy kod i rozwija w dogodny dla siebie i społeczności sposób. W założeniu powinno mu się ufać i respektować jego decyzję. Jak woli tak to robić, to w tym kodzie należy się do tego dostosować.

[quote=”RabbitTheDEV, post:2, topic:1619”]
Używaj intelki i mavena.
[/quote]
To czego używa człowiek, zależy od człowieka - IDE to kwestia indywidualna. Natomiast Maven nie jest obowiązkowy, zwłaszcza w typowo małym projekcie - takich zabawek używa się na większa skalę i przy większej ilości osób. Wtedy można rozważyć inne alternatywy - Ivy, Ant, Gradle, czy chociażby wieloplatformowy Bazel ;)

[quote=”RabbitTheDEV, post:2, topic:1619”]
Nie tylko podczas ładowania dodaje się getCommand… ale można również podczas uruchamiania pluginu (Zalecane). Na dodatek nie wskazujemy gdzie znajduje się komenda lecz ustawiamy dla niej executor’a.
[/quote]
I tak i nie - tutaj można robić wieloma sposobami, jednak oficjalnie powinno się robić całość za pośrednictwem CommandExecutora ;)

[quote=”RabbitTheDEV, post:2, topic:1619”]
Komendy w plugin.yml są źle wytabowane
[/quote]
SnakeYAML ma do tego walidacje i wszystko ogarnie (bynajmniej tak na najnowszych wersjach jest).

[quote=”RabbitTheDEV, post:2, topic:1619”]
Nie podajemy wersji 0.0.0 - jest to idiotyczne.
[/quote]
Podane przykładowo, to widać.

[quote=”RabbitTheDEV, post:2, topic:1619”]
Nie używamy polskich znaków.
[/quote]
We wiadomościach - czemu niby nie? W reszcie (klasy, komentarze etc.) wg. konwencji - czyli po angielsku. Zależy też od projektu - mnie ostatnio klient poprosił bym mu zrobił Javadocsy po polsku :stuckouttongue:

[quote=”RabbitTheDEV, post:2, topic:1619”]
Nie używamy System.out.println… - w ten sposób wysyłamy wiadomość do JVM. Korzystamy z loggera - this.getLogger().info(“Plugin has been enabled!”);
[/quote]

+1

[quote=”RabbitTheDEV, post:2, topic:1619”]
Sprawdzanie (cmd.getName().equalsIgnoreCase(“”)); jest idiotyczne skoro nie mamy dwóch komend oraz wiemy jaką komendę przypisujemy.
[/quote]

W zasadzie na jedną komendę powinien być jeden executor - dla klarowności.

[quote=”RabbitTheDEV, post:2, topic:1619”]
Importy nie są trudne… polecam CTRL + SHIFT + O
[/quote]

Zależy od IDE.

[quote=”RabbitTheDEV, post:2, topic:1619”]
Code-style na poziomie zerowym.
[/quote]

+1

Btw. @RabbitTheDEV - podrzuć jakieś przykładowe prace, a najlepiej profil na GitHub’ie. Chciałbym na to i owo rzucić oko :stuckouttongue:


luxDev | 2018-01-01 20:14:19 UTC | #6

A i jeszcze to:

[quote=”RabbitTheDEV, post:2, topic:1619”]
Używaj intelki i mavena
[/quote]

Poradnik był robiony rok temu.. więc nie wiem o co ci chodzi z tym IDE jesteś jasnowidzem? wiesz czego używam?

Tak samo styl kodu i ogólnie :)

Tylko spokojnie, nikt tutaj nikogo nie próbuje atakować.


RabbitTheDEV | 2018-01-01 20:37:55 UTC | #7

@anon10657637
Cześć Kacper, jak może zauważyłeś jestem nowy na tym forum. Na discordzie FG jestem od około tygodnia, jeśli masz chęć to zapraszam na pogaduszki :)

@luxDev
Nie zarejestrowałem się aby cię ośmieszyć, daję ci podstawowe rady które powinieneś znać, a dopiero później zabierać się za nauczanie kogoś. Forum to spodobało mi się więc na szczęście (lub dla niektórych nie :stuckouttongue:) będę się udzielał.


Timo | 2018-01-01 20:44:01 UTC | #8

W takim razie przywitaj się z nami tworząc temat w #przywitania oraz przeczytaj Regulamin :D


Jasu | 2020-05-26 10:38:35 UTC | #9

Będzie ten następny poradnik?


logixdev | 2020-05-26 11:32:19 UTC | #10

Ostatnia aktualizacja ponad trzy lata temu i wiele z tych rzeczy już jest nieaktualnych (łącznie z polecaniem Eclipse jako IDE - są lepsze alternatywy jak IntelliJ czy nazewnictwo klas nie do końca poprawne). Warto zacząć od nauki samych podstaw języka Java, obiektowości, potem na bazie tej wiedzy, czytania i rozumienia Bukkit API zacząć pisać. Takie absolutne podstawy i kilka gotowych metod jest tutaj. Dobry kurs Javy (niestety płatny) jest dostępny tu.


system | 2021-02-17 10:31:47 UTC | #11

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.