Тест предмета из мода из руки игрока

Версия Minecraft
1.12.2
У меня есть класс "EventListeners", который, как можно понять из названия, работает с событиями. Моей целью было создать предмет, которым можно один раз кликнуть ПКМ, и, например, выдавался алмаз.

onInteract:
@SubscribeEvent
public void onInteract(PlayerInteractEvent e) {
    EntityPlayer p = e.getEntityPlayer();
    if(new ItemStack(?????) == p.getActiveItemStack()) {
        p.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, new ItemStack(Items.AIR));
        p.addItemStackToInventory(new ItemStack(Items.DIAMOND));
    }
    
}

Что мне нужно написать вместо "new ItemStack(?????)", чтобы всё работало? А также, если Вы найдёте ошибку в коде, буду рад прочитать об этом.
 
Ты точно все правильно делаешь? Обычно это такие вещи делаются в классе предмета.
Я не уверен, если честно. Просто не смог найти понятные для меня документации/гайды (только то, как зарегистрировать класс через BUS_EVENT), поэтому по аналогии с моим опытом разработки плагинов под Spigot, сделал отдельный класс.
 
А почему не использовать метод onItemRightClick в классе предмета? В нём получаешь инвентарь и приплюсовываешь свой итем.
Т.е. зарегистрировать BUS_EVENT в классе предмета, потом прописать всё то, что я прописал выше, а затем "if(p.onItemRigthClick......"?
 
161
12
90
*Спросил про то, как сделать "детектор клика" определённым предметом
*Иди джаву учи
Вот это я понимаю, помощь!
P.s. Вопрос был задан не про джаву, а про стороннее API и работу с ним 🤡
 
586
32
136
Java:
@SubscribeEvent
public void onInteract(PlayerInteractEvent e) {
    EntityPlayer p = e.getEntityPlayer();
    if(?????(твой айтем) == p.getActiveItemStack().getItem()) {
        p.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, new ItemStack(Items.AIR));
        p.addItemStackToInventory(new ItemStack(Items.DIAMOND));
    }
}
 
Последнее редактирование:
1,038
57
229
Моей целью было создать предмет, которым можно один раз кликнуть ПКМ, и, например, выдавался алмаз.
Создаешь предмет, внутри предмета переписываешь метод onItemRightClick, там же получаешь игрока (и мир), выдаешь ему чо надо и уменьшаешь количество твоего предмета на 1. А так как он только 1 может быть в стаке, он сам себя удаляет.
События при этом тебе совершенно не нужны.
Если же тебе не нужен такой предмет, но ты хочешь отловить нажатие клавиши или мыши, то это уже событие + опрос Inputs...
 

GoogleTan

Картошка :3
1,354
43
310
Java:
public class ItemGiverDiamonds extends Item
{
    public ItemGiverDiamonds(String name)
    {
    this.setRegistryName(name);
    }
    @Override
    public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
    {
        //меняешь стак на алмаз
        return super.onItemRightClick(worldIn, playerIn, handIn);
    }
}
 
Java:
public class ItemGiverDiamonds extends Item
{
    public ItemGiverDiamonds(String name)
    {
    this.setRegistryName(name);
    }
    @Override
    public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
    {
        //меняешь стак на алмаз
        return super.onItemRightClick(worldIn, playerIn, handIn);
    }
}
Это работает, но только проблема в том, что мне нужно узнать, в какой руке есть этот предмет. И с помощью этой штуки было бы просто это проверить: if(playerIn.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND) == new ItemStack(Items.APPLE));, но проблема в том, что я не могу понять, как сравнить предмет из руки с предметом из мода? (Я имею ввиду то, что я могу сравнить предмет из руки с яблоком, но не с предметом из мода). Что мне нужно использовать?
 
1,038
57
229
Java:
ItemStack in_hand = playerIn.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
if(in_hand != null && in_hand.getItem() == Items.DIAMOND)
 
Сверху