From a6cc3df14fc39cf09011aa516a91bd165e4cadea Mon Sep 17 00:00:00 2001 From: ian1337 Date: Tue, 13 Oct 2026 16:34:14 +0200 Subject: [PATCH] [add] Beaver [add] Deer [add] Falcon [add] Heron [add] Otter [add] Squirrel [add] WildBoar [add] Mole [add] Acorns --- .../103d9f3f36b01595f1aa5172191e60eff02e6924 | 7 +- .../6143fb1502ae754d8039ff811e28c49eaa7e6409 | 4 +- .../d1416cf72769a6a520cc2c44944968403e1a0de7 | 7 +- .../d5c0ffbaea6adb3da58b009066607c021a009b4a | 3 +- .../assets/masterwild/lang/en_us.json | 9 + .../assets/masterwild/models/item/acorns.json | 6 + .../models/item/beaver_spawn_egg.json | 3 + .../models/item/otter_spawn_egg.json | 3 + .../models/item/squirrel_spawn_egg.json | 3 + .../models/item/wild_boar_spawn_egg.json | 3 + .../resources/data/c/tags/item/foods.json | 6 + .../neoforge/biome_modifier/spawn_beaver.json | 13 ++ .../neoforge/biome_modifier/spawn_otter.json | 13 ++ .../neoforge/biome_modifier/spawn_rat.json | 10 ++ .../biome_modifier/spawn_squirrel.json | 14 ++ .../biome_modifier/spawn_wild_boar.json | 14 ++ .../masterwild/Item/ModCreativeModeTabs.java | 15 ++ .../masterwild/Item/ModFoodProperties.java | 9 +- .../glitchlabs/masterwild/Item/ModItems.java | 38 ++++- .../ovh/glitchlabs/masterwild/Masterwild.java | 13 +- .../datagen/ModItemModelProvider.java | 15 ++ .../datagen/ModItemTagProvider.java | 7 +- .../datagen/ModLanguageProvider.java | 28 ++++ .../masterwild/entity/ModEntities.java | 37 +++++ .../entity/client/Beaver/BeaverModel.java | 101 ++++++++++++ .../entity/client/Beaver/BeaverRenderer.java | 32 ++++ .../entity/client/Otter/OtterModel.java | 101 ++++++++++++ .../entity/client/Otter/OtterRenderer.java | 32 ++++ .../entity/client/Squirrel/SquirrelModel.java | 155 ++++++++++++++++++ .../client/Squirrel/SquirrelRenderer.java | 32 ++++ .../entity/client/WildBoar/wildboarModel.java | 97 +++++++++++ .../client/WildBoar/wildboarRenderer.java | 32 ++++ .../entity/custom/BeaverEntity.java | 76 +++++++++ .../masterwild/entity/custom/DeerEntity.java | 78 +++++++++ .../entity/custom/FalconEntity.java | 104 ++++++++++++ .../masterwild/entity/custom/HeronEntity.java | 83 ++++++++++ .../masterwild/entity/custom/MoleEntity.java | 74 +++++++++ .../masterwild/entity/custom/OtterEntity.java | 76 +++++++++ .../entity/custom/SquirrelEntity.java | 83 ++++++++++ .../entity/custom/WildBoarEntity.java | 79 +++++++++ .../masterwild/event/ModEventBusEvents.java | 20 +++ .../masterwild/event/ModSpawnPlacements.java | 33 ++++ .../worldgen/ModBiomeModifiers.java | 71 +++++++- .../masterwild/textures/entity/beaver.png | Bin 0 -> 4050 bytes .../masterwild/textures/entity/otter.png | Bin 0 -> 2483 bytes .../masterwild/textures/entity/squirrel.png | Bin 0 -> 1804 bytes .../masterwild/textures/entity/wildboar.png | Bin 0 -> 2979 bytes .../masterwild/textures/item/acorns.png | Bin 0 -> 558 bytes 48 files changed, 1626 insertions(+), 13 deletions(-) create mode 100644 src/generated/resources/assets/masterwild/models/item/acorns.json create mode 100644 src/generated/resources/assets/masterwild/models/item/beaver_spawn_egg.json create mode 100644 src/generated/resources/assets/masterwild/models/item/otter_spawn_egg.json create mode 100644 src/generated/resources/assets/masterwild/models/item/squirrel_spawn_egg.json create mode 100644 src/generated/resources/assets/masterwild/models/item/wild_boar_spawn_egg.json create mode 100644 src/generated/resources/data/c/tags/item/foods.json create mode 100644 src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_beaver.json create mode 100644 src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_otter.json create mode 100644 src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_rat.json create mode 100644 src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_squirrel.json create mode 100644 src/generated/resources/data/masterwild/neoforge/biome_modifier/spawn_wild_boar.json create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/Beaver/BeaverModel.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/client/Beaver/BeaverRenderer.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/Otter/OtterModel.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/client/Otter/OtterRenderer.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/Squirrel/SquirrelModel.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/client/Squirrel/SquirrelRenderer.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/client/WildBoar/wildboarModel.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/client/WildBoar/wildboarRenderer.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/custom/BeaverEntity.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/custom/DeerEntity.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/custom/FalconEntity.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/custom/HeronEntity.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/custom/MoleEntity.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/custom/OtterEntity.java create mode 100644 src/main/java/ovh/glitchlabs/masterwild/entity/custom/SquirrelEntity.java create mode 100755 src/main/java/ovh/glitchlabs/masterwild/entity/custom/WildBoarEntity.java create mode 100755 src/main/resources/assets/masterwild/textures/entity/beaver.png create mode 100755 src/main/resources/assets/masterwild/textures/entity/otter.png create mode 100755 src/main/resources/assets/masterwild/textures/entity/squirrel.png create mode 100755 src/main/resources/assets/masterwild/textures/entity/wildboar.png create mode 100755 src/main/resources/assets/masterwild/textures/item/acorns.png 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 0000000000000000000000000000000000000000..2e3b863744567a22b43c141e5f2ca8fc0170bac5 GIT binary patch literal 4050 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 Ef>)On_W%F@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7bb0d8e22372a44f1c8f3d17dc7c0ef4dbbbec99 GIT binary patch literal 2483 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 literal 0 HcmV?d00001