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

Tworzenie pluginów dla Bukkit


piotrek54PL

Rekomendowane odpowiedzi

Opublikowano

Ostatnia aktualizacja: 15 luty 2014

 

 

 

 

Tutoriall pisany pod wersją minecraft 1.5.2, i gwarantuję że na nim działa, ale na wyższych/niższych też powinno.

#1 Przygotowania bucketLava.pngNowy

Witaj w moim tutoriallu ! Mam nadzieję że dużo się z niego nauczysz i dasz like pod tematem :) Jeśli napotkasz na jakiś problem przeczytaj dany punkt jeszcze raz, sprawdź czy wszystko wykonałeś i przeczytaj FAQ. Jeśli błąd nadal występuje napisz odpowiedź pod tematem !
 
Krokiem pierwszym jest pobranie najnowszej wersji JRE i JDK. To pierwsze służy do uruchamiania aplikacji java na komputerze, zapewne już to masz ale nie szkodzi zainstalować najnowszą wersję. To drugie pozwala na zamianę kodu napisanego w javie na kod zrozumiały dla interpretera javy, czyli JRE.
 
apple.pngZ pomocą panelu sterowania usuń wszystkie wersje javy z komputera.
apple.pngPobierz najnowsze JRE i JDK stąd: https://jdk7.java.net/download.html
apple.pngPobrane pliki uruchom i zainstaluj.
 
Teraz czas na instalację IDE, czyli Zintegrowanego Środowiska Programistycznego, jest to mocno rozbudowany edytor tekstu który podczas pisania kodu automatycznie będzie wskazywał błędy, pozwalał je naprawić a co najważniejsze, jednym kliknięciem użyje JDK do zamiany całego kodu który napisaliśmy na plik .jar, który wrzucimy do folderu /plugins.
 
appleGold.pngPobieramy Eclipse IDE for Java Developers stąd: http://www.eclipse.org/downloads/
appleGold.pngUpewniamy się że pobraliśmy wersję bez EE w nazwie ;]
appleGold.pngWypakowujemy zawartość pobranego archiwum do dowolnego folderu.
 
Gotowe ! Możemy teraz zacząć tworzyć pluginy !

 

 

#2 Tworzenie nowego projektu bucketLava.pngNowy

W tej części zajmiemy się stworzeniem swojego pierwszego projektu ! Zaczynamy !
 
appleBlue.pngOdpal Eclipse, pojawi się okienko Workspace Launcher, wybieramy tam miejsce przechowywania projektów. Polecam zostawić domyślne, zaznaczyć Use this as the default i kliknąć OK. painting.png
appleBlue.pngTeraz utworzymy nowy projekt, wybieramy z menu File -> New -> Java Project painting.png
appleBlue.pngWpisujemy nazwę projektu, np. "Moja pierwsza wtyczka",  reszty nie zmieniamy. Potwierdzamy przyciskiem Finish painting.png
 
Narazie nasz projekt jest pusty, z lewej strony po rozwinięciu jego nazwy mamy tylko foldery src i JRE System Library. W tym pierwszym będziemy przechowywać pakiety (package) a w pakietach klasy, czyli pliki w których piszemy kod. W tym drugim folderze są pliki javy zawierające domyślne funkcje. Ale my zanim zaczniemy kodzić musimy zrobić jeszcze jedną rzecz. Dodać funkcje bukkita byśmy mogli ich używać !
 
apple.pngPobieramy bukkita (Nie myl z craftbukkitem, craftbukkit to serwer!) stąd: http://dl.bukkit.org/downloads/bukkit/ -najlepiej jest pobrać Recommended Build, ewentualnie Beta Build.
apple.pngPobrany plik kopiujemy w dowolne, bezpieczne miejsce np. do folderu z eclipsem lub do Moje Dokumenty.
apple.pngW eclipse, klikamy prawym na nazwę swojego projektu -> Wybieramy Build Path -> Add External Archives painting.png
apple.pngWskaż przed chwilą pobrany plik i kliknij OK, gotowe !
 
Ostatnia czynność, dodanie bukkitowych JavaDocs czyli dokumentacji !
appleGold.pngOtwieramy gałąź Referenced Libraries, klikamy prawym na plik bukkita i wybieramy Properties painting.png
appleGold.pngZ lewej strony wybieramy Javadoc Location
appleGold.pngW Javadoc URL wklejamy link, w zależności od tego jaką wersję bukkita pobraliśmy:
Recommended build:

