Eladó Pálca – dokumentáció

Spigot/Paper plugin, amely bal egér kattintással ládára (CHEST) eladja annak tartalmát Vault gazdasági rendszerbe, és jóváírja az összeget a játékosnál.

Fő funkciók

  • Láda tartalmának értékesítése a konfigurált árak alapján
  • Vault Economy integráció
  • Speciális pálca azonosítása PersistentDataContainer használatával
  • Jogosultság alapú használat: eladopalca.use

Követelmények

Minecraft szerver
Spigot vagy Paper 1.20.x
Java
Java 17+
Függőség
Vault + Economy provider (pl. EssentialsX Economy)

Osztály: EladoPalcaPlugin

package com.gamestorm.plugins;

import net.milkbowl.vault.economy.Economy; 
import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration; 
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataType; 
import org.bukkit.NamespacedKey; 
import org.bukkit.plugin.java.JavaPlugin; 

public class EladoPalcaPlugin extends JavaPlugin { 

    private FileConfiguration config; 

    @Override
    public void onEnable() { 
        saveDefaultConfig();
        config = getConfig();

        getServer().getPluginManager().registerEvents(new EladoPalcaListener(this), this); 

        getServer().getPluginManager().addPermission(new org.bukkit.permissions.Permission("eladopalca.use")); 
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
        if (cmd.getName().equalsIgnoreCase("chronikapalca")) {
            if (args.length == 2 && args[0].equalsIgnoreCase("level1") && args[1].equalsIgnoreCase("get")) {
                if (sender instanceof Player) {
                    Player player = (Player) sender;

                    if (!player.hasPermission("eladopalca.use")) { 
                        return false;
                    }

                    ItemStack palca = new ItemStack(Material.BLAZE_ROD); 
                    ItemMeta meta = palca.getItemMeta();

                    if (meta != null) {
                        meta.getPersistentDataContainer().set(new NamespacedKey("gamestorm", "elado_palca_key"), PersistentDataType.BYTE, (byte) 1); 
                        palca.setItemMeta(meta);
                        player.getInventory().addItem(palca);
                        player.sendMessage("§aSikeresen megkaptad az Eladó Pálcát!");
                        return true;
                    } else {
                        player.sendMessage("§cHiba történt az Eladó Pálca létrehozásakor!");
                        return false;
                    }
                }
            }
        }
        return false; 
    }

    public double getItemPrice(ItemStack item) { 
        String itemName = item.getType().toString();
        if (config.contains("item-prices." + itemName)) {
            return config.getDouble("item-prices." + itemName);
        }
        return config.getDouble("item-prices.DEFAULT");
    }
}
① Vault Vault gazdasági szolgáltatás interfész. A jóváírás Economy provideren keresztül történik.
② Config Betölti a config.yml-t és elérhetővé teszi az árakat (item-prices).
③ PDC A pálca beazonosítására egy bájt flag kerül az ItemMeta PersistentDataContainer-ébe.
④ NamespacedKey Egyedi kulcs: ("gamestorm", "elado_palca_key"). Ütközés elkerülésére javasolt saját névtér.
⑤ Plugin A JavaPlugin alaposztály biztosítja az életciklust (onEnable).
⑥ Fő osztály Innen történik az Event Listener regisztráció és jogosultság hozzáadása.
⑦ Életciklus saveDefaultConfig() létrehozza az alapkonfigot, ha hiányzik.
⑧ Események EladoPalcaListener kezeli a kattintási logikát.
⑨ Permission Dinamikusan is felvehető, de plugin.yml-ben is definiálható.
⑩ Parancs /chronikapalca level1 get pálcát ad a játékosnak.
⑪ Gate Véd a jogosulatlan használat ellen.
⑫ Tárgy A pálca BLAZE_ROD típusú item.
⑭ Árazás Egyedi item ár, különben DEFAULT fallback.

Osztály: EladoPalcaListener

package com.gamestorm.plugins;

import net.milkbowl.vault.economy.Economy; 
import org.bukkit.Material;
import org.bukkit.block.Chest;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; 
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent; 
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.persistence.PersistentDataContainer; 
import org.bukkit.NamespacedKey;

public class EladoPalcaListener implements Listener {

    private final EladoPalcaPlugin plugin; 
    private static final NamespacedKey PALCA_KEY = new NamespacedKey("gamestorm", "elado_palca_key"); 

