- 28
- 1
Фактически я нашел реализацию этого механизма в другом моде. Повторил то же самое, однако изменение предмета в инвентаре Тайла отображается только при перезаходе в мир или перезагрузке чанка. Судя по всему нужно как-то отрисовывать каждый тик, однако на данный момент не понимаю как.
Код
Рендер зарегистрировал в главном классе. Дополнительно буду благодарен если подскажите как отрендерить модель которая сделана на BB (Она установлена в ресурсах, и соответственно отображается на предмете, который наследует модель от блока, но сам блок не рендерит модель, из-за переопределения вышепоказанного рендера)
Код
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 (Она установлена в ресурсах, и соответственно отображается на предмете, который наследует модель от блока, но сам блок не рендерит модель, из-за переопределения вышепоказанного рендера)