http://jd.bukkit.org/rb/apidocs/

Beta build:

http://jd.bukkit.org/beta/apidocs/

appleGold.pngZatwierdzamy okeyem, i gotowe !
 
To by było na tyle z tego punktu, w następnym zajmiemy się stworzeniem podstawowych plików pluginu !

 

 

#3 Konfiguracja projektu i podstawowe pliki bucketLava.pngNowy

Teraz stworzymy własną paczkę, w której będziemy przechowywać swoje klasy. Pamiętaj że nazwa paczki musi być unikalna!
 
appleBlue.pngKlikamy prawym na folder src, potem New i Package painting.png
appleBlue.pngW pole name wpisujemy nazwę, składa się ona z kilku części.
Część pierwsza - My, jeśli posiadamy swoją domenę to np. pl.piotrek54pl a jeśli nie to zalecane jest by użyć swojego adresu email: com.gmail.piotrek54pl a jeśli nie mamy go (LOL) to robimy tak: me.piotrek54pl
Część druga - To zazwyczaj jednowyrazowa nazwa naszego pluginu, przykładowo: pierwszy
Całość powinna wyglądać tak painting.png

com.gmail.piotrek54pl.pierwszy

appleBlue.pngPotwierdzamy Finish.
 
Następnie tworzymy klasę główną, to od niej będzie dobijał się craftbukkit podczas uruchamiania serwera, od niej się wszystko zaczyna :]
apple.pngKlikamy prawym na naszą paczkę -> New -> Class
apple.pngNazwa dowolna, ale polecam nazwę naszego pluginu przy czym bez spacji, ale każdy nowy wyraz z dużej litery - by było schludniej ! U mnie to wygląda tak: painting.png
apple.pngKlikamy Finish i nasza klasa została utworzona ! Narazie nic w niej nie ruszamy !
 
Ostatni krok ! Robimy plik plugin.yml, bukkit zaczyna od tego pliku, pobiera z niego informacje o autorze, nazwę pluginu, lokalizację klasy głównej, listę komend użytych w pluginie itd.
appleGold.pngKlikamy prawym na folder src -> New -> File
appleGold.pngJako nazwę wpisujemy plugin.yml
appleGold.pngTeraz rzecz bardzo ważna: Nie używaj tabulatorów ! Czyli przycisku TAB na klawiaturze bo poprostu bukkit go nie lubi i wywala masę błędów gdy go napotka. Zamiast niego użyj spacji!
appleGold.pngPlik otworzy się w notatniku, zamknij go. W eclipse przeciągnij plik na środek - wtedy otworzy się w eclipse.
appleGold.pngWklej do niego to: paper.png (Najlepiej RAW Paste Data)
appleGold.pngOczywiście musisz w nim zmienić wszystko to co zmieniłeś u siebie, np. main, main jest to lokalizacja klasy głównej, jest to poprostu Nazwapaczki.Nazwaklasy (bez rozszerzenia)
 
To by było na tyle z tej części, masz już swój projekt który nic nie robi, ale jak jesteś bardziej spostrzegawczy od żółwia błotnego to zauważyłeś że w pliku plugin.yml powiedzieliśmy bukkitowi że mamy komendę - dodamy ją w następnym kroku  :)

 

#4 Pierwsza komenda. bucketLava.pngNowy

Nareszcie zajmiemy się kodzeniem, stworzymy prostą komendę która będzie wyświetlała wiadomość na czacie.
 
