Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by KoreeeZ, Apr 22, 2017.

Thread Status:
Not open for further replies.
  1. Автор темы
    KoreeeZ

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

    Trophy Points:
    66
    Имя в Minecraft:
    KoreeeZ
    Что нужно прописать?

    Code:
        @EventHandler
        public void NoBottle(PlayerItemConsumeEvent e){
           
            Player p = e.getPlayer();
            Material potion = Material.POTION;
           
            if (!(e.getItem().getType() == potion)) return;
           
           
            p.sendMessage("Удалена бутылочка!");
        }
    
     
  2. Хостинг MineCraft
    <
  3. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    setItem(null)
     
  4. Автор темы
    KoreeeZ

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

    Trophy Points:
    66
    Имя в Minecraft:
    KoreeeZ
    Не работает
    Code:
        @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
     
  5. HunterGaming

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

    Trophy Points:
    46
    Имя в Minecraft:
    HunterGaming13
    if (e.getItem().getType() == potion) e.setItem (null);
     
  6. slavik123123123

    slavik123123123 Старожил Пользователь

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    а разница то какая? что его, что твой метод выдадут ошибку.
     
  7. HunterGaming

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

    Trophy Points:
    46
    Имя в Minecraft:
    HunterGaming13
    Я ошибку кажется допустил, если я конечно не путаю, то setItem не принимать значение null, напиши так e.setItem (new ItemStack (Material.AIR)); По идее должно работать...[DOUBLEPOST=1492896832,1492896697][/DOUBLEPOST]А еще мне кажется что гужно сделать проверку на игрока, т.е if (e.getEntity () instanceof Player)
     
  8. slavik123123123

    slavik123123123 Старожил Пользователь

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    не будет
    [​IMG]
    Интересно зачем?

    Code:
        @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());
            }
        }
    Можно попробовать так
     
  9. Автор темы
    KoreeeZ

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

    Trophy Points:
    66
    Имя в Minecraft:
    KoreeeZ

    Это в каком то роде и работает, но имеет 2 минуса, которые я заметил.
    1) Если на игроке есть эффект, то обновить его нельзя. (Когда остается мало времени эффекту, игрок выпивает такое же зелье, чтобы обновить время)
    2) Если в инвентаре игрока лежат одинаковые зелья, то они все удаляются.
     
  10. gamerforEA

    gamerforEA Старожил Пользователь

    Trophy Points:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    1. В этом случае можно сперва убрать уже существующие эффекты зелий, а потом уже ставить их заного.
    2. Можно или удалять предмет в руке игрока, или написать свой код удаления предмета из инвентаря, отнимающий не более N предметов.
     
  11. Автор темы
    KoreeeZ

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

    Trophy Points:
    66
    Имя в Minecraft:
    KoreeeZ
    1) А если на игроке несколько разных эффектов, то они же все сбросятся
     
  12. gamerforEA

    gamerforEA Старожил Пользователь

    Trophy Points:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Не обязательно сбрасывать все эффекты. Достаточно только те, которые накладывает зелье.
     
  13. Автор темы
    KoreeeZ

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

    Trophy Points:
    66
    Имя в Minecraft:
    KoreeeZ
    Не поможешь тогда? Как это реализовать?
     
  14. gamerforEA

    gamerforEA Старожил Пользователь

    Trophy Points:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    В цикле перед addPotionEffect нужно использовать removePotionEffect (как-то так называется).
     
  15. Автор темы
    KoreeeZ

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

    Trophy Points:
    66
    Имя в Minecraft:
    KoreeeZ
    Дело в том, что removePotionEffect принимает значения типа PotionEffectType, а переменная ef - является LivingEnity
     
  16. gamerforEA

    gamerforEA Старожил Пользователь

    Trophy Points:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    1. Переменная ef имеет тип PotionEffect (во всяком случае это справедливо для кода выше).
    2. У PotionEffect должен быть метод, возвращающий PotionEffectType.
     
  17. Автор темы
    KoreeeZ

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

    Trophy Points:
    66
    Имя в Minecraft:
    KoreeeZ
    Спасибо, первую проблему я решил, осталось лишь малость. Удалить бутылочку.
     
  18. HunterGaming

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

    Trophy Points:
    46
    Имя в Minecraft:
    HunterGaming13
    Player p = e.getPlayer ();
    p.getItemInHand ().setItem (new ItemStack (Material.AIR));
    Вроде должно работать
     
  19. Автор темы
    KoreeeZ

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

    Trophy Points:
    66
    Имя в Minecraft:
    KoreeeZ
    Дело в том, что ".setItem()" нельзя применять к ".getItemInHand"
    Ко ItemInHand я пробовал применить setItemType(Material.Air), но это не работает.
     
  20. HunterGaming

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

    Trophy Points:
    46
    Имя в Minecraft:
    HunterGaming13
    А нет стой, не правильно написал.
    p.getInventory ().setItemInHand (new ItemStack (Material.AIR));
     
  21. slavik123123123

    slavik123123123 Старожил Пользователь

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    e.getPlayer().getInventory().setItem(e.getPlayer().getInventory().getHeldItemSlot(), new ItemStack(Material.AIR));
     
Thread Status:
Not open for further replies.

Share This Page