Aller au contenu principal

Actions Personnalisees

Apprenez a creer et enregistrer des types d'actions personnalisees dans zMenu.

Vue d'Ensemble​

Les actions sont executees lorsque les joueurs interagissent avec les boutons. Les actions personnalisees vous permettent d'ajouter de nouveaux comportements au-dela des types d'actions integres.

Creer un Action Loader​

L'interface ActionLoader definit comment votre action est analysee depuis le YAML :

import fr.maxlego08.menu.api.action.Action;
import fr.maxlego08.menu.api.loader.ActionLoader;
import org.bukkit.configuration.file.YamlConfiguration;

public class MyActionLoader implements ActionLoader {

@Override
public String getKey() {
return "my-custom-action"; // Le nom du type utilise dans le YAML
}

@Override
public Action load(YamlConfiguration configuration, String path) {
// Lire les proprietes personnalisees depuis la configuration
String message = configuration.getString(path + ".message", "Message par defaut");
int times = configuration.getInt(path + ".times", 1);

return new MyCustomAction(message, times);
}
}

Creer une Implementation d'Action​

import fr.maxlego08.menu.api.action.Action;
import org.bukkit.entity.Player;

public class MyCustomAction implements Action {

private final String message;
private final int times;

public MyCustomAction(String message, int times) {
this.message = message;
this.times = times;
}

@Override
public void execute(Player player) {
for (int i = 0; i < times; i++) {
player.sendMessage(message);
}
}
}

Enregistrer Votre Action​

Enregistrez votre action loader quand votre plugin s'active :

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

if (menuPlugin != null) {
// Enregistrer en utilisant le registre d'action loaders du button manager
menuPlugin.getButtonManager().registerAction(new MyActionLoader());
getLogger().info("Action personnalisee enregistree : my-custom-action");
}
}

Utiliser Votre Action Personnalisee​

Dans votre configuration YAML d'inventaire :

items:
my-button:
slot: 13
item:
material: DIAMOND
name: "&bCliquez-moi"
actions:
- type: my-custom-action
message: "&aBonjour, %player% !"
times: 3

Exemple Complet : Action de Particules​

ParticleActionLoader.java​

package com.example.actions;

import fr.maxlego08.menu.api.action.Action;
import fr.maxlego08.menu.api.loader.ActionLoader;
import org.bukkit.Particle;
import org.bukkit.configuration.file.YamlConfiguration;

public class ParticleActionLoader implements ActionLoader {

@Override
public String getKey() {
return "particle";
}

@Override
public Action load(YamlConfiguration config, String path) {
String particleName = config.getString(path + ".particle", "HEART");
int count = config.getInt(path + ".count", 10);
double offsetX = config.getDouble(path + ".offset-x", 0.5);
double offsetY = config.getDouble(path + ".offset-y", 0.5);
double offsetZ = config.getDouble(path + ".offset-z", 0.5);
double speed = config.getDouble(path + ".speed", 0.1);

Particle particle;
try {
particle = Particle.valueOf(particleName.toUpperCase());
} catch (IllegalArgumentException e) {
particle = Particle.HEART;
}

return new ParticleAction(particle, count, offsetX, offsetY, offsetZ, speed);
}
}

ParticleAction.java​

package com.example.actions;

import fr.maxlego08.menu.api.action.Action;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.entity.Player;

public class ParticleAction implements Action {

private final Particle particle;
private final int count;
private final double offsetX;
private final double offsetY;
private final double offsetZ;
private final double speed;

public ParticleAction(Particle particle, int count,
double offsetX, double offsetY, double offsetZ,
double speed) {
this.particle = particle;
this.count = count;
this.offsetX = offsetX;
this.offsetY = offsetY;
this.offsetZ = offsetZ;
this.speed = speed;
}

@Override
public void execute(Player player) {
Location location = player.getLocation().add(0, 1, 0);
player.getWorld().spawnParticle(
particle,
location,
count,
offsetX, offsetY, offsetZ,
speed
);
}
}

Utilisation dans le YAML​

items:
reward-button:
slot: 13
item:
material: NETHER_STAR
name: "&6&lReclamer la Recompense"
actions:
- type: particle
particle: VILLAGER_HAPPY
count: 30
offset-x: 1.0
offset-y: 1.0
offset-z: 1.0
speed: 0.2
- type: message
messages:
- "&aRecompense reclamee !"

Exemple Complet : Action Economie​

EconomyActionLoader.java​

package com.example.actions;

import fr.maxlego08.menu.api.action.Action;
import fr.maxlego08.menu.api.loader.ActionLoader;
import org.bukkit.configuration.file.YamlConfiguration;

