diff --git a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 index f18e2fb..e778bde 100644 --- a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 +++ b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 @@ -1,12 +1,17 @@ -// 1.21.1 2026-10-03T20:06:11.749153036 Registries +// 1.21.1 2026-10-13T16:08:08.973123976 Registries +6dc6f6baab5618aa54fdaab95faf1ece135b8b69 data/masterwild/neoforge/biome_modifier/spawn_beaver.json ead89faabf72208190d381bb26c0381632944e55 data/masterwild/neoforge/biome_modifier/spawn_butterfly.json 5b1394075b71f32144518c3778e59a37c35788b7 data/masterwild/neoforge/biome_modifier/spawn_capybara.json 42b42dadaa2670d7d4a4405bbd688cad31734cd1 data/masterwild/neoforge/biome_modifier/spawn_duck.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 +8af580e68718f83c4ab4e1ba3a4b0cd065c0402c data/masterwild/neoforge/biome_modifier/spawn_otter.json 643ad56ac8f259789977e34868ea4ea77122aafe data/masterwild/neoforge/biome_modifier/spawn_pinguin.json 264ebbb0f1efd8cefc13e93c0031c3b19c80a225 data/masterwild/neoforge/biome_modifier/spawn_raccoon.json +11349be98ac060765f44c9d882c7a75697573edb data/masterwild/neoforge/biome_modifier/spawn_rat.json 0f98182744360df8e11851c2b6782e325689090d data/masterwild/neoforge/biome_modifier/spawn_red_panda.json cc5600e4e2999812382684cc52f9d59e19a521e1 data/masterwild/neoforge/biome_modifier/spawn_rooster.json 30308b10a3b95454e8678a8324ae88285a9e7b21 data/masterwild/neoforge/biome_modifier/spawn_shark.json +917c97e88a102edd3390a4a9fb96cef4d79cd964 data/masterwild/neoforge/biome_modifier/spawn_squirrel.json +61dbb02ee9c09ae5e34a4b53011bfab20de1221b data/masterwild/neoforge/biome_modifier/spawn_wild_boar.json diff --git a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 index 5d8de18..733c30a 100644 --- a/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 +++ b/src/generated/resources/.cache/6143fb1502ae754d8039ff811e28c49eaa7e6409 @@ -1,2 +1,2 @@ -// 1.21.1 2026-10-03T20:06:11.750559852 Languages: en_us for mod: masterwild -00583df3ad42ddb46acc722e93243863da7ba227 assets/masterwild/lang/en_us.json +// 1.21.1 2026-10-13T16:08:08.973730865 Languages: en_us for mod: masterwild +81bf1ee9c9addc3bd88c52aa3321d62cc33b4df5 assets/masterwild/lang/en_us.json diff --git a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 index 6c9d879..1d09368 100644 --- a/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 +++ b/src/generated/resources/.cache/d1416cf72769a6a520cc2c44944968403e1a0de7 @@ -1,15 +1,20 @@ -// 1.21.1 2026-10-03T20:08:32.139155153 Item Models: masterwild +// 1.21.1 2026-10-13T16:08:08.973990839 Item Models: masterwild +2aa81cb21e77496327acb2976e6c39aec2ffcadb assets/masterwild/models/item/acorns.json a92e1a88c1d3c3c04b2b001f0bffd19a1f3462f0 assets/masterwild/models/item/banana.json 8cb5b876c97ae89d180a200612d0d14c8456c2f7 assets/masterwild/models/item/banana_peel.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/beaver_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/butterfly_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/capybara_spawn_egg.json 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/duck_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/otter_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/rat_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 +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/squirrel_spawn_egg.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/masterwild/models/item/wild_boar_spawn_egg.json diff --git a/src/generated/resources/.cache/d5c0ffbaea6adb3da58b009066607c021a009b4a b/src/generated/resources/.cache/d5c0ffbaea6adb3da58b009066607c021a009b4a index 14f398f..93645e2 100644 --- a/src/generated/resources/.cache/d5c0ffbaea6adb3da58b009066607c021a009b4a +++ b/src/generated/resources/.cache/d5c0ffbaea6adb3da58b009066607c021a009b4a @@ -1 +1,2 @@ -// 1.21.1 2026-09-24T17:08:07.015279022 Tags for minecraft:item mod id masterwild +// 1.21.1 2026-10-13T16:08:08.971991159 Tags for minecraft:item mod id masterwild +497dc583ad66187f5aba24802d96838b8c2289c8 data/c/tags/item/foods.json diff --git a/src/generated/resources/assets/masterwild/lang/en_us.json b/src/generated/resources/assets/masterwild/lang/en_us.json index e906996..d14d2f2 100644 --- a/src/generated/resources/assets/masterwild/lang/en_us.json +++ b/src/generated/resources/assets/masterwild/lang/en_us.json @@ -1,31 +1,40 @@ { "creativetab.masterwild.masterwild": "MasterWild", + "entity.masterwild.beaver": "Beaver", "entity.masterwild.butterfly": "Butterfly", "entity.masterwild.capybara": "Capybara", "entity.masterwild.duck": "Duck", "entity.masterwild.firefly": "Firefly", "entity.masterwild.hedgehog": "Hedgehog", "entity.masterwild.monkey": "Monkey", + "entity.masterwild.otter": "Otter", "entity.masterwild.pinguin": "Pinguin", "entity.masterwild.raccoon": "Raccoon", "entity.masterwild.rat": "Rat", "entity.masterwild.red_panda": "Red Panda", "entity.masterwild.rooster": "Rooster", "entity.masterwild.shark": "Shark", + "entity.masterwild.squirrel": "Squirrel", + "entity.masterwild.wild_boar": "Wild Boar", + "item.masterwild.acorns": "Acorns", "item.masterwild.banana": "Banana", "item.masterwild.banana_peel": "Banana Peel", + "item.masterwild.beaver_spawn_egg": "Beaver Spawn Egg", "item.masterwild.butterfly_spawn_egg": "Butterfly Spawn Egg", "item.masterwild.capybara_spawn_egg": "Capybara Spawn Egg", "item.masterwild.duck_spawn_egg": "Duck 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.otter_spawn_egg": "Otter Spawn Egg", "item.masterwild.pinguin_spawn_egg": "Pinguin Spawn Egg", "item.masterwild.raccoon_spawn_egg": "Raccoon Spawn Egg", "item.masterwild.rat_spawn_egg": "Rat 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", + "item.masterwild.squirrel_spawn_egg": "Squirrel Spawn Egg", + "item.masterwild.wild_boar_spawn_egg": "Wild Boar 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/acorns.json b/src/generated/resources/assets/masterwild/models/item/acorns.json new file mode 100644 index 0000000..89595ae --- /dev/null +++ b/src/generated/resources/assets/masterwild/models/item/acorns.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "masterwild:item/acorns" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/masterwild/models/item/beaver_spawn_egg.json b/src/generated/resources/assets/masterwild/models/item/beaver_spawn_egg.json new file mode 100644 index 0000000..d1aaa9d --- /dev/null +++ b/src/generated/resources/assets/masterwild/models/item/beaver_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/assets/masterwild/models/item/otter_spawn_egg.json b/src/generated/resources/assets/masterwild/models/item/otter_spawn_egg.json new file mode 100644 index 0000000..d1aaa9d --- /dev/null +++ b/src/generated/resources/assets/masterwild/models/item/otter_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/assets/masterwild/models/item/squirrel_spawn_egg.json b/src/generated/resources/assets/masterwild/models/item/squirrel_spawn_egg.json new file mode 100644 index 0000000..d1aaa9d --- /dev/null +++ b/src/generated/resources/assets/masterwild/models/item/squirrel_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/assets/masterwild/models/item/wild_boar_spawn_egg.json b/src/generated/resources/assets/masterwild/models/item/wild_boar_spawn_egg.json new file mode 100644 index 0000000..d1aaa9d --- /dev/null +++ b/src/generated/resources/assets/masterwild/models/item/wild_boar_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/c/tags/item/foods.json b/src/generated/resources/data/c/tags/item/foods.json new file mode 100644 index 0000000..4099977 --- /dev/null +++ b/src/generated/resources/data/c/tags/item/foods.json @@ -0,0 +1,6 @@ +{ + "values": [ + "masterwild:banana", + "masterwild:acorns" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_beaver.json b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_beaver.json new file mode 100644 index 0000000..b19321c --- /dev/null +++ b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_beaver.json @@ -0,0 +1,13 @@ +{ + "type": "neoforge:add_spawns", + "biomes": [ + "minecraft:river", + "minecraft:swamp" + ], + "spawners": { + "type": "masterwild:beaver", + "maxCount": 2, + "minCount": 1, + "weight": 5 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_otter.json b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_otter.json new file mode 100644 index 0000000..aefc463 --- /dev/null +++ b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_otter.json @@ -0,0 +1,13 @@ +{ + "type": "neoforge:add_spawns", + "biomes": [ + "minecraft:river", + "minecraft:swamp" + ], + "spawners": { + "type": "masterwild:otter", + "maxCount": 2, + "minCount": 1, + "weight": 6 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_rat.json b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_rat.json new file mode 100644 index 0000000..9be56ec --- /dev/null +++ b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_rat.json @@ -0,0 +1,10 @@ +{ + "type": "neoforge:add_spawns", + "biomes": "#minecraft:is_forest", + "spawners": { + "type": "masterwild:rat", + "maxCount": 3, + "minCount": 2, + "weight": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_squirrel.json b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_squirrel.json new file mode 100644 index 0000000..4a543d0 --- /dev/null +++ b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_squirrel.json @@ -0,0 +1,14 @@ +{ + "type": "neoforge:add_spawns", + "biomes": [ + "minecraft:forest", + "minecraft:birch_forest", + "minecraft:taiga" + ], + "spawners": { + "type": "masterwild:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 12 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_wild_boar.json b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_wild_boar.json new file mode 100644 index 0000000..fd3cc8c --- /dev/null +++ b/src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_wild_boar.json @@ -0,0 +1,14 @@ +{ + "type": "neoforge:add_spawns", + "biomes": [ + "minecraft:forest", + "minecraft:dark_forest", + "minecraft:taiga" + ], + "spawners": { + "type": "masterwild:wild_boar", + "maxCount": 3, + "minCount": 1, + "weight": 6 + } +} \ 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 059a844..5cfa991 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModCreativeModeTabs.java @@ -21,6 +21,7 @@ public class ModCreativeModeTabs { output.accept(ModItems.BANANA); output.accept(ModItems.BANANA_PEEL); + output.accept(ModItems.ACORNS); output.accept(ModItems.PINGUIN_SPAWN_EGG); output.accept(ModItems.FIREFLY_SPAWN_EGG); @@ -34,6 +35,20 @@ public class ModCreativeModeTabs { output.accept(ModItems.CAPYBARA_SPAWN_EGG); output.accept(ModItems.DUCK_SPAWN_EGG); output.accept(ModItems.RAT_SPAWN_EGG); + output.accept(ModItems.SQUIRREL_SPAWN_EGG); + output.accept(ModItems.OTTER_SPAWN_EGG); + /* + output.accept(ModItems.DEER_SPAWN_EGG); + + */ + output.accept(ModItems.BEAVER_SPAWN_EGG); + /* + output.accept(ModItems.FALCON_SPAWN_EGG); + output.accept(ModItems.MOLE_SPAWN_EGG); + output.accept(ModItems.HERON_SPAWN_EGG); + + */ + output.accept(ModItems.WILD_BOAR_SPAWN_EGG); }).build()); diff --git a/src/main/java/ovh/glitchlabs/masterwild/Item/ModFoodProperties.java b/src/main/java/ovh/glitchlabs/masterwild/Item/ModFoodProperties.java index d26adfa..6474dee 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModFoodProperties.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModFoodProperties.java @@ -4,10 +4,15 @@ import net.minecraft.world.food.FoodProperties; public class ModFoodProperties { public static final FoodProperties BANANA = new FoodProperties.Builder() - .nutrition(3) - .saturationModifier(0.25F) + .nutrition(4) + .saturationModifier(0.5F) .usingConvertsTo(ModItems.BANANA_PEEL.get()) .build(); + public static final FoodProperties ACORNS = new FoodProperties.Builder() + .nutrition(2) + .saturationModifier(0.25F) + .build(); + } diff --git a/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java b/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java index e050be2..92d42db 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Item/ModItems.java @@ -24,6 +24,12 @@ public class ModItems { .food(ModFoodProperties.BANANA) )); + public static final DeferredItem ACORNS = ITEMS.register("acorns", + () -> new Item(new Item.Properties() + .stacksTo(16) + .food(ModFoodProperties.ACORNS) + )); + //SpawnEggs public static final DeferredItem PINGUIN_SPAWN_EGG = ITEMS.register("pinguin_spawn_egg", () -> new DeferredSpawnEggItem(ModEntities.PINGUIN, 0x0b0b17, 0xd6e3e3, @@ -61,8 +67,38 @@ public class ModItems { public static final DeferredItem RAT_SPAWN_EGG = ITEMS.register("rat_spawn_egg", () -> new DeferredSpawnEggItem(ModEntities.RAT, 0x767677, 0x965654, new Item.Properties())); + public static final DeferredItem SQUIRREL_SPAWN_EGG = ITEMS.register("squirrel_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.SQUIRREL, 0x8a4a2b, 0xc96a2f, + new Item.Properties())); + public static final DeferredItem OTTER_SPAWN_EGG = ITEMS.register("otter_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.OTTER, 0x4f3a2a, 0xcabf9e, + new Item.Properties())); + /* + public static final DeferredItem DEER_SPAWN_EGG = ITEMS.register("deer_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.DEER, 0x7a5330, 0xe8d9b5, + new Item.Properties())); + + */ + public static final DeferredItem BEAVER_SPAWN_EGG = ITEMS.register("beaver_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.BEAVER, 0x4a3522, 0x8a6a42, + new Item.Properties())); + /* + public static final DeferredItem FALCON_SPAWN_EGG = ITEMS.register("falcon_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.FALCON, 0x5c4a3d, 0xd8c9a3, + new Item.Properties())); + public static final DeferredItem MOLE_SPAWN_EGG = ITEMS.register("mole_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.MOLE, 0x2e2a28, 0x6b5d52, + new Item.Properties())); + public static final DeferredItem HERON_SPAWN_EGG = ITEMS.register("heron_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.HERON, 0xd9d4c9, 0xe6943b, + new Item.Properties())); + + */ + public static final DeferredItem WILD_BOAR_SPAWN_EGG = ITEMS.register("wild_boar_spawn_egg", + () -> new DeferredSpawnEggItem(ModEntities.WILD_BOAR, 0x3f2f26, 0x8c7158, + new Item.Properties())); public static void register(IEventBus eventBus) { ITEMS.register(eventBus); } -} +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java b/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java index 4426675..a637ba7 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java +++ b/src/main/java/ovh/glitchlabs/masterwild/Masterwild.java @@ -8,7 +8,6 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; -import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.common.NeoForge; @@ -19,11 +18,15 @@ 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.Beaver.BeaverRenderer; import ovh.glitchlabs.masterwild.entity.client.Monkey.MonkeyRenderer; +import ovh.glitchlabs.masterwild.entity.client.Otter.OtterRenderer; import ovh.glitchlabs.masterwild.entity.client.Pinguin.PinguinRenderer; import ovh.glitchlabs.masterwild.entity.client.Raccoon.RaccoonRenderer; import ovh.glitchlabs.masterwild.entity.client.Rooster.RoosterRenderer; import ovh.glitchlabs.masterwild.entity.client.Shark.SharkRenderer; +import ovh.glitchlabs.masterwild.entity.client.Squirrel.SquirrelRenderer; +import ovh.glitchlabs.masterwild.entity.client.WildBoar.wildboarRenderer; import ovh.glitchlabs.masterwild.entity.client.butterfly.ButterflyRenderer; import ovh.glitchlabs.masterwild.entity.client.capibara.CapybaraRenderer; import ovh.glitchlabs.masterwild.entity.client.duck.duckRenderer; @@ -90,6 +93,14 @@ public class Masterwild { EntityRenderers.register(ModEntities.CAPYBARA.get(), CapybaraRenderer::new); EntityRenderers.register(ModEntities.DUCK.get(), duckRenderer::new); EntityRenderers.register(ModEntities.RAT.get(), ratRenderer::new); + EntityRenderers.register(ModEntities.BEAVER.get(), BeaverRenderer::new); + //EntityRenderers.register(ModEntities.DEER.get(), DeerRenderer::new); + //EntityRenderers.register(ModEntities.FALCON.get(), FalconRenderer::new); + //EntityRenderers.register(ModEntities.HERON.get(), HeronRenderer::new); + //EntityRenderers.register(ModEntities.MOLE.get(), MoleRenderer::new); + EntityRenderers.register(ModEntities.OTTER.get(), OtterRenderer::new); + EntityRenderers.register(ModEntities.SQUIRREL.get(), SquirrelRenderer::new); + EntityRenderers.register(ModEntities.WILD_BOAR.get(), wildboarRenderer::new); } } } diff --git a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java index e51fa68..6f76dcc 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemModelProvider.java @@ -19,6 +19,7 @@ public class ModItemModelProvider extends ItemModelProvider { //food basicItem(ModItems.BANANA.get()); + basicItem(ModItems.ACORNS.get()); //spawneggs withExistingParent(ModItems.PINGUIN_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); @@ -33,5 +34,19 @@ public class ModItemModelProvider extends ItemModelProvider { withExistingParent(ModItems.CAPYBARA_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); withExistingParent(ModItems.DUCK_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); withExistingParent(ModItems.RAT_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + withExistingParent(ModItems.SQUIRREL_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + withExistingParent(ModItems.OTTER_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + /* + withExistingParent(ModItems.DEER_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + + */ + withExistingParent(ModItems.BEAVER_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + /* + withExistingParent(ModItems.FALCON_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + withExistingParent(ModItems.MOLE_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + withExistingParent(ModItems.HERON_SPAWN_EGG.getId().getPath(), mcLoc("item/template_spawn_egg")); + + */ + withExistingParent(ModItems.WILD_BOAR_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/ModItemTagProvider.java b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemTagProvider.java index 3c116df..cf634c3 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemTagProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModItemTagProvider.java @@ -5,6 +5,8 @@ import net.minecraft.data.PackOutput; import net.minecraft.data.tags.ItemTagsProvider; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.Nullable; import ovh.glitchlabs.masterwild.Item.ModItems; @@ -20,7 +22,10 @@ public class ModItemTagProvider extends ItemTagsProvider { @Override protected void addTags(HolderLookup.Provider provider) { - //tag(ModTags.Items.TRANSFORMABLE_ITEMS); + tag(Tags.Items.FOODS) + .add(ModItems.BANANA.get()) + .add(ModItems.ACORNS.get()) + ; } } \ 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 5697456..9fda0cc 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java +++ b/src/main/java/ovh/glitchlabs/masterwild/datagen/ModLanguageProvider.java @@ -16,6 +16,7 @@ public class ModLanguageProvider extends LanguageProvider { protected void addTranslations() { add(ModItems.BANANA.get(), "Banana"); add(ModItems.BANANA_PEEL.get(), "Banana Peel"); + add(ModItems.ACORNS.get(), "Acorns"); add(ModEntities.PINGUIN.get(), "Pinguin"); add(ModEntities.FIREFLY.get(), "Firefly"); @@ -29,6 +30,20 @@ public class ModLanguageProvider extends LanguageProvider { add(ModEntities.CAPYBARA.get(), "Capybara"); add(ModEntities.DUCK.get(), "Duck"); add(ModEntities.RAT.get(), "Rat"); + add(ModEntities.SQUIRREL.get(), "Squirrel"); + add(ModEntities.OTTER.get(), "Otter"); + /* + add(ModEntities.DEER.get(), "Deer"); + + */ + add(ModEntities.BEAVER.get(), "Beaver"); + /* + add(ModEntities.FALCON.get(), "Falcon"); + add(ModEntities.MOLE.get(), "Mole"); + add(ModEntities.HERON.get(), "Heron"); + + */ + add(ModEntities.WILD_BOAR.get(), "Wild Boar"); add(ModItems.PINGUIN_SPAWN_EGG.get(), "Pinguin Spawn Egg"); add(ModItems.FIREFLY_SPAWN_EGG.get(), "Firefly Spawn Egg"); @@ -42,6 +57,19 @@ public class ModLanguageProvider extends LanguageProvider { add(ModItems.CAPYBARA_SPAWN_EGG.get(), "Capybara Spawn Egg"); add(ModItems.DUCK_SPAWN_EGG.get(), "Duck Spawn Egg"); add(ModItems.RAT_SPAWN_EGG.get(), "Rat Spawn Egg"); + add(ModItems.SQUIRREL_SPAWN_EGG.get(), "Squirrel Spawn Egg"); + add(ModItems.OTTER_SPAWN_EGG.get(), "Otter Spawn Egg"); + /* + add(ModItems.DEER_SPAWN_EGG.get(), "Deer Spawn Egg"); + */ + add(ModItems.BEAVER_SPAWN_EGG.get(), "Beaver Spawn Egg"); + /* + add(ModItems.FALCON_SPAWN_EGG.get(), "Falcon Spawn Egg"); + add(ModItems.MOLE_SPAWN_EGG.get(), "Mole Spawn Egg"); + add(ModItems.HERON_SPAWN_EGG.get(), "Heron Spawn Egg"); + + */ + add(ModItems.WILD_BOAR_SPAWN_EGG.get(), "Wild Boar Spawn Egg"); add("creativetab.masterwild.masterwild", "MasterWild"); diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java b/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java index f29f5d2..c7bfd24 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/ModEntities.java @@ -62,6 +62,43 @@ public class ModEntities { ENTITY_TYPES.register("rat", () -> EntityType.Builder.of(RatEntity::new, MobCategory.CREATURE) .sized(0.6f, 0.5f).build("rat")); + public static final Supplier> SQUIRREL = + ENTITY_TYPES.register("squirrel", () -> EntityType.Builder.of(SquirrelEntity::new, MobCategory.CREATURE) + .sized(0.4f, 0.5f).build("squirrel")); + + public static final Supplier> OTTER = + ENTITY_TYPES.register("otter", () -> EntityType.Builder.of(OtterEntity::new, MobCategory.CREATURE) + .sized(0.5f, 0.4f).build("otter")); +/* + public static final Supplier> DEER = + ENTITY_TYPES.register("deer", () -> EntityType.Builder.of(DeerEntity::new, MobCategory.CREATURE) + .sized(0.9f, 1.4f).build("deer")); + + */ + + public static final Supplier> BEAVER = + ENTITY_TYPES.register("beaver", () -> EntityType.Builder.of(BeaverEntity::new, MobCategory.CREATURE) + .sized(0.6f, 0.5f).build("beaver")); + + /* + public static final Supplier> FALCON = + ENTITY_TYPES.register("falcon", () -> EntityType.Builder.of(FalconEntity::new, MobCategory.CREATURE) + .sized(0.5f, 0.4f).build("falcon")); + + public static final Supplier> MOLE = + ENTITY_TYPES.register("mole", () -> EntityType.Builder.of(MoleEntity::new, MobCategory.CREATURE) + .sized(0.3f, 0.25f).build("mole")); + + public static final Supplier> HERON = + ENTITY_TYPES.register("heron", () -> EntityType.Builder.of(HeronEntity::new, MobCategory.CREATURE) + .sized(0.6f, 1.2f).build("heron")); + + + */ + public static final Supplier> WILD_BOAR = + ENTITY_TYPES.register("wild_boar", () -> EntityType.Builder.of(WildBoarEntity::new, MobCategory.CREATURE) + .sized(0.9f, 0.9f).build("wild_boar")); + public static void register(IEventBus eventBus) { ENTITY_TYPES.register(eventBus); diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/Beaver/BeaverModel.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Beaver/BeaverModel.java new file mode 100755 index 0000000..a05e224 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Beaver/BeaverModel.java @@ -0,0 +1,101 @@ +package ovh.glitchlabs.masterwild.entity.client.Beaver;// 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.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.BeaverEntity; + +public class BeaverModel 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, "beavermodel"), "main"); + private final ModelPart beaver; + private final ModelPart body; + private final ModelPart L_Front_Leg; + private final ModelPart L_Back_leg; + private final ModelPart R_Front_leg; + private final ModelPart R_back_leg; + private final ModelPart head; + + public BeaverModel(ModelPart root) { + this.beaver = root.getChild("beaver"); + this.body = this.beaver.getChild("body"); + this.L_Front_Leg = this.beaver.getChild("L_Front_Leg"); + this.L_Back_leg = this.beaver.getChild("L_Back_leg"); + this.R_Front_leg = this.beaver.getChild("R_Front_leg"); + this.R_back_leg = this.beaver.getChild("R_back_leg"); + this.head = this.beaver.getChild("head"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition beaver = partdefinition.addOrReplaceChild("beaver", CubeListBuilder.create(), PartPose.offset(0.1667F, 20.5526F, 0.0742F)); + + PartDefinition body = beaver.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 0).addBox(-5.5F, -4.7157F, -5.7192F, 11.0F, 9.0F, 11.0F, new CubeDeformation(0.0F)), PartPose.offset(-0.1667F, -1.8369F, 1.645F)); + + PartDefinition cube_r1 = body.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(0, 20).addBox(-1.0F, -0.7137F, -0.233F, 7.0F, 1.0F, 11.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.5F, -0.7157F, 5.0308F, -0.2182F, 0.0F, 0.0F)); + + PartDefinition L_Front_Leg = beaver.addOrReplaceChild("L_Front_Leg", CubeListBuilder.create().texOffs(44, 13).addBox(-1.75F, -1.25F, -1.5F, 3.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(44, 5).addBox(-1.75F, 1.75F, -3.0F, 4.0F, 0.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(5.3333F, 1.6974F, -2.8242F)); + + PartDefinition L_Back_leg = beaver.addOrReplaceChild("L_Back_leg", CubeListBuilder.create().texOffs(30, 32).addBox(-2.0F, -2.0F, -2.0F, 3.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(30, 41).addBox(-1.0F, 3.0F, -3.5F, 3.0F, 0.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offset(5.5833F, 0.4474F, 4.1758F)); + + PartDefinition R_Front_leg = beaver.addOrReplaceChild("R_Front_leg", CubeListBuilder.create().texOffs(44, 29).addBox(-1.25F, -1.25F, -1.5F, 3.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(44, 9).addBox(-2.25F, 1.75F, -3.0F, 4.0F, 0.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.1667F, 1.6974F, -2.8242F)); + + PartDefinition R_back_leg = beaver.addOrReplaceChild("R_back_leg", CubeListBuilder.create().texOffs(36, 20).addBox(-1.0F, -2.0F, -2.0F, 3.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(44, 0).addBox(-2.0F, 3.0F, -3.5F, 3.0F, 0.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offset(-5.4167F, 0.4474F, 4.1758F)); + + PartDefinition head = beaver.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 32).addBox(-3.5F, -3.1F, -7.726F, 7.0F, 7.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(44, 35).addBox(-2.5F, -2.1F, -8.726F, 5.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(44, 19).addBox(-1.5F, 0.9F, -8.226F, 3.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(-0.1667F, -2.4526F, -4.3482F)); + + PartDefinition cube_r2 = head.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(36, 29).addBox(-6.0F, -2.0F, 3.0F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -2.1F, -6.726F, 0.0F, 0.1745F, 0.0F)); + + PartDefinition cube_r3 = head.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(30, 46).addBox(4.0F, -2.0F, 3.0F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.0F, -2.1F, -6.726F, 0.0F, -0.1745F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + @Override + public void setupAnim(BeaverEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts().forEach(ModelPart::resetPose); + this.applyHeadRotation(netHeadYaw, headPitch); + this.walk(limbSwing, limbSwingAmount); + } + + 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); + } + + private void walk(float limbSwing, float limbSwingAmount) { + float amount = 1.0F * limbSwingAmount; + this.R_Front_leg.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.L_Back_leg.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.L_Front_Leg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + this.R_back_leg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + beaver.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + } + + @Override + public ModelPart root() { + return beaver; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/Beaver/BeaverRenderer.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Beaver/BeaverRenderer.java new file mode 100644 index 0000000..613433f --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Beaver/BeaverRenderer.java @@ -0,0 +1,32 @@ +package ovh.glitchlabs.masterwild.entity.client.Beaver; + +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.BeaverEntity; + +public class BeaverRenderer extends MobRenderer> { + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/beaver.png"); + private static final float ADULT_SCALE = 0.85f; + private static final float BABY_SCALE = 0.45f; + private static final float SHADOW = 0.25f; + + public BeaverRenderer(EntityRendererProvider.Context context) { + super(context, new BeaverModel<>(context.bakeLayer(BeaverModel.LAYER_LOCATION)), SHADOW); + } + + @Override + public ResourceLocation getTextureLocation(BeaverEntity entity) { + return TEXTURE; + } + + @Override + protected void scale(BeaverEntity 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/client/Otter/OtterModel.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Otter/OtterModel.java new file mode 100755 index 0000000..f593ccd --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Otter/OtterModel.java @@ -0,0 +1,101 @@ +package ovh.glitchlabs.masterwild.entity.client.Otter;// 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.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.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import ovh.glitchlabs.masterwild.Masterwild; +import ovh.glitchlabs.masterwild.entity.custom.OtterEntity; + +public class OtterModel 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, "ottermodel"), "main"); + private final ModelPart otter; + private final ModelPart body; + private final ModelPart tail; + private final ModelPart L_Front_leg; + private final ModelPart L_back_leg; + private final ModelPart R_Front_leg; + private final ModelPart R_back_leg; + private final ModelPart head; + + public OtterModel(ModelPart root) { + this.otter = root.getChild("otter"); + this.body = this.otter.getChild("body"); + this.tail = this.body.getChild("tail"); + this.L_Front_leg = this.otter.getChild("L_Front_leg"); + this.L_back_leg = this.otter.getChild("L_back_leg"); + this.R_Front_leg = this.otter.getChild("R_Front_leg"); + this.R_back_leg = this.otter.getChild("R_back_leg"); + this.head = this.otter.getChild("head"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition otter = partdefinition.addOrReplaceChild("otter", CubeListBuilder.create(), PartPose.offset(0.0833F, 23.0F, -3.125F)); + + PartDefinition body = otter.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 0).addBox(-3.0F, -5.0F, -3.0F, 5.0F, 5.0F, 12.0F, new CubeDeformation(0.0F)), PartPose.offset(0.4167F, -2.0F, 2.125F)); + + PartDefinition tail = body.addOrReplaceChild("tail", CubeListBuilder.create().texOffs(22, 17).addBox(-1.0F, -1.5F, 0.0F, 3.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-1.0F, -2.5F, 9.0F)); + + PartDefinition L_Front_leg = otter.addOrReplaceChild("L_Front_leg", CubeListBuilder.create().texOffs(22, 26).addBox(-1.5F, -1.0F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(1.9167F, -2.0F, 1.375F)); + + PartDefinition L_back_leg = otter.addOrReplaceChild("L_back_leg", CubeListBuilder.create().texOffs(12, 33).addBox(-1.5F, -1.0F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(1.9167F, -2.0F, 9.375F)); + + PartDefinition R_Front_leg = otter.addOrReplaceChild("R_Front_leg", CubeListBuilder.create().texOffs(24, 33).addBox(-1.5F, -1.0F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-2.0833F, -2.0F, 1.375F)); + + PartDefinition R_back_leg = otter.addOrReplaceChild("R_back_leg", CubeListBuilder.create().texOffs(0, 28).addBox(-1.5F, -1.0F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-2.0833F, -2.0F, 9.375F)); + + PartDefinition head = otter.addOrReplaceChild("head", CubeListBuilder.create().texOffs(34, 0).addBox(-6.0F, -1.5833F, -2.5833F, 3.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(34, 10).addBox(-4.0F, -3.5833F, -0.5833F, 1.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(0, 17).addBox(-3.0F, -4.5833F, -3.8333F, 6.0F, 6.0F, 5.0F, new CubeDeformation(0.0F)) + .texOffs(12, 28).addBox(-2.0F, -1.5833F, -4.8333F, 4.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(34, 4).addBox(3.0F, -1.5833F, -2.5833F, 3.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(34, 8).addBox(3.0F, -3.5833F, -0.5833F, 1.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(-0.0833F, -6.4167F, -0.0417F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + @Override + public void setupAnim(OtterEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts().forEach(ModelPart::resetPose); + this.applyHeadRotation(netHeadYaw, headPitch); + this.walk(limbSwing, limbSwingAmount); + } + + 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); + } + + private void walk(float limbSwing, float limbSwingAmount) { + float amount = 1.0F * limbSwingAmount; + this.R_Front_leg.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.L_back_leg.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.L_Front_leg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + this.R_back_leg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + otter.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + } + + @Override + public ModelPart root() { + return otter; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/Otter/OtterRenderer.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Otter/OtterRenderer.java new file mode 100644 index 0000000..eb5f425 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Otter/OtterRenderer.java @@ -0,0 +1,32 @@ +package ovh.glitchlabs.masterwild.entity.client.Otter; + +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.OtterEntity; + +public class OtterRenderer extends MobRenderer> { + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/otter.png"); + private static final float ADULT_SCALE = 0.8f; + private static final float BABY_SCALE = 0.45f; + private static final float SHADOW = 0.25f; + + public OtterRenderer(EntityRendererProvider.Context context) { + super(context, new OtterModel<>(context.bakeLayer(OtterModel.LAYER_LOCATION)), SHADOW); + } + + @Override + public ResourceLocation getTextureLocation(OtterEntity entity) { + return TEXTURE; + } + + @Override + protected void scale(OtterEntity 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/client/Squirrel/SquirrelModel.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Squirrel/SquirrelModel.java new file mode 100755 index 0000000..a3e63ae --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Squirrel/SquirrelModel.java @@ -0,0 +1,155 @@ +package ovh.glitchlabs.masterwild.entity.client.Squirrel;// 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.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.SquirrelEntity; + +public class SquirrelModel 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, "squirrelmodel"), "main"); + private final ModelPart Squirrel; + private final ModelPart head; + private final ModelPart body; + private final ModelPart R_Back_Leg; + private final ModelPart R_Back_down_Leg; + private final ModelPart R_Front_leg; + private final ModelPart L_front_Leg; + private final ModelPart L_Back_Leg; + private final ModelPart L_Back_down_leg; + private final ModelPart tail; + + public SquirrelModel(ModelPart root) { + this.Squirrel = root.getChild("Squirrel"); + this.head = this.Squirrel.getChild("head"); + this.body = this.Squirrel.getChild("body"); + this.R_Back_Leg = this.Squirrel.getChild("R_Back_Leg"); + this.R_Back_down_Leg = this.R_Back_Leg.getChild("R_Back_down_Leg"); + this.R_Front_leg = this.Squirrel.getChild("R_Front_leg"); + this.L_front_Leg = this.Squirrel.getChild("L_front_Leg"); + this.L_Back_Leg = this.Squirrel.getChild("L_Back_Leg"); + this.L_Back_down_leg = this.L_Back_Leg.getChild("L_Back_down_leg"); + this.tail = this.Squirrel.getChild("tail"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition Squirrel = partdefinition.addOrReplaceChild("Squirrel", CubeListBuilder.create(), PartPose.offset(0.0F, 25.0F, 0.0F)); + + PartDefinition head = Squirrel.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 9).addBox(-2.0F, -2.7926F, -3.8209F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -5.2074F, -2.1791F)); + + PartDefinition cube_r1 = head.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(16, 26).addBox(1.0F, -2.0F, -2.0F, 1.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.7926F, -0.3209F, 0.0F, 0.0F, 0.3491F)); + + PartDefinition cube_r2 = head.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(20, 0).addBox(-1.0F, -2.0F, -1.0F, 3.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.5F, 1.2074F, -4.3209F, 0.2182F, 0.0F, 0.0F)); + + PartDefinition cube_r3 = head.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(26, 14).addBox(-2.0F, -2.0F, -2.0F, 1.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.7926F, -0.3209F, 0.0F, 0.0F, -0.3491F)); + + PartDefinition body = Squirrel.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.offset(0.0F, -4.616F, 1.1651F)); + + PartDefinition cube_r4 = body.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(16, 9).addBox(-1.0F, -1.0F, 1.0F, 3.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.5F, -1.634F, -2.1651F, -0.5236F, 0.0F, 0.0F)); + + PartDefinition cube_r5 = body.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(0, 0).addBox(-2.0F, -3.0F, -1.0F, 4.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.866F, -3.1651F, -0.5236F, 0.0F, 0.0F)); + + PartDefinition R_Back_Leg = Squirrel.addOrReplaceChild("R_Back_Leg", CubeListBuilder.create(), PartPose.offset(-2.5305F, -3.558F, 0.3338F)); + + PartDefinition cube_r6 = R_Back_Leg.addOrReplaceChild("cube_r6", CubeListBuilder.create().texOffs(16, 14).addBox(1.0F, -2.0F, 1.0F, 1.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.4695F, -0.192F, -2.3338F, -0.5236F, 0.0F, 0.0F)); + + PartDefinition R_Back_down_Leg = R_Back_Leg.addOrReplaceChild("R_Back_down_Leg", CubeListBuilder.create(), PartPose.offset(0.5305F, 2.558F, 1.1662F)); + + PartDefinition cube_r7 = R_Back_down_Leg.addOrReplaceChild("cube_r7", CubeListBuilder.create().texOffs(8, 26).addBox(-1.0F, -1.0F, -2.0F, 1.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.1309F, 0.0F)); + + PartDefinition R_Front_leg = Squirrel.addOrReplaceChild("R_Front_leg", CubeListBuilder.create().texOffs(4, 29).addBox(-0.5F, -0.25F, -0.5F, 1.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(-1.75F, -3.75F, -2.0F)); + + PartDefinition L_front_Leg = Squirrel.addOrReplaceChild("L_front_Leg", CubeListBuilder.create().texOffs(30, 0).addBox(-0.5F, -0.25F, -0.5F, 1.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(1.75F, -3.75F, -2.0F)); + + PartDefinition L_Back_Leg = Squirrel.addOrReplaceChild("L_Back_Leg", CubeListBuilder.create(), PartPose.offset(2.5305F, -3.558F, 0.3338F)); + + PartDefinition cube_r8 = L_Back_Leg.addOrReplaceChild("cube_r8", CubeListBuilder.create().texOffs(0, 17).addBox(-2.0F, -2.0F, 1.0F, 1.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.4695F, -0.192F, -2.3338F, -0.5236F, 0.0F, 0.0F)); + + PartDefinition L_Back_down_leg = L_Back_Leg.addOrReplaceChild("L_Back_down_leg", CubeListBuilder.create(), PartPose.offset(-0.5305F, 2.558F, 1.1662F)); + + PartDefinition cube_r9 = L_Back_down_leg.addOrReplaceChild("cube_r9", CubeListBuilder.create().texOffs(20, 4).addBox(0.0F, -1.0F, -2.0F, 1.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, -0.1309F, 0.0F)); + + PartDefinition tail = Squirrel.addOrReplaceChild("tail", CubeListBuilder.create(), PartPose.offset(0.0F, -2.9035F, 3.0352F)); + + PartDefinition cube_r10 = tail.addOrReplaceChild("cube_r10", CubeListBuilder.create().texOffs(18, 20).addBox(-1.0F, -4.0F, -1.0F, 2.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -5.3465F, 0.9648F, 0.8727F, 0.0F, 0.0F)); + + PartDefinition cube_r11 = tail.addOrReplaceChild("cube_r11", CubeListBuilder.create().texOffs(30, 24).addBox(-1.0F, -4.0F, 1.0F, 2.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.0F, -4.8465F, 1.2148F, 0.8731F, -0.028F, -0.0334F)); + + PartDefinition cube_r12 = tail.addOrReplaceChild("cube_r12", CubeListBuilder.create().texOffs(30, 18).addBox(-1.0F, -4.0F, 1.0F, 2.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.0F, -4.0965F, 0.4648F, 0.8745F, 0.0561F, 0.0669F)); + + PartDefinition cube_r13 = tail.addOrReplaceChild("cube_r13", CubeListBuilder.create().texOffs(8, 30).addBox(-1.0F, -3.0F, 1.0F, 2.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.0F, -2.5965F, 0.7148F, 0.176F, -0.1289F, -0.0229F)); + + PartDefinition cube_r14 = tail.addOrReplaceChild("cube_r14", CubeListBuilder.create().texOffs(12, 30).addBox(-1.0F, -3.0F, 1.0F, 2.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.0F, -2.5965F, -0.2852F, 0.1752F, 0.0859F, 0.0152F)); + + PartDefinition cube_r15 = tail.addOrReplaceChild("cube_r15", CubeListBuilder.create().texOffs(28, 4).addBox(1.0F, -4.0F, -1.0F, 0.0F, 3.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.5F, -2.0965F, 3.2148F, 0.176F, 0.1289F, 0.0229F)); + + PartDefinition cube_r16 = tail.addOrReplaceChild("cube_r16", CubeListBuilder.create().texOffs(26, 18).addBox(-1.0F, -4.0F, -1.0F, 0.0F, 3.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, -2.0965F, 3.2148F, 0.176F, -0.1289F, -0.0229F)); + + PartDefinition cube_r17 = tail.addOrReplaceChild("cube_r17", CubeListBuilder.create().texOffs(22, 26).addBox(1.0F, -3.0F, -1.0F, 0.0F, 3.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.5F, -6.8465F, 1.7148F, 0.8959F, 0.1945F, 0.237F)); + + PartDefinition cube_r18 = tail.addOrReplaceChild("cube_r18", CubeListBuilder.create().texOffs(26, 23).addBox(-1.0F, -3.0F, -1.0F, 0.0F, 3.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, -6.8465F, 1.7148F, 0.8959F, -0.1945F, -0.237F)); + + PartDefinition cube_r19 = tail.addOrReplaceChild("cube_r19", CubeListBuilder.create().texOffs(16, 30).addBox(-1.0F, -4.0F, 1.0F, 2.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0F, -4.8465F, 1.2148F, 0.8731F, 0.028F, 0.0334F)); + + PartDefinition cube_r20 = tail.addOrReplaceChild("cube_r20", CubeListBuilder.create().texOffs(30, 21).addBox(-1.0F, -4.0F, 1.0F, 2.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0F, -4.0965F, 0.4648F, 0.8745F, -0.0561F, -0.0669F)); + + PartDefinition cube_r21 = tail.addOrReplaceChild("cube_r21", CubeListBuilder.create().texOffs(30, 9).addBox(-1.0F, -3.0F, 1.0F, 2.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0F, -2.5965F, -0.2852F, 0.1752F, -0.0859F, -0.0152F)); + + PartDefinition cube_r22 = tail.addOrReplaceChild("cube_r22", CubeListBuilder.create().texOffs(10, 17).addBox(-1.0F, -3.0F, 1.0F, 2.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0F, -2.5965F, 0.7148F, 0.176F, 0.1289F, 0.0229F)); + + PartDefinition cube_r23 = tail.addOrReplaceChild("cube_r23", CubeListBuilder.create().texOffs(0, 23).addBox(-1.0F, -4.0F, -1.0F, 2.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0965F, 1.2148F, 0.1745F, 0.0F, 0.0F)); + + PartDefinition cube_r24 = tail.addOrReplaceChild("cube_r24", CubeListBuilder.create().texOffs(26, 28).addBox(1.0F, -3.0F, -1.0F, 0.0F, 3.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.5F, 1.1535F, 1.7148F, -0.3155F, 0.2494F, -0.0804F)); + + PartDefinition cube_r25 = tail.addOrReplaceChild("cube_r25", CubeListBuilder.create().texOffs(0, 29).addBox(-1.0F, -3.0F, -1.0F, 0.0F, 3.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, 1.1535F, 1.7148F, -0.3155F, -0.2494F, 0.0804F)); + + PartDefinition cube_r26 = tail.addOrReplaceChild("cube_r26", CubeListBuilder.create().texOffs(10, 20).addBox(-1.0F, -4.0F, -1.0F, 2.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 1.1535F, -0.0352F, -0.3054F, 0.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + @Override + public void setupAnim(SquirrelEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts().forEach(ModelPart::resetPose); + this.applyHeadRotation(netHeadYaw, headPitch); + this.walk(limbSwing, limbSwingAmount); + } + + 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); + } + + private void walk(float limbSwing, float limbSwingAmount) { + float amount = 1.0F * limbSwingAmount; + this.R_Front_leg.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.L_Back_Leg.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.L_front_Leg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + this.R_Back_Leg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + Squirrel.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + } + + @Override + public ModelPart root() { + return Squirrel; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/Squirrel/SquirrelRenderer.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Squirrel/SquirrelRenderer.java new file mode 100644 index 0000000..5e7143e --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/Squirrel/SquirrelRenderer.java @@ -0,0 +1,32 @@ +package ovh.glitchlabs.masterwild.entity.client.Squirrel; + +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.SquirrelEntity; + +public class SquirrelRenderer extends MobRenderer> { + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/squirrel.png"); + private static final float ADULT_SCALE = 1.0f; + private static final float BABY_SCALE = 0.45f; + private static final float SHADOW = 0.25f; + + public SquirrelRenderer(EntityRendererProvider.Context context) { + super(context, new SquirrelModel<>(context.bakeLayer(SquirrelModel.LAYER_LOCATION)), SHADOW); + } + + @Override + public ResourceLocation getTextureLocation(SquirrelEntity entity) { + return TEXTURE; + } + + @Override + protected void scale(SquirrelEntity 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/client/WildBoar/wildboarModel.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/WildBoar/wildboarModel.java new file mode 100755 index 0000000..577a062 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/WildBoar/wildboarModel.java @@ -0,0 +1,97 @@ +package ovh.glitchlabs.masterwild.entity.client.WildBoar;// 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.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.WildBoarEntity; + +public class wildboarModel 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, "wildboarmodel"), "main"); + private final ModelPart wildBoar; + private final ModelPart body; + private final ModelPart head; + private final ModelPart leg1; + private final ModelPart leg2; + private final ModelPart leg3; + private final ModelPart leg4; + + public wildboarModel(ModelPart root) { + this.wildBoar = root.getChild("wildBoar"); + this.body = this.wildBoar.getChild("body"); + this.head = this.wildBoar.getChild("head"); + this.leg1 = this.wildBoar.getChild("leg1"); + this.leg2 = this.wildBoar.getChild("leg2"); + this.leg3 = this.wildBoar.getChild("leg3"); + this.leg4 = this.wildBoar.getChild("leg4"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition wildBoar = partdefinition.addOrReplaceChild("wildBoar", CubeListBuilder.create(), PartPose.offset(0.0F, 11.0F, 2.0F)); + + PartDefinition body = wildBoar.addOrReplaceChild("body", CubeListBuilder.create().texOffs(28, 8).addBox(-5.0F, -10.0F, -7.0F, 10.0F, 16.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.0F)); + + PartDefinition cube_r1 = body.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(0, 20).addBox(1.0F, -2.0F, -1.0F, 0.0F, 5.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.0F, 7.0F, -1.0F, -1.5708F, 0.0F, 0.0F)); + + PartDefinition head = wildBoar.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -4.0F, -8.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(15, 15).addBox(-2.0F, 0.0F, -10.0F, 4.0F, 3.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 1.0F, -8.0F)); + + PartDefinition cube_r2 = head.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(16, 22).mirror().addBox(0.0F, -3.0F, 0.0F, 1.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)).mirror(false) + .texOffs(22, 22).addBox(5.0F, -3.0F, 0.0F, 1.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-3.0F, 2.25F, -9.5F, 0.5672F, 0.0F, 0.0F)); + + PartDefinition leg1 = wildBoar.addOrReplaceChild("leg1", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(-3.0F, 7.0F, 5.0F)); + + PartDefinition leg2 = wildBoar.addOrReplaceChild("leg2", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(3.0F, 7.0F, 5.0F)); + + PartDefinition leg3 = wildBoar.addOrReplaceChild("leg3", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(-3.0F, 7.0F, -7.0F)); + + PartDefinition leg4 = wildBoar.addOrReplaceChild("leg4", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(3.0F, 7.0F, -7.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + @Override + public void setupAnim(WildBoarEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts().forEach(ModelPart::resetPose); + this.applyHeadRotation(netHeadYaw, headPitch); + this.walk(limbSwing, limbSwingAmount); + } + + 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); + } + + private void walk(float limbSwing, float limbSwingAmount) { + float amount = 1.0F * limbSwingAmount; + this.leg3.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.leg2.xRot = Mth.cos(limbSwing * 0.6662F) * amount; + this.leg4.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + this.leg1.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * amount; + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + wildBoar.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + } + + @Override + public ModelPart root() { + return wildBoar; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/client/WildBoar/wildboarRenderer.java b/src/main/java/ovh/glitchlabs/masterwild/entity/client/WildBoar/wildboarRenderer.java new file mode 100644 index 0000000..c5cc560 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/client/WildBoar/wildboarRenderer.java @@ -0,0 +1,32 @@ +package ovh.glitchlabs.masterwild.entity.client.WildBoar; + +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.WildBoarEntity; + +public class wildboarRenderer extends MobRenderer> { + private static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, "textures/entity/wildboar.png"); + private static final float ADULT_SCALE = 1.0f; + private static final float BABY_SCALE = 0.45f; + private static final float SHADOW = 0.25f; + + public wildboarRenderer(EntityRendererProvider.Context context) { + super(context, new wildboarModel<>(context.bakeLayer(wildboarModel.LAYER_LOCATION)), SHADOW); + } + + @Override + public ResourceLocation getTextureLocation(WildBoarEntity entity) { + return TEXTURE; + } + + @Override + protected void scale(WildBoarEntity 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/BeaverEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/BeaverEntity.java new file mode 100644 index 0000000..6b6ed66 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/BeaverEntity.java @@ -0,0 +1,76 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.pathfinder.PathType; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.entity.ModEntities; + +public class BeaverEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(Items.OAK_SAPLING, Items.BIRCH_SAPLING); + + public BeaverEntity(EntityType entityType, Level level) { + super(entityType, level); + this.setPathfindingMalus(PathType.WATER, 0.0F); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.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(0, new FloatGoal(this)); + 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 RandomStrollGoal(this, 0.9)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return ModEntities.BEAVER.get().create(level); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.FOX_SNIFF; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.RABBIT_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.RABBIT_DEATH; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/DeerEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/DeerEntity.java new file mode 100755 index 0000000..cd6d8f8 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/DeerEntity.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.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.entity.ModEntities; + +public class DeerEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(Items.WHEAT, Items.CARROT); + + public DeerEntity(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.3) + .add(Attributes.FOLLOW_RANGE, 14) + .add(Attributes.STEP_HEIGHT, 0.6); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 1.8)); + 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 AvoidEntityGoal<>(this, Player.class, 8.0F, 1.4, 1.6)); + this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.1)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return null; //ModEntities.DEER.get().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/entity/custom/FalconEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/FalconEntity.java new file mode 100755 index 0000000..c2cb8bd --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/FalconEntity.java @@ -0,0 +1,104 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.FlyingMoveControl; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.BreedGoal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.TemptGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.entity.ModEntities; + +public class FalconEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(Items.CHICKEN, Items.RABBIT); + + public FalconEntity(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new FlyingMoveControl(this, 20, true); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 6) + .add(Attributes.MOVEMENT_SPEED, 0.3) + .add(Attributes.FLYING_SPEED, 0.4) + .add(Attributes.ATTACK_DAMAGE, 3) + .add(Attributes.FOLLOW_RANGE, 24); + } + + @Override + protected PathNavigation createNavigation(Level level) { + FlyingPathNavigation navigation = new FlyingPathNavigation(this, level); + navigation.setCanOpenDoors(false); + navigation.setCanFloat(true); + navigation.setCanPassDoors(true); + return navigation; + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.2, true)); + 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 WaterAvoidingRandomStrollGoal(this, 1.0)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); + + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, SquirrelEntity.class, true)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, RatEntity.class, true)); + } + + @Override + public boolean isNoGravity() { + return true; + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return null; //ModEntities.FALCON.get().create(level); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.PHANTOM_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.PHANTOM_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.PHANTOM_DEATH; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/HeronEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/HeronEntity.java new file mode 100755 index 0000000..222a5a3 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/HeronEntity.java @@ -0,0 +1,83 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.animal.AbstractFish; +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 net.minecraft.world.level.pathfinder.PathType; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.entity.ModEntities; + + +public class HeronEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(Items.COD, Items.SALMON); + + public HeronEntity(EntityType entityType, Level level) { + super(entityType, level); + this.setPathfindingMalus(PathType.WATER, 0.0F); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 6) + .add(Attributes.MOVEMENT_SPEED, 0.3) + .add(Attributes.ATTACK_DAMAGE, 1) + .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 MeleeAttackGoal(this, 1.0, true)); + this.goalSelector.addGoal(2, new PanicGoal(this, 1.5)); + this.goalSelector.addGoal(3, new BreedGoal(this, 1.0)); + this.goalSelector.addGoal(4, new TemptGoal(this, 1.0, FOOD, false)); + this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.0)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 0.8)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AbstractFish.class, true)); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return null; //ModEntities.HERON.get().create(level); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.ALLAY_AMBIENT_WITHOUT_ITEM; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.ALLAY_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.ALLAY_DEATH; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/MoleEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/MoleEntity.java new file mode 100755 index 0000000..ad1d15e --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/MoleEntity.java @@ -0,0 +1,74 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.entity.ModEntities; + +public class MoleEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(Items.SWEET_BERRIES); + + public MoleEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 3) + .add(Attributes.MOVEMENT_SPEED, 0.18) + .add(Attributes.FOLLOW_RANGE, 6) + .add(Attributes.STEP_HEIGHT, 0.6); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 1.8)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.0, FOOD, false)); + this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, Player.class, 5.0F, 1.4, 1.5)); + this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.0)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 0.7)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return null;//ModEntities.MOLE.get().create(level); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.SILVERFISH_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.SILVERFISH_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.SILVERFISH_DEATH; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/OtterEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/OtterEntity.java new file mode 100644 index 0000000..f056962 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/OtterEntity.java @@ -0,0 +1,76 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.pathfinder.PathType; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.entity.ModEntities; + +public class OtterEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(Items.COD, Items.SALMON); + + public OtterEntity(EntityType entityType, Level level) { + super(entityType, level); + this.setPathfindingMalus(PathType.WATER, 0.0F); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 6) + .add(Attributes.MOVEMENT_SPEED, 0.3) + .add(Attributes.FOLLOW_RANGE, 10) + .add(Attributes.STEP_HEIGHT, 0.6); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 1.6)); + 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 RandomStrollGoal(this, 1.0)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return ModEntities.OTTER.get().create(level); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.TURTLE_AMBIENT_LAND; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.TURTLE_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.TURTLE_DEATH; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/SquirrelEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/SquirrelEntity.java new file mode 100644 index 0000000..395b75f --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/SquirrelEntity.java @@ -0,0 +1,83 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.Item.ModItems; +import ovh.glitchlabs.masterwild.entity.ModEntities; + + +public class SquirrelEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(ModItems.ACORNS); + + public SquirrelEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 4) + .add(Attributes.MOVEMENT_SPEED, 0.35) + .add(Attributes.FOLLOW_RANGE, 10) + .add(Attributes.STEP_HEIGHT, 0.6); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 2.0)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.2, FOOD, false)); + this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, Player.class, 6.0F, 1.6, 1.8)); + this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.2)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + } + + @Override + protected void dropCustomDeathLoot(ServerLevel serverLevel, DamageSource source, boolean recentlyHit) { + super.dropCustomDeathLoot(serverLevel, source, recentlyHit); + this.spawnAtLocation(new ItemStack(ModItems.ACORNS.get())); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return ModEntities.SQUIRREL.get().create(level); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.PARROT_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.PARROT_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.PARROT_DEATH; + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/entity/custom/WildBoarEntity.java b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/WildBoarEntity.java new file mode 100755 index 0000000..57e23df --- /dev/null +++ b/src/main/java/ovh/glitchlabs/masterwild/entity/custom/WildBoarEntity.java @@ -0,0 +1,79 @@ +package ovh.glitchlabs.masterwild.entity.custom; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import ovh.glitchlabs.masterwild.entity.ModEntities; + +public class WildBoarEntity extends Animal { + private static final Ingredient FOOD = Ingredient.of(Items.CARROT, Items.POTATO); + + public WildBoarEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 14) + .add(Attributes.MOVEMENT_SPEED, 0.28) + .add(Attributes.ATTACK_DAMAGE, 4) + .add(Attributes.FOLLOW_RANGE, 12) + .add(Attributes.KNOCKBACK_RESISTANCE, 0.2) + .add(Attributes.STEP_HEIGHT, 0.6); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.3, true)); + 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, 1.0)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD.test(stack); + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return ModEntities.WILD_BOAR.get().create(level); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.PIG_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.PIG_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.PIG_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 ebdac30..a16d948 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java +++ b/src/main/java/ovh/glitchlabs/masterwild/event/ModEventBusEvents.java @@ -6,11 +6,15 @@ import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import ovh.glitchlabs.masterwild.Masterwild; import ovh.glitchlabs.masterwild.entity.ModEntities; +import ovh.glitchlabs.masterwild.entity.client.Beaver.BeaverModel; import ovh.glitchlabs.masterwild.entity.client.Monkey.MonkeyModel; +import ovh.glitchlabs.masterwild.entity.client.Otter.OtterModel; import ovh.glitchlabs.masterwild.entity.client.Pinguin.PinguinModel; import ovh.glitchlabs.masterwild.entity.client.Raccoon.RaccoonModel; import ovh.glitchlabs.masterwild.entity.client.Rooster.RoosterModel; import ovh.glitchlabs.masterwild.entity.client.Shark.SharkModel; +import ovh.glitchlabs.masterwild.entity.client.Squirrel.SquirrelModel; +import ovh.glitchlabs.masterwild.entity.client.WildBoar.wildboarModel; import ovh.glitchlabs.masterwild.entity.client.butterfly.ButterflyModel; import ovh.glitchlabs.masterwild.entity.client.capibara.CapybaraModel; import ovh.glitchlabs.masterwild.entity.client.duck.duckModel; @@ -36,6 +40,14 @@ public class ModEventBusEvents { event.registerLayerDefinition(CapybaraModel.LAYER_LOCATION, CapybaraModel::createBodyLayer); event.registerLayerDefinition(duckModel.LAYER_LOCATION, duckModel::createBodyLayer); event.registerLayerDefinition(ratModel.LAYER_LOCATION, ratModel::createBodyLayer); + event.registerLayerDefinition(BeaverModel.LAYER_LOCATION, BeaverModel::createBodyLayer); + //event.registerLayerDefinition(DeerModel.LAYER_LOCATION, DeerModel::createBodyLayer); + //event.registerLayerDefinition(FalconModel.LAYER_LOCATION, FalconModel::createBodyLayer); + //event.registerLayerDefinition(HeronModel.LAYER_LOCATION, HeronModel::createBodyLayer); + //event.registerLayerDefinition(MoleModel.LAYER_LOCATION, MoleModel::createBodyLayer); + event.registerLayerDefinition(OtterModel.LAYER_LOCATION, OtterModel::createBodyLayer); + event.registerLayerDefinition(SquirrelModel.LAYER_LOCATION, SquirrelModel::createBodyLayer); + event.registerLayerDefinition(wildboarModel.LAYER_LOCATION, wildboarModel::createBodyLayer); } @SubscribeEvent @@ -51,5 +63,13 @@ public class ModEventBusEvents { event.put(ModEntities.CAPYBARA.get(), CapybaraEntity.createAttributes().build()); event.put(ModEntities.DUCK.get(), duckEntity.createAttributes().build()); event.put(ModEntities.RAT.get(), RatEntity.createAttributes().build()); + event.put(ModEntities.BEAVER.get(), BeaverEntity.createAttributes().build()); + //event.put(ModEntities.DEER.get(), DeerEntity.createAttributes().build()); + //event.put(ModEntities.FALCON.get(), FalconEntity.createAttributes().build()); + //event.put(ModEntities.HERON.get(), HeronEntity.createAttributes().build()); + //event.put(ModEntities.MOLE.get(), MoleEntity.createAttributes().build()); + event.put(ModEntities.OTTER.get(), OtterEntity.createAttributes().build()); + event.put(ModEntities.SQUIRREL.get(), SquirrelEntity.createAttributes().build()); + event.put(ModEntities.WILD_BOAR.get(), WildBoarEntity.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 bb73822..1e2a88a 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/event/ModSpawnPlacements.java +++ b/src/main/java/ovh/glitchlabs/masterwild/event/ModSpawnPlacements.java @@ -42,6 +42,32 @@ public class ModSpawnPlacements { event.register(ModEntities.RAT.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.REPLACE); + event.register(ModEntities.SQUIRREL.get(), SpawnPlacementTypes.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, + RegisterSpawnPlacementsEvent.Operation.REPLACE); + event.register(ModEntities.OTTER.get(), SpawnPlacementTypes.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, + RegisterSpawnPlacementsEvent.Operation.REPLACE); + /* + event.register(ModEntities.DEER.get(), SpawnPlacementTypes.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, + RegisterSpawnPlacementsEvent.Operation.REPLACE); + */ + event.register(ModEntities.BEAVER.get(), SpawnPlacementTypes.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, + RegisterSpawnPlacementsEvent.Operation.REPLACE); + /* + event.register(ModEntities.MOLE.get(), SpawnPlacementTypes.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, + RegisterSpawnPlacementsEvent.Operation.REPLACE); + event.register(ModEntities.HERON.get(), SpawnPlacementTypes.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, + RegisterSpawnPlacementsEvent.Operation.REPLACE); + + */ + event.register(ModEntities.WILD_BOAR.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, @@ -55,5 +81,12 @@ public class ModSpawnPlacements { Heightmap.Types.MOTION_BLOCKING, (type, level, reason, pos, random) -> level.getLevel().isDay() && level.canSeeSky(pos), RegisterSpawnPlacementsEvent.Operation.REPLACE); +/* + event.register(ModEntities.FALCON.get(), SpawnPlacementTypes.NO_RESTRICTIONS, + Heightmap.Types.MOTION_BLOCKING, + (type, level, reason, pos, random) -> level.getLevel().isDay() && level.canSeeSky(pos), + RegisterSpawnPlacementsEvent.Operation.REPLACE); + + */ } } \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/masterwild/worldgen/ModBiomeModifiers.java b/src/main/java/ovh/glitchlabs/masterwild/worldgen/ModBiomeModifiers.java index c2d6ca9..b4c9343 100644 --- a/src/main/java/ovh/glitchlabs/masterwild/worldgen/ModBiomeModifiers.java +++ b/src/main/java/ovh/glitchlabs/masterwild/worldgen/ModBiomeModifiers.java @@ -32,6 +32,14 @@ public class ModBiomeModifiers { public static final ResourceKey SPAWN_CAPYBARA = registerKey("spawn_capybara"); public static final ResourceKey SPAWN_DUCK = registerKey("spawn_duck"); public static final ResourceKey SPAWN_RAT = registerKey("spawn_rat"); + public static final ResourceKey SPAWN_SQUIRREL = registerKey("spawn_squirrel"); + public static final ResourceKey SPAWN_OTTER = registerKey("spawn_otter"); + public static final ResourceKey SPAWN_DEER = registerKey("spawn_deer"); + public static final ResourceKey SPAWN_BEAVER = registerKey("spawn_beaver"); + public static final ResourceKey SPAWN_FALCON = registerKey("spawn_falcon"); + public static final ResourceKey SPAWN_MOLE = registerKey("spawn_mole"); + public static final ResourceKey SPAWN_HERON = registerKey("spawn_heron"); + public static final ResourceKey SPAWN_WILD_BOAR = registerKey("spawn_wild_boar"); public static void bootstrap(BootstrapContext context) { var placedFeatures = context.lookup(Registries.PLACED_FEATURE); @@ -116,6 +124,65 @@ public class ModBiomeModifiers { addSpawn(context, SPAWN_RAT, biomes.getOrThrow(BiomeTags.IS_FOREST), ModEntities.RAT.get(), 3, 2, 3); + + addSpawn(context, SPAWN_SQUIRREL, + HolderSet.direct( + biomes.getOrThrow(Biomes.FOREST), + biomes.getOrThrow(Biomes.BIRCH_FOREST), + biomes.getOrThrow(Biomes.TAIGA)), + ModEntities.SQUIRREL.get(), 12, 2, 4); + + addSpawn(context, SPAWN_OTTER, + HolderSet.direct( + biomes.getOrThrow(Biomes.RIVER), + biomes.getOrThrow(Biomes.SWAMP)), + ModEntities.OTTER.get(), 6, 1, 2); +/* + addSpawn(context, SPAWN_DEER, + HolderSet.direct( + biomes.getOrThrow(Biomes.FOREST), + biomes.getOrThrow(Biomes.BIRCH_FOREST), + biomes.getOrThrow(Biomes.TAIGA), + biomes.getOrThrow(Biomes.MEADOW)), + ModEntities.DEER.get(), 8, 1, 3); + + */ + + addSpawn(context, SPAWN_BEAVER, + HolderSet.direct( + biomes.getOrThrow(Biomes.RIVER), + biomes.getOrThrow(Biomes.SWAMP)), + ModEntities.BEAVER.get(), 5, 1, 2); + + /* + addSpawn(context, SPAWN_FALCON, + HolderSet.direct( + biomes.getOrThrow(Biomes.WINDSWEPT_HILLS), + biomes.getOrThrow(Biomes.MEADOW), + biomes.getOrThrow(Biomes.FOREST)), + ModEntities.FALCON.get(), 4, 1, 2); + + addSpawn(context, SPAWN_MOLE, + HolderSet.direct( + biomes.getOrThrow(Biomes.PLAINS), + biomes.getOrThrow(Biomes.FOREST)), + ModEntities.MOLE.get(), 6, 1, 2); + + addSpawn(context, SPAWN_HERON, + HolderSet.direct( + biomes.getOrThrow(Biomes.SWAMP), + biomes.getOrThrow(Biomes.MANGROVE_SWAMP), + biomes.getOrThrow(Biomes.RIVER)), + ModEntities.HERON.get(), 5, 1, 2); + + */ + + addSpawn(context, SPAWN_WILD_BOAR, + HolderSet.direct( + biomes.getOrThrow(Biomes.FOREST), + biomes.getOrThrow(Biomes.DARK_FOREST), + biomes.getOrThrow(Biomes.TAIGA)), + ModEntities.WILD_BOAR.get(), 6, 1, 3); } private static void addSpawn(BootstrapContext context, ResourceKey key, @@ -127,6 +194,4 @@ public class ModBiomeModifiers { private static ResourceKey registerKey(String name) { return ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(Masterwild.MODID, name)); } -} - - +} \ No newline at end of file diff --git a/src/main/resources/assets/masterwild/textures/entity/beaver.png b/src/main/resources/assets/masterwild/textures/entity/beaver.png new file mode 100755 index 0000000..2e3b863 Binary files /dev/null and b/src/main/resources/assets/masterwild/textures/entity/beaver.png differ diff --git a/src/main/resources/assets/masterwild/textures/entity/otter.png b/src/main/resources/assets/masterwild/textures/entity/otter.png new file mode 100755 index 0000000..7bb0d8e Binary files /dev/null and b/src/main/resources/assets/masterwild/textures/entity/otter.png differ diff --git a/src/main/resources/assets/masterwild/textures/entity/squirrel.png b/src/main/resources/assets/masterwild/textures/entity/squirrel.png new file mode 100755 index 0000000..102b101 Binary files /dev/null and b/src/main/resources/assets/masterwild/textures/entity/squirrel.png differ diff --git a/src/main/resources/assets/masterwild/textures/entity/wildboar.png b/src/main/resources/assets/masterwild/textures/entity/wildboar.png new file mode 100755 index 0000000..ff036d2 Binary files /dev/null and b/src/main/resources/assets/masterwild/textures/entity/wildboar.png differ diff --git a/src/main/resources/assets/masterwild/textures/item/acorns.png b/src/main/resources/assets/masterwild/textures/item/acorns.png new file mode 100755 index 0000000..0247e47 Binary files /dev/null and b/src/main/resources/assets/masterwild/textures/item/acorns.png differ