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 pluginu


joda17orginal

Rekomendowane odpowiedzi

Opublikowano

Do napisania tego tuta skłoniła mnie wzrastająca popularność skryptów, tym poradnikiem zamierzam przekonać wiele osób do pisania pluginów. Panuje przekonanie, że żeby pisać pluginy trzeba znać dobrze jave, nie zgadzam się z tym, czego sam jestem przykładem, ale trzeba znać podstawową składnię, na szczęście jest ona prawie identyczna w każdym języku programowania ;)

 

Nie jestem kimś kto się lubi rozpisywać, dlatego będę pisał krótko i na temat.

 

 

Potrzebne rzeczy

 

Eclipse

 

Najlepiej wersja standard.

http://www.eclipse.org/downloads/

Bukkit

 

Wybieramy wersję pod którą tworzymy plugin.

P.S. Bukkit, to nie CraftBukkit.

http://dl.bukkit.org/downloads/bukkit/

Tworzenie pierwszego projektu

 

Nowy projekt w eclipse

 

W menu klikamy

File > New > Java Project

W Project name wpisujemy nazwę naszego pluginu, ja będe używał nazwy MPCTutPlugin

Klikamy Next

Wybieramy zakładkę Libraries

Wciskamy Add External JARs

I wybieramy naszego wcześniej pobranego Bukkita.

Klikamy Finish

 

Nowa paczka

 

Paczki w projekcie, tworzą nam coś w stylu folderów, nam wystarczy jedna, ale w większych pluginach przydają się one w większych ilościach, do pewnego rodzaju segregacji plików.

 

Po lewej stronie w eclipse znajduje się lista projektów, klikamy prawym przyciskiem myszy na nasz projekt, i wybieramy

New > Package

 W pole Name musimy podać nazwę paczki. Jest tutaj parę możliwości

  • Jeśli masz własną domenę, możesz użyć jej od końca np. dla domeny abc.pl, poprawną wersją będzie pl.abc, ale ponieważ paczki różnych pluginów nie powinny nazywać się tak samo, najlepiej dać pl.abc.<nazwa_pluginu>
  • Jeśli zamierzasz trzymać kod źródłowy na platformie zarządzania, typu GitHub, możesz uzyskać subdomenę <nazwa>.github.com, jeśli taką uzyskasz, postępuj tak jak z punktem pierwszym
  • Możesz użyć swojego maila, np. dla maila [email protected], com.gmail.abc.<nazwa_pluginu>
  • Podobnie do wyżej opisanej metody, można użyć swojego konta na jakimś serwisie np. pl.mpcforum.joda17orginal.mpctutplugin
  • Ostatnią, nie zalecaną możliwością jest ustawienie jakiejś własnej nazwy np. <nick>.<nazwa_pluginu>

Ja użyję nazwy pl.mpcforum.joda17orginal.mpctutplugin

 

Główna klasa projektu

 

Aby utworzyć nową klasę w liście projektów po lewej stronie w eclipse rozwijamy nasz projekt, następnie rozwijamy folder src. Powinno to wyglądać  tak

\/ <nazwa_projektu>
      \/ src
            <nazwa_paczki>

A w moim wypadku

\/ MPCTutPlugin
     \/ src
           pl.mpcforum.joda17orginal.mpctutplugin

Klikamy prawym przyciskiem myszy na nazwę paczki i wybieramy

New > Class

W polu Name podajemy nazwę naszej klasy, jest ona dowolna. Ja użyję main.

Klikamy Finish

 

Powstała klasa powinna wyglądać tak

package <nazwa_paczki>;

public class <nazwa_klasy> {

}

W moim wypadku wygląda tak

package pl.mpcforum.joda17orginal.mpctutplugin;

public class Main {

}

Uzupełnienie głównej klasy projektu

 

Metoda to nic innego, jak znana z wielu innych języków programowania funkcja. Możemy w niej trzymać kod, do wielokrotnego uruchomienia, który będzie zawsze wykonywał ten sam algorytm. Jeśli jeszcze tego nie rozumiesz, to zrozumiesz w dalszej części tuta.

 

Aby móc używać metod z bukkita, musimy je od niego "pobrać", co fachowo nazywa się dziedziczeniem. Zrobimy to dodając extends JavaPlugin do public class <nazwa_klasy>. Całość wygląda tak

