Minecraft - Плавающие предметы исчезают с этим кодом? - PullRequest
3 голосов
/ 10 июня 2019

С помощью этого небольшого плагина элементы, которые хранятся в массиве "FLOATING", не должны исчезать, но они все еще работают?

Я пытался использовать оба ItemDespawnEvent и EntityDeathEvent, и оба не работали

    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;
        }
    }

Я ищу элементы, которые не исчезают, но в консоли выдает ошибку, затем элемент исчезает.

Это ошибка, которую выдает:

[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]

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

event.getEntity() возвращает Item (сущность), а не ItemStack.Есть разница.Item - это сама капля, которую вы увидите плавающей, у Item есть ItemStack.ItemStack - это элемент в вашем инвентаре, он содержит такие данные, как тип элемента и его стоимость и т. Д.

Вот почему вы испытываете ClassCastException, вам не нужно приводить объект ввсе, это Предмет, который имеет метод getItemStack () , который можно использовать для извлечения "реального" предмета.

Если все, что вы хотите сделать, это отключить удаление, неудалить новый элемент, который потребует больше ресурсов и может привести к дублированию.Структура событий Bukkit позволяет вам отключить большинство событий, включая ItemDespawnEvent, что означает, что вы можете предотвратить его исчезновение.

Полученный код будет выглядеть примерно так:

@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
    }
}

Обратите внимание, что проверкаПредмет для знаний может быть не лучшим решением для его идентификации.Что если у itemStack нет itemMeta или знаний?Что если пользователь может редактировать знания?Это позволило бы им создавать невидимые предметы, легкий путь к проблемам.Вместо этого я рекомендую использовать MetaData, так что только ваш плагин может сделать эти элементы

0 голосов
/ 11 июня 2019

добро пожаловать в Stackoverflow

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

Кажется, это ошибка.Вы звоните Item.getEntity(), но возвращаемый объект не может быть приведен к ItemStack. ItemDespawnEvent.getEntity () .В Spigot 1.14.2 есть метод под Object Item.getItemStack () , поэтому попробуйте выполнить следующий код:

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;
    }
}
...