    public EladoPalcaListener(EladoPalcaPlugin plugin) { this.plugin = plugin; }

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) { 
        if (event.getAction() == Action.LEFT_CLICK_BLOCK && event.getClickedBlock() != null) { 
            if (event.getClickedBlock().getType() == Material.CHEST) { 
                Player player = event.getPlayer();

                if (!player.hasPermission("eladopalca.use")) { 
                    return;
                }

                ItemStack item = player.getInventory().getItemInMainHand();

                if (isEladoPalca(item)) { 
                    double value = calculateChestValue(event.getClickedBlock()); 

                    if (plugin.getServer().getPluginManager().getPlugin("Vault") != null) { 
                        Economy economy = plugin.getServer().getServicesManager().getRegistration(Economy.class).getProvider();
                        economy.depositPlayer(player, value); 
                    }

                    Chest chest = (Chest) event.getClickedBlock().getState();
                    chest.getInventory().clear(); 

                    player.sendMessage("§b[Chrónika Pálca]  §aSikeresen eladtad a láda tartalmát! Kaptál " + value + " $-t!"); // ⑭ visszajelzés
                }
            }
        }
    }

    private double calculateChestValue(org.bukkit.block.Block block) { 
        double value = 0;
        Chest chest = (Chest) block.getState();
        for (ItemStack item : chest.getInventory().getContents()) {
            if (item != null && item.getType() != Material.AIR) {
                double itemPrice = plugin.getItemPrice(item); 
                value += item.getAmount() * itemPrice; 
            }
        }
        return value;
    }

    private boolean isEladoPalca(ItemStack item) { 
        if (item == null || item.getType() != Material.BLAZE_ROD || !item.hasItemMeta()) return false;
        ItemMeta meta = item.getItemMeta();
        if (meta == null) return false;
        PersistentDataContainer dataContainer = meta.getPersistentDataContainer();
        return dataContainer.has(PALCA_KEY, PersistentDataType.BYTE); 
    }
}
② Listener Az eseménykezelő interfész implementációja.
③ Interact PlayerInteractEvent figyelése – bal klikk blokkon szűrve.
⑧ CHEST Biztonsági szűrő: csak sima ládára fut le.
⑫ Vault guard Előbb ellenőrzi, hogy a Vault betöltődött-e.
⑮ Ár Az árképzés a plugin konfigjából történik (getItemPrice).
⑬ Ürítés Az eladás után törli a láda tartalmát.

Jogosultságok

Név
gamestorm.eladopalca.use
Leírás
Hozzáférés az Eladó Pálca megszerzéséhez
Alapértelmezett
op

Parancsok

Parancs
/chronikapalca level1 get
Leírás
Eladó Pálca parancs
Használat
/chronikapalca level1 get
Jogosultság
gamestorm.eladopalca.use
Jogosultság hiány üzenet
§cNincs jogosultságod az Eladó Pálca használatához!

Konfiguráció (config.yml)

item-prices:
  DEFAULT: 1.0     # Alap ár, ha nincs konkrét ItemType
  DIAMOND: 25.0    # Példa egyedi árra
  GOLD_INGOT: 8.0
  IRON_INGOT: 2.0

Az árak Material enum nevét használják kulcsként.

Folyamat (röviden)

  1. Játékos kézben tartja az Eladó Pálcát (PDC flag: elado_palca_key).
  2. Bal egérrel ládára kattint.
  3. Listener ellenőriz: blokk = CHEST, permission rendben, item = pálca.
  4. Összeg kiszámítása: végigmegy az itemeken, mennyiség × egységár.
  5. Vault-tal jóváírás a játékos számláján.
  6. Láda kiürítése és üzenet küldése.

Biztonság & jó gyakorlatok

  • Try/Catch Javasolt hibatűrő védelem a Vault szolgáltató lekérésénél.
  • Konzisztencia Ha a jóváírás sikertelen, ne ürítsd a ládát. (Külön tranzakciós logika.)
  • Konfig validáció Figyelj a DEFAULT értékre; ha hiányzik, kezelj fallback-et.
  • Dupla kattintás Időzár / cooldown megelőzheti a véletlen többszöri eladást.
  • Null ellenőrzések Mindig ellenőrizd a null-t inventory bejárásnál.

GYIK

Miért nem kapok pénzt?

Győződj meg róla, hogy a Vault és egy gazdasági plugin (pl. EssentialsX Economy) telepítve és engedélyezve van.

Van API hozzáférés?

Igen, van itt: EladoPalca API dokumentáció

Hogyan állítom be az árakat?

Állítsd be az item-prices kulcsokat a config.yml-ben. Az ismeretlen tárgyak a DEFAULT-ot kapják.

Hol definiáljam a permissiont?

Definiálhatod dinamikusan (ahogy a kódban), vagy a plugin.yml-ben is:

permissions:
  eladopalca.use:
    description: Use and get Elado Palca
    default: op