Guest User

Untitled

a guest
Sep 7th, 2024
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.06 KB | None | 0 0
  1. package io.github.thatrobin.obscurum.client.renderer;
  2.  
  3. import io.github.thatrobin.obscurum.Obscurum;
  4. import io.github.thatrobin.obscurum.block_entities.PlinthBlockEntity;
  5. import net.minecraft.client.render.VertexConsumerProvider;
  6. import net.minecraft.client.render.WorldRenderer;
  7. import net.minecraft.client.render.block.entity.BlockEntityRenderer;
  8. import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
  9. import net.minecraft.client.render.item.ItemRenderer;
  10. import net.minecraft.client.render.model.json.ModelTransformationMode;
  11. import net.minecraft.client.util.math.MatrixStack;
  12. import net.minecraft.item.ItemStack;
  13. import net.minecraft.util.math.BlockPos;
  14. import net.minecraft.util.math.Vec3d;
  15. import net.minecraft.util.math.RotationAxis;
  16. import net.minecraft.world.World;
  17.  
  18. import java.util.Objects;
  19.  
  20. public class PlinthBlockEntityRenderer implements BlockEntityRenderer<PlinthBlockEntity> {
  21.  
  22.     private final ItemRenderer itemRenderer;
  23.  
  24.     public PlinthBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) {
  25.         this.itemRenderer = ctx.getItemRenderer();
  26.     }
  27.  
  28.     @Override
  29.     public void render(PlinthBlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
  30.         if (entity.hasItemInBuffer() || !entity.getTransferringItems().isEmpty()) {
  31.             Vec3d outputPos = entity.getLinkedPos().toCenterPos().subtract(entity.getPos().toCenterPos());
  32.             entity.markDirty();
  33.             if (entity.getStack(0).isEmpty() && entity.getTransferringItems().isEmpty()) {
  34.                 return; // Skip rendering if no items
  35.             }
  36.  
  37.             if (outputPos == null) {
  38.                 return;
  39.             }
  40.             double travelTime = entity.getTravelTime();
  41.  
  42.             // Render the items being transferred
  43.             for (PlinthBlockEntity.ItemTransfer transfer : entity.getTransferringItems()) {
  44.                 renderMovingItem(transfer.item, transfer.progress, travelTime, outputPos, tickDelta, matrices, vertexConsumers, light, overlay, entity.getWorld());
  45.             }
  46.  
  47.             // Render the item in the input buffer if present
  48.             ItemStack bufferItem = entity.getStack(0);
  49.             if (!bufferItem.isEmpty()) {
  50.                 renderItem(bufferItem, tickDelta, matrices, vertexConsumers, light, overlay, entity.getWorld());
  51.             }
  52.         }
  53.     }
  54.  
  55.     private void renderMovingItem(ItemStack stack, int transferProgress, double travelTime, Vec3d outputPos, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, World world) {
  56.         if (stack.isEmpty()) {
  57.             return;
  58.         }
  59.  
  60.         Vec3d offset = new Vec3d(outputPos.getX(), outputPos.getY(), outputPos.getZ());
  61.  
  62.         double progress = (transferProgress + tickDelta) / travelTime;
  63.         Vec3d pos = PlinthBlockEntity.lerpBlockPos(Vec3d.ZERO, offset, progress);
  64.  
  65.         matrices.push();
  66.         matrices.translate(pos.x + 0.5, pos.y + 0.85, pos.z + 0.5);
  67.         matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees((Objects.requireNonNull(world).getTime() + tickDelta) * 4));
  68.         this.itemRenderer.renderItem(stack, ModelTransformationMode.GROUND, light, overlay, matrices, vertexConsumers, world, 0);
  69.         matrices.pop();
  70.     }
  71.  
  72.     private void renderItem(ItemStack stack, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, World world) {
  73.         if (stack.isEmpty()) {
  74.             return;
  75.         }
  76.  
  77.         matrices.push();
  78.         matrices.translate(0.5, 0.85, 0.5);
  79.         matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees((Objects.requireNonNull(world).getTime() + tickDelta) * 4));
  80.         this.itemRenderer.renderItem(stack, ModelTransformationMode.GROUND, light, overlay, matrices, vertexConsumers, world, 0);
  81.         matrices.pop();
  82.     }
  83.  
  84.     @Override
  85.     public boolean rendersOutsideBoundingBox(PlinthBlockEntity blockEntity) {
  86.         return true; // Ensure rendering beyond the block's bounds
  87.     }
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment