Pisanie pluginów do Minecraft - #2 Pierwsza komenda

Pytania i problemy
java, bukkit
luxDev
luxDev Pionier

Kontynuuję serię, jednak po długim czasie bo cięzko jest wszystko objaśnić w temacie, zawsze mogę czegoś zapomnieć i źle zrozumiecie, oraz kosztuje to dużo czasu (z ssami) mam nadzieję że robię to dla kogoś a nie tylko dla siebie, chodź na pewno dużo osób się znajdzie.

Ostatni poradnik: (#1 Klik)

W tym poradniku zajmiemy się pierwszą komendą będzie to prawdopodobnie "/czesc" bez Polskich znaków, która będzie odsyłac nam Cześć + nasz nick.

Przechodzimy do projektu, i po extends JavaPlugin dodajemy implements CommandExecutor ma to wyglądać tak

public class Main extends JavaPlugin implements CommandExecutor {

Main to oczywiście nasza główna klasa w której aktualnie pracujemy. Prawdopodobnie znów masz błąd na CommandExecutor jeśli pamiętasz z ostatniego poradnika wystarczy na niego najechać i kliknąc pierwszy import :) lub standardowo CTRL + SHIFT + O

Następnie musimy dodać w onEnable(){ getCommand("czesc").setExecutor(this); to pokaże gdzie pluginowi że w tej klasie znajduje się ta komenda.

oraz w plugin.yml commands: [enter] [dwie spacje] czesc: 690x431

Kolejnym krokiem będzie dodanie metody onCommand

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

CommandSender to jest ten co wysyła wiadomość a sender to po prostu skrócona nazwa której będziemy używać aby dotrzeć do metod z jego klasy np. sender.getName(); możesz to zamienić na np. gracz - gracz.getName(); Command cmd oznacza tą komendę którą możemy potem używać do porównywania rzeczy itd. args[] to są argumenty o których więcej w następnym poradniku np. /czesc to ja

To jest metoda dzięki której będziemy mogli kontrolować co się stanie po wpisaniu danej komendy, aby dodać komende "czesc" dodajemy if(cmd.getName().equalsIgnoreCase("czesc")){

aby odesłać wiadomość do gracza wpisujemy sender.sendMessage("Czesc" + sender.getName()); możemy też z kolorkiem amatorskim sposobem ale szybkim jest użycie znaku "§" zamiast "&" lub też ChatColor Wiadomość na zielono będzie wyglądać w ten sposób sender.sendMessage(ChatColor.GREEN + "Czesc" + sender.getName());

Całość wygląda w ten sposób:

690x431

Oby się nie okazało że zapomniałem o czymś 😄 szczególnie w onCommand bo z pamięci 😛

Timo
Timo Moderator forum.lvlup.pro

Dla początkujących plugino-pisarzy przydatne 😃 Z drugiej strony, prezentujesz to samo co rzekomo znienawidzony Kamilkime, nawet tą samą komendę. (kilka osób go nie lubi, nie wiem czemu)

#######reaktywacja

luxDev
luxDev Pionier

Próbuję jakoś powoli przedstawić samo API, jednak przed pisaniem pluginów powinno sie znać te podstawy Javy.

Marcoral
Marcoral Pionier

Kamilkime wiele rzeczy tłumaczy za szybko, a na końcu filmiku nierzadko kod nie działa, a on szuka, notabene oczywistego, błędu. Dużo łatwiej będą tu miały osoby, które znają język angielski - zagranicznych poradników, w porównaniu do tych w ojczystym języku, jest duuuużo więcej i o ile nie piszemy czegoś w stylu MaRPG to znajdziemy większość tego, co nas interesuje :D

luxDev
luxDev Pionier

Jeszcze kiedyś zdarzyło mi się go oglądać, zawsze mnie to denerwowało że za szybko tłumaczy, i rzeczywiście mało, wgl. moim zdaniem nie powinno się wchodzić do Bukkita jeśli się nie zna podstaw samej Javy, szybko się możesz zniechęcić.

A jeśli ktoś to czyta i chcę ogarnąć to zapraszam http://javastart.pl/ 😄

anon82750602
anon82750602

Oczywiście komendę można przenieść do innej klasy aby nie robić już syfu ;p

getCommand("czesc").setExecutor(new CmdCzesc());

luxDev
luxDev Pionier

Nie mieszaj okej ?

koweq
koweq

A jak zrobić 2 lub więcej komend?

Karolek
Karolek

A czemu nie zrobić tego prościej z pominięciem plugin.yml?

luxDev
luxDev Pionier

Bo to poradnik dla tych co dopiero totalnie zaczynają z Bukkitem?

Marcoral
Marcoral Pionier

Często jak czytam Twoje posty, to mam wrażenie, że chcesz jedynie zabłysnąć wiedzą, niewiele wnosząc do tematu.

Z tego, co się orientuję bez plugin.yml można zrobić to na dwa sposoby: używając PlayerCommandPreProcessEvent lub rejestrując komendę w SimpleCommandMap. W pierwszym przypadku nasza komenda nie będzie kompatybilna z innymi pluginami, w drugim zaś nie będzie kompatybilna z innymi wersjami silnika (dopóki nie użyjemy refleksji, a co do "prostoty" tego rozwiązania nie ma wątpliwości). Wsparcie dla komend w plugin.yml nie powstało bez powodu - jest to bowiem najprostszy sposób ich rejestrowania :)

Karolek
Karolek

Marcoral:

Wsparcie dla komend w plugin.yml nie powstało bez powodu - jest to bowiem najprostszy sposób ich rejestrowania

luxDev:

Bo to poradnik dla tych co dopiero totalnie zaczynają z Bukkitem?

A potem jest masa postów na forum czemu mi komenda nie działa, a okazuje się, że nie dodaliśmy komendy do plugin.yml ;)

Marcoral:

używając PlayerCommandPreProcessEvent

Coś takiego się stosuje? 😮

Marcoral:

rejestrując komendę w SimpleCommandMap

Marcoral:

nie będzie kompatybilna z innymi wersjami silnika

Będzie kompatybilna z wersjami silnika, bo to jest domyślnie w bukkicie a nie nms czy craftbukkit.

Zresztą - jest masa innych frameworków do komend, które mają dużo większe możliwości i są dużo prostsze w obsłudze.

Marcoral:

Często jak czytam Twoje posty, to mam wrażenie, że chcesz jedynie zabłysnąć wiedzą, niewiele wnosząc do tematu. Uwierz mi, że mam identycznie jak czytam Twoje wypociny, związane szczególnie z tym śmiesznym rpg ;) Ale co ja tam wiem ;) Pis joł :>

