Новый предмет - новое свойство

Версия Minecraft
1.19.2
API
Forge
10
1
0
Крч, так получилось, что мне нужно чтобы предмет одного и того же типа, имел разные свойства (теги в nbt).
Если подробнее, то у меня есть переменная effect, как задать ей, так скажем, рандомное значение я уже понял. Но вот как сделать так, чтобы каждый предмет имел своё значение, и они не были связаны друг с другом. А то я тут экспериментировал и они у меня получились связанными. Дайте пожалуйста намёк или откуда подсмотреть, буду искренне благодарен

Поскольку время близится к ночи, я могу ответить не скоро/перестать выходить на связь, прошу прощения. И заранее спасибо за ответы.
 
Решение
Кстати, этот способ получения случайного значение не самый лучший верно? Или пойдёт?
Плохой. Как я уже говорил выше, твой зарегистрированный Item - один на всю игру, это шаблон. Вычисления в нем не должно быть (если в каком-то методе не передается конкретный ItemStack.

Модель простая:
один Item -> Множество ItemStack

Опять же, для таких целей используй CompoundTag. Т.е. ты где-то создаешь новый экземпляр ItemStack() (тут смотря как ты будешь получать сам предмет). Обобщенно это так:
example:
private ItemStack getDrinkItem() {
    ItemStack stack = new ItemStack(Items.POTION);  // Вставляешь любой свой Item
    CompoundTag nbt = new CompoundTag();
    nbt.putString("effect", "your_value"); //...
116
13
13
А то я тут экспериментировал и они у меня получились связанными.
Это происходит, если все атрибуты вставляются в сам класс предмета. А как уже было сказано неоднократное кол-во раз - класс предмета является единичным экземпляром. Так что при получении разных ItemStack от этого Item, то они естественно будут с одинаковыми значениями. Другими словами, класс Item - просто шаблон. Тебе необходимо создать новый ItemStack и ему перезаписывать nbt-тег.

Трудно пока говорить что-то подробнее, так как не описана конкретная цель. Если не так понял, то опиши более подробно с прикреплением проблемного места в коде
 
10
1
0
Всё правильно понял. Да и я тебя тоже вполне понял. Мне нужно понять как-раз как
создать новый ItemStack и ему перезаписывать nbt-тег.
А то я не знаю и не понимаю как это можно сделать.

Если говорить про подробности того что я хочу сделать. То я хочу сделать предмет-напиток, который будет выдавать рандомный эффект из заданного списка. Возможно костылём, но я придумал и начал реализовывать свою идею, но вот проблема в том, что все предметы имеют одно и тоже значение эффекта, и это самое значение мне нужно записать в переменную, которая у каждого предмета должна быть своя.
Вообще да, я мог просто в finishUsingItem сделать рандомизацию, но мне нужно выводить то, что выдаёт напиток после выпивания, чтобы это можно было "складировать" как зелья. Я опустил пару моментов, но то смысла не меняет.
 
10
1
0
Вот небольшая частичка кода кстати. Самое главное - не обращать внимания на то что у меня "рандомизация" в конструкторе, это мне её просто сохранить где-то надо, до момента пока я не найду решения.
Java:
public class Fruit_beer extends Item {
    private boolean isNotToxic = false;
    private String effect;

    public Fruit_beer() {
        super((new Properties().tab(BrewingTab.BREWING_TAB).stacksTo(2)
                .food(new FoodProperties.Builder().alwaysEat().nutrition(2).saturationMod(0.8f).build())));
//        Random rand = new Random();
//        List<String> ableEffects = new ArrayList<>();
//        ableEffects.add("JUMP");
//        ableEffects.add("MOVEMENT_SPEED");
//        ableEffects.add("NIGHT_VISION");
//        ableEffects.add("HEAL");
//        effect = ableEffects.get(rand.nextInt(ableEffects.size()));
    }

    @Override
    public void appendHoverText(ItemStack itemStack, @Nullable Level level, List<Component> components, TooltipFlag tooltipFlag) {
        // Код отображения toolTip'а

        CompoundTag nbt = itemStack.getOrCreateTag();
        nbt.putBoolean("notToxic", isNotToxic);
        nbt.putString("effect", effect);
    }

    @Override
    public ItemStack finishUsingItem(ItemStack itemStack, Level level, LivingEntity entity) {
        // Код использования предмета
    }
Кстати, этот способ получения случайного значение не самый лучший верно? Или пойдёт?

На счёт isNotToxic, это переменная нужна чисто для кода взаимодействия, чтобы переключаться между двумя видами взаимодействия с напитком
 
116
13
13
Кстати, этот способ получения случайного значение не самый лучший верно? Или пойдёт?
Плохой. Как я уже говорил выше, твой зарегистрированный Item - один на всю игру, это шаблон. Вычисления в нем не должно быть (если в каком-то методе не передается конкретный ItemStack.

Модель простая:
один Item -> Множество ItemStack

Опять же, для таких целей используй CompoundTag. Т.е. ты где-то создаешь новый экземпляр ItemStack() (тут смотря как ты будешь получать сам предмет). Обобщенно это так:
example:
private ItemStack getDrinkItem() {
    ItemStack stack = new ItemStack(Items.POTION);  // Вставляешь любой свой Item
    CompoundTag nbt = new CompoundTag();
    nbt.putString("effect", "your_value"); // Получаешь из списка рандомный эффект и записываешь в nbt
    stack.setTag(nbt);
    return stack;
}

А уже в классе Item в методе finishUsingItem достаешь из ItemStack'a nbt через getTag() и там обрабатываешь как надо
 
Сверху