Помогите Отмена выдачи бутылька после того, как игрок выпил зелье.

  • Автор темы Автор темы KoreeeZ
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

KoreeeZ

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
KoreeeZ
Что нужно прописать?

Код:
    @EventHandler
    public void NoBottle(PlayerItemConsumeEvent e){
       
        Player p = e.getPlayer();
        Material potion = Material.POTION;
       
        if (!(e.getItem().getType() == potion)) return;
       
       
        p.sendMessage("Удалена бутылочка!");
    }
 
Не работает
Код:
    @EventHandler
    public void NoBottle(PlayerItemConsumeEvent e){
        Material potion = Material.POTION;
        if (!(e.getItem().getType() == potion)) return;
        e.setItem(null);
    }

ошибка в консоле:
[21:41:53] [Server thread/FATAL]: Error executing task
java.util.concurrent.ExecutionException: net.minecraft.server.v1_8_R3.ReportedException: Ticking player
at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_121]
at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_121]
at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:45) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_121]
Caused by: net.minecraft.server.v1_8_R3.ReportedException: Ticking player
at net.minecraft.server.v1_8_R3.EntityPlayer.l(EntityPlayer.java:350) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:382) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInFlying.a(SourceFile:126) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInFlying$PacketPlayInLook.a(SourceFile:88) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_121]
at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_121]
at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
... 5 more
Caused by: java.lang.NullPointerException
at net.minecraft.server.v1_8_R3.EntityHuman.s(EntityHuman.java:313) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.EntityPlayer.s(EntityPlayer.java:885) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.EntityHuman.t_(EntityHuman.java:142) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.EntityPlayer.l(EntityPlayer.java:285) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:382) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInFlying.a(SourceFile:126) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInFlying$PacketPlayInLook.a(SourceFile:88) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_121]
at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_121]
at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
... 5 more
 
if (e.getItem().getType() == potion) e.setItem (null);
 
Я ошибку кажется допустил, если я конечно не путаю, то setItem не принимать значение null, напиши так e.setItem (new ItemStack (Material.AIR)); По идее должно работать...
А еще мне кажется что гужно сделать проверку на игрока, т.е if (e.getEntity () instanceof Player)
 
если я конечно не путаю, то setItem не принимать значение null, напиши так e.setItem (new ItemStack (Material.AIR)); По идее должно работать...
не будет
43901cd6aef58e12d450ede594eb47f5.png

А еще мне кажется что гужно сделать проверку на игрока, т.е if (e.getEntity () instanceof Player)
Интересно зачем?

Не работает
Код:
    @EventHandler
    public void NoBottle(PlayerItemConsumeEvent e){
        Material potion = Material.POTION;
        if (!(e.getItem().getType() == potion)) return;
        e.setItem(null);
    }

ошибка в консоле:
[21:41:53] [Server thread/FATAL]: Error executing task
java.util.concurrent.ExecutionException: net.minecraft.server.v1_8_R3.ReportedException: Ticking player
at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_121]
at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_121]
at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:45) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [Spigot.jar:git-Spigot-21fe707-e1ebe52]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_121]
Caused by: net.minecraft.server.v1_8_R3.ReportedException: Ticking player
at net.minecraft.server.v1_8_R3.EntityPlayer.l(EntityPlayer.java:350) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:382) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInFlying.a(SourceFile:126) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInFlying$PacketPlayInLook.a(SourceFile:88) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_121]
at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_121]
at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
... 5 more
Caused by: java.lang.NullPointerException
at net.minecraft.server.v1_8_R3.EntityHuman.s(EntityHuman.java:313) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.EntityPlayer.s(EntityPlayer.java:885) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.EntityHuman.t_(EntityHuman.java:142) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.EntityPlayer.l(EntityPlayer.java:285) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:382) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInFlying.a(SourceFile:126) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PacketPlayInFlying$PacketPlayInLook.a(SourceFile:88) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_121]
at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_121]
at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) ~[Spigot.jar:git-Spigot-21fe707-e1ebe52]
... 5 more
Java:
    @EventHandler
    public void onUseItem(PlayerItemConsumeEvent e) {
        if (e.getItem().getType() == Material.POTION) {
            Potion potion = Potion.fromItemStack(e.getItem());
            for (PotionEffect ef : potion.getEffects()) {
                e.getPlayer().addPotionEffect(ef);
            }
            e.setCancelled(true);
            e.getPlayer().getInventory().remove(e.getItem());
        }
    }
Можно попробовать так
 
не будет
43901cd6aef58e12d450ede594eb47f5.png


Интересно зачем?


Java:
    @EventHandler
    public void onUseItem(PlayerItemConsumeEvent e) {
        if (e.getItem().getType() == Material.POTION) {
            Potion potion = Potion.fromItemStack(e.getItem());
            for (PotionEffect ef : potion.getEffects()) {
                e.getPlayer().addPotionEffect(ef);
            }
            e.setCancelled(true);
            e.getPlayer().getInventory().remove(e.getItem());
        }
    }
Можно попробовать так


Это в каком то роде и работает, но имеет 2 минуса, которые я заметил.
1) Если на игроке есть эффект, то обновить его нельзя. (Когда остается мало времени эффекту, игрок выпивает такое же зелье, чтобы обновить время)
2) Если в инвентаре игрока лежат одинаковые зелья, то они все удаляются.
 
  1. В этом случае можно сперва убрать уже существующие эффекты зелий, а потом уже ставить их заного.
  2. Можно или удалять предмет в руке игрока, или написать свой код удаления предмета из инвентаря, отнимающий не более N предметов.
 
  1. В этом случае можно сперва убрать уже существующие эффекты зелий, а потом уже ставить их заного.
  2. Можно или удалять предмет в руке игрока, или написать свой код удаления предмета из инвентаря, отнимающий не более N предметов.
1) А если на игроке несколько разных эффектов, то они же все сбросятся
 
Не обязательно сбрасывать все эффекты. Достаточно только те, которые накладывает зелье.
 
В цикле перед addPotionEffect нужно использовать removePotionEffect (как-то так называется).
 
В цикле перед addPotionEffect нужно использовать removePotionEffect (как-то так называется).
Дело в том, что removePotionEffect принимает значения типа PotionEffectType, а переменная ef - является LivingEnity
 
  1. Переменная ef имеет тип PotionEffect (во всяком случае это справедливо для кода выше).
  2. У PotionEffect должен быть метод, возвращающий PotionEffectType.
 
  1. Переменная ef имеет тип PotionEffect (во всяком случае это справедливо для кода выше).
  2. У PotionEffect должен быть метод, возвращающий PotionEffectType.
Спасибо, первую проблему я решил, осталось лишь малость. Удалить бутылочку.
 
Player p = e.getPlayer ();
p.getItemInHand ().setItem (new ItemStack (Material.AIR));
Вроде должно работать
 
Player p = e.getPlayer ();
p.getItemInHand ().setItem (new ItemStack (Material.AIR));
Вроде должно работать
Дело в том, что ".setItem()" нельзя применять к ".getItemInHand"
Ко ItemInHand я пробовал применить setItemType(Material.Air), но это не работает.
 
А нет стой, не правильно написал.
p.getInventory ().setItemInHand (new ItemStack (Material.AIR));
 
e.getPlayer().getInventory().setItem(e.getPlayer().getInventory().getHeldItemSlot(), new ItemStack(Material.AIR));
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх