From b3b4b1751d3ad85b1602dd3def98597ecfc70369 Mon Sep 17 00:00:00 2001 From: ian1337 Date: Mon, 28 Sep 2026 22:26:39 +0200 Subject: [PATCH] [add] Monkey --- gradle.properties | 2 +- .../103d9f3f36b01595f1aa5172191e60eff02e6924 | 5 +- .../6143fb1502ae754d8039ff811e28c49eaa7e6409 | 4 +- .../d1416cf72769a6a520cc2c44944968403e1a0de7 | 3 +- .../assets/masterwild/lang/en_us.json | 3 + .../models/item/monkey_spawn_egg.json | 3 + .../neoforge/biome_modifier/spawn_monkey.json | 10 ++ .../biome_modifier/spawn_rooster.json | 2 +- .../masterwild/Item/ModCreativeModeTabs.java | 1 + .../glitchlabs/masterwild/Item/ModItems.java | 3 + .../ovh/glitchlabs/masterwild/Masterwild.java | 2 + .../masterwild/Sounds/ModSounds.java | 1 + .../datagen/ModItemModelProvider.java | 1 + .../datagen/ModLanguageProvider.java | 4 + .../masterwild/entity/ModEntities.java | 4 + .../entity/client/Monkey/MonkeyAnimation.java | 78 +++++++++++ .../entity/client/Monkey/MonkeyModel.java | 126 ++++++++++++++++++ .../entity/client/Monkey/MonkeyRenderer.java | 33 +++++ .../entity/custom/MonkeyEntity.java | 78 +++++++++++ .../masterwild/event/ModEventBusEvents.java | 9 +- .../masterwild/event/ModSpawnPlacements.java | 5 +- .../worldgen/ModBiomeModifiers.java | 8 +- .../resources/assets/masterwild/sounds.json | 4 + .../assets/masterwild/sounds/monkey_hurt.ogg | Bin 0 -> 6715 bytes .../masterwild/textures/entity/monkey.png | Bin 0 -> 2139 bytes .../masterwild/textures/entity/rooster.png | Bin 1477 -> 1445 bytes 26 files changed, 374 insertions(+), 15 deletions(-) create mode 100644 src/generated/resources/assets/masterwild/models/item/monkey_spawn_egg.json create mode 100644 src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_monkey.json create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyAnimation.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyModel.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyRenderer.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/custom/MonkeyEntity.java create mode 100644 src/main/resources/assets/masterwild/sounds/monkey_hurt.ogg create mode 100755 src/main/resources/assets/masterwild/textures/entity/monkey.png diff --git a/gradle.properties b/gradle.properties index ee134c4..b3e88c8 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.1.1 +mod_version=0.2.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/103d9f3f36b01595f1aa5172191e60eff02e6924 b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 index fcd9d6e..bb682a3 100644 --- a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 +++ b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 @@ -1,9 +1,10 @@ -// 1.21.1 2026-09-28T19:54:04.141049615 Registries +// 1.21.1 2026-09-28T22:23:06.416820898 Registries ead89faabf72208190d381bb26c0381632944e55 data/masterwild/neoforge/biome_modifier/spawn_butterfly.json 7d8ae6f7dfb59ddf054cabf0a1169a571465c6bc data/masterwild/neoforge/biome_modifier/spawn_firefly.json 794f7cd1a27f9d8b96379fb661eab0d120cad281 data/masterwild/neoforge/biome_modifier/spawn_hedgehog.json +3d5b931996cbc1319a2e2afe8ddc7e455f407f18 data/masterwild/neoforge/biome_modifier/spawn_monkey.json 643ad56ac8f259789977e34868ea4ea77122aafe data/masterwild/neoforge/biome_modifier/spawn_pinguin.json 264ebbb0f1efd8cefc13e93c0031c3b19c80a225 data/masterwild/neoforge/biome_modifier/spawn_raccoon.json 0f98182744360df8e11851c2b6782e325689090d data/masterwild/neoforge/biome_modifier/spawn_red_panda.json -45ddc1dc9581863936a59213ce70f641b1d35d27 data/masterwild/neoforge/biome_modifier/spawn_rooster.json +cc5600e4e2999812382684cc52f9d59e19a521e1 data/masterwild/neoforge/biome_modifier/spawn_rooster.json 30308b10a3b95454e8678a8324ae88285a9e7b21 data/masterwild/neoforge/biome_modifier/spawn_shark.json diff --git a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 index a382ce3..00efaac 100644 --- a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 +++ b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 @@ -1,2 +1,2 @@ -// 1.21.1 2026-09-27T20:26:19.448921416 Languages: en_us for mod: masterwild -dbb49d790ec7f13dec78bc8b156cf7d37931bad9 assets/masterwild/lang/en_us.json +// 1.21.1 2026-09-28T22:05:37.903072944 Languages: en_us for mod: masterwild +df1875a313c5fc24443af962c80c27a3f57525b5 assets/masterwild/lang/en_us.json diff --git a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 index 487e639..86d0d37 100644 --- a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 +++ b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 @@ -1,9 +1,10 @@ -// 1.21.1 2026-09-27T20:26:19.449663992 Item Models: masterwild +// 1.21.1 2026-09-28T22:05:54.295366081 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/monkey_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/pinguin_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/raccoon_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/red-panda_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 ad3402c..bf19c1a 100644 --- a/src/generated/resources/assets/masterwild/lang/en_us.json +++ b/src/generated/resources/assets/masterwild/lang/en_us.json @@ -3,6 +3,7 @@ "entity.masterwild.butterfly": "Butterfly", "entity.masterwild.firefly": "Firefly", "entity.masterwild.hedgehog": "Hedgehog", + "entity.masterwild.monkey": "Monkey", "entity.masterwild.pinguin": "Pinguin", "entity.masterwild.raccoon": "Raccoon", "entity.masterwild.red_panda": "Red Panda", @@ -13,10 +14,12 @@ "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.monkey_spawn_egg": "Monkey Spawn Egg", "item.masterwild.pinguin_spawn_egg": "Pinguin Spawn Egg", "item.masterwild.raccoon_spawn_egg": "Raccoon 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.monkey_hurt": "Monkey Hurt", "subtitles.masterwild.rooster_crow": "Rooster crows" } \ No newline at end of file diff --git a/src/generated/resources/assets/masterwild/models/item/monkey_spawn_egg.json b/src/generated/resources/assets/masterwild/models/item/monkey_spawn_egg.json new file mode 100644 index 0000000..d1aaa9d --- /dev/null +++ b/src/generated/resources/assets/masterwild/models/item/monkey_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_monkey.json b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_monkey.json new file mode 100644 index 0000000..28a719a --- /dev/null +++ b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_monkey.json @@ -0,0 +1,10 @@ +{ + "type": "neoforge:add_spawns", + "biomes": "minecraft:jungle", + "spawners": { + "type": "masterwild:monkey", + "maxCount": 5, + "minCount": 2, + "weight": 9 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_rooster.json b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_rooster.json index 93412be..5af452c 100644 --- a/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_rooster.json +++ b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_rooster.json @@ -9,6 +9,6 @@ "type": "masterwild:rooster", "maxCount": 3, "minCount": 2, - "weight": 10 + "weight": 5 } } \ 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 6eac6e6..1505950 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java @@ -30,6 +30,7 @@ public class ModCreativeModeTabs { output.accept(ModItems.RED_PANDA_SPAWN_EGG); output.accept(ModItems.BUTTERFLY_SPAWN_EGG); output.accept(ModItems.RACCOON_SPAWN_EGG); + output.accept(ModItems.MONKEY_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 7bfe900..b9f9a8e 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java @@ -49,6 +49,9 @@ public class ModItems { public static final DeferredItem RACCOON_SPAWN_EGG = ITEMS.register("raccoon_spawn_egg", () -> new DeferredSpawnEggItem(ModEntities.RACCOON, 0x68696a, 0xa6a4a3, new Item.Properties())); + public static final DeferredItem MONKEY_SPAWN_EGG = ITEMS.register("monkey_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.MONKEY, 0x795136, 0x9e9178, + 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 baf23cf..9bb099e 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java @@ -19,6 +19,7 @@ import ovh.glitchlabs.masterwild.Item.ModCreativeModeTabs; import ovh.glitchlabs.masterwild.Item.ModItems; import ovh.glitchlabs.masterwild.Sounds.ModSounds; import ovh.glitchlabs.masterwild.entity.ModEntities; +import ovh.glitchlabs.masterwild.entity.client.Monkey.MonkeyRenderer; import ovh.glitchlabs.masterwild.entity.client.Pinguin.PinguinRenderer; import ovh.glitchlabs.masterwild.entity.client.Raccoon.RaccoonRenderer; import ovh.glitchlabs.masterwild.entity.client.Rooster.RoosterRenderer; @@ -82,6 +83,7 @@ public class Masterwild { EntityRenderers.register(ModEntities.RED_PANDA.get(), Red_PandaRenderer::new); EntityRenderers.register(ModEntities.BUTTERFLY.get(), ButterflyRenderer::new); EntityRenderers.register(ModEntities.RACCOON.get(), RaccoonRenderer::new); + EntityRenderers.register(ModEntities.MONKEY.get(), MonkeyRenderer::new); } } } diff --git a/src/main/java/ovh/glitchlabs/masterwild/Sounds/ModSounds.java b/src/main/java/ovh/glitchlabs/masterwild/Sounds/ModSounds.java index 0af5fe3..e08bbf8 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Sounds/ModSounds.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Sounds/ModSounds.java @@ -14,6 +14,7 @@ public class ModSounds { DeferredRegister.create(BuiltInRegistries.SOUND_EVENT, Masterwild.MODID); public static final Supplier ROOSTER_CROW = registerSound("rooster_crow"); + public static final Supplier MONKEY_HURT = registerSound("monkey_hurt"); private static Supplier registerSound(String name) { ResourceLocation id = ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, name); diff --git a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java index 2032ea8..725c036 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java @@ -29,5 +29,6 @@ public class ModItemModelProvider extends ItemModelProvider { 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")); withExistingParent(ModItems.RACCOON_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + withExistingParent(ModItems.MONKEY_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 c785401..c96b6d5 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java @@ -25,6 +25,7 @@ public class ModLanguageProvider extends LanguageProvider { add(ModEntities.RED_PANDA.get(), "Red Panda"); add(ModEntities.BUTTERFLY.get(), "Butterfly"); add(ModEntities.RACCOON.get(), "Raccoon"); + add(ModEntities.MONKEY.get(), "Monkey"); add(ModItems.PINGUIN_SPAWN_EGG.get(), "Pinguin Spawn Egg"); add(ModItems.FIREFLY_SPAWN_EGG.get(), "Firefly Spawn Egg"); @@ -34,8 +35,11 @@ public class ModLanguageProvider extends LanguageProvider { add(ModItems.RED_PANDA_SPAWN_EGG.get(), "Red Panda Spawn Egg"); add(ModItems.BUTTERFLY_SPAWN_EGG.get(), "Butterfly Spawn Egg"); add(ModItems.RACCOON_SPAWN_EGG.get(), "Raccoon Spawn Egg"); + add(ModItems.MONKEY_SPAWN_EGG.get(), "Monkey Spawn Egg"); add("creativetab.masterwild.masterwild", "MasterWild"); + add("subtitles.masterwild.rooster_crow", "Rooster crows"); + add("subtitles.masterwild.monkey_hurt", "Monkey Hurt"); } } diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java b/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java index 3a0099e..9d9a23a 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java @@ -46,6 +46,10 @@ public class ModEntities { ENTITY_TYPES.register("raccoon", () -> EntityType.Builder.of(RaccoonEntity::new, MobCategory.CREATURE) .sized(0.6f, 0.5f).build("raccoon")); + public static final Supplier> MONKEY = + ENTITY_TYPES.register("monkey", () -> EntityType.Builder.of(MonkeyEntity::new, MobCategory.CREATURE) + .sized(0.6f, 0.5f).build("monkey")); + public static void register(IEventBus eventBus) { ENTITY_TYPES.register(eventBus); diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyAnimation.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyAnimation.java new file mode 100755 index 0000000..72017d7 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyAnimation.java @@ -0,0 +1,78 @@ +package ovh.glitchlabs.masterwild.entity.client.Monkey;// 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 MonkeyAnimation { + public static final AnimationDefinition Monky_Running = AnimationDefinition.Builder.withLength(0.6667F).looping() + .addAnimation("body", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.3333F, KeyframeAnimations.degreeVec(5.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(7.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.6667F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("bone2", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.1667F, KeyframeAnimations.degreeVec(2.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.6667F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("R_front_Leg", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.1667F, KeyframeAnimations.degreeVec(-12.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.3333F, KeyframeAnimations.degreeVec(-30.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.6667F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("L_front_Leg", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.1667F, KeyframeAnimations.degreeVec(-12.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.3333F, KeyframeAnimations.degreeVec(-30.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.6667F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("L_up", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.1667F, KeyframeAnimations.degreeVec(22.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.3333F, KeyframeAnimations.degreeVec(52.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(52.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.6667F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("L_up", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("L_up", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("L_down", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.1667F, KeyframeAnimations.degreeVec(-25.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.3333F, KeyframeAnimations.degreeVec(-42.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(-7.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.6667F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("R_up", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.1667F, KeyframeAnimations.degreeVec(22.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.3333F, KeyframeAnimations.degreeVec(52.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(52.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.6667F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("R_up", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("R_up", new AnimationChannel(AnimationChannel.Targets.SCALE, + new Keyframe(0.0F, KeyframeAnimations.scaleVec(1.0F, 1.0F, 1.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .addAnimation("R_down", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.1667F, KeyframeAnimations.degreeVec(-25.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.3333F, KeyframeAnimations.degreeVec(-42.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.5F, KeyframeAnimations.degreeVec(-7.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM), + new Keyframe(0.6667F, KeyframeAnimations.degreeVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.CATMULLROM) + )) + .build(); +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyModel.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyModel.java new file mode 100755 index 0000000..12e48e6 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyModel.java @@ -0,0 +1,126 @@ +package ovh.glitchlabs.masterwild.entity.client.Monkey;// 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.custom.MonkeyEntity; + +public class MonkeyModel 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, "monkeymodel"), "main"); + private final ModelPart monkey; + private final ModelPart body; + private final ModelPart bone2; + private final ModelPart legs; + private final ModelPart R_front_Leg; + private final ModelPart R_back_Leg; + private final ModelPart R_up; + private final ModelPart R_down; + private final ModelPart L_front_Leg; + private final ModelPart L_back_Leg; + private final ModelPart L_up; + private final ModelPart L_down; + private final ModelPart head; + private final ModelPart tail; + + public MonkeyModel(ModelPart root) { + this.monkey = root.getChild("monkey"); + this.body = this.monkey.getChild("body"); + this.bone2 = this.body.getChild("bone2"); + this.legs = this.body.getChild("legs"); + this.R_front_Leg = this.legs.getChild("R_front_Leg"); + this.R_back_Leg = this.legs.getChild("R_back_Leg"); + this.R_up = this.R_back_Leg.getChild("R_up"); + this.R_down = this.R_up.getChild("R_down"); + this.L_front_Leg = this.legs.getChild("L_front_Leg"); + this.L_back_Leg = this.legs.getChild("L_back_Leg"); + this.L_up = this.L_back_Leg.getChild("L_up"); + this.L_down = this.L_up.getChild("L_down"); + this.head = this.body.getChild("head"); + this.tail = this.body.getChild("tail"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition monkey = partdefinition.addOrReplaceChild("monkey", CubeListBuilder.create(), PartPose.offset(0.5F, 20.0F, 0.0F)); + + PartDefinition body = monkey.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.offset(-2.125F, -2.7083F, 2.2083F)); + + PartDefinition bone2 = body.addOrReplaceChild("bone2", CubeListBuilder.create(), PartPose.offset(1.625F, -0.1931F, -0.9507F)); + + PartDefinition cube_r1 = bone2.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -6.0F, -4.0F, 7.0F, 6.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, 2.9014F, -1.2577F, -0.0873F, 0.0F, 0.0F)); + + PartDefinition legs = body.addOrReplaceChild("legs", CubeListBuilder.create(), PartPose.offset(2.125F, 2.7083F, -2.2083F)); + + PartDefinition R_front_Leg = legs.addOrReplaceChild("R_front_Leg", CubeListBuilder.create().texOffs(0, 33).addBox(-1.0F, -0.5F, -1.0F, 2.0F, 5.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(-2.75F, -0.5F, -2.75F)); + + PartDefinition R_back_Leg = legs.addOrReplaceChild("R_back_Leg", CubeListBuilder.create(), PartPose.offset(-3.0F, -0.9604F, 3.8174F)); + + PartDefinition R_up = R_back_Leg.addOrReplaceChild("R_up", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0396F, -0.4326F)); + + PartDefinition cube_r2 = R_up.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(20, 25).addBox(-1.0F, -2.0F, -3.0F, 3.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.5F, -0.0793F, 1.1152F, -0.3927F, 0.0F, 0.0F)); + + PartDefinition R_down = R_up.addOrReplaceChild("R_down", CubeListBuilder.create().texOffs(34, 6).addBox(-1.0F, -1.0F, -1.0F, 2.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 1.9207F, -1.1348F)); + + PartDefinition L_front_Leg = legs.addOrReplaceChild("L_front_Leg", CubeListBuilder.create().texOffs(8, 33).addBox(-1.0F, -0.5F, -1.0F, 2.0F, 5.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(1.75F, -0.5F, -2.75F)); + + PartDefinition L_back_Leg = legs.addOrReplaceChild("L_back_Leg", CubeListBuilder.create(), PartPose.offset(2.0F, -0.9604F, 3.8174F)); + + PartDefinition L_up = L_back_Leg.addOrReplaceChild("L_up", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0396F, -0.4326F)); + + PartDefinition cube_r3 = L_up.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(20, 16).addBox(-2.0F, -2.0F, -3.0F, 3.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, -0.0793F, 1.1152F, -0.3927F, 0.0F, 0.0F)); + + PartDefinition L_down = L_up.addOrReplaceChild("L_down", CubeListBuilder.create().texOffs(34, 0).addBox(-1.0F, -1.0F, -1.0F, 2.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 1.9207F, -1.1348F)); + + PartDefinition head = body.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 16).addBox(-3.0F, -3.0889F, -3.7083F, 6.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(34, 12).addBox(-2.0F, -0.0889F, -4.7083F, 4.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(1.625F, -2.5361F, -5.6667F)); + + PartDefinition cube_r4 = head.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(16, 34).addBox(-2.0F, -2.0F, 0.0F, 3.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.0F, -0.2555F, -2.5417F, 0.0F, 0.0F, -0.1745F)); + + PartDefinition cube_r5 = head.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(34, 16).addBox(-1.0F, -2.0F, 0.0F, 3.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.0F, -0.2555F, -2.5417F, 0.0F, 0.0F, 0.1745F)); + + PartDefinition tail = body.addOrReplaceChild("tail", CubeListBuilder.create().texOffs(14, 29).addBox(-0.5F, 1.3686F, 3.5304F, 1.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(0, 26).addBox(-0.5F, -0.6314F, -0.4696F, 1.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(14, 26).addBox(-0.5F, 0.3686F, 4.5304F, 1.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.625F, -1.625F, 4.125F, 0.2618F, 0.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + @Override + public void setupAnim(MonkeyEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts().forEach(ModelPart::resetPose); + this.animateWalk(MonkeyAnimation.Monky_Running, limbSwing, limbSwingAmount, 2f, 2.5f); + this.applyHeadRotation(netHeadYaw, headPitch); + } + + private void applyHeadRotation(float headYaw, float headPitch) { + headYaw = Mth.clamp(headYaw, -30f, 30f); + headPitch = Mth.clamp(headPitch, -25f, 45f); + 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) { + monkey.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + } + + @Override + public ModelPart root() { + return monkey; + } + + +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyRenderer.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyRenderer.java new file mode 100644 index 0000000..b44c722 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Monkey/MonkeyRenderer.java @@ -0,0 +1,33 @@ +package ovh.glitchlabs.masterwild.entity.client.Monkey; + +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.MonkeyEntity; + +public class MonkeyRenderer extends MobRenderer> { + private static final float ADULT_SCALE = 1.0f; + private static final float BABY_SCALE = 0.45f; + private static final float SHADOW = 0.45f; + + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/monkey.png"); + + public MonkeyRenderer(EntityRendererProvider.Context context) { + super(context, new MonkeyModel<>(context.bakeLayer(MonkeyModel.LAYER_LOCATION)), SHADOW); + } + + @Override + public ResourceLocation getTextureLocation(MonkeyEntity entity) { + return TEXTURE; + } + + @Override + protected void scale(MonkeyEntity entity, PoseStack poseStack, float partialTick) { + float scale = entity.isBaby() ? BABY_SCALE : ADULT_SCALE; + poseStack.scale(scale, scale, scale); + this.shadowRadius = SHADOW * scale; + } +} diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/MonkeyEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/MonkeyEntity.java new file mode 100644 index 0000000..f960203 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/MonkeyEntity.java @@ -0,0 +1,78 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +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.Item.ModItems; +import ovh.glitchlabs.masterwild.Sounds.ModSounds; +import ovh.glitchlabs.masterwild.entity.ModEntities; + +public class MonkeyEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(ModItems.BANANA); + + public MonkeyEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return AgeableMob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 8) + .add(Attributes.MOVEMENT_SPEED, 0.25) + .add(Attributes.FOLLOW_RANGE, 10) + .add(Attributes.STEP_HEIGHT, 0.6); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1, false) { + @Override + protected boolean canPerformAttack(LivingEntity entity) { + return this.isTimeToAttack() && this.mob.distanceToSqr(entity) < (this.mob.getBbWidth() * this.mob.getBbWidth() + entity.getBbWidth()) && this.mob.getSensing().hasLineOfSight(entity); + } + }); + this.goalSelector.addGoal(1, new PanicGoal(this, 1.5)); + 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 RandomLookAroundGoal(this)); + this.goalSelector.addGoal(0, new FloatGoal(this)); + + } + + @Override + protected void dropCustomDeathLoot(ServerLevel serverLevel, DamageSource source, boolean recentlyHit) { + super.dropCustomDeathLoot(serverLevel, source, recentlyHit); + this.spawnAtLocation(new ItemStack(ModItems.BANANA_PEEL.get())); + } + + @Override + public boolean isFood(ItemStack itemStack) { + return FOOD.test(itemStack); + } + + @Override + public @Nullable AgeableMob getBreedOffspring(ServerLevel serverLevel, AgeableMob ageableMob) { + return ModEntities.MONKEY.get().create(serverLevel); + } + + @Override + public SoundEvent getHurtSound(DamageSource damageSource) { + return ModSounds.MONKEY_HURT.get(); + } +} diff --git a/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java b/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java index 4591408..473f02f 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 net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; import ovh.glitchlabs.masterwild.Masterwild; import ovh.glitchlabs.masterwild.entity.ModEntities; +import ovh.glitchlabs.masterwild.entity.client.Monkey.MonkeyModel; import ovh.glitchlabs.masterwild.entity.client.Pinguin.PinguinModel; import ovh.glitchlabs.masterwild.entity.client.Raccoon.RaccoonModel; import ovh.glitchlabs.masterwild.entity.client.Rooster.RoosterModel; @@ -33,6 +34,7 @@ public class ModEventBusEvents { event.registerLayerDefinition(Red_PandaModel.LAYER_LOCATION, Red_PandaModel::createBodyLayer); event.registerLayerDefinition(ButterflyModel.LAYER_LOCATION, ButterflyModel::createBodyLayer); event.registerLayerDefinition(RaccoonModel.LAYER_LOCATION, RaccoonModel::createBodyLayer); + event.registerLayerDefinition(MonkeyModel.LAYER_LOCATION, MonkeyModel::createBodyLayer); } @SubscribeEvent @@ -44,11 +46,6 @@ public class ModEventBusEvents { event.put(ModEntities.HEDGEHOG.get(), HedgehogEntity.createAttributes().build()); event.put(ModEntities.RED_PANDA.get(), Red_PandaEntity.createAttributes().build()); event.put(ModEntities.RACCOON.get(), RaccoonEntity.createAttributes().build()); - } - - @SubscribeEvent - public static void registerSpawnPlacements(RegisterSpawnPlacementsEvent event) { - event.register(ModEntities.RACCOON.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, - Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.REPLACE); + event.put(ModEntities.MONKEY.get(), MonkeyEntity.createAttributes().build()); } } diff --git a/src/main/java/ovh/glitchlabs/masterwild/event/ModSpawnPlacements.java b/src/main/java/ovh/glitchlabs/masterwild/event/ModSpawnPlacements.java index 3f50965..b8c7d0d 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/event/ModSpawnPlacements.java +++ b/src/main/java/ovh/glitchlabs/masterwild/event/ModSpawnPlacements.java @@ -30,6 +30,9 @@ public class ModSpawnPlacements { event.register(ModEntities.RED_PANDA.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.REPLACE); + event.register(ModEntities.MONKEY.get(), SpawnPlacementTypes.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, + RegisterSpawnPlacementsEvent.Operation.REPLACE); event.register(ModEntities.SHARK.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, WaterAnimal::checkSurfaceWaterAnimalSpawnRules, @@ -37,7 +40,7 @@ public class ModSpawnPlacements { event.register(ModEntities.FIREFLY.get(), SpawnPlacementTypes.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING, - (type, level, reason, pos, random) -> level.getLevel().isNight() && level.canSeeSky(pos), + (type, level, reason, pos, random) -> level.getLevel().isNight(), RegisterSpawnPlacementsEvent.Operation.REPLACE); event.register(ModEntities.BUTTERFLY.get(), SpawnPlacementTypes.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING, diff --git a/src/main/java/ovh/glitchlabs/masterwild/worldgen/ModBiomeModifiers.java b/src/main/java/ovh/glitchlabs/masterwild/worldgen/ModBiomeModifiers.java index 6c1cf71..5ecf132 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/worldgen/ModBiomeModifiers.java +++ b/src/main/java/ovh/glitchlabs/masterwild/worldgen/ModBiomeModifiers.java @@ -28,6 +28,7 @@ public class ModBiomeModifiers { public static final ResourceKey SPAWN_HEDGEHOG = registerKey("spawn_hedgehog"); public static final ResourceKey SPAWN_RED_PANDA = registerKey("spawn_red_panda"); public static final ResourceKey SPAWN_BUTTERFLY = registerKey("spawn_butterfly"); + public static final ResourceKey SPAWN_MONKEY = registerKey("spawn_monkey"); public static void bootstrap(BootstrapContext context) { var placedFeatures = context.lookup(Registries.PLACED_FEATURE); @@ -64,7 +65,7 @@ public class ModBiomeModifiers { biomes.getOrThrow(Biomes.PLAINS), biomes.getOrThrow(Biomes.SUNFLOWER_PLAINS), biomes.getOrThrow(Biomes.MEADOW)), - ModEntities.ROOSTER.get(), 10, 2, 3); + ModEntities.ROOSTER.get(), 5, 2, 3); addSpawn(context, SPAWN_SHARK, biomes.getOrThrow(BiomeTags.IS_OCEAN), @@ -81,6 +82,11 @@ public class ModBiomeModifiers { biomes.getOrThrow(Biomes.CHERRY_GROVE)), ModEntities.RED_PANDA.get(), 8, 1, 3); + addSpawn(context, SPAWN_MONKEY, + HolderSet.direct( + biomes.getOrThrow(Biomes.JUNGLE)), + ModEntities.MONKEY.get(), 9, 2, 5); + addSpawn(context, SPAWN_BUTTERFLY, HolderSet.direct( biomes.getOrThrow(Biomes.FLOWER_FOREST), diff --git a/src/main/resources/assets/masterwild/sounds.json b/src/main/resources/assets/masterwild/sounds.json index 9310ba8..0db92d2 100644 --- a/src/main/resources/assets/masterwild/sounds.json +++ b/src/main/resources/assets/masterwild/sounds.json @@ -2,5 +2,9 @@ "rooster_crow": { "subtitle": "subtitles.masterwild.rooster_crow", "sounds": ["masterwild:rooster_crow"] + }, + "monkey_hurt": { + "subtitle": "subtitles.masterwild.monkey_hurt", + "sounds": ["masterwild:monkey_hurt"] } } \ No newline at end of file diff --git a/src/main/resources/assets/masterwild/sounds/monkey_hurt.ogg b/src/main/resources/assets/masterwild/sounds/monkey_hurt.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7c80d260e6297b353c3697eb6ee97ee13ca3f228 GIT binary patch literal 6715 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/masterwild/textures/entity/monkey.png b/src/main/resources/assets/masterwild/textures/entity/monkey.png new file mode 100755 index 0000000000000000000000000000000000000000..8d636451fc842228952105cbc717ff5433060876 GIT binary patch literal 2139 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