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

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

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

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

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

    Баллы:
    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 - как при этом изъять слизь?
    Я пробовал так:
    Код:
    e.getPlayer().getItemInHand().setAmount(e.getPlayer().getItemInHand().getAmount() - 1);
    но если слизь остаётся одна - то она не изымается.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Код:
    @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 Старожил Девелопер Пользователь

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

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

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

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

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

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

    Баллы:
    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 Старожил Пользователь

    Баллы:
    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);
                    }
                }     
            }
         
        }
     
    Сникерсни нравится это.
  17. DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Код:
    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 Старожил Пользователь

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

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

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

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

    Баллы:
    123
    Имя в Minecraft:
    enselerizer
    hand can not be resolved
     
    NoNaMeHaCkEr2002 нравится это.
  21. DPOH-VAR

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

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

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