apple.pngOtwórz swoją główną klasę, narazie jest pusta. Zamień cały plik, oprócz pierwszej linijki, na ten: paper.png
apple.pngTeraz po kolei: do naszej klasy głównej dopisaliśmy 2 metody: onEnable i onDisable. Jak sama nazwa wskazuje pierwsza wykona się podczas wczytywania pluginu (Dajemy tam np. wczytanie plików konfiguracyjnych itd.) a druga podczas wyłączania.
apple.pngAby zarejestrować nową zmienną musimy stworzyć CommandExecutor, będzie on, podobnie jak onEnable czy onDisable reagował na dane zdarzenie, w tym przypadku: na wpisanie komendy.
apple.pngKlikamy prawym na nasza paczkę, wybieramy New -> Class i wpisujemy nazwę, np. MyCmdExecutor
apple.pngTeraz w linijce 3, po nazwie naszej klasy robimy spację i dopisujemy: implements CommandExecutor
apple.pngPojawi się błąd, klikamy na znaczek błędu i wybieramy import [...]
apple.pngBłąd nie znika, znów klikamy na niego i wybieramy Add unimplemented methods
apple.pngOkey, pojawiło nam się sporo kodu, metoda onCommand z zmiennymi które możemy użyć:
CommandSender arg0 - to jest osoba która wysłała komendę.
Command arg1 - to jest komenda.
String arg2 - to jest label, czyli możemy sprawdzić jak dokładnie wpisał komendę gracz (np. duże/małe litery)
String[] arg3 - to jest tablica (Bo ma takie klamry) z argumentami.
apple.pngJa zmieniłem trochę nazwy by łatwiej na nich operować, ty też tak zrób: paper.png
apple.pngJak już mamy wszystko fajnie przygotowane, czas by coś się działo gdy gracz wpisze komendę. Tak więc wyślemy wiadomość do gracza, aby to zrobić dodaj tą linijkę do onCommand (W sensie w nowej linijce, przed return false;)

sender.sendMessage("Siemango !");

apple.pngZmień też zwracany wynik z false, na true. Gdy jest false dajemy bukkitowi informację że komenda została źle wpisana i że user ma się poprawić. Jeśli jest true to informujemy go że wszystko gra. Całość powinna wyglądać tak: paper.png
 
book.pngZmienna to miejsce w pamięci, gdzie możemy przechowywać np. liczby, napisy lub obiekty !
book.pngMetoda to inaczej funkcja, zwykle spełnia ona dane zadanie np. sprawdza hp gracza.
book.pngMetody i zmienne mogą mieć zasięg:
public - są dostępnie (widoczne) z innych klas
private - są dostępne (widoczne) tylko w klasie w której się znajdują.
book.pngKlasa to zbiór zmiennych i metod.
book.pngZmienna jest dostępna tylko w swojej i podrzędnej przestrzeni, a gdy jej przestrzeń się zakończy to zmienna również zostaje usunięta. Mówiąc przestrzeń mam na myśli nawiasy klamrowe {} painting.png
 
appleGold.pngDobra, mamy CommandExecutor w którym jest onCommand, w którym wysyłamy wiadomość do gracza. No dobra, ale jeszcze nie zarejestrowaliśmy naszego executora w bukkicie, więc nie zostanie on wywołany !
appleGold.pngBędzie to bardzo proste, wracamy do naszej klasy głównej i w onEnable dodajemy linijkę:

this.getCommand("test").setExecutor(new MyCmdExecutor()); 

Tutaj jako nazwę komendy wpisałem test, pamiętaj że musi się ona zgadzać z tą w pliku plugin.yml !
appleGold.pngGotowe, wszystko powinno działać ! Czas na skompilowanie pluginu i wrzucenie go do folderu plugins !
 
appleBlue.pngKlikamy prawym na nasz projekt -> Export -> Zaznaczamy JAR file -> Next
appleBlue.pngKlikamy Browse... i wskazujemy np. pulpit tym samym wybierając nazwę pliku.
appleBlue.pngDajemy Finish iiii GOTOWE ! Możemy skopiować nasz plik do folderu /plugins, odpalić serwer i podziwiać efekt.

 

#5 Sprawdzanie permisji, logger i instanceof bucketLava.pngNowy

Czas na naukę rzeczy, które przydadzą się nam w przyszłości. Zrobimy sobie komendę którą będzie mógł wywołać tylko gracz z daną permisją. Dodatkowo z pomocą loggera napiszemy coś w konsoli.
 
 
apple.pngOtwieramy klasę główną, i w niej (nie w onEnable, przed tym) dodajemy taką linijkę:

public static Logger log;

Gdy pojawi się błąd po prostu klikamy go i importujemy logger.
apple.pngTeraz na końcu onEnable dopisujemy te 2 linijki:

log = getLogger();
log.info("Plugin "+getName()+" zostal wczytany!");

Zauważ że jeśli przed nazwami np. getLogger nie musimy dawać this. , bo jesteśmy w klasie w której te funkcje się znajdują. Cała klasa główna powinna teraz wyglądać tak: paper.png
apple.pngJak pewne zauważyliście najpierw utworzyliśmy zmienna obiektu Logger, potem dodaliśmy tam logger a na końcu użyliśmy go pisząc w konsoli informację log.info(), możemy też napisać ostrzeżenie log.warning() lub błąd log.severe()
 
