Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
1package net.lerariemann.infinity.entity.client;
2
3import com.mojang.blaze3d.vertex.PoseStack;
4import net.lerariemann.infinity.entity.custom.ChaosCreeper;
5import net.lerariemann.infinity.util.InfinityMethods;
6import net.minecraft.client.renderer.entity.*;
7import net.minecraft.client.model.geom.ModelLayers;
8//? if >1.21.4 {
9import net.minecraft.client.renderer.entity.layers.EnergySwirlLayer;
10import net.minecraft.client.model.EntityModel;
11import net.minecraft.client.model.geom.EntityModelSet;
12import net.minecraft.client.model.geom.ModelPart;
13import net.minecraft.client.model.geom.PartPose;
14import net.minecraft.client.model.geom.builders.*;
15//?} else {
16/*import net.minecraft.world.entity.monster.Creeper;
17import net.minecraft.client.model.CreeperModel;
18*///?}
19import net.minecraft.resources.ResourceLocation;
20import net.minecraft.util.Mth;
21
22public class ChaosCreeperRenderer extends
23 //? if >1.21.2 {
24 MobRenderer<ChaosCreeper, TintedRenderState.Creeper, ChaosCreeperRenderer.Model>
25 //?} else {
26 /*CreeperRenderer
27 *///?}
28{
29 public static final ResourceLocation TEXTURE = InfinityMethods.getId("textures/entity/creeper.png");
30
31 @Override
32 public ResourceLocation getTextureLocation(
33 //? if >1.21.2 {
34 TintedRenderState.Creeper
35 //?} else {
36 /*Creeper
37 *///?}
38 creeperEntity) {
39 return TEXTURE;
40 }
41
42 public ChaosCreeperRenderer(EntityRendererProvider.Context context) {
43 //? if <1.21.2 {
44 /*super(context);
45 this.addLayer(new TintedLayerRenderer<>(this, new CreeperModel(context.bakeLayer(ModelLayers.CREEPER))));
46 *///?} else {
47 super(context, new ChaosCreeperRenderer.Model(context.bakeLayer(ModelLayers.CREEPER)), 0.5F);
48 this.addLayer(new PowerLayer(this, context.getModelSet()));
49 this.addLayer(new TintedLayerRenderer<>(this, new ChaosCreeperRenderer.Model(context.bakeLayer(ModelLayers.CREEPER))));
50 //?}
51 }
52
53 //? if >1.21.2 {
54 public TintedRenderState.Creeper createRenderState() {
55 return new TintedRenderState.Creeper();
56 }
57
58 public void extractRenderState(ChaosCreeper creeper, TintedRenderState.Creeper state, float f) {
59 super.extractRenderState(creeper, state, f);
60 state.swelling = creeper.getSwelling(f);
61 state.isPowered = creeper.isPowered();
62 state.colour = creeper.getColorForRender();
63 }
64
65 //mojang decided abstract creepers should not exist and now i have to suffer
66 protected void scale(TintedRenderState.Creeper state, PoseStack poseStack) {
67 float f = state.swelling;
68 float f1 = 1.0F + Mth.sin(f * 100.0F) * f * 0.01F;
69 f = Mth.clamp(f, 0.0F, 1.0F);
70 f *= f;
71 f *= f;
72 float f2 = (1.0F + f * 0.4F) * f1;
73 float f3 = (1.0F + f * 0.1F) / f1;
74 poseStack.scale(f2, f3, f2);
75 }
76
77 public float getWhiteOverlayProgress(TintedRenderState.Creeper state) {
78 float f = state.swelling;
79 return (int)(f * 10.0F) % 2 == 0 ? 0.0F : Mth.clamp(f, 0.5F, 1.0F);
80 }
81
82 public class PowerLayer extends EnergySwirlLayer<TintedRenderState.Creeper, ChaosCreeperRenderer.Model> {
83 private static final ResourceLocation POWER_LOCATION = ResourceLocation.withDefaultNamespace("textures/entity/creeper/creeper_armor.png");
84 private final ChaosCreeperRenderer.Model model;
85
86 public PowerLayer(RenderLayerParent<TintedRenderState.Creeper, ChaosCreeperRenderer.Model> renderer, EntityModelSet modelSet) {
87 super(renderer);
88 this.model = new ChaosCreeperRenderer.Model(modelSet.bakeLayer(ModelLayers.CREEPER_ARMOR));
89 }
90
91 protected boolean isPowered(TintedRenderState.Creeper renderState) {
92 return renderState.isPowered;
93 }
94
95 @Override
96 protected float xOffset(float tickCount) {
97 return tickCount * 0.01F;
98 }
99
100 @Override
101 protected ResourceLocation getTextureLocation() {
102 return POWER_LOCATION;
103 }
104
105 protected ChaosCreeperRenderer.Model model() {
106 return this.model;
107 }
108 }
109
110 public static class Model extends EntityModel<TintedRenderState.Creeper> {
111 private final ModelPart head;
112 private final ModelPart rightHindLeg;
113 private final ModelPart leftHindLeg;
114 private final ModelPart rightFrontLeg;
115 private final ModelPart leftFrontLeg;
116 private static final int Y_OFFSET = 6;
117
118 public Model(ModelPart root) {
119 super(root);
120 this.head = root.getChild("head");
121 this.leftHindLeg = root.getChild("right_hind_leg");
122 this.rightHindLeg = root.getChild("left_hind_leg");
123 this.leftFrontLeg = root.getChild("right_front_leg");
124 this.rightFrontLeg = root.getChild("left_front_leg");
125 }
126
127 public static LayerDefinition createBodyLayer(CubeDeformation cubeDeformation) {
128 MeshDefinition meshdefinition = new MeshDefinition();
129 PartDefinition partdefinition = meshdefinition.getRoot();
130 partdefinition.addOrReplaceChild(
131 "head", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, cubeDeformation), PartPose.offset(0.0F, 6.0F, 0.0F)
132 );
133 partdefinition.addOrReplaceChild(
134 "body", CubeListBuilder.create().texOffs(16, 16).addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, cubeDeformation), PartPose.offset(0.0F, 6.0F, 0.0F)
135 );
136 CubeListBuilder cubelistbuilder = CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F, cubeDeformation);
137 partdefinition.addOrReplaceChild("right_hind_leg", cubelistbuilder, PartPose.offset(-2.0F, 18.0F, 4.0F));
138 partdefinition.addOrReplaceChild("left_hind_leg", cubelistbuilder, PartPose.offset(2.0F, 18.0F, 4.0F));
139 partdefinition.addOrReplaceChild("right_front_leg", cubelistbuilder, PartPose.offset(-2.0F, 18.0F, -4.0F));
140 partdefinition.addOrReplaceChild("left_front_leg", cubelistbuilder, PartPose.offset(2.0F, 18.0F, -4.0F));
141 return LayerDefinition.create(meshdefinition, 64, 32);
142 }
143
144 public void setupAnim(TintedRenderState.Creeper renderState) {
145 super.setupAnim(renderState);
146 this.head.yRot = renderState.yRot * (float) (Math.PI / 180.0);
147 this.head.xRot = renderState.xRot * (float) (Math.PI / 180.0);
148 float f = renderState.walkAnimationSpeed;
149 float f1 = renderState.walkAnimationPos;
150 this.rightHindLeg.xRot = Mth.cos(f1 * 0.6662F) * 1.4F * f;
151 this.leftHindLeg.xRot = Mth.cos(f1 * 0.6662F + (float) Math.PI) * 1.4F * f;
152 this.rightFrontLeg.xRot = Mth.cos(f1 * 0.6662F + (float) Math.PI) * 1.4F * f;
153 this.leftFrontLeg.xRot = Mth.cos(f1 * 0.6662F) * 1.4F * f;
154 }
155 }
156 //?}
157}