Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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);
но если слизь остаётся одна - то она не изымается.

Надеюсь на вашу помощь ;)
 
Всем привет!
Продолжая разработку своего первого плагина, я опять столкнулся с проблемой:
У меня есть вот такой код, которой при ломании поршня слизью, заменяет поршень на липкий поршень:
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);
но если слизь остаётся одна - то она не изымается.

Надеюсь на вашу помощь ;)

e.getPlayer.setItemInHand(null);
Или вроде есть даже e.getPlayer.removeItemInHand
 
@enselerizer, так ты сделай блок if и если в инвентаре только 1 слизь то просто удали то что в руке :)
 
e.getPlayer.setItemInHand(null);
Или вроде есть даже e.getPlayer.removeItemInHand
Хм, интересная мысль. Попробую уже завтра, сейчас уже сижу с планшета.
Но я это дело делал по bukkit API, т.е. Мне все возможные варианты выдавало, и там нет команды setItemInHand, или чего-то подобного =(
 
Всем привет!
Продолжая разработку своего первого плагина, я опять столкнулся с проблемой:
У меня есть вот такой код, которой при ломании поршня слизью, заменяет поршень на липкий поршень:
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);
но если слизь остаётся одна - то она не изымается.

Надеюсь на вашу помощь ;)

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

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

Так же, лучше делай это все в PlayerInteractEvent, будет срабатывать при пкм нажатии по поршню.
 
@enselerizer, так ты сделай блок if и если в инвентаре только 1 слизь то просто удали то что в руке :)
Я пробовал делать и так, но я опять же делал по bukkit api - так и не понял как "очистить руку" :=(
 
Хм, интересная мысль. Попробую уже завтра, сейчас уже сижу с планшета.
Но я это дело делал по bukkit API, т.е. Мне все возможные варианты выдавало, и там нет команды setItemInHand, или чего-то подобного =(

Не, setItemInHand точно есть, знаешь как делай: если кодишь в эклипсе, то пиши e.getPlayer
потом пиши точку и тебе будет выдавать все возможные команды к e.getPlayer.*
 
P.S. - Ты не предусмотрел, что у игрока может быть больше 1 слизи в руке, тогда делай так

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

Так же, лучше делай это все в PlayerInteractEvent, будет срабатывать при пкм нажатии по поршню.
Наоборот я предусмотрел, что у игрока в руке больше одой штучки, ведь у меня от количества в руке отнимается единичка. А с player interact я обязательно сделаю, спасибо за совет, изначаль так и хотел, но потом уже было думал, что это нереально;-)
Не, setItemInHand точно есть, знаешь как делай: если кодишь в эклипсе, то пиши e.getPlayer
потом пиши точку и тебе будет выдавать все возможные команды к e.getPlayer.*
Я когда говорил, что делаю по буккит-апи, я именно это и имел ввиду - ставил точку и смотрел :-)
Ладно, попробую завтра, напишу.
 
Я когда говорил, что делаю по буккит-апи, я именно это и имел ввиду - ставил точку и смотрел :-)
Ладно, попробую завтра, напишу.
Не знаю как ты смотрел. setItemInHand() там есть
 
Может все-таки добавить в библиотеки нормальный буккит? Тогад все можно будет свести к паре строчек, а не ломать себе мозги:

Код:
@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);
 
Правильный вариант удаления предмета из инвентаря у @unlimited, с помощью removeItem.
Так для взаимодействия можно выбрать другой предмет (палку например) а тратить слизь.
 
Правильный вариант удаления предмета из инвентаря у @unlimited, с помощью removeItem.
Так для взаимодействия можно выбрать другой предмет (палку например) а тратить слизь.
Я пробовал через установку айтема на воздух, так же пробовал и removeItem.
Но в обоих случаях говорится что-то непонятное про ItemStack. Можете описать поподробнее?
 
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 отрицательный, то предмет не тратится ;)
 
: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);
                }
            }     
        }
     
    }
 
Код:
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);
}
 
Код:
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);
}

Эклипс ругается на hand :(
 

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

Назад
Верх