book.pngTworząc zmienną użyliśmy słówek public static, public już znacie, zaś static oznacza że zmienna jest statyczna, innaczej mówiąc mamy do niej dostęp pisząc NAZWAKLASY.NAZWAZMIENNEJ z dowolnego miejsca w innych plikach i metodach. Gdybyśmy nie użyli tego słówka, to przed użyciem loggera z innego pliku musielibyśmy najpierw utworzyć zmienną obieku NAZWAKLASY a potem odwoływać się do tej zmiennej, nie do klasy.
 
 
appleGold.pngPrzenosimy się do naszego CommandExecutora, kasujemy całą jego zawartość i zamieniamy na tą:

	if(sender instanceof Player)
	{
		Player pl = (Player) sender;
	}
	else
	{
		sender.sendMessage("Nie jestes graczem, pewnie jestes konsola!");
	}
	
	return true; 

W bukkicie CommandSender może dziedziczyć BlockCommandSender, ConsoleCommandSender, RemoteConsoleCommandSender i Player. Czyli łatwo możemy sprawdzić jak została wykonana komenda (przez kogo). Robimy to słówkiem instanceof.
appleGold.pngTeraz jeszcze sprawdzimy permisje, bo chcemy żeby np. komenda wykonywała się tylko gdy gracz ma do tego prawo :)
Cała zawartość onCommand będzie wyglądać tak:

		if(sender instanceof Player)
		{
			Player pl = (Player) sender;
			if(pl.hasPermission("mojapierwszawtyczka.test"))
			{
				pl.sendMessage("Co porabiasz ? :]");
			}
			else
			{
				pl.sendMessage("YYYY nie masz do tego praw milordzie !");
				MojaPierwszaWtyczka.log.warning("Gracz nie ma praw do komendy test!");
			}
		}
		else
		{
			sender.sendMessage("Nie jestes graczem, pewnie jestes konsola!");
		}
		
		return true; 

To by było na tyle, wiesz już jak sprawdzić permisje, obsługiwać loggera i sprawdzać czy dany obiekt zawiera inny obiekt.
 
book.pngPodobnie jak z CommandSenderem możemy np. sprawdzić rodzaj moba. Przykładowo mamy obiekt Entity, wchodzimy na stronę: http://jd.bukkit.org/rb/doxygen/de/dd5/interfaceorg_1_1bukkit_1_1entity_1_1Entity.html rozwijamy "Inheritance Diagram" i mamy schemat :) Czyli czym może być entity, przykładowo Entity może być Arrow lub Monster, klikając na Monster i rozwijając jego schemat możemy zobaczyć że Monster może być Creeper. Czyli można w prosty sposób sprawdzić czy entity to jest creeper pisząc if(Entity instanceof Creeper)

 

 

#5 Komenda w zewnętrznym pliku + obsługa argumentów bucket.pngNieaktualny!


Tutaj zajmiemy się możliwościami jakie dają komendy, a dokładniej ARGUMENTY. Oraz damy komendę do osobnego pliku !

Komenda w zewnętrznym pliku



Pierw musimy utworzyć ten nowy plik, Kliknij prawym na swoją paczkę -> New -> Class i nazwij ją przykładowo: MyCommandExecutor. W naszej głównej klasie, dokładniej w onEnable dodaj taką linijkę:
getCommand("weedcraft").setExecutor(new MyCommandExecutor());

oczywiście zamiast weedcraft możesz wpisać dowolną komendę (Pamiętaj o dodaniu jej do plugin.yml !), ważne by MyCommandExecutor nazywało się dokładnie tak samo jak dopiero co utworzona klasa.Nie patrz na błędy jakie się pojawią, zaraz je naprawimy.

Wróćmy do naszego pliku, musimy w nim zmienić parę rzeczy, dokładniej:
8245.jpg
Możesz wyeksportować i sprawdzić czy działa. U mnie działa :D
Pamiętaj aby upewnić się że komenda istnieje i nazywa się tak samo we wszystkich plikach: W klasie głównej, w plugin.yml i w executorze !

Obsługa argumentów



Teraz zajmiemy się ARGUMENTAMI.W klasie onCommand, która znajduje się w klasie MyCommandExecutor wpisz to:
4317.jpg

Oto co się stanie:
89456.jpg
Proste ? BANALNE ! (Przynajmniej dla mnie :D)

