Aller au contenu principal

Boutons Personnalises

Apprenez a creer et enregistrer des types de boutons personnalises dans zMenu.

Vue d'Ensemble​

Les boutons personnalises vous permettent d'etendre zMenu avec de nouveaux comportements de boutons. Cela implique :

  1. Creer un ButtonLoader pour analyser la configuration YAML
  2. Creer une implementation de Button pour le comportement
  3. Enregistrer le loader aupres du ButtonManager

ButtonManager​

Obtenez le gestionnaire de boutons pour enregistrer des boutons personnalises :

ButtonManager buttonManager = menuPlugin.getButtonManager();

Creer un Button Loader​

L'interface ButtonLoader definit comment votre bouton est charge depuis le YAML :

import fr.maxlego08.menu.api.button.Button;
import fr.maxlego08.menu.api.loader.ButtonLoader;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;

public class MyButtonLoader implements ButtonLoader {

@Override
public String getName() {
return "MY_CUSTOM_BUTTON"; // Le nom du type utilise dans le YAML
}

@Override
public Button load(YamlConfiguration configuration, String path, Plugin plugin) {
// Lire les proprietes personnalisees depuis la configuration
String customProperty = configuration.getString(path + ".custom-property", "default");
int customNumber = configuration.getInt(path + ".custom-number", 0);
boolean customFlag = configuration.getBoolean(path + ".custom-flag", false);

// Creer et retourner votre instance de bouton
return new MyCustomButton(customProperty, customNumber, customFlag);
}
}

Creer une Implementation de Bouton​

Implementez l'interface Button (ou etendez une classe de base) :

import fr.maxlego08.menu.api.button.Button;
import fr.maxlego08.menu.api.button.DefaultButtonValue;
import fr.maxlego08.menu.inventory.inventories.InventoryDefault;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;

public class MyCustomButton extends DefaultButtonValue implements Button {

private final String customProperty;
private final int customNumber;
private final boolean customFlag;

public MyCustomButton(String customProperty, int customNumber, boolean customFlag) {
this.customProperty = customProperty;
this.customNumber = customNumber;
this.customFlag = customFlag;
}

@Override
public String getName() {
return "MY_CUSTOM_BUTTON";
}

@Override
public void onClick(Player player, InventoryClickEvent event,
InventoryDefault inventory, int slot) {
// Votre logique de clic personnalisee ici
player.sendMessage("Bouton personnalise clique !");
player.sendMessage("Propriete : " + customProperty);
player.sendMessage("Nombre : " + customNumber);
player.sendMessage("Flag : " + customFlag);

// Exemple : Executer differentes actions selon la configuration
if (customFlag) {
player.sendMessage("Le flag est active !");
}

// Vous pouvez aussi interagir avec l'inventaire
// inventory.refresh(player);
}
}

Enregistrer Votre Bouton​

Enregistrez votre button loader quand votre plugin s'active :

@Override
public void onEnable() {
MenuPlugin menuPlugin = (MenuPlugin) Bukkit.getPluginManager().getPlugin("zMenu");

if (menuPlugin != null) {
// Enregistrer le bouton personnalise
menuPlugin.getButtonManager().register(new MyButtonLoader());
getLogger().info("Bouton personnalise enregistre : MY_CUSTOM_BUTTON");
}
}

Utiliser Votre Bouton Personnalise​

Dans votre configuration YAML d'inventaire :

items:
my-custom-item:
type: MY_CUSTOM_BUTTON
slot: 13
custom-property: "Hello World"
custom-number: 42
custom-flag: true
item:
material: DIAMOND
name: "&b&lBouton Personnalise"
lore:
- "&7Ceci est un bouton personnalise !"

Exemple Complet : Bouton de Teleportation​

TeleportButtonLoader.java​

package com.example.buttons;

import fr.maxlego08.menu.api.button.Button;
import fr.maxlego08.menu.api.loader.ButtonLoader;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;

public class TeleportButtonLoader implements ButtonLoader {

@Override
public String getName() {
return "TELEPORT";
}

@Override
public Button load(YamlConfiguration config, String path, Plugin plugin) {
String worldName = config.getString(path + ".world", "world");
double x = config.getDouble(path + ".x", 0);
double y = config.getDouble(path + ".y", 64);
double z = config.getDouble(path + ".z", 0);
float yaw = (float) config.getDouble(path + ".yaw", 0);
float pitch = (float) config.getDouble(path + ".pitch", 0);
String message = config.getString(path + ".message", "&aTeleporte !");

World world = Bukkit.getWorld(worldName);
Location location = new Location(world, x, y, z, yaw, pitch);

return new TeleportButton(location, message);
}
}

TeleportButton.java​

