package net.minecraft.client.renderer.entity.layers; import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.projectile.Arrow; import net.minecraft.world.item.ItemStack; @Environment(EnvType.CLIENT) public class ArrowLayer> extends StuckInBodyLayer { private final EntityRenderDispatcher dispatcher; public ArrowLayer(EntityRendererProvider.Context context, LivingEntityRenderer renderer) { super(renderer); this.dispatcher = context.getEntityRenderDispatcher(); } @Override protected int numStuck(T entity) { return entity.getArrowCount(); } @Override protected void renderStuckItem(PoseStack poseStack, MultiBufferSource buffer, int packedLight, Entity entity, float x, float y, float z, float partialTick) { float f = Mth.sqrt(x * x + z * z); Arrow arrow = new Arrow(entity.level(), entity.getX(), entity.getY(), entity.getZ(), ItemStack.EMPTY, null); arrow.setYRot((float)(Math.atan2(x, z) * 180.0F / (float)Math.PI)); arrow.setXRot((float)(Math.atan2(y, f) * 180.0F / (float)Math.PI)); arrow.yRotO = arrow.getYRot(); arrow.xRotO = arrow.getXRot(); this.dispatcher.render(arrow, 0.0, 0.0, 0.0, 0.0F, partialTick, poseStack, buffer, packedLight); } }