[Problème] Erreur commande

StyleBleu

Bucheron
18 Septembre 2022
25
0
13
30
Bonjour je suis en train de créer un plugin avec des royaumes mais il y a une erreur pour un menu et apparemment, cela vient du code du la commande.
Voici le code:

Classe principale (Main):

package fr.stylebleu.terraiaplug;

import org.bukkit.plugin.java.JavaPlugin;

import fr.stylebleu.terraiaplug.commands.CommandKingdom;
import fr.stylebleu.terraiaplug.commands.CommandSpawn;
import fr.stylebleu.terraiaplug.commands.CommandTest;

public class Main extends JavaPlugin {

@Override
public void onEnable() {
System.out.println("The plugin TerraiaPlug is now ENABLED!");
getCommand("test").setExecutor(new CommandTest());
getCommand("bc").setExecutor(new CommandTest());
getCommand("spawn").setExecutor(new CommandSpawn());
getCommand("kingdom").setExecutor(new CommandKingdom());
getServer().getPluginManager().registerEvents(new TerraiaPlugListeners(), this);
}


@Override
public void onDisable() {
System.out.println("The plugin TerraiaPlug is now DISABLED!");
}


}

Classe de la commande (CommandKingdom):

package fr.stylebleu.terraiaplug.commands;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;


public class CommandKingdom implements CommandExecutor {

@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args ) {
if(sender instanceof Player){
Player player = (Player)sender;

if(cmd.getName().equalsIgnoreCase("kingdom")){

KingdomData kingdom1 = new KingdomData("A");
Inventory menukingdom = Bukkit.createInventory(null, 54, "§6[§eMenu Royaume§6]" + kingdom1.getnameKingdom());

ItemStack ndroy = new ItemStack(Material.OAK_SIGN, 1);
ItemMeta ndroyM = ndroy.getItemMeta();
ndroyM.setDisplayName("§6Nom du Royaume :§e§l" + kingdom1.getnameKingdom());
ndroy.setItemMeta(ndroyM);

menukingdom.setItem(5, ndroy);

player.openInventory(menukingdom);


}


}

return false;
}

}

Données des royaumes (DataKingdom):

package fr.stylebleu.terraiaplug.commands;

import org.bukkit.entity.Player;

public class KingdomData {

private String nameKingdom;

KingdomData kingdom1 = new KingdomData(nameKingdom);


public KingdomData(String nameKingdom) {
this.nameKingdom = nameKingdom;
}
public String getnameKingdom() {
return nameKingdom;
}

public void setnameKingdom(String name) {
this.nameKingdom = name;
}




}
 
Bonsoir,

il y a une erreur pour un menu et apparemment, cela vient du code du la commande
C'est pas mal de dire l'erreur qu'il t'affiche car le but du message d'erreur c'est un peu d'expliquer pourquoi il y a une erreur.

Pour commenter ton code, utiliser des triples accents graves pour formater ton code :
Code:
```java
Copie-colle ton code entre ces deux triples accents graves à recopier
```

public class KingdomData
Toute classe représente des données, donc si tu veux représenter un royaume ta classe devrait s'appeler tout simplement Kingdom.

kingdom1.getnameKingdom()
C'est évident que kingdom.getName() sans aucun paramètre renvoie le nom du royaume, pas besoin de suffixer toutes tes méthodes du nom de la classe.

ItemStack ndroy = new ItemStack(Material.OAK_SIGN, 1);
Tu as l'autocomplétion donc tu peux écrire une variable de 258951258 lettres avec les trois premières, donc nomme ton item kingdomName au lieu d'une abréviation obscure du terme français.

De plus vu que l'item décrit le royaume, moi je déplacerai complètement sa création dans une méthode du royaume :
Java:
public class Kingdom {
    private final String displayName;
    
    public Kingdom(String displayName) {
        if(displayName == null || displayName.isBlank()) throw new IllegalArgumentException("displayName must not be blank");
        
        this.displayName = displayName;
    }
    
    public String getDisplayName() {
        return this.displayName;
    }
    
    public ItemStack getDisplayItem() {
        ItemStack item = new ItemStack(Material.OAK_SIGN);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName("Nom du royaume: " + this.displayName);
        
        item.setItemMeta(meta);
        return item;
    }
}