public class <nazwa_klasy> extends JavaPlugin {

}

Teraz zaczyna się piękno eclipse, teraz bylibyśmy zmuszeni do szukania gdzie znajduje się ta klasa, i dodania importu. Eclipse na szczęście wyręcza nas pokazując po lewej stronie od kodu symbol błędu, którego umie naprawić. Ten symbol to żarówka z krzyżykiem na czerwonym tle.

Klikamy na ten symbol Lewym przyciskiem myszy, i z pokazanej listy propozycji naprawy błędu wybieramy import 'JavaPlugin' (org.bukkit.plugin.java). Do góry w kodzie dopisze się linijka

import org.bukkit.plugin.java.JavaPlugin;

Uwaga! Jeśli nie masz po kliknięciu propozycji naprawy błędu, przez import to znaczy, że źle lub wcale nie dodałeś bukkita podczas tworzenie projektu. Możesz to naprawić klikając prawym przyciskiem myszy, w lewym menu, na nazwę projektu i wybierając Build Path > Configure Build Path. Po czym musisz wcisnąć Add External JARs i wybrać bukkita.

 

Całość u mnie wygląda tak

package pl.mpcforum.joda17orginal.mpctutplugin;

import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{

}

Teraz pora na dwie bardzo ważne metody. Pierwsza z nich to

public void onEnable() {
}

Wszystko co jest w niej umieszczone wykona się podczas startu pluginu

Druga to

public void onDisable() {
}

Jak łatwo się domyślić wykona się ona, podczas wyłączenia pluginu. Uwaga! W przypadku crasha, lub innego nieoczekiwanego zamknięcia metoda onDisable() nie wykona się!

 

Przed tymi dwoma metodami musimy dodać @Override, informuje to kompilator o tym, że ta metoda ma nadpisać identyczną metodę w  klasie JavaPlugin. Jeśli tego nie rozumiesz to też nie panikuj, jak przyjdzie czas, to zrozumiesz ;)

 

A więc całość wygląda tak

package pl.mpcforum.joda17orginal.mpctutplugin;

import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{
	
	@Override
	public void onEnable() {
		
	}
	@Override
	public void onDisable() {
		
	}
	
}

Aby przekonać się czy nasz plugin zadziała do metod dodajemy linijkę, która wyświetli info przy starcie oraz wyłączeniu. Wygląda to tak

package pl.mpcforum.joda17orginal.mpctutplugin;

import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{
	
	@Override
	public void onEnable() {
		System.out.print("[MPCTutPlugin] Plugin został uruchomiony");
	}
	@Override
	public void onDisable() {
		System.out.print("[MPCTutPlugin] Plugin został wyłączony");
	}
	
}

Wszystko zapisujemy skrótem Ctrl + s

 

Plugin.yml  - Informacja o pluginie

 

Aby uruchomić nasz plugin, pozostało nam tylko stworzyć plik plugin.yml. Informuje on serwer o nazwie pluginu, wersji, głównej klasie, komendach i wielu innych rzeczach.

 

Pierwszym krokiem jest utworzenie pliku, aby to zrobić klikamy prawym przyciskiem myszy na nasz  projekt po lewej stronie i wybieramy

New > File

W polu File name wpisujemy plugin.yml, i klikamy Finish

Jeśli pokazał się nam edytor tekstu, zamykamy go.

Klikamy w lewym menu na plik plugin.yml prawym przyciskiem myszy i wybieramy

Open With > Text Editor

Wklejamy w właśnie otworzony plik

name: <nazwa_pluginu>
main: <nazwa_paczki>.<nazwa_glownej_klasy>
version: <numer_wersji>

U mnie wygląda to tak

name: MPCTutPlugin
main: pl.mpcforum.joda17orginal.mpctutplugin.Main
version: 1.0

Zapisujemy (Ctrl + s)

 

Kompilacja

 

Klikamy prawym przyciskiem myszy na projekt w menu po lewej i wybieramy Export.

W nowo otwartym oknie domyślnie powinno być wybrane Java > JAR File, jeśli nie to tak wybieramy.

Klikamy Next

Teraz do góry możemy wybrać jakie pliki będą eksportowane, radzę zostawić tak jak jest ;)