A tutaj taki bonusowy kodzik, sprawdzanie czy komenda została wpisana przez gracza, a jeśli tak to wypisanie informacji o nim :)
584.jpg

Wynik:
8890.jpg



 
#6 Listener i eventy bucketWater.pngDo zmiany


Stworzenie Listenera



W tym punkcie stworzymy listener - jest to specjalna klasa która przechowuje metody które mają zostać uruchomione na skutek jakiegoś wydarzenia.Otwórzmy nasza główną klasę, tam gdzie mamy onEnable, onDisable itp.itd.
Dopiszmy tam ( w klasie głównej) to:
4912.jpg
Analizujemy:
Słówka public class myPlayerListener implements Listener mówią że tworzymy nową klasę myPlayerListener zawierającą "Listener".
Teraz ważne, przed metodą która wykonuje się przy zginięciu moba/gracza jest taka formułka: @EventHandler , zaraz po niej MUSI być metoda. Formułka ta mówi Listenerowi że ma uruchomić tą metodę w wypadku zdarzenia (W tym przypadku śmierci).

@Listener jest to coś co cały czas obserwuje serwer i uruchamia odpowiednie metody.

Ostatnią rzeczą jaką trzeba zrobić i jednocześnie najważniejszą rzeczą jest zarejestrowanie listenera, robimy to dopisując do metody onEnable takie coś:
9999.jpg

Priorytety


Każdej metodzie możemy nadać odpowiedni priorytet, dzięki czemu jedne zadania dla listenera będą ważne a inne mniej ważne co może odciążyć - a przy nieodpowiednim stosowaniu OBCIĄŻYĆ serwer. Robimy to poprostu zmieniąjąc @EventHandler przed wybraną metodą na:
@EventHandler(priority = EventPriority.NORMAL) , istnieją takie priorytety:
  • EventPriority.LOWEST Najniższy
  • EventPriority.LOW Niski
  • EventPriority.NORMAL Normalny (Domyślny)
  • EventPriority.HIGH Wysoki
  • EventPriority.HIGHEST Bardzo wysoki
  • EventPriority.MONITOR CZAS RZECZYWISTY (Nie polecam - laguje)

Reakcja na zabicie moba nie wymaga jakiejś gigantycznej mocy obliczeniowej więc ustawimy sobie LOW, wysokie priorytety ustawia się raczej w przypadku tworzenia GIER, np. Paintball lub PvP gdzie czas reakcji jest dość ważny. Przy obsłudze tabliczek, jakiś pluginów informacyjnych najlepiej będzie ustawiać LOWEST.

To by było na tyle z listenerów, dla przykładu kodzik rysujący blok stone 5 kratek nad nami gdy się poruszamy.
78945.jpg


 
#7 Modyfikacja/tworzenie bloków w grze.


Okey, stworzymy teraz komendę, której wpisanie stworzy lawę pod naszymi stopami, a jeśli staniemy na rudzie diamentu lub bedrocka to ujrzymy WYBUCH :D Let's go ! W pliku gdzie stworzyliśmy komendę uzupełnijmy ją w ten sposób:
7777.jpg

W zasadzie to nie ma co tu wyjaśniać, wszystko jest napisane. Wypiszę tylko ważniejsze nowo poznane metody:
player.getLocation() Zwraca lokalizację gracza lub moba.
loc.getWorld() Zwraca świat z któego pochodzi lokalizacja, getName możemy zobaczyć jego nazwę.
w.getBlockAt(loc) Zwraca blok z danej lokalizacji
b.getTypeid() Zwraca ID danego bloku
b.setTypeid() Ustawia ID danego bloku

Teraz już wiecie jak zostały wykonane "Magiczne kamienie" na jednym z dość popularnych serwerów :D



 
#8 Edycja ekwipunku skrzyni/graczy. bucketWater.pngDo zmiany


Jeśli czytałeś poprzednie części mojego tuta to znasz już podstawy tworzenia pluginów. Nie muszę więc ci za dużo tłumaczyć. Trzymaj kod programu a następnie go omówię co, gdzie, jak :)
673.jpg

1.Sprawdzamy czy sender to player, jeśli tak - jedziemy dalej.
2.Zamieniamy sendera na playera - bo już wiemy że tak jest.
3.Pobieramy ekwipunek gracza aby móc go edytować/odczytywać co w nim jest.
4.Sprawdzamy czy w ekwipunku znajduje się 264 (diament) i jeśli tak to wyświetlamy wiadomość. Jeśli nie - jedziemy dalej.
5.Tworzymy nowy itemstack (zbiór itemu) który zawiera 1 diament.
6.Dodajemy itemstack do ekwipunku gracza.

