Отрисовка предмета над блоком.

Версия Minecraft
1.20.1
API
Forge
25
1
Фактически я нашел реализацию этого механизма в другом моде. Повторил то же самое, однако изменение предмета в инвентаре Тайла отображается только при перезаходе в мир или перезагрузке чанка. Судя по всему нужно как-то отрисовывать каждый тик, однако на данный момент не понимаю как.

Код
HephaestusForgeEntity:
public class HephaestusForgeEntity extends BlockEntity implements TickableBlockEntity {

    private final ItemStackHandler inventory = new ItemStackHandler(1){
        @Override
        protected void onContentsChanged(int slot) {
            super.onContentsChanged(slot);
            HephaestusForgeEntity.this.setChanged();
        }
    };
    private final LazyOptional<ItemStackHandler> inventoryOptional = LazyOptional.of(() -> this.inventory);


    public HephaestusForgeEntity(BlockPos bPos, BlockState bState) {
        super(InitTileEntity.HEPHAESTUS_FORGE.get(), bPos, bState);
    }

    @Override
    public void tick() {
        // TODO
    }

    @Override
    protected void saveAdditional(@NotNull CompoundTag nbt) {
        super.saveAdditional(nbt);

        var hephaestusData = new CompoundTag();
        hephaestusData.put("Inventory", this.inventory.serializeNBT());
        nbt.put(Adventure.MODID, hephaestusData);
    }

    @Override
    public void load(@NotNull CompoundTag nbt) {
        super.load(nbt);

        CompoundTag hephaestusData = nbt.getCompound(Adventure.MODID);
        if(hephaestusData.isEmpty())
            return;

        if (hephaestusData.contains("Inventory", Tag.TAG_COMPOUND)) {
            this.inventory.deserializeNBT(hephaestusData.getCompound("Inventory"));
        }

    }

    @Override
    public @NotNull CompoundTag getUpdateTag() {
        CompoundTag nbt = super.getUpdateTag();
        saveAdditional(nbt);
        return nbt;
    }

    @Nullable
    @Override
    public Packet<ClientGamePacketListener> getUpdatePacket() {
        return ClientboundBlockEntityDataPacket.create(this);
    }

    @Override
    public @NotNull <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap) {
        if (cap == ForgeCapabilities.ITEM_HANDLER) {
            return this.inventoryOptional.cast();
        }
        return super.getCapability(cap);
    }

    @Override
    public void invalidateCaps() {
        super.invalidateCaps();
        this.inventoryOptional.invalidate();
    }

    public void makeProgress() {
        this.progress++;
    }

    public void setItem(ItemStack stack) {
        this.inventory.setStackInSlot(0, stack);
    }

    public ItemStack getItem() {
        ItemStack out = this.inventory.getStackInSlot(0);
        this.inventory.getStackInSlot(0);
        return out;
    }

    public ItemStackHandler getInventory() {
        return inventory;
    }

}

HephaestusForgeRenderer:
public class HephaestusForgeRenderer implements BlockEntityRenderer<HephaestusForgeEntity> {

    ItemRenderer itemRenderer;
    public HephaestusForgeRenderer(BlockEntityRendererProvider.Context context) {
        this.itemRenderer = context.getItemRenderer();
    }

    private static final Vec3 ITEM_POS = new Vec3(.5, 1.5, .5);

    @Override
    public void render(HephaestusForgeEntity entity, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) {

        var heldItem = entity.getInventory().getStackInSlot(0);

        if (!heldItem.isEmpty()) {
            Player player = Minecraft.getInstance().player;
            float bob = 0;//(float) (Math.sin((player.tickCount + partialTick) * .1f) * .0875f);
            float rotation = player.tickCount * 2 + partialTick;
            renderItem(heldItem, ITEM_POS.add(0, bob, 0), rotation, entity, partialTick, poseStack, bufferSource, packedLight, packedOverlay);
        }

    }

    private void renderItem(ItemStack itemStack, Vec3 offset, float yRot, HephaestusForgeEntity entity, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) {
        poseStack.pushPose();
        //renderId seems to be some kind of uuid/salt
        int renderId = (int) entity.getBlockPos().asLong();

        poseStack.translate(offset.x, offset.y, offset.z);
        poseStack.mulPose(Axis.YP.rotationDegrees(yRot));
        if (itemStack.getItem() instanceof SwordItem || itemStack.getItem() instanceof DiggerItem) {
            poseStack.mulPose(Axis.ZP.rotationDegrees(-45));
        }

        poseStack.scale(0.65f, 0.65f, 0.65f);

        itemRenderer.renderStatic(itemStack, ItemDisplayContext.FIXED, LevelRenderer.getLightColor(entity.getLevel(), entity.getBlockPos()), packedOverlay, poseStack, bufferSource, entity.getLevel(), renderId);
        poseStack.popPose();
    }
}

Рендер зарегистрировал в главном классе. Дополнительно буду благодарен если подскажите как отрендерить модель которая сделана на BB (Она установлена в ресурсах, и соответственно отображается на предмете, который наследует модель от блока, но сам блок не рендерит модель, из-за переопределения вышепоказанного рендера)
 
Решение
Дай клиенту знать, что инфо о предмете изменилась.
Дополнительно буду благодарен если подскажите как отрендерить модель которая сделана на BB (Она установлена в ресурсах, и соответственно отображается на предмете, который наследует модель от блока, но сам блок не рендерит модель, из-за переопределения вышепоказанного рендера)
Не совсем понятно, что ты имеешь ввиду. Опиши подробнее или приложи код.
1,383
115
244
Дай клиенту знать, что инфо о предмете изменилась.
Дополнительно буду благодарен если подскажите как отрендерить модель которая сделана на BB (Она установлена в ресурсах, и соответственно отображается на предмете, который наследует модель от блока, но сам блок не рендерит модель, из-за переопределения вышепоказанного рендера)
Не совсем понятно, что ты имеешь ввиду. Опиши подробнее или приложи код.
 
25
1
Ну стандартная привязка модели. Модель json формата в папке models/block. В игре сам блок отображается пустым. То есть нет даже черно-фиолетовой текстуры.
Не совсем понятно, что ты имеешь ввиду. Опиши подробнее или приложи код.
 
25
1
Однако не помогло. Указал в классе блока getRenderShape как в примере. Все модели на нужных местах, однако при заходе в мир пишет без ошибок что модель отсутствует.
Java:
Exception loading blockstate definition: 'adventure:blockstates/hephaestus_forge.json' missing model for variant: 'adventure:hephaestus_forge#'

blockstates/hephaestus_forge.json:
{
    "variants": {
        "": { "model": "adventure:block/hephaestus_forge" }
    }
}
 
Сверху