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

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

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

Статус темы:
Закрыта.
  1. Автор темы
    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("Удалена бутылочка!");
        }
    
     
  2. Хостинг MineCraft
    <
  3. Dereku

    Dereku Старожил

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

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

    Баллы:
    66
    Имя в Minecraft:
    KoreeeZ
    Не работает
    Код:
        @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 Активный участник Пользователь

    Баллы:
    46
    Имя в Minecraft:
    HunterGaming13
    if (e.getItem().getType() == potion) e.setItem (null);
     
  6. slavik123123123

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

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

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

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

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

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

    Код:
        @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 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    KoreeeZ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    e.getPlayer().getInventory().setItem(e.getPlayer().getInventory().getHeldItemSlot(), new ItemStack(Material.AIR));
     
Статус темы:
Закрыта.

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