Как узнать что за предмет находится в слоте?

Версия Minecraft
1.12.2
103
2
2
Хочу для печи сделать улучшения, добавил свой слот, сделал проверку на то есть ли вообще предмет в слоте и от этого будет зависеть работает улучшение или нет.
Но, я хочу чтобы можно было пихать разные улучшения.
Сейчас код такой:
Код:
ItemStack itemstack = this.furnaceItemStacks.get(1);
            Item itemstack2 = this.furnaceItemStacks.get(3).getItem();
            int furnaceupgrade = Item.getIdFromItem(ItemsRegister.UPGRADEFURNACEFUEL);
            //Upgrade Check
            if (!(((ItemStack)this.furnaceItemStacks.get(3)).isEmpty())){
                fuelcostmultiplier=1f;
            }else{fuelcostmultiplier=0.5f;}

            System.out.print("ItemsStack2"+itemstack2+"furnaceupgrade"+furnaceupgrade);

Какой код использовать чтобы itemstack2 и furnaceupgrade были равны? itemstack2 сейчас выдаёт ItemFurnaceFuelUpgrade@8455, а furnaceupgrade выдаёт 4126.
 
Решение
А как мне узнавать какие апгрейды в тайле?
Это не потребуется. Тайл просто воспринимает все апгрейды как IUpgrade и не парится о том, что они делают. Влияние, которое оказывают агрейды находится в самих апгрейдах, которые реализовывают интерфейс

Стаки нужно сравнивать при помощи equals

апгрейды должны узнать в каком они тайле
Апгрейды просто влияют на какие-то конкретные параметры, которые принимают через аргументы методы апгрейда, как-то их преобразовывают в своответствии со своей функцией и возвращают.
Таким образом ни тайлы ничего конкретного не знает о апгрейдах, ни апгрейды о тайлах.
Все супер-абстрактно и легко расширяемо.

Ну на крайняк можно при помощи isinstanceof в апгрейде проверять че это за тайл и давать...
7,099
324
1,509
Сделай интерфейс IUpgrade, реализовывай его в своих предметах-апгрейдах.
В тайле механизма ItemStack#getItem будет являться IUpgrade, и как-то его юзай, вызывай какие-то его методы, че-то принимай взамен...
Например, у тайла есть параметр эффективности. Тогда он берет все апгрейды из слотов и у всех последовательно вызываем метод transformEfficiency, который принимает текущую эффективность и возвращает измененную собой.
Код довольно красивый:
slots.stream().map(i->(IUpgrade)i.getItem()).reduce(efficiency,IUpgrade::transformEfficiency)
 
7,099
324
1,509
Для своих предметов, которые будут апгрейдами сделай интерфейс IUpgrade. В этом интерфейсе будут какие-то методы, через которые апгрейд будет влиять на работу механизма. Когда механизм работает(или даже простаивает, если нужно),то он вызывает эти методы апгрейдов.
 
103
2
2
Для своих предметов, которые будут апгрейдами сделай интерфейс IUpgrade. В этом интерфейсе будут какие-то методы, через которые апгрейд будет влиять на работу механизма. Когда механизм работает(или даже простаивает, если нужно),то он вызывает эти методы апгрейдов.
А как мне узнавать какие апгрейды в тайле? Или сами предметы апгрейды должны узнать в каком они тайле и потом они как-то должны на него влиять?
Я ещё попытался написать ItemStack furnaceupgrade = new ItemStack(ItemsRegister.UPGRADEFURNACEFUEL); и выдаёт вроде одинаковые значение если смотреть в дебаггер, 1xitem.furnacefuelupgrade@0 , но всё равно itemstack2==furnaceupgrade не равны.
 
7,099
324
1,509
А как мне узнавать какие апгрейды в тайле?
Это не потребуется. Тайл просто воспринимает все апгрейды как IUpgrade и не парится о том, что они делают. Влияние, которое оказывают агрейды находится в самих апгрейдах, которые реализовывают интерфейс

Стаки нужно сравнивать при помощи equals

апгрейды должны узнать в каком они тайле
Апгрейды просто влияют на какие-то конкретные параметры, которые принимают через аргументы методы апгрейда, как-то их преобразовывают в своответствии со своей функцией и возвращают.
Таким образом ни тайлы ничего конкретного не знает о апгрейдах, ни апгрейды о тайлах.
Все супер-абстрактно и легко расширяемо.

Ну на крайняк можно при помощи isinstanceof в апгрейде проверять че это за тайл и давать различные эффекты
 
103
2
2
Как мне сделать так чтобы значения не дёргались?

ItemStack itemstack2 = this.furnaceItemStacks.get(slot);
//Upgrade Check
if (ItemStack.areItemStacksEqual(itemstack2,new ItemStack(ItemsRegister.UPGRADEFURNACEFUEL))) {
fuelcostmultiplier=1f;
}else{fuelcostmultiplier=0.75f;
}

if (ItemStack.areItemStacksEqual(itemstack2,new ItemStack(ItemsRegister.UPGRADEFURNACECOOKTIME))){
cookTimeMultiplier=120;
}else{cookTimeMultiplier=150;
}

slot++;

Я перебираю 3 слота на наличие улучшений и значения перестают дёргаться только если я заполню все 3 слота улучшениями.
 
3,005
192
592
Не делай каждый раз новый итем.
Проверить можно так:
Код:
stack.getItem() == ItemsRegister.NAME

Что бы не дергалось - скорее всего тебе нужно запоминать старое и новое значение.
Если они не совпадают, то старое делать каждый раз ближе к новому.
 
Сверху