Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
at master 157 lines 7.0 kB view raw
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}