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

Помогите Как изъять предмет из руки

Discussion in 'Разработка плагинов для новичков' started by enselerizer, Aug 12, 2013.

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

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

    Trophy Points:
    123
    Имя в Minecraft:
    enselerizer
    Всем привет!
    Продолжая разработку своего первого плагина, я опять столкнулся с проблемой:
    У меня есть вот такой код, которой при ломании поршня слизью, заменяет поршень на липкий поршень:
    PHP:
    public void onRClickOnPiston(BlockBreakEvent e)
        {
            if(
    e.getBlock().getTypeId() == 33)//Если сломанный блок - поршень...
            
    {
                if(
    e.getPlayer().getItemInHand().getTypeId() == 341)//а в руке - слизь, то...
                
    {
                    
    e.setCancelled(true); //Отменяем действие...
                    
    e.getBlock().setTypeId(29); //...И заменяем поршень на липкий.
                
    }     
            }
         
        }
    Вопрос 1 - как при этом изъять слизь?
    Я пробовал так:
    Code:
    e.getPlayer().getItemInHand().setAmount(e.getPlayer().getItemInHand().getAmount() - 1);
    но если слизь остаётся одна - то она не изымается.

    Надеюсь на вашу помощь ;)
     
  2. Хостинг MineCraft
    <
  3. unlimited

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

    Trophy Points:
    123
    Имя в Minecraft:
    infinity
    e.getPlayer.setItemInHand(null);
    Или вроде есть даже e.getPlayer.removeItemInHand
     
  4. robertono

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

    Trophy Points:
    103
    @enselerizer, так ты сделай блок if и если в инвентаре только 1 слизь то просто удали то что в руке :)
     
  5. Автор темы
    enselerizer

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

    Trophy Points:
    123
    Имя в Minecraft:
    enselerizer
    Хм, интересная мысль. Попробую уже завтра, сейчас уже сижу с планшета.
    Но я это дело делал по bukkit API, т.е. Мне все возможные варианты выдавало, и там нет команды setItemInHand, или чего-то подобного =(
     
  6. unlimited

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

    Trophy Points:
    123
    Имя в Minecraft:
    infinity
    P.S. - Ты не предусмотрел, что у игрока может быть больше 1 слизи в руке, тогда делай так

    ItemStack sliz = new ItemStack(Material.*хзкактутслизьбудет*,1);
    e.getPlayer.getInventory.removeItem(sliz);
    //Может не removeItem, а что-то похожее, ну вообщем суть думаю понял

    Так же, лучше делай это все в PlayerInteractEvent, будет срабатывать при пкм нажатии по поршню.
     
  7. Автор темы
    enselerizer

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

    Trophy Points:
    123
    Имя в Minecraft:
    enselerizer
    Я пробовал делать и так, но я опять же делал по bukkit api - так и не понял как "очистить руку" :=(
     
    Сникерсни likes this.
  8. unlimited

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

    Trophy Points:
    123
    Имя в Minecraft:
    infinity
    Не, setItemInHand точно есть, знаешь как делай: если кодишь в эклипсе, то пиши e.getPlayer
    потом пиши точку и тебе будет выдавать все возможные команды к e.getPlayer.*
     
    Stalkerdeni971 likes this.
  9. Автор темы
    enselerizer

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

    Trophy Points:
    123
    Имя в Minecraft:
    enselerizer
    Наоборот я предусмотрел, что у игрока в руке больше одой штучки, ведь у меня от количества в руке отнимается единичка. А с player interact я обязательно сделаю, спасибо за совет, изначаль так и хотел, но потом уже было думал, что это нереально;-)[DOUBLEPOST=1376334594,1376334451][/DOUBLEPOST]
    Я когда говорил, что делаю по буккит-апи, я именно это и имел ввиду - ставил точку и смотрел :)
    Ладно, попробую завтра, напишу.
     
  10. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Не знаю как ты смотрел. setItemInHand() там есть
     
    enselerizer likes this.
  11. Ukedrethose

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

    Trophy Points:
    78
    Skype:
    rines_skype
    Имя в Minecraft:
    RinesThaix
    Может все-таки добавить в библиотеки нормальный буккит? Тогад все можно будет свести к паре строчек, а не ломать себе мозги:

    Code:
    @EventHandler
    public void onBlockBreak(BlockBreakEvent e) {
        if(e.getBlock().getTypeId() == 33 && e.getPlayer().getItemInHand().getTypeId() == 343) {
            e.setCancelled(true);
            int amount = e.getPlayer().getItemInHand().getAmount() -1;
            if(amount != 0) e.getPlayer().getItemInHand().setAmount(amount);
            else e.getPlayer().setItemInHand(null);
            e.getBlock().setTypeId(34); //Вроде 34 - ид липкого поршня
        }
    }
    В крайнем случае попробовать что-то вроде e.getPlayer().getItemInHand().setAmount(0);
     
  12. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Trophy Points:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Да вы что? Это работать не будет. Нужно так
    Code:
    ItemStack is = p.getItemInHand();
    is.setAmount(is.getAmount() - 1);
    p.setItemInHand(is);
     
    slavik123123123 likes this.
  13. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Trophy Points:
    153
    Skype:
    dpohvar
    Правильный вариант удаления предмета из инвентаря у @unlimited, с помощью removeItem.
    Так для взаимодействия можно выбрать другой предмет (палку например) а тратить слизь.
     
  14. Автор темы
    enselerizer

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

    Trophy Points:
    123
    Имя в Minecraft:
    enselerizer
    Я пробовал через установку айтема на воздух, так же пробовал и removeItem.
    Но в обоих случаях говорится что-то непонятное про ItemStack. Можете описать поподробнее?
     
  15. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Trophy Points:
    153
    Skype:
    dpohvar
    Inventory.removeItem(ItemStack item) - удаляет из инвентаря точно такие же предметы в том количестве, в котором указан amount у item.
    Точно такие же - означает, что должны совпадать id,data,meta (всё, кроме amount)
    т.е. делаем сначала шаблон (псевдокод):
    private final ItemStack tool = new ItemStack(наш материал);
    а потом внутри Listener:
    if(предмет в руках нам не подходит) return;
    if(player не имеет предмет tool) return;
    player.getInventory.removeItem(tool); // вычитаем один предмет tool
    // делаем пистон липким или еще что нужно
    Так все будет работать верно... за исключением того, что будет вычитаться первый попавшийся предмет, а не тот, который в руке.

    Можно сделать так, чтобы убавлялся именно тот предмет, который в руке.
    ItemStack hand = player.getItemInHand();
    int amt = hand.getAmount();
    if(amt > 1) {
    hand.setAmount(amt-1);
    } else if (amt >= 0) {
    player.setItemInHand(null);
    }
    // если amt отрицательный, то предмет не тратится ;)
     
  16. Автор темы
    enselerizer

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

    Trophy Points:
    123
    Имя в Minecraft:
    enselerizer
    :confused: Мало что понял...
    Вот существующий код. Как конкретно мне туда вставить ваш код?
    (Я в джаве такой же нуб, как Notch - в русской политике...)

    PHP:
        @EventHandler
        
    public void onBreakPiston(BlockBreakEvent e)
        {
            if(
    e.getBlock().getTypeId() == 33)
            {
                if(
    e.getPlayer().getItemInHand().getTypeId() == 341)
                {
                    
    e.setCancelled(true);
                    
    e.getBlock().setTypeId(29);
                    if(
    e.getPlayer().getItemInHand().getAmount() == 1)
                    {
                        
    e.getPlayer().getItemInHand().removeItem();
                    }
                    else
                    {
                        
    e.getPlayer().getItemInHand().setAmount(e.getPlayer().getItemInHand().getAmount() - 1);
                    }
                }     
            }
         
        }
     
    Сникерсни likes this.
  17. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Trophy Points:
    153
    Skype:
    dpohvar
    Code:
    public @EventHandler void onBreakPiston(BlockBreakEvent e){
        if(e.getBlock().getTypeId() != 33) return;
        ItemStack hand = e.getPlayer().getItemInHand();
        if(hand.getTypeId() != 341) return;
        e.setCancelled(true);
        e.getBlock().setTypeId(29);
        int amt = hand.getAmount();
        if(amt > 1) hand.setAmount(amt-1);
        else if (amt >= 0) e.getPlayer().setItemInHand(null);
    }
     
  18. Автор темы
    enselerizer

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

    Trophy Points:
    123
    Имя в Minecraft:
    enselerizer
    Эклипс ругается на hand :(
     
  19. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Trophy Points:
    153
    Skype:
    dpohvar
    Intellij IDEA не ругается.
    Версия Bukkit у меня последняя.
    Напиши свою версию и текст/скриншот ошибки.
     
  20. Автор темы
    enselerizer

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

    Trophy Points:
    123
    Имя в Minecraft:
    enselerizer
    hand can not be resolved
     
    NoNaMeHaCkEr2002 likes this.
  21. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Trophy Points:
    153
    Skype:
    dpohvar
    Версию Bukkit пожалуйста, и код класса (целиком) на pastebin
     

Share This Page