1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Отмена дропа отдельного предмета.

Тема в разделе "Разработка плагинов для новичков", создана пользователем zabelov, 24 сен 2018.

Статус темы:
Закрыта.
  1. Автор темы
    zabelov

    zabelov Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Zabelov
    Всем привет! Наткнулся на такую проблему, как отключение дропа для определенного предмета. Код снизу:

    Код:
    @EventHandler
        public void onDeath(PlayerDeathEvent e) {
            Player player = e.getEntity();
            e.setDeathMessage(null);
            List<ItemStack> drops = e.getDrops();
            for (ItemStack drop : drops) {
                if (drop.getItemMeta().hasDisplayName() && drop.getItemMeta().getDisplayName().contains("Меч тьмы")) {
                    e.getDrops().remove(drop);
                }
            }
        }
    Сервер пишет, что ошибка именно на строке for(ItemStack drop: drops) {
     
  2. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Ошибку кинь
     
  3. Автор темы
    zabelov

    zabelov Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Zabelov
    Код:
    [21:15:12 ERROR]: Could not pass event PlayerDeathEvent to Main v1.0
    org.bukkit.event.EventException: null
            at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:72) ~[spigot-1.12.jar:git-Paper-1215]
            at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:78) ~[spigot-1.12.jar:git-Paper-1215]
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.jar:git-Paper-1215]
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:514) ~[spigot-1.12.jar:git-Paper-1215]
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:499) ~[spigot-1.12.jar:git-Paper-1215]
            at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callPlayerDeathEvent(CraftEventFactory.java:413) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.EntityPlayer.die(EntityPlayer.java:449) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity(EntityLiving.java:972) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.EntityHuman.damageEntity(EntityHuman.java:766) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.EntityPlayer.damageEntity(EntityPlayer.java:603) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.EntityLiving.killEntity(EntityLiving.java:129) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.CommandKill.execute(SourceFile:35) ~[spigot-1.12.jar:git-Paper-1215]
            at org.bukkit.craftbukkit.v1_12_R1.command.VanillaCommandWrapper.dispatchVanillaCommand(VanillaCommandWrapper.java:109) ~[spigot-1.12.jar:git-Paper-1215]
            at org.bukkit.craftbukkit.v1_12_R1.command.VanillaCommandWrapper.execute(VanillaCommandWrapper.java:38) ~[spigot-1.12.jar:git-Paper-1215]
            at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:151) ~[spigot-1.12.jar:git-Paper-1215]
            at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:676) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1431) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1236) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:5) ~[spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.PlayerConnectionUtils.lambda$ensureMainThread$0(PlayerConnectionUtils.java:14) ~[spigot-1.12.jar:git-Paper-1215]
            at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_181]
            at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_181]
            at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:843) [spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:424) [spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:767) [spigot-1.12.jar:git-Paper-1215]
            at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:665) [spigot-1.12.jar:git-Paper-1215]
            at java.lang.Thread.run(Unknown Source) [?:1.8.0_181]
    Caused by: java.util.ConcurrentModificationException
            at java.util.ArrayList$Itr.checkForComodification(Unknown Source) ~[?:1.8.0_181]
            at java.util.ArrayList$Itr.next(Unknown Source) ~[?:1.8.0_181]
            at ru.zabelov.Main.onDeath(Main.java:212) ~[?:?]
            at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor12.execute(Unknown Source) ~[?:?]
            at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:70) ~[spigot-1.12.jar:git-Paper-1215]
            ... 28 more
     
  4. HunterGaming

    HunterGaming Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    sqdFendy
    у тебя лист getDrops null, ибо каждый раз выпадает дроп)
     
  5. Автор темы
    zabelov

    zabelov Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Zabelov
    Не подскажешь, как это поправить?
     
  6. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Эм, что?
    ConcurrentModificationException
    Он из листа по которому "бегает" - удаляет.
     
  7. Автор темы
    zabelov

    zabelov Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Zabelov
    У вас конечно невероятно интересная дискуссия, но мне нужна помощь
     
  8. l_Slime_l

    l_Slime_l Активный участник Пользователь

    Баллы:
    76
    Можно вроде вместо цикла for использовать while и итератор.
     
  9. Zнамя Юности

    Zнамя Юности Активный участник Пользователь

    Баллы:
    76
    for (ItemStack drop : new ArrayList<>(drops)) {
     
  10. LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Ты во время итерации удаляешь из этой же коллекции. Так нельзя. Удаляй сразу в итераторе, либо перебирай копию коллекции, из которой удаляешь. Первый вариант:
    PHP:
    Iterator<ItemStackdrops e.getDrops().iterator();
    while (
    drops.hasNext()) {
        
    ItemStack drop drops.next();
        if (
    drop.getItemMeta().hasDisplayName() && drop.getItemMeta().getDisplayName().contains("Меч тьмы"))
            
    drop.remove();
    }
    Второй вариант:
    PHP:
    List<ItemStackdrops = new ArrayList<>(e.getDrops()); // <=
    for (ItemStack drop drops) {
        
    // ...  Как и было
    }
     
    Последнее редактирование: 24 сен 2018
  11. Автор темы
    zabelov

    zabelov Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Zabelov
    Спасибо. Еще вопросик: можно ли проверять предмет не по названию, а по чему-нибудь еще? Например, по NBT-тегам?
     
  12. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    По Material можно, и лучше будет. itemStack.getType()
    Если предметы с "ключевыми" display именами, то по ним самим чекай. Конечно можно ещё какой-то кастомный тэг писать и проверять, но есть ли в этом смысл?
     
    Последнее редактирование: 25 сен 2018
  13. HunterGaming

    HunterGaming Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    sqdFendy
    Айй, ошибся) Я StackTrace не смотрел, увидел, что null кидает, начал сразу писать про getDrops
     
  14. Автор темы
    zabelov

    zabelov Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Zabelov
    Все, сделал - работает
     
Статус темы:
Закрыта.

Поделиться этой страницей