From b4c75acaec7f3e14d209ad87f7400827405cce7f Mon Sep 17 00:00:00 2001 From: paisc Date: Thu, 23 Jan 2025 12:32:09 +0100 Subject: [PATCH] added vulture entity --- .../net/voltexstudios/VoltexDesertUpdate.java | 4 + .../VoltexDesertUpdateClient.java | 9 +- .../net/voltexstudios/entity/ModEntities.java | 7 ++ .../entity/client/VultureAnimations.java | 51 +++++++++++ .../entity/client/VultureModel.java | 83 ++++++++++++++++++ .../entity/client/VultureRenderer.java | 32 +++++++ .../entity/custom/VultureEntity.java | 74 ++++++++++++++++ .../assets/voltexdesertupdate/lang/en_us.json | 4 +- .../textures/entity/vulture/vulture.png | Bin 0 -> 2103 bytes 9 files changed, 261 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/voltexstudios/entity/client/VultureAnimations.java create mode 100644 src/main/java/net/voltexstudios/entity/client/VultureModel.java create mode 100644 src/main/java/net/voltexstudios/entity/client/VultureRenderer.java create mode 100644 src/main/java/net/voltexstudios/entity/custom/VultureEntity.java create mode 100644 src/main/resources/assets/voltexdesertupdate/textures/entity/vulture/vulture.png diff --git a/src/main/java/net/voltexstudios/VoltexDesertUpdate.java b/src/main/java/net/voltexstudios/VoltexDesertUpdate.java index 9c81c84..d0dc7de 100644 --- a/src/main/java/net/voltexstudios/VoltexDesertUpdate.java +++ b/src/main/java/net/voltexstudios/VoltexDesertUpdate.java @@ -2,7 +2,9 @@ package net.voltexstudios; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.voltexstudios.entity.ModEntities; +import net.voltexstudios.entity.custom.VultureEntity; import net.voltexstudios.item.ModItems; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,5 +22,7 @@ public class VoltexDesertUpdate implements ModInitializer { ModItems.registerModItems(); ModEntities.registerModEntities(); + + FabricDefaultAttributeRegistry.register(ModEntities.VULTURE_ENTITY, VultureEntity.createAttributes()); } } \ No newline at end of file diff --git a/src/main/java/net/voltexstudios/VoltexDesertUpdateClient.java b/src/main/java/net/voltexstudios/VoltexDesertUpdateClient.java index 0063d81..c4d05d0 100644 --- a/src/main/java/net/voltexstudios/VoltexDesertUpdateClient.java +++ b/src/main/java/net/voltexstudios/VoltexDesertUpdateClient.java @@ -1,7 +1,11 @@ package net.voltexstudios; import net.fabricmc.api.ClientModInitializer; - +import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; +import net.voltexstudios.entity.ModEntities; +import net.voltexstudios.entity.client.VultureModel; +import net.voltexstudios.entity.client.VultureRenderer; public class VoltexDesertUpdateClient implements ClientModInitializer { @@ -9,6 +13,7 @@ public class VoltexDesertUpdateClient implements ClientModInitializer { public void onInitializeClient() { VoltexDesertUpdate.LOGGER.info("Initializing Desert Update Client"); - + EntityModelLayerRegistry.registerModelLayer(VultureModel.VULTURE, VultureModel::getTexturedModelData); + EntityRendererRegistry.register(ModEntities.VULTURE_ENTITY, VultureRenderer::new); } } diff --git a/src/main/java/net/voltexstudios/entity/ModEntities.java b/src/main/java/net/voltexstudios/entity/ModEntities.java index d20f289..20ce049 100644 --- a/src/main/java/net/voltexstudios/entity/ModEntities.java +++ b/src/main/java/net/voltexstudios/entity/ModEntities.java @@ -7,9 +7,16 @@ import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; import net.voltexstudios.VoltexDesertUpdate; import net.voltexstudios.entity.custom.DuneProjectileEntity; +import net.voltexstudios.entity.custom.VultureEntity; public class ModEntities { + //TODO alter dimensions + public static final EntityType VULTURE_ENTITY = Registry.register(Registries.ENTITY_TYPE, + Identifier.of(VoltexDesertUpdate.MOD_ID, "vulture_entity"), + EntityType.Builder.create(VultureEntity::new, SpawnGroup.CREATURE) + .dimensions(0.75f, 1f).build()); + public static final EntityType DUNE_PROJECTILE_ENTITY = Registry.register(Registries.ENTITY_TYPE, Identifier.of(VoltexDesertUpdate.MOD_ID, "dune_projectile_entity"), EntityType.Builder.create(DuneProjectileEntity::new, SpawnGroup.MISC) diff --git a/src/main/java/net/voltexstudios/entity/client/VultureAnimations.java b/src/main/java/net/voltexstudios/entity/client/VultureAnimations.java new file mode 100644 index 0000000..f95461d --- /dev/null +++ b/src/main/java/net/voltexstudios/entity/client/VultureAnimations.java @@ -0,0 +1,51 @@ +package net.voltexstudios.entity.client; + +import net.minecraft.client.render.entity.animation.Animation; +import net.minecraft.client.render.entity.animation.AnimationHelper; +import net.minecraft.client.render.entity.animation.Keyframe; +import net.minecraft.client.render.entity.animation.Transformation; + +public class VultureAnimations { + public static final Animation ANIM_VULTURE_FLYING = Animation.Builder.create(0f) + .addBoneAnimation("mambo", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(45f, 0f, 0f), + Transformation.Interpolations.LINEAR))) + .addBoneAnimation("head", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(-45f, 0f, 0f), + Transformation.Interpolations.LINEAR))) + .addBoneAnimation("leftWing", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 2f, 2f), + Transformation.Interpolations.LINEAR))) + .addBoneAnimation("leftWing", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(90f, 45f, 90f), + Transformation.Interpolations.LINEAR))) + .addBoneAnimation("rightWing", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0f, 2f, 2f), + Transformation.Interpolations.LINEAR))) + .addBoneAnimation("rightWing", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(90f, -45f, -90f), + Transformation.Interpolations.LINEAR))) + .addBoneAnimation("leftLeg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(-0.25f, 0f, 0f), + Transformation.Interpolations.LINEAR))) + .addBoneAnimation("leftLeg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(45f, 0f, 0f), + Transformation.Interpolations.LINEAR))) + .addBoneAnimation("rightLeg", + new Transformation(Transformation.Targets.TRANSLATE, + new Keyframe(0f, AnimationHelper.createTranslationalVector(0.25f, 0f, 0f), + Transformation.Interpolations.LINEAR))) + .addBoneAnimation("rightLeg", + new Transformation(Transformation.Targets.ROTATE, + new Keyframe(0f, AnimationHelper.createRotationalVector(45f, 0f, 0f), + Transformation.Interpolations.LINEAR))).build(); + +} diff --git a/src/main/java/net/voltexstudios/entity/client/VultureModel.java b/src/main/java/net/voltexstudios/entity/client/VultureModel.java new file mode 100644 index 0000000..4264341 --- /dev/null +++ b/src/main/java/net/voltexstudios/entity/client/VultureModel.java @@ -0,0 +1,83 @@ +package net.voltexstudios.entity.client; + +import net.minecraft.client.model.*; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.model.EntityModelLayer; +import net.minecraft.client.render.entity.model.SinglePartEntityModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; +import net.voltexstudios.VoltexDesertUpdate; +import net.voltexstudios.entity.custom.VultureEntity; + +public class VultureModel extends SinglePartEntityModel { + + public static final EntityModelLayer VULTURE = new EntityModelLayer(Identifier.of(VoltexDesertUpdate.MOD_ID, "vulture"), "main"); + + private final ModelPart vulture; + private final ModelPart head; + private final ModelPart body; + + public VultureModel(ModelPart root) { + this.vulture = root.getChild("mambo"); + this.body = vulture.getChild("body"); + this.head = vulture.getChild("head"); + } + + public static TexturedModelData getTexturedModelData() { + ModelData modelData = new ModelData(); + ModelPartData modelPartData = modelData.getRoot(); + ModelPartData mambo = modelPartData.addChild("mambo", ModelPartBuilder.create(), ModelTransform.pivot(0.0F, 15.0F, 1.0F)); + + ModelPartData head = mambo.addChild("head", ModelPartBuilder.create().uv(26, 8).cuboid(-2.0F, -1.0F, -4.0F, 2.0F, 2.0F, 5.0F, new Dilation(0.0F)) + .uv(38, 38).cuboid(-2.0F, -3.0F, -4.0F, 2.0F, 2.0F, 2.0F, new Dilation(0.0F)) + .uv(0, 35).cuboid(-2.5F, -6.0F, -5.0F, 3.0F, 3.0F, 3.0F, new Dilation(0.0F)) + .uv(12, 38).cuboid(-2.0F, -6.0F, -8.0F, 2.0F, 3.0F, 3.0F, new Dilation(0.0F)) + .uv(26, 15).cuboid(-2.0F, -3.0F, -8.0F, 2.0F, 1.0F, 0.0F, new Dilation(0.0F)), ModelTransform.pivot(1.0F, -4.0F, -3.0F)); + + ModelPartData body = mambo.addChild("body", ModelPartBuilder.create().uv(0, 0).cuboid(-3.0F, -5.0F, -3.0F, 6.0F, 10.0F, 7.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 1.0F, 0.0F, 0.7854F, 0.0F, 0.0F)); + + ModelPartData tail = body.addChild("tail", ModelPartBuilder.create().uv(26, 0).cuboid(-3.0F, 0.0F, -4.0F, 6.0F, 4.0F, 4.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 5.0F, 4.0F)); + + ModelPartData leftWing = mambo.addChild("leftWing", ModelPartBuilder.create().uv(0, 17).cuboid(-0.5F, -1.5F, -1.0F, 1.0F, 7.0F, 11.0F, new Dilation(0.0F)), ModelTransform.pivot(3.5F, -1.5F, -3.0F)); + + ModelPartData rightWing = mambo.addChild("rightWing", ModelPartBuilder.create().uv(24, 17).cuboid(-0.5F, -1.5F, -1.0F, 1.0F, 7.0F, 11.0F, new Dilation(0.0F)), ModelTransform.pivot(-3.5F, -1.5F, -3.0F)); + + ModelPartData leftLeg = mambo.addChild("leftLeg", ModelPartBuilder.create().uv(22, 38).cuboid(-1.0F, -0.1667F, -1.0F, 2.0F, 5.0F, 2.0F, new Dilation(0.0F)) + .uv(26, 16).cuboid(-0.5F, 4.8333F, 1.0F, 1.0F, 0.0F, 1.0F, new Dilation(0.0F)) + .uv(12, 35).cuboid(-2.0F, 4.8333F, -3.0F, 4.0F, 0.0F, 3.0F, new Dilation(0.0F)), ModelTransform.pivot(2.0F, 4.1667F, -1.0F)); + + ModelPartData rightLeg = mambo.addChild("rightLeg", ModelPartBuilder.create().uv(30, 38).cuboid(-1.0F, -0.1667F, -1.0F, 2.0F, 5.0F, 2.0F, new Dilation(0.0F)) + .uv(30, 15).cuboid(-0.5F, 4.8333F, 1.0F, 1.0F, 0.0F, 1.0F, new Dilation(0.0F)) + .uv(26, 35).cuboid(-2.0F, 4.8333F, -3.0F, 4.0F, 0.0F, 3.0F, new Dilation(0.0F)), ModelTransform.pivot(-2.0F, 4.1667F, -1.0F)); + return TexturedModelData.of(modelData, 64, 64); + } + @Override + public void setAngles(VultureEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.getPart().traverse().forEach(ModelPart::resetTransform); + this.setHeadAngles(netHeadYaw, headPitch); + + //TODO add Animation + //this.animateMovement(VultureAnimations.ANIM_VULTURE_WALK, limbSwing, limbSwingAmount, 2f, 2.5f); + //this.updateAnimation(entity.idleAnimationState, VultureAnimations.ANIM_MANTIS_IDLE, ageInTicks, 1f); + } + + private void setHeadAngles(float headYaw, float headPitch) { + headYaw = MathHelper.clamp(headYaw, -30.0F, 30.0F); + headPitch = MathHelper.clamp(headPitch, -25.0F, 45.0F); + + this.head.yaw = headYaw * 0.017453292F; + this.head.pitch = headPitch * 0.017453292F; + } + + + @Override + public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) { + vulture.render(matrices, vertexConsumer, light, overlay, color); + } + + @Override + public ModelPart getPart() { + return vulture; + } +} diff --git a/src/main/java/net/voltexstudios/entity/client/VultureRenderer.java b/src/main/java/net/voltexstudios/entity/client/VultureRenderer.java new file mode 100644 index 0000000..acb7438 --- /dev/null +++ b/src/main/java/net/voltexstudios/entity/client/VultureRenderer.java @@ -0,0 +1,32 @@ +package net.voltexstudios.entity.client; + +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.MobEntityRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; +import net.voltexstudios.VoltexDesertUpdate; +import net.voltexstudios.entity.custom.VultureEntity; + +public class VultureRenderer extends MobEntityRenderer> { + + public VultureRenderer(EntityRendererFactory.Context context) { + super(context, new VultureModel<>(context.getPart(VultureModel.VULTURE)), 0.5f); + } + + @Override + public Identifier getTexture(VultureEntity entity) { + return Identifier.of(VoltexDesertUpdate.MOD_ID, "textures/entity/vulture/vulture.png"); + } + + @Override + public void render(VultureEntity livingEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) { + if(livingEntity.isBaby()) { + matrixStack.scale(0.5f, 0.5f, 0.5f); + } else { + matrixStack.scale(1f, 1f, 1f); + } + + super.render(livingEntity, f, g, matrixStack, vertexConsumerProvider, i); + } +} diff --git a/src/main/java/net/voltexstudios/entity/custom/VultureEntity.java b/src/main/java/net/voltexstudios/entity/custom/VultureEntity.java new file mode 100644 index 0000000..4f9e2b4 --- /dev/null +++ b/src/main/java/net/voltexstudios/entity/custom/VultureEntity.java @@ -0,0 +1,74 @@ +package net.voltexstudios.entity.custom; + +import net.minecraft.entity.AnimationState; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.ai.goal.LookAroundGoal; +import net.minecraft.entity.ai.goal.LookAtEntityGoal; +import net.minecraft.entity.ai.goal.WanderAroundGoal; +import net.minecraft.entity.attribute.DefaultAttributeContainer; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.mob.MobEntity; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.entity.passive.PassiveEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.World; +import net.voltexstudios.entity.ModEntities; +import org.jetbrains.annotations.Nullable; + +public class VultureEntity extends AnimalEntity { + + public final AnimationState idleAnimationState = new AnimationState(); + private int idleAnimationTimeout; + + public VultureEntity(EntityType entityType, World world) { + super(entityType, world); + } + + @Override + protected void initGoals() { + this.goalSelector.add(0, new WanderAroundGoal(this, 1.0)); + this.goalSelector.add(1, new LookAtEntityGoal(this, PlayerEntity.class, 6.0F)); + this.goalSelector.add(2, new LookAroundGoal(this)); + } + + private void setupAnimationStates() { + if (this.idleAnimationTimeout <= 0) { + this.idleAnimationTimeout = 40; + this.idleAnimationState.start(this.age); + } else { + --this.idleAnimationTimeout; + } + } + + @Override + public void tick() { + super.tick(); + + if (this.getWorld().isClient()) { + this.setupAnimationStates(); + } + } + + //TODO alter attributes + public static DefaultAttributeContainer.Builder createAttributes() { + return MobEntity.createMobAttributes() + .add(EntityAttributes.GENERIC_MAX_HEALTH, 10.0) + .add(EntityAttributes.GENERIC_FLYING_SPEED, 1.5F) + .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.6F) + .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 10.0) + .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 48.0); + } + + @Override + public boolean isBreedingItem(ItemStack stack) { + return false; + } + + @Nullable + @Override + public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { + return ModEntities.VULTURE_ENTITY.create(world); + } +} diff --git a/src/main/resources/assets/voltexdesertupdate/lang/en_us.json b/src/main/resources/assets/voltexdesertupdate/lang/en_us.json index a9a1e3c..8caf65a 100644 --- a/src/main/resources/assets/voltexdesertupdate/lang/en_us.json +++ b/src/main/resources/assets/voltexdesertupdate/lang/en_us.json @@ -1,3 +1,5 @@ { - "item.voltexdesertupdate.dune_staff": "Staff of the Dunes" + "item.voltexdesertupdate.dune_staff": "Staff of the Dunes", + + "entity.voltexdesertupdate.vulture": "Vulture" } \ No newline at end of file diff --git a/src/main/resources/assets/voltexdesertupdate/textures/entity/vulture/vulture.png b/src/main/resources/assets/voltexdesertupdate/textures/entity/vulture/vulture.png new file mode 100644 index 0000000000000000000000000000000000000000..61c450a50cecd91cd92991ca66b14685a890d563 GIT binary patch literal 2103 zcmV-72*~$|P)Px+*GWV{RCt{2T3cuw*BSmsUhRx#&++bRcXf**Duxd^ah2zmOx$trO@~xFM+-o+J|0T6_T`|fa6{iQd@*1R;$WX&P6NBUU~2GT=vYa z*3*aGb9_cwt+bKGO38e%?96}u^Plry&Y3g+KMLAl{>|515=%iRJU@%+zm&rrXh-^>?aGln(86f|Aa+76^^ zs+){OU0qY%$;0FBW_*)}$6c9s<2C0Kl*Ry}Swl!T?c9 zKuH82uH4vEUNRPS`7-HGCN|~0Z+OU+H&+=pV}iC@`@)tH;IJxGE$q3r83QE|L@7ac zcVi#rlim!JM1ZDJ?F{wd$_<4pNl65hM8tT0Ae2onxT+q3V_P`=9Jm)|IR~?RM=^Qu>EEAq7XZMC?|vVYMucKZnLLuIxG+S)tO&(ai4b1xy8isP5h{RqrnN5!!O z?fIWR4J{sRIrta9{1EJ>+`WRrH@bYT@to&I$mdF)Yu;uU762fbio;>mmiMEBNuU`u zXc}HMp%e5y3x%$@%0-|zayCqtYBxkuk$N{i#BVOr2N zO`O8yXy{KS@cvTT)0gvbLoH--FiZln?L&e#>u# zjw67-^!Nq80CmI$!}@%>`MYL(UHA$x#1o`eV^5dc+BZQoD%JB3Gx?5&N7Qu#$?<6(tojj@GS z{FeW5;1R|P6}+~`v01_5!OuV7_VzaF06L}k(<^^gu#H^bcfNJfwT*`SVzGqT%X7+J z<0_m>TFpybV^YymY}M4Ji3)4s;Z(`EJ3FfmSu0Nk6-W@K(R|u z>=NeQdShFi=dWH>R8__7I(xHN&IF8}~0 z#t&{e&{iS7S4%*-bpBNrfT+>S;0l)tdGI>E?13LV@t7M9hw3@H7j3+ngyzRrwR-)oEQyZt z0gx1&{nw(0-fkbzH4TIiMClzRqm+OU;!#{~+s)5l+QBy~AAj_i*aM2i#@k