L'avantage est lorsque tu voudras peaufiner l'affichage, en prenant par ex. minecraft:acacia_sign à la place du chêne si le royaume se situe dans une savane, tu auras ta vingtaine de lignes pour faire ça dans une fonction qui ne fait que créer cet item, plutôt qu'avoir ça dans ta fonction d'affichage qui doit en plus gérer l'inventaire à ouvrir, alors si tu écrits en plus vingt lignes par item à afficher ça va vite devenir bordélique.

De plus ça te permettra d'éviter de dupliquer le code si jamais tu veux afficher tes royaumes dans un autre inventaire custom.

Cordialement,
ShE3py
 
[21:23:55] [Server thread/INFO]: StyleBleu issued server command: /kingdom
[21:23:55] [Server thread/ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'kingdom' in plugin TerraiaPlug v1.0.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[spigot-api-1.19.2-R0.1-SNAPSHOT.jar:?]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:149) ~[spigot-api-1.19.2-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.v1_19_R1.CraftServer.dispatchCommand(CraftServer.java:833) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at org.bukkit.craftbukkit.v1_19_R1.command.BukkitCommandWrapper.run(BukkitCommandWrapper.java:50) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at com.mojang.brigadier.CommandDispatcher.execute(CommandDispatcher.java:264) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:?]
at net.minecraft.commands.CommandDispatcher.performCommand(CommandDispatcher.java:298) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.commands.CommandDispatcher.a(CommandDispatcher.java:282) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.server.network.PlayerConnection.b(PlayerConnection.java:1949) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.server.network.PlayerConnection.lambda$18(PlayerConnection.java:1914) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.util.thread.IAsyncTaskHandler.b(SourceFile:68) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[?:?]
at net.minecraft.server.TickTask.run(SourceFile:18) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.util.thread.IAsyncTaskHandler.d(SourceFile:157) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.util.thread.IAsyncTaskHandlerReentrant.d(SourceFile:23) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1150) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.server.MinecraftServer.d(MinecraftServer.java:1) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.util.thread.IAsyncTaskHandler.x(SourceFile:131) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.server.MinecraftServer.bh(MinecraftServer.java:1129) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.server.MinecraftServer.x(MinecraftServer.java:1122) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.util.thread.IAsyncTaskHandler.c(SourceFile:140) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1106) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.server.MinecraftServer.v(MinecraftServer.java:1017) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:293) ~[spigot-1.19.2-R0.1-SNAPSHOT.jar:3587-Spigot-4c157bb-dc57aa3]
at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: java.lang.StackOverflowError
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:12) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]

ça répète une centaine de fois: at fr.stylebleu.terraiaplug.commands.Kingdom.<init>(Kingdom.java:9) ~[?:?]
 
Tu rappelles le constructeur dans le constructeur (<init>) de Kingdom ce qui cause une boucle infinie, enlève l'appel récursif ou envoie-moi le code de ta classe.
 
Par Toutatis.

Java:
Kingdom kingdom1 = new Kingdom(kingdom1.getName(), kingdom1.getLeader(), kingdom1.getMembers(), true);
Tu ne peux pas créer un objet à partir des données de l'objet que tu es en train de créer.

Java:
Kingdom kingdom2 = new Kingdom(kingdom2.getName(), kingdom2.getLeader(), kingdom2.getMembers(), true);
Kingdom kingdom3 = new Kingdom(kingdom3.getName(), kingdom3.getLeader(), kingdom3.getMembers(), true);
Kingdom kingdom4 = new Kingdom(kingdom4.getName(), kingdom4.getLeader(), kingdom4.getMembers(), true);
Tu ne dois jamais recopier une même ligne 50 fois ; utilise une liste :
Java:
List<Kingdom> kingdoms = new ArrayList<>();
Kingdom kingdom1849130 = kingsdoms.get(1849130);

Java:
public class Kingdom {
    private ArrayList name;
    private ArrayList leader;
    private ArrayList members;
Tu dois TOUJOURS mettre le type de ta liste :
Java:
private List<Player> members;

De plus, le nom est une chaîne de caractères, et le leader est un joueur. Pas une liste.
 
  • J'aime
Reactions: Niz