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

VG07

Massacreur de Mouton
23 Mars 2020
36
1
18
23
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);
        }
    }
}
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 531
24
2 247
347
28
Bruxelles - Belgique
www.phoenix-rebirth.fr
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
 

VG07

Massacreur de Mouton
23 Mars 2020
36
1
18
23
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");
            }
        }
    }
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 139
162
464
247
21
Mìlhüsa
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
 

VG07

Massacreur de Mouton
23 Mars 2020
36
1
18
23
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");
                    }
                }
            }
        });
    }