Enchant !



Jeśli chcesz, do swojego itemstack możesz dodać enchant. Służy do tego ten prosty kodzik:
7892.jpg

1.Tworzymy itemstack zawierający 1 diametowy kilof.
2.Tworzymy enchantment o ID 35 (Fortune)
Lista ID:


ID - Enchantment - Max Level
0 - Protection - 4
1 - Fire Protection - 4
2 - Feather Falling - 4
3 - Blast Protection - 4
4 - Projectile Protection - 4
5 - Respiration - 3
6 - Aqua Affinity - 1
16 - Sharpness - 5
17 - Smite - 5
18 - Bane of Arthropods - 5
19 - Knockback - 2
20 - Fire Aspect - 2
21 - Looting - 3
32 - Efficiency - 5
33 - Silk Touch - 1
34 - Unbreaking - 3
35 - Fortune - 3


3.Dodajemy enchantment o poziomie 3 do itemstacka.
4.Dodajemy itemstack do ekwipunku gracza.



 
#9 Spawnowanie mobów, informacje o nich. bucketWater.pngDo zmiany


Spawnowanie mobów



Czas na zabawę ! Zaczynamy od zespawnowania creepera tam gdzie stoi gracz po wpisaniu komendy. Rozrywka gwarantowana!
341.jpg
1.Pobieramy informacje o świecie na którym jest gracz.
2.Pobieramy jego lokalizację.
3.Spawnujemy creepera na danym świecie na podanej lokalizacji.

Co, jeśli chcemy zespawnować creepera w innym miejscu niż tam gdzie stoi gracz ? Np. na podstawie coordów ?
163.jpg
1.Konwertujemy string (napis) do double (liczba zmiennoprzecinkowa) i zapisujemy je.
2.Tworzymy lokalizację o podanych koordach i spawnujemy tam creepera.

Informacje o mobach/graczach


Teraz pobierzemy sobie trochę informacji o mobach, powróćmy do listenerów. Wejdź do swojej klasy głównej i uzupełnij swój listener. (Nie posiadasz go ? Zajrzyj do części o listenerach !)
724.jpg
1.Sprawdzamy czy damager (zadający obrażenia) to gracz (a nie np. ogień)
2.Pobieramy sobie damagera i defendera (Tego kto się broni)
3.Wyświetlamy informacje o defenderze.
Teraz skompiluj kod i odpal serwer. Uderz kogoś lub jakiegoś moba. Na chacie pojawią się informacje :D

Na koniec, coś na rozluźnienie, czyli podpalanie wszystkiego i wszystkich w promieniu 100 kratek :)
720.jpg
1.Pobieramy listę wszystkich mobów/graczy/potworów z okolicy 100 kratek x,y i z.
2.Robimy pętlę. Czyli będziemy podpalać każdego "Entity" bo kolei.
3.Podpalamy ustawiając czas palenia na 20 000 ticków.



 
#10 Konfiguracja i plik Config.yml bucketWater.pngDo zmiany


Teraz zajmiemy się czymś, co jest najbardziej potrzebną rzeczą podczas tworzenia pluginów dla ludu. No więc zaczynamy od stworzenia tworzenia domyślnej konfiguracji, czyli stworzenia pliku Config.yml gdy go nie będzie.
349.jpg
Jak widać stworzyliśmy sobie listę, tekst(String), liczbe(int) i wartość logiczną(boolean) a następnie zapisywaliśmy config.
Teraz czas na odczytanie danych, wpisujemy to oczywiście w onCommand :D
123123.jpg
 
Na koniec export, odpalamy serwer, wpisujemy /komenda i patrzymy na chat xD A potem jeszcze warto wejść do plugins/NAZWAPLUGINU/Config.yml i zobaczyć jak on wygląda. Jak widać podczas dodawana i odczytywania wartości podajemy "ścieżkę" , czyli oddzielone kropkami nazwy sekcji w yamlu.
 
PS Jeśli ktoś by potrzebował, aby USTAWIĆ wartość (nie domyślną) to używamu komendy:

config.set("Przykladzik.taknie", false);

a po tym jak zmienimy wartości które chcieliśmy zmienić to dejemy:

saveConfig();

 



