├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── feature_request.yml │ └── bug_report.yml ├── neoforge ├── gradle.properties ├── src │ └── main │ │ ├── resources │ │ ├── icon.png │ │ └── META-INF │ │ │ └── neoforge.mods.toml │ │ └── java │ │ └── net │ │ └── pixeldreamstudios │ │ └── mobs_of_mythology │ │ └── neoforge │ │ └── MobsOfMythologyNeoForge.java └── build.gradle ├── common ├── src │ └── main │ │ ├── resources │ │ ├── data │ │ │ ├── mobs_of_mythology │ │ │ │ ├── weapon_attributes │ │ │ │ │ └── spear.json │ │ │ │ ├── tags │ │ │ │ │ ├── worldgen │ │ │ │ │ │ └── biome │ │ │ │ │ │ │ ├── kobolds_spawn_in.json │ │ │ │ │ │ │ ├── drakes_spawn_in.json │ │ │ │ │ │ │ ├── pegasus_spawn_in.json │ │ │ │ │ │ │ ├── chupacabras_spawn_in.json │ │ │ │ │ │ │ └── sporelings_spawn_in.json │ │ │ │ │ └── block │ │ │ │ │ │ └── myth_mob_spawnable_on.json │ │ │ │ ├── structure │ │ │ │ │ └── automaton_structure.nbt │ │ │ │ ├── loot_table │ │ │ │ │ ├── entities │ │ │ │ │ │ ├── sporeling.json │ │ │ │ │ │ ├── kobold_warrior.json │ │ │ │ │ │ ├── automaton.json │ │ │ │ │ │ └── chupacabra.json │ │ │ │ │ └── blocks │ │ │ │ │ │ ├── bronze_block.json │ │ │ │ │ │ └── cut_bronze_block.json │ │ │ │ ├── neoforge │ │ │ │ │ └── biome_modifier │ │ │ │ │ │ ├── drakes_spawn.json │ │ │ │ │ │ ├── pegasus_spawn.json │ │ │ │ │ │ ├── sporelings_spawn.json │ │ │ │ │ │ ├── chupacabras_spawn.json │ │ │ │ │ │ └── kobolds_spawn.json │ │ │ │ ├── recipe │ │ │ │ │ ├── gear.json │ │ │ │ │ ├── cooked_chupacabra_meat.json │ │ │ │ │ ├── cut_bronze_block.json │ │ │ │ │ ├── bronze_block.json │ │ │ │ │ ├── cooked_chupacabra_meat_from_smoking.json │ │ │ │ │ ├── cooked_chupacabra_meat_from_campfire_cooking.json │ │ │ │ │ └── bronze_ingot.json │ │ │ │ ├── worldgen │ │ │ │ │ ├── structure_set │ │ │ │ │ │ └── automaton_structure.json │ │ │ │ │ ├── template_pool │ │ │ │ │ │ └── automaton_structure.json │ │ │ │ │ └── structure │ │ │ │ │ │ └── automaton_structure.json │ │ │ │ └── advancement │ │ │ │ │ ├── mobs_of_mythology.json │ │ │ │ │ └── tame_basilisk.json │ │ │ ├── c │ │ │ │ └── tags │ │ │ │ │ ├── block │ │ │ │ │ └── bronze_blocks.json │ │ │ │ │ └── item │ │ │ │ │ ├── bronze_blocks.json │ │ │ │ │ └── bronze_ingots.json │ │ │ └── minecraft │ │ │ │ └── tags │ │ │ │ ├── item │ │ │ │ └── meat.json │ │ │ │ └── block │ │ │ │ ├── mineable │ │ │ │ └── pickaxe.json │ │ │ │ └── needs_iron_tool.json │ │ ├── assets │ │ │ └── mobs_of_mythology │ │ │ │ ├── models │ │ │ │ ├── item │ │ │ │ │ ├── bronze_block.json │ │ │ │ │ ├── drake_egg.json │ │ │ │ │ ├── drake_spawn_egg.json │ │ │ │ │ ├── kobold_spawn_egg.json │ │ │ │ │ ├── automaton_spawn_egg.json │ │ │ │ │ ├── basilisk_spawn_egg.json │ │ │ │ │ ├── chupacabra_spawn_egg.json │ │ │ │ │ ├── pegasus_spawn_egg.json │ │ │ │ │ ├── sporeling_spawn_egg.json │ │ │ │ │ ├── wendigo_spawn_egg.json │ │ │ │ │ ├── bronze_block_cut.json │ │ │ │ │ ├── cut_bronze_block.json │ │ │ │ │ ├── kobold_warrior_spawn_egg.json │ │ │ │ │ ├── gear.json │ │ │ │ │ ├── basilisk_head.json │ │ │ │ │ ├── bronze_ingot.json │ │ │ │ │ ├── automaton_head.json │ │ │ │ │ ├── chupacabra_meat.json │ │ │ │ │ ├── mythical_guide_book.json │ │ │ │ │ ├── cooked_chupacabra_meat.json │ │ │ │ │ └── kobold_spear.json │ │ │ │ └── block │ │ │ │ │ ├── bronze_block.json │ │ │ │ │ └── cut_bronze_block.json │ │ │ │ ├── blockstates │ │ │ │ ├── bronze_block.json │ │ │ │ └── cut_bronze_block.json │ │ │ │ ├── textures │ │ │ │ ├── item │ │ │ │ │ ├── gear.png │ │ │ │ │ ├── basilisk_head.png │ │ │ │ │ ├── bronze_ingot.png │ │ │ │ │ ├── kobold_spear.png │ │ │ │ │ ├── automaton_head.png │ │ │ │ │ ├── chupacabra_meat.png │ │ │ │ │ └── cooked_chupacabra_meat.png │ │ │ │ ├── entity │ │ │ │ │ ├── basilisk.png │ │ │ │ │ ├── pegasus.png │ │ │ │ │ ├── wendigo.png │ │ │ │ │ ├── automaton.png │ │ │ │ │ ├── chupacabra.png │ │ │ │ │ ├── drake │ │ │ │ │ │ ├── drake_1.png │ │ │ │ │ │ ├── drake_2.png │ │ │ │ │ │ ├── drake_3.png │ │ │ │ │ │ ├── drake_4.png │ │ │ │ │ │ ├── drake_5.png │ │ │ │ │ │ ├── drake_6.png │ │ │ │ │ │ ├── drake_7.png │ │ │ │ │ │ ├── drake_1_glowmask.png │ │ │ │ │ │ ├── drake_2_glowmask.png │ │ │ │ │ │ ├── drake_3_glowmask.png │ │ │ │ │ │ ├── drake_4_glowmask.png │ │ │ │ │ │ ├── drake_5_glowmask.png │ │ │ │ │ │ ├── drake_6_glowmask.png │ │ │ │ │ │ └── drake_7_glowmask.png │ │ │ │ │ ├── kobold │ │ │ │ │ │ ├── kobold.png │ │ │ │ │ │ ├── kobold_cloth.png │ │ │ │ │ │ ├── kobold_glowmask.png │ │ │ │ │ │ └── kobold_cloth_glowmask.png │ │ │ │ │ ├── basilisk_glowmask.png │ │ │ │ │ ├── chupacabra_glowmask.png │ │ │ │ │ ├── sporeling │ │ │ │ │ │ ├── sporeling_red.png │ │ │ │ │ │ └── sporeling_brown.png │ │ │ │ │ └── kobold_warrior │ │ │ │ │ │ ├── kobold_warrior_1.png │ │ │ │ │ │ ├── kobold_warrior_2.png │ │ │ │ │ │ ├── kobold_warrior_3.png │ │ │ │ │ │ ├── kobold_warrior_1_glowmask.png │ │ │ │ │ │ ├── kobold_warrior_2_glowmask.png │ │ │ │ │ │ └── kobold_warrior_3_glowmask.png │ │ │ │ └── block │ │ │ │ │ ├── bronze_block.png │ │ │ │ │ ├── bronze_block_cut_side.png │ │ │ │ │ └── bronze_block_cut_bottom_top.png │ │ │ │ ├── sounds │ │ │ │ └── entity │ │ │ │ │ ├── drake │ │ │ │ │ ├── blow.ogg │ │ │ │ │ ├── exhale.ogg │ │ │ │ │ ├── roar_1.ogg │ │ │ │ │ ├── roar_2.ogg │ │ │ │ │ ├── roar_3.ogg │ │ │ │ │ ├── roar_big.ogg │ │ │ │ │ ├── roar_cave.ogg │ │ │ │ │ └── roar_small.ogg │ │ │ │ │ └── automaton │ │ │ │ │ └── robotic_voice.ogg │ │ │ │ ├── sounds.json │ │ │ │ ├── lang │ │ │ │ ├── de_de.json │ │ │ │ ├── uk_ua.json │ │ │ │ ├── vi_vn.json │ │ │ │ ├── el_gr.json │ │ │ │ ├── ru_ru.json │ │ │ │ ├── zh_cn.json │ │ │ │ ├── en_us.json │ │ │ │ └── pt_br.json │ │ │ │ └── geo │ │ │ │ └── entity │ │ │ │ └── sporeling.geo.json │ │ └── mobs_of_mythology.mixins.json │ │ └── java │ │ └── net │ │ └── pixeldreamstudios │ │ └── mobs_of_mythology │ │ ├── entity │ │ ├── variant │ │ │ ├── KoboldVariant.java │ │ │ ├── SporelingVariant.java │ │ │ ├── DrakeVariant.java │ │ │ └── KoboldWarriorVariant.java │ │ ├── client │ │ │ ├── renderer │ │ │ │ ├── PegasusRenderer.java │ │ │ │ ├── AutomatonRenderer.java │ │ │ │ ├── ChupacabraRenderer.java │ │ │ │ ├── SporelingRenderer.java │ │ │ │ ├── DrakeRenderer.java │ │ │ │ ├── BasiliskRenderer.java │ │ │ │ ├── KoboldRenderer.java │ │ │ │ └── KoboldWarriorRenderer.java │ │ │ └── model │ │ │ │ ├── DrakeModel.java │ │ │ │ ├── ChupacabraModel.java │ │ │ │ ├── SporelingModel.java │ │ │ │ ├── PegasusModel.java │ │ │ │ ├── BasiliskModel.java │ │ │ │ ├── KoboldModel.java │ │ │ │ ├── AutomatonModel.java │ │ │ │ └── KoboldWarriorModel.java │ │ ├── constant │ │ │ └── DefaultMythAnimations.java │ │ ├── mobs │ │ │ ├── AbstractKoboldEntity.java │ │ │ ├── KoboldWarriorEntity.java │ │ │ ├── ChupacabraEntity.java │ │ │ ├── PegasusEntity.java │ │ │ └── KoboldEntity.java │ │ ├── AbstractMythEntity.java │ │ └── AbstractMythMonsterEntity.java │ │ ├── registry │ │ ├── TabRegistry.java │ │ ├── SoundRegistry.java │ │ ├── TagRegistry.java │ │ ├── BlockRegistry.java │ │ └── ItemRegistry.java │ │ ├── MobsOfMythology.java │ │ ├── mixin │ │ └── CarvedPumpkinBlockMixin.java │ │ └── MobsOfMythologyConfig.java └── build.gradle ├── fabric ├── src │ └── main │ │ ├── resources │ │ ├── icon.png │ │ └── fabric.mod.json │ │ └── java │ │ └── net │ │ └── pixeldreamstudios │ │ └── mobs_of_mythology │ │ └── fabric │ │ ├── client │ │ └── MobsOfMythologyFabricClient.java │ │ └── MobsOfMythologyFabric.java └── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── README.md ├── changelog.md ├── settings.gradle ├── .gitignore ├── gradle.properties ├── LICENSE └── gradlew.bat /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: pixeldreamstudios 2 | -------------------------------------------------------------------------------- /neoforge/gradle.properties: -------------------------------------------------------------------------------- 1 | loom.platform=neoforge 2 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/weapon_attributes/spear.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "bettercombat:spear" 3 | } -------------------------------------------------------------------------------- /fabric/src/main/resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/fabric/src/main/resources/icon.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "mobs_of_mythology:block/bronze_block" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/drake_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "mobs_of_mythology:geo/block/drake_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/drake_spawn_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/template_spawn_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/kobold_spawn_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/template_spawn_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/tags/worldgen/biome/kobolds_spawn_in.json: -------------------------------------------------------------------------------- 1 | { 2 | "values": [ 3 | "#c:is_wet" 4 | ] 5 | } -------------------------------------------------------------------------------- /neoforge/src/main/resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/neoforge/src/main/resources/icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/automaton_spawn_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/template_spawn_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/basilisk_spawn_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/template_spawn_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/chupacabra_spawn_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/template_spawn_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/pegasus_spawn_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/template_spawn_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/sporeling_spawn_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/template_spawn_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/wendigo_spawn_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/template_spawn_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/tags/worldgen/biome/drakes_spawn_in.json: -------------------------------------------------------------------------------- 1 | { 2 | "values": [ 3 | "#c:is_badlands" 4 | ] 5 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/tags/worldgen/biome/pegasus_spawn_in.json: -------------------------------------------------------------------------------- 1 | { 2 | "values": [ 3 | "#c:is_mountain" 4 | ] 5 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/bronze_block_cut.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "mobs_of_mythology:block/bronze_block_cut" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/cut_bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "mobs_of_mythology:block/cut_bronze_block" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/kobold_warrior_spawn_egg.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "minecraft:item/template_spawn_egg" 3 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/tags/worldgen/biome/chupacabras_spawn_in.json: -------------------------------------------------------------------------------- 1 | { 2 | "values": [ 3 | "#c:is_temperate" 4 | ] 5 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/tags/worldgen/biome/sporelings_spawn_in.json: -------------------------------------------------------------------------------- 1 | { 2 | "values": [ 3 | "#c:is_mushroom" 4 | ] 5 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![BH_BANNER](https://www.bisecthosting.com/images/CF/Mobs_of_Mythology/BH_MOM_promo.webp) 2 | -------------------------------------------------------------------------------- /common/src/main/resources/data/c/tags/block/bronze_blocks.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "mobs_of_mythology:bronze_block" 5 | ] 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/c/tags/item/bronze_blocks.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "mobs_of_mythology:bronze_block" 5 | ] 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/c/tags/item/bronze_ingots.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "mobs_of_mythology:bronze_ingot" 5 | ] 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/gear.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer0": "mobs_of_mythology:item/gear" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/blockstates/bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "": { 4 | "model": "mobs_of_mythology:block/bronze_block" 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/block/bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_all", 3 | "textures": { 4 | "all": "mobs_of_mythology:block/bronze_block" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/basilisk_head.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer0": "mobs_of_mythology:item/basilisk_head" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/bronze_ingot.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer0": "mobs_of_mythology:item/bronze_ingot" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/automaton_head.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer0": "mobs_of_mythology:item/automaton_head" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/chupacabra_meat.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer0": "mobs_of_mythology:item/chupacabra_meat" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/minecraft/tags/item/meat.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "mobs_of_mythology:chupacabra_meat", 5 | "mobs_of_mythology:cooked_chupacabra_meat" 6 | ] 7 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/item/gear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/item/gear.png -------------------------------------------------------------------------------- /common/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "mobs_of_mythology:bronze_block", 5 | "mobs_of_mythology:cut_bronze_block" 6 | ] 7 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/minecraft/tags/block/needs_iron_tool.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "mobs_of_mythology:bronze_block", 5 | "mobs_of_mythology:cut_bronze_block" 6 | ] 7 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/mythical_guide_book.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer0": "mobs_of_mythology:item/mythical_guide_book" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/cooked_chupacabra_meat.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer0": "mobs_of_mythology:item/cooked_chupacabra_meat" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/blow.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/blow.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/basilisk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/basilisk.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/pegasus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/pegasus.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/wendigo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/wendigo.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/exhale.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/exhale.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_1.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_2.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_3.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_3.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/block/bronze_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/block/bronze_block.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/automaton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/automaton.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/chupacabra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/chupacabra.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/item/basilisk_head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/item/basilisk_head.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/item/bronze_ingot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/item/bronze_ingot.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/item/kobold_spear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/item/kobold_spear.png -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/structure/automaton_structure.nbt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/data/mobs_of_mythology/structure/automaton_structure.nbt -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_big.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_big.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_cave.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_cave.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_1.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_2.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_3.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_4.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_5.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_6.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_7.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold/kobold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold/kobold.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/item/automaton_head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/item/automaton_head.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/item/chupacabra_meat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/item/chupacabra_meat.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_small.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/sounds/entity/drake/roar_small.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/basilisk_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/basilisk_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds/entity/automaton/robotic_voice.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/sounds/entity/automaton/robotic_voice.ogg -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/block/bronze_block_cut_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/block/bronze_block_cut_side.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/chupacabra_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/chupacabra_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold/kobold_cloth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold/kobold_cloth.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/item/cooked_chupacabra_meat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/item/cooked_chupacabra_meat.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_1_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_1_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_2_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_2_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_3_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_3_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_4_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_4_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_5_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_5_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_6_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_6_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_7_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/drake/drake_7_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold/kobold_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold/kobold_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/sporeling/sporeling_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/sporeling/sporeling_red.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/block/bronze_block_cut_bottom_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/block/bronze_block_cut_bottom_top.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/sporeling/sporeling_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/sporeling/sporeling_brown.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold/kobold_cloth_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold/kobold_cloth_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_1.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_2.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_3.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/block/cut_bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "block/cube_column", 3 | "textures": { 4 | "end": "mobs_of_mythology:block/bronze_block_cut_bottom_top", 5 | "side": "mobs_of_mythology:block/bronze_block_cut_side" 6 | } 7 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_1_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_1_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_2_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_2_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_3_glowmask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thrasos-dev/mobs-of-mythology-mod/HEAD/common/src/main/resources/assets/mobs_of_mythology/textures/entity/kobold_warrior/kobold_warrior_3_glowmask.png -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/tags/block/myth_mob_spawnable_on.json: -------------------------------------------------------------------------------- 1 | { 2 | "values": [ 3 | "#minecraft:animals_spawnable_on", 4 | "#minecraft:badlands_terracotta", 5 | "minecraft:sand", 6 | "minecraft:red_sand", 7 | "minecraft:coarse_dirt" 8 | ] 9 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/loot_table/entities/sporeling.json: -------------------------------------------------------------------------------- 1 | { 2 | "pools": [ 3 | { 4 | "rolls": 1, 5 | "entries": [ 6 | { 7 | "type": "minecraft:item", 8 | "name": "minecraft:mushroom_stew" 9 | } 10 | ] 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | # Mobs of Mythology 2 | 3 | ## [2.2.2] - 09/04/2025 4 | 5 | - add Chinese (Simplified) translation (thanks to @pyreymo) 6 | - update Portuguese (Brazilian) translation (thanks to @Xlr11) 7 | 8 | [![Bisect Hosting](https://www.bisecthosting.com/images/CF/Mobs_of_Mythology/BH_MOM_promo.webp)](https://bisecthosting.com/PixelDream) -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/neoforge/biome_modifier/drakes_spawn.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "neoforge:add_spawns", 3 | "biomes": "#mobs_of_mythology:drakes_spawn_in", 4 | "spawners": [ 5 | { 6 | "type": "mobs_of_mythology:drake", 7 | "weight": 10, 8 | "minCount": 1, 9 | "maxCount": 3 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/neoforge/biome_modifier/pegasus_spawn.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "neoforge:add_spawns", 3 | "biomes": "#mobs_of_mythology:pegasus_spawn_in", 4 | "spawners": [ 5 | { 6 | "type": "mobs_of_mythology:pegasus", 7 | "weight": 10, 8 | "minCount": 1, 9 | "maxCount": 2 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/recipe/gear.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "key": { 4 | "#": { 5 | "tag": "c:bronze_ingots" 6 | } 7 | }, 8 | "pattern": [ 9 | " # ", 10 | "# #", 11 | " # " 12 | ], 13 | "result": { 14 | "count": 1, 15 | "id": "mobs_of_mythology:gear" 16 | } 17 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/neoforge/biome_modifier/sporelings_spawn.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "neoforge:add_spawns", 3 | "biomes": "#mobs_of_mythology:sporelings_spawn_in", 4 | "spawners": [ 5 | { 6 | "type": "mobs_of_mythology:sporeling", 7 | "weight": 10, 8 | "minCount": 1, 9 | "maxCount": 3 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/neoforge/biome_modifier/chupacabras_spawn.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "neoforge:add_spawns", 3 | "biomes": "#mobs_of_mythology:chupacabras_spawn_in", 4 | "spawners": [ 5 | { 6 | "type": "mobs_of_mythology:chupacabra", 7 | "weight": 10, 8 | "minCount": 1, 9 | "maxCount": 3 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/recipe/cooked_chupacabra_meat.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:smelting", 3 | "category": "food", 4 | "cookingtime": 200, 5 | "experience": 0.35, 6 | "ingredient": { 7 | "item": "mobs_of_mythology:chupacabra_meat" 8 | }, 9 | "result": { 10 | "id": "mobs_of_mythology:cooked_chupacabra_meat" 11 | } 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/recipe/cut_bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "key": { 4 | "#": { 5 | "tag": "c:bronze_blocks" 6 | } 7 | }, 8 | "pattern": [ 9 | "##", 10 | "##" 11 | ], 12 | "result": { 13 | "count": 4, 14 | "id": "mobs_of_mythology:cut_bronze_block" 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/resources/mobs_of_mythology.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "net.pixeldreamstudios.mobs_of_mythology.mixin", 4 | "compatibilityLevel": "JAVA_21", 5 | "minVersion": "0.8", 6 | "client": [ 7 | ], 8 | "mixins": [ 9 | "CarvedPumpkinBlockMixin" 10 | ], 11 | "injectors": { 12 | "defaultRequire": 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/recipe/bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shaped", 3 | "key": { 4 | "#": { 5 | "tag": "c:bronze_ingots" 6 | } 7 | }, 8 | "pattern": [ 9 | "###", 10 | "###", 11 | "###" 12 | ], 13 | "result": { 14 | "count": 1, 15 | "id": "mobs_of_mythology:bronze_block" 16 | } 17 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/recipe/cooked_chupacabra_meat_from_smoking.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:smoking", 3 | "category": "food", 4 | "cookingtime": 100, 5 | "experience": 0.35, 6 | "ingredient": { 7 | "item": "mobs_of_mythology:chupacabra_meat" 8 | }, 9 | "result": { 10 | "id": "mobs_of_mythology:cooked_chupacabra_meat" 11 | } 12 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/recipe/cooked_chupacabra_meat_from_campfire_cooking.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:campfire_cooking", 3 | "category": "food", 4 | "cookingtime": 600, 5 | "experience": 0.35, 6 | "ingredient": { 7 | "item": "mobs_of_mythology:chupacabra_meat" 8 | }, 9 | "result": { 10 | "id": "mobs_of_mythology:cooked_chupacabra_meat" 11 | } 12 | } -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | maven { url "https://maven.fabricmc.net/" } 4 | maven { url "https://maven.architectury.dev/" } 5 | maven { url "https://files.minecraftforge.net/maven/" } 6 | gradlePluginPortal() 7 | } 8 | } 9 | 10 | rootProject.name = 'Mobs of Mythology' 11 | 12 | include 'common' 13 | include 'fabric' 14 | include 'neoforge' 15 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/worldgen/structure_set/automaton_structure.json: -------------------------------------------------------------------------------- 1 | { 2 | "structures": [ 3 | { 4 | "structure": "mobs_of_mythology:automaton_structure", 5 | "weight": 1 6 | } 7 | ], 8 | "placement": { 9 | "type": "minecraft:random_spread", 10 | "spacing": 50, 11 | "separation": 20, 12 | "frequency": 0.1, 13 | "salt": 1646207470 14 | } 15 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | 3 | # gradle 4 | 5 | .gradle/ 6 | build/ 7 | out/ 8 | classes/ 9 | 10 | # eclipse 11 | 12 | *.launch 13 | 14 | # idea 15 | 16 | .idea/ 17 | *.iml 18 | *.ipr 19 | *.iws 20 | 21 | # vscode 22 | 23 | .settings/ 24 | .vscode/ 25 | bin/ 26 | .classpath 27 | .project 28 | 29 | # macos 30 | 31 | *.DS_Store 32 | 33 | # fabric 34 | 35 | run/ 36 | 37 | # java 38 | 39 | hs_err_*.log 40 | replay_*.log 41 | *.hprof 42 | *.jfr 43 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/blockstates/cut_bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "axis=x": { 4 | "model": "mobs_of_mythology:block/cut_bronze_block", 5 | "x": 90, 6 | "y": 90 7 | }, 8 | "axis=y": { 9 | "model": "mobs_of_mythology:block/cut_bronze_block" 10 | }, 11 | "axis=z": { 12 | "model": "mobs_of_mythology:block/cut_bronze_block", 13 | "x": 90 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/worldgen/template_pool/automaton_structure.json: -------------------------------------------------------------------------------- 1 | { 2 | "fallback": "minecraft:empty", 3 | "elements": [ 4 | { 5 | "weight": 1, 6 | "element": { 7 | "element_type": "minecraft:legacy_single_pool_element", 8 | "location": "mobs_of_mythology:automaton_structure", 9 | "projection": "rigid", 10 | "processors": "minecraft:empty" 11 | } 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/worldgen/structure/automaton_structure.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:jigsaw", 3 | "biomes": "#c:is_mountain", 4 | "step": "surface_structures", 5 | "spawn_overrides": {}, 6 | "start_pool": "mobs_of_mythology:automaton_structure", 7 | "size": 7, 8 | "start_height": { 9 | "absolute": 1 10 | }, 11 | "project_start_to_heightmap": "WORLD_SURFACE_WG", 12 | "max_distance_from_center": 80, 13 | "use_expansion_hack": false 14 | } -------------------------------------------------------------------------------- /fabric/src/main/java/net/pixeldreamstudios/mobs_of_mythology/fabric/client/MobsOfMythologyFabricClient.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.fabric.client; 2 | 3 | import net.fabricmc.api.ClientModInitializer; 4 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 5 | 6 | public final class MobsOfMythologyFabricClient implements ClientModInitializer { 7 | @Override 8 | public void onInitializeClient() { 9 | MobsOfMythology.initClient(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/neoforge/biome_modifier/kobolds_spawn.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "neoforge:add_spawns", 3 | "biomes": "#mobs_of_mythology:kobolds_spawn_in", 4 | "spawners": [ 5 | { 6 | "type": "mobs_of_mythology:kobold_warrior", 7 | "weight": 10, 8 | "minCount": 1, 9 | "maxCount": 4 10 | }, 11 | { 12 | "type": "mobs_of_mythology:kobold", 13 | "weight": 10, 14 | "minCount": 1, 15 | "maxCount": 3 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/loot_table/blocks/bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "bonus_rolls": 0.0, 6 | "conditions": [ 7 | { 8 | "condition": "minecraft:survives_explosion" 9 | } 10 | ], 11 | "entries": [ 12 | { 13 | "type": "minecraft:item", 14 | "name": "mobs_of_mythology:bronze_block" 15 | } 16 | ], 17 | "rolls": 1.0 18 | } 19 | ], 20 | "random_sequence": "mobs_of_mythology:blocks/bronze_block" 21 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/loot_table/blocks/cut_bronze_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:block", 3 | "pools": [ 4 | { 5 | "bonus_rolls": 0.0, 6 | "conditions": [ 7 | { 8 | "condition": "minecraft:survives_explosion" 9 | } 10 | ], 11 | "entries": [ 12 | { 13 | "type": "minecraft:item", 14 | "name": "mobs_of_mythology:cut_bronze_block" 15 | } 16 | ], 17 | "rolls": 1.0 18 | } 19 | ], 20 | "random_sequence": "mobs_of_mythology:blocks/cut_bronze_block" 21 | } -------------------------------------------------------------------------------- /neoforge/src/main/java/net/pixeldreamstudios/mobs_of_mythology/neoforge/MobsOfMythologyNeoForge.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.neoforge; 2 | 3 | import dev.architectury.utils.EnvExecutor; 4 | import net.neoforged.api.distmarker.Dist; 5 | import net.neoforged.fml.common.Mod; 6 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 7 | 8 | @Mod(MobsOfMythology.MOD_ID) 9 | public final class MobsOfMythologyNeoForge { 10 | public MobsOfMythologyNeoForge() { 11 | MobsOfMythology.init(); 12 | EnvExecutor.runInEnv(Dist.CLIENT, () -> MobsOfMythology::initClient); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/advancement/mobs_of_mythology.json: -------------------------------------------------------------------------------- 1 | { 2 | "display": { 3 | "icon": { 4 | "id": "mobs_of_mythology:automaton_head" 5 | }, 6 | "title": { 7 | "translate": "advancements.mobs_of_mythology.title" 8 | }, 9 | "description": { 10 | "translate": "advancements.mobs_of_mythology.description" 11 | }, 12 | "frame": "task", 13 | "show_toast": true, 14 | "announce_to_chat": true, 15 | "background": "mobs_of_mythology:textures/block/bronze_block_cut_side.png" 16 | }, 17 | "criteria": { 18 | "requirement": { 19 | "trigger": "minecraft:tick" 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /fabric/src/main/java/net/pixeldreamstudios/mobs_of_mythology/fabric/MobsOfMythologyFabric.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.fabric; 2 | 3 | import net.fabricmc.api.ModInitializer; 4 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 5 | 6 | public final class MobsOfMythologyFabric implements ModInitializer { 7 | @Override 8 | public void onInitialize() { 9 | // This code runs as soon as Minecraft is in a mod-load-ready state. 10 | // However, some things (like resources) may still be uninitialized. 11 | // Proceed with mild caution. 12 | 13 | // Run our common setup. 14 | MobsOfMythology.init(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/advancement/tame_basilisk.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "mobs_of_mythology:mobs_of_mythology", 3 | "criteria": { 4 | "tamed_animal": { 5 | "trigger": "minecraft:tame_animal" 6 | } 7 | }, 8 | "display": { 9 | "description": { 10 | "translate": "advancements.mobs_of_mythology.tame_basilisk.description" 11 | }, 12 | "icon": { 13 | "count": 1, 14 | "id": "mobs_of_mythology:basilisk_head" 15 | }, 16 | "title": { 17 | "translate": "advancements.mobs_of_mythology.tame_basilisk.title" 18 | } 19 | }, 20 | "requirements": [ 21 | [ 22 | "tamed_animal" 23 | ] 24 | ], 25 | "sends_telemetry_event": true 26 | } -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/recipe/bronze_ingot.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:crafting_shapeless", 3 | "ingredients": [ 4 | { 5 | "item": "minecraft:copper_ingot" 6 | }, 7 | { 8 | "item": "minecraft:copper_ingot" 9 | }, 10 | { 11 | "item": "minecraft:copper_ingot" 12 | }, 13 | { 14 | "item": "minecraft:copper_ingot" 15 | }, 16 | { 17 | "item": "minecraft:iron_ingot" 18 | }, 19 | { 20 | "item": "minecraft:iron_ingot" 21 | }, 22 | { 23 | "item": "minecraft:iron_ingot" 24 | }, 25 | { 26 | "item": "minecraft:iron_ingot" 27 | } 28 | ], 29 | "result": { 30 | "count": 1, 31 | "id": "mobs_of_mythology:bronze_ingot" 32 | } 33 | } -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/variant/KoboldVariant.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.variant; 2 | 3 | import java.util.Arrays; 4 | import java.util.Comparator; 5 | 6 | public enum KoboldVariant { 7 | KOBOLD(0), 8 | KOBOLD_CLOTHED(1); 9 | 10 | private static final KoboldVariant[] BY_ID = 11 | Arrays.stream(values()) 12 | .sorted(Comparator.comparingInt(KoboldVariant::getId)) 13 | .toArray(KoboldVariant[]::new); 14 | private final int id; 15 | 16 | KoboldVariant(int id) { 17 | this.id = id; 18 | } 19 | 20 | public static KoboldVariant byId(int id) { 21 | return BY_ID[id % BY_ID.length]; 22 | } 23 | 24 | public int getId() { 25 | return this.id; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/variant/SporelingVariant.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.variant; 2 | 3 | import java.util.Arrays; 4 | import java.util.Comparator; 5 | 6 | public enum SporelingVariant { 7 | RED(0), 8 | 9 | BROWN(1); 10 | 11 | private static final SporelingVariant[] BY_ID = 12 | Arrays.stream(values()) 13 | .sorted(Comparator.comparingInt(SporelingVariant::getId)) 14 | .toArray(SporelingVariant[]::new); 15 | private final int id; 16 | 17 | SporelingVariant(int id) { 18 | this.id = id; 19 | } 20 | 21 | public static SporelingVariant byId(int id) { 22 | return BY_ID[id % BY_ID.length]; 23 | } 24 | 25 | public int getId() { 26 | return this.id; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/build.gradle: -------------------------------------------------------------------------------- 1 | architectury { 2 | common rootProject.enabled_platforms.split(',') 3 | } 4 | 5 | dependencies { 6 | // We depend on Fabric Loader here to use the Fabric @Environment annotations, 7 | // which get remapped to the correct annotations on each platform. 8 | // Do NOT use other classes from Fabric Loader. 9 | modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" 10 | 11 | // Architectury API. This is optional, and you can comment it out if you don't need it. 12 | modImplementation "dev.architectury:architectury:${architectury_api_version}" 13 | 14 | modImplementation "mod.azure.azurelib:azurelib-common-${minecraft_version}:${azurelib_version}" 15 | modImplementation "net.tslat.smartbrainlib:SmartBrainLib-common-${minecraft_version}:${sbl_version}" 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/sounds.json: -------------------------------------------------------------------------------- 1 | { 2 | "drake_roar": { 3 | "subtitle": "sound.mobs_of_mythology.drake_roar", 4 | "sounds": [ 5 | "mobs_of_mythology:entity/drake/roar_1", 6 | "mobs_of_mythology:entity/drake/roar_2", 7 | "mobs_of_mythology:entity/drake/roar_3", 8 | "mobs_of_mythology:entity/drake/roar_small", 9 | "mobs_of_mythology:entity/drake/roar_cave", 10 | "mobs_of_mythology:entity/drake/exhale" 11 | ] 12 | }, 13 | "drake_death": { 14 | "subtitle": "sound.mobs_of_mythology.drake_death", 15 | "sounds": [ 16 | "mobs_of_mythology:entity/drake/roar_big" 17 | ] 18 | }, 19 | "robotic_voice": { 20 | "subtitle": "sound.mobs_of_mythology.robotic_voice", 21 | "sounds": [ 22 | "mobs_of_mythology:entity/automaton/robotic_voice" 23 | ] 24 | } 25 | } -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/variant/DrakeVariant.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.variant; 2 | 3 | import java.util.Arrays; 4 | import java.util.Comparator; 5 | 6 | public enum DrakeVariant { 7 | DRAKE_1(0), 8 | DRAKE_2(1), 9 | DRAKE_3(2), 10 | DRAKE_4(3), 11 | DRAKE_5(4), 12 | DRAKE_6(5), 13 | DRAKE_7(6); 14 | 15 | private static final DrakeVariant[] BY_ID = 16 | Arrays.stream(values()) 17 | .sorted(Comparator.comparingInt(DrakeVariant::getId)) 18 | .toArray(DrakeVariant[]::new); 19 | private final int id; 20 | 21 | DrakeVariant(int id) { 22 | this.id = id; 23 | } 24 | 25 | public static DrakeVariant byId(int id) { 26 | return BY_ID[id % BY_ID.length]; 27 | } 28 | 29 | public int getId() { 30 | return this.id; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/variant/KoboldWarriorVariant.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.variant; 2 | 3 | import java.util.Arrays; 4 | import java.util.Comparator; 5 | 6 | public enum KoboldWarriorVariant { 7 | KOBOLD_WARRIOR_1(0), 8 | KOBOLD_WARRIOR_2(1), 9 | KOBOLD_WARRIOR_3(2); 10 | 11 | private static final KoboldWarriorVariant[] BY_ID = 12 | Arrays.stream(values()) 13 | .sorted(Comparator.comparingInt(KoboldWarriorVariant::getId)) 14 | .toArray(KoboldWarriorVariant[]::new); 15 | private final int id; 16 | 17 | KoboldWarriorVariant(int id) { 18 | this.id = id; 19 | } 20 | 21 | public static KoboldWarriorVariant byId(int id) { 22 | return BY_ID[id % BY_ID.length]; 23 | } 24 | 25 | public int getId() { 26 | return this.id; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: "Feature request" 2 | description: "Suggest a new feature or improvement." 3 | labels: ["enhancement"] 4 | body: 5 | - type: textarea 6 | attributes: 7 | label: "Describe your suggestion" 8 | description: "Provide a clear and concise description of your suggestion, along with the reasons for it." 9 | validations: 10 | required: true 11 | - type: textarea 12 | attributes: 13 | label: "Benefits of the feature" 14 | description: "Explain how this feature will benefit users and improve the mod." 15 | validations: 16 | required: true 17 | - type: textarea 18 | attributes: 19 | label: "Additional context" 20 | description: "Add any other context or screenshots about the feature request (if applicable)." 21 | validations: 22 | required: false 23 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Done to increase the memory available to Gradle. 2 | org.gradle.jvmargs=-Xmx2G 3 | org.gradle.parallel=true 4 | # Mod properties 5 | mod_version=2.2.2 6 | maven_group=net.pixeldreamstudios.mobs_of_mythology 7 | archives_name=mobs_of_mythology 8 | enabled_platforms=fabric,neoforge 9 | # Minecraft properties 10 | minecraft_version=1.21.1 11 | # Dependencies 12 | # https://modrinth.com/mod/architectury-api/versions?l=fabric&l=neoforge&g=1.21.1 13 | architectury_api_version=13.0.8 14 | # https://fabricmc.net/develop/ 15 | fabric_loader_version=0.16.13 16 | fabric_api_version=0.115.4+1.21.1 17 | # https://projects.neoforged.net/neoforged/neoforge 18 | neoforge_version=21.1.145 19 | # Libraries 20 | # https://modrinth.com/mod/azurelib/versions?l=neoforge&l=fabric&g=1.21.1 21 | azurelib_version=2.3.28 22 | # https://modrinth.com/mod/smartbrainlib/versions?l=neoforge&l=fabric&g=1.21.1 23 | sbl_version=1.16.7 24 | # https://modrinth.com/mod/modmenu/versions?l=fabric&g=1.21.1 25 | modmenu_version=11.0.3 26 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/renderer/PegasusRenderer.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer; 2 | 3 | import mod.azure.azurelib.common.api.client.renderer.GeoEntityRenderer; 4 | import net.minecraft.client.renderer.entity.EntityRendererProvider; 5 | import net.minecraft.resources.ResourceLocation; 6 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 7 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.model.PegasusModel; 8 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.PegasusEntity; 9 | 10 | public class PegasusRenderer extends GeoEntityRenderer { 11 | public PegasusRenderer(EntityRendererProvider.Context ctx) { 12 | super(ctx, new PegasusModel()); 13 | this.shadowRadius = 0.75f; 14 | } 15 | 16 | @Override 17 | public ResourceLocation getTextureLocation(PegasusEntity animatable) { 18 | return ResourceLocation.fromNamespaceAndPath( 19 | MobsOfMythology.MOD_ID, "textures/entity/pegasus.png"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/renderer/AutomatonRenderer.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer; 2 | 3 | import mod.azure.azurelib.common.api.client.renderer.GeoEntityRenderer; 4 | import net.minecraft.client.renderer.entity.EntityRendererProvider; 5 | import net.minecraft.resources.ResourceLocation; 6 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 7 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.model.AutomatonModel; 8 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.AutomatonEntity; 9 | 10 | public class AutomatonRenderer extends GeoEntityRenderer { 11 | public AutomatonRenderer(EntityRendererProvider.Context ctx) { 12 | super(ctx, new AutomatonModel()); 13 | this.shadowRadius = 0.85f; 14 | } 15 | 16 | @Override 17 | public ResourceLocation getTextureLocation(AutomatonEntity animatable) { 18 | return ResourceLocation.fromNamespaceAndPath( 19 | MobsOfMythology.MOD_ID, "textures/entity/automaton.png"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/loot_table/entities/kobold_warrior.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:entity", 3 | "random_sequence": "mobs_of_mythology:entities/kobold_warrior", 4 | "pools": [ 5 | { 6 | "rolls": 1.0, 7 | "entries": [ 8 | { 9 | "name": "mobs_of_mythology:kobold_spear", 10 | "type": "minecraft:item", 11 | "conditions": [ 12 | { 13 | "condition": "random_chance", 14 | "chance": 0.2 15 | } 16 | ] 17 | } 18 | ] 19 | }, 20 | { 21 | "rolls": 1.0, 22 | "entries": [ 23 | { 24 | "name": "minecraft:emerald", 25 | "type": "minecraft:item", 26 | "functions": [ 27 | { 28 | "function": "minecraft:set_count", 29 | "count": { 30 | "max": 5.0, 31 | "min": 3.0 32 | } 33 | } 34 | ], 35 | "conditions": [ 36 | { 37 | "condition": "random_chance", 38 | "chance": 0.3 39 | } 40 | ] 41 | } 42 | ] 43 | } 44 | ] 45 | } -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/model/DrakeModel.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.model; 2 | 3 | import mod.azure.azurelib.common.api.client.model.GeoModel; 4 | import net.minecraft.resources.ResourceLocation; 5 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 6 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer.DrakeRenderer; 7 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.DrakeEntity; 8 | 9 | public class DrakeModel extends GeoModel { 10 | 11 | @Override 12 | public ResourceLocation getModelResource(DrakeEntity object) { 13 | return ResourceLocation.fromNamespaceAndPath( 14 | MobsOfMythology.MOD_ID, "geo/entity/drake.geo.json"); 15 | } 16 | 17 | @Override 18 | public ResourceLocation getTextureResource(DrakeEntity object) { 19 | return DrakeRenderer.LOCATION_BY_VARIANT.get(object.getVariant()); 20 | } 21 | 22 | @Override 23 | public ResourceLocation getAnimationResource(DrakeEntity animatable) { 24 | return ResourceLocation.fromNamespaceAndPath( 25 | MobsOfMythology.MOD_ID, "animations/entity/drake.animation.json"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/model/ChupacabraModel.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.model; 2 | 3 | import mod.azure.azurelib.common.api.client.model.GeoModel; 4 | import net.minecraft.resources.ResourceLocation; 5 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 6 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.ChupacabraEntity; 7 | 8 | public class ChupacabraModel extends GeoModel { 9 | 10 | @Override 11 | public ResourceLocation getModelResource(ChupacabraEntity object) { 12 | return ResourceLocation.fromNamespaceAndPath( 13 | MobsOfMythology.MOD_ID, "geo/entity/chupacabra.geo.json"); 14 | } 15 | 16 | @Override 17 | public ResourceLocation getTextureResource(ChupacabraEntity object) { 18 | return ResourceLocation.fromNamespaceAndPath( 19 | MobsOfMythology.MOD_ID, "textures/entity/chupacabra.png"); 20 | } 21 | 22 | @Override 23 | public ResourceLocation getAnimationResource(ChupacabraEntity animatable) { 24 | return ResourceLocation.fromNamespaceAndPath( 25 | MobsOfMythology.MOD_ID, "animations/entity/chupacabra.animation.json"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/renderer/ChupacabraRenderer.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer; 2 | 3 | import mod.azure.azurelib.common.api.client.renderer.GeoEntityRenderer; 4 | import mod.azure.azurelib.common.api.client.renderer.layer.AutoGlowingGeoLayer; 5 | import net.minecraft.client.renderer.entity.EntityRendererProvider; 6 | import net.minecraft.resources.ResourceLocation; 7 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 8 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.model.ChupacabraModel; 9 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.ChupacabraEntity; 10 | 11 | public class ChupacabraRenderer extends GeoEntityRenderer { 12 | public ChupacabraRenderer(EntityRendererProvider.Context ctx) { 13 | super(ctx, new ChupacabraModel()); 14 | this.shadowRadius = 0.65f; 15 | addRenderLayer(new AutoGlowingGeoLayer<>(this)); 16 | } 17 | 18 | @Override 19 | public ResourceLocation getTextureLocation(ChupacabraEntity animatable) { 20 | return ResourceLocation.fromNamespaceAndPath( 21 | MobsOfMythology.MOD_ID, "textures/entity/chupacabra.png"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/model/SporelingModel.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.model; 2 | 3 | import mod.azure.azurelib.common.api.client.model.GeoModel; 4 | import net.minecraft.resources.ResourceLocation; 5 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 6 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer.SporelingRenderer; 7 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.SporelingEntity; 8 | 9 | public class SporelingModel extends GeoModel { 10 | 11 | @Override 12 | public ResourceLocation getModelResource(SporelingEntity object) { 13 | return ResourceLocation.fromNamespaceAndPath( 14 | MobsOfMythology.MOD_ID, "geo/entity/sporeling.geo.json"); 15 | } 16 | 17 | @Override 18 | public ResourceLocation getTextureResource(SporelingEntity object) { 19 | return SporelingRenderer.LOCATION_BY_VARIANT.get(object.getVariant()); 20 | } 21 | 22 | @Override 23 | public ResourceLocation getAnimationResource(SporelingEntity animatable) { 24 | return ResourceLocation.fromNamespaceAndPath( 25 | MobsOfMythology.MOD_ID, "animations/entity/sporeling.animation.json"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/registry/TabRegistry.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.registry; 2 | 3 | import dev.architectury.registry.CreativeTabRegistry; 4 | import dev.architectury.registry.registries.DeferredRegister; 5 | import dev.architectury.registry.registries.RegistrySupplier; 6 | import net.minecraft.core.registries.Registries; 7 | import net.minecraft.network.chat.Component; 8 | import net.minecraft.world.item.CreativeModeTab; 9 | import net.minecraft.world.item.ItemStack; 10 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 11 | 12 | public class TabRegistry { 13 | public static final DeferredRegister TABS = 14 | DeferredRegister.create(MobsOfMythology.MOD_ID, Registries.CREATIVE_MODE_TAB); 15 | public static final RegistrySupplier MOBS_OF_MYTHOLOGY_TAB = 16 | TABS.register( 17 | "mobs_of_mythology_tab", // Tab ID 18 | () -> 19 | CreativeTabRegistry.create( 20 | Component.translatable("category.mobs_of_mythology"), // Tab Name 21 | () -> new ItemStack(ItemRegistry.AUTOMATON_HEAD.get()) // Icon 22 | )); 23 | 24 | public static void init() { 25 | TABS.register(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/loot_table/entities/automaton.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:entity", 3 | "pools": [ 4 | { 5 | "bonus_rolls": 0.0, 6 | "entries": [ 7 | { 8 | "type": "minecraft:item", 9 | "functions": [ 10 | { 11 | "add": false, 12 | "count": { 13 | "type": "minecraft:uniform", 14 | "max": 2.0, 15 | "min": 0.0 16 | }, 17 | "function": "minecraft:set_count" 18 | } 19 | ], 20 | "name": "mobs_of_mythology:gear" 21 | } 22 | ], 23 | "rolls": 1.0 24 | }, 25 | { 26 | "bonus_rolls": 0.0, 27 | "entries": [ 28 | { 29 | "type": "minecraft:item", 30 | "functions": [ 31 | { 32 | "add": false, 33 | "count": { 34 | "type": "minecraft:uniform", 35 | "max": 5.0, 36 | "min": 3.0 37 | }, 38 | "function": "minecraft:set_count" 39 | } 40 | ], 41 | "name": "mobs_of_mythology:bronze_ingot" 42 | } 43 | ], 44 | "rolls": 1.0 45 | } 46 | ], 47 | "random_sequence": "mobs_of_mythology:entities/automaton" 48 | } -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/constant/DefaultMythAnimations.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.constant; 2 | 3 | import mod.azure.azurelib.core.animation.Animation; 4 | import mod.azure.azurelib.core.animation.RawAnimation; 5 | 6 | public final class DefaultMythAnimations { 7 | public static final RawAnimation IDLE = RawAnimation.begin().thenLoop("idle"); 8 | public static final RawAnimation WALK = RawAnimation.begin().thenLoop("walk"); 9 | public static final RawAnimation RUN = RawAnimation.begin().thenLoop("run"); 10 | public static final RawAnimation FLY = RawAnimation.begin().thenLoop("fly"); 11 | public static final RawAnimation DEATH = RawAnimation.begin().thenPlayAndHold("death"); 12 | public static final RawAnimation ATTACK = 13 | RawAnimation.begin().then("attack", Animation.LoopType.PLAY_ONCE); 14 | public static final RawAnimation ATTACK2 = 15 | RawAnimation.begin().then("attack2", Animation.LoopType.PLAY_ONCE); 16 | public static final RawAnimation SIT = RawAnimation.begin().thenLoop("sit"); 17 | public static final RawAnimation IDLE_RIDING = RawAnimation.begin().thenLoop("idle_riding"); 18 | public static final RawAnimation WALK_RIDING = RawAnimation.begin().thenLoop("walk_riding"); 19 | public static final RawAnimation RUN_RIDING = RawAnimation.begin().thenLoop("run_riding"); 20 | } 21 | -------------------------------------------------------------------------------- /neoforge/src/main/resources/META-INF/neoforge.mods.toml: -------------------------------------------------------------------------------- 1 | modLoader = "javafml" 2 | loaderVersion = "[4,)" 3 | issueTrackerURL = "https://github.com/kyber-6/mobs-of-mythology-mod/issues" 4 | license = "GNU GPL 3.0" 5 | 6 | [[mods]] 7 | modId = "mobs_of_mythology" 8 | version = "${version}" 9 | displayName = "Mobs of Mythology" 10 | authors = "kyber-6" 11 | credits = "Pixel Dream Studios, steficy, AzureDoom, karelien" 12 | displayURL = "https://www.curseforge.com/minecraft/mc-mods/mobs-of-mythology" 13 | description = ''' 14 | Discover a World of Mythological Creatures in Minecraft! 15 | ''' 16 | logoFile = "icon.png" 17 | 18 | [[dependencies.mobs_of_mythology]] 19 | modId = "neoforge" 20 | type = "required" 21 | versionRange = "[21.0,)" 22 | ordering = "NONE" 23 | side = "BOTH" 24 | 25 | [[dependencies.mobs_of_mythology]] 26 | modId = "minecraft" 27 | type = "required" 28 | versionRange = "[1.21,)" 29 | ordering = "NONE" 30 | side = "BOTH" 31 | 32 | [[dependencies.mobs_of_mythology]] 33 | modId = "architectury" 34 | type = "required" 35 | versionRange = "[13.0.2,)" 36 | ordering = "AFTER" 37 | side = "BOTH" 38 | 39 | [[dependencies.mobs_of_mythology]] 40 | modId = "azurelib" 41 | type = "required" 42 | versionRange = "[2.3.4,)" 43 | ordering = "NONE" 44 | side = "BOTH" 45 | 46 | [[dependencies.mobs_of_mythology]] 47 | modId = "smartbrainlib" 48 | type = "required" 49 | versionRange = "[1.14.2,)" 50 | ordering = "NONE" 51 | side = "BOTH" 52 | 53 | [[mixins]] 54 | config = "mobs_of_mythology.mixins.json" 55 | -------------------------------------------------------------------------------- /fabric/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "mobs_of_mythology", 4 | "version": "${version}", 5 | "name": "Mobs of Mythology", 6 | "description": "Discover a World of Mythological Creatures in Minecraft!", 7 | "authors": [ 8 | "kyber-6" 9 | ], 10 | "contributors": [ 11 | "Pixel Dream Studios", 12 | "steficy", 13 | "AzureDoom", 14 | "karelien" 15 | ], 16 | "contact": { 17 | "homepage": "https://www.curseforge.com/minecraft/mc-mods/mobs-of-mythology", 18 | "sources": "https://github.com/kyber-6/mobs-of-mythology-mod", 19 | "issues": "https://github.com/kyber-6/mobs-of-mythology-mod/issues" 20 | }, 21 | "license": "GPL-3.0", 22 | "icon": "icon.png", 23 | "environment": "*", 24 | "entrypoints": { 25 | "main": [ 26 | "net.pixeldreamstudios.mobs_of_mythology.fabric.MobsOfMythologyFabric" 27 | ], 28 | "client": [ 29 | "net.pixeldreamstudios.mobs_of_mythology.fabric.client.MobsOfMythologyFabricClient" 30 | ] 31 | }, 32 | "mixins": [ 33 | "mobs_of_mythology.mixins.json" 34 | ], 35 | "depends": { 36 | "fabricloader": ">=0.15.11", 37 | "minecraft": "~1.21", 38 | "java": ">=21", 39 | "architectury": ">=13.0.2", 40 | "fabric-api": "*", 41 | "azurelib": ">=2.3.4", 42 | "smartbrainlib": ">=1.14.2" 43 | }, 44 | "custom": { 45 | "modmenu": { 46 | "links": { 47 | "modmenu.discord": "https://discord.com/invite/pixel-dream-studios-872788557553610802" 48 | } 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: "Bug report" 2 | description: "The game crashed or something is not working as intended." 3 | labels: ["bug"] 4 | body: 5 | - type: dropdown 6 | attributes: 7 | label: "Confirm mod version" 8 | description: "Please confirm that you are using the active in-development version of the mod, which is 1.21." 9 | options: 10 | - "Yes, I am using version 1.21" 11 | - "No, I am not using version 1.21" 12 | validations: 13 | required: true 14 | - type: textarea 15 | attributes: 16 | label: "Describe the bug" 17 | description: "Provide a clear and concise description of what the bug is." 18 | validations: 19 | required: true 20 | - type: textarea 21 | attributes: 22 | label: "Reproduction steps" 23 | description: "Detail the steps to reproduce the behavior." 24 | validations: 25 | required: true 26 | - type: textarea 27 | attributes: 28 | label: "Screenshots" 29 | description: "Attach screenshots or videos to help explain your problem (if applicable)." 30 | validations: 31 | required: false 32 | - type: textarea 33 | attributes: 34 | label: "Logs & crash-reports" 35 | description: "Provide a crash report or the latest log (if applicable)." 36 | validations: 37 | required: false 38 | - type: input 39 | attributes: 40 | label: "Mod version" 41 | description: "Specify the mod version you were using (e.g., 2.0)." 42 | validations: 43 | required: true 44 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/registry/SoundRegistry.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.registry; 2 | 3 | import dev.architectury.registry.registries.DeferredRegister; 4 | import dev.architectury.registry.registries.RegistrySupplier; 5 | import net.minecraft.core.registries.Registries; 6 | import net.minecraft.resources.ResourceLocation; 7 | import net.minecraft.sounds.SoundEvent; 8 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 9 | 10 | public class SoundRegistry { 11 | public static final DeferredRegister SOUND_EVENTS = 12 | DeferredRegister.create(MobsOfMythology.MOD_ID, Registries.SOUND_EVENT); 13 | public static final RegistrySupplier DRAKE_ROAR = 14 | SOUND_EVENTS.register( 15 | "drake_roar", 16 | () -> 17 | SoundEvent.createVariableRangeEvent( 18 | ResourceLocation.fromNamespaceAndPath(MobsOfMythology.MOD_ID, "drake_roar"))); 19 | public static final RegistrySupplier DRAKE_DEATH = 20 | SOUND_EVENTS.register( 21 | "drake_death", 22 | () -> 23 | SoundEvent.createVariableRangeEvent( 24 | ResourceLocation.fromNamespaceAndPath(MobsOfMythology.MOD_ID, "drake_death"))); 25 | public static final RegistrySupplier ROBOTIC_VOICE = 26 | SOUND_EVENTS.register( 27 | "robotic_voice", 28 | () -> 29 | SoundEvent.createVariableRangeEvent( 30 | ResourceLocation.fromNamespaceAndPath(MobsOfMythology.MOD_ID, "robotic_voice"))); 31 | 32 | public static void init() { 33 | SOUND_EVENTS.register(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/renderer/SporelingRenderer.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer; 2 | 3 | import com.google.common.collect.Maps; 4 | import java.util.Map; 5 | import mod.azure.azurelib.common.api.client.renderer.GeoEntityRenderer; 6 | import net.minecraft.Util; 7 | import net.minecraft.client.renderer.entity.EntityRendererProvider; 8 | import net.minecraft.resources.ResourceLocation; 9 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 10 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.model.SporelingModel; 11 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.SporelingEntity; 12 | import net.pixeldreamstudios.mobs_of_mythology.entity.variant.SporelingVariant; 13 | 14 | public class SporelingRenderer extends GeoEntityRenderer { 15 | public static final Map LOCATION_BY_VARIANT = 16 | Util.make( 17 | Maps.newEnumMap(SporelingVariant.class), 18 | (map) -> { 19 | map.put( 20 | SporelingVariant.RED, 21 | ResourceLocation.fromNamespaceAndPath( 22 | MobsOfMythology.MOD_ID, "textures/entity/sporeling/sporeling_red.png")); 23 | map.put( 24 | SporelingVariant.BROWN, 25 | ResourceLocation.fromNamespaceAndPath( 26 | MobsOfMythology.MOD_ID, "textures/entity/sporeling/sporeling_brown.png")); 27 | }); 28 | 29 | public SporelingRenderer(EntityRendererProvider.Context ctx) { 30 | super(ctx, new SporelingModel()); 31 | this.shadowRadius = 0.32f; 32 | } 33 | 34 | @Override 35 | public ResourceLocation getTextureLocation(SporelingEntity animatable) { 36 | return LOCATION_BY_VARIANT.get(animatable.getVariant()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE v3.0 2 | 3 | Copyright (c) 2025 Pixel Dream Studios 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | 18 | The following files and directories are licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License (CC BY-NC-SA 4.0): 19 | 20 | * common/src/main/resources 21 | * fabric/src/main/resources 22 | * neoforge/src/main/resources 23 | 24 | You are free to: 25 | 26 | * **Share** — copy and redistribute the material in any medium or format 27 | * **Adapt** — remix, transform, and build upon the material 28 | 29 | Under the following terms: 30 | 31 | * **Attribution** — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. 32 | * **NonCommercial** — You may not use the material for commercial purposes. 33 | * **ShareAlike** — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. 34 | 35 | You can find a copy of this license at . 36 | 37 | All other files and directories within this project are covered by the GNU General Public License v3.0 as described above. 38 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/MobsOfMythology.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology; 2 | 3 | import dev.architectury.registry.client.level.entity.EntityRendererRegistry; 4 | import mod.azure.azurelib.common.internal.common.AzureLib; 5 | import mod.azure.azurelib.common.internal.common.AzureLibMod; 6 | import mod.azure.azurelib.common.internal.common.config.format.ConfigFormats; 7 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer.*; 8 | import net.pixeldreamstudios.mobs_of_mythology.registry.*; 9 | import org.slf4j.Logger; 10 | import org.slf4j.LoggerFactory; 11 | 12 | public final class MobsOfMythology { 13 | public static final String MOD_ID = "mobs_of_mythology"; 14 | public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); 15 | public static MobsOfMythologyConfig config; 16 | 17 | public static void init() { 18 | AzureLib.initialize(); 19 | config = 20 | AzureLibMod.registerConfig(MobsOfMythologyConfig.class, ConfigFormats.properties()) 21 | .getConfigInstance(); 22 | SoundRegistry.init(); 23 | EntityRegistry.init(); 24 | ItemRegistry.init(); 25 | BlockRegistry.init(); 26 | TabRegistry.init(); 27 | } 28 | 29 | public static void initClient() { 30 | EntityRendererRegistry.register(EntityRegistry.AUTOMATON, AutomatonRenderer::new); 31 | EntityRendererRegistry.register(EntityRegistry.CHUPACABRA, ChupacabraRenderer::new); 32 | EntityRendererRegistry.register(EntityRegistry.KOBOLD, KoboldRenderer::new); 33 | EntityRendererRegistry.register(EntityRegistry.KOBOLD_WARRIOR, KoboldWarriorRenderer::new); 34 | EntityRendererRegistry.register(EntityRegistry.DRAKE, DrakeRenderer::new); 35 | EntityRendererRegistry.register(EntityRegistry.SPORELING, SporelingRenderer::new); 36 | EntityRendererRegistry.register(EntityRegistry.BASILISK, BasiliskRenderer::new); 37 | EntityRendererRegistry.register(EntityRegistry.PEGASUS, PegasusRenderer::new); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/model/PegasusModel.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.model; 2 | 3 | import mod.azure.azurelib.common.api.client.model.GeoModel; 4 | import mod.azure.azurelib.common.internal.client.model.data.EntityModelData; 5 | import mod.azure.azurelib.common.internal.common.constant.DataTickets; 6 | import mod.azure.azurelib.core.animatable.model.CoreGeoBone; 7 | import mod.azure.azurelib.core.animation.AnimationState; 8 | import net.minecraft.resources.ResourceLocation; 9 | import net.minecraft.util.Mth; 10 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 11 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.PegasusEntity; 12 | 13 | public class PegasusModel extends GeoModel { 14 | 15 | @Override 16 | public ResourceLocation getModelResource(PegasusEntity object) { 17 | return ResourceLocation.fromNamespaceAndPath( 18 | MobsOfMythology.MOD_ID, "geo/entity/pegasus.geo.json"); 19 | } 20 | 21 | @Override 22 | public ResourceLocation getTextureResource(PegasusEntity object) { 23 | return ResourceLocation.fromNamespaceAndPath( 24 | MobsOfMythology.MOD_ID, "textures/entity/pegasus.png"); 25 | } 26 | 27 | @Override 28 | public ResourceLocation getAnimationResource(PegasusEntity animatable) { 29 | return ResourceLocation.fromNamespaceAndPath( 30 | MobsOfMythology.MOD_ID, "animations/entity/pegasus.animation.json"); 31 | } 32 | 33 | @Override 34 | public void setCustomAnimations( 35 | PegasusEntity animatable, long instanceId, AnimationState animationState) { 36 | CoreGeoBone head = getAnimationProcessor().getBone("head"); 37 | 38 | if (head != null) { 39 | EntityModelData entityData = animationState.getData(DataTickets.ENTITY_MODEL_DATA); 40 | head.setRotX(entityData.headPitch() * Mth.DEG_TO_RAD); 41 | head.setRotY(entityData.netHeadYaw() * Mth.DEG_TO_RAD); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/model/BasiliskModel.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.model; 2 | 3 | import mod.azure.azurelib.common.api.client.model.GeoModel; 4 | import mod.azure.azurelib.common.internal.client.model.data.EntityModelData; 5 | import mod.azure.azurelib.common.internal.common.constant.DataTickets; 6 | import mod.azure.azurelib.core.animatable.model.CoreGeoBone; 7 | import mod.azure.azurelib.core.animation.AnimationState; 8 | import net.minecraft.resources.ResourceLocation; 9 | import net.minecraft.util.Mth; 10 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 11 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.BasiliskEntity; 12 | 13 | public class BasiliskModel extends GeoModel { 14 | 15 | @Override 16 | public ResourceLocation getModelResource(BasiliskEntity object) { 17 | return ResourceLocation.fromNamespaceAndPath( 18 | MobsOfMythology.MOD_ID, "geo/entity/basilisk.geo.json"); 19 | } 20 | 21 | @Override 22 | public ResourceLocation getTextureResource(BasiliskEntity object) { 23 | return ResourceLocation.fromNamespaceAndPath( 24 | MobsOfMythology.MOD_ID, "textures/entity/basilisk.png"); 25 | } 26 | 27 | @Override 28 | public ResourceLocation getAnimationResource(BasiliskEntity animatable) { 29 | return ResourceLocation.fromNamespaceAndPath( 30 | MobsOfMythology.MOD_ID, "animations/entity/basilisk.animation.json"); 31 | } 32 | 33 | @Override 34 | public void setCustomAnimations( 35 | BasiliskEntity animatable, long instanceId, AnimationState animationState) { 36 | CoreGeoBone head = getAnimationProcessor().getBone("head"); 37 | 38 | if (head != null) { 39 | EntityModelData entityData = animationState.getData(DataTickets.ENTITY_MODEL_DATA); 40 | head.setRotX(entityData.headPitch() * Mth.DEG_TO_RAD); 41 | head.setRotY(entityData.netHeadYaw() * Mth.DEG_TO_RAD); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/model/KoboldModel.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.model; 2 | 3 | import mod.azure.azurelib.common.api.client.model.GeoModel; 4 | import mod.azure.azurelib.common.internal.client.model.data.EntityModelData; 5 | import mod.azure.azurelib.common.internal.common.constant.DataTickets; 6 | import mod.azure.azurelib.core.animatable.model.CoreGeoBone; 7 | import mod.azure.azurelib.core.animation.AnimationState; 8 | import net.minecraft.resources.ResourceLocation; 9 | import net.minecraft.util.Mth; 10 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 11 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer.KoboldRenderer; 12 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.KoboldEntity; 13 | 14 | public class KoboldModel extends GeoModel { 15 | @Override 16 | public ResourceLocation getModelResource(KoboldEntity object) { 17 | return ResourceLocation.fromNamespaceAndPath( 18 | MobsOfMythology.MOD_ID, "geo/entity/kobold.geo.json"); 19 | } 20 | 21 | @Override 22 | public ResourceLocation getTextureResource(KoboldEntity object) { 23 | return KoboldRenderer.LOCATION_BY_VARIANT.get(object.getVariant()); 24 | } 25 | 26 | @Override 27 | public ResourceLocation getAnimationResource(KoboldEntity animatable) { 28 | return ResourceLocation.fromNamespaceAndPath( 29 | MobsOfMythology.MOD_ID, "animations/entity/kobold.animation.json"); 30 | } 31 | 32 | @Override 33 | public void setCustomAnimations( 34 | KoboldEntity animatable, long instanceId, AnimationState animationState) { 35 | CoreGeoBone head = getAnimationProcessor().getBone("head"); 36 | if (head != null) { 37 | EntityModelData entityData = animationState.getData(DataTickets.ENTITY_MODEL_DATA); 38 | head.setRotX(entityData.headPitch() * Mth.DEG_TO_RAD); 39 | head.setRotY(entityData.netHeadYaw() * Mth.DEG_TO_RAD); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/model/AutomatonModel.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.model; 2 | 3 | import mod.azure.azurelib.common.api.client.model.GeoModel; 4 | import mod.azure.azurelib.common.internal.client.model.data.EntityModelData; 5 | import mod.azure.azurelib.common.internal.common.constant.DataTickets; 6 | import mod.azure.azurelib.core.animatable.model.CoreGeoBone; 7 | import mod.azure.azurelib.core.animation.AnimationState; 8 | import net.minecraft.resources.ResourceLocation; 9 | import net.minecraft.util.Mth; 10 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 11 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.AutomatonEntity; 12 | 13 | public class AutomatonModel extends GeoModel { 14 | 15 | @Override 16 | public ResourceLocation getModelResource(AutomatonEntity object) { 17 | return ResourceLocation.fromNamespaceAndPath( 18 | MobsOfMythology.MOD_ID, "geo/entity/automaton.geo.json"); 19 | } 20 | 21 | @Override 22 | public ResourceLocation getTextureResource(AutomatonEntity object) { 23 | return ResourceLocation.fromNamespaceAndPath( 24 | MobsOfMythology.MOD_ID, "textures/entity/automaton.png"); 25 | } 26 | 27 | @Override 28 | public ResourceLocation getAnimationResource(AutomatonEntity animatable) { 29 | return ResourceLocation.fromNamespaceAndPath( 30 | MobsOfMythology.MOD_ID, "animations/entity/automaton.animation.json"); 31 | } 32 | 33 | @Override 34 | public void setCustomAnimations( 35 | AutomatonEntity animatable, long instanceId, AnimationState animationState) { 36 | CoreGeoBone head = getAnimationProcessor().getBone("head"); 37 | 38 | if (head != null) { 39 | EntityModelData entityData = animationState.getData(DataTickets.ENTITY_MODEL_DATA); 40 | head.setRotX(entityData.headPitch() * Mth.DEG_TO_RAD); 41 | head.setRotY(entityData.netHeadYaw() * Mth.DEG_TO_RAD); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/model/KoboldWarriorModel.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.model; 2 | 3 | import mod.azure.azurelib.common.api.client.model.GeoModel; 4 | import mod.azure.azurelib.common.internal.client.model.data.EntityModelData; 5 | import mod.azure.azurelib.common.internal.common.constant.DataTickets; 6 | import mod.azure.azurelib.core.animatable.model.CoreGeoBone; 7 | import mod.azure.azurelib.core.animation.AnimationState; 8 | import net.minecraft.resources.ResourceLocation; 9 | import net.minecraft.util.Mth; 10 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 11 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer.KoboldWarriorRenderer; 12 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.KoboldWarriorEntity; 13 | 14 | public class KoboldWarriorModel extends GeoModel { 15 | @Override 16 | public ResourceLocation getModelResource(KoboldWarriorEntity object) { 17 | return ResourceLocation.fromNamespaceAndPath( 18 | MobsOfMythology.MOD_ID, "geo/entity/kobold_warrior.geo.json"); 19 | } 20 | 21 | @Override 22 | public ResourceLocation getTextureResource(KoboldWarriorEntity object) { 23 | return KoboldWarriorRenderer.LOCATION_BY_VARIANT.get(object.getVariant()); 24 | } 25 | 26 | @Override 27 | public ResourceLocation getAnimationResource(KoboldWarriorEntity animatable) { 28 | return ResourceLocation.fromNamespaceAndPath( 29 | MobsOfMythology.MOD_ID, "animations/entity/kobold_warrior.animation.json"); 30 | } 31 | 32 | @Override 33 | public void setCustomAnimations( 34 | KoboldWarriorEntity animatable, 35 | long instanceId, 36 | AnimationState animationState) { 37 | CoreGeoBone head = getAnimationProcessor().getBone("head"); 38 | 39 | if (head != null) { 40 | EntityModelData entityData = animationState.getData(DataTickets.ENTITY_MODEL_DATA); 41 | head.setRotX(entityData.headPitch() * Mth.DEG_TO_RAD); 42 | head.setRotY(entityData.netHeadYaw() * Mth.DEG_TO_RAD); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/registry/TagRegistry.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.registry; 2 | 3 | import net.minecraft.core.registries.Registries; 4 | import net.minecraft.resources.ResourceLocation; 5 | import net.minecraft.tags.TagKey; 6 | import net.minecraft.world.item.Item; 7 | import net.minecraft.world.level.biome.Biome; 8 | import net.minecraft.world.level.block.Block; 9 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 10 | 11 | public record TagRegistry() { 12 | // BLOCK TAGS 13 | public static final TagKey BRONZE_BLOCKS = 14 | TagKey.create(Registries.BLOCK, ResourceLocation.fromNamespaceAndPath("c", "bronze_blocks")); 15 | public static final TagKey MYTH_ENTITIES_SPAWNABLE_ON = 16 | TagKey.create( 17 | Registries.BLOCK, 18 | ResourceLocation.fromNamespaceAndPath(MobsOfMythology.MOD_ID, "myth_mob_spawnable_on")); 19 | 20 | // ITEM TAGS 21 | public static final TagKey PICKAXES = 22 | TagKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath("c", "pickaxes")); 23 | public static final TagKey BRONZE_INGOTS = 24 | TagKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath("c", "bronze_ingots")); 25 | 26 | // MOB BIOME SPAWN TAGS 27 | public static TagKey KOBOLD_BIOMES = 28 | TagKey.create( 29 | Registries.BIOME, 30 | ResourceLocation.fromNamespaceAndPath(MobsOfMythology.MOD_ID, "kobolds_spawn_in")); 31 | public static TagKey PEGASUS_BIOMES = 32 | TagKey.create( 33 | Registries.BIOME, 34 | ResourceLocation.fromNamespaceAndPath(MobsOfMythology.MOD_ID, "pegasus_spawn_in")); 35 | public static TagKey DRAKE_BIOMES = 36 | TagKey.create( 37 | Registries.BIOME, 38 | ResourceLocation.fromNamespaceAndPath(MobsOfMythology.MOD_ID, "drakes_spawn_in")); 39 | public static TagKey CHUPACABRA_BIOMES = 40 | TagKey.create( 41 | Registries.BIOME, 42 | ResourceLocation.fromNamespaceAndPath(MobsOfMythology.MOD_ID, "chupacabras_spawn_in")); 43 | public static TagKey SPORELING_BIOMES = 44 | TagKey.create( 45 | Registries.BIOME, 46 | ResourceLocation.fromNamespaceAndPath(MobsOfMythology.MOD_ID, "sporelings_spawn_in")); 47 | } 48 | -------------------------------------------------------------------------------- /common/src/main/resources/data/mobs_of_mythology/loot_table/entities/chupacabra.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "minecraft:entity", 3 | "pools": [ 4 | { 5 | "bonus_rolls": 0.0, 6 | "entries": [ 7 | { 8 | "type": "minecraft:item", 9 | "functions": [ 10 | { 11 | "add": false, 12 | "count": { 13 | "type": "minecraft:uniform", 14 | "max": 3.0, 15 | "min": 1.0 16 | }, 17 | "function": "minecraft:set_count" 18 | }, 19 | { 20 | "conditions": [ 21 | { 22 | "condition": "minecraft:any_of", 23 | "terms": [ 24 | { 25 | "condition": "minecraft:entity_properties", 26 | "entity": "this", 27 | "predicate": { 28 | "flags": { 29 | "is_on_fire": true 30 | } 31 | } 32 | }, 33 | { 34 | "condition": "minecraft:entity_properties", 35 | "entity": "direct_attacker", 36 | "predicate": { 37 | "equipment": { 38 | "mainhand": { 39 | "predicates": { 40 | "minecraft:enchantments": [ 41 | { 42 | "enchantments": "#minecraft:smelts_loot" 43 | } 44 | ] 45 | } 46 | } 47 | } 48 | } 49 | } 50 | ] 51 | } 52 | ], 53 | "function": "minecraft:furnace_smelt" 54 | }, 55 | { 56 | "count": { 57 | "type": "minecraft:uniform", 58 | "max": 1.0, 59 | "min": 0.0 60 | }, 61 | "enchantment": "minecraft:looting", 62 | "function": "minecraft:enchanted_count_increase" 63 | } 64 | ], 65 | "name": "mobs_of_mythology:chupacabra_meat" 66 | } 67 | ], 68 | "rolls": 1.0 69 | } 70 | ], 71 | "random_sequence": "mobs_of_mythology:entities/chupacabra" 72 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/models/item/kobold_spear.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "parent": "minecraft:item/handheld", 4 | "textures": { 5 | "layer0": "mobs_of_mythology:item/kobold_spear", 6 | "particle": "mobs_of_mythology:item/kobold_spear" 7 | }, 8 | "display": { 9 | "thirdperson_righthand": { 10 | "rotation": [ 11 | 0, 12 | -90, 13 | 55 14 | ], 15 | "translation": [ 16 | 0, 17 | 9.75, 18 | -0.5 19 | ], 20 | "scale": [ 21 | 1.6, 22 | 1.6, 23 | 0.8 24 | ] 25 | }, 26 | "thirdperson_lefthand": { 27 | "rotation": [ 28 | 0, 29 | -90, 30 | -45 31 | ], 32 | "translation": [ 33 | 0, 34 | 9.75, 35 | 0.5 36 | ], 37 | "scale": [ 38 | 1.6, 39 | 1.6, 40 | 0.8 41 | ] 42 | }, 43 | "firstperson_righthand": { 44 | "rotation": [ 45 | 0, 46 | -90, 47 | 25 48 | ], 49 | "translation": [ 50 | 1.13, 51 | 9.2, 52 | 1.13 53 | ], 54 | "scale": [ 55 | 1.5, 56 | 1.5, 57 | 0.75 58 | ] 59 | }, 60 | "firstperson_lefthand": { 61 | "rotation": [ 62 | 0, 63 | -90, 64 | -65 65 | ], 66 | "translation": [ 67 | 1.13, 68 | 9.2, 69 | 1.13 70 | ], 71 | "scale": [ 72 | 1.5, 73 | 1.5, 74 | 0.75 75 | ] 76 | }, 77 | "ground": { 78 | "translation": [ 79 | 0, 80 | 4.75, 81 | 0 82 | ], 83 | "scale": [ 84 | 1, 85 | 1, 86 | 0.5 87 | ] 88 | }, 89 | "head": { 90 | "rotation": [ 91 | 0, 92 | 0, 93 | -88.75 94 | ], 95 | "translation": [ 96 | -1.25, 97 | -12.25, 98 | 3.75 99 | ] 100 | }, 101 | "fixed": { 102 | "rotation": [ 103 | 0, 104 | 180, 105 | 0 106 | ], 107 | "translation": [ 108 | -5.25, 109 | 5, 110 | -1 111 | ], 112 | "scale": [ 113 | 4, 114 | 4, 115 | 2 116 | ] 117 | }, 118 | "gui": { 119 | "translation": [ 120 | 2.75, 121 | 2.75, 122 | 2 123 | ], 124 | "scale": [ 125 | 1.33, 126 | 1.33, 127 | 1.34 128 | ] 129 | } 130 | } 131 | } -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/mobs/AbstractKoboldEntity.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.mobs; 2 | 3 | import net.minecraft.core.BlockPos; 4 | import net.minecraft.nbt.CompoundTag; 5 | import net.minecraft.network.syncher.EntityDataAccessor; 6 | import net.minecraft.network.syncher.EntityDataSerializers; 7 | import net.minecraft.network.syncher.SynchedEntityData; 8 | import net.minecraft.sounds.SoundEvent; 9 | import net.minecraft.sounds.SoundEvents; 10 | import net.minecraft.world.damagesource.DamageSource; 11 | import net.minecraft.world.entity.EntityType; 12 | import net.minecraft.world.entity.monster.Enemy; 13 | import net.minecraft.world.entity.monster.Monster; 14 | import net.minecraft.world.level.Level; 15 | import net.minecraft.world.level.block.state.BlockState; 16 | import net.pixeldreamstudios.mobs_of_mythology.entity.AbstractMythMonsterEntity; 17 | 18 | public abstract class AbstractKoboldEntity extends AbstractMythMonsterEntity implements Enemy { 19 | protected static final EntityDataAccessor DATA_ID_TYPE_VARIANT = 20 | SynchedEntityData.defineId(AbstractKoboldEntity.class, EntityDataSerializers.INT); 21 | 22 | protected AbstractKoboldEntity(EntityType entityType, Level level, int XP) { 23 | super(entityType, level); 24 | this.xpReward = XP; 25 | } 26 | 27 | @Override 28 | protected void defineSynchedData(SynchedEntityData.Builder builder) { 29 | super.defineSynchedData(builder); 30 | builder.define(DATA_ID_TYPE_VARIANT, 0); 31 | } 32 | 33 | protected int getTypeVariant() { 34 | return this.entityData.get(DATA_ID_TYPE_VARIANT); 35 | } 36 | 37 | protected abstract T getVariant(); 38 | 39 | @Override 40 | public void addAdditionalSaveData(CompoundTag nbt) { 41 | super.addAdditionalSaveData(nbt); 42 | nbt.putInt("Variant", this.getTypeVariant()); 43 | } 44 | 45 | @Override 46 | public void readAdditionalSaveData(CompoundTag nbt) { 47 | super.readAdditionalSaveData(nbt); 48 | this.entityData.set(DATA_ID_TYPE_VARIANT, nbt.getInt("Variant")); 49 | } 50 | 51 | @Override 52 | protected SoundEvent getAmbientSound() { 53 | this.playSound(SoundEvents.VINDICATOR_AMBIENT, 1.0f, 1.75f); 54 | return null; 55 | } 56 | 57 | @Override 58 | protected SoundEvent getHurtSound(DamageSource source) { 59 | this.playSound(SoundEvents.VINDICATOR_HURT, 1.0f, 1.75f); 60 | return null; 61 | } 62 | 63 | @Override 64 | protected SoundEvent getDeathSound() { 65 | this.playSound(SoundEvents.VINDICATOR_DEATH, 1.0f, 1.75f); 66 | return null; 67 | } 68 | 69 | @Override 70 | protected void playStepSound(BlockPos pos, BlockState state) { 71 | this.playSound(SoundEvents.WOLF_STEP, 1.0f, 1.75f); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/registry/BlockRegistry.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.registry; 2 | 3 | import dev.architectury.registry.registries.DeferredRegister; 4 | import dev.architectury.registry.registries.RegistrySupplier; 5 | import net.minecraft.core.registries.Registries; 6 | import net.minecraft.world.item.BlockItem; 7 | import net.minecraft.world.item.Item; 8 | import net.minecraft.world.level.block.Block; 9 | import net.minecraft.world.level.block.RotatedPillarBlock; 10 | import net.minecraft.world.level.block.SoundType; 11 | import net.minecraft.world.level.block.state.BlockBehaviour; 12 | import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; 13 | import net.minecraft.world.level.material.MapColor; 14 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 15 | 16 | public class BlockRegistry { 17 | public static final DeferredRegister BLOCKS = 18 | DeferredRegister.create(MobsOfMythology.MOD_ID, Registries.BLOCK); 19 | public static final DeferredRegister BLOCK_ITEMS = 20 | DeferredRegister.create(MobsOfMythology.MOD_ID, Registries.ITEM); 21 | 22 | public static final RegistrySupplier BRONZE_BLOCK = 23 | BLOCKS.register( 24 | "bronze_block", 25 | () -> 26 | new Block( 27 | BlockBehaviour.Properties.of() 28 | .mapColor(MapColor.METAL) 29 | .instrument(NoteBlockInstrument.BASS) 30 | .requiresCorrectToolForDrops() 31 | .strength(6.0F, 6.0F) 32 | .sound(SoundType.METAL))); 33 | public static final RegistrySupplier BRONZE_BLOCK_ITEM = 34 | BLOCK_ITEMS.register( 35 | BRONZE_BLOCK.getId(), 36 | () -> 37 | new BlockItem( 38 | BRONZE_BLOCK.get(), 39 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 40 | 41 | public static final RegistrySupplier CUT_BRONZE_BLOCK = 42 | BLOCKS.register( 43 | "cut_bronze_block", 44 | () -> 45 | new RotatedPillarBlock( 46 | BlockBehaviour.Properties.of() 47 | .mapColor(MapColor.METAL) 48 | .instrument(NoteBlockInstrument.BASS) 49 | .requiresCorrectToolForDrops() 50 | .strength(6.0F, 6.0F) 51 | .sound(SoundType.METAL))); 52 | public static final RegistrySupplier CUT_BRONZE_BLOCK_ITEM = 53 | BLOCK_ITEMS.register( 54 | CUT_BRONZE_BLOCK.getId(), 55 | () -> 56 | new BlockItem( 57 | CUT_BRONZE_BLOCK.get(), 58 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 59 | 60 | public static void init() { 61 | BLOCKS.register(); 62 | BLOCK_ITEMS.register(); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/mixin/CarvedPumpkinBlockMixin.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.mixin; 2 | 3 | import java.util.function.Predicate; 4 | import net.minecraft.core.BlockPos; 5 | import net.minecraft.world.entity.Entity; 6 | import net.minecraft.world.level.Level; 7 | import net.minecraft.world.level.block.CarvedPumpkinBlock; 8 | import net.minecraft.world.level.block.state.BlockState; 9 | import net.minecraft.world.level.block.state.pattern.BlockInWorld; 10 | import net.minecraft.world.level.block.state.pattern.BlockPattern; 11 | import net.minecraft.world.level.block.state.pattern.BlockPatternBuilder; 12 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.AutomatonEntity; 13 | import net.pixeldreamstudios.mobs_of_mythology.registry.EntityRegistry; 14 | import net.pixeldreamstudios.mobs_of_mythology.registry.TagRegistry; 15 | import org.spongepowered.asm.mixin.Final; 16 | import org.spongepowered.asm.mixin.Mixin; 17 | import org.spongepowered.asm.mixin.Shadow; 18 | import org.spongepowered.asm.mixin.injection.At; 19 | import org.spongepowered.asm.mixin.injection.Inject; 20 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 21 | 22 | @Mixin(CarvedPumpkinBlock.class) 23 | public class CarvedPumpkinBlockMixin { 24 | @Shadow @Final private static Predicate PUMPKINS_PREDICATE; 25 | private BlockPattern automatonFull; 26 | 27 | @Shadow 28 | private static void spawnGolemInWorld( 29 | Level level, 30 | BlockPattern.BlockPatternMatch blockPatternMatch, 31 | Entity entity, 32 | BlockPos blockPos) {} 33 | 34 | private BlockPattern getOrCreateAutomatonFull() { 35 | if (this.automatonFull == null) { 36 | this.automatonFull = 37 | BlockPatternBuilder.start() 38 | .aisle("~^~", "###", "~#~") 39 | .where('^', BlockInWorld.hasState(PUMPKINS_PREDICATE)) 40 | .where( 41 | '#', 42 | BlockInWorld.hasState(blockState -> blockState.is(TagRegistry.BRONZE_BLOCKS))) 43 | .where('~', (blockInWorld) -> blockInWorld.getState().isAir()) 44 | .build(); 45 | } 46 | return this.automatonFull; 47 | } 48 | 49 | @Inject( 50 | at = @At("TAIL"), 51 | method = 52 | "Lnet/minecraft/world/level/block/CarvedPumpkinBlock;trySpawnGolem(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V") 53 | private void checkAutomatonSpawn(Level level, BlockPos blockPos, CallbackInfo ci) { 54 | AutomatonEntity automatonEntity = EntityRegistry.AUTOMATON.get().create(level); 55 | BlockPattern.BlockPatternMatch blockPatternMatch3 = 56 | this.getOrCreateAutomatonFull().find(level, blockPos); 57 | if (blockPatternMatch3 != null) { 58 | spawnGolemInWorld( 59 | level, 60 | blockPatternMatch3, 61 | automatonEntity, 62 | blockPatternMatch3.getBlock(1, 2, 0).getPos()); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | @rem This is normally unused 30 | set APP_BASE_NAME=%~n0 31 | set APP_HOME=%DIRNAME% 32 | 33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 35 | 36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 38 | 39 | @rem Find java.exe 40 | if defined JAVA_HOME goto findJavaFromJavaHome 41 | 42 | set JAVA_EXE=java.exe 43 | %JAVA_EXE% -version >NUL 2>&1 44 | if %ERRORLEVEL% equ 0 goto execute 45 | 46 | echo. 1>&2 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 48 | echo. 1>&2 49 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 50 | echo location of your Java installation. 1>&2 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto execute 59 | 60 | echo. 1>&2 61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 62 | echo. 1>&2 63 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 64 | echo location of your Java installation. 1>&2 65 | 66 | goto fail 67 | 68 | :execute 69 | @rem Setup the command line 70 | 71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 72 | 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if %ERRORLEVEL% equ 0 goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | set EXIT_CODE=%ERRORLEVEL% 85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 87 | exit /b %EXIT_CODE% 88 | 89 | :mainEnd 90 | if "%OS%"=="Windows_NT" endlocal 91 | 92 | :omega 93 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/lang/de_de.json: -------------------------------------------------------------------------------- 1 | { 2 | "category.mobs_of_mythology": "Mythische Mobs", 3 | "advancements.mobs_of_mythology.title": "Mythische Mobs", 4 | "advancements.mobs_of_mythology.description": "Eine mythische Welt!", 5 | "entity.mobs_of_mythology.automaton": "Automat", 6 | "entity.mobs_of_mythology.kobold": "Kobold", 7 | "entity.mobs_of_mythology.kobold_warrior": "Kobold Krieger", 8 | "entity.mobs_of_mythology.chupacabra": "Chupacabra", 9 | "entity.mobs_of_mythology.drake": "Drake", 10 | "entity.mobs_of_mythology.sporeling": "Sporenling", 11 | "item.mobs_of_mythology.automaton_spawn_egg": "Automat Spawn Ei", 12 | "item.mobs_of_mythology.kobold_spawn_egg": "Kobold Spawn Ei", 13 | "item.mobs_of_mythology.kobold_warrior_spawn_egg": "Kobold Krieger Spawn Ei", 14 | "item.mobs_of_mythology.chupacabra_spawn_egg": "Chupacabra Spawn Ei", 15 | "item.mobs_of_mythology.wendigo_spawn_egg": "Wendigo Spawn Ei", 16 | "item.mobs_of_mythology.drake_spawn_egg": "Drake Spawn Ei", 17 | "item.mobs_of_mythology.sporeling_spawn_egg": "Sporenling Spawn Ei", 18 | "item.mobs_of_mythology.automaton_head": "Automat Kopf", 19 | "item.mobs_of_mythology.kobold_spear": "Kobold Speer", 20 | "item.mobs_of_mythology.bronze_ingot": "Bronze Barren", 21 | "item.mobs_of_mythology.chupacabra_meat": "Rohes Chupacabra Fleisch", 22 | "item.mobs_of_mythology.cooked_chupacabra_meat": "Chupacabra Spies", 23 | "item.mobs_of_mythology.gear": "Automaton Ausrüstung", 24 | "block.mobs_of_mythology.bronze_block": "Bronze Block", 25 | "block.mobs_of_mythology.cut_bronze_block": "Geschnittener Bronze Block", 26 | "config.screen.mobs_of_mythology": "Mythische Mobs Optionen", 27 | "config.mobs_of_mythology.option.automatonHealth": "Automat Leben", 28 | "config.mobs_of_mythology.option.automatonAttackDamage": "Automat Angriffsschaden", 29 | "config.mobs_of_mythology.option.chupacabraHealth": "Chupacabra Leben", 30 | "config.mobs_of_mythology.option.chupacabraAttackDamage": "Chupacabra Angriffsschaden", 31 | "config.mobs_of_mythology.option.chupacabraSpawnWeight": "Chupacabra Spawn Gewicht", 32 | "config.mobs_of_mythology.option.koboldHealth": "Kobold Leben", 33 | "config.mobs_of_mythology.option.koboldAttackDamage": "Kobold Angriffsschaden", 34 | "config.mobs_of_mythology.option.koboldFleeSpeedMod": "Kobold Fluchtgeschwindigkeit Modifikator", 35 | "config.mobs_of_mythology.option.koboldSpawnWeight": "Kobold Spawn Gewicht", 36 | "config.mobs_of_mythology.option.koboldWarriorHealth": "Kobold Krieger Leben", 37 | "config.mobs_of_mythology.option.koboldWarriorAttackDamage": "Kobold Krieger Angriffsschaden", 38 | "config.mobs_of_mythology.option.koboldWarriorArmor": "Kobold Krieger Rüstung", 39 | "config.mobs_of_mythology.option.koboldWarriorSpawnWeight": "Kobold Krieger Spawn Gewicht", 40 | "config.mobs_of_mythology.option.drakeHealth": "Drake Leben", 41 | "config.mobs_of_mythology.option.drakeAttackDamage": "Drake Angriffsschaden", 42 | "config.mobs_of_mythology.option.drakeSpawnWeight": "Drake Spawn Gewicht", 43 | "config.mobs_of_mythology.option.sporelingHealth": "Sporenling Leben", 44 | "config.mobs_of_mythology.option.redSporelingLines": "Roter Sporenling Linien", 45 | "config.mobs_of_mythology.option.brownSporelingLines": "Brauner Sporenling Linien", 46 | "config.mobs_of_mythology.option.sporelingSpawnWeight": "Sporenling Spawn Gewicht" 47 | } 48 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/lang/uk_ua.json: -------------------------------------------------------------------------------- 1 | { 2 | "category.mobs_of_mythology": "Мітичні моби", 3 | "advancements.mobs_of_mythology.title": "Мітичні моби", 4 | "advancements.mobs_of_mythology.description": "Мітичний світ!", 5 | "entity.mobs_of_mythology.automaton": "Автоматон", 6 | "entity.mobs_of_mythology.kobold": "Кобольд", 7 | "entity.mobs_of_mythology.kobold_warrior": "Воїн-кобольд", 8 | "entity.mobs_of_mythology.chupacabra": "Чупакабра", 9 | "entity.mobs_of_mythology.drake": "Дракончик", 10 | "entity.mobs_of_mythology.sporeling": "Споровичок", 11 | "item.mobs_of_mythology.automaton_spawn_egg": "Яйце виклику автоматона", 12 | "item.mobs_of_mythology.kobold_spawn_egg": "Яйце виклику кобольда", 13 | "item.mobs_of_mythology.kobold_warrior_spawn_egg": "Яйце виклику воїна-кобольда", 14 | "item.mobs_of_mythology.chupacabra_spawn_egg": "Яйце виклику чупакабри", 15 | "item.mobs_of_mythology.wendigo_spawn_egg": "Яйце виклику вендиго", 16 | "item.mobs_of_mythology.drake_spawn_egg": "Яйце виклику дракончика", 17 | "item.mobs_of_mythology.sporeling_spawn_egg": "Яйце виклику споровичка", 18 | "item.mobs_of_mythology.automaton_head": "Голова автоматона", 19 | "item.mobs_of_mythology.kobold_spear": "Спис кобольда", 20 | "item.mobs_of_mythology.bronze_ingot": "Бронзовий злиток", 21 | "item.mobs_of_mythology.chupacabra_meat": "Сире м'ясо чупакабри", 22 | "item.mobs_of_mythology.cooked_chupacabra_meat": "М'ясо на шампурі з чупакабри", 23 | "item.mobs_of_mythology.gear": "Шестерня автоматона", 24 | "block.mobs_of_mythology.bronze_block": "Бронзовий блок", 25 | "block.mobs_of_mythology.cut_bronze_block": "Тесаний бронзовий блок", 26 | "config.screen.mobs_of_mythology": "Параметри мітичних моб", 27 | "config.mobs_of_mythology.option.automatonHealth": "Здоров'я автоматона", 28 | "config.mobs_of_mythology.option.automatonAttackDamage": "Шкода від атаки автоматона", 29 | "config.mobs_of_mythology.option.chupacabraHealth": "Здоров'я чупакабри", 30 | "config.mobs_of_mythology.option.chupacabraAttackDamage": "Шкода від атаки чупакабри", 31 | "config.mobs_of_mythology.option.chupacabraSpawnWeight": "Вага появи чупакабри", 32 | "config.mobs_of_mythology.option.koboldHealth": "Здоров'я кобольда", 33 | "config.mobs_of_mythology.option.koboldAttackDamage": "Шкода від атаки кобольда", 34 | "config.mobs_of_mythology.option.koboldFleeSpeedMod": "Модифікатор швидкості втечі кобольда", 35 | "config.mobs_of_mythology.option.koboldSpawnWeight": "Вага появи кобольда", 36 | "config.mobs_of_mythology.option.koboldWarriorHealth": "Здоров'я воїна-кобольда", 37 | "config.mobs_of_mythology.option.koboldWarriorAttackDamage": "Шкода від атаки воїна-кобольда", 38 | "config.mobs_of_mythology.option.koboldWarriorArmor": "Броня воїна-кобольда", 39 | "config.mobs_of_mythology.option.koboldWarriorSpawnWeight": "Вага появи воїна-кобольда", 40 | "config.mobs_of_mythology.option.drakeHealth": "Здоров'я дракончика", 41 | "config.mobs_of_mythology.option.drakeAttackDamage": "Шкода від атаки дракончика", 42 | "config.mobs_of_mythology.option.drakeSpawnWeight": "Вага появи дракончика", 43 | "config.mobs_of_mythology.option.sporelingHealth": "Здоров'я споровичка", 44 | "config.mobs_of_mythology.option.redSporelingLines": "Червоні лінії від споровичка", 45 | "config.mobs_of_mythology.option.brownSporelingLines": "Коричневі лінії від споровичка", 46 | "config.mobs_of_mythology.option.sporelingSpawnWeight": "Вага появи споровичка" 47 | } 48 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/lang/vi_vn.json: -------------------------------------------------------------------------------- 1 | { 2 | "category.mobs_of_mythology": "Mobs of Mythology", 3 | "advancements.mobs_of_mythology.title": "Mobs of Mythology", 4 | "advancements.mobs_of_mythology.description": "Một thế giới thần thoại!", 5 | "entity.mobs_of_mythology.automaton": "Máy tự động", 6 | "entity.mobs_of_mythology.kobold": "Kobold", 7 | "entity.mobs_of_mythology.kobold_warrior": "Chiến binh Kobold", 8 | "entity.mobs_of_mythology.chupacabra": "Quỷ hút máu dê", 9 | "entity.mobs_of_mythology.drake": "Drake", 10 | "entity.mobs_of_mythology.sporeling": "Bào tử con", 11 | "item.mobs_of_mythology.automaton_spawn_egg": "Trứng máy tự động", 12 | "item.mobs_of_mythology.kobold_spawn_egg": "Trứng Kobold", 13 | "item.mobs_of_mythology.kobold_warrior_spawn_egg": "Trứng chiến binh Kobold", 14 | "item.mobs_of_mythology.chupacabra_spawn_egg": "Trứng Quỷ hút máu dê", 15 | "item.mobs_of_mythology.wendigo_spawn_egg": "Trứng Wendigo", 16 | "item.mobs_of_mythology.drake_spawn_egg": "Trứng Drake", 17 | "item.mobs_of_mythology.sporeling_spawn_egg": "Trứng Bào tử con", 18 | "item.mobs_of_mythology.automaton_head": "Đầu máy tự động", 19 | "item.mobs_of_mythology.kobold_spear": "Giáo Kobold", 20 | "item.mobs_of_mythology.bronze_ingot": "Thỏi đồng", 21 | "item.mobs_of_mythology.chupacabra_meat": "Thịt Quỷ hút máu dê sống", 22 | "item.mobs_of_mythology.cooked_chupacabra_meat": "Thịt Quỷ hút máu dê nướng xiên", 23 | "item.mobs_of_mythology.gear": "Bánh răng máy tự động", 24 | "block.mobs_of_mythology.bronze_block": "Khối Đồng", 25 | "block.mobs_of_mythology.cut_bronze_block": "Khối Đồng cắt", 26 | "config.screen.mobs_of_mythology": "Tùy chọn Mobs of Mythology", 27 | "config.mobs_of_mythology.option.automatonHealth": "Máu của máy tự động", 28 | "config.mobs_of_mythology.option.automatonAttackDamage": "Sát thương của máy tự động", 29 | "config.mobs_of_mythology.option.chupacabraHealth": "Máu của Quỷ hút máu dê", 30 | "config.mobs_of_mythology.option.chupacabraAttackDamage": "Sát thương của Quỷ hút máu dê", 31 | "config.mobs_of_mythology.option.chupacabraSpawnWeight": "Tần suất xuất hiện của Quỷ hút máu dê", 32 | "config.mobs_of_mythology.option.koboldHealth": "Máu của Kobold", 33 | "config.mobs_of_mythology.option.koboldAttackDamage": "Sát thương của Kobold", 34 | "config.mobs_of_mythology.option.koboldFleeSpeedMod": "Tốc độ chạy trốn của Kobold", 35 | "config.mobs_of_mythology.option.koboldSpawnWeight": "Tần suất xuất hiện của Kobold", 36 | "config.mobs_of_mythology.option.koboldWarriorHealth": "Máu của chiến binh Kobold", 37 | "config.mobs_of_mythology.option.koboldWarriorAttackDamage": "Sát thương của chiến binh Kobold", 38 | "config.mobs_of_mythology.option.koboldWarriorArmor": "Giáp của chiến binh Kobold", 39 | "config.mobs_of_mythology.option.koboldWarriorSpawnWeight": "Tần suất xuất hiện của chiến binh Kobold", 40 | "config.mobs_of_mythology.option.drakeHealth": "Máu của Drake", 41 | "config.mobs_of_mythology.option.drakeAttackDamage": "Sát thương của Drake", 42 | "config.mobs_of_mythology.option.drakeSpawnWeight": "Tần suất xuất hiện của Drake", 43 | "config.mobs_of_mythology.option.sporelingHealth": "Máu của Bào tử con", 44 | "config.mobs_of_mythology.option.redSporelingLines": "Vân đỏ từ Bào tử con", 45 | "config.mobs_of_mythology.option.brownSporelingLines": "Vân nâu từ Bào tử con", 46 | "config.mobs_of_mythology.option.sporelingSpawnWeight": "Tần suất xuất hiện của Bào tử con" 47 | } 48 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/lang/el_gr.json: -------------------------------------------------------------------------------- 1 | { 2 | "category.mobs_of_mythology": "Mobs of Mythology", 3 | "advancements.mobs_of_mythology.title": "Mobs of Mythology", 4 | "advancements.mobs_of_mythology.description": "Ένας μυθικός κόσμος!", 5 | "entity.mobs_of_mythology.automaton": "Ρομπότ", 6 | "entity.mobs_of_mythology.kobold": "Καλικάντζαρος", 7 | "entity.mobs_of_mythology.kobold_warrior": "Καλικάντζαρος Πολεμιστής", 8 | "entity.mobs_of_mythology.chupacabra": "Τσουπακαμπρά", 9 | "entity.mobs_of_mythology.drake": "Δράκος", 10 | "entity.mobs_of_mythology.sporeling": "Σπορίδιο", 11 | "item.mobs_of_mythology.automaton_spawn_egg": "Αυγό Γέννησης Ρομπότ", 12 | "item.mobs_of_mythology.kobold_spawn_egg": "Αυγό Γέννησης Καλικάντζαρου", 13 | "item.mobs_of_mythology.kobold_warrior_spawn_egg": "Αυγό Γέννησης Καλικάντζαρου Πολεμιστή", 14 | "item.mobs_of_mythology.chupacabra_spawn_egg": "Αυγό Γέννησης Τσουπακάμπρα", 15 | "item.mobs_of_mythology.wendigo_spawn_egg": "Αυγό Γέννησης Γουέντιγκο", 16 | "item.mobs_of_mythology.drake_spawn_egg": "Αυγό Γέννησης Δράκου", 17 | "item.mobs_of_mythology.sporeling_spawn_egg": "Αυγό Γέννησης Σπορίδιου", 18 | "item.mobs_of_mythology.automaton_head": "Κεφάλι Ρομπότ", 19 | "item.mobs_of_mythology.kobold_spear": "Ακόντιο Καλικάντζαρου", 20 | "item.mobs_of_mythology.bronze_ingot": "Ράβδος Ορείχαλκου", 21 | "item.mobs_of_mythology.chupacabra_meat": "Ωμό Κρέας Τσουπακάμπρα", 22 | "item.mobs_of_mythology.cooked_chupacabra_meat": "Σουβλάκι Τσουπακάμπρα", 23 | "item.mobs_of_mythology.gear": "Γρανάζι Ρομπότ", 24 | "block.mobs_of_mythology.bronze_block": "Κύβος Ορείχαλκου", 25 | "block.mobs_of_mythology.cut_bronze_block": "Κομμένος Ορείχαλκος", 26 | "config.screen.mobs_of_mythology": "Ρυθμίσεις Mobs of Mythology", 27 | "config.mobs_of_mythology.option.automatonHealth": "Ζωή Αυτόματου", 28 | "config.mobs_of_mythology.option.automatonAttackDamage": "Δύναμη Αυτόματου", 29 | "config.mobs_of_mythology.option.chupacabraHealth": "Ζωή Τσουπακάμπρα", 30 | "config.mobs_of_mythology.option.chupacabraAttackDamage": "Δύναμη Τσουπακάμπρα", 31 | "config.mobs_of_mythology.option.chupacabraSpawnWeight": "Ρυθμός Γέννησης Τσουπακάμπρα", 32 | "config.mobs_of_mythology.option.koboldHealth": "Ζωή Καλικάντζαρου", 33 | "config.mobs_of_mythology.option.koboldAttackDamage": "Δύναμη Καλικάντζαρου", 34 | "config.mobs_of_mythology.option.koboldFleeSpeedMod": "Τροποποιητής Ταχύτητας Διαφυγής Καλικάντζαρου", 35 | "config.mobs_of_mythology.option.koboldSpawnWeight": "Ρυθμός Γέννησης Καλικάντζαρου", 36 | "config.mobs_of_mythology.option.koboldWarriorHealth": "Ζωή Καλικάντζαρου Πολεμιστή", 37 | "config.mobs_of_mythology.option.koboldWarriorAttackDamage": "Δύναμη Καλικάντζαρου Πολεμιστή", 38 | "config.mobs_of_mythology.option.koboldWarriorArmor": "Αντίσταση Καλικάντζαρου Πολεμιστή", 39 | "config.mobs_of_mythology.option.koboldWarriorSpawnWeight": "Ρυθμός Γέννησης Καλικάντζαρου Πολεμιστή", 40 | "config.mobs_of_mythology.option.drakeHealth": "Ζωή Δράκου", 41 | "config.mobs_of_mythology.option.drakeAttackDamage": "Δύναμη Δράκου", 42 | "config.mobs_of_mythology.option.drakeSpawnWeight": "Ρυθμός Γέννησης Δράκου", 43 | "config.mobs_of_mythology.option.sporelingHealth": "Ζωή Σπορίδιου", 44 | "config.mobs_of_mythology.option.redSporelingLines": "Λόγια Κόκκινου Σπορίδιου", 45 | "config.mobs_of_mythology.option.brownSporelingLines": "Λόγια Καφέ Σπορίδιου", 46 | "config.mobs_of_mythology.option.sporelingSpawnWeight": "Ρυθμός Γέννησης Σπορίδιου" 47 | } 48 | -------------------------------------------------------------------------------- /neoforge/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.github.johnrengelman.shadow' 3 | id "me.shedaniel.unified-publishing" 4 | } 5 | 6 | architectury { 7 | platformSetupLoomIde() 8 | neoForge() 9 | } 10 | 11 | configurations { 12 | common { 13 | canBeResolved = true 14 | canBeConsumed = false 15 | } 16 | compileClasspath.extendsFrom common 17 | runtimeClasspath.extendsFrom common 18 | developmentNeoForge.extendsFrom common 19 | 20 | // Files in this configuration will be bundled into your mod using the Shadow plugin. 21 | // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. 22 | shadowBundle { 23 | canBeResolved = true 24 | canBeConsumed = false 25 | } 26 | } 27 | 28 | repositories { 29 | maven { url 'https://maven.neoforged.net/releases' } 30 | } 31 | 32 | dependencies { 33 | neoForge "net.neoforged:neoforge:${neoforge_version}" 34 | 35 | // Architectury API. This is optional, and you can comment it out if you don't need it. 36 | modImplementation "dev.architectury:architectury-neoforge:${architectury_api_version}" 37 | 38 | common(project(path: ':common', configuration: 'namedElements')) { transitive false } 39 | shadowBundle project(path: ':common', configuration: 'transformProductionNeoForge') 40 | 41 | implementation "mod.azure.azurelib:azurelib-neo-${minecraft_version}:${azurelib_version}" 42 | implementation "net.tslat.smartbrainlib:SmartBrainLib-neoforge-${minecraft_version}:${sbl_version}" 43 | } 44 | 45 | processResources { 46 | inputs.property 'version', project.version 47 | 48 | filesMatching('META-INF/neoforge.mods.toml') { 49 | expand version: project.version 50 | } 51 | } 52 | 53 | shadowJar { 54 | configurations = [project.configurations.shadowBundle] 55 | archiveClassifier = 'dev-shadow' 56 | } 57 | 58 | remapJar { 59 | input.set shadowJar.archiveFile 60 | } 61 | 62 | unifiedPublishing { 63 | project { 64 | displayName = "Mobs of Mythology $project.version" 65 | gameVersions = ["${minecraft_version}"] 66 | gameLoaders = ["neoforge"] 67 | releaseType = "release" // Optional, use "release", "beta" or "alpha" 68 | changelog = rootProject.file("changelog.md").text 69 | 70 | mainPublication tasks.remapJar // Declares the publicated jar 71 | 72 | relations { 73 | depends { 74 | curseforge = "architectury-api" 75 | modrinth = "architectury-api" 76 | } 77 | depends { 78 | curseforge = "azurelib" 79 | modrinth = "azurelib" 80 | } 81 | depends { 82 | curseforge = "smartbrainlib" 83 | modrinth = "smartbrainlib" 84 | } 85 | } 86 | 87 | var cfToken = System.getenv("CURSEFORGE_TOKEN") 88 | if (cfToken != null) { 89 | curseforge { 90 | token = cfToken 91 | id = "699989" // Required, must be a string, ID of CurseForge project 92 | } 93 | } 94 | 95 | var mrToken = System.getenv("MODRINTH_TOKEN") 96 | if (mrToken != null) { 97 | modrinth { 98 | token = mrToken 99 | id = "avrKhvsK" // Required, must be a string, ID of Modrinth project 100 | } 101 | } 102 | } 103 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/lang/ru_ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "category.mobs_of_mythology": "Мистические существа", 3 | "advancements.mobs_of_mythology.title": "Мистические существа", 4 | "advancements.mobs_of_mythology.description": "Мистический мир!", 5 | "entity.mobs_of_mythology.automaton": "Автомат", 6 | "entity.mobs_of_mythology.kobold": "Кобольд", 7 | "entity.mobs_of_mythology.kobold_warrior": "Кобольд воин", 8 | "entity.mobs_of_mythology.chupacabra": "Чупакабра", 9 | "entity.mobs_of_mythology.drake": "Дракон", 10 | "entity.mobs_of_mythology.sporeling": "Молодой спорофит", 11 | "item.mobs_of_mythology.automaton_spawn_egg": "Яйцо призыва автомата", 12 | "item.mobs_of_mythology.kobold_spawn_egg": "Яйцо призыва кобольда", 13 | "item.mobs_of_mythology.kobold_warrior_spawn_egg": "Яйцо призыва кобольда воина", 14 | "item.mobs_of_mythology.chupacabra_spawn_egg": "Яйцо призыва чупакабры", 15 | "item.mobs_of_mythology.wendigo_spawn_egg": "Яйцо призыва вендиго", 16 | "item.mobs_of_mythology.drake_spawn_egg": "Яйцо призыва дракона", 17 | "item.mobs_of_mythology.sporeling_spawn_egg": "Яйцо призыва молодого спорофита", 18 | "item.mobs_of_mythology.automaton_head": "Голова автомата", 19 | "item.mobs_of_mythology.kobold_spear": "Копьё кобольда", 20 | "item.mobs_of_mythology.bronze_ingot": "Бронзовый слиток", 21 | "item.mobs_of_mythology.chupacabra_meat": "Сырое мясо чупакабры", 22 | "item.mobs_of_mythology.cooked_chupacabra_meat": "Мясо на шампуре из чупакабры", 23 | "item.mobs_of_mythology.gear": "Шестерёнка автомата", 24 | "block.mobs_of_mythology.bronze_block": "Бронзовый блок", 25 | "block.mobs_of_mythology.cut_bronze_block": "Резной бронзовый блок", 26 | "config.screen.mobs_of_mythology": "Настройки Mobs of Mythology", 27 | "config.mobs_of_mythology.option.automatonHealth": "Здоровье автомата", 28 | "config.mobs_of_mythology.option.automatonAttackDamage": "Урон от атаки автомата", 29 | "config.mobs_of_mythology.option.chupacabraHealth": "Здоровье чупакабры", 30 | "config.mobs_of_mythology.option.chupacabraAttackDamage": "Урон от атаки чупакабры", 31 | "config.mobs_of_mythology.option.chupacabraSpawnWeight": "Весовое значение появления чупакабры", 32 | "config.mobs_of_mythology.option.koboldHealth": "Здоровье кобольда", 33 | "config.mobs_of_mythology.option.koboldAttackDamage": "Урон от атаки кобольда", 34 | "config.mobs_of_mythology.option.koboldFleeSpeedMod": "Модификатор скорости бегства кобольда", 35 | "config.mobs_of_mythology.option.koboldSpawnWeight": "Весовое значение появления кобольда", 36 | "config.mobs_of_mythology.option.koboldWarriorHealth": "Здоровье кобольда воина", 37 | "config.mobs_of_mythology.option.koboldWarriorAttackDamage": "Урон от атаки кобольда воина", 38 | "config.mobs_of_mythology.option.koboldWarriorArmor": "Броня кобольда воина", 39 | "config.mobs_of_mythology.option.koboldWarriorSpawnWeight": "Весовое значение появления кобольда воина", 40 | "config.mobs_of_mythology.option.drakeHealth": "Здоровье дракона", 41 | "config.mobs_of_mythology.option.drakeAttackDamage": "Урон от атаки дракона", 42 | "config.mobs_of_mythology.option.drakeSpawnWeight": "Весовое значение появления дракона", 43 | "config.mobs_of_mythology.option.sporelingHealth": "Здоровье молодого спорофита", 44 | "config.mobs_of_mythology.option.redSporelingLines": "Красные линии от молодого спорофита", 45 | "config.mobs_of_mythology.option.brownSporelingLines": "Коричневые линии от молодого спорофита", 46 | "config.mobs_of_mythology.option.sporelingSpawnWeight": "Весовое значение появления молодого спорофита" 47 | } 48 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/renderer/DrakeRenderer.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer; 2 | 3 | import com.google.common.collect.Maps; 4 | import com.mojang.blaze3d.vertex.PoseStack; 5 | import java.util.Map; 6 | import mod.azure.azurelib.common.api.client.renderer.GeoEntityRenderer; 7 | import mod.azure.azurelib.common.api.client.renderer.layer.AutoGlowingGeoLayer; 8 | import net.minecraft.Util; 9 | import net.minecraft.client.renderer.MultiBufferSource; 10 | import net.minecraft.client.renderer.entity.EntityRendererProvider; 11 | import net.minecraft.resources.ResourceLocation; 12 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 13 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.model.DrakeModel; 14 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.DrakeEntity; 15 | import net.pixeldreamstudios.mobs_of_mythology.entity.variant.DrakeVariant; 16 | 17 | public class DrakeRenderer extends GeoEntityRenderer { 18 | public static final Map LOCATION_BY_VARIANT = 19 | Util.make( 20 | Maps.newEnumMap(DrakeVariant.class), 21 | (map) -> { 22 | map.put( 23 | DrakeVariant.DRAKE_1, 24 | ResourceLocation.fromNamespaceAndPath( 25 | MobsOfMythology.MOD_ID, "textures/entity/drake/drake_1.png")); 26 | map.put( 27 | DrakeVariant.DRAKE_2, 28 | ResourceLocation.fromNamespaceAndPath( 29 | MobsOfMythology.MOD_ID, "textures/entity/drake/drake_2.png")); 30 | map.put( 31 | DrakeVariant.DRAKE_3, 32 | ResourceLocation.fromNamespaceAndPath( 33 | MobsOfMythology.MOD_ID, "textures/entity/drake/drake_3.png")); 34 | map.put( 35 | DrakeVariant.DRAKE_4, 36 | ResourceLocation.fromNamespaceAndPath( 37 | MobsOfMythology.MOD_ID, "textures/entity/drake/drake_4.png")); 38 | map.put( 39 | DrakeVariant.DRAKE_5, 40 | ResourceLocation.fromNamespaceAndPath( 41 | MobsOfMythology.MOD_ID, "textures/entity/drake/drake_5.png")); 42 | map.put( 43 | DrakeVariant.DRAKE_6, 44 | ResourceLocation.fromNamespaceAndPath( 45 | MobsOfMythology.MOD_ID, "textures/entity/drake/drake_6.png")); 46 | map.put( 47 | DrakeVariant.DRAKE_7, 48 | ResourceLocation.fromNamespaceAndPath( 49 | MobsOfMythology.MOD_ID, "textures/entity/drake/drake_7.png")); 50 | }); 51 | 52 | public DrakeRenderer(EntityRendererProvider.Context ctx) { 53 | super(ctx, new DrakeModel()); 54 | this.shadowRadius = 0.75f; 55 | addRenderLayer(new AutoGlowingGeoLayer<>(this)); 56 | } 57 | 58 | @Override 59 | public ResourceLocation getTextureLocation(DrakeEntity animatable) { 60 | return LOCATION_BY_VARIANT.get(animatable.getVariant()); 61 | } 62 | 63 | @Override 64 | public void render( 65 | DrakeEntity entity, 66 | float entityYaw, 67 | float partialTick, 68 | PoseStack poseStack, 69 | MultiBufferSource bufferSource, 70 | int packedLight) { 71 | if (entity.isBaby()) { 72 | poseStack.scale(0.5f, 0.5f, 0.5f); 73 | } else { 74 | poseStack.scale(1f, 1f, 1f); 75 | } 76 | super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/lang/zh_cn.json: -------------------------------------------------------------------------------- 1 | { 2 | "category.mobs_of_mythology": "神话生物", 3 | "advancements.mobs_of_mythology.title": "神话生物", 4 | "advancements.mobs_of_mythology.description": "在Minecraft中发现一个充满神话生物的世界!", 5 | "advancements.mobs_of_mythology.tame_basilisk.title": "温柔的巨人", 6 | "advancements.mobs_of_mythology.tame_basilisk.description": "驯服一只致命的蛇怪", 7 | "sound.mobs_of_mythology.drake_roar": "龙兽吼叫", 8 | "sound.mobs_of_mythology.drake_death": "龙兽死亡", 9 | "sound.mobs_of_mythology.robotic_voice": "机械音", 10 | "entity.mobs_of_mythology.automaton": "自动机", 11 | "entity.mobs_of_mythology.kobold": "狗头人", 12 | "entity.mobs_of_mythology.kobold_warrior": "狗头人战士", 13 | "entity.mobs_of_mythology.chupacabra": "卓柏卡布拉", 14 | "entity.mobs_of_mythology.drake": "龙兽", 15 | "entity.mobs_of_mythology.sporeling": "孢子生物", 16 | "entity.mobs_of_mythology.basilisk": "蛇怪", 17 | "entity.mobs_of_mythology.pegasus": "天马", 18 | "item.mobs_of_mythology.automaton_spawn_egg": "自动机刷怪蛋", 19 | "item.mobs_of_mythology.kobold_spawn_egg": "狗头人刷怪蛋", 20 | "item.mobs_of_mythology.kobold_warrior_spawn_egg": "狗头人战士刷怪蛋", 21 | "item.mobs_of_mythology.chupacabra_spawn_egg": "卓柏卡布拉刷怪蛋", 22 | "item.mobs_of_mythology.wendigo_spawn_egg": "温迪戈刷怪蛋", 23 | "item.mobs_of_mythology.drake_spawn_egg": "龙兽刷怪蛋", 24 | "item.mobs_of_mythology.sporeling_spawn_egg": "孢子生物刷怪蛋", 25 | "item.mobs_of_mythology.basilisk_spawn_egg": "蛇怪刷怪蛋", 26 | "item.mobs_of_mythology.pegasus_spawn_egg": "天马刷怪蛋", 27 | "item.mobs_of_mythology.automaton_head": "自动机头颅", 28 | "item.mobs_of_mythology.basilisk_head": "蛇怪头颅", 29 | "item.mobs_of_mythology.kobold_spear": "狗头人矛", 30 | "item.mobs_of_mythology.bronze_ingot": "青铜锭", 31 | "item.mobs_of_mythology.chupacabra_meat": "卓柏卡布拉肉", 32 | "item.mobs_of_mythology.cooked_chupacabra_meat": "熟卓柏卡布拉肉", 33 | "item.mobs_of_mythology.gear": "自动机齿轮", 34 | "block.mobs_of_mythology.bronze_block": "青铜块", 35 | "block.mobs_of_mythology.cut_bronze_block": "切割青铜块", 36 | "config.screen.mobs_of_mythology": "神话生物配置", 37 | "config.mobs_of_mythology.option.automatonHealth": "自动机生命值", 38 | "config.mobs_of_mythology.option.automatonAttackDamage": "自动机攻击伤害", 39 | "config.mobs_of_mythology.option.chupacabraHealth": "卓柏卡布拉生命值", 40 | "config.mobs_of_mythology.option.chupacabraAttackDamage": "卓柏卡布拉攻击伤害", 41 | "config.mobs_of_mythology.option.chupacabraSpawnWeight": "卓柏卡布拉生成权重", 42 | "config.mobs_of_mythology.option.koboldHealth": "狗头人生命值", 43 | "config.mobs_of_mythology.option.koboldAttackDamage": "狗头人攻击伤害", 44 | "config.mobs_of_mythology.option.koboldFleeSpeedMod": "狗头人逃跑速度修正", 45 | "config.mobs_of_mythology.option.koboldSpawnWeight": "狗头人生成权重", 46 | "config.mobs_of_mythology.option.koboldWarriorHealth": "狗头人战士生命值", 47 | "config.mobs_of_mythology.option.koboldWarriorAttackDamage": "狗头人战士攻击伤害", 48 | "config.mobs_of_mythology.option.koboldWarriorArmor": "狗头人战士护甲值", 49 | "config.mobs_of_mythology.option.koboldWarriorSpawnWeight": "狗头人战士生成权重", 50 | "config.mobs_of_mythology.option.drakeHealth": "龙兽生命值", 51 | "config.mobs_of_mythology.option.drakeAttackDamage": "龙兽攻击伤害", 52 | "config.mobs_of_mythology.option.drakeSpawnWeight": "龙兽生成权重", 53 | "config.mobs_of_mythology.option.sporelingHealth": "孢子生物生命值", 54 | "config.mobs_of_mythology.option.redSporelingLines": "红色孢子生物数量", 55 | "config.mobs_of_mythology.option.brownSporelingLines": "棕色孢子生物数量", 56 | "config.mobs_of_mythology.option.sporelingSpawnWeight": "孢子生物生成权重", 57 | "config.mobs_of_mythology.option.basiliskHealth": "蛇怪生命值", 58 | "config.mobs_of_mythology.option.basiliskAttackDamage": "蛇怪攻击伤害", 59 | "config.mobs_of_mythology.option.pegasusHealth": "天马生命值" 60 | } -------------------------------------------------------------------------------- /fabric/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.github.johnrengelman.shadow' 3 | id "me.shedaniel.unified-publishing" 4 | } 5 | 6 | architectury { 7 | platformSetupLoomIde() 8 | fabric() 9 | } 10 | 11 | configurations { 12 | common { 13 | canBeResolved = true 14 | canBeConsumed = false 15 | } 16 | compileClasspath.extendsFrom common 17 | runtimeClasspath.extendsFrom common 18 | developmentFabric.extendsFrom common 19 | 20 | // Files in this configuration will be bundled into your mod using the Shadow plugin. 21 | // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. 22 | shadowBundle { 23 | canBeResolved = true 24 | canBeConsumed = false 25 | } 26 | } 27 | 28 | repositories { 29 | maven { url 'https://maven.terraformersmc.com/releases' } // Needed for Fabric only at the moment (for AzureLib) 30 | } 31 | 32 | dependencies { 33 | modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" 34 | 35 | // Fabric API. This is technically optional, but you probably want it anyway. 36 | modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}" 37 | 38 | // Architectury API. This is optional, and you can comment it out if you don't need it. 39 | modImplementation "dev.architectury:architectury-fabric:${architectury_api_version}" 40 | 41 | common(project(path: ':common', configuration: 'namedElements')) { transitive false } 42 | shadowBundle project(path: ':common', configuration: 'transformProductionFabric') 43 | 44 | modImplementation "mod.azure.azurelib:azurelib-fabric-${minecraft_version}:${azurelib_version}" 45 | modApi "com.terraformersmc:modmenu:${modmenu_version}" // Fabric bug is requiring this 46 | modImplementation "net.tslat.smartbrainlib:SmartBrainLib-fabric-${minecraft_version}:${sbl_version}" 47 | } 48 | 49 | processResources { 50 | inputs.property 'version', project.version 51 | 52 | filesMatching('fabric.mod.json') { 53 | expand version: project.version 54 | } 55 | } 56 | 57 | shadowJar { 58 | configurations = [project.configurations.shadowBundle] 59 | archiveClassifier = 'dev-shadow' 60 | } 61 | 62 | remapJar { 63 | input.set shadowJar.archiveFile 64 | } 65 | 66 | unifiedPublishing { 67 | project { 68 | displayName = "Mobs of Mythology $project.version" 69 | gameVersions = ["${minecraft_version}"] 70 | gameLoaders = ["fabric"] 71 | releaseType = "release" // Optional, use "release", "beta" or "alpha" 72 | changelog = rootProject.file("changelog.md").text 73 | 74 | mainPublication tasks.remapJar // Declares the publicated jar 75 | 76 | relations { 77 | depends { 78 | curseforge = "architectury-api" 79 | modrinth = "architectury-api" 80 | } 81 | depends { 82 | curseforge = "azurelib" 83 | modrinth = "azurelib" 84 | } 85 | depends { 86 | curseforge = "smartbrainlib" 87 | modrinth = "smartbrainlib" 88 | } 89 | } 90 | 91 | var cfToken = System.getenv("CURSEFORGE_TOKEN") 92 | if (cfToken != null) { 93 | curseforge { 94 | token = cfToken 95 | id = "699989" // Required, must be a string, ID of CurseForge project 96 | } 97 | } 98 | 99 | var mrToken = System.getenv("MODRINTH_TOKEN") 100 | if (mrToken != null) { 101 | modrinth { 102 | token = mrToken 103 | id = "avrKhvsK" // Required, must be a string, ID of Modrinth project 104 | } 105 | } 106 | } 107 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/lang/en_us.json: -------------------------------------------------------------------------------- 1 | { 2 | "category.mobs_of_mythology": "Mobs of Mythology", 3 | "advancements.mobs_of_mythology.title": "Mobs of Mythology", 4 | "advancements.mobs_of_mythology.description": "Discover a World of Mythological Creatures in Minecraft!", 5 | "advancements.mobs_of_mythology.tame_basilisk.title": "Gentle Giant", 6 | "advancements.mobs_of_mythology.tame_basilisk.description": "Tame a deadly Basilisk", 7 | "sound.mobs_of_mythology.drake_roar": "Drake roar", 8 | "sound.mobs_of_mythology.drake_death": "Drake death", 9 | "sound.mobs_of_mythology.robotic_voice": "Robotic voice", 10 | "entity.mobs_of_mythology.automaton": "Automaton", 11 | "entity.mobs_of_mythology.kobold": "Kobold", 12 | "entity.mobs_of_mythology.kobold_warrior": "Kobold Warrior", 13 | "entity.mobs_of_mythology.chupacabra": "Chupacabra", 14 | "entity.mobs_of_mythology.drake": "Drake", 15 | "entity.mobs_of_mythology.sporeling": "Sporeling", 16 | "entity.mobs_of_mythology.basilisk": "Basilisk", 17 | "entity.mobs_of_mythology.pegasus": "Pegasus", 18 | "item.mobs_of_mythology.automaton_spawn_egg": "Automaton Spawn Egg", 19 | "item.mobs_of_mythology.kobold_spawn_egg": "Kobold Spawn Egg", 20 | "item.mobs_of_mythology.kobold_warrior_spawn_egg": "Kobold Warrior Spawn Egg", 21 | "item.mobs_of_mythology.chupacabra_spawn_egg": "Chupacabra Spawn Egg", 22 | "item.mobs_of_mythology.wendigo_spawn_egg": "Wendigo Spawn Egg", 23 | "item.mobs_of_mythology.drake_spawn_egg": "Drake Spawn Egg", 24 | "item.mobs_of_mythology.sporeling_spawn_egg": "Sporeling Spawn Egg", 25 | "item.mobs_of_mythology.basilisk_spawn_egg": "Basilisk Spawn Egg", 26 | "item.mobs_of_mythology.pegasus_spawn_egg": "Pegasus Spawn Egg", 27 | "item.mobs_of_mythology.automaton_head": "Automaton Head", 28 | "item.mobs_of_mythology.basilisk_head": "Automaton Head", 29 | "item.mobs_of_mythology.kobold_spear": "Kobold Spear", 30 | "item.mobs_of_mythology.bronze_ingot": "Bronze Ingot", 31 | "item.mobs_of_mythology.chupacabra_meat": "Chupacabra Meat", 32 | "item.mobs_of_mythology.cooked_chupacabra_meat": "Cooked Chupacabra Meat", 33 | "item.mobs_of_mythology.gear": "Automaton Gear", 34 | "block.mobs_of_mythology.bronze_block": "Bronze Block", 35 | "block.mobs_of_mythology.cut_bronze_block": "Cut Bronze Block", 36 | "config.screen.mobs_of_mythology": "Mobs of Mythology Config", 37 | "config.mobs_of_mythology.option.automatonHealth": "Automaton Health", 38 | "config.mobs_of_mythology.option.automatonAttackDamage": "Automaton Attack Damage", 39 | "config.mobs_of_mythology.option.chupacabraHealth": "Chupacabra Health", 40 | "config.mobs_of_mythology.option.chupacabraAttackDamage": "Chupacabra Attack Damage", 41 | "config.mobs_of_mythology.option.chupacabraSpawnWeight": "Chupacabra Spawn Weight", 42 | "config.mobs_of_mythology.option.koboldHealth": "Kobold Health", 43 | "config.mobs_of_mythology.option.koboldAttackDamage": "Kobold Attack Damage", 44 | "config.mobs_of_mythology.option.koboldFleeSpeedMod": "Kobold Flee Speed Modifier", 45 | "config.mobs_of_mythology.option.koboldSpawnWeight": "Kobold Spawn Weight", 46 | "config.mobs_of_mythology.option.shouldKoboldsSteal": "Should Kobolds Steal", 47 | "config.mobs_of_mythology.option.koboldWarriorHealth": "Kobold Warrior Health", 48 | "config.mobs_of_mythology.option.koboldWarriorAttackDamage": "Kobold Warrior Attack Damage", 49 | "config.mobs_of_mythology.option.koboldWarriorArmor": "Kobold Warrior Armor", 50 | "config.mobs_of_mythology.option.koboldWarriorSpawnWeight": "Kobold Warrior Spawn Weight", 51 | "config.mobs_of_mythology.option.drakeHealth": "Drake Health", 52 | "config.mobs_of_mythology.option.drakeAttackDamage": "Drake Attack Damage", 53 | "config.mobs_of_mythology.option.drakeSpawnWeight": "Drake Spawn Weight", 54 | "config.mobs_of_mythology.option.sporelingHealth": "Sporeling Health", 55 | "config.mobs_of_mythology.option.redSporelingLines": "Red Sporeling Lines", 56 | "config.mobs_of_mythology.option.brownSporelingLines": "Brown Sporeling Lines", 57 | "config.mobs_of_mythology.option.sporelingSpawnWeight": "Sporeling Spawn Weight", 58 | "config.mobs_of_mythology.option.basiliskHealth": "Basilisk Health", 59 | "config.mobs_of_mythology.option.basiliskAttackDamage": "Basilisk Attack Damage", 60 | "config.mobs_of_mythology.option.pegasusHealth": "Pegasus Health", 61 | "config.mobs_of_mythology.option.pegasusSpawnWeight": "Pegasus Spawn Weight" 62 | } -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/renderer/BasiliskRenderer.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer; 2 | 3 | import com.mojang.blaze3d.vertex.PoseStack; 4 | import com.mojang.blaze3d.vertex.VertexConsumer; 5 | import com.mojang.math.Axis; 6 | import mod.azure.azurelib.common.api.client.renderer.GeoEntityRenderer; 7 | import mod.azure.azurelib.common.api.client.renderer.layer.AutoGlowingGeoLayer; 8 | import mod.azure.azurelib.common.api.client.renderer.layer.BlockAndItemGeoLayer; 9 | import mod.azure.azurelib.common.internal.common.cache.object.BakedGeoModel; 10 | import mod.azure.azurelib.common.internal.common.cache.object.GeoBone; 11 | import net.minecraft.client.renderer.MultiBufferSource; 12 | import net.minecraft.client.renderer.entity.EntityRendererProvider; 13 | import net.minecraft.resources.ResourceLocation; 14 | import net.minecraft.world.item.ItemDisplayContext; 15 | import net.minecraft.world.item.ItemStack; 16 | import net.minecraft.world.item.Items; 17 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 18 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.model.BasiliskModel; 19 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.BasiliskEntity; 20 | import org.jetbrains.annotations.Nullable; 21 | 22 | public class BasiliskRenderer extends GeoEntityRenderer { 23 | public BasiliskRenderer(EntityRendererProvider.Context ctx) { 24 | super(ctx, new BasiliskModel()); 25 | this.shadowRadius = 0.75f; 26 | addRenderLayer(new AutoGlowingGeoLayer<>(this)); 27 | addRenderLayer( 28 | new BlockAndItemGeoLayer<>(this) { 29 | @Nullable 30 | @Override 31 | protected ItemStack getStackForBone(GeoBone bone, BasiliskEntity animatable) { 32 | if (animatable.hasChest() 33 | && (bone.getName().equals("chest_left") || bone.getName().equals("chest_right"))) { 34 | return new ItemStack(Items.CHEST); 35 | } 36 | return null; 37 | } 38 | 39 | @Override 40 | protected ItemDisplayContext getTransformTypeForStack( 41 | GeoBone bone, ItemStack stack, BasiliskEntity animatable) { 42 | if (animatable.hasChest()) { 43 | return ItemDisplayContext.FIXED; 44 | } 45 | return ItemDisplayContext.NONE; 46 | } 47 | 48 | @Override 49 | protected void renderStackForBone( 50 | PoseStack poseStack, 51 | GeoBone bone, 52 | ItemStack stack, 53 | BasiliskEntity animatable, 54 | MultiBufferSource bufferSource, 55 | float partialTick, 56 | int packedLight, 57 | int packedOverlay) { 58 | if (bone.getName().equals("chest_left")) { 59 | poseStack.mulPose(Axis.YP.rotationDegrees(90)); 60 | } else if (bone.getName().equals("chest_right")) { 61 | poseStack.mulPose(Axis.YP.rotationDegrees(-90)); 62 | } 63 | super.renderStackForBone( 64 | poseStack, 65 | bone, 66 | stack, 67 | animatable, 68 | bufferSource, 69 | partialTick, 70 | packedLight, 71 | packedOverlay); 72 | } 73 | }); 74 | } 75 | 76 | @Override 77 | public void preRender( 78 | PoseStack poseStack, 79 | BasiliskEntity animatable, 80 | BakedGeoModel model, 81 | MultiBufferSource bufferSource, 82 | VertexConsumer buffer, 83 | boolean isReRender, 84 | float partialTick, 85 | int packedLight, 86 | int packedOverlay, 87 | int colour) { 88 | super.preRender( 89 | poseStack, 90 | animatable, 91 | model, 92 | bufferSource, 93 | buffer, 94 | isReRender, 95 | partialTick, 96 | packedLight, 97 | packedOverlay, 98 | colour); 99 | model.getBone("saddle").get().setHidden(!animatable.isSaddled()); 100 | } 101 | 102 | @Override 103 | public ResourceLocation getTextureLocation(BasiliskEntity animatable) { 104 | return ResourceLocation.fromNamespaceAndPath( 105 | MobsOfMythology.MOD_ID, "textures/entity/basilisk.png"); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/lang/pt_br.json: -------------------------------------------------------------------------------- 1 | { 2 | "category.mobs_of_mythology": "Mobs of Mythology", 3 | "advancements.mobs_of_mythology.title": "Mobs of Mythology", 4 | "advancements.mobs_of_mythology.description": "Descubra um Mundo de Criaturas Mitológicas no Minecraft!", 5 | "advancements.mobs_of_mythology.tame_basilisk.title": "Gigante Gentil", 6 | "advancements.mobs_of_mythology.tame_basilisk.description": "Dome um Basilisco mortal", 7 | "sound.mobs_of_mythology.drake_roar": "Rugido do Draco", 8 | "sound.mobs_of_mythology.drake_death": "Morte do Draco", 9 | "sound.mobs_of_mythology.robotic_voice": "Voz robótica", 10 | "entity.mobs_of_mythology.automaton": "Autômato", 11 | "entity.mobs_of_mythology.kobold": "Kobold", 12 | "entity.mobs_of_mythology.kobold_warrior": "Guerreiro Kobold", 13 | "entity.mobs_of_mythology.chupacabra": "Chupa-cabra", 14 | "entity.mobs_of_mythology.drake": "Draco", 15 | "entity.mobs_of_mythology.sporeling": "Esporos", 16 | "entity.mobs_of_mythology.basilisk": "Basilisco", 17 | "entity.mobs_of_mythology.pegasus": "Pegasus", 18 | "item.mobs_of_mythology.automaton_spawn_egg": "Ovo Geração de Autômato", 19 | "item.mobs_of_mythology.kobold_spawn_egg": "Ovo Gerador de Kobold", 20 | "item.mobs_of_mythology.kobold_warrior_spawn_egg": "Ovo Gerador de Guerreiro Kobold", 21 | "item.mobs_of_mythology.chupacabra_spawn_egg": "Ovo Gerador de Chupacabra", 22 | "item.mobs_of_mythology.wendigo_spawn_egg": "Ovo Gerador de Wendigo", 23 | "item.mobs_of_mythology.drake_spawn_egg": "Ovo Gerador de Draco", 24 | "item.mobs_of_mythology.sporeling_spawn_egg": "Ovo Gerador de Esporos", 25 | "item.mobs_of_mythology.basilisk_spawn_egg": "Ovo Gerador de Basilisco", 26 | "item.mobs_of_mythology.pegasus_spawn_egg": "Ovo Gerador de Pegasus", 27 | "item.mobs_of_mythology.automaton_head": "Cabeça de Autômato", 28 | "item.mobs_of_mythology.basilisk_head": "Cabeça de Basilisco", 29 | "item.mobs_of_mythology.kobold_spear": "Lança Kobold", 30 | "item.mobs_of_mythology.bronze_ingot": "Barra de Bronze", 31 | "item.mobs_of_mythology.chupacabra_meat": "Carne Crua de Chupa-cabra", 32 | "item.mobs_of_mythology.cooked_chupacabra_meat": "Carne Cozida de Chupa-cabra", 33 | "item.mobs_of_mythology.gear": "Engrenagem de Autômato", 34 | "block.mobs_of_mythology.bronze_block": "Bloco de Bronze", 35 | "block.mobs_of_mythology.cut_bronze_block": "Bloco de Bronze Talhado", 36 | "config.screen.mobs_of_mythology": "Opções do Mobs of Mythology", 37 | "config.mobs_of_mythology.option.automatonHealth": "Vida do Autômato", 38 | "config.mobs_of_mythology.option.automatonAttackDamage": "Dano de Ataque do Autômato", 39 | "config.mobs_of_mythology.option.chupacabraHealth": "Vida do Chupa-cabra", 40 | "config.mobs_of_mythology.option.chupacabraAttackDamage": "Dano de Ataque do Chupa-cabra", 41 | "config.mobs_of_mythology.option.chupacabraSpawnWeight": "Taxa de Geração do Chupa-cabra", 42 | "config.mobs_of_mythology.option.koboldHealth": "Vida do Kobold", 43 | "config.mobs_of_mythology.option.koboldAttackDamage": "Dano de Ataque do Kobold", 44 | "config.mobs_of_mythology.option.koboldFleeSpeedMod": "Modificador de Velocidade de Fuga do Kobold", 45 | "config.mobs_of_mythology.option.koboldSpawnWeight": "Taxa de Geração do Kobold", 46 | "config.mobs_of_mythology.option.shouldKoboldsSteal": "Kobolds Devem Roubar", 47 | "config.mobs_of_mythology.option.koboldWarriorHealth": "Vida do Guerreiro Kobold", 48 | "config.mobs_of_mythology.option.koboldWarriorAttackDamage": "Dano de Ataque do Guerreiro Kobold", 49 | "config.mobs_of_mythology.option.koboldWarriorArmor": "Armadura do Guerreiro Kobold", 50 | "config.mobs_of_mythology.option.koboldWarriorSpawnWeight": "Taxa de Geração do Guerreiro Kobold", 51 | "config.mobs_of_mythology.option.drakeHealth": "Vida do Draco", 52 | "config.mobs_of_mythology.option.drakeAttackDamage": "Dano de Ataque do Draco", 53 | "config.mobs_of_mythology.option.drakeSpawnWeight": "Taxa de Geração do Draco", 54 | "config.mobs_of_mythology.option.sporelingHealth": "Vida do Esporos", 55 | "config.mobs_of_mythology.option.redSporelingLines": "Falas do Esporos Vermelho", 56 | "config.mobs_of_mythology.option.brownSporelingLines": "Falas do Esporos Marrom", 57 | "config.mobs_of_mythology.option.sporelingSpawnWeight": "Taxa de Geração do Esporos", 58 | "config.mobs_of_mythology.option.basiliskHealth": "Vida do Basilisco", 59 | "config.mobs_of_mythology.option.basiliskAttackDamage": "Dano de Ataque do Basilisco", 60 | "config.mobs_of_mythology.option.pegasusHealth": "Vida do Pegasus", 61 | "config.mobs_of_mythology.option.pegasusSpawnWeight": "Taxa de Geração do Pegasus" 62 | } 63 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/mobs_of_mythology/geo/entity/sporeling.geo.json: -------------------------------------------------------------------------------- 1 | { 2 | "format_version": "1.12.0", 3 | "minecraft:geometry": [ 4 | { 5 | "description": { 6 | "identifier": "geometry.sporeling", 7 | "texture_width": 64, 8 | "texture_height": 32, 9 | "visible_bounds_width": 2, 10 | "visible_bounds_height": 2.5, 11 | "visible_bounds_offset": [ 12 | 0, 13 | 0.75, 14 | 0 15 | ] 16 | }, 17 | "bones": [ 18 | { 19 | "name": "sporeling", 20 | "pivot": [ 21 | 0, 22 | 4, 23 | 0 24 | ] 25 | }, 26 | { 27 | "name": "body", 28 | "parent": "sporeling", 29 | "pivot": [ 30 | 0, 31 | 3, 32 | 0 33 | ], 34 | "cubes": [ 35 | { 36 | "origin": [ 37 | -4, 38 | 3, 39 | -4 40 | ], 41 | "size": [ 42 | 8, 43 | 6, 44 | 8 45 | ], 46 | "uv": [ 47 | 0, 48 | 0 49 | ] 50 | } 51 | ] 52 | }, 53 | { 54 | "name": "head", 55 | "parent": "body", 56 | "pivot": [ 57 | 0, 58 | 11, 59 | 0 60 | ], 61 | "cubes": [ 62 | { 63 | "origin": [ 64 | -7, 65 | 9, 66 | -7 67 | ], 68 | "size": [ 69 | 14, 70 | 4, 71 | 14 72 | ], 73 | "uv": [ 74 | 0, 75 | 14 76 | ] 77 | } 78 | ] 79 | }, 80 | { 81 | "name": "right_arm", 82 | "parent": "body", 83 | "pivot": [ 84 | -3, 85 | 7, 86 | 0 87 | ], 88 | "cubes": [ 89 | { 90 | "origin": [ 91 | -6, 92 | 3, 93 | -1.5 94 | ], 95 | "size": [ 96 | 2, 97 | 5, 98 | 3 99 | ], 100 | "uv": [ 101 | 2, 102 | 14 103 | ], 104 | "mirror": true 105 | } 106 | ] 107 | }, 108 | { 109 | "name": "left_arm", 110 | "parent": "body", 111 | "pivot": [ 112 | 4, 113 | 7, 114 | 0 115 | ], 116 | "cubes": [ 117 | { 118 | "origin": [ 119 | 4, 120 | 3, 121 | -1.5 122 | ], 123 | "size": [ 124 | 2, 125 | 5, 126 | 3 127 | ], 128 | "uv": [ 129 | 2, 130 | 14 131 | ] 132 | } 133 | ] 134 | }, 135 | { 136 | "name": "right_leg", 137 | "parent": "sporeling", 138 | "pivot": [ 139 | -1.5, 140 | 3, 141 | 0 142 | ], 143 | "cubes": [ 144 | { 145 | "origin": [ 146 | -3.5, 147 | 0, 148 | -1.5 149 | ], 150 | "size": [ 151 | 3, 152 | 3, 153 | 3 154 | ], 155 | "uv": [ 156 | 2, 157 | 22 158 | ], 159 | "mirror": true 160 | } 161 | ] 162 | }, 163 | { 164 | "name": "left_leg", 165 | "parent": "sporeling", 166 | "pivot": [ 167 | 2.5, 168 | 3, 169 | 0 170 | ], 171 | "cubes": [ 172 | { 173 | "origin": [ 174 | 0.5, 175 | 0, 176 | -1.5 177 | ], 178 | "size": [ 179 | 3, 180 | 3, 181 | 3 182 | ], 183 | "uv": [ 184 | 2, 185 | 22 186 | ] 187 | } 188 | ] 189 | } 190 | ] 191 | } 192 | ] 193 | } -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/mobs/KoboldWarriorEntity.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.mobs; 2 | 3 | import it.unimi.dsi.fastutil.objects.ObjectArrayList; 4 | import java.util.List; 5 | import net.minecraft.Util; 6 | import net.minecraft.world.DifficultyInstance; 7 | import net.minecraft.world.InteractionHand; 8 | import net.minecraft.world.entity.EntityType; 9 | import net.minecraft.world.entity.MobSpawnType; 10 | import net.minecraft.world.entity.SpawnGroupData; 11 | import net.minecraft.world.entity.ai.attributes.AttributeSupplier; 12 | import net.minecraft.world.entity.ai.attributes.Attributes; 13 | import net.minecraft.world.entity.animal.IronGolem; 14 | import net.minecraft.world.entity.monster.Monster; 15 | import net.minecraft.world.entity.npc.Villager; 16 | import net.minecraft.world.entity.player.Player; 17 | import net.minecraft.world.item.ItemStack; 18 | import net.minecraft.world.level.Level; 19 | import net.minecraft.world.level.ServerLevelAccessor; 20 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 21 | import net.pixeldreamstudios.mobs_of_mythology.entity.AbstractMythMonsterEntity; 22 | import net.pixeldreamstudios.mobs_of_mythology.entity.variant.KoboldWarriorVariant; 23 | import net.pixeldreamstudios.mobs_of_mythology.registry.ItemRegistry; 24 | import net.tslat.smartbrainlib.api.core.BrainActivityGroup; 25 | import net.tslat.smartbrainlib.api.core.behaviour.custom.attack.AnimatableMeleeAttack; 26 | import net.tslat.smartbrainlib.api.core.behaviour.custom.path.SetWalkTargetToAttackTarget; 27 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.InvalidateAttackTarget; 28 | import net.tslat.smartbrainlib.api.core.sensor.ExtendedSensor; 29 | import net.tslat.smartbrainlib.api.core.sensor.vanilla.HurtBySensor; 30 | import net.tslat.smartbrainlib.api.core.sensor.vanilla.NearbyLivingEntitySensor; 31 | import org.jetbrains.annotations.Nullable; 32 | 33 | public class KoboldWarriorEntity extends AbstractKoboldEntity { 34 | public KoboldWarriorEntity(EntityType entityType, Level world) { 35 | super(entityType, world, Monster.XP_REWARD_MEDIUM); 36 | this.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(ItemRegistry.KOBOLD_SPEAR, 1)); 37 | } 38 | 39 | public static AttributeSupplier.Builder createAttributes() { 40 | return Monster.createMobAttributes() 41 | .add(Attributes.MAX_HEALTH, MobsOfMythology.config.koboldWarriorHealth) 42 | .add(Attributes.ARMOR, MobsOfMythology.config.koboldWarriorArmor) 43 | .add(Attributes.ATTACK_DAMAGE, MobsOfMythology.config.koboldWarriorAttackDamage) 44 | .add(Attributes.ATTACK_SPEED, 2) 45 | .add(Attributes.ATTACK_KNOCKBACK, 1) 46 | .add(Attributes.MOVEMENT_SPEED, 0.3); 47 | } 48 | 49 | @Override 50 | public SpawnGroupData finalizeSpawn( 51 | ServerLevelAccessor world, 52 | DifficultyInstance difficulty, 53 | MobSpawnType spawnReason, 54 | @Nullable SpawnGroupData entityData) { 55 | KoboldWarriorVariant variant = Util.getRandom(KoboldWarriorVariant.values(), this.random); 56 | setVariant(variant); 57 | return super.finalizeSpawn(world, difficulty, spawnReason, entityData); 58 | } 59 | 60 | @Override 61 | public List> getSensors() { 62 | return ObjectArrayList.of( 63 | new NearbyLivingEntitySensor() 64 | .setPredicate( 65 | (target, entity) -> { 66 | return target instanceof Player 67 | || target instanceof Villager 68 | || target instanceof IronGolem 69 | || target instanceof AutomatonEntity; 70 | }), 71 | new HurtBySensor<>()); 72 | } 73 | 74 | @Override 75 | public BrainActivityGroup getFightTasks() { 76 | return BrainActivityGroup.fightTasks( 77 | new InvalidateAttackTarget<>() 78 | .invalidateIf((target, entity) -> !target.isAlive() || !entity.hasLineOfSight(target)), 79 | new SetWalkTargetToAttackTarget<>().speedMod((mob, livingEntity) -> 1.25f), 80 | new AnimatableMeleeAttack<>(6) 81 | .whenStarting( 82 | mob -> { 83 | this.triggerAnim("attackController", "attack"); 84 | })); 85 | } 86 | 87 | @Override 88 | public T getVariant() { 89 | return (T) KoboldWarriorVariant.byId(this.getTypeVariant() & 255); 90 | } 91 | 92 | private void setVariant(KoboldWarriorVariant variant) { 93 | this.entityData.set(DATA_ID_TYPE_VARIANT, variant.getId() & 255); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/MobsOfMythologyConfig.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology; 2 | 3 | import mod.azure.azurelib.common.api.common.config.Config; 4 | import mod.azure.azurelib.common.internal.common.config.Configurable; 5 | 6 | @Config(id = MobsOfMythology.MOD_ID) 7 | public class MobsOfMythologyConfig { 8 | @Configurable 9 | @Configurable.Synchronized 10 | @Configurable.DecimalRange(min = 1) 11 | public double automatonHealth = 100.0; 12 | 13 | @Configurable 14 | @Configurable.Synchronized 15 | @Configurable.DecimalRange(min = 1) 16 | public double automatonAttackDamage = 16.0; 17 | 18 | @Configurable 19 | @Configurable.Synchronized 20 | @Configurable.DecimalRange(min = 1) 21 | public double chupacabraHealth = 16.0; 22 | 23 | @Configurable 24 | @Configurable.Synchronized 25 | @Configurable.DecimalRange(min = 1) 26 | public double chupacabraAttackDamage = 6.0; 27 | 28 | @Configurable @Configurable.Synchronized public int chupacabraSpawnWeight = 15; 29 | 30 | @Configurable 31 | @Configurable.Synchronized 32 | @Configurable.DecimalRange(min = 1) 33 | public double koboldHealth = 10.0; 34 | 35 | @Configurable 36 | @Configurable.Synchronized 37 | @Configurable.DecimalRange(min = 1) 38 | public double koboldAttackDamage = 1.5; 39 | 40 | @Configurable 41 | @Configurable.Synchronized 42 | @Configurable.DecimalRange(min = 1.0f) 43 | public float koboldFleeSpeedMod = 2.0f; 44 | 45 | @Configurable @Configurable.Synchronized public int koboldSpawnWeight = 10; 46 | @Configurable @Configurable.Synchronized public boolean shouldKoboldsSteal = true; 47 | 48 | @Configurable 49 | @Configurable.Synchronized 50 | @Configurable.DecimalRange(min = 1) 51 | public double koboldWarriorHealth = 20.0; 52 | 53 | @Configurable 54 | @Configurable.Synchronized 55 | @Configurable.DecimalRange(min = 1) 56 | public double koboldWarriorArmor = 6.0; 57 | 58 | @Configurable 59 | @Configurable.Synchronized 60 | @Configurable.DecimalRange(min = 1) 61 | public double koboldWarriorAttackDamage = 5.5; 62 | 63 | @Configurable @Configurable.Synchronized public int koboldWarriorSpawnWeight = 10; 64 | 65 | @Configurable 66 | @Configurable.Synchronized 67 | @Configurable.DecimalRange(min = 1) 68 | public double drakeHealth = 30.0; 69 | 70 | @Configurable 71 | @Configurable.Synchronized 72 | @Configurable.DecimalRange(min = 1) 73 | public double drakeAttackDamage = 5.0; 74 | 75 | @Configurable 76 | @Configurable.Synchronized 77 | @Configurable.DecimalRange(min = 1) 78 | public double basiliskHealth = 100.0; 79 | 80 | @Configurable 81 | @Configurable.Synchronized 82 | @Configurable.DecimalRange(min = 1) 83 | public double basiliskAttackDamage = 8.0; 84 | 85 | @Configurable 86 | @Configurable.Synchronized 87 | @Configurable.DecimalRange(min = 1) 88 | public double pegasusHealth = 50.0; 89 | 90 | @Configurable @Configurable.Synchronized public int pegasusSpawnWeight = 10; 91 | @Configurable @Configurable.Synchronized public int drakeSpawnWeight = 10; 92 | 93 | @Configurable 94 | @Configurable.Synchronized 95 | @Configurable.DecimalRange(min = 1) 96 | public double sporelingHealth = 6.0; 97 | 98 | @Configurable @Configurable.Synchronized 99 | public String[] redSporelingLines = { 100 | "playerGreeting", 101 | "Seen any smurfs lately?", 102 | "I hate Gargamel...", 103 | "Mondays, huh?", 104 | "You're a big fellow!", 105 | "Please don't eat me!", 106 | "Why did the Creeper hang out with me? Because I'm such a fun-gi to be around!", 107 | "They say I'm a fun-gi, but I think I'm just a cap-tivating conversationalist!", 108 | "Looking for a spore-tacular time? You've found the right mushroom!", 109 | "Did you hear about the fungi who threw a party? It was a real spore-gy!", 110 | "I'm not edibles!", 111 | "My cousin Brownie is an alchemist.", 112 | "Do you know of a bard named Smash Mouth? I hear he's an All Star.", 113 | "I'm not a regular mushroom; I'm a spore-tacular mushroom!", 114 | "Some people blame me for the apocalypse...", 115 | "Γειά σου Ελλάδα!" 116 | }; 117 | 118 | @Configurable @Configurable.Synchronized 119 | public String[] brownSporelingLines = { 120 | "Why do I feel like a fun-guy in a no-fun zone?", 121 | "You want a piece of my spore attitude? Take a hike!", 122 | "Life's a spore-t, and then you decompose.", 123 | "Step back, or I'll give you a spore-tacular scowl!", 124 | "Why do players always pick on mushrooms? Can't we just have a cap-py existence?", 125 | "I'd rather be left alone in my dark corner. No mushroom for company!", 126 | "I don't have mushroom for joy, just a whole lot of fung-titude!", 127 | "Have a fung-tastic day...", 128 | "I am responsible for the apocalypse.", 129 | "I'm not grumpy, I'm just a fungi with a perpetual frown.", 130 | "Why are you bothering me? Can't you see I'm having a spore day?", 131 | "Why do players keep trying to cheer me up? Do I look like a sunflower to you?", 132 | "I'm like a mushroom, growing in the darkness of my grumpy thoughts.", 133 | "Step lightly, or you might awaken the wrath of the grumpy mushroom!", 134 | "Why be a fun-guy when you can be a grump-guy?", 135 | "I've mastered the art of being perpetually annoyed. It's my spore-cialty!", 136 | "Let's get blazed! Go bring the blaze rod.", 137 | "Is it 4:20 already?" 138 | }; 139 | 140 | @Configurable @Configurable.Synchronized public int sporelingSpawnWeight = 16; 141 | } 142 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/mobs/ChupacabraEntity.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.mobs; 2 | 3 | import it.unimi.dsi.fastutil.objects.ObjectArrayList; 4 | import java.util.List; 5 | import mod.azure.azurelib.common.api.common.animatable.GeoEntity; 6 | import net.minecraft.core.BlockPos; 7 | import net.minecraft.sounds.SoundEvent; 8 | import net.minecraft.sounds.SoundEvents; 9 | import net.minecraft.world.Difficulty; 10 | import net.minecraft.world.damagesource.DamageSource; 11 | import net.minecraft.world.entity.EntityType; 12 | import net.minecraft.world.entity.MobSpawnType; 13 | import net.minecraft.world.entity.ai.attributes.AttributeSupplier; 14 | import net.minecraft.world.entity.ai.attributes.Attributes; 15 | import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; 16 | import net.minecraft.world.entity.animal.Animal; 17 | import net.minecraft.world.entity.monster.Enemy; 18 | import net.minecraft.world.entity.monster.Monster; 19 | import net.minecraft.world.entity.player.Player; 20 | import net.minecraft.world.level.Level; 21 | import net.minecraft.world.level.LevelAccessor; 22 | import net.minecraft.world.level.LightLayer; 23 | import net.minecraft.world.level.block.state.BlockState; 24 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 25 | import net.pixeldreamstudios.mobs_of_mythology.entity.AbstractMythMonsterEntity; 26 | import net.tslat.smartbrainlib.api.core.BrainActivityGroup; 27 | import net.tslat.smartbrainlib.api.core.behaviour.custom.attack.AnimatableMeleeAttack; 28 | import net.tslat.smartbrainlib.api.core.behaviour.custom.misc.ReactToUnreachableTarget; 29 | import net.tslat.smartbrainlib.api.core.behaviour.custom.move.FleeTarget; 30 | import net.tslat.smartbrainlib.api.core.behaviour.custom.path.SetWalkTargetToAttackTarget; 31 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.InvalidateAttackTarget; 32 | import net.tslat.smartbrainlib.api.core.navigation.SmoothGroundNavigation; 33 | import net.tslat.smartbrainlib.api.core.sensor.ExtendedSensor; 34 | import net.tslat.smartbrainlib.api.core.sensor.custom.UnreachableTargetSensor; 35 | import net.tslat.smartbrainlib.api.core.sensor.vanilla.HurtBySensor; 36 | import net.tslat.smartbrainlib.api.core.sensor.vanilla.NearbyLivingEntitySensor; 37 | import net.tslat.smartbrainlib.util.BrainUtils; 38 | 39 | public class ChupacabraEntity extends AbstractMythMonsterEntity implements GeoEntity { 40 | private boolean unreachableTarget = false; 41 | 42 | public ChupacabraEntity(EntityType entityType, Level level) { 43 | super(entityType, level); 44 | navigation = new SmoothGroundNavigation(this, level()); 45 | GroundPathNavigation mobNavigation = (GroundPathNavigation) this.getNavigation(); 46 | mobNavigation.setCanWalkOverFences(true); 47 | this.xpReward = Enemy.XP_REWARD_MEDIUM; 48 | } 49 | 50 | public static AttributeSupplier.Builder createAttributes() { 51 | return Monster.createMobAttributes() 52 | .add(Attributes.MAX_HEALTH, MobsOfMythology.config.chupacabraHealth) 53 | .add(Attributes.ATTACK_DAMAGE, MobsOfMythology.config.chupacabraAttackDamage) 54 | .add(Attributes.ATTACK_SPEED, 1.25f) 55 | .add(Attributes.ATTACK_KNOCKBACK, 1) 56 | .add(Attributes.MOVEMENT_SPEED, 0.3); 57 | } 58 | 59 | @Override 60 | public List> getSensors() { 61 | return ObjectArrayList.of( 62 | new NearbyLivingEntitySensor() 63 | .setPredicate((target, entity) -> target instanceof Animal || target instanceof Player), 64 | new HurtBySensor<>(), 65 | new UnreachableTargetSensor<>()); 66 | } 67 | 68 | @Override 69 | public BrainActivityGroup getFightTasks() { 70 | return BrainActivityGroup.fightTasks( 71 | new InvalidateAttackTarget<>() 72 | .invalidateIf((target, entity) -> !target.isAlive() || !entity.hasLineOfSight(target)), 73 | new SetWalkTargetToAttackTarget<>() 74 | .speedMod((mob, livingEntity) -> 1.25f) 75 | .startCondition(mob -> BrainUtils.getTargetOfEntity(this) instanceof Animal), 76 | new FleeTarget<>() 77 | .speedModifier(1.75f) 78 | .startCondition( 79 | pathfinderMob -> 80 | BrainUtils.getTargetOfEntity(this) instanceof Player 81 | || BrainUtils.getLastAttacker(this) instanceof Player 82 | || unreachableTarget) 83 | .whenStopping(pathfinderMob -> unreachableTarget = false), 84 | new AnimatableMeleeAttack<>(8) 85 | .whenStarting( 86 | mob -> { 87 | this.triggerAnim("attackController", "attack"); 88 | if (getHealth() < getMaxHealth()) { 89 | this.heal(1.5f); 90 | } 91 | }), 92 | new ReactToUnreachableTarget<>() 93 | .reaction((livingEntity, aBoolean) -> unreachableTarget = true)); 94 | } 95 | 96 | @Override 97 | public boolean checkSpawnRules(LevelAccessor level, MobSpawnType spawnType) { 98 | if (level.getDifficulty() == Difficulty.PEACEFUL) { 99 | return false; 100 | } 101 | BlockPos pos = this.blockPosition(); 102 | int skyLight = level.getBrightness(LightLayer.SKY, pos); 103 | int blockLight = level.getBrightness(LightLayer.BLOCK, pos); 104 | 105 | if (skyLight > 7 || blockLight > 7) { 106 | return false; 107 | } 108 | return super.checkSpawnRules(level, spawnType); 109 | } 110 | 111 | @Override 112 | protected SoundEvent getAmbientSound() { 113 | this.playSound(SoundEvents.WOLF_AMBIENT, 1.0f, 0.25f); 114 | return null; 115 | } 116 | 117 | @Override 118 | protected SoundEvent getHurtSound(DamageSource source) { 119 | this.playSound(SoundEvents.WOLF_HURT, 1.0f, 0.25f); 120 | return null; 121 | } 122 | 123 | @Override 124 | protected SoundEvent getDeathSound() { 125 | this.playSound(SoundEvents.WOLF_DEATH, 1.0f, 0.25f); 126 | return null; 127 | } 128 | 129 | @Override 130 | protected void playStepSound(BlockPos pos, BlockState state) { 131 | this.playSound(SoundEvents.WOLF_STEP, 0.5f, 1.0f); 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/renderer/KoboldRenderer.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer; 2 | 3 | import com.google.common.collect.Maps; 4 | import com.mojang.blaze3d.vertex.PoseStack; 5 | import com.mojang.blaze3d.vertex.VertexConsumer; 6 | import com.mojang.math.Axis; 7 | import java.util.Map; 8 | import mod.azure.azurelib.common.api.client.renderer.DynamicGeoEntityRenderer; 9 | import mod.azure.azurelib.common.api.client.renderer.layer.BlockAndItemGeoLayer; 10 | import mod.azure.azurelib.common.internal.common.cache.object.BakedGeoModel; 11 | import mod.azure.azurelib.common.internal.common.cache.object.GeoBone; 12 | import net.minecraft.Util; 13 | import net.minecraft.client.renderer.MultiBufferSource; 14 | import net.minecraft.client.renderer.entity.EntityRendererProvider; 15 | import net.minecraft.resources.ResourceLocation; 16 | import net.minecraft.world.item.ItemDisplayContext; 17 | import net.minecraft.world.item.ItemStack; 18 | import net.minecraft.world.item.ShieldItem; 19 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 20 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.model.KoboldModel; 21 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.KoboldEntity; 22 | import net.pixeldreamstudios.mobs_of_mythology.entity.variant.KoboldVariant; 23 | import org.jetbrains.annotations.Nullable; 24 | 25 | public class KoboldRenderer extends DynamicGeoEntityRenderer { 26 | public static final Map LOCATION_BY_VARIANT = 27 | Util.make( 28 | Maps.newEnumMap(KoboldVariant.class), 29 | (map) -> { 30 | map.put( 31 | KoboldVariant.KOBOLD, 32 | ResourceLocation.fromNamespaceAndPath( 33 | MobsOfMythology.MOD_ID, "textures/entity/kobold/kobold.png")); 34 | map.put( 35 | KoboldVariant.KOBOLD_CLOTHED, 36 | ResourceLocation.fromNamespaceAndPath( 37 | MobsOfMythology.MOD_ID, "textures/entity/kobold/kobold_cloth.png")); 38 | }); 39 | private static final String RIGHT_HAND = "hand"; 40 | private static final String LEFT_HAND = "hand2"; 41 | protected ItemStack mainHandItem; 42 | protected ItemStack offHandItem; 43 | 44 | public KoboldRenderer(EntityRendererProvider.Context ctx) { 45 | super(ctx, new KoboldModel()); 46 | this.shadowRadius = 0.4f; 47 | 48 | // TODO Add glow 49 | // addRenderLayer(new AutoGlowingGeoLayer<>(this)); 50 | 51 | // Add some held item rendering 52 | addRenderLayer( 53 | new BlockAndItemGeoLayer<>(this) { 54 | @Nullable 55 | @Override 56 | protected ItemStack getStackForBone(GeoBone bone, KoboldEntity animatable) { 57 | // Retrieve the items in the entity's hands for the relevant bone 58 | return switch (bone.getName()) { 59 | case LEFT_HAND -> 60 | animatable.isLeftHanded() 61 | ? KoboldRenderer.this.mainHandItem 62 | : KoboldRenderer.this.offHandItem; 63 | case RIGHT_HAND -> 64 | animatable.isLeftHanded() 65 | ? KoboldRenderer.this.offHandItem 66 | : KoboldRenderer.this.mainHandItem; 67 | default -> null; 68 | }; 69 | } 70 | 71 | @Override 72 | protected ItemDisplayContext getTransformTypeForStack( 73 | GeoBone bone, ItemStack stack, KoboldEntity animatable) { 74 | // Apply the camera transform for the given hand 75 | return switch (bone.getName()) { 76 | case LEFT_HAND, RIGHT_HAND -> ItemDisplayContext.THIRD_PERSON_RIGHT_HAND; 77 | default -> ItemDisplayContext.NONE; 78 | }; 79 | } 80 | 81 | // Do some quick render modifications depending on what the item is 82 | @Override 83 | protected void renderStackForBone( 84 | PoseStack poseStack, 85 | GeoBone bone, 86 | ItemStack stack, 87 | KoboldEntity animatable, 88 | MultiBufferSource bufferSource, 89 | float partialTick, 90 | int packedLight, 91 | int packedOverlay) { 92 | if (stack == KoboldRenderer.this.mainHandItem) { 93 | poseStack.mulPose(Axis.XP.rotationDegrees(-90f)); 94 | 95 | if (stack.getItem() instanceof ShieldItem) poseStack.translate(0, 0.125, -0.25); 96 | } else if (stack == KoboldRenderer.this.offHandItem) { 97 | poseStack.mulPose(Axis.XP.rotationDegrees(-90f)); 98 | 99 | if (stack.getItem() instanceof ShieldItem) { 100 | poseStack.translate(0, 0.125, 0.25); 101 | poseStack.mulPose(Axis.YP.rotationDegrees(180)); 102 | } 103 | } 104 | 105 | super.renderStackForBone( 106 | poseStack, 107 | bone, 108 | stack, 109 | animatable, 110 | bufferSource, 111 | partialTick, 112 | packedLight, 113 | packedOverlay); 114 | } 115 | }); 116 | } 117 | 118 | @Override 119 | public ResourceLocation getTextureLocation(KoboldEntity animatable) { 120 | return LOCATION_BY_VARIANT.get(animatable.getVariant()); 121 | } 122 | 123 | @Override 124 | public void preRender( 125 | PoseStack poseStack, 126 | KoboldEntity animatable, 127 | BakedGeoModel model, 128 | MultiBufferSource bufferSource, 129 | VertexConsumer buffer, 130 | boolean isReRender, 131 | float partialTick, 132 | int packedLight, 133 | int packedOverlay, 134 | int colour) { 135 | super.preRender( 136 | poseStack, 137 | animatable, 138 | model, 139 | bufferSource, 140 | buffer, 141 | isReRender, 142 | partialTick, 143 | packedLight, 144 | packedOverlay, 145 | colour); 146 | 147 | this.mainHandItem = animatable.getMainHandItem(); 148 | this.offHandItem = animatable.getOffhandItem(); 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/mobs/PegasusEntity.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.mobs; 2 | 3 | import mod.azure.azurelib.common.api.common.animatable.GeoEntity; 4 | import mod.azure.azurelib.core.animatable.instance.AnimatableInstanceCache; 5 | import mod.azure.azurelib.core.animatable.instance.SingletonAnimatableInstanceCache; 6 | import mod.azure.azurelib.core.animation.AnimatableManager; 7 | import mod.azure.azurelib.core.animation.AnimationController; 8 | import net.minecraft.sounds.SoundEvents; 9 | import net.minecraft.world.InteractionHand; 10 | import net.minecraft.world.InteractionResult; 11 | import net.minecraft.world.damagesource.DamageSource; 12 | import net.minecraft.world.entity.Entity; 13 | import net.minecraft.world.entity.EntityType; 14 | import net.minecraft.world.entity.LivingEntity; 15 | import net.minecraft.world.entity.ai.attributes.AttributeSupplier; 16 | import net.minecraft.world.entity.ai.attributes.Attributes; 17 | import net.minecraft.world.entity.animal.horse.AbstractChestedHorse; 18 | import net.minecraft.world.entity.player.Player; 19 | import net.minecraft.world.level.Level; 20 | import net.minecraft.world.phys.Vec3; 21 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 22 | import net.pixeldreamstudios.mobs_of_mythology.entity.constant.DefaultMythAnimations; 23 | import org.jetbrains.annotations.Nullable; 24 | 25 | public class PegasusEntity extends AbstractChestedHorse implements GeoEntity { 26 | 27 | private static final int FLYING_INTERVAL = 8; 28 | private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); 29 | protected int flyingTime; 30 | private boolean isFlying = false; 31 | 32 | public PegasusEntity(EntityType entityType, Level level) { 33 | super(entityType, level); 34 | } 35 | 36 | public static AttributeSupplier.Builder createAttributes() { 37 | return AbstractChestedHorse.createBaseChestedHorseAttributes() 38 | .add(Attributes.MAX_HEALTH, MobsOfMythology.config.pegasusHealth) 39 | .add(Attributes.MOVEMENT_SPEED, 0.25) 40 | .add(Attributes.FLYING_SPEED, 0.8) 41 | .add(Attributes.JUMP_STRENGTH, 1.0); 42 | } 43 | 44 | @Override 45 | public void aiStep() { 46 | super.aiStep(); 47 | if (flyingTime > 0) { 48 | flyingTime--; 49 | } 50 | // if (!isVehicle()) { 51 | // isFlying = false; 52 | // } 53 | if (this.onGround()) { 54 | isFlying = false; 55 | } 56 | } 57 | 58 | @Override 59 | public void travel(Vec3 movementInput) { 60 | if (this.isAlive()) { 61 | if (this.isVehicle() && this.getControllingPassenger() instanceof LivingEntity rider) { 62 | this.setYRot(rider.getYRot()); 63 | this.yRotO = this.getYRot(); 64 | this.setXRot(rider.getXRot() * 0.5F); 65 | this.setRot(this.getYRot(), this.getXRot()); 66 | if (isFlying) { 67 | this.setSpeed((float) this.getAttributeValue(Attributes.FLYING_SPEED)); 68 | Vec3 currentMotion = this.getDeltaMovement(); 69 | this.setDeltaMovement(currentMotion.add(0.0, 0.05, 0.0)); 70 | super.travel(new Vec3(rider.xxa, currentMotion.y, rider.zza)); 71 | this.setDeltaMovement(this.getDeltaMovement().multiply(0.91D, 0.98D, 0.91D)); 72 | } else { 73 | this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED)); 74 | super.travel(new Vec3(rider.xxa, 0, rider.zza)); 75 | } 76 | } else { 77 | super.travel(movementInput); 78 | } 79 | } 80 | } 81 | 82 | @Override 83 | public void handleStartJump(int jumpPower) { 84 | if (!this.onGround()) { 85 | this.setStanding(false); 86 | } 87 | } 88 | 89 | @Override 90 | public boolean canJump() { 91 | return super.canJump() && flyingTime <= 0; 92 | } 93 | 94 | @Override 95 | public void onPlayerJump(int jumpPower) { 96 | // if (this.canJump()) { 97 | // this.setJumping(true); 98 | this.flyingJump(); 99 | } 100 | 101 | public void flyingJump() { 102 | if (flyingTime <= 0 && this.canJump()) { 103 | float jumpMotion = 1.6F; 104 | this.setDeltaMovement(this.getDeltaMovement().add(0, jumpMotion, 0)); 105 | this.flyingTime = FLYING_INTERVAL; 106 | this.isFlying = true; 107 | } 108 | } 109 | 110 | @Override 111 | public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource source) { 112 | // Pegasus does not take fall damage 113 | return false; 114 | } 115 | 116 | @Override 117 | protected void playJumpSound() { 118 | this.playSound(SoundEvents.HORSE_JUMP, 0.4F, 1.0F); 119 | } 120 | 121 | @Override 122 | public boolean isJumping() { 123 | return false; 124 | } 125 | 126 | @Override 127 | public void setJumping(boolean jumping) { 128 | this.jumping = jumping; 129 | } 130 | 131 | @Override 132 | public InteractionResult mobInteract(Player player, InteractionHand hand) { 133 | if (!this.level().isClientSide && !this.isVehicle()) { 134 | player.startRiding(this); 135 | return InteractionResult.SUCCESS; 136 | } 137 | return super.mobInteract(player, hand); 138 | } 139 | 140 | @Override 141 | @Nullable 142 | public LivingEntity getControllingPassenger() { 143 | Entity passenger = this.getFirstPassenger(); 144 | return passenger instanceof Player ? (Player) passenger : null; 145 | } 146 | 147 | @Override 148 | public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { 149 | controllerRegistrar.add( 150 | new AnimationController<>( 151 | this, 152 | "controller", 153 | 3, 154 | state -> { 155 | if (isFlying) { 156 | return state.setAndContinue(DefaultMythAnimations.FLY); 157 | } 158 | if (this.onGround() && state.isMoving()) { 159 | return state.setAndContinue(DefaultMythAnimations.WALK); 160 | } 161 | return state.setAndContinue(DefaultMythAnimations.IDLE); 162 | })); 163 | } 164 | 165 | @Override 166 | public AnimatableInstanceCache getAnimatableInstanceCache() { 167 | return cache; 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/client/renderer/KoboldWarriorRenderer.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.client.renderer; 2 | 3 | import com.google.common.collect.Maps; 4 | import com.mojang.blaze3d.vertex.PoseStack; 5 | import com.mojang.blaze3d.vertex.VertexConsumer; 6 | import com.mojang.math.Axis; 7 | import java.util.Map; 8 | import mod.azure.azurelib.common.api.client.renderer.DynamicGeoEntityRenderer; 9 | import mod.azure.azurelib.common.api.client.renderer.layer.BlockAndItemGeoLayer; 10 | import mod.azure.azurelib.common.internal.common.cache.object.BakedGeoModel; 11 | import mod.azure.azurelib.common.internal.common.cache.object.GeoBone; 12 | import net.minecraft.Util; 13 | import net.minecraft.client.renderer.MultiBufferSource; 14 | import net.minecraft.client.renderer.entity.EntityRendererProvider; 15 | import net.minecraft.resources.ResourceLocation; 16 | import net.minecraft.world.item.ItemDisplayContext; 17 | import net.minecraft.world.item.ItemStack; 18 | import net.minecraft.world.item.ShieldItem; 19 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 20 | import net.pixeldreamstudios.mobs_of_mythology.entity.client.model.KoboldWarriorModel; 21 | import net.pixeldreamstudios.mobs_of_mythology.entity.mobs.KoboldWarriorEntity; 22 | import net.pixeldreamstudios.mobs_of_mythology.entity.variant.KoboldWarriorVariant; 23 | import org.jetbrains.annotations.Nullable; 24 | 25 | public class KoboldWarriorRenderer extends DynamicGeoEntityRenderer { 26 | public static final Map LOCATION_BY_VARIANT = 27 | Util.make( 28 | Maps.newEnumMap(KoboldWarriorVariant.class), 29 | (map) -> { 30 | map.put( 31 | KoboldWarriorVariant.KOBOLD_WARRIOR_1, 32 | ResourceLocation.fromNamespaceAndPath( 33 | MobsOfMythology.MOD_ID, "textures/entity/kobold_warrior/kobold_warrior_1.png")); 34 | map.put( 35 | KoboldWarriorVariant.KOBOLD_WARRIOR_2, 36 | ResourceLocation.fromNamespaceAndPath( 37 | MobsOfMythology.MOD_ID, "textures/entity/kobold_warrior/kobold_warrior_2.png")); 38 | map.put( 39 | KoboldWarriorVariant.KOBOLD_WARRIOR_3, 40 | ResourceLocation.fromNamespaceAndPath( 41 | MobsOfMythology.MOD_ID, "textures/entity/kobold_warrior/kobold_warrior_3.png")); 42 | }); 43 | private static final String RIGHT_HAND = "item"; 44 | private static final String LEFT_HAND = "item2"; 45 | protected ItemStack mainHandItem; 46 | protected ItemStack offHandItem; 47 | 48 | public KoboldWarriorRenderer(EntityRendererProvider.Context ctx) { 49 | super(ctx, new KoboldWarriorModel()); 50 | this.shadowRadius = 0.4f; 51 | 52 | // TODO Add glow 53 | // addRenderLayer(new AutoGlowingGeoLayer<>(this)); 54 | 55 | // Add some held item rendering 56 | addRenderLayer( 57 | new BlockAndItemGeoLayer<>(this) { 58 | @Nullable 59 | @Override 60 | protected ItemStack getStackForBone(GeoBone bone, KoboldWarriorEntity animatable) { 61 | // Retrieve the items in the entity's hands for the relevant bone 62 | return switch (bone.getName()) { 63 | case LEFT_HAND -> 64 | animatable.isLeftHanded() 65 | ? KoboldWarriorRenderer.this.mainHandItem 66 | : KoboldWarriorRenderer.this.offHandItem; 67 | case RIGHT_HAND -> 68 | animatable.isLeftHanded() 69 | ? KoboldWarriorRenderer.this.offHandItem 70 | : KoboldWarriorRenderer.this.mainHandItem; 71 | default -> null; 72 | }; 73 | } 74 | 75 | @Override 76 | protected ItemDisplayContext getTransformTypeForStack( 77 | GeoBone bone, ItemStack stack, KoboldWarriorEntity animatable) { 78 | // Apply the camera transform for the given hand 79 | return switch (bone.getName()) { 80 | case LEFT_HAND, RIGHT_HAND -> ItemDisplayContext.THIRD_PERSON_RIGHT_HAND; 81 | default -> ItemDisplayContext.NONE; 82 | }; 83 | } 84 | 85 | // Do some quick render modifications depending on what the item is 86 | @Override 87 | protected void renderStackForBone( 88 | PoseStack poseStack, 89 | GeoBone bone, 90 | ItemStack stack, 91 | KoboldWarriorEntity animatable, 92 | MultiBufferSource bufferSource, 93 | float partialTick, 94 | int packedLight, 95 | int packedOverlay) { 96 | if (stack == KoboldWarriorRenderer.this.mainHandItem) { 97 | poseStack.mulPose(Axis.XP.rotationDegrees(-90f)); 98 | 99 | if (stack.getItem() instanceof ShieldItem) poseStack.translate(0, 0.125, -0.25); 100 | } else if (stack == KoboldWarriorRenderer.this.offHandItem) { 101 | poseStack.mulPose(Axis.XP.rotationDegrees(-90f)); 102 | 103 | if (stack.getItem() instanceof ShieldItem) { 104 | poseStack.translate(0, 0.125, 0.25); 105 | poseStack.mulPose(Axis.YP.rotationDegrees(180)); 106 | } 107 | } 108 | 109 | super.renderStackForBone( 110 | poseStack, 111 | bone, 112 | stack, 113 | animatable, 114 | bufferSource, 115 | partialTick, 116 | packedLight, 117 | packedOverlay); 118 | } 119 | }); 120 | } 121 | 122 | @Override 123 | public ResourceLocation getTextureLocation(KoboldWarriorEntity animatable) { 124 | return LOCATION_BY_VARIANT.get(animatable.getVariant()); 125 | } 126 | 127 | @Override 128 | public void preRender( 129 | PoseStack poseStack, 130 | KoboldWarriorEntity animatable, 131 | BakedGeoModel model, 132 | MultiBufferSource bufferSource, 133 | VertexConsumer buffer, 134 | boolean isReRender, 135 | float partialTick, 136 | int packedLight, 137 | int packedOverlay, 138 | int colour) { 139 | super.preRender( 140 | poseStack, 141 | animatable, 142 | model, 143 | bufferSource, 144 | buffer, 145 | isReRender, 146 | partialTick, 147 | packedLight, 148 | packedOverlay, 149 | colour); 150 | 151 | this.mainHandItem = animatable.getMainHandItem(); 152 | this.offHandItem = animatable.getOffhandItem(); 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/registry/ItemRegistry.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.registry; 2 | 3 | import dev.architectury.core.item.ArchitecturySpawnEggItem; 4 | import dev.architectury.registry.registries.DeferredRegister; 5 | import dev.architectury.registry.registries.RegistrySupplier; 6 | import net.minecraft.core.registries.Registries; 7 | import net.minecraft.world.effect.MobEffectInstance; 8 | import net.minecraft.world.effect.MobEffects; 9 | import net.minecraft.world.food.FoodProperties; 10 | import net.minecraft.world.item.Item; 11 | import net.minecraft.world.item.Rarity; 12 | import net.minecraft.world.item.SwordItem; 13 | import net.minecraft.world.item.Tiers; 14 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 15 | 16 | public class ItemRegistry { 17 | public static final DeferredRegister ITEMS = 18 | DeferredRegister.create(MobsOfMythology.MOD_ID, Registries.ITEM); 19 | 20 | // SPAWN EGGS 21 | public static final RegistrySupplier AUTOMATON_SPAWN_EGG = 22 | ITEMS.register( 23 | "automaton_spawn_egg", 24 | () -> 25 | new ArchitecturySpawnEggItem( 26 | EntityRegistry.AUTOMATON, 27 | 0xcf9611, 28 | 0xa87807, 29 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 30 | public static final RegistrySupplier CHUPACABRA_SPAWN_EGG = 31 | ITEMS.register( 32 | "chupacabra_spawn_egg", 33 | () -> 34 | new ArchitecturySpawnEggItem( 35 | EntityRegistry.CHUPACABRA, 36 | 0x8E7870, 37 | 0xDA5126, 38 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 39 | public static final RegistrySupplier KOBOLD_SPAWN_EGG = 40 | ITEMS.register( 41 | "kobold_spawn_egg", 42 | () -> 43 | new ArchitecturySpawnEggItem( 44 | EntityRegistry.KOBOLD, 45 | 0xd5f07d, 46 | 0x637036, 47 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 48 | public static final RegistrySupplier KOBOLD_WARRIOR_SPAWN_EGG = 49 | ITEMS.register( 50 | "kobold_warrior_spawn_egg", 51 | () -> 52 | new ArchitecturySpawnEggItem( 53 | EntityRegistry.KOBOLD_WARRIOR, 54 | 0xd5f07d, 55 | 0xe6b800, 56 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 57 | public static final RegistrySupplier DRAKE_SPAWN_EGG = 58 | ITEMS.register( 59 | "drake_spawn_egg", 60 | () -> 61 | new ArchitecturySpawnEggItem( 62 | EntityRegistry.DRAKE, 63 | 0xFE6F42, 64 | 0xE54B1A, 65 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 66 | public static final RegistrySupplier SPORELING_SPAWN_EGG = 67 | ITEMS.register( 68 | "sporeling_spawn_egg", 69 | () -> 70 | new ArchitecturySpawnEggItem( 71 | EntityRegistry.SPORELING, 72 | 0xE53935, 73 | 0xFEFEFE, 74 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 75 | public static final RegistrySupplier BASILISK_SPAWN_EGG = 76 | ITEMS.register( 77 | "basilisk_spawn_egg", 78 | () -> 79 | new ArchitecturySpawnEggItem( 80 | EntityRegistry.BASILISK, 81 | 0x586e7a, 82 | 0x323847, 83 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 84 | public static final RegistrySupplier PEGASUS_SPAWN_EGG = 85 | ITEMS.register( 86 | "pegasus_spawn_egg", 87 | () -> 88 | new ArchitecturySpawnEggItem( 89 | EntityRegistry.PEGASUS, 90 | 0xf3f2ec, 91 | 0xd4a650, 92 | new Item.Properties().arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 93 | 94 | // FOODS 95 | public static final RegistrySupplier CHUPACABRA_MEAT = 96 | ITEMS.register( 97 | "chupacabra_meat", 98 | () -> 99 | new Item( 100 | new Item.Properties() 101 | .food( 102 | new FoodProperties.Builder() 103 | .nutrition(4) 104 | .saturationModifier(0.1F) 105 | .effect(new MobEffectInstance(MobEffects.HUNGER, 600, 0), 0.8F) 106 | .build()) 107 | .arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 108 | public static final RegistrySupplier COOKED_CHUPACABRA_MEAT = 109 | ITEMS.register( 110 | "cooked_chupacabra_meat", 111 | () -> 112 | new Item( 113 | new Item.Properties() 114 | .food( 115 | new FoodProperties.Builder() 116 | .nutrition(6) 117 | .saturationModifier(0.8F) 118 | .build()) 119 | .arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 120 | 121 | // WEAPONS 122 | public static final RegistrySupplier KOBOLD_SPEAR = 123 | ITEMS.register( 124 | "kobold_spear", 125 | () -> 126 | new SwordItem( 127 | Tiers.IRON, 128 | new Item.Properties() 129 | .attributes(SwordItem.createAttributes(Tiers.IRON, 3, -2.0F)) 130 | .rarity(Rarity.UNCOMMON) 131 | .arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 132 | 133 | // MISCELLANEOUS 134 | public static final RegistrySupplier AUTOMATON_HEAD = 135 | ITEMS.register("automaton_head", () -> new Item(new Item.Properties().stacksTo(1))); 136 | public static final RegistrySupplier BASILISK_HEAD = 137 | ITEMS.register("basilisk_head", () -> new Item(new Item.Properties().stacksTo(1))); 138 | public static final RegistrySupplier BRONZE_INGOT = 139 | ITEMS.register( 140 | "bronze_ingot", 141 | () -> 142 | new Item( 143 | new Item.Properties().stacksTo(64).arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 144 | public static final RegistrySupplier GEAR = 145 | ITEMS.register( 146 | "gear", 147 | () -> 148 | new Item( 149 | new Item.Properties().stacksTo(64).arch$tab(TabRegistry.MOBS_OF_MYTHOLOGY_TAB))); 150 | 151 | public static void init() { 152 | ITEMS.register(); 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/AbstractMythEntity.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity; 2 | 3 | import it.unimi.dsi.fastutil.objects.ObjectArrayList; 4 | import java.util.List; 5 | import mod.azure.azurelib.common.api.common.animatable.GeoEntity; 6 | import mod.azure.azurelib.core.animatable.instance.AnimatableInstanceCache; 7 | import mod.azure.azurelib.core.animatable.instance.SingletonAnimatableInstanceCache; 8 | import mod.azure.azurelib.core.animation.AnimatableManager; 9 | import mod.azure.azurelib.core.animation.AnimationController; 10 | import mod.azure.azurelib.core.object.PlayState; 11 | import net.minecraft.core.BlockPos; 12 | import net.minecraft.util.RandomSource; 13 | import net.minecraft.world.entity.EntityType; 14 | import net.minecraft.world.entity.MobSpawnType; 15 | import net.minecraft.world.entity.PathfinderMob; 16 | import net.minecraft.world.entity.ai.Brain; 17 | import net.minecraft.world.level.BlockAndTintGetter; 18 | import net.minecraft.world.level.Level; 19 | import net.minecraft.world.level.LevelAccessor; 20 | import net.pixeldreamstudios.mobs_of_mythology.entity.constant.DefaultMythAnimations; 21 | import net.pixeldreamstudios.mobs_of_mythology.registry.TagRegistry; 22 | import net.tslat.smartbrainlib.api.SmartBrainOwner; 23 | import net.tslat.smartbrainlib.api.core.BrainActivityGroup; 24 | import net.tslat.smartbrainlib.api.core.SmartBrainProvider; 25 | import net.tslat.smartbrainlib.api.core.behaviour.FirstApplicableBehaviour; 26 | import net.tslat.smartbrainlib.api.core.behaviour.OneRandomBehaviour; 27 | import net.tslat.smartbrainlib.api.core.behaviour.custom.attack.AnimatableMeleeAttack; 28 | import net.tslat.smartbrainlib.api.core.behaviour.custom.look.LookAtTarget; 29 | import net.tslat.smartbrainlib.api.core.behaviour.custom.misc.Idle; 30 | import net.tslat.smartbrainlib.api.core.behaviour.custom.move.MoveToWalkTarget; 31 | import net.tslat.smartbrainlib.api.core.behaviour.custom.path.SetRandomWalkTarget; 32 | import net.tslat.smartbrainlib.api.core.behaviour.custom.path.SetWalkTargetToAttackTarget; 33 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.InvalidateAttackTarget; 34 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.SetPlayerLookTarget; 35 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.SetRandomLookTarget; 36 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.TargetOrRetaliate; 37 | import net.tslat.smartbrainlib.api.core.sensor.ExtendedSensor; 38 | import net.tslat.smartbrainlib.api.core.sensor.vanilla.HurtBySensor; 39 | import net.tslat.smartbrainlib.api.core.sensor.vanilla.NearbyLivingEntitySensor; 40 | 41 | public abstract class AbstractMythEntity extends PathfinderMob 42 | implements GeoEntity, SmartBrainOwner { 43 | private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); 44 | 45 | protected AbstractMythEntity(EntityType entityType, Level level) { 46 | super(entityType, level); 47 | } 48 | 49 | /* 50 | * Prevent myth mobs from spawning wherever they want to. 51 | * Adapted from net.minecraft.world.entity.animal.Animal.checkAnimalSpawnRules. 52 | */ 53 | public static boolean checkMythEntitySpawnRules( 54 | EntityType entityType, 55 | LevelAccessor levelAccessor, 56 | MobSpawnType mobSpawnType, 57 | BlockPos blockPos, 58 | RandomSource randomSource) { 59 | boolean bl = 60 | MobSpawnType.ignoresLightRequirements(mobSpawnType) 61 | || isBrightEnoughToSpawn(levelAccessor, blockPos); 62 | return levelAccessor.getBlockState(blockPos.below()).is(TagRegistry.MYTH_ENTITIES_SPAWNABLE_ON) 63 | && bl; 64 | } 65 | 66 | protected static boolean isBrightEnoughToSpawn( 67 | BlockAndTintGetter blockAndTintGetter, BlockPos blockPos) { 68 | return blockAndTintGetter.getRawBrightness(blockPos, 0) > 8; 69 | } 70 | 71 | @Override 72 | public AnimatableInstanceCache getAnimatableInstanceCache() { 73 | return cache; 74 | } 75 | 76 | @Override 77 | public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { 78 | controllerRegistrar 79 | .add( 80 | new AnimationController<>( 81 | this, 82 | "livingController", 83 | 3, 84 | state -> { 85 | if (state.isMoving() && !swinging) { 86 | if (isAggressive() && !swinging) { 87 | state.getController().setAnimation(DefaultMythAnimations.RUN); 88 | return PlayState.CONTINUE; 89 | } 90 | state.getController().setAnimation(DefaultMythAnimations.WALK); 91 | return PlayState.CONTINUE; 92 | } 93 | state.getController().setAnimation(DefaultMythAnimations.IDLE); 94 | return PlayState.CONTINUE; 95 | })) 96 | .add( 97 | new AnimationController<>( 98 | this, 99 | "attackController", 100 | 3, 101 | event -> { 102 | swinging = false; 103 | return PlayState.STOP; 104 | }) 105 | .triggerableAnim("attack", DefaultMythAnimations.ATTACK)); 106 | } 107 | 108 | @Override 109 | public List> getSensors() { 110 | return ObjectArrayList.of(new NearbyLivingEntitySensor<>(), new HurtBySensor<>()); 111 | } 112 | 113 | @Override 114 | public BrainActivityGroup getCoreTasks() { 115 | return BrainActivityGroup.coreTasks(new LookAtTarget<>(), new MoveToWalkTarget<>()); 116 | } 117 | 118 | @Override 119 | public BrainActivityGroup getIdleTasks() { 120 | return BrainActivityGroup.idleTasks( 121 | new FirstApplicableBehaviour( 122 | new TargetOrRetaliate<>(), new SetPlayerLookTarget<>(), new SetRandomLookTarget<>()), 123 | new OneRandomBehaviour<>( 124 | new SetRandomWalkTarget<>(), 125 | new Idle<>().runFor(entity -> entity.getRandom().nextInt(30, 60)))); 126 | } 127 | 128 | @Override 129 | public BrainActivityGroup getFightTasks() { 130 | return BrainActivityGroup.fightTasks( 131 | new InvalidateAttackTarget<>() 132 | .invalidateIf((target, entity) -> !target.isAlive() || !entity.hasLineOfSight(target)), 133 | new SetWalkTargetToAttackTarget<>().speedMod((mob, livingEntity) -> 1.25f), 134 | new AnimatableMeleeAttack<>(20) 135 | .whenStarting( 136 | mob -> { 137 | this.triggerAnim("attackController", "attack"); 138 | })); 139 | } 140 | 141 | @Override 142 | protected Brain.Provider brainProvider() { 143 | return new SmartBrainProvider<>(this); 144 | } 145 | 146 | @Override 147 | protected void customServerAiStep() { 148 | tickBrain(this); 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/AbstractMythMonsterEntity.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity; 2 | 3 | import it.unimi.dsi.fastutil.objects.ObjectArrayList; 4 | import java.util.List; 5 | import mod.azure.azurelib.common.api.common.animatable.GeoEntity; 6 | import mod.azure.azurelib.core.animatable.instance.AnimatableInstanceCache; 7 | import mod.azure.azurelib.core.animatable.instance.SingletonAnimatableInstanceCache; 8 | import mod.azure.azurelib.core.animation.AnimatableManager; 9 | import mod.azure.azurelib.core.animation.AnimationController; 10 | import mod.azure.azurelib.core.object.PlayState; 11 | import net.minecraft.core.BlockPos; 12 | import net.minecraft.util.RandomSource; 13 | import net.minecraft.world.Difficulty; 14 | import net.minecraft.world.entity.EntityType; 15 | import net.minecraft.world.entity.MobSpawnType; 16 | import net.minecraft.world.entity.ai.Brain; 17 | import net.minecraft.world.entity.monster.Monster; 18 | import net.minecraft.world.entity.player.Player; 19 | import net.minecraft.world.level.Level; 20 | import net.minecraft.world.level.LevelAccessor; 21 | import net.pixeldreamstudios.mobs_of_mythology.entity.constant.DefaultMythAnimations; 22 | import net.pixeldreamstudios.mobs_of_mythology.registry.TagRegistry; 23 | import net.tslat.smartbrainlib.api.SmartBrainOwner; 24 | import net.tslat.smartbrainlib.api.core.BrainActivityGroup; 25 | import net.tslat.smartbrainlib.api.core.SmartBrainProvider; 26 | import net.tslat.smartbrainlib.api.core.behaviour.FirstApplicableBehaviour; 27 | import net.tslat.smartbrainlib.api.core.behaviour.OneRandomBehaviour; 28 | import net.tslat.smartbrainlib.api.core.behaviour.custom.attack.AnimatableMeleeAttack; 29 | import net.tslat.smartbrainlib.api.core.behaviour.custom.look.LookAtTarget; 30 | import net.tslat.smartbrainlib.api.core.behaviour.custom.misc.Idle; 31 | import net.tslat.smartbrainlib.api.core.behaviour.custom.move.FloatToSurfaceOfFluid; 32 | import net.tslat.smartbrainlib.api.core.behaviour.custom.move.MoveToWalkTarget; 33 | import net.tslat.smartbrainlib.api.core.behaviour.custom.path.SetRandomWalkTarget; 34 | import net.tslat.smartbrainlib.api.core.behaviour.custom.path.SetWalkTargetToAttackTarget; 35 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.InvalidateAttackTarget; 36 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.SetPlayerLookTarget; 37 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.SetRandomLookTarget; 38 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.TargetOrRetaliate; 39 | import net.tslat.smartbrainlib.api.core.sensor.ExtendedSensor; 40 | import net.tslat.smartbrainlib.api.core.sensor.vanilla.HurtBySensor; 41 | import net.tslat.smartbrainlib.api.core.sensor.vanilla.NearbyLivingEntitySensor; 42 | 43 | public abstract class AbstractMythMonsterEntity extends Monster 44 | implements GeoEntity, SmartBrainOwner { 45 | private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this); 46 | 47 | protected AbstractMythMonsterEntity(EntityType entityType, Level level) { 48 | super(entityType, level); 49 | } 50 | 51 | /* 52 | * Prevent myth monsters from spawning wherever they want to. 53 | * Adapted from net.minecraft.world.entity.monster.Monster.checkAnyLightMonsterSpawnRules. 54 | */ 55 | public static boolean checkMythMonsterSpawnRules( 56 | EntityType entityType, 57 | LevelAccessor levelAccessor, 58 | MobSpawnType mobSpawnType, 59 | BlockPos blockPos, 60 | RandomSource randomSource) { 61 | boolean bl = 62 | levelAccessor.getDifficulty() != Difficulty.PEACEFUL 63 | && checkMobSpawnRules(entityType, levelAccessor, mobSpawnType, blockPos, randomSource); 64 | return levelAccessor.getBlockState(blockPos.below()).is(TagRegistry.MYTH_ENTITIES_SPAWNABLE_ON) 65 | && bl; 66 | } 67 | 68 | @Override 69 | public AnimatableInstanceCache getAnimatableInstanceCache() { 70 | return cache; 71 | } 72 | 73 | @Override 74 | public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { 75 | controllerRegistrar 76 | .add( 77 | new AnimationController<>( 78 | this, 79 | "livingController", 80 | 3, 81 | state -> { 82 | if (state.isMoving() && !swinging) { 83 | if (isAggressive() && !swinging) { 84 | state.getController().setAnimation(DefaultMythAnimations.RUN); 85 | return PlayState.CONTINUE; 86 | } 87 | state.getController().setAnimation(DefaultMythAnimations.WALK); 88 | return PlayState.CONTINUE; 89 | } 90 | state.getController().setAnimation(DefaultMythAnimations.IDLE); 91 | return PlayState.CONTINUE; 92 | })) 93 | .add( 94 | new AnimationController<>( 95 | this, 96 | "attackController", 97 | 3, 98 | event -> { 99 | swinging = false; 100 | return PlayState.STOP; 101 | }) 102 | .triggerableAnim("attack", DefaultMythAnimations.ATTACK)); 103 | } 104 | 105 | @Override 106 | public List> getSensors() { 107 | return ObjectArrayList.of( 108 | new NearbyLivingEntitySensor() 109 | .setPredicate((target, entity) -> target instanceof Player), 110 | new HurtBySensor<>()); 111 | } 112 | 113 | @Override 114 | public BrainActivityGroup getCoreTasks() { 115 | return BrainActivityGroup.coreTasks( 116 | new FloatToSurfaceOfFluid<>(), new LookAtTarget<>(), new MoveToWalkTarget<>()); 117 | } 118 | 119 | @Override 120 | public BrainActivityGroup getIdleTasks() { 121 | return BrainActivityGroup.idleTasks( 122 | new FirstApplicableBehaviour( 123 | new TargetOrRetaliate<>(), new SetPlayerLookTarget<>(), new SetRandomLookTarget<>()), 124 | new OneRandomBehaviour<>( 125 | new SetRandomWalkTarget<>(), 126 | new Idle<>().runFor(entity -> entity.getRandom().nextInt(30, 60)))); 127 | } 128 | 129 | @Override 130 | public BrainActivityGroup getFightTasks() { 131 | return BrainActivityGroup.fightTasks( 132 | new InvalidateAttackTarget<>() 133 | .invalidateIf((target, entity) -> !target.isAlive() || !entity.hasLineOfSight(target)), 134 | new SetWalkTargetToAttackTarget<>().speedMod((mob, livingEntity) -> 1.25f), 135 | new AnimatableMeleeAttack<>(20) 136 | .whenStarting( 137 | mob -> { 138 | this.triggerAnim("attackController", "attack"); 139 | })); 140 | } 141 | 142 | @Override 143 | protected Brain.Provider brainProvider() { 144 | return new SmartBrainProvider<>(this); 145 | } 146 | 147 | @Override 148 | protected void customServerAiStep() { 149 | tickBrain(this); 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /common/src/main/java/net/pixeldreamstudios/mobs_of_mythology/entity/mobs/KoboldEntity.java: -------------------------------------------------------------------------------- 1 | package net.pixeldreamstudios.mobs_of_mythology.entity.mobs; 2 | 3 | import net.minecraft.Util; 4 | import net.minecraft.nbt.CompoundTag; 5 | import net.minecraft.network.syncher.EntityDataAccessor; 6 | import net.minecraft.network.syncher.EntityDataSerializers; 7 | import net.minecraft.network.syncher.SynchedEntityData; 8 | import net.minecraft.sounds.SoundEvents; 9 | import net.minecraft.world.DifficultyInstance; 10 | import net.minecraft.world.InteractionHand; 11 | import net.minecraft.world.damagesource.DamageSource; 12 | import net.minecraft.world.effect.MobEffectInstance; 13 | import net.minecraft.world.effect.MobEffects; 14 | import net.minecraft.world.entity.EntityType; 15 | import net.minecraft.world.entity.LivingEntity; 16 | import net.minecraft.world.entity.MobSpawnType; 17 | import net.minecraft.world.entity.SpawnGroupData; 18 | import net.minecraft.world.entity.ai.attributes.AttributeSupplier; 19 | import net.minecraft.world.entity.ai.attributes.Attributes; 20 | import net.minecraft.world.entity.monster.Monster; 21 | import net.minecraft.world.item.ItemStack; 22 | import net.minecraft.world.level.Level; 23 | import net.minecraft.world.level.ServerLevelAccessor; 24 | import net.pixeldreamstudios.mobs_of_mythology.MobsOfMythology; 25 | import net.pixeldreamstudios.mobs_of_mythology.entity.AbstractMythMonsterEntity; 26 | import net.pixeldreamstudios.mobs_of_mythology.entity.variant.KoboldVariant; 27 | import net.tslat.smartbrainlib.api.core.BrainActivityGroup; 28 | import net.tslat.smartbrainlib.api.core.behaviour.custom.attack.AnimatableMeleeAttack; 29 | import net.tslat.smartbrainlib.api.core.behaviour.custom.move.FleeTarget; 30 | import net.tslat.smartbrainlib.api.core.behaviour.custom.path.SetWalkTargetToAttackTarget; 31 | import net.tslat.smartbrainlib.api.core.behaviour.custom.target.InvalidateAttackTarget; 32 | import net.tslat.smartbrainlib.api.core.navigation.SmoothGroundNavigation; 33 | import net.tslat.smartbrainlib.util.BrainUtils; 34 | import org.jetbrains.annotations.Nullable; 35 | 36 | public class KoboldEntity extends AbstractKoboldEntity { 37 | private static final EntityDataAccessor DATA_ITEM_STACK = 38 | SynchedEntityData.defineId(KoboldEntity.class, EntityDataSerializers.ITEM_STACK); 39 | 40 | public KoboldEntity(EntityType entityType, Level world) { 41 | super(entityType, world, Monster.XP_REWARD_SMALL); 42 | navigation = new SmoothGroundNavigation(this, level()); 43 | } 44 | 45 | public static AttributeSupplier.Builder createAttributes() { 46 | return Monster.createMobAttributes() 47 | .add(Attributes.MAX_HEALTH, MobsOfMythology.config.koboldHealth) 48 | .add(Attributes.ATTACK_DAMAGE, MobsOfMythology.config.koboldAttackDamage) 49 | .add(Attributes.ATTACK_SPEED, 2) 50 | .add(Attributes.ATTACK_KNOCKBACK, 1) 51 | .add(Attributes.MOVEMENT_SPEED, 0.3); 52 | } 53 | 54 | @Override 55 | protected void defineSynchedData(SynchedEntityData.Builder builder) { 56 | super.defineSynchedData(builder); 57 | builder.define(DATA_ITEM_STACK, ItemStack.EMPTY); 58 | } 59 | 60 | @Override 61 | public void addAdditionalSaveData(CompoundTag nbt) { 62 | super.addAdditionalSaveData(nbt); 63 | if (!getItemStack().isEmpty()) { 64 | nbt.put("ItemStack", this.getItemStack().save(this.registryAccess())); 65 | } 66 | } 67 | 68 | @Override 69 | public void readAdditionalSaveData(CompoundTag nbt) { 70 | super.readAdditionalSaveData(nbt); 71 | this.setItemStack( 72 | ItemStack.parse(this.registryAccess(), nbt.getCompound("ItemStack")) 73 | .orElse(ItemStack.EMPTY)); 74 | } 75 | 76 | public ItemStack getItemStack() { 77 | return this.getEntityData().get(DATA_ITEM_STACK); 78 | } 79 | 80 | public void setItemStack(ItemStack itemStack) { 81 | this.getEntityData().set(DATA_ITEM_STACK, itemStack); 82 | this.playSound(SoundEvents.VINDICATOR_CELEBRATE, 1.0f, 2.0f); 83 | this.setItemInHand(InteractionHand.MAIN_HAND, itemStack); 84 | } 85 | 86 | @Override 87 | public SpawnGroupData finalizeSpawn( 88 | ServerLevelAccessor world, 89 | DifficultyInstance difficulty, 90 | MobSpawnType spawnReason, 91 | @Nullable SpawnGroupData entityData) { 92 | KoboldVariant variant = Util.getRandom(KoboldVariant.values(), this.random); 93 | setVariant(variant); 94 | return super.finalizeSpawn(world, difficulty, spawnReason, entityData); 95 | } 96 | 97 | @Override 98 | protected boolean shouldDropLoot() { 99 | return false; 100 | } 101 | 102 | @Override 103 | public void die(DamageSource arg) { 104 | super.die(arg); 105 | this.spawnAtLocation(getItemStack()); 106 | setItemStack(ItemStack.EMPTY); 107 | } 108 | 109 | @Override 110 | public BrainActivityGroup getFightTasks() { 111 | return BrainActivityGroup.fightTasks( 112 | new InvalidateAttackTarget<>() 113 | .invalidateIf((target, entity) -> !target.isAlive() || !entity.hasLineOfSight(target)), 114 | new SetWalkTargetToAttackTarget<>() 115 | .startCondition( 116 | mob -> 117 | getItemStack().isEmpty() 118 | && getTarget() != null 119 | && !getTarget().getItemInHand(InteractionHand.MAIN_HAND).isEmpty()), 120 | new AnimatableMeleeAttack<>(6) 121 | .whenStarting( 122 | mob -> { 123 | this.triggerAnim("attackController", "attack"); 124 | }) 125 | .startCondition( 126 | mob -> 127 | MobsOfMythology.config.shouldKoboldsSteal 128 | && getItemStack().isEmpty() 129 | && getTarget() != null 130 | && !getTarget().getItemInHand(InteractionHand.MAIN_HAND).isEmpty()) 131 | .stopIf(mob -> !getItemStack().isEmpty()) 132 | .whenStopping( 133 | mob -> { 134 | if (!MobsOfMythology.config.shouldKoboldsSteal) return; 135 | LivingEntity target = getTarget(); 136 | if (target != null) { 137 | setItemStack(target.getItemInHand(InteractionHand.MAIN_HAND).copy()); 138 | target 139 | .getItemInHand(InteractionHand.MAIN_HAND) 140 | .shrink(getItemStack().getCount()); 141 | } 142 | }), 143 | new FleeTarget<>() 144 | .fleeDistance(10) 145 | .speedModifier(MobsOfMythology.config.koboldFleeSpeedMod) 146 | .startCondition( 147 | mob -> 148 | !getItemStack().isEmpty() 149 | || BrainUtils.getTargetOfEntity(this).is(BrainUtils.getLastAttacker(this))) 150 | .whenStarting( 151 | pathfinderMob -> { 152 | if (!getItemStack().isEmpty()) 153 | this.addEffect( 154 | new MobEffectInstance(MobEffects.GLOWING, 200, 255, false, false, false)); 155 | })); 156 | } 157 | 158 | // TODO implement eating (see gigeresque) 159 | // public void tick() { 160 | // super.tick(); 161 | // super.tick(); 162 | // ItemStack itemStack = getItemStack(); 163 | // if (!itemStack.isEmpty()) { 164 | // if (itemStack.is(ItemTags.WOLF_FOOD)) { 165 | // eat(level(), itemStack); 166 | // } 167 | // } 168 | // } 169 | 170 | @Override 171 | public T getVariant() { 172 | return (T) KoboldVariant.byId(this.getTypeVariant() & 255); 173 | } 174 | 175 | private void setVariant(KoboldVariant variant) { 176 | this.entityData.set(DATA_ID_TYPE_VARIANT, variant.getId() & 255); 177 | } 178 | } 179 | --------------------------------------------------------------------------------