package com.example.buttons;

import fr.maxlego08.menu.api.button.Button;
import fr.maxlego08.menu.api.button.DefaultButtonValue;
import fr.maxlego08.menu.inventory.inventories.InventoryDefault;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;

public class TeleportButton extends DefaultButtonValue implements Button {

private final Location location;
private final String message;

public TeleportButton(Location location, String message) {
this.location = location;
this.message = message;
}

@Override
public String getName() {
return "TELEPORT";
}

@Override
public void onClick(Player player, InventoryClickEvent event,
InventoryDefault inventory, int slot) {
// Fermer l'inventaire d'abord
player.closeInventory();

// Teleporter le joueur
player.teleport(location);

// Envoyer le message avec les codes couleur
player.sendMessage(ChatColor.translateAlternateColorCodes('&', message));
}
}

Utilisation dans le YAML​

items:
spawn-teleport:
type: TELEPORT
slot: 13
world: "world"
x: 0
y: 100
z: 0
yaw: 90
pitch: 0
message: "&aVous avez ete teleporte au spawn !"
item:
material: ENDER_PEARL
name: "&5&lTeleportation au Spawn"
lore:
- "&7Cliquez pour vous teleporter"

Exemple Complet : Bouton Compteur​

Un bouton qui compte les clics par joueur :

CounterButtonLoader.java​

package com.example.buttons;

import fr.maxlego08.menu.api.button.Button;
import fr.maxlego08.menu.api.loader.ButtonLoader;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class CounterButtonLoader implements ButtonLoader {

// Stockage partage des compteurs pour tous les boutons compteur
private static final Map<UUID, Integer> counters = new HashMap<>();

@Override
public String getName() {
return "COUNTER";
}

@Override
public Button load(YamlConfiguration config, String path, Plugin plugin) {
int maxCount = config.getInt(path + ".max-count", 10);
String rewardCommand = config.getString(path + ".reward-command", "");

return new CounterButton(counters, maxCount, rewardCommand);
}
}

CounterButton.java​

package com.example.buttons;

import fr.maxlego08.menu.api.button.Button;
import fr.maxlego08.menu.api.button.DefaultButtonValue;
import fr.maxlego08.menu.inventory.inventories.InventoryDefault;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;

import java.util.Map;
import java.util.UUID;

public class CounterButton extends DefaultButtonValue implements Button {

private final Map<UUID, Integer> counters;
private final int maxCount;
private final String rewardCommand;

public CounterButton(Map<UUID, Integer> counters, int maxCount, String rewardCommand) {
this.counters = counters;
this.maxCount = maxCount;
this.rewardCommand = rewardCommand;
}

@Override
public String getName() {
return "COUNTER";
}

@Override
public void onClick(Player player, InventoryClickEvent event,
InventoryDefault inventory, int slot) {
UUID uuid = player.getUniqueId();

// Obtenir le compteur actuel
int currentCount = counters.getOrDefault(uuid, 0);
currentCount++;

// Mettre a jour le compteur
counters.put(uuid, currentCount);

player.sendMessage("§aNombre de clics : " + currentCount + "/" + maxCount);

// Verifier si le maximum est atteint
if (currentCount >= maxCount) {
player.sendMessage("§6Vous avez atteint le nombre maximum de clics !");

// Executer la commande de recompense
if (!rewardCommand.isEmpty()) {
String command = rewardCommand.replace("%player%", player.getName());
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
}

// Reinitialiser le compteur
counters.put(uuid, 0);
}

// Rafraichir l'inventaire pour mettre a jour l'affichage
inventory.refresh(player);
}
}

Avance : Bouton avec Affichage d'Item Personnalise​

Surcharger l'affichage de l'item en fonction de l'etat du joueur :

@Override
public ItemStack getCustomItemStack(Player player) {
// Retourner un item personnalise en fonction de l'etat du joueur
int count = counters.getOrDefault(player.getUniqueId(), 0);

ItemStack item = new ItemStack(Material.PAPER);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName("§6Compteur : " + count + "/" + maxCount);
item.setItemMeta(meta);

return item;
}

Bonnes Pratiques​

  1. Utiliser des noms de type significatifs - Les rendre uniques et descriptifs
  2. Valider la configuration - Verifier les valeurs manquantes ou invalides
  3. Gerer les valeurs null - Utiliser des valeurs par defaut pour les proprietes optionnelles
  4. Garder les boutons concentres - Un type de bouton = un objectif
  5. Documenter vos boutons - Expliquer les options de configuration requises
  6. Tester les cas limites - Configurations vides, proprietes manquantes, etc.

Etapes Suivantes​

Copyright © 2026 GroupeZ|Build #loading...|-