Pod spodem mamy 4 opcje, radzę odznaczyć trzecią, jeśli nie chcemy aby każdy mający plugin mógł odczytać kod źródłowy. Mówi ona o tym, że kod źródłowy jest zapisywany w pluginie razem ze skompilowanym(Można zobaczyć to otwierając plugin jako archiwum).

Teraz najważniejsza opcja, JAR File, podajemy tam nazwę pluginu i ścieżkę, czyli po prostu zapisujemy plik jak każdy inny ;) Radzę zapisać w folderze plugins, zyskujemy na tym dużo czasu, ponieważ nie musimy kopiować pluginu to tego folderu, jak go testujemy.

 

Wyniki

 

Jeśli wszystko zrobiłeś poprawnie, podczas uruchomienia serwera powita cię wiadomość

[00:55:48 INFO]: [MPCTutPlugin] Plugin został uruchomiony

Podczas wyłączenia za to

[00:57:46 INFO]: [MPCTutPlugin] Plugin został wyłączony

Komendy

 

Metoda onCommand()

 

Komenda to podstawowa forma komunikacji z użytkownikiem, można dzięki nim przekazywać informacje do pluginu.

 

Aby nasłuchiwać czy została wpisana komenda, służy metoda onCommand(). Oto jej wzór

public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) {
	if(arg1.getName().equalsIgnoreCase("komenda")){
		
		
		return true;
	}
	return false;
}

Przeanalizujmy po kolei wszystkie ważne elementy

  • public boolean - mówi to o tym, że ta metoda jest publiczne, czyli można uzyskać do niej dostęp z innej klasy, oraz że jest typu boolean, czyli musi zwrócić wynik prawda lub fałsz. Prawdę kiedy komenda została wpisana poprawnie, za to fałsz gdy została wpisana niepoprawnie.
  • onCommand - nazwa naszej metody
  • CommandSender arg0 - mówi to o tym, że pod zmienną arg0 podstawiamy CommandSender'a, czyli osobę która wysłała komendę
  • Command arg1 - mówi to o tym, że pod zmienną arg1 podstawiamy Command, czyli po prostu naszą komendę
  • String arg2 - mówi o tym, że pod zmienną arg2 podstawiamy wpisaną komendę. Od Command arg1 wyróżnia ją to, że jeśli posiadamy alias i gracz go wpisze, do String arg2 zostanie on przypisany, ale do Command arg1 prawdziwa komenda
  • String arg3[] - jest to lista(w wielu językach nazywana tablicą) podanych argumentów
  • arg1.getName().equalsIgnoreCase("komenda") - arg1 to nasza  komenda, getName() pobiera jej nazwę, a equalsIgnoreCase("komenda") sprawdza czy pobrana nazwa to "komenda", nawet kiedy znaki są innej wielkości, o czym mówi IgnoreCase
  • return true / false - zwraca prawdę lub fałsz, zależnie od tego czy komenda została wpisana poprawnie

Aby zobaczyć czy komenda działa, proponuję wysłać w momencie wpisania komendy wiadomość do gracza. Wygląda to tak

public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) {
	if(arg1.getName().equalsIgnoreCase("komenda")){

		arg0.sendMessage("Wpisałeś komende: komenda");

		return true;
	}
	return false;
}

Teraz pora umieścić ją w naszej klasie, powinno wyglądać to tak jak u mnie

package pl.mpcforum.joda17orginal.mpctutplugin;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{
	
	@Override
	public void onEnable() {
		System.out.print("[MPCTutPlugin] Plugin został uruchomiony");
	}
	@Override
	public void onDisable() {
		System.out.print("[MPCTutPlugin] Plugin został wyłączony");
	}
	
	public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) {
		if(arg1.getName().equalsIgnoreCase("komenda")){


			
			return true;
		}
		return false;
	}
	
}