luxDev
luxDev Pionier

Nie róbcie z tego miejsca drugiego MPC proszę was! opanujcie sie, nikt nie chce zabłysnąc ale pokazać inny sposób, a to jest mój poradnik od początku do końca więc ja go będę prowadził a nie wy okej?

Karolek
Karolek

Ja tam dałem tylko swoją opinię na temat komend. :)

anon10657637
anon10657637

Ogółem nie wiem o co shitstorm. W głównej mierze po coś jednak ten plugin.yml powstał, i używanie jego jak jak najbardziej poprawne. Ja osobiście przy większych projektach korzystam z CommandMapa, wtedy jedną metodą pobieram klasy z projektu, która rozszerzają klasę Command, i się nie musze martwić o to że mi nie zarejestruje komendy. W główniej mierze polecam użycie tego: https://github.com/TheMolkaPL/BukkitCommands - naprawdę, ułatwia zarządzanie komendami :P

anon82750602
anon82750602

PlayerCommandPreprocessEvent nie rejestruje nam komendy, co najwyżej będzie działała tylko u gracza, a co do commandMap - tak używa się tu refleksji, ale póki co siedzi to w Bukkicie nie NMS więc między wersjami powinno być kompatybilne.

koweq
koweq

To... Mogę się wreszcie dowiedzieć jak zrobić 2 i więcej komend?

koweq
koweq

Zauważyłem wcześniej ale dzięki ;)

Kamilkime
Kamilkime Regularny

Poradnik stary, ale - może czas, żeby podzielił los moich z YT? Implementowanie CommandExecutor'a w głównej klasie pluginu, niepotrzebna rejestracja executor'a, używanie sysout do logowania wiadomości, sprawdzanie nazwy komendy w onCommand(), returnowanie false'a...

Ogólnie widzę ostatnio ludzi korzystających z tego poradnika, kończą podobnie jak po moich - nic naprawdę nie umieją, głównie kopiują kod z poradnika nie zastanawiając się zbytnio nad tym co robią. Niestety - śmiem twierdzić, że takie poradniki w polskiej społeczności MC są zgubne i robiąc je w większości wszyscy przyczyniamy się do pogłębiania problemu sprzedaży marnej jakości pluginów, nieswojej pracy, itd. 😕

Byłbym za zniknięciem tego poradnika, albo odświeżeniem go w jakiś mądry sposób, chociaż nie wiem czy to drugie jest w ogóle w tej społeczności możliwe...

system
system

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