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

  • Автор темы Автор темы 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) {
 
Код:
[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
 
Код:
[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
у тебя лист getDrops null, ибо каждый раз выпадает дроп)
 
У вас конечно невероятно интересная дискуссия, но мне нужна помощь
Ты во время итерации удаляешь из этой же коллекции. Так нельзя. Удаляй сразу в итераторе, либо перебирай копию коллекции, из которой удаляешь. Первый вариант:
PHP:
Iterator<ItemStack> drops = e.getDrops().iterator();
while (drops.hasNext()) {
    ItemStack drop = drops.next();
    if (drop.getItemMeta().hasDisplayName() && drop.getItemMeta().getDisplayName().contains("Меч тьмы"))
        drop.remove();
}
Второй вариант:
PHP:
List<ItemStack> drops = new ArrayList<>(e.getDrops()); // <=
for (ItemStack drop : drops) {
    // ...  Как и было
}
 
Последнее редактирование:
Ты во время итерации удаляешь из этой же коллекции. Так нельзя. Удаляй сразу в итераторе, либо перебирай копию коллекции, из которой удаляешь. Первый вариант:
PHP:
Iterator<ItemStack> drops = e.getDrops().iterator();
while (drops.hasNext()) {
    ItemStack drop = drops.next();
    if (drop.getItemMeta().hasDisplayName() && drop.getItemMeta().getDisplayName().contains("Меч тьмы"))
        drop.remove();
}
Второй вариант:
PHP:
List<ItemStack> drops = new ArrayList<>(e.getDrops()); // <=
for (ItemStack drop : drops) {
    // ...  Как и было
}
Спасибо. Еще вопросик: можно ли проверять предмет не по названию, а по чему-нибудь еще? Например, по NBT-тегам?
 
По Material можно, и лучше будет. itemStack.getType()
Если предметы с "ключевыми" display именами, то по ним самим чекай. Конечно можно ещё какой-то кастомный тэг писать и проверять, но есть ли в этом смысл?
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх