From 7a78ce79341476d1889202dd4aaf0eda140e9b56 Mon Sep 17 00:00:00 2001 From: ian1337 Date: Sun, 27 Sep 2026 17:17:30 +0200 Subject: [PATCH] [add] Butterfly --- gradle.properties | 2 +- .../6143fb1502ae754d8039ff811e28c49eaa7e6409 | 4 +- .../d1416cf72769a6a520cc2c44944968403e1a0de7 | 3 +- .../assets/masterwild/lang/en_us.json | 2 + .../models/item/butterfly_spawn_egg.json | 3 + .../masterwild/Item/ModCreativeModeTabs.java | 1 + .../glitchlabs/masterwild/Item/ModItems.java | 3 + .../ovh/glitchlabs/masterwild/Masterwild.java | 2 + .../datagen/ModItemModelProvider.java | 1 + .../datagen/ModLanguageProvider.java | 2 + .../masterwild/entity/ButterflyVariants.java | 30 ++++ .../masterwild/entity/ModEntities.java | 4 + .../client/butterfly/ButterflyAnimation.java | 25 +++ .../client/butterfly/ButterflyModel.java | 68 ++++++++ .../client/butterfly/ButterflyRenderer.java | 38 +++++ .../entity/custom/ButterflyEntity.java | 157 ++++++++++++++++++ .../masterwild/event/ModEventBusEvents.java | 3 + .../entity/butterfly/butterfly_blue.png | Bin 0 -> 866 bytes .../entity/butterfly/butterfly_green.png | Bin 0 -> 820 bytes .../entity/butterfly/butterfly_orange.png | Bin 0 -> 849 bytes .../entity/butterfly/butterfly_purple.png | Bin 0 -> 1044 bytes .../entity/butterfly/butterfly_red.png | Bin 0 -> 872 bytes 22 files changed, 344 insertions(+), 4 deletions(-) create mode 100644 src/generated/resources/assets/masterwild/models/item/butterfly_spawn_egg.json create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/ButterflyVariants.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyAnimation.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyModel.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyRenderer.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/custom/ButterflyEntity.java create mode 100755 src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_blue.png create mode 100755 src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_green.png create mode 100755 src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_orange.png create mode 100755 src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_purple.png create mode 100755 src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_red.png diff --git a/gradle.properties b/gradle.properties index 027c6e6..3ea005a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,7 +29,7 @@ mod_name=MasterWild # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=All Rights Reserved # The mod version. See https://semver.org/ -mod_version=0.0.3 +mod_version=0.1.0 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 index f7ad3e2..d83ff05 100644 --- a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 +++ b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 @@ -1,2 +1,2 @@ -// 1.21.1 2026-09-27T16:06:01.795292292 Languages: en_us for mod: masterwild -4f76fe45831966497404b3a30093fe7292f6feec assets/masterwild/lang/en_us.json +// 1.21.1 2026-09-27T17:00:27.22897813 Languages: en_us for mod: masterwild +ebd07de03f9ce5f9b4a4e4fbf79b5da4377bb20d assets/masterwild/lang/en_us.json diff --git a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 index 7eb0f19..9403a9e 100644 --- a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 +++ b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 @@ -1,6 +1,7 @@ -// 1.21.1 2026-09-27T16:05:50.332247948 Item Models: masterwild +// 1.21.1 2026-09-27T17:02:03.242230507 Item Models: masterwild a92e1a88c1d3c3c04b2b001f0bffd19a1f3462f0 assets/masterwild/models/item/banana.json 8cb5b876c97ae89d180a200612d0d14c8456c2f7 assets/masterwild/models/item/banana_peel.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/butterfly_spawn_egg.json 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 diff --git a/src/generated/resources/assets/masterwild/lang/en_us.json b/src/generated/resources/assets/masterwild/lang/en_us.json index ccfe978..1403130 100644 --- a/src/generated/resources/assets/masterwild/lang/en_us.json +++ b/src/generated/resources/assets/masterwild/lang/en_us.json @@ -1,5 +1,6 @@ { "creativetab.masterwild.masterwild": "MasterWild", + "entity.masterwild.butterfly": "Butterfly", "entity.masterwild.firefly": "Firefly", "entity.masterwild.hedgehog": "Hedgehog", "entity.masterwild.pinguin": "Pinguin", @@ -8,6 +9,7 @@ "entity.masterwild.shark": "Shark", "item.masterwild.banana": "Banana", "item.masterwild.banana_peel": "Banana Peel", + "item.masterwild.butterfly_spawn_egg": "Butterfly Spawn Egg", "item.masterwild.firefly_spawn_egg": "Firefly Spawn Egg", "item.masterwild.hedgehog_spawn_egg": "Hedgehog Spawn Egg", "item.masterwild.pinguin_spawn_egg": "Pinguin Spawn Egg", diff --git a/src/generated/resources/assets/masterwild/models/item/butterfly_spawn_egg.json b/src/generated/resources/assets/masterwild/models/item/butterfly_spawn_egg.json new file mode 100644 index 0000000..d1aaa9d --- /dev/null +++ b/src/generated/resources/assets/masterwild/models/item/butterfly_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 27502a1..7ae1214 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.SHARK_SPAWN_EGG); output.accept(ModItems.HEDGEHOG_SPAWN_EGG); output.accept(ModItems.RED_PANDA_SPAWN_EGG); + output.accept(ModItems.BUTTERFLY_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 c1ec9a8..40868f5 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java @@ -43,6 +43,9 @@ public class ModItems { public static final DeferredItem RED_PANDA_SPAWN_EGG = ITEMS.register("red-panda_spawn_egg", () -> new DeferredSpawnEggItem(ModEntities.RED_PANDA, 0x923918, 0x211b1b, new Item.Properties())); + public static final DeferredItem BUTTERFLY_SPAWN_EGG = ITEMS.register("butterfly_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.BUTTERFLY, 0x923918, 0x0b0b17, + 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 8f06943..f885663 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java @@ -22,6 +22,7 @@ import ovh.glitchlabs.masterwild.entity.ModEntities; 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.butterfly.ButterflyRenderer; import ovh.glitchlabs.masterwild.entity.client.firefly.FireflyRenderer; import ovh.glitchlabs.masterwild.entity.client.hedgehog.HedgehogRenderer; import ovh.glitchlabs.masterwild.entity.client.red_panda.Red_PandaRenderer; @@ -78,6 +79,7 @@ public class Masterwild { EntityRenderers.register(ModEntities.SHARK.get(), SharkRenderer::new); EntityRenderers.register(ModEntities.HEDGEHOG.get(), HedgehogRenderer::new); EntityRenderers.register(ModEntities.RED_PANDA.get(), Red_PandaRenderer::new); + EntityRenderers.register(ModEntities.BUTTERFLY.get(), ButterflyRenderer::new); } } } diff --git a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java index 9481943..2fe8666 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java @@ -27,5 +27,6 @@ public class ModItemModelProvider extends ItemModelProvider { withExistingParent(ModItems.SHARK_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); withExistingParent(ModItems.HEDGEHOG_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); withExistingParent(ModItems.RED_PANDA_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + withExistingParent(ModItems.BUTTERFLY_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 9281e08..6815eff 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java @@ -23,6 +23,7 @@ public class ModLanguageProvider extends LanguageProvider { add(ModEntities.SHARK.get(), "Shark"); add(ModEntities.HEDGEHOG.get(), "Hedgehog"); add(ModEntities.RED_PANDA.get(), "Red Panda"); + add(ModEntities.BUTTERFLY.get(), "Butterfly"); add(ModItems.PINGUIN_SPAWN_EGG.get(), "Pinguin Spawn Egg"); add(ModItems.FIREFLY_SPAWN_EGG.get(), "Firefly Spawn Egg"); @@ -30,6 +31,7 @@ public class ModLanguageProvider extends LanguageProvider { add(ModItems.SHARK_SPAWN_EGG.get(), "Shark Spawn Egg"); add(ModItems.HEDGEHOG_SPAWN_EGG.get(), "Hedgehog Spawn Egg"); add(ModItems.RED_PANDA_SPAWN_EGG.get(), "Red Panda Spawn Egg"); + add(ModItems.BUTTERFLY_SPAWN_EGG.get(), "Butterfly Spawn Egg"); add("creativetab.masterwild.masterwild", "MasterWild"); add("subtitles.masterwild.rooster_crow", "Rooster crows"); diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/ButterflyVariants.java b/src/main/java/ovh/glitchlabs/masterwild/entity/ButterflyVariants.java new file mode 100644 index 0000000..47eaeac --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/ButterflyVariants.java @@ -0,0 +1,30 @@ +package ovh.glitchlabs.masterwild.entity; + +import java.util.Arrays; +import java.util.Comparator; + +public enum ButterflyVariants { + PURLE(0), + BLUE(1), + RED(2), + ORANGE(3), + GREEN(4), + ; + + + private static final ButterflyVariants[] BY_ID = Arrays.stream(values()).sorted( + Comparator.comparingInt(ButterflyVariants::getId)).toArray(ButterflyVariants[]::new); + private final int id; + + ButterflyVariants(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public static ButterflyVariants byId(int id) { + return BY_ID[id % BY_ID.length]; + } +} diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java b/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java index 9461d6b..f0162f1 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java @@ -38,6 +38,10 @@ public class ModEntities { ENTITY_TYPES.register("red_panda", () -> EntityType.Builder.of(Red_PandaEntity::new, MobCategory.CREATURE) .sized(0.6f, 0.7f).build("red_panda")); + public static final Supplier> BUTTERFLY = + ENTITY_TYPES.register("butterfly", () -> EntityType.Builder.of(ButterflyEntity::new, MobCategory.AMBIENT) + .sized(0.6f, 0.7f).build("butterfly")); + public static void register(IEventBus eventBus) { ENTITY_TYPES.register(eventBus); diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyAnimation.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyAnimation.java new file mode 100755 index 0000000..c0bf2a7 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyAnimation.java @@ -0,0 +1,25 @@ +package ovh.glitchlabs.masterwild.entity.client.butterfly;// 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 ButterflyAnimation { + public static final AnimationDefinition Butterfly_flaps = AnimationDefinition.Builder.withLength(0.25F).looping() + .addAnimation("L_wings", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, -45.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.125F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 45.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.25F, KeyframeAnimations.degreeVec(0.0F, 0.0F, -45.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("R_wings", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 45.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.125F, KeyframeAnimations.degreeVec(0.0F, 0.0F, -45.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.25F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 45.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .build(); +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyModel.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyModel.java new file mode 100755 index 0000000..743e246 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyModel.java @@ -0,0 +1,68 @@ +package ovh.glitchlabs.masterwild.entity.client.butterfly;// 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 net.minecraft.world.entity.AnimationState; +import ovh.glitchlabs.masterwild.Masterwild; +import ovh.glitchlabs.masterwild.entity.custom.ButterflyEntity; + +public class ButterflyModel 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, "butterfly"), "main"); + private final ModelPart Butterfly; + private final ModelPart body; + private final ModelPart L_wings; + private final ModelPart R_wings; + + public ButterflyModel(ModelPart root) { + this.Butterfly = root.getChild("Butterfly"); + this.body = this.Butterfly.getChild("body"); + this.L_wings = this.Butterfly.getChild("L_wings"); + this.R_wings = this.Butterfly.getChild("R_wings"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition Butterfly = partdefinition.addOrReplaceChild("Butterfly", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F)); + + PartDefinition body = Butterfly.addOrReplaceChild("body", CubeListBuilder.create().texOffs(-5, 27).addBox(-1.5F, -2.0F, -4.5F, 3.0F, 0.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition cube_r1 = body.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(26, 32).addBox(-1.0F, -2.0F, -1.0F, 0.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(22, 32).addBox(-3.0F, -2.0F, -1.0F, 0.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.0F, -1.0F, -5.0F, -0.3927F, 0.0F, 0.0F)); + + PartDefinition L_wings = Butterfly.addOrReplaceChild("L_wings", CubeListBuilder.create().texOffs(0, 16).addBox(0.0F, 0.0F, -8.0F, 14.0F, 0.0F, 16.0F, new CubeDeformation(0.0F)), PartPose.offset(0.5F, -2.0F, 0.0F)); + + PartDefinition R_wings = Butterfly.addOrReplaceChild("R_wings", CubeListBuilder.create().texOffs(0, 0).addBox(-14.0F, 0.0F, -8.0F, 14.0F, 0.0F, 16.0F, new CubeDeformation(0.0F)), PartPose.offset(-0.5F, -2.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + @Override + public void setupAnim(ButterflyEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts(); + this.animate(entity.idleAnimationState, ButterflyAnimation.Butterfly_flaps, ageInTicks, 0.4f); + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + Butterfly.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + } + + @Override + public ModelPart root() { + return Butterfly; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyRenderer.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyRenderer.java new file mode 100644 index 0000000..e8bfa62 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/butterfly/ButterflyRenderer.java @@ -0,0 +1,38 @@ +package ovh.glitchlabs.masterwild.entity.client.butterfly; + +import com.google.common.collect.Maps; +import net.minecraft.Util; +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.ButterflyVariants; +import ovh.glitchlabs.masterwild.entity.custom.ButterflyEntity; + +import java.util.Map; + +public class ButterflyRenderer extends MobRenderer> { + + public static final Map LOCATION_BY_VARIANT = + Util.make(Maps.newEnumMap(ButterflyVariants.class), map -> { + map.put(ButterflyVariants.PURLE, + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/butterfly/butterfly_purple.png")); + map.put(ButterflyVariants.BLUE, + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/butterfly/butterfly_blue.png")); + map.put(ButterflyVariants.RED, + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/butterfly/butterfly_red.png")); + map.put(ButterflyVariants.ORANGE, + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/butterfly/butterfly_orange.png")); + map.put(ButterflyVariants.GREEN, + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/butterfly/butterfly_green.png")); + }); + + public ButterflyRenderer(EntityRendererProvider.Context context) { + super(context, new ButterflyModel<>(context.bakeLayer(ButterflyModel.LAYER_LOCATION)), 0.1f); + } + + @Override + public ResourceLocation getTextureLocation(ButterflyEntity entity) { + return LOCATION_BY_VARIANT.get(entity.getVariant()); + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/ButterflyEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/ButterflyEntity.java new file mode 100644 index 0000000..8409452 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/ButterflyEntity.java @@ -0,0 +1,157 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.DifficultyInstance; +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.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.entity.ButterflyVariants; + +public class ButterflyEntity extends Animal { + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(ButterflyEntity.class, EntityDataSerializers.INT); + + public final AnimationState idleAnimationState = new AnimationState(); + private BlockPos targetPosition; + + public ButterflyEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MOVEMENT_SPEED, 0.4) + .add(Attributes.MAX_HEALTH, 4) + .add(Attributes.ARMOR, 0) + .add(Attributes.ATTACK_DAMAGE, 0) + .add(Attributes.FOLLOW_RANGE, 4) + .add(Attributes.FLYING_SPEED, 0.3); + } + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + + if (this.targetPosition != null && (!this.level().isEmptyBlock(this.targetPosition) + || this.targetPosition.getY() <= this.level().getMinBuildHeight())) { + this.targetPosition = null; + } + + if (this.targetPosition == null || this.random.nextInt(30) == 0 + || this.targetPosition.closerToCenterThan(this.position(), 2.0)) { + this.targetPosition = BlockPos.containing( + this.getX() + this.random.nextInt(7) - this.random.nextInt(7), + this.getY() + this.random.nextInt(6) - 2.0, + this.getZ() + this.random.nextInt(7) - this.random.nextInt(7)); + } + + double dx = this.targetPosition.getX() + 0.5 - this.getX(); + double dy = this.targetPosition.getY() + 0.1 - this.getY(); + double dz = this.targetPosition.getZ() + 0.5 - this.getZ(); + + Vec3 motion = this.getDeltaMovement(); + Vec3 newMotion = motion.add( + (Math.signum(dx) * 0.25 - motion.x) * 0.1, + (Math.signum(dy) * 0.35 - motion.y) * 0.1, + (Math.signum(dz) * 0.25 - motion.z) * 0.1); + this.setDeltaMovement(newMotion); + + float targetYaw = (float) (Mth.atan2(newMotion.z, newMotion.x) * 180.0 / Math.PI) - 90.0F; + this.zza = 0.5F; + this.setYRot(this.getYRot() + Mth.wrapDegrees(targetYaw - this.getYRot())); + } + + @Override + public boolean isNoGravity() { + return true; + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + public boolean causeFallDamage(float fallDistance, float multiplier, DamageSource source) { + return false; + } + + @Override + protected void checkFallDamage(double y, boolean onGround, BlockState state, BlockPos pos) { + } + + @Override + public boolean isFood(ItemStack itemStack) { + return false; + } + + @Override + public @Nullable AgeableMob getBreedOffspring(ServerLevel serverLevel, AgeableMob ageableMob) { + return null; + } + + @Override + public void tick() { + super.tick(); + if (this.level().isClientSide()) { + this.idleAnimationState.startIfStopped(this.tickCount); + } + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT, 0); + } + + private int getTypeVariant() { + return this.entityData.get(VARIANT); + } + + public ButterflyVariants getVariant() { + return ButterflyVariants.byId(this.getTypeVariant() & 255); + } + + private void setVariant(ButterflyVariants variant) { + this.entityData.set(VARIANT, variant.getId() & 255); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("Variant", this.getTypeVariant()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.entityData.set(VARIANT, compound.getInt("Variant")); + } + + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, + MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + ButterflyVariants[] variants = ButterflyVariants.values(); + this.setVariant(variants[this.random.nextInt(variants.length)]); + return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java b/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java index a7facdb..49ade73 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java +++ b/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java @@ -9,6 +9,7 @@ import ovh.glitchlabs.masterwild.entity.ModEntities; 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.butterfly.ButterflyModel; import ovh.glitchlabs.masterwild.entity.client.firefly.FireflyModel; import ovh.glitchlabs.masterwild.entity.client.hedgehog.HedgehogModel; import ovh.glitchlabs.masterwild.entity.client.red_panda.Red_PandaModel; @@ -24,6 +25,7 @@ public class ModEventBusEvents { event.registerLayerDefinition(SharkModel.LAYER_LOCATION, SharkModel::createBodyLayer); event.registerLayerDefinition(HedgehogModel.LAYER_LOCATION, HedgehogModel::createBodyLayer); event.registerLayerDefinition(Red_PandaModel.LAYER_LOCATION, Red_PandaModel::createBodyLayer); + event.registerLayerDefinition(ButterflyModel.LAYER_LOCATION, ButterflyModel::createBodyLayer); } @SubscribeEvent @@ -34,5 +36,6 @@ public class ModEventBusEvents { event.put(ModEntities.SHARK.get(), SharkEntity.createAttributes().build()); event.put(ModEntities.HEDGEHOG.get(), HedgehogEntity.createAttributes().build()); event.put(ModEntities.RED_PANDA.get(), Red_PandaEntity.createAttributes().build()); + event.put(ModEntities.BUTTERFLY.get(), ButterflyEntity.createAttributes().build()); } } diff --git a/src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_blue.png b/src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_blue.png new file mode 100755 index 0000000000000000000000000000000000000000..4f339c9b135e4c5cea08c0acd49792ef8bfedbc9 GIT binary patch literal 866 zcmV-o1D*VdP)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;z<1S^!b67TP8N000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2kHqM4-PZi3@Z)*00O2-L_t(|+U=OJPZLob$3O3`^m^}lAVJ!}AVe2y4NVjh zQc^dSfneBl6c=_Kb#m63|HSHOmBHv>l!${`O*EuHMCe_wO7A&bh%l+alD79g$>ow8 z?vl^F_x-)!4~~c%g=ux|+?1ljFplCQ3x%ReTP|Dn2o&#ilmyZ44_wKYly7BtE63Qd z&cJR9c0G7@OLT&OL_1$TlfS6S&Uuh$L5_ko42>Fi)s9&KZ52=+xD2KQHwRWGdYH;U z!ih-+EZ-3b3Hx__!T~!Q69L8hic}ihen<#9kv3NW1w$DabwHXODWH8BF#SMb4TGD7 zV+y{DDE)&P2oVDT$^-ipNCyH1emzQm?*o|W7zhX(AlIS44x0jM@1wuJd|Sj~3(Ra+ zkc|!et&sAXgt`ZnMG>0}uvI|f>pSe78gKzBcRRBTw3GSVq?*f3C^VYh=X!oh-5j6p zy5;^~PJ)HPRrO7dAX6?2g<@ApICL_f9G_L62WKH+a=f`p&aWbyH6E>0L@WeQT2eS; zU}vDY4*n<1`U@^KRw=JM>39i;KL-rtqZZe6qGPWqX|?Lqo7Jw^0*4o1XF;h04Io1D z^z~yAn-Ki1Q$)RgDjm%NVkbbFQSU#L;oumkmj%>6M%S(f7E$l-W+9c0W&*Jgu>B_L z_5C^oL}6&VobaBRR_mW%?7FTB!;l~d zegK$OUlO2Cm>7n^&dyHvOo@}pWW2Y45WPFn|0@B8VZ>L!UIpmYO7KSkVHh5`Ycv{- sMx)VaG#ZUYqtR$I8jVJy(R3@n09R+rW*z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;z<1S^!b67TP8N000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2kHqM4-PlnVec0J00MYPL_t(|+U=OZPZL2Dhrii&yJg#L18E{iCFP(&;;AuF z1NPLr9>xEZ6G@|04<1Ym7Y`(rhE$}0P}!y19S>bdG#G1O$#(aB$z+o~?Ckr^o8Ox^ za7)~4zS7mk3r);0Zex;ab3+HVjWQ3RL99ejQBSb+bY1&7k3;J_XT}bAzz}#F{oIp~ zjWqaY4c*Cn0`nMhfEh|2#3utH6`*6b#sSX&R`}A2de%63K_3_^Kfk8MDZ-NRaK*@&wSr2|P9)oz9V5GlNE6($< zJjdt$HuM;u0ow7X|B(w&9X@AiSjIWd;_q$4>0hcsVl%+7=^bd!PhIxCcm^M-3GTKx z)xh)V9*yv~;u*Xk+#rjMm-=q=wVt;Bz7Y>tc(SSuvyZa#RGS-9CBn7MX|cYnyQLkl zU?x~*)~k>`x9Gfoqf#LN4K#Mx;SB*7EO&uB!F@XKS}OTlpcMA_nNWlo@Una8U@#S1 z;Q9xleAxB+zT2 zW(4@bWxwA)>rt}DcL9}QEd?3SLeWOy0X_KA@3K~2rB<9LqY5eVfEJ2V@b|zue!$Z3 zF(z{X7>1Ev0WK;)QY*nf y1qg!Rx2GTof*=TjAP9mW2!bF8f*=UOwDJp*SFf&N2&~Qk00004py`P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_orange.png b/src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_orange.png new file mode 100755 index 0000000000000000000000000000000000000000..04d072a23e106bad9c094ba7356a16a832530723 GIT binary patch literal 849 zcmV-X1FrmuP)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;z<1S^!b67TP8N000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2kHqM4-PC=1Sb0c00NasL_t(|+U?lOPZLoT$MNqx?o4NfX>0|Bjp5aeq6AH_ zAwgVNjel`tWZ_m9u&}UXVGSX%g~0SNbRO45CBe85gF~jB``Jv=MJM;ybMNW7a7R`e zZ{+IEwj^ityLib`qajV#=APE$^#-{LLCg9DPc}ECWsaCJPVl2HX$VOSA6wbK`zFjx z7yt6P^y57$3HSz-bQtQ;%TWbn8o*q%hmcSa;26I?6d;U(oB^Nq(2NAG?|PwwV-_TU z#$%*ogYSbO$fZmJkic9O7MH>E3l>1*Dbf*8cA+}EhFyXvg^NoFMg=$oV*?x)JQs$8 zHvJ(4zZNg_0t680U{zhpv-5O*9C6ZtFoxa3eDwd!12`2MRK!D$Ba3eLh~5C2t$Zy$ z+X^sj+Gl+R{TTBUKICxmnX7HpWv#v`QIzSova>B0-!>+$-2Y2QUVpJ7D_RfRu~=$M zRtUE~nb)5^k_-Ab^b!Q(KD}g~QEYMWWnU{q0Pok3GZr`&gee3GbhI)9W0ix?d$|wc z*8c-44wyO!Z9M0jKpb5VGMb1jaO(j6nC&GP34GmeX@xliuNY!H`#bjdE}#$JzSgTZJ#<3}mjrSa@vcEJ(jJAvsB;1bTl@v}c1&;FhZjt3ocVfrhe*+Sbr zL()yzVFL4O$ozr1Yp?00uY*kuImIr zFgdrxmSq)t3uxN(Ug_T`0A1IM8^BcunAT44*8tKq{q3nJilQirq9}@@D2k#eilQir bGO2z7x{%BGt(j1%00000NkvXXu0mjf$Nglh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_purple.png b/src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_purple.png new file mode 100755 index 0000000000000000000000000000000000000000..24888500b06163f232484f03456db8b9616d9a13 GIT binary patch literal 1044 zcmV+v1nc{WP)k{KghWxaimuvCK@c}>v2MDmzrsJDu3ftEhlmKJ;L@e2C?ds$ z729fQQ%##pzBae7@g2-X{Nvyrwi$WaC4Hi_6yY5nx@#VIbw|onjd|n3`G z-1))97pF+C7f5TFzDrd0K&b$d+gx<*BI%Xu6z9TYZIg_HamrM$$=2n2eyIRnY(Liy z4${a&tdjZvt`vPF$>TPB^1+tPu1n;l9=+68C z1GszT4ohs$yOtN8AKo85fX+o!-VY2QwKL~>e8#;#JU^NqNp6493s70Oms?-}8Sd>3 z?(yOE;rZeHsd9suqfXPq6MNJ)FaU#ldw6_ra(I9A0G3xjDE;&2l=>}f_+U>UR^5t?_vu#`B@C-z=TGtRbhik$UO1i-p08JYRXL~F}z5v8x zzJ?tufz!UJr!stIk)*f9ewd;s0PpkfZNnrUT6zMg)oPj-xFKxO6F}Gmck77&bQ3vi z$592GwI|-KH>!YcB7=S`ntxOQqQt^BKB|DQJyB6TQ3Z$+3)}dp0>bu0MfF4#AWAH3 z)nX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_red.png b/src/main/resources/assets/masterwild/textures/entity/butterfly/butterfly_red.png new file mode 100755 index 0000000000000000000000000000000000000000..458ca2032f519d82f7113f27e8385322fda4b895 GIT binary patch literal 872 zcmV-u1DE`XP)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;z<1S^!b67TP8N000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2kHqM4-POw1$wjq00OK@L_t(|+U?m(PZLoX#_|6-(-~%Z0otU>omxs08eO>2 z2r78X1Hy| zdCz+;gWZ!xxZjz zh8jSSMskABKJYmo=S#Mim8I>#hj8P4z&#{30tbnM#Kyz@cEL_xqARArjRW}8+1|qE z{YqIxrU_m$u;{0cBnjq;smKN3kYs48$RKG{RF=UqZFXsMfscuUT^c5fMHdy);*dJ)obxeb z@hO*~lCYxH1Q+qd=5dvG2b-+ctDMEmh#ril$5mk_r|$u@ut+2lp)F?_^})T?KEU(- z{h!=aDy4ki$93H%fYD=G0H!dIQgV8F+C8_#mSshI3J4M2EB$K)Af=3M0GBI3SXY9- y2H^Ytm8Yg@nx<)*rfHg{X_}^Knx<)5xB3ByRnI7O+$kpj0000