P.S. Znowu powinien się w eclipse error poprawić, klikamy na niego i wybieramy import (;

 

Informowanie bukkita o komendzie

 

Aby bukkit widział o tym, że nasz plugin oczekuje takiej komendy, musimy dodać następującU mnie wygląda to take info do plugin.yml

commands:
   <nazwa_komendy>:
      description: <opis_komendy>
      usage: <jak_poprawnie_wpisac_komendy>
      permission: <permisja>
      permission-message: <informacja_o_braku_permisji>

U mnie wygląda to tak

name: MPCTutPlugin
main: pl.mpcforum.joda17orginal.mpctutplugin.main
version: 1.0
commands:
   komenda:
      description: Ta komenda nic nie robi
      usage: /komenda
      permission: mpctutplugin.komenda
      permission-message: Nie masz uprawnien do komendy komenda

Wynik

 

Po kompilacji pluginu, gdy wpiszemy /komenda, naszym oczom powinno ukazać się

Wpisałeś komende: komenda

Komendy tylko dla gracza

 

Czasami musimy stworzyć komendę tylko dla gracza, np. taką, która pokazuje cordy gracza.

Aby to zrobić możemy użyć takiego kodu

if(arg0 instanceof Player){

}

instanceof sprawdza czy zmienna arg0 jest typu Player

 

Całość wygląda tak

package pl.mpcforum.joda17orginal.mpctutplugin;


import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{
    
    @Override
    public void onEnable() {
        System.out.print("[MPCTutPlugin] Plugin został uruchomiony");
    }
    @Override
    public void onDisable() {
        System.out.print("[MPCTutPlugin] Plugin został wyłączony");
    }
    
    public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) {
        if(arg1.getName().equalsIgnoreCase("komenda")){
            
            if(arg0 instanceof Player){
            
            arg0.sendMessage("Wpisałeś komendę: komenda");
            
            }
            else {
            arg0.sendMessage("Tą komendę może pisać tylko gracz");
            }
            
            return true;
        }
        return false;
    }
    
}

Teraz jeśli gracz wpisze komendę, dostanie wiadomość

Wpisałeś komendę: komenda

A jeśli konsola wpisze tą komendę, to dostanie wiadomość

Tą komendę może pisać tylko gracz

Sprawdzanie ilości argumentów

 

Kiedy musimy sprawdzić czy gracz podał odpowiednią ilość argumentów, możemy użyć metody lenght, sprawdza ona ilość elementów w liści. Poprawne jej użycie wygląda tak

arg3.lenght

Jeśli wymagamy np. jeden argument, to kod powinien wyglądać tak

public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) {
	if(arg1.getName().equalsIgnoreCase("komenda")){
		
		if(arg3.length != 1){
			return false;
		}

                //Tutaj jakiś kod do wykonania

                return true;

		
	}
	return false;
}

Ale jeśli chcemy aby można było podać np. jeden, dwa lub trzy argumenty, to kod powinien wyglądać tak

public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) {
	if(arg1.getName().equalsIgnoreCase("komenda")){
		
		if(arg3.length < 1){
			return false;
		}
		if(arg3.length > 3){
			return false;
		}
			
		//Tutaj jakiś kod
		return true;
		
	}
	return false;
}

W obydwu przypadkach, gdy podamy złą ilość argumentów wyświetli się nam, wcześniej ustawione usage w pliku plugin.yml

 

Eventy

 

Eventy, to zdarzenia, które wykonują się podczas pracy serwera np. PlayerInteractEvent, który jest, gdy gracz kliknie. Nasz plugin może to wykryć i zrobić wtedy coś.

 

Nowa klasa

 

Aby używać eventów, musimy stworzyć nową klasę, robimy to tak jak jest to pokazane w na początku tut'a, podczas tworzenia głównej klasy. Możemy ją nazwać dowolnie, ja swoją nazwę eventy.

 

Wygenerowany plik powinien wyglądać tak

package pl.mpcforum.joda17orginal.mpctutplugin;

public class Eventy {

}

Aby ta klasa mogła obsługiwać eventy, musimy dadać implements Listener, za public class Eventy. Implements pobiera interfejs, czyli zbiór nazw metod, bez ich definicji.

Całość wygląda tak

package pl.mpcforum.joda17orginal.mpctutplugin;

import org.bukkit.event.Listener;

public class Eventy implements Listener{

}

Teraz musimy dodać tą klasę, jako wykonującą eventy. Robimy to dodając w onEnable()

getServer().getPluginManager().registerEvents(new <nazwa_klasy>, this);

U mnie to wygląda tak

public void onEnable() {
	System.out.print("[MPCTutPlugin] Plugin został uruchomiony");
	getServer().getPluginManager().registerEvents(new eventy(), this);
}

Budowa metody obsługującej event

 

