From 2e5c656b563adbb40d0eac7b3b67e55e5ee605af Mon Sep 17 00:00:00 2001 From: ian1337 Date: Sun, 27 Sep 2026 13:45:35 +0200 Subject: [PATCH] [add] Red Panda --- .../6143fb1502ae754d8039ff811e28c49eaa7e6409 | 4 +- .../d1416cf72769a6a520cc2c44944968403e1a0de7 | 3 +- .../assets/masterwild/lang/en_us.json | 2 + .../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/ModEntities.java | 3 + .../client/red_panda/Red_PandaAnimation.java | 214 ++++++++++++++++++ .../client/red_panda/Red_PandaModel.java | 126 +++++++++++ .../client/red_panda/Red_PandaRenderer.java | 33 +++ .../entity/custom/Red_PandaEntity.java | 190 ++++++++++++++++ .../masterwild/event/ModEventBusEvents.java | 3 + .../masterwild/textures/entity/red_panda.png | Bin 0 -> 2902 bytes 15 files changed, 584 insertions(+), 3 deletions(-) create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaAnimation.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaModel.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaRenderer.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/custom/Red_PandaEntity.java create mode 100755 src/main/resources/assets/masterwild/textures/entity/red_panda.png diff --git a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 index db42430..e89fb0c 100644 --- a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 +++ b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 @@ -1,2 +1,2 @@ -// 1.21.1 2026-09-25T19:36:39.156620797 Languages: en_us for mod: masterwild -f81158e4a20d69009ce5a66a70dbbe04fe341d75 assets/masterwild/lang/en_us.json +// 1.21.1 2026-09-27T13:20:47.914272766 Languages: en_us for mod: masterwild +56e02f4ef485a5416522660f565f5f075d4a7881 assets/masterwild/lang/en_us.json diff --git a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 index bc7fcaf..47577c2 100644 --- a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 +++ b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 @@ -1,6 +1,7 @@ -// 1.21.1 2026-09-25T19:33:29.007094425 Item Models: masterwild +// 1.21.1 2026-09-27T13:20:47.914969891 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/red-panda_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 a3e7793..b0ac73d 100644 --- a/src/generated/resources/assets/masterwild/lang/en_us.json +++ b/src/generated/resources/assets/masterwild/lang/en_us.json @@ -3,11 +3,13 @@ "entity.masterwild.firefly": "Firefly", "entity.masterwild.hedgehog": "Hedgehog", "entity.masterwild.pinguin": "Pinguin", + "entity.masterwild.red_panda": "Red Panda", "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.red-panda_spawn_egg": "Red Panda Spawn Egg", "item.masterwild.rooster_spawn_egg": "Rooster Spawn Egg", "item.masterwild.shark_spawn_egg": "Shark Spawn Egg", "subtitles.masterwild.rooster_crow": "Rooster crows" diff --git a/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java b/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java index 68fd32b..dbc7c02 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java @@ -29,6 +29,7 @@ public class ModCreativeModeTabs { output.accept(ModItems.ROOSTER_SPAWN_EGG); output.accept(ModItems.SHARK_SPAWN_EGG); output.accept(ModItems.HEDGEHOG_SPAWN_EGG); + output.accept(ModItems.RED_PANDA_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 3a6e0d1..c8e6518 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java @@ -29,6 +29,9 @@ public class ModItems { public static final DeferredItem HEDGEHOG_SPAWN_EGG = ITEMS.register("hedgehog_spawn_egg", () -> new DeferredSpawnEggItem(ModEntities.HEDGEHOG, 0x372a21, 0x8f8973, new Item.Properties())); + 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 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 3c4550f..8f06943 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java @@ -24,6 +24,7 @@ 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; +import ovh.glitchlabs.masterwild.entity.client.red_panda.Red_PandaRenderer; // The value here should match an entry in the META-INF/neoforge.mods.toml file @Mod(Masterwild.MODID) @@ -76,6 +77,7 @@ public class Masterwild { EntityRenderers.register(ModEntities.ROOSTER.get(), RoosterRenderer::new); EntityRenderers.register(ModEntities.SHARK.get(), SharkRenderer::new); EntityRenderers.register(ModEntities.HEDGEHOG.get(), HedgehogRenderer::new); + EntityRenderers.register(ModEntities.RED_PANDA.get(), Red_PandaRenderer::new); } } } diff --git a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java index 1a79e9f..8ca9af1 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java @@ -19,5 +19,6 @@ public class ModItemModelProvider extends ItemModelProvider { 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")); + withExistingParent(ModItems.RED_PANDA_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 3ae6a32..b2f96f5 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java @@ -19,12 +19,14 @@ public class ModLanguageProvider extends LanguageProvider { add(ModEntities.ROOSTER.get(), "Rooster"); add(ModEntities.SHARK.get(), "Shark"); add(ModEntities.HEDGEHOG.get(), "Hedgehog"); + add(ModEntities.RED_PANDA.get(), "Red Panda"); 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(ModItems.RED_PANDA_SPAWN_EGG.get(), "Red Panda 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 c4e4a30..9461d6b 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java @@ -34,6 +34,9 @@ public class ModEntities { ENTITY_TYPES.register("hedgehog", () -> EntityType.Builder.of(HedgehogEntity::new, MobCategory.CREATURE) .sized(0.5f, 0.4f).build("hedgehog")); + public static final Supplier> RED_PANDA = + ENTITY_TYPES.register("red_panda", () -> EntityType.Builder.of(Red_PandaEntity::new, MobCategory.CREATURE) + .sized(0.6f, 0.7f).build("red_panda")); public static void register(IEventBus eventBus) { diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaAnimation.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaAnimation.java new file mode 100755 index 0000000..650cf8e --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaAnimation.java @@ -0,0 +1,214 @@ +package ovh.glitchlabs.masterwild.entity.client.red_panda;// 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.1 + * Exported for Minecraft version 1.19 or later with Mojang mappings + * @author Author + */ +public class Red_PandaAnimation { + public static final AnimationDefinition red_panda_sit = AnimationDefinition.Builder.withLength(0.0F) + .addAnimation("red_panda", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-30.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("red_panda", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.75F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("tail", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(44.7192F, -35.3963F, -29.8378F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("tail", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, -1.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("r_leg_front", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(30.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("r_leg_back", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-122.1338F, 32.139F, -83.2786F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("r_leg_back", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.75F, 0.0F, 0.25F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("l_leg_back", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-122.1338F, -32.139F, 83.2786F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("l_leg_back", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 1.25F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("l_leg_front", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(30.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("head", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(2.4786F, -0.3262F, 7.4928F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); + + public static final AnimationDefinition red_panda_defend_standup = AnimationDefinition.Builder.withLength(0.5F) + .addAnimation("red_panda", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(10.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("red_panda", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, -0.75F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("body", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(-80.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("body", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 1.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("body", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("tail", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(67.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("tail", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, -0.5F, -0.25F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("r_leg_front", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(-42.2549F, 5.059F, 68.044F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_front", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.25F, 0.5F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_front", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_back", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(67.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_back", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_back", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_back", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(67.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_back", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_back", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_front", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(-42.2549F, -5.059F, -68.044F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_front", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.25F, 0.5F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_front", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("head", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(60.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("head", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.01F, 1.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("head", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); + + public static final AnimationDefinition red_panda_defend_standdown = AnimationDefinition.Builder.withLength(0.5F) + .addAnimation("red_panda", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(10.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("red_panda", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, -0.75F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("body", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-80.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("body", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 1.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("body", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.5F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("tail", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(67.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("tail", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, -0.5F, -0.25F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_front", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-42.2549F, 5.059F, 68.044F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_front", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.25F, 0.5F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_front", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.5F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_back", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(67.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_back", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("r_leg_back", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.5F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_back", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(67.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_back", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_back", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.5F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_front", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-42.2549F, -5.059F, -68.044F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_front", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.25F, 0.5F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("l_leg_front", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.5F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("head", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(60.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("head", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.01F, 1.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("head", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.5F, 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/red_panda/Red_PandaModel.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaModel.java new file mode 100755 index 0000000..6728181 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaModel.java @@ -0,0 +1,126 @@ +package ovh.glitchlabs.masterwild.entity.client.red_panda;// Made with Blockbench 5.2.1 +// 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.custom.Red_PandaEntity; + +public class Red_PandaModel 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, "red_pandamodelmodel"), "main"); + private final ModelPart red_panda; + private final ModelPart body; + private final ModelPart tail; + private final ModelPart legs; + private final ModelPart r_leg_front; + private final ModelPart r_leg_back; + private final ModelPart l_leg_front; + private final ModelPart l_leg_back; + private final ModelPart head; + private final ModelPart ears; + private final ModelPart r_ear; + private final ModelPart l_ear; + + public Red_PandaModel(ModelPart root) { + this.red_panda = root.getChild("red_panda"); + this.body = this.red_panda.getChild("body"); + this.tail = this.body.getChild("tail"); + this.legs = this.body.getChild("legs"); + this.r_leg_front = this.legs.getChild("r_leg_front"); + this.r_leg_back = this.legs.getChild("r_leg_back"); + this.l_leg_front = this.legs.getChild("l_leg_front"); + this.l_leg_back = this.legs.getChild("l_leg_back"); + this.head = this.body.getChild("head"); + this.ears = this.head.getChild("ears"); + this.r_ear = this.ears.getChild("r_ear"); + this.l_ear = this.ears.getChild("l_ear"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition red_panda = partdefinition.addOrReplaceChild("red_panda", CubeListBuilder.create(), PartPose.offset(2.75F, 24.0F, -2.75F)); + + PartDefinition body = red_panda.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 0).addBox(-3.8125F, -3.5625F, -6.25F, 7.0F, 5.0F, 11.0F, new CubeDeformation(0.0F)), PartPose.offset(-2.4375F, -4.6875F, 5.0F)); + + PartDefinition tail = body.addOrReplaceChild("tail", CubeListBuilder.create().texOffs(0, 16).addBox(-1.5F, -2.0F, 0.0F, 4.0F, 4.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(-0.8125F, -2.0625F, 4.75F)); + + PartDefinition legs = body.addOrReplaceChild("legs", CubeListBuilder.create(), PartPose.offset(2.4375F, 4.6875F, 3.25F)); + + PartDefinition r_leg_front = legs.addOrReplaceChild("r_leg_front", CubeListBuilder.create().texOffs(28, 28).addBox(0.0F, -1.0F, -1.5F, 2.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-6.5F, -3.0F, -7.75F)); + + PartDefinition r_leg_back = legs.addOrReplaceChild("r_leg_back", CubeListBuilder.create().texOffs(0, 30).addBox(0.0F, -1.0F, -1.5F, 2.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-6.5F, -3.0F, -0.5F)); + + PartDefinition l_leg_front = legs.addOrReplaceChild("l_leg_front", CubeListBuilder.create().texOffs(10, 30).addBox(-1.0F, -1.0F, -1.5F, 2.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -3.0F, -7.75F)); + + PartDefinition l_leg_back = legs.addOrReplaceChild("l_leg_back", CubeListBuilder.create().texOffs(20, 35).addBox(-1.0F, -1.0F, -1.5F, 2.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -3.0F, -0.5F)); + + PartDefinition head = body.addOrReplaceChild("head", CubeListBuilder.create().texOffs(30, 35).addBox(-1.0F, 0.0F, -9.0F, 3.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(28, 16).addBox(-3.0F, -3.0F, -7.0F, 7.0F, 5.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(-0.8125F, -1.5625F, -6.25F)); + + PartDefinition ears = head.addOrReplaceChild("ears", CubeListBuilder.create(), PartPose.offset(3.25F, -3.0F, -5.5F)); + + PartDefinition r_ear = ears.addOrReplaceChild("r_ear", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition cube_r1 = r_ear.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(36, 0).addBox(-1.5F, -1.5F, -0.5F, 3.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-5.5F, 0.0F, 0.0F, 0.0F, 0.0F, 0.3927F)); + + PartDefinition l_ear = ears.addOrReplaceChild("l_ear", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition cube_r2 = l_ear.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(20, 30).addBox(-1.5F, -1.5F, -0.5F, 3.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.3927F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + @Override + public void setupAnim(Red_PandaEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts().forEach(ModelPart::resetPose); + this.applyHeadRotation(netHeadYaw, headPitch); + + boolean posed = entity.isInSittingPose() || entity.isDefending(); + if (!posed) { + this.walk(limbSwing, limbSwingAmount); + } + + this.animate(entity.sitingAnimationState, Red_PandaAnimation.red_panda_sit, ageInTicks); + this.animate(entity.standupAnimationState, Red_PandaAnimation.red_panda_defend_standup, ageInTicks); + this.animate(entity.standdownAnimationState, Red_PandaAnimation.red_panda_defend_standdown, ageInTicks); + } + + private void walk(float limbSwing, float limbSwingAmount) { + float amount = 1.2F * limbSwingAmount; + this.r_leg_front.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.l_leg_back.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.l_leg_front.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + this.r_leg_back.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + } + + + private void applyHeadRotation(float headYaw, float headPitch) { + headYaw = Mth.clamp(headYaw, -30f, 30f); + headPitch = Math.clamp(headPitch, -25f, 45); + + this.head.yRot = headYaw * ((float) Math.PI / 180f); + this.head.xRot = headPitch * ((float) Math.PI / 180f); + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + red_panda.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + } + + @Override + public ModelPart root() { + return red_panda; + } +} diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaRenderer.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaRenderer.java new file mode 100644 index 0000000..267dacb --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/red_panda/Red_PandaRenderer.java @@ -0,0 +1,33 @@ +package ovh.glitchlabs.masterwild.entity.client.red_panda; + +import com.mojang.blaze3d.vertex.PoseStack; +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.Red_PandaEntity; + +public class Red_PandaRenderer extends MobRenderer> { + private static final float ADULT_SCALE = 1.2f; + private static final float BABY_SCALE = 0.45f; + private static final float SHADOW = 0.8f; + + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/red_panda.png"); + + public Red_PandaRenderer(EntityRendererProvider.Context context) { + super(context, new Red_PandaModel<>(context.bakeLayer(Red_PandaModel.LAYER_LOCATION)), SHADOW); + } + + @Override + public ResourceLocation getTextureLocation(Red_PandaEntity entity) { + return TEXTURE; + } + + @Override + protected void scale(Red_PandaEntity entity, PoseStack poseStack, float partialTick) { + float scale = entity.isBaby() ? BABY_SCALE : ADULT_SCALE; + poseStack.scale(scale, scale, scale); + this.shadowRadius = SHADOW * scale; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/Red_PandaEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/Red_PandaEntity.java new file mode 100644 index 0000000..40fdca4 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/Red_PandaEntity.java @@ -0,0 +1,190 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +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.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +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.TamableAnimal; +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.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; + +/** + * Roter Panda: zähmbar mit Beeren/Äpfeln, setzt sich per Rechtsklick oder wird per Halsband + * kontrolliert (Standard-TamableAnimal-Verhalten), und richtet sich bei Schaden kurz zur + * Verteidigung auf (nur Optik, kein zusätzlicher Schaden). + */ +public class Red_PandaEntity extends TamableAnimal { + private static final Ingredient FOOD = Ingredient.of(Items.SWEET_BERRIES, Items.APPLE); + private static final int DEFEND_DURATION = 40; // 2 Sekunden + + private static final EntityDataAccessor DEFENDING = + SynchedEntityData.defineId(Red_PandaEntity.class, EntityDataSerializers.BOOLEAN); + + public final AnimationState sitingAnimationState = new AnimationState(); + public final AnimationState standupAnimationState = new AnimationState(); + public final AnimationState standdownAnimationState = new AnimationState(); + + private int defendTicks = 0; + private boolean wasDefendingClient = false; + + public Red_PandaEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 10) + .add(Attributes.MOVEMENT_SPEED, 0.25) + .add(Attributes.FOLLOW_RANGE, 12) + .add(Attributes.STEP_HEIGHT, 0.6); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new SitWhenOrderedToGoal(this)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.1, FOOD, false)); + this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.1)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.8)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(7, new FollowOwnerGoal(this, 1.1, 10.0F, 2.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(DEFENDING, false); + } + + public boolean isDefending() { + return this.entityData.get(DEFENDING); + } + + private void setDefending(boolean defending) { + this.entityData.set(DEFENDING, defending); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + @Override + public InteractionResult mobInteract(Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (!this.isTame()) { + if (FOOD.test(stack)) { + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } + if (!this.level().isClientSide()) { + if (this.random.nextInt(3) == 0) { + this.tame(player); + this.setOrderedToSit(true); + this.level().broadcastEntityEvent(this, (byte) 7); // Herz-Partikel + } else { + this.level().broadcastEntityEvent(this, (byte) 6); // Rauch-Partikel + } + } + return InteractionResult.SUCCESS; + } + return super.mobInteract(player, hand); + } + + if (this.isOwnedBy(player)) { + if (FOOD.test(stack) && this.getHealth() < this.getMaxHealth()) { + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } + this.heal(4.0F); + return InteractionResult.sidedSuccess(this.level().isClientSide()); + } + if (!this.level().isClientSide() && !player.isSecondaryUseActive()) { + this.setOrderedToSit(!this.isOrderedToSit()); + } + return InteractionResult.sidedSuccess(this.level().isClientSide()); + } + + return super.mobInteract(player, hand); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + boolean hurt = super.hurt(source, amount); + if (hurt && !this.level().isClientSide() && !this.isDeadOrDying()) { + this.defendTicks = DEFEND_DURATION; + this.setDefending(true); + this.playSound(SoundEvents.CAT_HISS, 1.0F, 1.0F); + } + return hurt; + } + + @Override + public void tick() { + super.tick(); + + if (this.level().isClientSide()) { + this.setupAnimationStates(); + } else if (this.isDefending() && --this.defendTicks <= 0) { + this.setDefending(false); + } + } + + private void setupAnimationStates() { + if (this.isInSittingPose()) { + this.sitingAnimationState.startIfStopped(this.tickCount); + } else { + this.sitingAnimationState.stop(); + } + + boolean defending = this.isDefending(); + if (defending && !this.wasDefendingClient) { + this.standdownAnimationState.stop(); + this.standupAnimationState.start(this.tickCount); + } else if (!defending && this.wasDefendingClient) { + this.standupAnimationState.stop(); + this.standdownAnimationState.start(this.tickCount); + } + this.wasDefendingClient = defending; + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return (AgeableMob) this.getType().create(level); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.FOX_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.FOX_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.FOX_DEATH; + } +} \ 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 91fdd32..a7facdb 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java +++ b/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java @@ -11,6 +11,7 @@ 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.client.hedgehog.HedgehogModel; +import ovh.glitchlabs.masterwild.entity.client.red_panda.Red_PandaModel; import ovh.glitchlabs.masterwild.entity.custom.*; @EventBusSubscriber(modid = Masterwild.MODID, bus = EventBusSubscriber.Bus.MOD) @@ -22,6 +23,7 @@ public class ModEventBusEvents { event.registerLayerDefinition(RoosterModel.LAYER_LOCATION, RoosterModel::createBodyLayer); event.registerLayerDefinition(SharkModel.LAYER_LOCATION, SharkModel::createBodyLayer); event.registerLayerDefinition(HedgehogModel.LAYER_LOCATION, HedgehogModel::createBodyLayer); + event.registerLayerDefinition(Red_PandaModel.LAYER_LOCATION, Red_PandaModel::createBodyLayer); } @SubscribeEvent @@ -31,5 +33,6 @@ public class ModEventBusEvents { event.put(ModEntities.ROOSTER.get(), RoosterEntity.createAttributes().build()); 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()); } } diff --git a/src/main/resources/assets/masterwild/textures/entity/red_panda.png b/src/main/resources/assets/masterwild/textures/entity/red_panda.png new file mode 100755 index 0000000000000000000000000000000000000000..711a7df8f10b71055788506189a75cbba6b36488 GIT binary patch literal 2902 zcmV-c3#s&pP)_SEyJ?!F+Y(#afy{l{VSz?!9~bes^=W+oef%(a1Ku6@lro1A9$AuKwzGO^|q+A4NH! zqC}&1dg(?7ohJ*Az@zEE9J4q%~?5HNmJ z6ca~B0!o>B!cY51Bokx5!u}#*Zq2qcuVzQy&ROkoz-6;zT>Ssv*f2t?Q^m*y$K3RY0Uaqzb zU6`X27$-XNg_Y8`)x_@8X2{Jn&C2sf1D?EasfrpzB&oUta?>=JT`CJy-^KQ5p?gfp zOPF3$inFJU#+h{$I6GE~88uPFs!9Y=Os|pF}=^m>%lnMJ3Q=cO`u_40!?jQf&`eBE%6kX_Zpi)RLDKU zf-({N%w<8zQzhi*F1!q+R9HRv{-9t7oLO6jv6W#|mbtL{i%7oP|eRVzN&7A{Mt2-5{3(b7+sE5PHQfO%DkP+|1p0)(`9!v(hw)V{B zsF1Q=lzRoYxpgTL_XiJ_$pkp;8wi(?MpHB?~h{JomU`M zJrS#KT8O1{tIVG+pZ*b0k3N0{J78>ug9()yv566!6)VFTlOp&;wT%9_5NgJT`l#l3 zGDG{g1aOO6zP2(@vE!*LAI$P(C{s_qapr`;o;=|?8Z57Bw1XoZi2&^#$zZ#tOg-&- zL%|N%E%W`orY;%%%$z5mi{2{fDUFMpy7)%KWPX#V`;$k{?M`7I&=MuYV(InW9Hs-s?6^$iJ7HytIczlPBlwD zStWFud0@^Y(L z+!!^I;(h8PathpkB#C&!7bmzFRqh6_$(UhXn~#+pnT3%@<*@5YBQ!m_^?U+@{JGG4Xc{fmtNVWu6ucB0P@rkQf;sQzybB)G`?|$ zoV4Vn2;_4I|4JU>P;@3dx!Ptr#%Z8*rb8)lN?0Nz8d2cX;|>va5k$yERR+8tXz?UF zos^p(BaO&y4bv!xBtlYRLw>NKo0|8imEz6oUT##69SGrjThn;rU=;UkOXCNdTGZE8 z?^cVqw5t2J?GNz%^)2c-d3o`qyu`S3vxncbxVTAO*uHH8HodhD+cv+MrSETDPt!p`-~f&S!;+)YCE>}M=?v0b z5xc`yaNi!Uo%TU6`5)?j4z3FS*n>Pd59 zbsWJK$wSI~mS=i?;~DPxI?CKF2=e)GWv%Gial0Y%(@wV>M8N4Rl%a0Hh#*)#*BGlO zrOsmQKi61x(CKM+KyDAXxH9zFdCS}M+{H1U=VEDL?FWhur~}w&t}Ao``JspbbpRJv zP5~~k literal 0 HcmV?d00001