public class EconomyActionLoader implements ActionLoader {

@Override
public String getKey() {
return "custom-economy";
}

@Override
public Action load(YamlConfiguration config, String path) {
String operation = config.getString(path + ".operation", "give");
double amount = config.getDouble(path + ".amount", 0);
String successMessage = config.getString(path + ".success-message", "&aTermine !");
String failMessage = config.getString(path + ".fail-message", "&cEchec !");

return new EconomyAction(operation, amount, successMessage, failMessage);
}
}

EconomyAction.java​

package com.example.actions;

import fr.maxlego08.menu.api.action.Action;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;

public class EconomyAction implements Action {

private final String operation;
private final double amount;
private final String successMessage;
private final String failMessage;

public EconomyAction(String operation, double amount,
String successMessage, String failMessage) {
this.operation = operation;
this.amount = amount;
this.successMessage = successMessage;
this.failMessage = failMessage;
}

@Override
public void execute(Player player) {
Economy economy = getEconomy();
if (economy == null) {
player.sendMessage(ChatColor.RED + "Economie non disponible !");
return;
}

EconomyResponse response;
boolean success;

switch (operation.toLowerCase()) {
case "give":
case "deposit":
response = economy.depositPlayer(player, amount);
success = response.transactionSuccess();
break;
case "take":
case "withdraw":
if (economy.has(player, amount)) {
response = economy.withdrawPlayer(player, amount);
success = response.transactionSuccess();
} else {
success = false;
}
break;
default:
success = false;
}

String message = success ? successMessage : failMessage;
message = message.replace("%amount%", String.valueOf(amount));
message = message.replace("%balance%", String.valueOf(economy.getBalance(player)));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', message));
}

private Economy getEconomy() {
if (Bukkit.getPluginManager().getPlugin("Vault") == null) {
return null;
}
RegisteredServiceProvider<Economy> rsp =
Bukkit.getServicesManager().getRegistration(Economy.class);
return rsp != null ? rsp.getProvider() : null;
}
}

Utilisation dans le YAML​

items:
daily-reward:
slot: 13
item:
material: GOLD_INGOT
name: "&6&lRecompense Quotidienne"
lore:
- "&7Reclamez 100$ quotidiennement !"
actions:
- type: custom-economy
operation: give
amount: 100
success-message: "&aVous avez recu $%amount% ! Solde : $%balance%"
fail-message: "&cQuelque chose s'est mal passe !"

Exemple Complet : Action de Verification de Permission​

CheckPermissionActionLoader.java​

package com.example.actions;

import fr.maxlego08.menu.api.action.Action;
import fr.maxlego08.menu.api.loader.ActionLoader;
import org.bukkit.configuration.file.YamlConfiguration;

import java.util.List;

public class CheckPermissionActionLoader implements ActionLoader {

@Override
public String getKey() {
return "check-permission";
}

@Override
public Action load(YamlConfiguration config, String path) {
String permission = config.getString(path + ".permission", "");
List<String> successCommands = config.getStringList(path + ".success-commands");
List<String> failCommands = config.getStringList(path + ".fail-commands");

return new CheckPermissionAction(permission, successCommands, failCommands);
}
}

CheckPermissionAction.java​

package com.example.actions;

import fr.maxlego08.menu.api.action.Action;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

import java.util.List;

public class CheckPermissionAction implements Action {

private final String permission;
private final List<String> successCommands;
private final List<String> failCommands;

public CheckPermissionAction(String permission,
List<String> successCommands,
List<String> failCommands) {
this.permission = permission;
this.successCommands = successCommands;
this.failCommands = failCommands;
}

@Override
public void execute(Player player) {
List<String> commands = player.hasPermission(permission)
? successCommands
: failCommands;

for (String command : commands) {
String parsedCommand = command.replace("%player%", player.getName());
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), parsedCommand);
}
}
}

Utilisation dans le YAML​

items:
vip-reward:
slot: 13
item:
material: DIAMOND
name: "&b&lRecompense VIP"
actions:
- type: check-permission
permission: "server.vip"
success-commands:
- "give %player% diamond 5"
- "msg %player% &aVoici vos diamants VIP !"
fail-commands:
- "msg %player% &cVous avez besoin du rang VIP pour reclamer ceci !"

Action avec Support des Placeholders​

Pour supporter les placeholders dans votre action :

import fr.maxlego08.menu.api.utils.Placeholders;

@Override
public void execute(Player player) {
// Analyser les placeholders avant d'utiliser le message
String parsedMessage = Placeholders.parse(player, this.message);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', parsedMessage));
}

Bonnes Pratiques​

  1. Utiliser des noms d'action clairs - Identifiants descriptifs et uniques
  2. Valider l'entree - Gerer les configurations manquantes ou invalides
  3. Fournir des valeurs par defaut - Utiliser des valeurs par defaut sensees
  4. Supporter les placeholders - Analyser les placeholders la ou c'est approprie
  5. Gerer les erreurs avec elegance - Ne pas planter sur une entree invalide
  6. Documenter la configuration - Expliquer toutes les options dans votre documentation

Etapes Suivantes​

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