Не получается сравнить два ItemStack'а

Версия Minecraft
1.12.2
Нужно сравнить предмет в OFFHAND с другим предметом, и если OFFHAND = предмет, то вернуть успешное выполнение.
Я попробовал много разных вариантов, но все же остановился на этом.
Проблема в том, что даже если предмет в левой руке не тот, или его вообще нет - выполнение все равно успешное.
Java:
public class BeefCan extends ItemFood implements IHasModel
{
    public BeefCan(String name, int amount, float saturation, boolean isWolfFood)
    {
        super(amount, saturation, isWolfFood);
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setCreativeTab(CreativeTabs.FOOD);
        ItemsRegister.ITEMS.add(this);
    }
//проверка
    public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn) {
        ItemStack offhand = playerIn.getHeldItemOffhand();
        ItemStack mainhand = playerIn.getHeldItemMainhand();
        if (offhand!=(new ItemStack(ItemsRegister.OPENER))) {
        return new ActionResult<ItemStack>(EnumActionResult.FAIL, mainhand);
        } else {
        return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, mainhand);
    } 
}
//-------
    @Override
    protected void onFoodEaten(ItemStack stack, World worldIn, EntityPlayer player)
    {  
        super.onFoodEaten(stack, worldIn, player);
        ItemStack emptycan = new ItemStack(ItemsRegister.EMPTY_CAN);
        player.addItemStackToInventory(emptycan);
    }
    @Override
    public void registerModels() {
        Main.proxy.registerItemRenderer(this, 0, "inventory");
    }
}
 
7,099
324
1,510
В джава объекты надо сравнивать при помощи equals, а не ==,!=.
А стаки надо сравнивать при помощи ItemStack.areItemStacksEqual
 
7,099
324
1,510
Я знаю, но это работало только если убрать SUCCESS-результат.
А ты попробуй выполнить new ItemStack(Items.APPLE) == new ItemStack(Items.APPLE) и посмотри чему равен результат.
ActionResult тут не при чем

@Eifel, ага, можно юзать, если не важны нбт и мета. Проверять на пустоту не обязательно
 
Я попробовал одну вещь.
Заккоментил все, кроме ItemStack mainhand и return new.... FAIL
Получилось вот так:
Java:
     public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn) {
        //ItemStack offhand = playerIn.getHeldItemOffhand();
        ItemStack mainhand = playerIn.getHeldItemMainhand();
        //if (ItemStack.areItemStacksEqual(offhand, new ItemStack(ItemsRegister.OPENER, 1))) {
        //return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, mainhand);
        //} else {
        return new ActionResult<ItemStack>(EnumActionResult.FAIL, mainhand);
        //}
Однако, еду все равно есть можно. Но я ведь по сути, запрещаю это делать, или нет?
 

Eifel

Модератор
1,624
79
609
Е-е-е, погоди, в методе #onItemRightClick другие параметры. Он у тебя просто не переопределен, поэтому ничего не имеет результата. Для справки:
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
 
7,099
324
1,510
Ох, точно! Чтобы так не ошибаться позволяй ide генерировать override-ы. Idea, например при написании названия метода в теле класса предлагает в автодополнении переопределения
 
Вот типа так как то:

Java:
        ItemStack stack = player.getHeldItemMainhand();
        ItemStack stack2 = player.getHeldItemOffhand();
         if(!(stack2.getItem() == ItemsRegister.NameYourClass)) {
             //действие когда предмет в offHand
         }
            if(!(stack.getItem() == ItemsRegister.NameYourClass)) {
            //действие когда предмет в mainHand
        }
.
Работает, сам пользуюсь
 
Сверху