Na początku, poprzedzając metodę, dodajemy

  • @EventHandler - normalny priorytet wykonania eventu
  • @EventHandler(priority = EventPriority.NORMAL) -
    normalny priorytet wykonania eventu
  • @EventHandler(priority = EventPriority.LOW) -niski priorytet wykonania eventu
  • @EventHandler(priority = EventPriority.LOWEST) - najniższy priorytet wykonania eventu
  • @EventHandler(priority = EventPriority.HIGH) - wysoki priorytet wykonania eventu
  • @EventHandler(priority = EventPriority.HIGHEST) - najwyższy priorytet wykonania eventu
  • @EventHandler(priority = EventPriority.MONITOR) - plugin cały czas obserwuje czy event nie jest wykonywany, bardzo obciąża to serwer

Następnie dodajemy

public void <nazwa>(<nazwa_eventu> <zmienna>){

}

Całość powinna wyglądać np. tak

package pl.mpcforum.joda17orginal.mpctutplugin;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;

public class Eventy implements Listener{

	@EventHandler
	public void nazwa(PlayerMoveEvent event){
		
	}
	
}

event w tym wypadku jest zmienną, w której przechowywane są wszystkie informacje o evencie

Ja wykorzystałem PlayerMoveEvent, wykonuje się on wtedy, gdy gracz się poruszy.

 

Wszystkie eventy i wiele więcej znajdziemy tutaj

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

Przykład eventu

 

Dla przykładu dam metode, która zmienia bloki, po których chodzi gracz na stone

public void nazwa(PlayerMoveEvent event){
		
	Player player = event.getPlayer();
	World world = player.getWorld();
	Block block = world.getBlockAt(player.getLocation().getBlockX(), player.getLocation().getBlockY() - 1, player.getLocation().getBlockZ());
	block.setType(Material.STONE);
}

Teraz przeanalizujmy poszczególne linijki

  • Player player = event.getPlayer(); - Tworzy zmienną typu Player, której nadaje wartość event.getPlayer(), czyli gracza który się poruszył
  • World world = player.getWorld(); - Tworzy zmienną typu World i nadaje jej wartość player.getWorld(), czyli świata w którym jest gracz
  • Block block = world.getBlockAt(player.getLocation().getBlockX(), player.getLocation().getBlockY() - 1, player.getLocation().getBlockZ()); - Tworzy zmienną typu Block i nadaje jej wartość bloku, otrzymanego z metody getBlockAt(int x,int y,int z). player.getLocation().getBlockX() pobiera pozycje X bloku o cordach takich jakie ma gracz. W przypadku Z postąpiliśmy identycznie, ale w przypadku Y, odjęliśmy jeden, ponieważ zamieniamy blok pod graczem
  • block.setType(Material.STONE); - zmienia ustawiony wcześniej block, na stone

Dzięki tej metodzie możemy "chodzić po niebiosach" ;)

 

 

Uwaga! Ten tut nie jest skończony, dodam jeszcze wiele rzeczy, jednak w swoim czasie!

 

#EDIT

 

Wniosłem poprawki, niedługo dokończę poradnik.

1390684250-U762298.png

Opublikowano

Ekhm...

package pl.mpcforum.joda17orginal.mpctutplugin;
 
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
 
public class main extends JavaPlugin{
 
@Override
public void onEnable() {
System.out.print("[MPCTutPlugin] Plugin został uruchomiony");
}
@Override
public void onDisable() {
System.out.print("[MPCTutPlugin] Plugin został wyłączony");
}
 
public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) {
if(arg1.getName().equalsIgnoreCase("komenda")){
 
 
 
return true;
}
return false;
}
 
}
Nie widzisz tutaj jakiegoś błędu? Bo ja tak.
Po co korzystasz z 2 argumentu? Nie lepiej wykorzystać 3 i zachować przejrzystość kodu?
Czemu nie zmieniłeś nazw argumentów, żeby ludziom łatwiej się pracowało?
I co do tej metody (co mnie strasznie wkurzyło) -> po co trzymasz to w tym samym pliku!?
Od tego jest możliwość tworzenia plików żeby ją wykorzystać ;_;
Trzymanie setek metod kompletnie nie podobnych do siebie w jednym pliku to czysty idiotyzm, zwłaszcza gdy kod będzie miał więcej niż 30 linii kodu.
Nie lepiej
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
?
Dalej ..
System.out.print("[MPCTutPlugin] Plugin został wyłączony");

