Хранение данных/вещей в предмете

Версия Minecraft
1.20.1
95
4
6
Если в блоке можно хранить данные с помощью block entity, то как можно сделать это с предметом(хочу сделать предмет на подобие рюкзака)?
 
Решение
Все capability и так сохраняются у предмета при ItemStack#save, следовательно и в ContainerHelper.saveAllItems все сохраняется. Если нужно сохранить один предмет, то используй ItemStack#save. Весь инвентарь - ContainerHelper.saveAllItems
Просто хранят в NBT тегах предмета. Это имеет свои недостатки:
  • Обязательно нужно ставить запрет класть в рюкзак другие рюкзаки. Иначе игрока крашнет по лимиту древа NBT.
  • Невозможность синхронизации содержимого инвентаря в реальном времени, так как отсутствует block entity.
  • Из предыдущего пункта приходится использовать виртуальный инвентарь, создаваемый из NBT предмета. Тут есть много проблем с синхронизацией, из-за чего становится частой причиной дюпов.
 
Просто хранят в NBT тегах предмета. Это имеет свои недостатки:
  • Обязательно нужно ставить запрет класть в рюкзак другие рюкзаки. Иначе игрока крашнет по лимиту древа NBT.
  • Невозможность синхронизации содержимого инвентаря в реальном времени, так как отсутствует block entity.
  • Из предыдущего пункта приходится использовать виртуальный инвентарь, создаваемый из NBT предмета. Тут есть много проблем с синхронизацией, из-за чего становится частой причиной дюпов.
В NBT же нельзя хранить предметы, разве так получится сделать рюкзак?
Или идея в том, чтобы как-то ещё хранить инвентарь, а в самом предмете хранить, например, id, по которому этот инвентарь можно будет получить?
 
Можно, причём очень легко. На 1.16.5, например, в ItemStackHelper(или как-то так) есть метод для записывание всего инвесторы в nbt. Можешь посмотреть как это реализовано в том же сундуке
Upd. На 1.20.1 это ContainerHelper.saveAllItems
 
Я случайно наткнулся на инфу, вроде как предметы, а именно ItemStack имеет capability, так что можно можно вообще накинуть на предмет ItemStackHandler и при открытии/закрытии загружать/сохранять с помощью него, а сам NBT тег хранить в capabilities у ItemStack
 
Все capability и так сохраняются у предмета при ItemStack#save, следовательно и в ContainerHelper.saveAllItems все сохраняется. Если нужно сохранить один предмет, то используй ItemStack#save. Весь инвентарь - ContainerHelper.saveAllItems
 
Назад
Сверху