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

Помогите Как можно проверять какое зелье пьет игрок?

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

  1. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    Мне нужно что бы если игрок пил именно зелье исцеления выполнялся код, как это можно сделать?
     
  2. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    На PlayerItemConsumeEvent проверяй предмет PotionMeta#getBasePotionData().getType() == INSTANT_HEAL.
     
  3. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    а можно пример если есть?
     
  4. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Ну, я вроде уже описал, что нужно. На java 17 можно в одну строку написать так
    PHP:
    @EventHandler
    public void onConsume(PlayerItemConsumeEvent event) {
        if (
    event.getItem().getItemMeta() instanceof PotionMeta potionMeta && potionMeta.getBasePotionData().getType() == PotionType.INSTANT_HEAL) {
            
    // TODO
        
    }
    }
     
  5. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    говорит
    шаблоны в instanceof не поддерживаются на уровне языка 8
    что делать?
     
  6. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Как уже сказал, это фича Java 17.
    PHP:
    if (meta instanceof PotionMeta potionMeta) {
        
    // TODO
    }
    тоже самое, что
    PHP:
    if (meta instanceof PotionMeta) {
        
    PotionMeta potionMeta = (PotionMetameta;
    }
     
  7. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    спасибо
     
  8. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    не я все равно тупой не пойму как сделать, типа оно теперь работает но работает оно со всеми зельями
     
  9. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Ты вторую половину проверки из моего первого сообщения то посмотри.
     
  10. 0xLairon1

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

    Баллы:
    76
    Имя в Minecraft:
    0xLairon1
    дак ты проверку допиши на тип зелья potionMeta.getBasePotionData().getType()
     
  11. 0xLairon1

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

    Баллы:
    76
    Имя в Minecraft:
    0xLairon1
    Советую изначально выучить яп java а потом уже кодить плагины, не повторяй моих ошибок)
     
  12. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    я так и пытался

    if (meta instanceof PotionMeta && potionMeta.getBasePotionData().getType() == PotionType.INSTANT_HEAL){
    potionMeta = (PotionMeta) meta;
    }
     
  13. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    я его уже почти дописал так что поздно ты сказал)
     
  14. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Ну дак potionMeta у тебя недоступен во время проверки. Тебе нужно написать эту проверку отдельно уже после получения меты.
     
  15. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    if (meta instanceof PotionMeta){
    potionMeta = (PotionMeta) meta;
    potionMeta.getBasePotionData().getType() == PotionType.INSTANT_HEAL;
    }
    так?)
     
  16. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    if (...) {} забыл.
     
  17. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    может я тут где то накосячил?

    Код:
    public void onPotionDrink(PlayerItemConsumeEvent event) {
                Player player = (Player) event.getPlayer();
    
                Object meta = null;
                PotionMeta potionMeta;
                if (meta instanceof PotionMeta){
                    potionMeta = (PotionMeta) meta;
                    if (potionMeta.getBasePotionData().getType() == PotionType.SPEED){
                        player.sendMessage(ChatColor.GOLD + "Текст ");
                    }
                }
            }
    
     
  18. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Да. meta должна быть взята с употребляемого предмета.
     
  19. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    можешь исправить и скинуть код если не сложно пожалуйста?
     
  20. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    PHP:
    public void onPotionDrink(PlayerItemConsumeEvent event) {
        
    Player player event.getPlayer();
        
    ItemMeta meta event.getItem().getItemMeta();
        if (
    meta instanceof PotionMeta) {
            
    PotionMeta potionMeta = (PotionMetameta;
            if (
    potionMeta.getBasePotionData().getType() == PotionType.SPEED){
                
    player.sendMessage(ChatColor.GOLD "Текст ");
            }
        }
    }
    Ну, и если будешь расширять плагин, настоятельно советую прислушаться к @0xLairon1 :D
     

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