#11 Inna zmienna dla każdego gracza bucketWater.pngDo zmiany


Siemanko ! W tej części pokażę ci jak utworzyć zmienną, np. String (napis) dla każdego gracza z osobna ! Zrobimy plugin na notatki :)
Zakładam że posiadasz już działający plugin z CommandExecutorem.
 
Pierw zaglądamy do pliku plugin.yml, możemy użyć istniejącej komendy, ja użyję swojej:

commands:
  notatka:
    description: Zapisuje notatke
    usage: /notatka (TRESC)
    aliases: [note, n] 

 
Tak wygląda moja klasa główna:

 

package com.gmail.piotrek54pl.tutoriall;

import java.util.logging.Logger;
import org.bukkit.plugin.java.JavaPlugin;

public class Notatka extends JavaPlugin
{
	public static Logger log;
	
	@Override
    public void onEnable(){
		log = this.getLogger();
		getCommand("notatka").setExecutor(new MyCmdExec());
		log.info("Plugin notatka zostal wczytany !");
    }
	
	@Override
    public void onDisable(){
    }
} 

 


 
A tak plik MyCmdExec.java (Który też musicie mieć, niekoniecznie o tej nazwie):

 

package com.gmail.piotrek54pl.tutoriall;


import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

public class MyCmdExec implements CommandExecutor{

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

}
 

 


 
Więc zaczynamy kodzić. Pierwszym krokiem jest utworzenie 2 list, w których będziemy przechowywać notatki użytkowników, oraz użytkowników do których te notatki należą. Tak więc tworzymy 2 listy, oto moja klasa główna po zmianach:

 

public class Notatka extends JavaPlugin
{
	public static Logger log;
	public static List<String> gracze;
	public static List<String> notatki;
	
	@Override
    public void onEnable(){
		log = this.getLogger();
		getCommand("notatka").setExecutor(new MyCmdExec());
		
		gracze = new ArrayList<String>();
		notatki = new ArrayList<String>();
		
		log.info("Plugin notatka zostal wczytany !");
    }
	
	@Override
    public void onDisable(){
    }
} 

 


 
Mamy gdzie notatki przechowywać, teraz czas na obsługę zapisywania/odczytywania notatek. Przechodzimy do CommandExecutora. Robimy ifa który sprawdzi ilość argumentów, jeśli argumentów brak to sprawdzi czy jest zapisana notatka i jeśli jest to ją wyświetli:

 

public class MyCmdExec implements CommandExecutor{

	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label,String[] args) {
		if(args.length == 0)
		{
			if(!Notatka.gracze.contains(sender.getName()))
			{
				sender.sendMessage(ChatColor.RED+"Brak notatki !");
			}
			else
			{
				int ID = Notatka.gracze.indexOf(sender.getName());
				sender.sendMessage(ChatColor.DARK_AQUA+Notatka.notatki.get(ID));
			}
		}
		else
		{
			
		}
		
		return true;
	}

} 

 


 
Odczytywanie mamy, teraz zapisywanie notatki. Jest to dość proste: Gdy gracz wpisze choć jeden argument to zamienia argumenty na string a następnie tworzy nowy obiekt w liście ze swoim nickiem i w drugiej liście zapisuje stringa:

 

public class MyCmdExec implements CommandExecutor{

	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label,String[] args) {
		if(args.length == 0)
		{
			if(!Notatka.gracze.contains(sender.getName()))
			{
				sender.sendMessage(ChatColor.RED+"Brak notatki !");
			}
			else
			{
				int ID = Notatka.gracze.indexOf(sender.getName());
				sender.sendMessage(ChatColor.DARK_AQUA+Notatka.notatki.get(ID));
			}
		}
		else
		{
			String notatka = "";
			for(String wyraz:args)
			{
				notatka += wyraz+" ";
			}
			
			if(Notatka.gracze.contains(sender.getName()))
			{
				int ID = Notatka.gracze.indexOf(sender.getName());
				Notatka.notatki.set(ID,notatka);
			}
			else
			{
				Notatka.gracze.add(sender.getName());
				Notatka.notatki.add(notatka);
			}
			
			sender.sendMessage(ChatColor.GREEN+"Notatka zapisana !");
		}
		
		return true;
	}

} 

 


 
To by było na tyle, kombinujcie, testujcie a może gdzieś zajdziecie. Pozdro ! :D


 
#+1 Co? Gdzie? Jak? bucketWater.pngDo zmiany


