Plugin Résolu Impossible de faire apparaître un item

  • Auteur de la discussion Auteur de la discussion VG07
  • Date de début Date de début

VG07

Massacreur de Mouton
23 Mars 2020
36
1
18
24
J'ai fait cette fonction pour give un item à un joueur et j'ai fait en sorte que si le joueur n'as pas assez de place pour ajouter l'item dans son inventaire ça le drop à ses pied mias lorsque la methode player.getWorld().dropItem(player.getLocation, entry.getValue()); se lance mon item n'apparait pas et les lignes après ne se lance pas


Java:
public static void giveItem(Player player, ItemStack itemStack) {
    HashMap<Integer, ItemStack> remainingItems = player.getInventory().addItem(itemStack);
    if (!remainingItems.isEmpty()) {
        for (Map.Entry<Integer, ItemStack> entry : remainingItems.entrySet()) {
            System.out.println(2);
            player.getWorld().dropItem(player.getLocation(), entry.getValue());
            System.out.println(3);
        }
    }
}
 
Salut,

N'utilise pas de System.out quand tu développes un plugin...
Cette output est pour Java "de base", pour écrire de manière propre dans les logs, il vaut mieux utiliser:
Java:
Bukkit.getLogger().info("<ton message>");

Ensuite, pour ton problème, je sais que j'avais déjà eu des soucis... La solution était de téléporter l'élément:
Java:
final Item dropItem = player.getWorld().dropItem(player.getLocation(), entry.getValue());
dropItem.setVelocity(new Vector(0, 0, 0)); // On évite qu'il bouge
dropItem.setFallDistance(0);
dropItem.teleport(player.getLocation());

A voir si ça aide...


Cordialement,
Detobel36
 
Salut,

N'utilise pas de System.out quand tu développes un plugin...
Cette output est pour Java "de base", pour écrire de manière propre dans les logs, il vaut mieux utiliser:
Java:
Bukkit.getLogger().info("<ton message>");

Ensuite, pour ton problème, je sais que j'avais déjà eu des soucis... La solution était de téléporter l'élément:
Java:
final Item dropItem = player.getWorld().dropItem(player.getLocation(), entry.getValue());
dropItem.setVelocity(new Vector(0, 0, 0)); // On évite qu'il bouge
dropItem.setFallDistance(0);
dropItem.teleport(player.getLocation());

A voir si ça aide...


Cordialement,
Detobel36
Mon programme semble s'arrêter à la ligne à laquelle l'on fait player.getWorld().dropItem(player.getLocation(), entry.getValue());
Puisque dans ma console, j'ai le 2, mais pas le 3 et les suivants.
Java:
public static void giveItem(Player player, ItemStack itemStack) {
        HashMap<Integer, ItemStack> remainingItems = player.getInventory().addItem(itemStack);

        if (!remainingItems.isEmpty()) {
            for (Map.Entry<Integer, ItemStack> entry : remainingItems.entrySet()) {
                Bukkit.getLogger().info("2");
                final Item dropItem = player.getWorld().dropItem(player.getLocation(), entry.getValue());
                Bukkit.getLogger().info("3");
                dropItem.setVelocity(new Vector(0, 0, 0)); // On évite qu'il bouge
                Bukkit.getLogger().info("4");
                dropItem.setFallDistance(0);
                Bukkit.getLogger().info("5");
                dropItem.teleport(player.getLocation());
                Bukkit.getLogger().info("6");
            }
        }
    }
 
Bonjour,

Vérifie que tu es bien dans le thread principal du serveur ;
Java:
public static void giveItems(Player p, ItemStack... stacks) {
    AsyncCatcher.catchOp("giveItems");
    
    final var location = p.getLocation();
    final var world = location.getWorld();
    
    for(var excess : p.getInventory().addItem(stacks).values()) {
        world.dropItemNaturally(location, excess);
    }
}

Cordialement,
ShE3py
 
Bonjour,

Vérifie que tu es bien dans le thread principal du serveur ;
Java:
public static void giveItems(Player p, ItemStack... stacks) {
    AsyncCatcher.catchOp("giveItems");
   
    final var location = p.getLocation();
    final var world = location.getWorld();
   
    for(var excess : p.getInventory().addItem(stacks).values()) {
        world.dropItemNaturally(location, excess);
    }
}

Cordialement,
ShE3py
Je n'ai pas réussi à utiliser la méthode catchOP("giveItems"). Mais, la méthode ne s'exécute pas dans le thread principal, finalement, j'ai fait ça pour forcer l'exécution dans le thread principal

Code:
public static void giveItem(Player player, ItemStack itemStack, Plugin plugin) {
        Bukkit.getScheduler().runTask(plugin, new Runnable() {
            @Override
            public void run() {
                HashMap<Integer, ItemStack> remainingItems = player.getInventory().addItem(itemStack);
                if(!remainingItems.isEmpty()) {
                    for (Map.Entry<Integer, ItemStack> entry : remainingItems.entrySet()) {
                        Bukkit.getLogger().info("2");
                        final Item dropItem = player.getWorld().dropItem(player.getLocation(), entry.getValue());
                        Bukkit.getLogger().info("3");
                        dropItem.setVelocity(new Vector(0, 0, 0)); // On évite qu'il bouge
                        Bukkit.getLogger().info("4");
                        dropItem.setFallDistance(0);
                        Bukkit.getLogger().info("5");
                        dropItem.teleport(player.getLocation());
                        Bukkit.getLogger().info("6");
                    }
                }
            }
        });
    }