diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java new file mode 100644 index 00000000..7c4809f4 --- /dev/null +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -0,0 +1,45 @@ +package ru.betterend.entity; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.Flutterer; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.entity.passive.PassiveEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.World; +import ru.betterend.registry.EndEntities; + +public class SilkMothEntity extends AnimalEntity implements Flutterer { + public SilkMothEntity(EntityType entityType, World world) { + super(entityType, world); + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + protected boolean hasWings() { + return true; + } + + @Override + public boolean handleFallDamage(float fallDistance, float damageMultiplier) { + return false; + } + + @Override + public boolean canClimb() { + return false; + } + + @Override + public boolean hasNoGravity() { + return true; + } + + @Override + public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { + return EndEntities.SILK_MOTH.create(world); + } +} diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java new file mode 100644 index 00000000..c9751121 --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -0,0 +1,137 @@ +package ru.betterend.entity.model; + +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.MathHelper; +import ru.betterend.entity.SilkMothEntity; + +public class SilkMothEntityModel extends BlockBenchModel { + private final ModelPart legsL; + private final ModelPart cube_r1; + private final ModelPart cube_r2; + private final ModelPart cube_r3; + private final ModelPart legsR; + private final ModelPart cube_r4; + private final ModelPart cube_r5; + private final ModelPart cube_r6; + private final ModelPart head_pivot; + private final ModelPart tendril_r_r1; + private final ModelPart tendril_r_r2; + private final ModelPart bb_main; + private final ModelPart wingR_r1; + private final ModelPart wingL_r1; + private final ModelPart abdomen_r1; + + public SilkMothEntityModel() { + super(RenderLayer::getEntityCutout); + + textureWidth = 64; + textureHeight = 64; + + legsL = new ModelPart(this); + legsL.setPivot(1.5F, 19.9F, -0.45F); + setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); + + cube_r1 = new ModelPart(this); + cube_r1.setPivot(0.0F, 0.0F, -1.0F); + legsL.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, 0.2182F, 0.3927F); + cube_r1.setTextureOffset(0, 13).addCuboid(0.0216F, 0.0F, -0.5976F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r2 = new ModelPart(this); + cube_r2.setPivot(0.5F, 0.1F, -0.05F); + legsL.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, 0.0F, 0.3927F); + cube_r2.setTextureOffset(0, 15).addCuboid(0.0F, 0.0F, -0.6F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r3 = new ModelPart(this); + cube_r3.setPivot(0.0F, 0.0F, 0.9F); + legsL.addChild(cube_r3); + setRotationAngle(cube_r3, 0.0F, -0.2182F, 0.3927F); + cube_r3.setTextureOffset(0, 14).addCuboid(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + + legsR = new ModelPart(this); + legsR.setPivot(-1.5F, 19.9F, -0.55F); + setRotationAngle(legsR, 0.0F, 3.1416F, -0.6545F); + + cube_r4 = new ModelPart(this); + cube_r4.setPivot(0.0F, 0.0F, -1.0F); + legsR.addChild(cube_r4); + setRotationAngle(cube_r4, 0.0F, 0.2182F, 0.3927F); + cube_r4.setTextureOffset(0, 10).addCuboid(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r5 = new ModelPart(this); + cube_r5.setPivot(0.5F, 0.1F, -0.05F); + legsR.addChild(cube_r5); + setRotationAngle(cube_r5, 0.0F, 0.0F, 0.3927F); + cube_r5.setTextureOffset(0, 11).addCuboid(0.0F, 0.0F, -0.4F, 3.0F, 0.0F, 1.0F, 0.0F); + + cube_r6 = new ModelPart(this); + cube_r6.setPivot(0.0F, 0.0F, 0.9F); + legsR.addChild(cube_r6); + setRotationAngle(cube_r6, 0.0F, -0.2182F, 0.3927F); + cube_r6.setTextureOffset(0, 12).addCuboid(0.0216F, 0.0F, -0.4024F, 3.0F, 0.0F, 1.0F, 0.0F); + + head_pivot = new ModelPart(this); + head_pivot.setPivot(0.0F, 18.0F, -3.0F); + head_pivot.setTextureOffset(15, 10).addCuboid(-1.5F, -1.5F, -2.0F, 3.0F, 3.0F, 3.0F, 0.0F); + + tendril_r_r1 = new ModelPart(this); + tendril_r_r1.setPivot(1.0F, -1.15F, -1.0F); + head_pivot.addChild(tendril_r_r1); + setRotationAngle(tendril_r_r1, 0.0F, 0.0F, 0.3927F); + tendril_r_r1.setTextureOffset(23, 0).addCuboid(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F, true); + + tendril_r_r2 = new ModelPart(this); + tendril_r_r2.setPivot(-1.0F, -1.15F, -1.0F); + head_pivot.addChild(tendril_r_r2); + setRotationAngle(tendril_r_r2, 0.0F, 0.0F, -0.3927F); + tendril_r_r2.setTextureOffset(23, 0).addCuboid(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F); + + bb_main = new ModelPart(this); + bb_main.setPivot(0.0F, 24.0F, 0.0F); + bb_main.setTextureOffset(19, 19).addCuboid(-2.5F, -8.5F, -3.0F, 5.0F, 5.0F, 3.0F, 0.0F); + + wingR_r1 = new ModelPart(this); + wingR_r1.setPivot(-1.5F, -6.5F, 0.5F); + bb_main.addChild(wingR_r1); + setRotationAngle(wingR_r1, 0.0F, 0.0F, 0.3927F); + wingR_r1.setTextureOffset(0, 5).addCuboid(-7.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F, true); + + wingL_r1 = new ModelPart(this); + wingL_r1.setPivot(1.5F, -6.5F, 0.5F); + bb_main.addChild(wingL_r1); + setRotationAngle(wingL_r1, 0.0F, 0.0F, -0.3927F); + wingL_r1.setTextureOffset(0, 5).addCuboid(-2.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F); + + abdomen_r1 = new ModelPart(this); + abdomen_r1.setPivot(1.0F, -3.9F, 0.0F); + bb_main.addChild(abdomen_r1); + setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); + abdomen_r1.setTextureOffset(0, 10).addCuboid(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); + } + + + @Override + public void setAngles(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + wingR_r1.roll = MathHelper.sin(animationProgress * 2F) * 0.4F + 0.3927F; + wingL_r1.roll = -wingR_r1.roll; + head_pivot.pitch = MathHelper.sin(animationProgress * 0.03F) * 0.1F; + tendril_r_r1.roll = MathHelper.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; + tendril_r_r2.roll = -tendril_r_r1.roll; + abdomen_r1.pitch = MathHelper.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; + legsR.roll = MathHelper.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; + legsL.roll = -legsR.roll; + } + + + @Override + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + bb_main.render(matrices, vertices, light, overlay); + head_pivot.render(matrices, vertices, light, overlay); + legsL.render(matrices, vertices, light, overlay); + legsR.render(matrices, vertices, light, overlay); + } +} diff --git a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java new file mode 100644 index 00000000..818520d6 --- /dev/null +++ b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java @@ -0,0 +1,21 @@ +package ru.betterend.entity.render; + +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.MobEntityRenderer; +import net.minecraft.util.Identifier; +import ru.betterend.BetterEnd; +import ru.betterend.entity.SilkMothEntity; +import ru.betterend.entity.model.SilkMothEntityModel; + +public class SilkMothEntityRenderer extends MobEntityRenderer { + private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); + + public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) { + super(entityRenderDispatcher, new SilkMothEntityModel(), 0.5f); + } + + @Override + public Identifier getTexture(SilkMothEntity entity) { + return TEXTURE; + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 60480491..3da97dc8 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -18,6 +18,7 @@ import ru.betterend.entity.DragonflyEntity; import ru.betterend.entity.EndFishEntity; import ru.betterend.entity.EndSlimeEntity; import ru.betterend.entity.ShadowWalkerEntity; +import ru.betterend.entity.SilkMothEntity; import ru.betterend.util.MHelper; import ru.betterend.util.SpawnHelper; @@ -27,6 +28,7 @@ public class EndEntities { public static final EntityType END_FISH = register("end_fish", SpawnGroup.WATER_AMBIENT, 0.5F, 0.5F, EndFishEntity::new, EndFishEntity.createMobAttributes(), true, MHelper.color(3, 50, 76), MHelper.color(120, 206, 255)); public static final EntityType SHADOW_WALKER = register("shadow_walker", SpawnGroup.MONSTER, 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, MHelper.color(30, 30, 30), MHelper.color(5, 5, 5)); public static final EntityType CUBOZOA = register("cubozoa", SpawnGroup.WATER_AMBIENT, 0.6F, 1F, CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, MHelper.color(151, 77, 181), MHelper.color(93, 176, 238)); + public static final EntityType SILK_MOTH = register("silk_moth", SpawnGroup.AMBIENT, 0.6F, 0.6F, SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, MHelper.color(0, 0, 0), MHelper.color(225, 225, 225)); public static void register() { SpawnHelper.restrictionAir(DRAGONFLY, DragonflyEntity::canSpawn); diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 7c0b0ed5..35d2a367 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -11,6 +11,7 @@ import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndSlime; import ru.betterend.entity.render.RendererEntityShadowWalker; +import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { @@ -20,6 +21,7 @@ public class EndEntitiesRenders { register(EndEntities.END_FISH, RendererEntityEndFish::new); register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker::new); register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); + register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); } private static void register(EntityType type, Function> render) { diff --git a/src/main/resources/assets/betterend/textures/entity/silk_moth.png b/src/main/resources/assets/betterend/textures/entity/silk_moth.png new file mode 100644 index 00000000..d622f940 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/entity/silk_moth.png differ