76 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.renderer.entity;
 | |
| 
 | |
| import com.mojang.blaze3d.vertex.PoseStack;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.client.model.EndCrystalModel;
 | |
| import net.minecraft.client.model.geom.ModelLayers;
 | |
| import net.minecraft.client.renderer.MultiBufferSource;
 | |
| import net.minecraft.client.renderer.RenderType;
 | |
| import net.minecraft.client.renderer.culling.Frustum;
 | |
| import net.minecraft.client.renderer.entity.state.EndCrystalRenderState;
 | |
| import net.minecraft.client.renderer.texture.OverlayTexture;
 | |
| import net.minecraft.core.BlockPos;
 | |
| import net.minecraft.resources.ResourceLocation;
 | |
| import net.minecraft.util.Mth;
 | |
| import net.minecraft.world.entity.boss.enderdragon.EndCrystal;
 | |
| import net.minecraft.world.phys.Vec3;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class EndCrystalRenderer extends EntityRenderer<EndCrystal, EndCrystalRenderState> {
 | |
| 	private static final ResourceLocation END_CRYSTAL_LOCATION = ResourceLocation.withDefaultNamespace("textures/entity/end_crystal/end_crystal.png");
 | |
| 	private static final RenderType RENDER_TYPE = RenderType.entityCutoutNoCull(END_CRYSTAL_LOCATION);
 | |
| 	private final EndCrystalModel model;
 | |
| 
 | |
| 	public EndCrystalRenderer(EntityRendererProvider.Context context) {
 | |
| 		super(context);
 | |
| 		this.shadowRadius = 0.5F;
 | |
| 		this.model = new EndCrystalModel(context.bakeLayer(ModelLayers.END_CRYSTAL));
 | |
| 	}
 | |
| 
 | |
| 	public void render(EndCrystalRenderState renderState, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) {
 | |
| 		poseStack.pushPose();
 | |
| 		poseStack.scale(2.0F, 2.0F, 2.0F);
 | |
| 		poseStack.translate(0.0F, -0.5F, 0.0F);
 | |
| 		this.model.setupAnim(renderState);
 | |
| 		this.model.renderToBuffer(poseStack, bufferSource.getBuffer(RENDER_TYPE), packedLight, OverlayTexture.NO_OVERLAY);
 | |
| 		poseStack.popPose();
 | |
| 		Vec3 vec3 = renderState.beamOffset;
 | |
| 		if (vec3 != null) {
 | |
| 			float f = getY(renderState.ageInTicks);
 | |
| 			float g = (float)vec3.x;
 | |
| 			float h = (float)vec3.y;
 | |
| 			float i = (float)vec3.z;
 | |
| 			poseStack.translate(vec3);
 | |
| 			EnderDragonRenderer.renderCrystalBeams(-g, -h + f, -i, renderState.ageInTicks, poseStack, bufferSource, packedLight);
 | |
| 		}
 | |
| 
 | |
| 		super.render(renderState, poseStack, bufferSource, packedLight);
 | |
| 	}
 | |
| 
 | |
| 	public static float getY(float ageInTicks) {
 | |
| 		float f = Mth.sin(ageInTicks * 0.2F) / 2.0F + 0.5F;
 | |
| 		f = (f * f + f) * 0.4F;
 | |
| 		return f - 1.4F;
 | |
| 	}
 | |
| 
 | |
| 	public EndCrystalRenderState createRenderState() {
 | |
| 		return new EndCrystalRenderState();
 | |
| 	}
 | |
| 
 | |
| 	public void extractRenderState(EndCrystal entity, EndCrystalRenderState reusedState, float partialTick) {
 | |
| 		super.extractRenderState(entity, reusedState, partialTick);
 | |
| 		reusedState.ageInTicks = entity.time + partialTick;
 | |
| 		reusedState.showsBottom = entity.showsBottom();
 | |
| 		BlockPos blockPos = entity.getBeamTarget();
 | |
| 		if (blockPos != null) {
 | |
| 			reusedState.beamOffset = Vec3.atCenterOf(blockPos).subtract(entity.getPosition(partialTick));
 | |
| 		} else {
 | |
| 			reusedState.beamOffset = null;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public boolean shouldRender(EndCrystal livingEntity, Frustum camera, double camX, double camY, double camZ) {
 | |
| 		return super.shouldRender(livingEntity, camera, camX, camY, camZ) || livingEntity.getBeamTarget() != null;
 | |
| 	}
 | |
| }
 |