3 votes

Minecraft - Les objets flottants disparaissent avec ce code ?

Avec ce petit plugin, les objets qui sont stockés dans la liste de tableaux "FLOATING" ne devraient pas se désempiler, mais ils le font quand même ?

J'ai essayé d'utiliser à la fois ItemDespawnEvent et EntityDeathEvent et les deux n'ont pas fonctionné.

    public void itemVanish2(ItemDespawnEvent e) {
        if(e.getEntity().getType() == EntityType.DROPPED_ITEM) {
            ItemStack i = (ItemStack) e.getEntity();

            if(i.getItemMeta().getLore().contains("FLOATING"))
                e.getEntity().getWorld().dropItem(e.getEntity().getLocation(), i);
        } else {
            return;
        }
    }

    public void itemVanish(EntityDeathEvent e) {
        if (e.getEntity().getType() == EntityType.DROPPED_ITEM) {
            ItemStack i = (ItemStack) e.getEntity();

            if (i.getItemMeta().getLore().contains("FLOATING"))
                e.getEntity().getWorld().dropItem(e.getEntity().getLocation(), i);

        } else {
            return;
        }
    }

Je cherche à ce que les objets ne se désintègrent pas, mais dans la console, il y a une erreur, puis l'objet se désintègrera.

Voici l'erreur qui se produit :

[06:49:03] [Server thread/ERROR]: Could not pass event ItemDespawnEvent to FloatingShopItems v1.0.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:320) ~[spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:520) ~[spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:505) ~[spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at org.bukkit.craftbukkit.v1_14_R1.event.CraftEventFactory.callItemDespawnEvent(CraftEventFactory.java:621) ~[spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.EntityItem.tick(EntityItem.java:129) ~[spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.WorldServer.entityJoinedWorld(WorldServer.java:570) ~[spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.World.a(World.java:745) [spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.WorldServer.doTick(WorldServer.java:346) [spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.MinecraftServer.b(MinecraftServer.java:1057) [spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.DedicatedServer.b(DedicatedServer.java:396) [spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.MinecraftServer.a(MinecraftServer.java:956) [spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at net.minecraft.server.v1_14_R1.MinecraftServer.run(MinecraftServer.java:801) [spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_212]
Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_14_R1.entity.CraftItem cannot be cast to org.bukkit.inventory.ItemStack
        at mad.madster.floatingitems.FloatingItems.itemVanish2(FloatingItems.java:138) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_212]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_212]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_212]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_212]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:316) ~[spigot-1.14.2.jar:git-Spigot-093165d-ba575a5]

1voto

Squiddie Points 1012

Le site event.getEntity() renvoie un élément (l'entité) et non un ItemStack. Il y a une différence. Item est la goutte elle-même, que vous verrez flotter autour de vous, un Item a un ItemStack. Un ItemStack est l'objet dans votre inventaire, il contient des données telles que le type d'objet, sa quantité, etc.

C'est la raison pour laquelle vous rencontrez une ClassCastException, vous n'avez pas du tout besoin d'effectuer un casting de l'entité, c'est un Item qui possède la méthode getItemStack() qui peut être utilisé pour retrouver le "vrai" élément.

Si tout ce que vous voulez faire, c'est désactiver le despawning, ne déposez pas un nouvel objet, cela ne ferait que demander plus de ressources et pourrait conduire à des doublons. La structure des événements de Bukkit vous permet de désactiver la plupart des événements, y compris ItemDespawnEvent, ce qui signifie que vous pouvez l'empêcher de disparaître.

Le code résultant serait quelque chose comme ceci :

@EventHandler
public void itemVanish2(ItemDespawnEvent e) {
    ItemStack i = e.getEntity().getItemStack();

    if(i.getItemMeta().getLore().contains("FLOATING"))
        event.setCancelled(true); // cancel the event, so item does not despawn
    }
}

Notez que la vérification de l'histoire d'un objet peut ne pas être la meilleure solution pour l'identifier. Que faire si l'itemStack n'a pas d'itemMeta ou de lore ? Et si un utilisateur peut éditer l'histoire ? Cela leur permettrait de créer des objets non déboulonnables, un chemin facile vers des problèmes. Je recommande d'utiliser les MetaData à la place, de cette façon seul votre plugin peut créer ces objets.

0voto

Jonas Points 92

Bienvenue sur Stackoverflow

org.bukkit.craftbukkit.v1_14_R1.entity.CraftItem cannot be cast to org.bukkit.inventory.ItemStack

Cela semble être l'erreur. Vous appelez Item.getEntity() mais l'objet retourné ne peut pas être casté en ItemStack. ItemDespawnEvent.getEntity() . Dans Spigot 1.14.2, il y a une méthode sous l'objet Item.getItemStack() alors essayez d'exécuter le code ci-dessous :

public void itemVanish2(ItemDespawnEvent e) {
    if(e.getEntity().getType() == EntityType.DROPPED_ITEM) {
        ItemStack i = (ItemStack) e.getEntity().getItemStack();

        if(i.getItemMeta().getLore().contains("FLOATING"))
            e.getEntity().getWorld().dropItem(e.getEntity().getLocation(), i);
    } else {
        return;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X