Jak napisać własny plugin do Minecrafta — przewodnik dla początkujących
Własny plugin to świetny sposób na naukę Javy w praktyce i odróżnienie swojego serwera od konkurencji. Pokazujemy, jak zacząć od pustego projektu i wydać pierwszy plugin Paper.
Własny plugin to najszybsza droga do tego, żeby Twój serwer Minecraft odróżniał się od konkurencji. Każdy serwer ma EssentialsX i LuckPerms — ale tylko Ty możesz mieć plugin, który robi dokładnie to, czego potrzebują Twoi gracze.
To także świetne wprowadzenie do Javy. Środowisko jest niskoprogowe (działa lokalnie, łatwo testować), a efekty widać natychmiast w grze. W tym wpisie przejdziemy od pustego komputera do uruchomionego pluginu w godzinę.
Co Ci będzie potrzebne
- JDK 21 — np. Adoptium Temurin.
- IDE — IntelliJ IDEA Community (darmowe, najlepsze do Javy).
- Maven lub Gradle — narzędzia budowania (Maven prostszy na start).
- Lokalny serwer Paper do testów.
Maven jest zwykle wbudowany w IntelliJ. Java 21 jest wymagana dla Minecrafta 1.20+.
Nowy projekt Mavena
W IntelliJ: File → New → Project → Maven Archetype. Albo z linii poleceń:
mvn archetype:generate \
-DgroupId=pl.mojserwer.plugin \
-DartifactId=helloplugin \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
Otrzymasz strukturę:
helloplugin/
pom.xml
src/main/java/pl/mojserwer/plugin/App.java
pom.xml — zależności
Edytuj pom.xml, dodaj repozytorium PaperMC i zależność:
<repositories>
<repository>
<id>papermc</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
</plugins>
</build>
Pierwsza klasa pluginu
Stwórz src/main/java/pl/mojserwer/plugin/HelloPlugin.java:
package pl.mojserwer.plugin;
import org.bukkit.plugin.java.JavaPlugin;
public final class HelloPlugin extends JavaPlugin {
@Override
public void onEnable() {
getLogger().info("HelloPlugin uruchomiony!");
}
@Override
public void onDisable() {
getLogger().info("HelloPlugin zatrzymany.");
}
}
onEnable() jest wywoływane przy starcie serwera, onDisable() przy wyłączeniu.
plugin.yml — manifest
Plik src/main/resources/plugin.yml:
name: HelloPlugin
version: 1.0.0
main: pl.mojserwer.plugin.HelloPlugin
api-version: 1.21
author: Mariusz
description: Mój pierwszy plugin do Minecrafta.
commands:
hello:
description: Pozdrawia gracza
usage: /hello
main to pełna ścieżka klasy głównej. api-version musi pasować do wersji Papera.
Pierwsza komenda
Rozszerz klasę o obsługę /hello:
package pl.mojserwer.plugin;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
public final class HelloPlugin extends JavaPlugin {
@Override
public boolean onCommand(CommandSender sender, Command cmd,
String label, String[] args) {
if (cmd.getName().equalsIgnoreCase("hello")) {
if (sender instanceof Player player) {
player.sendMessage("Hej, " + player.getName() + "!");
return true;
}
sender.sendMessage("Tylko gracze mogą używać /hello.");
return true;
}
return false;
}
}
Reagowanie na eventy
Powitanie nowych graczy. Stwórz osobną klasę JoinListener.java:
package pl.mojserwer.plugin;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
public final class JoinListener implements Listener {
@EventHandler
public void onJoin(PlayerJoinEvent event) {
event.getPlayer().sendMessage("Witamy na serwerze!");
}
}
Zarejestruj listener w onEnable():
getServer().getPluginManager()
.registerEvents(new JoinListener(), this);
Budowanie i testowanie
W terminalu:
mvn clean package
Powstanie target/helloplugin-1.0.0.jar. Wrzuć go do plugins/ swojego serwera Paper i zrestartuj. Po wejściu zobaczysz powitanie i możesz wpisać /hello.
Konfiguracja w config.yml
Dodaj src/main/resources/config.yml:
welcome-message: "Witamy na serwerze!"
I wczytaj w pluginie:
@Override
public void onEnable() {
saveDefaultConfig();
String message = getConfig().getString("welcome-message");
getLogger().info("Welcome: " + message);
}
Po pierwszym uruchomieniu config zostanie skopiowany do plugins/HelloPlugin/config.yml — gracze mogą go edytować bez ruszania kodu.
Dobre praktyki
- Trzymaj logikę poza klasą główną — używaj osobnych klas dla komend, listenerów, serwisów.
- Zawsze sprawdzaj null i typ
senderw komendach. - Nie używaj
System.out— używajgetLogger(). - Async dla operacji I/O (DB, HTTP) —
Bukkit.getScheduler().runTaskAsynchronously(...). - Loguj błędy z kontekstem — łatwiejsze debugowanie.
Dalsze kroki
- Oficjalna dokumentacja Papera — najlepszy punkt wyjścia.
- API:
Player,World,Block,ItemStack,Inventory. - Schedulery:
BukkitRunnabledla zadań cyklicznych. - Persystencja: prosty YAML, SQLite (HikariCP) lub MySQL przy większych projektach.
- Plugin Messaging dla Velocity/BungeeCord.
Podsumowanie
W godzinę masz działający plugin: komendę /hello, powitanie nowych graczy i konfigurację. To fundament, na którym możesz zbudować każdy bardziej skomplikowany pomysł — własną ekonomię, system rang, custom mob arenę.
Najlepszy sposób na naukę to czytanie kodu istniejących pluginów open source (CoreProtect, EssentialsX, GriefPrevention). Większość z nich jest na GitHubie, a styl kodu jest zwykle wzorcowy.