🔌 Minecraft Plugin Fejlesztés

Teljes útmutató Spigot/Paper pluginok készítéséhez Java-val

🚀 1. Előfeltételek és Telepítés

Mielőtt elkezdenénk a plugin fejlesztéssel, biztosítanunk kell, hogy van minden szükséges szoftver.

A. Java JDK Telepítése

  1. Menj a Oracle Java weboldal-ra
  2. Töltsd le a Java JDK 17 vagy 21 verzió
  3. Telepítsd az alapértelmezett beállításokkal
  4. Ellenőrizd a telepítést: java -version

B. IDE Telepítése (IntelliJ IDEA vagy Eclipse)

IntelliJ IDEA (ajánlott):

  1. Töltsd le az IntelliJ IDEA Community Edition-t
  2. Telepítsd a szokásos módon
  3. Az első indításnál válaszd a Java SDK-t

C. Maven Telepítése (Build Tool)

  1. Töltsd le a Maven-t
  2. Csomagold ki egy tetszőleges helyre
  3. Add hozzá a PATH-hez (ahogy a Java-t csináltad)
  4. Ellenőrizd: mvn --version

💡 Tipp: IntelliJ IDEA már tartalmaz Maven-t, így külön telepítés nem mindig szükséges!

📁 2. Új Plugin Projekt Létrehozása

A. IntelliJ IDEA-ban

  1. Nyisd meg az IntelliJ IDEA-t
  2. Kattints File → New → Project-re
  3. Válaszd a Maven-t a bal oldali listából
  4. Jelöld be: Create from archetype
  5. Keress és válaszd a maven-archetype-quickstart archetyput
  6. Add meg a projekt detailokat:
    • GroupId: com.sajatplugin
    • ArtifactId: MyAwesomePlugin
    • Version: 1.0-SNAPSHOT
  7. Kattints Finish-re

B. A pom.xml Módosítása

Az új projekted tartalmaz egy pom.xml fájlt. Módosítsd az alábbiak szerint:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sajatplugin</groupId>
    <artifactId>MyAwesomePlugin</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <repositories>
        <repository>
            <id>spigot-repo</id>
            <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot-api</artifactId>
            <version>1.20.4-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

🔧 3. Plugin Fő Osztály Létrehozása

A. MainPlugin.java

Navigálj a src/main/java/com/sajatplugin mappához és hozz létre egy MainPlugin.java fájlt:

package com.sajatplugin;

import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.Bukkit;

public class MainPlugin extends JavaPlugin {
    
    // Ez fut le amikor a plugin betöltődik
    @Override
    public void onEnable() {
        getLogger().info("✅ " + getName() + " v" + getVersion() + " sikeresen betöltődött!");
        
        // Parancsok regisztrálása
        getCommand("hello").setExecutor(new HelloCommand());
        getCommand("info").setExecutor(new InfoCommand());
        
        // Esemény hallgatók regisztrálása
        Bukkit.getPluginManager().registerEvents(new PlayerListener(), this);
        
        getLogger().info("✅ Parancsok és események regisztrálva!");
    }
    
    // Ez fut le amikor a szerver leáll
    @Override
    public void onDisable() {
        getLogger().info("❌ " + getName() + " leállítva!");
    }
}

B. plugin.yml Konfigurációs Fájl

Hozz létre a src/main/resources mappában egy plugin.yml fájlt:

name: MyAwesomePlugin
version: 1.0.0
main: com.sajatplugin.MainPlugin
api-version: 1.20
author: A Neved
description: "Az első plugin-om!"

commands:
  hello:
    description: "Köszönés parancs"
    usage: "/hello"
    aliases:
      - h
      - szia
  
  info:
    description: "Szerverinformációk"
    usage: "/info"

⚡ 4. Parancsok Implementálása

A. HelloCommand.java

Hozz létre egy HelloCommand.java fájlt:

package com.sajatplugin;

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

public class HelloCommand implements CommandExecutor {
    
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        // Ellenőrizd, hogy Player-e a sender
        if (!(sender instanceof Player)) {
            sender.sendMessage("❌ Ez a parancs csak játékosok számára elérhető!");
            return true;
        }
        
        Player player = (Player) sender;
        
        // Ha nincs argumentum, egyszerű üdvözlés
        if (args.length == 0) {
            player.sendMessage("👋 Szia " + player.getName() + "! Üdvözölünk szerver!");
            return true;
        }
        
        // Ha argumentum van, azt is megjelenítjük
        StringBuilder message = new StringBuilder();
        message.append("👋 Szia " + player.getName() + "! ");
        for (String arg : args) {
            message.append(arg).append(" ");
        }
        
        player.sendMessage(message.toString());
        return true;
    }
}

B. InfoCommand.java

Hozz létre az InfoCommand.java fájlt:

package com.sajatplugin;

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

public class InfoCommand implements CommandExecutor {
    
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        sender.sendMessage("=" .repeat(40));
        sender.sendMessage("ℹ️ SZERVER INFORMÁCIÓK");
        sender.sendMessage("=" .repeat(40));
        sender.sendMessage("👥 Online játékosok: " + Bukkit.getOnlinePlayers().size());
        sender.sendMessage("🌍 Világ: " + Bukkit.getWorlds().get(0).getName());
        sender.sendMessage("⏰ Játékosok max száma: " + Bukkit.getMaxPlayers());
        sender.sendMessage("=" .repeat(40));
        return true;
    }
}

🎮 5. Esemény Hallgatók (Listeners)

PlayerListener.java

Hozz létre a PlayerListener.java fájlt:

package com.sajatplugin;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;

public class PlayerListener implements Listener {
    
    // Új játékos csatlakozása
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        event.getPlayer().sendMessage("🎮 Üdvözlünk szerver!");
        event.setJoinMessage("✅ " + event.getPlayer().getName() + " csatlakozott!");
    }
    
    // Játékos kijelentkezése
    @EventHandler
    public void onPlayerQuit(PlayerQuitEvent event) {
        event.setQuitMessage("❌ " + event.getPlayer().getName() + " elhagyta szerver!");
    }
}

📚 Elérhető Eventok: PlayerDeathEvent, BlockBreakEvent, EntityDamageEvent, InventoryClickEvent és még sokan mások!

🔨 6. Plugin Fordítása (Build)

A. Maven-nel fordítás

Az IntelliJ IDEA termináljában futtasd:

mvn clean package

A JAR fájl helye:

target/MyAwesomePlugin-1.0-SNAPSHOT.jar

B. Plugin Telepítése a Szerverre

  1. Keress egy Spigot vagy Paper szerver-t (vagy hozz létre egyet)
  2. Másold a JAR fájlt a szerver plugins mappájába
  3. Indítsd újra a szervert
  4. Ellenőrizd a naplóban, hogy betöltődött-e (zöld üzenet)

🔧 7. Hibakezelés és Hibakeresés

❌ "Plugin failed to load"

Lehetséges okok:

  • A plugin.yml fájl helytelen
  • A main class neve nem egyezik
  • Szintaxis hiba a kódban

Megoldás: Ellenőrizd a szerver naplóját (logs/latest.log)

❌ "Cannot find symbol"

Megoldás: Ellenőrizd, hogy:

  • Az import utasítások helyesek
  • A Maven pom.xml-ben van a Spigot dependency
  • Maven letöltötte az függőségeket (kattints rá a fájlra és Maven → Update Project)

❌ "No plugin.yml file found"

Megoldás: Biztosítsd, hogy:

  • A plugin.yml a src/main/resources mappában van
  • A pom.xml helyesen van konfigurálva az erőforrások másolásához