Помогите Получение предмета в левой руке.

  • Автор темы Автор темы Kloper
  • Дата начала Дата начала

Kloper

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
f3azzy
У меня есть предмет, при держании которого накладываются положительные эффекты, но если взять другой предмет в руку, эффекты пропадают. Так вот, если положить предмет в левую руку, или выкинуть, то эффекты остаются, как можно это пофиксить?
код:
Код:
    @EventHandler
    public void onItemHeld(PlayerItemHeldEvent event)
    {
        Player player = event.getPlayer();
        int slotIndex = event.getNewSlot();
        ItemStack slotItem = player.getInventory().getItem(slotIndex);
        if(slotItem == null || slotItem.getType() != Material.RED_DYE) {
            player.removePotionEffect(PotionEffectType.REGENERATION);
            player.removePotionEffect(PotionEffectType.SPEED);
           
        } else {
            player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 9999, 0));
            player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 9999, 1));
        }
    }
 
Слушаешь нужные ивенты и снимаешь с игрока эффекты
PlayerSwapHandItemsEvent
PlayerDropItemEvent
 
Слушаешь нужные ивенты и снимаешь с игрока эффекты
PlayerSwapHandItemsEvent
PlayerDropItemEvent
PlayerSwapHandItemsEvent, работает только когда предмет положен в левую руку клавишей F, разве нет?
 
PlayerSwapHandItemsEvent, работает только когда предмет положен в левую руку клавишей F, разве нет?
На другую руку PlayerItemHeldEvent, когда слот переклоючается. Но есть еще 2 ивента на клик. Лучше не заморачивайся и каждый тик проверяй нужные слоты и все.
 
Последнее редактирование:
На другую руку PlayerItemHeldEvent, когда слот переклоючается. Но есть еще 2 ивента на клик. Лучше не заморачивайся и каждый тик проверяй нужные слоты и все.
понял, спасибо за ответ
 
понял, спасибо за ответ
сделал вот так:
Код:
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable(){

                public void run() {
                    if(slotItem == null || slotItem.getType() != Material.RED_DYE) {
                        player.removePotionEffect(PotionEffectType.REGENERATION);
                        player.removePotionEffect(PotionEffectType.SPEED);           
                    }
                }
            }, 0L, 1L);
но теперь код постоянно повторяется
 
Всм "повторяется"? Это ж таймер, который работает по кругу. Так и должно быть...
теперь у меня даже если предмет в руке, эффекты отнимаются
полный код:
Код:
@EventHandler
    public void onItemHeld(PlayerItemHeldEvent event)
    {
        Player player = event.getPlayer();
        int slotIndex = event.getNewSlot();
        ItemStack slotItem = player.getInventory().getItem(slotIndex);
        if(slotItem == null || slotItem.getType() != Material.RED_DYE) {
            player.removePotionEffect(PotionEffectType.REGENERATION);
            player.removePotionEffect(PotionEffectType.SPEED);           
        } else {           
            player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 9999, 0));
            player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 9999, 1));
            Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable(){
                public void run() {
                    if(slotItem == null || slotItem.getType() != Material.RED_DYE) {
                        player.removePotionEffect(PotionEffectType.REGENERATION);
                        player.removePotionEffect(PotionEffectType.SPEED);           
                    }
                }
            }, 0L, 1L);
        }
    }
 
теперь у меня даже если предмет в руке, эффекты отнимаются
полный код:
Код:
@EventHandler
    public void onItemHeld(PlayerItemHeldEvent event)
    {
        Player player = event.getPlayer();
        int slotIndex = event.getNewSlot();
        ItemStack slotItem = player.getInventory().getItem(slotIndex);
        if(slotItem == null || slotItem.getType() != Material.RED_DYE) {
            player.removePotionEffect(PotionEffectType.REGENERATION);
            player.removePotionEffect(PotionEffectType.SPEED);       
        } else {       
            player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 9999, 0));
            player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 9999, 1));
            Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable(){
                public void run() {
                    if(slotItem == null || slotItem.getType() != Material.RED_DYE) {
                        player.removePotionEffect(PotionEffectType.REGENERATION);
                        player.removePotionEffect(PotionEffectType.SPEED);       
                    }
                }
            }, 0L, 1L);
        }
    }
Зачем ты запускаешь новый таймер каждый раз при вызове события PlayerItemHeldEvent? Тебе будет достаточно одного таймера, чтобы выполнять действия, предложенные alexandrage. Таймер можно запускать при включении сервера
 
теперь у меня даже если предмет в руке, эффекты отнимаются
полный код:
Код:
@EventHandler
    public void onItemHeld(PlayerItemHeldEvent event)
    {
        Player player = event.getPlayer();
        int slotIndex = event.getNewSlot();
        ItemStack slotItem = player.getInventory().getItem(slotIndex);
        if(slotItem == null || slotItem.getType() != Material.RED_DYE) {
            player.removePotionEffect(PotionEffectType.REGENERATION);
            player.removePotionEffect(PotionEffectType.SPEED);         
        } else {         
            player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 9999, 0));
            player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 9999, 1));
            Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable(){
                public void run() {
                    if(slotItem == null || slotItem.getType() != Material.RED_DYE) {
                        player.removePotionEffect(PotionEffectType.REGENERATION);
                        player.removePotionEffect(PotionEffectType.SPEED);         
                    }
                }
            }, 0L, 1L);
        }
    }
Ой... таймер вставлять в ивент не очень хорошая идея. Как минимум потом будет дикая нагрузка на сервер.

Могу посоветовать сделать так:
1. Сделать один единый таймер (каждый тик)
2. Внутри таймера будет получения списка всех игроков сервера
3. Проходишься по каждому игроку, проверяешь его руку и уже делаешь нужный код в зависимости что у него в руке
 
Назад
Верх