1. Czemu nie korzystasz z klasy "Logger", która ma metodę "log"? Jest ona dość przydna.

2. Po co ręcznie edytować milion linii kodu skoro można wpisać zamiast nazwy ("MPCTutPlugin") - "getDescription().getFullName()", i musieć edytować tylko w 1 pliku? (plugin.yml)
Dalej ... (chociaż powinno być na początku)
Nazwy klas zaczynamy WIELKĄ literą (kolejne wyrazy w nazwie również wielką)!
metody - 1 wyraz małą, resztą wielką, nazwy metod powinny też mówić programiście co robi każda z nich, tak aby inny programista również się pokapował, dlatego zamiast "nazwa" (lub np. "metoda"), powinieneś dać np. "onPlayerMove".
Poczytaj:
-----
Co do eventów:
Po co robić "world.getBlockAt(...)", podczas pobierania bloku pod graczem, skoro można użyć:
"player.getLocation().getBlock().getRelative(BlockFace.DOWN);"?
---
Na razie tyle znalazłem, potem jeszcze coś poszukam. :)
BTW. "urzytkownikiem"?
BTW2. API Bukkita jest od dawna w pliku serwera (Craftbukkit), i lepiej korzystać jest z tego drugiego.
Opublikowano

@tolvat

Bardzo dziękuje za opinię. Dzisiaj wniosę poprawki.

 

Co to nazw klas z wielkiej litery, to masz wielką racje, zignorowałem to gdy uczyłem się javy i teraz mam tego efekt.

W sprawie metody w tym samym pliku, pisałem tut nie jest skończony i jest to jedna z rzeczy którą miałem i mam zamiar dodać jako osobny poddział.

Korzystanie z klasy Logger jest równie dobre, co z System.out.print. Można używać obydwu. Jak jest napisane w oficjalnym tutorialu bukkita

 

Innym sposobem, również poprawnym, jest użycie wbudowanej przez Javę funkcję System.out.

 

Dlaczego nie użyłem "getDescription().getFullName()"?  Staram się aby przykłady były jak najprostsze i łatwe do zrozumienia. Jednak dodam odpowiednią adnotację, że można tak załatwić sprawę.

Podobnie z  world.getBlockAt(), starałem się napisać to tak, aby kod był jak najbardziej zrozumiały.

Co do API Bukkita, mi jest wygodniej używać tego w przeglądarce i przypuszczam, że wielu osobą też.

 

#EDIT 20.03.14

Mija już trochę czasu, ale nie mam siły wnieść tych poprawek i kontynuować tego tuta. Postaram się to kiedyś skończyć...

1390684250-U762298.png

  • 2 miesiące temu...
Opublikowano

Oczekujesz wielkiej publiki względem Twojego poradnika, chociaż jak wiadomo MPC, a tym bardziej dział Minecraft jest w głównej mierze oblegany przez dzieci.

 

Co do poradnika, nie wgłębiałem się w niego, ponieważ ogarniam Javę i api bukkita, ale na pierwszy rzut oka widzę, że przykładasz się do jego tworzenia, co się chwali. Rozwijaj go dalej jeśli chcesz ;)

Opublikowano

Świetny poradnik! Dodaj grafikę na początku, a więcej osób się zainteresuje tematem.

Opublikowano

 

Świetny poradnik! Dodaj grafikę na początku, a więcej osób się zainteresuje tematem.

 

Każdy ma swój gust, ale niezbyt według mnie wyglądają poradniki z grafiką, znaczy są mniej przejrzyste.

 

 

Oczekujesz wielkiej publiki względem Twojego poradnika, chociaż jak wiadomo MPC, a tym bardziej dział Minecraft jest w głównej mierze oblegany przez dzieci.

 

Co do poradnika, nie wgłębiałem się w niego, ponieważ ogarniam Javę i api bukkita, ale na pierwszy rzut oka widzę, że przykładasz się do jego tworzenia, co się chwali. Rozwijaj go dalej jeśli chcesz ;)

 

Teraz się trochę ruszyło i to mnie cieszy, ale od stycznia temat cały czas był zapomniany.

1390684250-U762298.png

  • 1 miesiąc temu...
Opublikowano

Dodaj proszę o zaplanowanych zadaniach i czynnościach w tle.

 

Leci plusik.

"Los nagradza przygotowanych"

 

(Liberator 2)

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...