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 0000000..7c80d26 Binary files /dev/null and b/src/main/resources/assets/masterwild/sounds/monkey_hurt.ogg differ 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 0000000..8d63645 Binary files /dev/null and b/src/main/resources/assets/masterwild/textures/entity/monkey.png differ diff --git a/src/main/resources/assets/masterwild/textures/entity/rooster.png b/src/main/resources/assets/masterwild/textures/entity/rooster.png index 8d476d8..8a908ec 100755 Binary files a/src/main/resources/assets/masterwild/textures/entity/rooster.png and b/src/main/resources/assets/masterwild/textures/entity/rooster.png differ