minecraft-src/net/minecraft/client/renderer/entity/layers/ArrowLayer.java
2025-07-04 01:41:11 +03:00

41 lines
1.7 KiB
Java

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<T extends LivingEntity, M extends PlayerModel<T>> extends StuckInBodyLayer<T, M> {
private final EntityRenderDispatcher dispatcher;
public ArrowLayer(EntityRendererProvider.Context context, LivingEntityRenderer<T, M> 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);
}
}