76 lines
3.2 KiB
Java
76 lines
3.2 KiB
Java
package net.minecraft.client.renderer.entity;
|
|
|
|
import com.mojang.blaze3d.vertex.PoseStack;
|
|
import java.util.Arrays;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
import net.minecraft.client.model.IllagerModel;
|
|
import net.minecraft.client.model.geom.ModelLayers;
|
|
import net.minecraft.client.renderer.MultiBufferSource;
|
|
import net.minecraft.client.renderer.entity.EntityRendererProvider.Context;
|
|
import net.minecraft.client.renderer.entity.layers.ItemInHandLayer;
|
|
import net.minecraft.client.renderer.entity.state.IllusionerRenderState;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.world.entity.monster.Illusioner;
|
|
import net.minecraft.world.phys.AABB;
|
|
import net.minecraft.world.phys.Vec3;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class IllusionerRenderer extends IllagerRenderer<Illusioner, IllusionerRenderState> {
|
|
private static final ResourceLocation ILLUSIONER = ResourceLocation.withDefaultNamespace("textures/entity/illager/illusioner.png");
|
|
|
|
public IllusionerRenderer(Context context) {
|
|
super(context, new IllagerModel<>(context.bakeLayer(ModelLayers.ILLUSIONER)), 0.5F);
|
|
this.addLayer(new ItemInHandLayer<IllusionerRenderState, IllagerModel<IllusionerRenderState>>(this) {
|
|
public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, IllusionerRenderState illusionerRenderState, float f, float g) {
|
|
if (illusionerRenderState.isCastingSpell || illusionerRenderState.isAggressive) {
|
|
super.render(poseStack, multiBufferSource, i, illusionerRenderState, f, g);
|
|
}
|
|
}
|
|
});
|
|
this.model.getHat().visible = true;
|
|
}
|
|
|
|
public ResourceLocation getTextureLocation(IllusionerRenderState illusionerRenderState) {
|
|
return ILLUSIONER;
|
|
}
|
|
|
|
public IllusionerRenderState createRenderState() {
|
|
return new IllusionerRenderState();
|
|
}
|
|
|
|
public void extractRenderState(Illusioner illusioner, IllusionerRenderState illusionerRenderState, float f) {
|
|
super.extractRenderState(illusioner, illusionerRenderState, f);
|
|
Vec3[] vec3s = illusioner.getIllusionOffsets(f);
|
|
illusionerRenderState.illusionOffsets = (Vec3[])Arrays.copyOf(vec3s, vec3s.length);
|
|
illusionerRenderState.isCastingSpell = illusioner.isCastingSpell();
|
|
}
|
|
|
|
public void render(IllusionerRenderState illusionerRenderState, PoseStack poseStack, MultiBufferSource multiBufferSource, int i) {
|
|
if (illusionerRenderState.isInvisible) {
|
|
Vec3[] vec3s = illusionerRenderState.illusionOffsets;
|
|
|
|
for (int j = 0; j < vec3s.length; j++) {
|
|
poseStack.pushPose();
|
|
poseStack.translate(
|
|
vec3s[j].x + Mth.cos(j + illusionerRenderState.ageInTicks * 0.5F) * 0.025,
|
|
vec3s[j].y + Mth.cos(j + illusionerRenderState.ageInTicks * 0.75F) * 0.0125,
|
|
vec3s[j].z + Mth.cos(j + illusionerRenderState.ageInTicks * 0.7F) * 0.025
|
|
);
|
|
super.render(illusionerRenderState, poseStack, multiBufferSource, i);
|
|
poseStack.popPose();
|
|
}
|
|
} else {
|
|
super.render(illusionerRenderState, poseStack, multiBufferSource, i);
|
|
}
|
|
}
|
|
|
|
protected boolean isBodyVisible(IllusionerRenderState illusionerRenderState) {
|
|
return true;
|
|
}
|
|
|
|
protected AABB getBoundingBoxForCulling(Illusioner illusioner) {
|
|
return super.getBoundingBoxForCulling(illusioner).inflate(3.0, 0.0, 3.0);
|
|
}
|
|
}
|