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

Pytania i problemy
java, bukkit
luxDev
luxDev Pionier

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

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

690x431

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:

690x431

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 😄

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:

690x431

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? 😄 (Około +/- ponad 1h.) Jeśli o czymś zapomniałem czekam na komentarze :P

Do zobaczenia w następnym poradniku.

RabbitTheDEV
RabbitTheDEV

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
luxDev Pionier

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
DoreK α-tester v3

image|263x118 :thinking: image|408x62

To raczej jakiś żart.

anon10657637
anon10657637

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:

RabbitTheDEV:

Nie “paczka” tylko pakiet. +1

RabbitTheDEV:

Naucz się korzystać z metod, utilsów, a nie ciągłe ChatColor lub co gorsza paragrafy.

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ć.

RabbitTheDEV:

Używaj intelki i mavena. 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 ;)

RabbitTheDEV:

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. I tak i nie - tutaj można robić wieloma sposobami, jednak oficjalnie powinno się robić całość za pośrednictwem CommandExecutora ;)

RabbitTheDEV:

Komendy w plugin.yml są źle wytabowane SnakeYAML ma do tego walidacje i wszystko ogarnie (bynajmniej tak na najnowszych wersjach jest).

RabbitTheDEV:

Nie podajemy wersji 0.0.0 - jest to idiotyczne. Podane przykładowo, to widać.

RabbitTheDEV:

Nie używamy polskich znaków. 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 😛

RabbitTheDEV:

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!”);

+1

RabbitTheDEV:

Sprawdzanie (cmd.getName().equalsIgnoreCase("")); jest idiotyczne skoro nie mamy dwóch komend oraz wiemy jaką komendę przypisujemy.

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

RabbitTheDEV:

Importy nie są trudne… polecam CTRL + SHIFT + O

Zależy od IDE.

RabbitTheDEV:

Code-style na poziomie zerowym.

+1

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

luxDev
luxDev Pionier

A i jeszcze to:

RabbitTheDEV:

Używaj intelki i mavena

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
RabbitTheDEV

@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 😛) będę się udzielał.

Timo
Timo Moderator forum.lvlup.pro

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

Jasu
Jasu

Będzie ten następny poradnik?

logixdev
logixdev

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
system

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