131 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.renderer.entity;
 | |
| 
 | |
| import com.google.common.collect.Maps;
 | |
| import com.mojang.blaze3d.vertex.PoseStack;
 | |
| import com.mojang.math.Axis;
 | |
| import java.util.Map;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.client.model.PandaModel;
 | |
| import net.minecraft.client.model.geom.ModelLayers;
 | |
| import net.minecraft.client.renderer.entity.layers.PandaHoldsItemLayer;
 | |
| import net.minecraft.client.renderer.entity.state.HoldingEntityRenderState;
 | |
| import net.minecraft.client.renderer.entity.state.PandaRenderState;
 | |
| import net.minecraft.resources.ResourceLocation;
 | |
| import net.minecraft.util.Mth;
 | |
| import net.minecraft.world.entity.animal.Panda;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class PandaRenderer extends AgeableMobRenderer<Panda, PandaRenderState, PandaModel> {
 | |
| 	private static final Map<Panda.Gene, ResourceLocation> TEXTURES = Maps.newEnumMap(
 | |
| 		Map.of(
 | |
| 			Panda.Gene.NORMAL,
 | |
| 			ResourceLocation.withDefaultNamespace("textures/entity/panda/panda.png"),
 | |
| 			Panda.Gene.LAZY,
 | |
| 			ResourceLocation.withDefaultNamespace("textures/entity/panda/lazy_panda.png"),
 | |
| 			Panda.Gene.WORRIED,
 | |
| 			ResourceLocation.withDefaultNamespace("textures/entity/panda/worried_panda.png"),
 | |
| 			Panda.Gene.PLAYFUL,
 | |
| 			ResourceLocation.withDefaultNamespace("textures/entity/panda/playful_panda.png"),
 | |
| 			Panda.Gene.BROWN,
 | |
| 			ResourceLocation.withDefaultNamespace("textures/entity/panda/brown_panda.png"),
 | |
| 			Panda.Gene.WEAK,
 | |
| 			ResourceLocation.withDefaultNamespace("textures/entity/panda/weak_panda.png"),
 | |
| 			Panda.Gene.AGGRESSIVE,
 | |
| 			ResourceLocation.withDefaultNamespace("textures/entity/panda/aggressive_panda.png")
 | |
| 		)
 | |
| 	);
 | |
| 
 | |
| 	public PandaRenderer(EntityRendererProvider.Context context) {
 | |
| 		super(context, new PandaModel(context.bakeLayer(ModelLayers.PANDA)), new PandaModel(context.bakeLayer(ModelLayers.PANDA_BABY)), 0.9F);
 | |
| 		this.addLayer(new PandaHoldsItemLayer(this));
 | |
| 	}
 | |
| 
 | |
| 	public ResourceLocation getTextureLocation(PandaRenderState renderState) {
 | |
| 		return (ResourceLocation)TEXTURES.getOrDefault(renderState.variant, (ResourceLocation)TEXTURES.get(Panda.Gene.NORMAL));
 | |
| 	}
 | |
| 
 | |
| 	public PandaRenderState createRenderState() {
 | |
| 		return new PandaRenderState();
 | |
| 	}
 | |
| 
 | |
| 	public void extractRenderState(Panda entity, PandaRenderState reusedState, float partialTick) {
 | |
| 		super.extractRenderState(entity, reusedState, partialTick);
 | |
| 		HoldingEntityRenderState.extractHoldingEntityRenderState(entity, reusedState, this.itemModelResolver);
 | |
| 		reusedState.variant = entity.getVariant();
 | |
| 		reusedState.isUnhappy = entity.getUnhappyCounter() > 0;
 | |
| 		reusedState.isSneezing = entity.isSneezing();
 | |
| 		reusedState.sneezeTime = entity.getSneezeCounter();
 | |
| 		reusedState.isEating = entity.isEating();
 | |
| 		reusedState.isScared = entity.isScared();
 | |
| 		reusedState.isSitting = entity.isSitting();
 | |
| 		reusedState.sitAmount = entity.getSitAmount(partialTick);
 | |
| 		reusedState.lieOnBackAmount = entity.getLieOnBackAmount(partialTick);
 | |
| 		reusedState.rollAmount = entity.isBaby() ? 0.0F : entity.getRollAmount(partialTick);
 | |
| 		reusedState.rollTime = entity.rollCounter > 0 ? entity.rollCounter + partialTick : 0.0F;
 | |
| 	}
 | |
| 
 | |
| 	protected void setupRotations(PandaRenderState renderState, PoseStack poseStack, float bodyRot, float scale) {
 | |
| 		super.setupRotations(renderState, poseStack, bodyRot, scale);
 | |
| 		if (renderState.rollTime > 0.0F) {
 | |
| 			float f = Mth.frac(renderState.rollTime);
 | |
| 			int i = Mth.floor(renderState.rollTime);
 | |
| 			int j = i + 1;
 | |
| 			float g = 7.0F;
 | |
| 			float h = renderState.isBaby ? 0.3F : 0.8F;
 | |
| 			if (i < 8.0F) {
 | |
| 				float k = 90.0F * i / 7.0F;
 | |
| 				float l = 90.0F * j / 7.0F;
 | |
| 				float m = this.getAngle(k, l, j, f, 8.0F);
 | |
| 				poseStack.translate(0.0F, (h + 0.2F) * (m / 90.0F), 0.0F);
 | |
| 				poseStack.mulPose(Axis.XP.rotationDegrees(-m));
 | |
| 			} else if (i < 16.0F) {
 | |
| 				float k = (i - 8.0F) / 7.0F;
 | |
| 				float l = 90.0F + 90.0F * k;
 | |
| 				float n = 90.0F + 90.0F * (j - 8.0F) / 7.0F;
 | |
| 				float m = this.getAngle(l, n, j, f, 16.0F);
 | |
| 				poseStack.translate(0.0F, h + 0.2F + (h - 0.2F) * (m - 90.0F) / 90.0F, 0.0F);
 | |
| 				poseStack.mulPose(Axis.XP.rotationDegrees(-m));
 | |
| 			} else if (i < 24.0F) {
 | |
| 				float k = (i - 16.0F) / 7.0F;
 | |
| 				float l = 180.0F + 90.0F * k;
 | |
| 				float n = 180.0F + 90.0F * (j - 16.0F) / 7.0F;
 | |
| 				float m = this.getAngle(l, n, j, f, 24.0F);
 | |
| 				poseStack.translate(0.0F, h + h * (270.0F - m) / 90.0F, 0.0F);
 | |
| 				poseStack.mulPose(Axis.XP.rotationDegrees(-m));
 | |
| 			} else if (i < 32) {
 | |
| 				float k = (i - 24.0F) / 7.0F;
 | |
| 				float l = 270.0F + 90.0F * k;
 | |
| 				float n = 270.0F + 90.0F * (j - 24.0F) / 7.0F;
 | |
| 				float m = this.getAngle(l, n, j, f, 32.0F);
 | |
| 				poseStack.translate(0.0F, h * ((360.0F - m) / 90.0F), 0.0F);
 | |
| 				poseStack.mulPose(Axis.XP.rotationDegrees(-m));
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		float f = renderState.sitAmount;
 | |
| 		if (f > 0.0F) {
 | |
| 			poseStack.translate(0.0F, 0.8F * f, 0.0F);
 | |
| 			poseStack.mulPose(Axis.XP.rotationDegrees(Mth.lerp(f, renderState.xRot, renderState.xRot + 90.0F)));
 | |
| 			poseStack.translate(0.0F, -1.0F * f, 0.0F);
 | |
| 			if (renderState.isScared) {
 | |
| 				float o = (float)(Math.cos(renderState.ageInTicks * 1.25F) * Math.PI * 0.05F);
 | |
| 				poseStack.mulPose(Axis.YP.rotationDegrees(o));
 | |
| 				if (renderState.isBaby) {
 | |
| 					poseStack.translate(0.0F, 0.8F, 0.55F);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		float o = renderState.lieOnBackAmount;
 | |
| 		if (o > 0.0F) {
 | |
| 			float p = renderState.isBaby ? 0.5F : 1.3F;
 | |
| 			poseStack.translate(0.0F, p * o, 0.0F);
 | |
| 			poseStack.mulPose(Axis.XP.rotationDegrees(Mth.lerp(o, renderState.xRot, renderState.xRot + 180.0F)));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private float getAngle(float currentAngle, float nextAngle, int nextRollCounter, float partialTick, float rollEndCount) {
 | |
| 		return nextRollCounter < rollEndCount ? Mth.lerp(partialTick, currentAngle, nextAngle) : currentAngle;
 | |
| 	}
 | |
| }
 |