diff --git a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 index f5410b4..db42430 100644 --- a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 +++ b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 @@ -1,2 +1,2 @@ -// 1.21.1 2026-09-24T20:44:08.113617763 Languages: en_us for mod: masterwild -bc1348c0de456980c9dffa05ec88d850c40023dc assets/masterwild/lang/en_us.json +// 1.21.1 2026-09-25T19:36:39.156620797 Languages: en_us for mod: masterwild +f81158e4a20d69009ce5a66a70dbbe04fe341d75 assets/masterwild/lang/en_us.json diff --git a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 index 177f11a..bc7fcaf 100644 --- a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 +++ b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 @@ -1,5 +1,6 @@ -// 1.21.1 2026-09-24T20:03:49.185849858 Item Models: masterwild +// 1.21.1 2026-09-25T19:33:29.007094425 Item Models: masterwild 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/firefly_spawn_egg.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/hedgehog_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/pinguin_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/rooster_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/shark_spawn_egg.json diff --git a/src/generated/resources/assets/masterwild/lang/en_us.json b/src/generated/resources/assets/masterwild/lang/en_us.json index e402faf..a3e7793 100644 --- a/src/generated/resources/assets/masterwild/lang/en_us.json +++ b/src/generated/resources/assets/masterwild/lang/en_us.json @@ -1,10 +1,12 @@ { "creativetab.masterwild.masterwild": "MasterWild", "entity.masterwild.firefly": "Firefly", + "entity.masterwild.hedgehog": "Hedgehog", "entity.masterwild.pinguin": "Pinguin", "entity.masterwild.rooster": "Rooster", "entity.masterwild.shark": "Shark", "item.masterwild.firefly_spawn_egg": "Firefly Spawn Egg", + "item.masterwild.hedgehog_spawn_egg": "Hedgehog Spawn Egg", "item.masterwild.pinguin_spawn_egg": "Pinguin Spawn Egg", "item.masterwild.rooster_spawn_egg": "Rooster Spawn Egg", "item.masterwild.shark_spawn_egg": "Shark Spawn Egg", diff --git a/src/generated/resources/assets/masterwild/models/item/hedgehog_spawn_egg.json b/src/generated/resources/assets/masterwild/models/item/hedgehog_spawn_egg.json new file mode 100644 index 0000000..d1aaa9d --- /dev/null +++ b/src/generated/resources/assets/masterwild/models/item/hedgehog_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java b/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java index 2702475..68fd32b 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java @@ -28,6 +28,7 @@ public class ModCreativeModeTabs { output.accept(ModItems.FIREFLY_SPAWN_EGG); output.accept(ModItems.ROOSTER_SPAWN_EGG); output.accept(ModItems.SHARK_SPAWN_EGG); + output.accept(ModItems.HEDGEHOG_SPAWN_EGG); }).build()); diff --git a/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java b/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java index c8b5daa..3a6e0d1 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java @@ -26,6 +26,9 @@ public class ModItems { public static final DeferredItem SHARK_SPAWN_EGG = ITEMS.register("shark_spawn_egg", () -> new DeferredSpawnEggItem(ModEntities.SHARK, 0x1d598b, 0x8daec4, new Item.Properties())); + public static final DeferredItem HEDGEHOG_SPAWN_EGG = ITEMS.register("hedgehog_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.HEDGEHOG, 0x372a21, 0x8f8973, + new Item.Properties())); public static void register(IEventBus eventBus) { ITEMS.register(eventBus); diff --git a/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java b/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java index f4a55bf..3c4550f 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java @@ -23,6 +23,7 @@ import ovh.glitchlabs.masterwild.entity.client.Pinguin.PinguinRenderer; import ovh.glitchlabs.masterwild.entity.client.Rooster.RoosterRenderer; import ovh.glitchlabs.masterwild.entity.client.Shark.SharkRenderer; import ovh.glitchlabs.masterwild.entity.client.firefly.FireflyRenderer; +import ovh.glitchlabs.masterwild.entity.client.hedgehog.HedgehogRenderer; // The value here should match an entry in the META-INF/neoforge.mods.toml file @Mod(Masterwild.MODID) @@ -74,6 +75,7 @@ public class Masterwild { EntityRenderers.register(ModEntities.FIREFLY.get(), FireflyRenderer::new); EntityRenderers.register(ModEntities.ROOSTER.get(), RoosterRenderer::new); EntityRenderers.register(ModEntities.SHARK.get(), SharkRenderer::new); + EntityRenderers.register(ModEntities.HEDGEHOG.get(), HedgehogRenderer::new); } } } diff --git a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java index de25116..1a79e9f 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java @@ -18,5 +18,6 @@ public class ModItemModelProvider extends ItemModelProvider { withExistingParent(ModItems.FIREFLY_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); withExistingParent(ModItems.ROOSTER_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); withExistingParent(ModItems.SHARK_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + withExistingParent(ModItems.HEDGEHOG_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); } } \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java index 49ac9b2..3ae6a32 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java @@ -18,11 +18,13 @@ public class ModLanguageProvider extends LanguageProvider { add(ModEntities.FIREFLY.get(), "Firefly"); add(ModEntities.ROOSTER.get(), "Rooster"); add(ModEntities.SHARK.get(), "Shark"); + add(ModEntities.HEDGEHOG.get(), "Hedgehog"); add(ModItems.PINGUIN_SPAWN_EGG.get(), "Pinguin Spawn Egg"); add(ModItems.FIREFLY_SPAWN_EGG.get(), "Firefly Spawn Egg"); add(ModItems.ROOSTER_SPAWN_EGG.get(), "Rooster Spawn Egg"); add(ModItems.SHARK_SPAWN_EGG.get(), "Shark Spawn Egg"); + add(ModItems.HEDGEHOG_SPAWN_EGG.get(), "Hedgehog Spawn Egg"); add("creativetab.masterwild.masterwild", "MasterWild"); add("subtitles.masterwild.rooster_crow", "Rooster crows"); diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java b/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java index dfca25d..c4e4a30 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java @@ -6,10 +6,7 @@ import net.minecraft.world.entity.MobCategory; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredRegister; import ovh.glitchlabs.masterwild.Masterwild; -import ovh.glitchlabs.masterwild.entity.custom.FireflyEntity; -import ovh.glitchlabs.masterwild.entity.custom.PinguinEntity; -import ovh.glitchlabs.masterwild.entity.custom.RoosterEntity; -import ovh.glitchlabs.masterwild.entity.custom.SharkEntity; +import ovh.glitchlabs.masterwild.entity.custom.*; import java.util.function.Supplier; @@ -33,6 +30,10 @@ public class ModEntities { ENTITY_TYPES.register("shark", () -> EntityType.Builder.of(SharkEntity::new, MobCategory.WATER_CREATURE) .sized(1.6f, 0.8f).build("shark")); + public static final Supplier> HEDGEHOG = + ENTITY_TYPES.register("hedgehog", () -> EntityType.Builder.of(HedgehogEntity::new, MobCategory.CREATURE) + .sized(0.5f, 0.4f).build("hedgehog")); + public static void register(IEventBus eventBus) { diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/hedgehog/HedgehogAnimation.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/hedgehog/HedgehogAnimation.java new file mode 100755 index 0000000..d1901d5 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/hedgehog/HedgehogAnimation.java @@ -0,0 +1,58 @@ +package ovh.glitchlabs.masterwild.entity.client.hedgehog;// Save this class in your mod and generate all required imports + +import net.minecraft.client.animation.AnimationChannel; +import net.minecraft.client.animation.AnimationDefinition; +import net.minecraft.client.animation.Keyframe; +import net.minecraft.client.animation.KeyframeAnimations; + +/** + * Made with Blockbench 5.2.0 + * Exported for Minecraft version 1.19 or later with Mojang mappings + * @author Author + */ +public class HedgehogAnimation { + public static final AnimationDefinition hedgehog_walking = AnimationDefinition.Builder.withLength(0.75F).looping() + .addAnimation("body2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.25F, KeyframeAnimations.degreeVec(0.0F, 0.0F, -2.5F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 3.33F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.75F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("body2", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.75F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("body2", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.75F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("R", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.75F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("R", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.375F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5417F, KeyframeAnimations.posVec(0.0F, 0.25F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.75F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("R", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.75F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("L", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.75F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("L", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.2083F, KeyframeAnimations.posVec(0.0F, 0.25F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.375F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.75F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("L", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.75F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .build(); +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/hedgehog/HedgehogModel.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/hedgehog/HedgehogModel.java new file mode 100755 index 0000000..b6c9886 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/hedgehog/HedgehogModel.java @@ -0,0 +1,176 @@ +package ovh.glitchlabs.masterwild.entity.client.hedgehog;// Made with Blockbench 5.2.0 +// Exported for Minecraft version 1.17 or later with Mojang mappings +// Paste this class into your mod and generate all required imports + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import ovh.glitchlabs.masterwild.Masterwild; +import ovh.glitchlabs.masterwild.entity.client.Pinguin.PinguinAnimation; +import ovh.glitchlabs.masterwild.entity.custom.HedgehogEntity; +import ovh.glitchlabs.masterwild.entity.custom.PinguinEntity; +import ovh.glitchlabs.masterwild.entity.custom.RoosterEntity; + +public class HedgehogModel extends HierarchicalModel { + // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor + public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "hedgehog"), "main"); + private final ModelPart Hedgehog; + private final ModelPart body; + private final ModelPart legs; + private final ModelPart L; + private final ModelPart R; + private final ModelPart body2; + private final ModelPart spikes; + private final ModelPart ears; + private final ModelPart nose; + + public HedgehogModel(ModelPart root) { + this.Hedgehog = root.getChild("Hedgehog"); + this.body = this.Hedgehog.getChild("body"); + this.legs = this.body.getChild("legs"); + this.L = this.legs.getChild("L"); + this.R = this.legs.getChild("R"); + this.body2 = this.body.getChild("body2"); + this.spikes = this.body2.getChild("spikes"); + this.ears = this.body2.getChild("ears"); + this.nose = this.body2.getChild("nose"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition Hedgehog = partdefinition.addOrReplaceChild("Hedgehog", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F)); + + PartDefinition body = Hedgehog.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition legs = body.addOrReplaceChild("legs", CubeListBuilder.create(), PartPose.offset(1.75F, 0.0F, 3.75F)); + + PartDefinition L = legs.addOrReplaceChild("L", CubeListBuilder.create().texOffs(8, 16).addBox(-1.0F, -0.5F, 1.75F, 2.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(8, 13).addBox(-1.0F, -0.5F, -3.75F, 2.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -0.5F, -2.75F)); + + PartDefinition R = legs.addOrReplaceChild("R", CubeListBuilder.create().texOffs(16, 13).addBox(-1.0F, -0.5F, -3.75F, 2.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(16, 16).addBox(-1.0F, -0.5F, 1.75F, 2.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(-3.5F, -0.5F, -2.75F)); + + PartDefinition body2 = body.addOrReplaceChild("body2", CubeListBuilder.create().texOffs(0, 0).addBox(-3.0F, -5.5F, -3.0F, 6.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition spikes = body2.addOrReplaceChild("spikes", CubeListBuilder.create(), PartPose.offset(2.75F, -1.0F, 1.5F)); + + PartDefinition cube_r1 = spikes.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(8, 25).addBox(-1.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(22, 24).addBox(-3.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(0, 25).addBox(1.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.25F, -4.5F, -4.0F, -1.3526F, 0.0F, 0.0F)); + + PartDefinition cube_r2 = spikes.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(6, 25).addBox(-1.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(20, 24).addBox(1.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(24, 22).addBox(-3.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.25F, -4.5F, -2.0F, -1.3526F, 0.0F, 0.0F)); + + PartDefinition cube_r3 = spikes.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(4, 25).addBox(-1.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(24, 23).addBox(-3.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(24, 20).addBox(1.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.25F, -4.5F, 0.0F, -1.3526F, 0.0F, 0.0F)); + + PartDefinition cube_r4 = spikes.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(2, 25).addBox(-1.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(24, 21).addBox(1.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(24, 24).addBox(-3.0F, -1.0F, 0.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.25F, -4.5F, 2.0F, -1.3526F, 0.0F, 0.0F)); + + PartDefinition cube_r5 = spikes.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(24, 17).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-3.25F, -3.0F, 3.5F, 1.5708F, -0.3927F, -1.5708F)); + + PartDefinition cube_r6 = spikes.addOrReplaceChild("cube_r6", CubeListBuilder.create().texOffs(24, 16).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-3.25F, -1.5F, 3.5F, 1.5708F, -0.3927F, -1.5708F)); + + PartDefinition cube_r7 = spikes.addOrReplaceChild("cube_r7", CubeListBuilder.create().texOffs(16, 24).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-3.25F, 0.0F, 3.5F, 1.5708F, -0.3927F, -1.5708F)); + + PartDefinition cube_r8 = spikes.addOrReplaceChild("cube_r8", CubeListBuilder.create().texOffs(12, 23).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, 0.0F, 3.5F, 1.4814F, 0.3829F, 1.3353F)); + + PartDefinition cube_r9 = spikes.addOrReplaceChild("cube_r9", CubeListBuilder.create().texOffs(24, 18).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -1.5F, 3.5F, 1.4814F, 0.3829F, 1.3353F)); + + PartDefinition cube_r10 = spikes.addOrReplaceChild("cube_r10", CubeListBuilder.create().texOffs(20, 23).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -3.0F, 3.5F, 1.4814F, 0.3829F, 1.3353F)); + + PartDefinition cube_r11 = spikes.addOrReplaceChild("cube_r11", CubeListBuilder.create().texOffs(0, 23).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.25F, 0.0F, 3.5F, 1.4814F, -0.3829F, -1.3353F)); + + PartDefinition cube_r12 = spikes.addOrReplaceChild("cube_r12", CubeListBuilder.create().texOffs(4, 24).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.25F, -1.5F, 3.5F, 1.4814F, -0.3829F, -1.3353F)); + + PartDefinition cube_r13 = spikes.addOrReplaceChild("cube_r13", CubeListBuilder.create().texOffs(16, 23).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.25F, -3.0F, 3.5F, 1.4814F, -0.3829F, -1.3353F)); + + PartDefinition cube_r14 = spikes.addOrReplaceChild("cube_r14", CubeListBuilder.create().texOffs(24, 14).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, -3.0F, -3.0F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r15 = spikes.addOrReplaceChild("cube_r15", CubeListBuilder.create().texOffs(12, 19).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, -3.0F, -1.5F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r16 = spikes.addOrReplaceChild("cube_r16", CubeListBuilder.create().texOffs(12, 20).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, -3.0F, 0.0F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r17 = spikes.addOrReplaceChild("cube_r17", CubeListBuilder.create().texOffs(4, 20).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, -3.0F, 1.5F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r18 = spikes.addOrReplaceChild("cube_r18", CubeListBuilder.create().texOffs(4, 23).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, -3.0F, 3.0F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r19 = spikes.addOrReplaceChild("cube_r19", CubeListBuilder.create().texOffs(20, 22).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, -1.5F, 3.0F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r20 = spikes.addOrReplaceChild("cube_r20", CubeListBuilder.create().texOffs(16, 22).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, -1.5F, 1.5F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r21 = spikes.addOrReplaceChild("cube_r21", CubeListBuilder.create().texOffs(12, 22).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, -1.5F, 0.0F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r22 = spikes.addOrReplaceChild("cube_r22", CubeListBuilder.create().texOffs(8, 22).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, -1.5F, -1.5F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r23 = spikes.addOrReplaceChild("cube_r23", CubeListBuilder.create().texOffs(12, 21).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, 0.0F, 0.0F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r24 = spikes.addOrReplaceChild("cube_r24", CubeListBuilder.create().texOffs(8, 21).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, 0.0F, 1.5F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r25 = spikes.addOrReplaceChild("cube_r25", CubeListBuilder.create().texOffs(4, 21).addBox(-1.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, 0.0F, 3.0F, 0.0F, 0.3491F, 1.1781F)); + + PartDefinition cube_r26 = spikes.addOrReplaceChild("cube_r26", CubeListBuilder.create().texOffs(4, 22).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -3.0F, 3.0F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r27 = spikes.addOrReplaceChild("cube_r27", CubeListBuilder.create().texOffs(0, 22).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -3.0F, 1.5F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r28 = spikes.addOrReplaceChild("cube_r28", CubeListBuilder.create().texOffs(20, 21).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -3.0F, 0.0F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r29 = spikes.addOrReplaceChild("cube_r29", CubeListBuilder.create().texOffs(24, 15).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -3.0F, -1.5F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r30 = spikes.addOrReplaceChild("cube_r30", CubeListBuilder.create().texOffs(16, 21).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -3.0F, -3.0F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r31 = spikes.addOrReplaceChild("cube_r31", CubeListBuilder.create().texOffs(0, 21).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5F, -1.5F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r32 = spikes.addOrReplaceChild("cube_r32", CubeListBuilder.create().texOffs(20, 20).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5F, 0.0F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r33 = spikes.addOrReplaceChild("cube_r33", CubeListBuilder.create().texOffs(20, 19).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5F, 1.5F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r34 = spikes.addOrReplaceChild("cube_r34", CubeListBuilder.create().texOffs(16, 20).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5F, 3.0F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r35 = spikes.addOrReplaceChild("cube_r35", CubeListBuilder.create().texOffs(4, 19).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 3.0F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r36 = spikes.addOrReplaceChild("cube_r36", CubeListBuilder.create().texOffs(8, 19).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 1.5F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition cube_r37 = spikes.addOrReplaceChild("cube_r37", CubeListBuilder.create().texOffs(16, 19).addBox(0.0F, 0.0F, -1.0F, 1.0F, 0.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, -0.3491F, -1.1781F)); + + PartDefinition ears = body2.addOrReplaceChild("ears", CubeListBuilder.create(), PartPose.offset(3.0F, -2.5F, -3.0F)); + + PartDefinition cube_r38 = ears.addOrReplaceChild("cube_r38", CubeListBuilder.create().texOffs(4, 17).addBox(-1.0F, -2.0F, 1.0F, 2.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.9F, 0.0F, 0.0F, 0.0F, 0.0F, -0.0873F)); + + PartDefinition cube_r39 = ears.addOrReplaceChild("cube_r39", CubeListBuilder.create().texOffs(0, 19).addBox(-1.0F, -2.0F, 1.0F, 2.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.1F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0873F)); + + PartDefinition nose = body2.addOrReplaceChild("nose", CubeListBuilder.create().texOffs(0, 17).addBox(-1.0F, -1.0F, 0.25F, 1.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(0, 13).addBox(-1.5F, -0.5F, 0.5F, 2.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.5F, -2.0F, -5.5F)); + + return LayerDefinition.create(meshdefinition, 32, 32); + } + + @Override + public void setupAnim(HedgehogEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts().forEach(ModelPart::resetPose); + this.animateWalk(HedgehogAnimation.hedgehog_walking, limbSwing, limbSwingAmount, 2f, 2.5f); + + } + + public ModelPart root() { + return Hedgehog; + } + + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + Hedgehog.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/hedgehog/HedgehogRenderer.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/hedgehog/HedgehogRenderer.java new file mode 100644 index 0000000..cad04a4 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/hedgehog/HedgehogRenderer.java @@ -0,0 +1,22 @@ +package ovh.glitchlabs.masterwild.entity.client.hedgehog; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import ovh.glitchlabs.masterwild.Masterwild; +import ovh.glitchlabs.masterwild.entity.custom.HedgehogEntity; + +public class HedgehogRenderer extends MobRenderer> { + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/hedgehog.png"); + + public HedgehogRenderer(EntityRendererProvider.Context context) { + super(context, new HedgehogModel<>(context.bakeLayer(HedgehogModel.LAYER_LOCATION)), 0.8f); + } + + @Override + public ResourceLocation getTextureLocation(HedgehogEntity entity) { + return TEXTURE; + } + +} diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/HedgehogEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/HedgehogEntity.java new file mode 100644 index 0000000..9cc533f --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/HedgehogEntity.java @@ -0,0 +1,80 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.AnimationState; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.entity.ModEntities; + +public class HedgehogEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(Items.SWEET_BERRIES, Items.APPLE); + public final AnimationState walkingAnimationState = new AnimationState(); + + public HedgehogEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 8) + .add(Attributes.MOVEMENT_SPEED, 0.2) + .add(Attributes.FOLLOW_RANGE, 8) + .add(Attributes.KNOCKBACK_RESISTANCE, 0.3) + .add(Attributes.STEP_HEIGHT, 0.6); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new BreedGoal(this, 1.0)); + this.goalSelector.addGoal(2, new TemptGoal(this, 1.1, FOOD, false)); + this.goalSelector.addGoal(3, new FollowParentGoal(this, 1.1)); + this.goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 0.8)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return ModEntities.HEDGEHOG.get().create(level); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.FOX_SNIFF; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.RABBIT_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.RABBIT_DEATH; + } + + + +} diff --git a/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java b/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java index 47681fe..91fdd32 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java +++ b/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java @@ -10,10 +10,8 @@ import ovh.glitchlabs.masterwild.entity.client.Pinguin.PinguinModel; import ovh.glitchlabs.masterwild.entity.client.Rooster.RoosterModel; import ovh.glitchlabs.masterwild.entity.client.Shark.SharkModel; import ovh.glitchlabs.masterwild.entity.client.firefly.FireflyModel; -import ovh.glitchlabs.masterwild.entity.custom.FireflyEntity; -import ovh.glitchlabs.masterwild.entity.custom.PinguinEntity; -import ovh.glitchlabs.masterwild.entity.custom.RoosterEntity; -import ovh.glitchlabs.masterwild.entity.custom.SharkEntity; +import ovh.glitchlabs.masterwild.entity.client.hedgehog.HedgehogModel; +import ovh.glitchlabs.masterwild.entity.custom.*; @EventBusSubscriber(modid = Masterwild.MODID, bus = EventBusSubscriber.Bus.MOD) public class ModEventBusEvents { @@ -23,6 +21,7 @@ public class ModEventBusEvents { event.registerLayerDefinition(FireflyModel.LAYER_LOCATION, FireflyModel::createBodyLayer); event.registerLayerDefinition(RoosterModel.LAYER_LOCATION, RoosterModel::createBodyLayer); event.registerLayerDefinition(SharkModel.LAYER_LOCATION, SharkModel::createBodyLayer); + event.registerLayerDefinition(HedgehogModel.LAYER_LOCATION, HedgehogModel::createBodyLayer); } @SubscribeEvent @@ -31,5 +30,6 @@ public class ModEventBusEvents { event.put(ModEntities.FIREFLY.get(), FireflyEntity.createAttributes().build()); event.put(ModEntities.ROOSTER.get(), RoosterEntity.createAttributes().build()); event.put(ModEntities.SHARK.get(), SharkEntity.createAttributes().build()); + event.put(ModEntities.HEDGEHOG.get(), HedgehogEntity.createAttributes().build()); } } diff --git a/src/main/resources/assets/masterwild/textures/entity/hedgehog.png b/src/main/resources/assets/masterwild/textures/entity/hedgehog.png new file mode 100755 index 0000000..5d95647 Binary files /dev/null and b/src/main/resources/assets/masterwild/textures/entity/hedgehog.png differ