41 lines
1.7 KiB
Java
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);
|
|
}
|
|
}
|