我的世界版本 1.17.1
我正在尝试创建一个类似于基座的块。它由一个具有 1 个插槽库存的块实体组成,它将在块顶部呈现其库存中的任何内容。我已经测试了 1 个插槽库存并确保它有效,但我似乎无法让 blockentityrenderer 获取其库存内容:(
@Override
public void render(SwapperBlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
matrices.push();
ItemStack stack = entity.getStack(0); //literally doesn't work like what???
// Calculate the current offset in the y value
double offset = Math.sin((entity.getWorld().getTime() + tickDelta) / 8.0) / 4.0;
// Move the item
matrices.translate(0.5, 0.8 + offset, 0.5);
// Rotate the item
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion((entity.getWorld().getTime() + tickDelta) * 4));
MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Mode.GROUND, light, overlay, matrices, vertexConsumers, 1);
// Mandatory call after GL calls
matrices.pop();
}
上面是每帧调用的渲染函数。我试图通过使用ItemStack stack = entity.getStack(0);
它来获取插槽索引 0 中的 ItemStack,但什么结果都没有。我确信渲染代码的工作原理是用ItemStack stack = new ItemStack(Items.JUKEBOX, 1);
确实有效的替换上面的代码。
唯一的问题是它entity.getStack(0);
会返回一个空堆栈,即使它里面还有其他东西。没有错误。
public class SwapperBlockEntity extends ModBlockEntity implements ImplementedInventory {
private final DefaultedList<ItemStack> items = DefaultedList.ofSize(1, ItemStack.EMPTY);
public SwapperBlockEntity(BlockPos pos, BlockState state) {
super(ModBlockEntities.SWAPPER_BLOCK_ENTITY, pos, state);
}
@Override
public void readNbt(NbtCompound nbt){
super.readNbt(nbt);
Inventories.readNbt(nbt, items);
}
@Override
public NbtCompound writeNbt(NbtCompound nbt){
Inventories.writeNbt(nbt, items);
return super.writeNbt(nbt);
}
@Override
public DefaultedList<ItemStack> getItems() {
return items;
}
}
注意:我使用的是 fabric wiki 提供的默认“ImplementedInventory.java”
任何帮助,将不胜感激!谢谢。