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)
- Játékos kézben tartja az Eladó Pálcát (PDC flag:
elado_palca_key
). - Bal egérrel ládára kattint.
- Listener ellenőriz: blokk =
CHEST
, permission rendben, item = pálca. - Összeg kiszámítása: végigmegy az itemeken, mennyiség × egységár.
- Vault-tal jóváírás a játékos számláján.
- 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