784.jpg



FAQ bucketWater.pngDo zmiany
#1 Nie działa
U mnie działa.
#2 Nie chce się wyeksportować.
Upewnij się że nie ma błędów. Jeśli widzisz czerwonego X obok jakiejś linijki oznacza to że coś w niej spieprzyłeś. Kliknij na tego X, eclipse poda ci propozycję co należy zrobić by było dobrze.
#3 Importy, biblioteki, co to jest ?
Są to "książki z funkcjami", funkcjami czyli w javie metodami. Te biblioteki zawierają listę funkcji(metod) których możesz użyć. Jak chcesz używać PermissionsEx musisz zaimportować biblioteki odpowiedzialne za permissionsEx. Jak to zrobić ? Kliknij przyciskiem myszy na błąd który się pojawia (Taki X obok linijki z błędem) i wybierz "Import....", pamiętaj aby importować (jeśli jest taki wybór) od bukkit.org a nie od innych.
6ltqex.jpg
#4 Pojawia się "Command not found" a wszystko jest dobrze.
Widocznie nie jest dobrze, mogę się założyć że na 75% nie dopisałeś swojej komendy do pliku plugin.yml

bucketLava.png - Punkt jest aktualny i w 100% skończony, ucz się do woli !
bucketWater.png - Punkt jest aktualny, ale panuje w nim nieład i chaos. Jeśli doszedłeś do tego punktu - poczekaj na updejt, jeśli już go czytasz - dokończ naukę.
bucket.png - Punkt jest nieaktualny ! Nie ucz się z niego !
 
 


Nie bądź żyd, lajknij

  • Odpowiedzi 496
  • Dodano
  • Ostatniej odpowiedzi
Opublikowano

Opisałbyś dla nich co robi return true; return false; a tak to fajnie, kontynuuj to, może coś więcej Ci z tego wyjdzie niż z mojego ;X

 

w plugin.yml napisałeś zbędne rzeczy.

<>

Opublikowano

@up

Z tym plugin.yml to chyba masz racje.Bralem to z oficjalnej dokumentacji ale przecie używamy własnego permissions. A to zwracanie wartości pamiętam że w którejś części poradnika to wyjaśniałem, ale edytowałem go kilka razy więc może to wywaliłem. Dzięki za zainteresowanie:-)

Opublikowano

Super poradnik.Bede z niego korzystał.Jednak nastepnym razem numeracje "//1" rob ciagla 1,2,3,4,5,6 itd. Bo sam miałem problemy z odczytaniem tego.

A to super

4.png

  • 3 tygodnie później...
Opublikowano

A mi nie działa sprawdzanie tego czy gracz wpisał komende.

Co trzeba do tego zaimportować?

Opublikowano

Kiedy można się spodziewać dalszej części poradnika ?

@Edit

package JodaMinecraft.Wtyczka;
import java.util.logging.Logger;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import ru.tehkode.permissions.PermissionUser;
import ru.tehkode.permissions.bukkit.PermissionsEx;
import ru.tehkode.permissions.PermissionManager;
public class Wtyczka extends JavaPlugin
{
protected static final Logger log = Logger.getLogger("Minecraft");

@Override
public void onEnable()
{
 log.info("[Wtyczka] Zostala wczytana !");
}

//1
@Override
public void onDisable()
{
 log.info("[Wtyczka] Zostala wylaczona !");
}

//2
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
 //3
 if(cmd.getName().equalsIgnoreCase("weedcraft"))
 {
  PermissionManager pex = PermissionsEx.getPermissionManager();
  PermissionUser[] admins = pex.getUsers("Admin");
  PermissionUser[] mods = pex.getUsers("Mod");
  sender.sendMessage(ChatColor.AQUA + "--Administratorzy--");
  if(admins.length == 0)
  {
   sender.sendMessage(ChatColor.GRAY + "Brak");
  }
  else
  {
   for(int i = 0; i < admins.length;i++)
   {
 sender.sendMessage(admins[i].getName());
   }
  }
  sender.sendMessage(ChatColor.DARK_GREEN + "--Moderatorzy--");
  if(mods.length == 0)
   sender.sendMessage(ChatColor.GRAY + "Brak");
  else{
   for(int i = 0;i <mods.length;i++)
   {
 sender.sendMessage(mods[i].getName());
   }
  }
  return true;
 }
 return false;
}

Co jest zle w tym kodzie ?

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...